diff --git a/Build/RocketControls.vcproj b/Build/RocketControls.vcproj index d43ba9c8b..d943375f3 100644 --- a/Build/RocketControls.vcproj +++ b/Build/RocketControls.vcproj @@ -19,7 +19,6 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Build/RocketCore.vcproj b/Build/RocketCore.vcproj index 0b650918c..b4af7923b 100644 --- a/Build/RocketCore.vcproj +++ b/Build/RocketCore.vcproj @@ -19,7 +19,6 @@ + + + @@ -1182,22 +1188,6 @@ > - - - - - - - - @@ -1436,6 +1426,18 @@ RelativePath="..\Include\Rocket\Core\Variant.inl" > + + + + + + diff --git a/Build/RocketCorePython.vcproj b/Build/RocketCorePython.vcproj new file mode 100644 index 000000000..1f9aad77b --- /dev/null +++ b/Build/RocketCorePython.vcproj @@ -0,0 +1,377 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Build/RocketDebugger.vcproj b/Build/RocketDebugger.vcproj index e58d69a40..4e67614c0 100644 --- a/Build/RocketDebugger.vcproj +++ b/Build/RocketDebugger.vcproj @@ -19,7 +19,6 @@ NUL && ' + ' '.join(sys.argv)) + sys.exit() + +def ProcessOptions(args): + + options = {'ROCKET_VERSION': 'custom', 'BUILD_PYTHON': False, 'FULL_SOURCE': False, 'ARCHIVE_NAME': 'libRocket-sdk'} + + try: + optlist, args = getopt.getopt(args, 'r:phs') + except getopt.GetoptError, e: + print '\nError: ' + str(e) + '\n' + Usage(args) + + for opt in optlist: + if opt[0] == '-h': + Usage(args) + if opt[0] == '-r': + options['ROCKET_VERSION'] = opt[1] + if opt[0] == '-p': + options['BUILD_PYTHON'] = True + if opt[0] == '-s': + options['FULL_SOURCE'] = True + options['ARCHIVE_NAME'] = 'libRocket-source' + + return options + +def Build(project, configs, defines = {}): + + old_cl = '' + if 'CL' in os.environ: + old_cl = os.environ['CL'] + else: + os.environ['CL'] = '' + + for name, value in defines.iteritems(): + os.environ['CL'] = os.environ['CL'] + ' /D' + name + '=' + value + + for config in configs: + cmd = '"' + os.environ['VCINSTALLDIR'] + '\\vcpackages\\vcbuild.exe" /rebuild ' + project + '.vcproj "' + config + '|Win32"' + ret = subprocess.call(cmd) + if ret != 0: + print "Failed to build " + project + sys.exit() + + os.environ['CL'] = old_cl + +def DelTree(path): + if not os.path.exists(path): + return + + print 'Deleting ' + path + '...' + for root, dirs, files in os.walk(path, topdown=False): + for name in files: + os.remove(os.path.join(root, name)) + for name in dirs: + os.rmdir(os.path.join(root, name)) + +def CopyFiles(source_path, destination_path, file_list = [], exclude_list = [], preserve_paths = True): + working_directory = os.getcwd() + source_directory = os.path.abspath(os.path.join(working_directory, os.path.normpath(source_path))) + destination_directory = os.path.abspath(os.path.join(working_directory, os.path.normpath(destination_path))) + print "Copying " + source_directory + " to " + destination_directory + " ..." + + if not os.path.exists(source_directory): + print "Warning: Source directory " + source_directory + " doesn't exist." + return False + + for root, directories, files in os.walk(source_directory, False): + for file in files: + + # Skip files not in the include list. + if len(file_list) > 0: + included = False + for include in file_list: + if re.search(include, os.path.join(root, file).replace('\\', '/')): + included = True + break; + + if not included: + continue + + # Determine our subdirectory. + subdir = root.replace(source_directory, "") + if subdir[:1] == os.path.normcase('/'): + subdir = subdir[1:] + + # Skip paths in the exclude list + excluded = False + for exclude in exclude_list: + if re.search(exclude, os.path.join(root, file).replace('\\', '/')): + excluded = True + break + + if excluded: + continue + + # Build up paths + source_file = os.path.join(root, file) + destination_subdir = destination_directory + if preserve_paths: + destination_subdir = os.path.join(destination_directory, subdir) + + if not os.path.exists(destination_subdir): + os.makedirs(destination_subdir) + destination_file = os.path.join(destination_subdir, file) + + # Copy files + try: + shutil.copy(source_file, destination_file) + except: + print "Failed copying " + source_file + " to " + destination_file + traceback.print_exc() + + return True + +def Archive(archive_name, path): + cwd = os.getcwd() + os.chdir(path + '/..') + file_name = archive_name + '.zip' + if os.path.exists(file_name): + os.unlink(file_name) + os.system('zip -r ' + file_name + ' ' + path[path.rfind('/')+1:]) + os.chdir(cwd) + +def main(): + CheckVSVars() + options = ProcessOptions(sys.argv[1:]) + + Build('RocketCore', ['Debug', 'Release'], {'ROCKET_VERSION': '\\"' + options['ROCKET_VERSION'] + '\\"'}) + Build('RocketControls', ['Debug', 'Release']) + Build('RocketDebugger', ['Debug', 'Release']) + if options['BUILD_PYTHON']: + Build('RocketCorePython', ['Debug', 'Release']) + Build('RocketControlsPython', ['Debug', 'Release']) + + DelTree('../dist/libRocket') + CopyFiles('../Include', '../dist/libRocket/Include') + CopyFiles('../bin', '../dist/libRocket/bin', [], ['\.ilk$', '\.pdb$', '\.exp$', '^_.*lib$']) + CopyFiles('../Samples', '../dist/libRocket/Samples', ['\.h$', '\.cpp$', '\.vcproj$', '\.sln$', '\.vcproj\.user$', '\.rml$', '\.rcss$', '\.tga$', '\.py$', '\.otf$', '\.txt$']) + if options['FULL_SOURCE']: + CopyFiles('../Build', '../dist/libRocket/Build', ['\.vcproj$', '\.sln$', '\.vsprops$', '\.py$']) + CopyFiles('../Source', '../dist/libRocket/Source', ['\.cpp$', '\.h$', '\.inl$']) + shutil.copyfile('../changelog.txt', '../dist/libRocket/changelog.txt') + Archive(options['ARCHIVE_NAME'] + '-' + options['ROCKET_VERSION'], '../dist/libRocket'); + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/Build/vsprops/BuildConfigurationBase.vsprops b/Build/vsprops/BuildConfigurationBase.vsprops index 56891b3f3..ecc83e3de 100644 --- a/Build/vsprops/BuildConfigurationBase.vsprops +++ b/Build/vsprops/BuildConfigurationBase.vsprops @@ -1,70 +1,70 @@ - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + diff --git a/Build/vsprops/BuildConfigurationDLL.vsprops b/Build/vsprops/BuildConfigurationDLL.vsprops index 2d8df2e50..76adc567e 100644 --- a/Build/vsprops/BuildConfigurationDLL.vsprops +++ b/Build/vsprops/BuildConfigurationDLL.vsprops @@ -1,7 +1,7 @@ - - - + + + diff --git a/Build/vsprops/BuildConfigurationDLLDebug.vsprops b/Build/vsprops/BuildConfigurationDLLDebug.vsprops index 02644a960..68f75d3eb 100644 --- a/Build/vsprops/BuildConfigurationDLLDebug.vsprops +++ b/Build/vsprops/BuildConfigurationDLLDebug.vsprops @@ -1,17 +1,17 @@ - - - - - + + + + + diff --git a/Build/vsprops/BuildConfigurationDLLRelease.vsprops b/Build/vsprops/BuildConfigurationDLLRelease.vsprops index f94387aeb..645459951 100644 --- a/Build/vsprops/BuildConfigurationDLLRelease.vsprops +++ b/Build/vsprops/BuildConfigurationDLLRelease.vsprops @@ -1,17 +1,17 @@ - - - - - + + + + + diff --git a/Build/vsprops/BuildConfigurationDebug.vsprops b/Build/vsprops/BuildConfigurationDebug.vsprops index b6b397e18..7b2b9d2f7 100644 --- a/Build/vsprops/BuildConfigurationDebug.vsprops +++ b/Build/vsprops/BuildConfigurationDebug.vsprops @@ -1,21 +1,21 @@ - - - - - + + + + + diff --git a/Build/vsprops/BuildConfigurationRelease.vsprops b/Build/vsprops/BuildConfigurationRelease.vsprops index 37bd62236..f9401d0d7 100644 --- a/Build/vsprops/BuildConfigurationRelease.vsprops +++ b/Build/vsprops/BuildConfigurationRelease.vsprops @@ -1,20 +1,20 @@ - - - - - + + + + + diff --git a/Include/Rocket/Controls/Clipboard.h b/Include/Rocket/Controls/Clipboard.h index 28a8ef43f..726172334 100644 --- a/Include/Rocket/Controls/Clipboard.h +++ b/Include/Rocket/Controls/Clipboard.h @@ -48,7 +48,7 @@ class Clipboard /// Set the contents of the clipboard. static void Set(const Rocket::Core::WString& content); - #if defined EMP_PLATFORM_WIN32 + #if defined ROCKET_PLATFORM_WIN32 /// Set the window handle of the application. This shouldn't need to be called unless the host /// application opens multiple windows, or opens and closes windows, etc. static void SetHWND(void* hwnd); diff --git a/Include/Rocket/Controls/Header.h b/Include/Rocket/Controls/Header.h index 2a92420dc..10a77c230 100644 --- a/Include/Rocket/Controls/Header.h +++ b/Include/Rocket/Controls/Header.h @@ -30,7 +30,7 @@ #include -#ifdef EMP_PLATFORM_WIN32 +#ifdef ROCKET_PLATFORM_WIN32 #ifdef RocketControls_EXPORTS #define ROCKETCONTROLS_API __declspec(dllexport) #else diff --git a/Include/Rocket/Core/Colour.inl b/Include/Rocket/Core/Colour.inl index 539ee6d0a..d9344eb28 100644 --- a/Include/Rocket/Core/Colour.inl +++ b/Include/Rocket/Core/Colour.inl @@ -1,11 +1,27 @@ /* - * Copyright (c) 2006 - 2008 - * Wandering Monster Studios Limited + * This source file is part of libRocket, the HTML/CSS Interface Middleware * - * Any use of this program is governed by the terms of Wandering Monster - * Studios Limited's Licence Agreement included with this program, a copy - * of which can be obtained by contacting Wandering Monster Studios - * Limited at info@wanderingmonster.co.nz. + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. * */ diff --git a/Include/Rocket/Core/Core.h b/Include/Rocket/Core/Core.h index 8c37fd752..c8fafdf9b 100644 --- a/Include/Rocket/Core/Core.h +++ b/Include/Rocket/Core/Core.h @@ -28,14 +28,12 @@ #ifndef ROCKETCORECORE_H #define ROCKETCORECORE_H -#include "Types.h" -//#include -//#include -//#include +#include +#include +#include #include #include #include -#include #include #include #include diff --git a/Include/Rocket/Core/Debug.h b/Include/Rocket/Core/Debug.h index 0f78da3a3..5ecfaa20a 100644 --- a/Include/Rocket/Core/Debug.h +++ b/Include/Rocket/Core/Debug.h @@ -31,55 +31,55 @@ #include // Define for breakpointing. -#if defined (EMP_PLATFORM_WIN32) -#define EMP_BREAK _asm { int 0x03 } -#elif defined (EMP_PLATFORM_LINUX) -#define EMP_BREAK asm ("int $0x03" ) -#elif defined (EMP_PLATFORM_MACOSX) -#define EMP_BREAK _asm { int 0x03 } +#if defined (ROCKET_PLATFORM_WIN32) +#define ROCKET_BREAK _asm { int 0x03 } +#elif defined (ROCKET_PLATFORM_LINUX) +#define ROCKET_BREAK asm ("int $0x03" ) +#elif defined (ROCKET_PLATFORM_MACOSX) +#define ROCKET_BREAK _asm { int 0x03 } #endif -#define EMP_STATIC_ASSERT(cond, msg) typedef char msg[(cond) ? 1 : 0] +#define ROCKET_STATIC_ASSERT(cond, msg) typedef char msg[(cond) ? 1 : 0] -// Define the LT_ASSERT and EMP_VERIFY macros. -#if 1 //!defined EMP_DEBUG -#define EMP_ASSERT(x) -#define EMP_ASSERTMSG(x, m) -#define EMP_ERROR -#define EMP_ERRORMSG(m) -#define EMP_VERIFY(x) x +// Define the LT_ASSERT and ROCKET_VERIFY macros. +#if 1 //!defined ROCKET_DEBUG +#define ROCKET_ASSERT(x) +#define ROCKET_ASSERTMSG(x, m) +#define ROCKET_ERROR +#define ROCKET_ERRORMSG(m) +#define ROCKET_VERIFY(x) x #else namespace Rocket { namespace Core { bool ROCKETCORE_API Assert(const char* message, const char* file, int line); -#define EMP_ASSERT(x) \ +#define ROCKET_ASSERT(x) \ if (!(x)) \ { \ - if (!Rocket::Core::Assert("EMP_ASSERT("#x")", __FILE__, __LINE__ )) \ + if (!Rocket::Core::Assert("ROCKET_ASSERT("#x")", __FILE__, __LINE__ )) \ { \ - EMP_BREAK; \ + ROCKET_BREAK; \ } \ } -#define EMP_ASSERTMSG(x, m) \ +#define ROCKET_ASSERTMSG(x, m) \ if (!(x)) \ { \ if (!Rocket::Core::Assert(m, __FILE__, __LINE__ )) \ { \ - EMP_BREAK; \ + ROCKET_BREAK; \ } \ } -#define EMP_ERROR \ -if (!Rocket::Core::Assert("EMP_ERROR", __FILE__, __LINE__)) \ +#define ROCKET_ERROR \ +if (!Rocket::Core::Assert("ROCKET_ERROR", __FILE__, __LINE__)) \ { \ - EMP_BREAK; \ + ROCKET_BREAK; \ } -#define EMP_ERRORMSG(m) \ +#define ROCKET_ERRORMSG(m) \ if (!Rocket::Core::Assert(m, __FILE__, __LINE__)) \ { \ - EMP_BREAK; \ + ROCKET_BREAK; \ } -#define EMP_VERIFY(x) EMP_ASSERT(x) +#define ROCKET_VERIFY(x) ROCKET_ASSERT(x) } } diff --git a/Include/Rocket/Core/Dictionary.inl b/Include/Rocket/Core/Dictionary.inl index 6dc263655..c7d28aa2e 100644 --- a/Include/Rocket/Core/Dictionary.inl +++ b/Include/Rocket/Core/Dictionary.inl @@ -1,11 +1,27 @@ /* - * Copyright (c) 2006 - 2008 - * Wandering Monster Studios Limited + * This source file is part of libRocket, the HTML/CSS Interface Middleware * - * Any use of this program is governed by the terms of Wandering Monster - * Studios Limited's Licence Agreement included with this program, a copy - * of which can be obtained by contacting Wandering Monster Studios - * Limited at info@wanderingmonster.co.nz. + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. * */ diff --git a/Include/Rocket/Core/Element.inl b/Include/Rocket/Core/Element.inl index aac1a374a..453b8597d 100644 --- a/Include/Rocket/Core/Element.inl +++ b/Include/Rocket/Core/Element.inl @@ -1,11 +1,27 @@ /* - * Copyright (c) 2006 - 2008 - * Wandering Monster Studios Limited + * This source file is part of libRocket, the HTML/CSS Interface Middleware * - * Any use of this program is governed by the terms of Wandering Monster - * Studios Limited's Licence Agreement included with this program, a copy - * of which can be obtained by contacting Wandering Monster Studios - * Limited at info@wanderingmonster.co.nz. + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. * */ @@ -15,7 +31,7 @@ template < typename T > T Element::GetProperty(const String& name) { const Property* property = GetProperty(name); - EMP_ASSERTMSG(property, "Invalid property name."); + ROCKET_ASSERTMSG(property, "Invalid property name."); return property->Get< T >(); } diff --git a/Include/Rocket/Core/ElementInstancerGeneric.inl b/Include/Rocket/Core/ElementInstancerGeneric.inl index a0b180771..00e1c3e8d 100644 --- a/Include/Rocket/Core/ElementInstancerGeneric.inl +++ b/Include/Rocket/Core/ElementInstancerGeneric.inl @@ -1,11 +1,27 @@ /* - * Copyright (c) 2006 - 2008 - * Wandering Monster Studios Limited + * This source file is part of libRocket, the HTML/CSS Interface Middleware * - * Any use of this program is governed by the terms of Wandering Monster - * Studios Limited's Licence Agreement included with this program, a copy - * of which can be obtained by contacting Wandering Monster Studios - * Limited at info@wanderingmonster.co.nz. + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. * */ diff --git a/Include/Rocket/Core/EventListener.h b/Include/Rocket/Core/EventListener.h index c288cf8e2..967fc871d 100644 --- a/Include/Rocket/Core/EventListener.h +++ b/Include/Rocket/Core/EventListener.h @@ -52,12 +52,12 @@ class ROCKETCORE_API EventListener virtual void ProcessEvent(Event& event) = 0; /// Called when the listener has been attached to a new Element - virtual void OnAttach(Element* EMP_UNUSED(element)) + virtual void OnAttach(Element* ROCKET_UNUSED(element)) { } /// Called when the listener has been detached from a Element - virtual void OnDetach(Element* EMP_UNUSED(element)) + virtual void OnDetach(Element* ROCKET_UNUSED(element)) { } }; diff --git a/Include/Rocket/Core/Header.h b/Include/Rocket/Core/Header.h index 3f0aabd7f..c08d988da 100644 --- a/Include/Rocket/Core/Header.h +++ b/Include/Rocket/Core/Header.h @@ -30,7 +30,7 @@ #include -#if defined EMP_PLATFORM_WIN32 +#if defined ROCKET_PLATFORM_WIN32 #if defined RocketCore_EXPORTS #define ROCKETCORE_API __declspec(dllexport) #else diff --git a/Include/Rocket/Core/Platform.h b/Include/Rocket/Core/Platform.h index 0ca3b8181..4746f463b 100644 --- a/Include/Rocket/Core/Platform.h +++ b/Include/Rocket/Core/Platform.h @@ -29,24 +29,24 @@ #define ROCKETCOREPLATFORM_H #if defined __WIN32__ || defined _WIN32 - #define EMP_PLATFORM_WIN32 - #define EMP_PLATFORM_NAME "win32" + #define ROCKET_PLATFORM_WIN32 + #define ROCKET_PLATFORM_NAME "win32" #pragma warning(disable:4355) #elif defined __APPLE_CC__ - #define EMP_PLATFORM_UNIX - #define EMP_PLATFORM_MACOSX - #define EMP_PLATFORM_NAME "macosx" + #define ROCKET_PLATFORM_UNIX + #define ROCKET_PLATFORM_MACOSX + #define ROCKET_PLATFORM_NAME "macosx" #else - #define EMP_PLATFORM_UNIX - #define EMP_PLATFORM_LINUX - #define EMP_PLATFORM_NAME "linux" + #define ROCKET_PLATFORM_UNIX + #define ROCKET_PLATFORM_LINUX + #define ROCKET_PLATFORM_NAME "linux" #endif -#if !defined NDEBUG && !defined EMP_DEBUG - #define EMP_DEBUG +#if !defined NDEBUG && !defined ROCKET_DEBUG + #define ROCKET_DEBUG #endif -#if defined EMP_PLATFORM_WIN32 +#if defined ROCKET_PLATFORM_WIN32 // alignment of a member was sensitive to packing #pragma warning(disable : 4121) @@ -64,6 +64,6 @@ #endif #endif -#define EMP_UNUSED(x) +#define ROCKET_UNUSED(x) #endif diff --git a/Include/Rocket/Core/Pool.h b/Include/Rocket/Core/Pool.h index 6d12dd14f..e508a9afe 100644 --- a/Include/Rocket/Core/Pool.h +++ b/Include/Rocket/Core/Pool.h @@ -68,7 +68,7 @@ class Pool /// node this iterator references is invalid. inline void operator++() { - EMP_ASSERT(node != NULL); + ROCKET_ASSERT(node != NULL); node = node->next; } /// Returns true if it is OK to deference or increment this diff --git a/Include/Rocket/Core/Pool.inl b/Include/Rocket/Core/Pool.inl index e90102aa2..51dcdebf2 100644 --- a/Include/Rocket/Core/Pool.inl +++ b/Include/Rocket/Core/Pool.inl @@ -1,11 +1,27 @@ /* - * Copyright (c) 2006 - 2008 - * Wandering Monster Studios Limited + * This source file is part of libRocket, the HTML/CSS Interface Middleware * - * Any use of this program is governed by the terms of Wandering Monster - * Studios Limited's Licence Agreement included with this program, a copy - * of which can be obtained by contacting Wandering Monster Studios - * Limited at info@wanderingmonster.co.nz. + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. * */ @@ -133,7 +149,7 @@ void Pool< PoolType >::DeallocateObject(Iterator& iterator) previous_object->next = next_object; else { - EMP_ASSERT(first_allocated_node == object); + ROCKET_ASSERT(first_allocated_node == object); first_allocated_node = next_object; } diff --git a/Include/Rocket/Core/Python/ConverterScriptObject.h b/Include/Rocket/Core/Python/ConverterScriptObject.h new file mode 100644 index 000000000..908502be1 --- /dev/null +++ b/Include/Rocket/Core/Python/ConverterScriptObject.h @@ -0,0 +1,77 @@ +/* + * This source file is part of libRocket, the HTML/CSS Interface Middleware + * + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +#ifndef ROCKETCOREPYTHONCONVERTERSCRIPTOBJECT_H +#define ROCKETCOREPYTHONCONVERTERSCRIPTOBJECT_H + +#include + +namespace Rocket { +namespace Core { +namespace Python { + +/** + Templated class for converting from a script object to a python object + + Simply construct this class in your application start up and it + will do the necessary registration of the object with the boost + type conversion repository. + + @author Lloyd Weehuizen + */ + +template +struct ConverterScriptObject +{ + ConverterScriptObject() + { + // Register custom RKTElement to python converter + boost::python::to_python_converter< T*, ConverterScriptObject< T > >(); + } + + static PyObject* convert(T* object) + { + PyObject* pyobject = Py_None; + if (object) + { + PyObject* script_object = (PyObject*)object->GetScriptObject(); + if (script_object) + { + pyobject = script_object; + } + } + + Py_INCREF(pyobject); + return pyobject; + } +}; + +} +} +} + +#endif diff --git a/Include/Rocket/Core/Python/ElementInstancer.h b/Include/Rocket/Core/Python/ElementInstancer.h index 0c1815da9..e2c754c6f 100644 --- a/Include/Rocket/Core/Python/ElementInstancer.h +++ b/Include/Rocket/Core/Python/ElementInstancer.h @@ -28,9 +28,9 @@ #ifndef ROCKETCOREPYTHONELEMENTINSTANCER_H #define ROCKETCOREPYTHONELEMENTINSTANCER_H -#include -#include -#include +#include +#include +#include #include #include #include @@ -66,7 +66,7 @@ class ElementInstancer : public Rocket::Core::ElementInstancer /// Instances an element given the tag name and attributes /// @param tag Name of the element to instance /// @param attributes vector of name value pairs - virtual Element* InstanceElement(Element* EMP_UNUSED(parent), const EMP::Core::String& tag, const EMP::Core::XMLAttributes& EMP_UNUSED(attributes)) + virtual Element* InstanceElement(Element* ROCKET_UNUSED(parent), const Rocket::Core::String& tag, const Rocket::Core::XMLAttributes& ROCKET_UNUSED(attributes)) { // Build the arguments PyObject* args = PyTuple_New(1); @@ -93,7 +93,7 @@ class ElementInstancer : public Rocket::Core::ElementInstancer /// Releases the given element /// @param element to release - virtual void ReleaseElement(Element* EMP_UNUSED(element)) + virtual void ReleaseElement(Element* ROCKET_UNUSED(element)) { // Never release Python elements, Python will manage this for us. } diff --git a/Include/Rocket/Core/Python/Header.h b/Include/Rocket/Core/Python/Header.h index b792b7052..652336209 100644 --- a/Include/Rocket/Core/Python/Header.h +++ b/Include/Rocket/Core/Python/Header.h @@ -28,9 +28,9 @@ #ifndef ROCKETCOREPYTHONHEADER_H #define ROCKETCOREPYTHONHEADER_H -#include +#include -#if defined EMP_PLATFORM_WIN32 +#if defined ROCKET_PLATFORM_WIN32 #if defined RocketCorePython_EXPORTS #define ROCKETCOREPYTHON_API __declspec(dllexport) #else diff --git a/Include/Rocket/Core/Python/NameIndexInterface.h b/Include/Rocket/Core/Python/NameIndexInterface.h new file mode 100644 index 000000000..20245c926 --- /dev/null +++ b/Include/Rocket/Core/Python/NameIndexInterface.h @@ -0,0 +1,123 @@ +/* + * This source file is part of libRocket, the HTML/CSS Interface Middleware + * + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +#ifndef ROCKETCOREPYTHONNAMEINDEXINTERFACE_H +#define ROCKETCOREPYTHONNAMEINDEXINTERFACE_H + +#include + +namespace Rocket { +namespace Core { +namespace Python { + +template < typename HostType > +class NameAccessorInvalid +{ +public: + python::object operator()(HostType& host, const char* name) + { + PyErr_SetString(PyExc_KeyError, "Invalid key."); + python::throw_error_already_set(); + + return python::object(); + } +}; + +/** + Template class for generating a lightweight proxy object for providing array-style lookups on a C++ object. + + @author Peter Curry + */ + +template < typename HostType, typename LengthAccessor, typename IndexAccessor, typename NameAccessor = NameAccessorInvalid< HostType > > +class NameIndexInterface : public python::def_visitor< NameIndexInterface< HostType, LengthAccessor, IndexAccessor, NameAccessor > > +{ +public: + NameIndexInterface() + { + } + + ~NameIndexInterface() + { + } + + /// Initialise the interface. + template < typename ClassType > + void visit(ClassType& _class) const + { + _class.def("__getitem__", &NameIndexInterface< HostType, LengthAccessor, IndexAccessor, NameAccessor >::GetItem); + _class.def("__len__", &NameIndexInterface< HostType, LengthAccessor, IndexAccessor, NameAccessor >::Len); + } + + /// Python __getitem__ override. + static python::object GetItem(HostType& host, python::object key) + { + static NameAccessor name_accessor; + static LengthAccessor length_accessor; + static IndexAccessor index_accessor; + + if (PyString_Check(key.ptr())) + { + return Rocket::Core::Python::Utilities::MakeObject(name_accessor(host, PyString_AsString(key.ptr()))); + } + else if (PyInt_Check(key.ptr())) + { + int index = PyInt_AsLong(key.ptr()); + + // Support indexing from both ends. + if (index < 0) + index = length_accessor(host) + index; + + // Throw exception if we're out of range, this is required to support python iteration. + if (index >= length_accessor(host)) + { + PyErr_SetString(PyExc_IndexError, "Index out of range."); + python::throw_error_already_set(); + } + + return Rocket::Core::Python::Utilities::MakeObject(index_accessor(host, index)); + } + + PyErr_SetString(PyExc_KeyError, "Invalid key."); + python::throw_error_already_set(); + + return python::object(); + } + + /// Python __len__ override. + static int Len(HostType& host) + { + static LengthAccessor length_accessor; + return length_accessor(host); + } +}; + +} +} +} + +#endif diff --git a/Include/Rocket/Core/Python/PickleTypeConverter.h b/Include/Rocket/Core/Python/PickleTypeConverter.h new file mode 100644 index 000000000..161780d78 --- /dev/null +++ b/Include/Rocket/Core/Python/PickleTypeConverter.h @@ -0,0 +1,87 @@ +/* + * This source file is part of libRocket, the HTML/CSS Interface Middleware + * + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +#ifndef ROCKETCOREPICKLETYPECONVERTER_H +#define ROCKETCOREPICKLETYPECONVERTER_H + +#include + +namespace Rocket { +namespace Core { +namespace Python { + +/** + Generic Python Pickler that does string conversion using an Rocket::Core::TypeConverter. + + @author Lloyd Weehuizen + */ + +template +class PickleTypeConverter : public python::pickle_suite +{ +public: + static python::tuple getstate(python::object obj) + { + T& object = python::extract(obj)(); + + String buffer; + TypeConverter< T, String >::Convert(object, buffer); + + return python::make_tuple(buffer.CString()); + } + + static void setstate(python::object obj, python::tuple state) + { + T& object = python::extract< T& >(obj)(); + + int len = python::extract< int >(state.attr( "__len__" )()); + if (len != 1) + { + PyErr_SetObject(PyExc_ValueError, + ("expected 1-item tuple in call to __setstate__; got %s" + % state).ptr() + ); + python::throw_error_already_set(); + } + + const char* cstring = python::extract(state[0]); + String string(cstring); + TypeConverter::Convert(string, object); + } + + static bool getstate_manages_dict() + { + // Tell boost we've taken care of the dictionary + return true; + } +}; + +} +} +} + +#endif diff --git a/Include/Rocket/Core/Python/Python.h b/Include/Rocket/Core/Python/Python.h new file mode 100644 index 000000000..a054c4ada --- /dev/null +++ b/Include/Rocket/Core/Python/Python.h @@ -0,0 +1,52 @@ +/* + * This source file is part of libRocket, the HTML/CSS Interface Middleware + * + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +#ifndef ROCKETCOREPYTHON_H +#define ROCKETCOREPYTHON_H + +// RocketCore platform header for the ROCKET_PLATFORM_* define. +#include + +// Python header includes +#include + +#ifdef ROCKET_PLATFORM_WIN32 + #pragma warning(push) + #pragma warning(disable: 4244) +#endif + +// Prevent Boost from auto-linking with the wrong library. +#define BOOST_ALL_NO_LIB +#include +// remap boost::python to python for easier access +namespace python = boost::python; + +#ifdef ROCKET_PLATFORM_WIN32 + #pragma warning(pop) +#endif + +#endif diff --git a/Include/Rocket/Core/Python/Utilities.h b/Include/Rocket/Core/Python/Utilities.h new file mode 100644 index 000000000..6a48a29c1 --- /dev/null +++ b/Include/Rocket/Core/Python/Utilities.h @@ -0,0 +1,111 @@ +/* + * This source file is part of libRocket, the HTML/CSS Interface Middleware + * + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +#ifndef ROCKETCOREPYTHONUTILITIES_H +#define ROCKETCOREPYTHONUTILITIES_H + +#include +#include +#include + +namespace Rocket { +namespace Core { +namespace Python { + +class ROCKETCOREPYTHON_API Utilities +{ +public: + /// Is the specific method name callable + static bool IsCallable(PyObject* self, const char* method_name); + + /// Call a python function + /// @param[in] object Python Dictionary or Object + /// @param[in] method_name function or method name to call + /// @param[in] args Tuple of arguments + /// @returns The python result + template + static R Call(PyObject* object, const char* method_name, const python::tuple& args) + { + PyObject* result = PythonCall(object, method_name, args); + + python::converter::return_from_python converter; + return converter(result); + } + /// Call a python function + /// @param[in] object Python Dictionary or Object to lookup the method in + /// @param[in] method_name function or method name to call + /// @param[in] args Tuple of arguments + /// @returns True on success + static bool Call(PyObject* object, const char* method_name, const python::tuple& args); + + /// Creates a boost python object from an existing C++ object pointer + /// @param[in] object The C++ object to convert + /// @returns A boost::python::object referencing the same object + template< typename T > + static inline python::object MakeObject(T* object) + { + // Constructs a boost::object using a result_converter to get a pointer to the existing object + typename python::return_by_value::apply< T* >::type result_converter; + return python::object(python::handle<>(result_converter(object))); + } + /// Creates a new python object (copy) from a C++ object + /// @param[in] object The C++ object to convert + /// @returns A boost::python::object that contains a copy of the object + template< typename T > + static inline python::object MakeObject(const T& object) + { + // Constructs a boost::object copy of the C++ object + return python::object(object); + } + + /// Print any pending exceptions to stderr + /// @param[in] clear_error Clear the error flag + static void PrintError(bool clear_error = false); + + /// Converts a python object into an Rocket variant. + /// @param[out] variant The variant to convert the object into. + /// @param[in] object The python object to convert. + /// @return True if the conversion was successful, false otherwise. + static bool ConvertToVariant(Variant& variant, PyObject* object); + +private: + static PyObject* PythonCall(PyObject* object, const char* method_name, const python::tuple& args ); +}; + +// Template Specialisation for converting from a PyObject* +template<> +inline python::object Utilities::MakeObject< PyObject >(PyObject* object) +{ + return python::object(python::handle<>(python::borrowed(object))); +} + +} +} +} + +#endif + diff --git a/Include/Rocket/Core/Python/VectorInterface.h b/Include/Rocket/Core/Python/VectorInterface.h new file mode 100644 index 000000000..17ca06308 --- /dev/null +++ b/Include/Rocket/Core/Python/VectorInterface.h @@ -0,0 +1,118 @@ +/* + * This source file is part of libRocket, the HTML/CSS Interface Middleware + * + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +#ifndef ROCKETCOREPYTHONVECTORINTERFACE_H +#define ROCKETCOREPYTHONVECTORINTERFACE_H + +namespace Rocket { +namespace Core { +namespace Python { + +/** + Provides a list style python interface to any STL container + that can provide a vector style interface. + + Simply contruct one of these objects to register the type + with python. + + VectorInterface< std::vector< std::string > >("StringList"); + + @author Lloyd Weehuizen + */ +template +class VectorInterface +{ +public: + VectorInterface(const char* name) + { + python::class_< Container >(name) + .def("__len__", &VectorInterface< Container >::Size) + .def("__setitem__", &VectorInterface< Container >::SetItem) + .def("__delitem__", &VectorInterface< Container >::DelItem) + .def("__getitem__", &VectorInterface< Container >::GetItem, python::return_value_policy< python::return_by_value >()) + .def("__contains__", &VectorInterface< Container >::Contains) + ; + } + + static size_t Size(const Container& container) + { + return container.size(); + } + + static void SetItem(Container& container, int index, const typename Container::value_type& value) + { + if (index < 0) + index = container.size() + index; + if (index >= (int)container.size()) + container.resize(index + 1); + + container[index] = value; + } + + static void DelItem(Container& container, int index) + { + if (index >= (int)container.size()) + { + PyErr_SetString(PyExc_IndexError, String(32, "Invalid index %d", index).CString()); + python::throw_error_already_set(); + } + + container.erase(container.begin() + index); + } + + static typename Container::value_type& GetItem(Container& container, int index) + { + if (index < 0) + index = container.size() + index; + + if (index >= (int)container.size()) + { + PyErr_SetString(PyExc_IndexError, String(32, "Invalid index %d", index).CString()); + python::throw_error_already_set(); + } + + return container[index]; + } + + static bool Contains(Container& container, const typename Container::value_type& value) + { + for (typename Container::iterator itr = container.begin(); itr != container.end(); ++itr) + { + if ((*itr) == value) + return true; + } + + return false; + } +}; + +} +} +} + +#endif + diff --git a/Include/Rocket/Core/Python/Wrapper.h b/Include/Rocket/Core/Python/Wrapper.h new file mode 100644 index 000000000..a32dd64bb --- /dev/null +++ b/Include/Rocket/Core/Python/Wrapper.h @@ -0,0 +1,67 @@ +/* + * This source file is part of libRocket, the HTML/CSS Interface Middleware + * + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +#ifndef ROCKETCOREPYTHONWRAPPER_H +#define ROCKETCOREPYTHONWRAPPER_H + +#include +#include + +#include + +namespace Rocket { +namespace Core { +namespace Python { + +/** + Generic Python Wrapper, using boost preprocessor iteration for constructor params + + Defines a basic wrapper, then template overloads it for each variation of the + number of arguments. + + @author Lloyd Weehuizen + */ + +struct WrapperNone {}; + +#define WRAPPER_MAX_ARGS 6 + +#define WRAPPER_TEMPLATE_ARG(z, n, d) BOOST_PP_COMMA_IF(n) typename T##n = WrapperNone + +template +class Wrapper {}; + +#undef WRAPPER_TEMPLATE_ARG + +#define BOOST_PP_ITERATION_PARAMS_1 (3, (0, WRAPPER_MAX_ARGS, )) +#include BOOST_PP_ITERATE() + +} +} +} + +#endif diff --git a/Include/Rocket/Core/Python/WrapperIter.h b/Include/Rocket/Core/Python/WrapperIter.h new file mode 100644 index 000000000..73f4067cc --- /dev/null +++ b/Include/Rocket/Core/Python/WrapperIter.h @@ -0,0 +1,122 @@ +/* + * This source file is part of libRocket, the HTML/CSS Interface Middleware + * + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +#if !defined(BOOST_PP_IS_ITERATING) +# error PyWrapperIter - do not include this file! +#endif + +#define N BOOST_PP_ITERATION() + +/** + Generic Python Wrapper, using Boost Preprocessor Iteration to Generate Variants + + Relies on a Rocket::Core::ReferenceCountable base class for reference counting. + + Traps ReferenceActivated/Deactivated calls and makes them behave like + they should for python based objects. + + @author Lloyd Weehuizen + */ + +#define WRAPPER_PARAM(x, n, d) , d + +template < typename T BOOST_PP_COMMA_IF(N) BOOST_PP_ENUM_PARAMS_Z(1, N, typename A) > +class Wrapper< T BOOST_PP_COMMA_IF(N) BOOST_PP_ENUM_PARAMS_Z(1, N, A) BOOST_PP_REPEAT_1( BOOST_PP_SUB(BOOST_PP_INC(WRAPPER_MAX_ARGS), N), WRAPPER_PARAM, WrapperNone) > : public T +{ +public: + Wrapper(PyObject* self BOOST_PP_COMMA_IF(N) BOOST_PP_ENUM_BINARY_PARAMS_Z(1, N, A, a)) : T(BOOST_PP_ENUM_PARAMS_Z(1, N, a)) + { + // Set self to NULL, so we can trap the reference deactivated and not pass it down + this->self = NULL; + + // We have to remove the C++ reference count that all C++ objects start with here, + // otherwise if an object is created in python and destroyed by python, the C++ ref count will + // remain 1. The PyWrapperInstancer will increase the refcount again, to ensure a correct refcount + // if the object was created by C++ + T::RemoveReference(); + + // If the C++ reference count is not 0 at this point, it means additional references have been added + // during the classes constructor. We have to propogate these references into python. + for (int i = 0; i < this->T::GetReferenceCount(); i++) + Py_INCREF(self); + + // Store self + this->self = self; + } + + Wrapper(PyObject* self, const T& other) : T(other) + { + this->self = self; + } + + virtual ~Wrapper() + { + // We should only be deleted when python says the refcnt is 0, if we + // are being deleted prematurely, something is wrong! + ROCKET_ASSERTMSG(self->ob_refcnt == 0, "Python object being cleared up prematurely, reference count not 0."); + ROCKET_ASSERT(this->T::GetReferenceCount() == 0); + } + + /// Override AddReference so we can push the call through to python + virtual void AddReference() + { + Py_INCREF(self); + + T::AddReference(); + } + + /// Overrride RemoveReference so we can push the call through to python + virtual void RemoveReference() + { + T::RemoveReference(); + + Py_DECREF(self); + } + + virtual int GetReferenceCount() + { + // C++ reference counts are always reflected in the python ref count + return self->ob_refcnt; + } + + virtual void OnReferenceDeactivate() + { + // If self is NULL, don't pass the call down, as this is the initial + // T::RemoveReference from the constructor + if (self) + T::OnReferenceDeactivate(); + } + + // Script object access + virtual void* GetScriptObject() const { return self; } + +protected: + PyObject* self; +}; + +#undef WRAPPER_PARAM + diff --git a/Include/Rocket/Core/String.h b/Include/Rocket/Core/String.h index 843eb7ca5..59de98819 100644 --- a/Include/Rocket/Core/String.h +++ b/Include/Rocket/Core/String.h @@ -49,7 +49,7 @@ ROCKETCORE_API int StringBase::FormatString(StringBase::size_type ma ROCKETCORE_API String operator+(const char* cstring, const String& string); // Redefine Windows APIs as their STDC counterparts. -#ifdef EMP_PLATFORM_WIN32 +#ifdef ROCKET_PLATFORM_WIN32 #define strcasecmp stricmp #define strncasecmp strnicmp #endif diff --git a/Include/Rocket/Core/StringBase.inl b/Include/Rocket/Core/StringBase.inl index 8bb52bb38..a2c486ea9 100644 --- a/Include/Rocket/Core/StringBase.inl +++ b/Include/Rocket/Core/StringBase.inl @@ -1,11 +1,27 @@ /* - * Copyright (c) 2006 - 2008 - * Wandering Monster Studios Limited + * This source file is part of libRocket, the HTML/CSS Interface Middleware * - * Any use of this program is governed by the terms of Wandering Monster - * Studios Limited's Licence Agreement included with this program, a copy - * of which can be obtained by contacting Wandering Monster Studios - * Limited at info@wanderingmonster.co.nz. + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. * */ @@ -65,14 +81,14 @@ StringBase< T >::StringBase(size_type count, const T character) } template< typename T > -StringBase< T >::StringBase(size_type EMP_UNUSED(max_length), const T* EMP_UNUSED(fmt), ...) +StringBase< T >::StringBase(size_type ROCKET_UNUSED(max_length), const T* ROCKET_UNUSED(fmt), ...) { string_id = 0; length = 0; value = (T*)StringStorage::empty_string; // Can't implement this at the base level, requires template specialisation - EMP_ERRORMSG("Not implemented."); + ROCKET_ERRORMSG("Not implemented."); } template< typename T > @@ -255,9 +271,9 @@ void StringBase< T >::Erase(size_type index, size_type count) } template< typename T > -int StringBase< T >::FormatString(size_type EMP_UNUSED(max_length), const T* EMP_UNUSED(fmt), ...) +int StringBase< T >::FormatString(size_type ROCKET_UNUSED(max_length), const T* ROCKET_UNUSED(fmt), ...) { - EMP_ERRORMSG("Not implemented."); + ROCKET_ERRORMSG("Not implemented."); return -1; } @@ -461,14 +477,14 @@ StringBase< T >& StringBase< T >::operator+=(const T& add) template< typename T > const T& StringBase< T >::operator[](size_type index) const { - EMP_ASSERT(index < length); + ROCKET_ASSERT(index < length); return value[index]; } template< typename T > T& StringBase< T >::operator[](size_type index) { - EMP_ASSERT(index < length); + ROCKET_ASSERT(index < length); return value[index]; } @@ -601,7 +617,7 @@ typename StringBase< T >::size_type StringBase< T >::_Find(const T* find, size_t template< typename T > typename StringBase< T >::size_type StringBase< T >::_RFind(const T* find, size_type find_length, size_type offset) const { - EMP_ASSERT(find_length > 0); + ROCKET_ASSERT(find_length > 0); size_type needle_index = 0; size_type haystack_index = (offset < length ? offset : length) - find_length; diff --git a/Include/Rocket/Core/TypeConverter.inl b/Include/Rocket/Core/TypeConverter.inl index f9f6e9061..f0e039859 100644 --- a/Include/Rocket/Core/TypeConverter.inl +++ b/Include/Rocket/Core/TypeConverter.inl @@ -1,18 +1,34 @@ /* - * Copyright (c) 2006 - 2008 - * Wandering Monster Studios Limited + * This source file is part of libRocket, the HTML/CSS Interface Middleware * - * Any use of this program is governed by the terms of Wandering Monster - * Studios Limited's Licence Agreement included with this program, a copy - * of which can be obtained by contacting Wandering Monster Studios - * Limited at info@wanderingmonster.co.nz. + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. * */ template bool TypeConverter::Convert(const SourceType& /*src*/, DestType& /*dest*/) { - EMP_ERRORMSG("No converter specified."); + ROCKET_ERRORMSG("No converter specified."); return false; } @@ -96,8 +112,8 @@ PASS_THROUGH(String); class ScriptInterface; typedef ScriptInterface* ScriptInterfacePtr; PASS_THROUGH(ScriptInterfacePtr); -/*typedef void* voidPtr; -PASS_THROUGH(voidPtr);*/ +typedef void* voidPtr; +PASS_THROUGH(voidPtr); template<> class TypeConverter< Stream, Stream > @@ -196,7 +212,7 @@ public: } }; -/*template<> +template<> class TypeConverter< String, URL > { public: @@ -204,7 +220,7 @@ public: { return dest.SetURL(src); } -};*/ +}; template< typename DestType, typename InternalType, int count > class TypeConverterStringVector @@ -238,13 +254,8 @@ public: \ STRING_VECTOR_CONVERTER(Vector2i, int, 2); STRING_VECTOR_CONVERTER(Vector2f, float, 2); -//STRING_VECTOR_CONVERTER(Vector3i, int, 3); -//STRING_VECTOR_CONVERTER(Vector3f, float, 2); -//STRING_VECTOR_CONVERTER(Vector4i, int, 4); -//STRING_VECTOR_CONVERTER(Vector4f, float, 4); STRING_VECTOR_CONVERTER(Colourf, float, 4); STRING_VECTOR_CONVERTER(Colourb, byte, 4); -//STRING_VECTOR_CONVERTER(Quaternion, float, 4); ///////////////////////////////////////////////// // To String Converters @@ -315,7 +326,7 @@ public: } }; -/*template<> +template<> class TypeConverter< URL, String > { public: @@ -324,8 +335,7 @@ public: dest = src.GetURL(); return true; } -};*/ - +}; template< typename SourceType, typename InternalType, int count > class TypeConverterVectorString @@ -361,44 +371,10 @@ public: \ VECTOR_STRING_CONVERTER(Vector2i, int, 2); VECTOR_STRING_CONVERTER(Vector2f, float, 2); -//VECTOR_STRING_CONVERTER(Vector3i, int, 3); -//VECTOR_STRING_CONVERTER(Vector3f, float, 3); -//VECTOR_STRING_CONVERTER(Vector4i, int, 4); -//VECTOR_STRING_CONVERTER(Vector4f, float, 4); VECTOR_STRING_CONVERTER(Colourf, float, 4); VECTOR_STRING_CONVERTER(Colourb, byte, 4); -//VECTOR_STRING_CONVERTER(Quaternion, float, 4); - #undef PASS_THROUGH #undef BASIC_CONVERTER #undef BASIC_CONVERTER_BOOL #undef STRING_VECTOR_CONVERTER #undef VECTOR_STRING_CONVERTER - -/*#define EMP_ENUM_CONVERTER( enum_type ) \ -template<> \ -class TypeConverter< enum_type, String > \ -{ \ -public: \ - static bool Convert(const enum_type& src, String& dest) \ - { \ - return dest.FormatString(32, "%d", src) > 0; \ - } \ -};\ -\ -template<> \ -class TypeConverter< String, enum_type > \ -{ \ -public: \ - static bool Convert(const String& src, enum_type& dest) \ - { \ - int temp; \ - if (sscanf(src.CString(), "%d", &temp) == 1) \ - { \ - dest = (enum_type) temp; \ - return true; \ - } \ -\ - return false; \ - } \ -};*/ diff --git a/Include/Rocket/Core/Types.h b/Include/Rocket/Core/Types.h index 863ab3d29..c924af35e 100644 --- a/Include/Rocket/Core/Types.h +++ b/Include/Rocket/Core/Types.h @@ -52,7 +52,7 @@ typedef void* ScriptObject; } } -#ifdef EMP_PLATFORM_WIN32 +#ifdef ROCKET_PLATFORM_WIN32 typedef unsigned __int64 uint64_t; #else #include diff --git a/Include/Rocket/Core/Variant.h b/Include/Rocket/Core/Variant.h index 36b51bddd..dc8f40225 100644 --- a/Include/Rocket/Core/Variant.h +++ b/Include/Rocket/Core/Variant.h @@ -25,8 +25,8 @@ * */ -#ifndef EMPVARIANT_H -#define EMPVARIANT_H +#ifndef ROCKETVARIANT_H +#define ROCKETVARIANT_H #include #include @@ -107,15 +107,9 @@ class ROCKETCORE_API Variant /// Sets a generic void* value on this variant. /// @param[in] value New value to set. void Set(void* value); - /// Sets a Quaternion value on this variant. - /// @param[in] value New value to set. - //void Set(const Quaternion& value); /// Sets an EMP string value on this variant. /// @param[in] value New value to set. void Set(const String& value); - /// Sets a Vector3f value on this variant. - /// @param[in] value New value to set. - //void Set(const Vector3f& value); /// Sets a Vector2f value on this variant. /// @param[in] value New value to set. void Set(const Vector2f& value); diff --git a/Include/Rocket/Core/Variant.inl b/Include/Rocket/Core/Variant.inl index 345f48969..03548f383 100644 --- a/Include/Rocket/Core/Variant.inl +++ b/Include/Rocket/Core/Variant.inl @@ -1,11 +1,27 @@ /* - * Copyright (c) 2006 - 2008 - * Wandering Monster Studios Limited + * This source file is part of libRocket, the HTML/CSS Interface Middleware * - * Any use of this program is governed by the terms of Wandering Monster - * Studios Limited's Licence Agreement included with this program, a copy - * of which can be obtained by contacting Wandering Monster Studios - * Limited at info@wanderingmonster.co.nz. + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. * */ @@ -59,7 +75,7 @@ bool Variant::GetInto(T& value) const return TypeConverter< Colourb, T >::Convert(*(Colourb*)data_block->data_ptr, value); break; - /*case SCRIPTINTERFACE: + case SCRIPTINTERFACE: { ScriptInterface* interface = (ScriptInterface*) data_block->data_ptr; return TypeConverter< ScriptInterface*, T >::Convert(interface, value); @@ -68,7 +84,7 @@ bool Variant::GetInto(T& value) const case VOIDPTR: return TypeConverter< void*, T >::Convert(data_block->data_ptr, value); - break;*/ + break; } return false; diff --git a/Include/Rocket/Core/Vector2.inl b/Include/Rocket/Core/Vector2.inl index 254e1a8f0..b11d790b2 100644 --- a/Include/Rocket/Core/Vector2.inl +++ b/Include/Rocket/Core/Vector2.inl @@ -1,11 +1,27 @@ /* - * Copyright (c) 2006 - 2008 - * Wandering Monster Studios Limited + * This source file is part of libRocket, the HTML/CSS Interface Middleware * - * Any use of this program is governed by the terms of Wandering Monster - * Studios Limited's Licence Agreement included with this program, a copy - * of which can be obtained by contacting Wandering Monster Studios - * Limited at info@wanderingmonster.co.nz. + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. * */ @@ -46,7 +62,7 @@ Type Vector2< Type >::SquaredMagnitude() const template < typename Type > Vector2< Type > Vector2< Type >::Normalise() const { - EMP_STATIC_ASSERT(false, Invalid_Operation); + ROCKET_STATIC_ASSERT(false, Invalid_Operation); return *this; } @@ -65,7 +81,7 @@ Type Vector2< Type >::DotProduct(const Vector2< Type >& rhs) const template < typename Type > Vector2< Type > Vector2< Type >::Rotate(float theta) const { - EMP_STATIC_ASSERT(false, Invalid_Operation); + ROCKET_STATIC_ASSERT(false, Invalid_Operation); return *this; } diff --git a/Include/Rocket/Debugger/Header.h b/Include/Rocket/Debugger/Header.h index bc5bdfca8..1211843c7 100644 --- a/Include/Rocket/Debugger/Header.h +++ b/Include/Rocket/Debugger/Header.h @@ -30,7 +30,7 @@ #include -#ifdef EMP_PLATFORM_WIN32 +#ifdef ROCKET_PLATFORM_WIN32 #ifdef RocketDebugger_EXPORTS #define ROCKETDEBUGGER_API __declspec(dllexport) #else diff --git a/Samples/README.TXT b/Samples/README.TXT index b79e08f35..a761ed1fd 100644 --- a/Samples/README.TXT +++ b/Samples/README.TXT @@ -1,59 +1,59 @@ -===================================================================== - libRocket Sample Applications -===================================================================== - -This directory contains a collection of sample applications -that demonstrate the use of libRocket in small, easy -to understand applications. - -To build the samples, you can either use Microsoft Visual Studio -(using the project files found within each directory), or use SCons -(SConstruct files are present in directories except those for -Windows-specific samples). - -If you build with Visual Studio, make sure the actual sample is the -'startup project' (displayed in bold) rather than the sample shell -project. - -If you build with SCons, be sure to compile the sample shell (found -in /samples/shell/) before you compile other samples. All the -SConstructs will build a debug build by default; to build a release -version, run 'scons release'. - -When compiling Python examples, you will need to set up your build -paths to point at the local copy of Python and Boost. If using Visual -Studio, change these in the project's include and library paths. If -using SCons, edit /build/config.py and change the paths as -appropriate. - -Directory Overview: - - * assets - This directory contains the assets shared by - all the sample applications. - * basic - This directory contains basic applications - that demonstrate initialisation, shutdown and - installing custom interfaces. - - * customlog - setting up custom logging - * directx - using DirectX as a renderer - * drag - dragging elements between containers - * loaddocument - loading your first document - * ogre3d - interfacing with Ogre3D engine - * treeview - using a nested DataSource - - * invaders - A full implementation of the 1970s classic - Space Invaders using the libRocket interface. - - * pyinvaders - Python version of the above (only installed - with the Python plugin). - - * shell - Common platform specific code used by all the - samples for open windows, processing input and - access files. - Supports Windows, MacOSX and Linux - - * tutorial - Tutorial code that should be used in conjunction - with the tutorials on the libRocket website. - http://www.librocket.com/wiki/documentation - -===================================================================== +===================================================================== + libRocket Sample Applications +===================================================================== + +This directory contains a collection of sample applications +that demonstrate the use of libRocket in small, easy +to understand applications. + +To build the samples, you can either use Microsoft Visual Studio +(using the project files found within each directory), or use SCons +(SConstruct files are present in directories except those for +Windows-specific samples). + +If you build with Visual Studio, make sure the actual sample is the +'startup project' (displayed in bold) rather than the sample shell +project. + +If you build with SCons, be sure to compile the sample shell (found +in /samples/shell/) before you compile other samples. All the +SConstructs will build a debug build by default; to build a release +version, run 'scons release'. + +When compiling Python examples, you will need to set up your build +paths to point at the local copy of Python and Boost. If using Visual +Studio, change these in the project's include and library paths. If +using SCons, edit /build/config.py and change the paths as +appropriate. + +Directory Overview: + + * assets - This directory contains the assets shared by + all the sample applications. + * basic - This directory contains basic applications + that demonstrate initialisation, shutdown and + installing custom interfaces. + + * customlog - setting up custom logging + * directx - using DirectX as a renderer + * drag - dragging elements between containers + * loaddocument - loading your first document + * ogre3d - interfacing with Ogre3D engine + * treeview - using a nested DataSource + + * invaders - A full implementation of the 1970s classic + Space Invaders using the libRocket interface. + + * pyinvaders - Python version of the above (only installed + with the Python plugin). + + * shell - Common platform specific code used by all the + samples for open windows, processing input and + access files. + Supports Windows, MacOSX and Linux + + * tutorial - Tutorial code that should be used in conjunction + with the tutorials on the libRocket website. + http://www.librocket.com/wiki/documentation + +===================================================================== diff --git a/Samples/basic/customlog/.sconsign.dblite b/Samples/basic/customlog/.sconsign.dblite deleted file mode 100644 index 2b957ffd7..000000000 Binary files a/Samples/basic/customlog/.sconsign.dblite and /dev/null differ diff --git a/Samples/basic/customlog/CustomLog.vcproj.user b/Samples/basic/customlog/CustomLog.vcproj.user index b606ebb81..fb290f041 100644 --- a/Samples/basic/customlog/CustomLog.vcproj.user +++ b/Samples/basic/customlog/CustomLog.vcproj.user @@ -1,65 +1,65 @@ - - - - - - - - - - - + + + + + + + + + + + diff --git a/Samples/basic/customlog/src/SystemInterface.cpp b/Samples/basic/customlog/src/SystemInterface.cpp index 20bf8dde8..120a7ea0b 100644 --- a/Samples/basic/customlog/src/SystemInterface.cpp +++ b/Samples/basic/customlog/src/SystemInterface.cpp @@ -1,11 +1,27 @@ /* - * Copyright (c) 2006 - 2008 - * Wandering Monster Studios Limited + * This source file is part of libRocket, the HTML/CSS Interface Middleware * - * Any use of this program is governed by the terms of Wandering Monster - * Studios Limited's Licence Agreement included with this program, a copy - * of which can be obtained by contacting Wandering Monster Studios - * Limited at info@wanderingmonster.co.nz. + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. * */ @@ -13,7 +29,7 @@ #include #include #include -#ifdef EMP_PLATFORM_WIN32 +#ifdef ROCKET_PLATFORM_WIN32 #include #endif @@ -60,7 +76,7 @@ bool SystemInterface::LogMessage(Rocket::Core::Log::Type type, const Rocket::Cor fprintf(fp, "%s (%.2f): %s", prefix, GetElapsedTime(), message.CString()); fflush(fp); -#ifdef EMP_PLATFORM_WIN32 +#ifdef ROCKET_PLATFORM_WIN32 if (type == Rocket::Core::Log::LT_ASSERT) { Rocket::Core::String assert_message(1024, "%s\nWould you like to interrupt execution?", message.CString()); diff --git a/Samples/basic/customlog/src/SystemInterface.h b/Samples/basic/customlog/src/SystemInterface.h index ea08701c7..6592c67d3 100644 --- a/Samples/basic/customlog/src/SystemInterface.h +++ b/Samples/basic/customlog/src/SystemInterface.h @@ -1,11 +1,27 @@ /* - * Copyright (c) 2006 - 2008 - * Wandering Monster Studios Limited + * This source file is part of libRocket, the HTML/CSS Interface Middleware * - * Any use of this program is governed by the terms of Wandering Monster - * Studios Limited's Licence Agreement included with this program, a copy - * of which can be obtained by contacting Wandering Monster Studios - * Limited at info@wanderingmonster.co.nz. + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. * */ diff --git a/Samples/basic/customlog/src/main.cpp b/Samples/basic/customlog/src/main.cpp index ef7cfbc9f..74ded53bb 100644 --- a/Samples/basic/customlog/src/main.cpp +++ b/Samples/basic/customlog/src/main.cpp @@ -1,11 +1,27 @@ /* - * Copyright (c) 2006 - 2008 - * Wandering Monster Studios Limited + * This source file is part of libRocket, the HTML/CSS Interface Middleware * - * Any use of this program is governed by the terms of Wandering Monster - * Studios Limited's Licence Agreement included with this program, a copy - * of which can be obtained by contacting Wandering Monster Studios - * Limited at info@wanderingmonster.co.nz. + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. * */ @@ -27,11 +43,11 @@ void GameLoop() Shell::FlipBuffers(); } -#if defined EMP_PLATFORM_WIN32 +#if defined ROCKET_PLATFORM_WIN32 #include -int APIENTRY WinMain(HINSTANCE EMP_UNUSED(instance_handle), HINSTANCE EMP_UNUSED(previous_instance_handle), char* EMP_UNUSED(command_line), int EMP_UNUSED(command_show)) +int APIENTRY WinMain(HINSTANCE ROCKET_UNUSED(instance_handle), HINSTANCE ROCKET_UNUSED(previous_instance_handle), char* ROCKET_UNUSED(command_line), int ROCKET_UNUSED(command_show)) #else -int main(int EMP_UNUSED(argc), char** EMP_UNUSED(argv)) +int main(int ROCKET_UNUSED(argc), char** ROCKET_UNUSED(argv)) #endif { // Generic OS initialisation, creates a window and attaches OpenGL. @@ -68,7 +84,7 @@ int main(int EMP_UNUSED(argc), char** EMP_UNUSED(argv)) // Load a non-existent document to spawn an error message. Rocket::Core::ElementDocument* invalid_document = context->LoadDocument("../../assets/invalid.rml"); - EMP_ASSERTMSG(invalid_document != NULL, "Testing ASSERT logging."); + ROCKET_ASSERTMSG(invalid_document != NULL, "Testing ASSERT logging."); if (invalid_document != NULL) { invalid_document->RemoveReference(); diff --git a/Samples/basic/directx/DirectX.vcproj b/Samples/basic/directx/DirectX.vcproj index 88f44cbef..7470e5371 100644 --- a/Samples/basic/directx/DirectX.vcproj +++ b/Samples/basic/directx/DirectX.vcproj @@ -55,7 +55,7 @@ /> - - - - - - - - - - + + + + + + + + + + + diff --git a/Samples/basic/directx/src/RenderInterfaceDirectX.cpp b/Samples/basic/directx/src/RenderInterfaceDirectX.cpp index 00fef50e1..680836780 100644 --- a/Samples/basic/directx/src/RenderInterfaceDirectX.cpp +++ b/Samples/basic/directx/src/RenderInterfaceDirectX.cpp @@ -1,11 +1,27 @@ /* - * Copyright (c) 2006 - 2008 - * Wandering Monster Studios Limited + * This source file is part of libRocket, the HTML/CSS Interface Middleware * - * Any use of this program is governed by the terms of Wandering Monster - * Studios Limited's Licence Agreement included with this program, a copy - * of which can be obtained by contacting Wandering Monster Studios - * Limited at info@wanderingmonster.co.nz. + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. * */ @@ -48,7 +64,7 @@ RenderInterfaceDirectX::~RenderInterfaceDirectX() } // Called by Rocket when it wants to render geometry that it does not wish to optimise. -void RenderInterfaceDirectX::RenderGeometry(Rocket::Core::Vertex* EMP_UNUSED(vertices), int EMP_UNUSED(num_vertices), int* EMP_UNUSED(indices), int EMP_UNUSED(num_indices), const Rocket::Core::TextureHandle EMP_UNUSED(texture), const EMP::Core::Vector2f& EMP_UNUSED(translation)) +void RenderInterfaceDirectX::RenderGeometry(Rocket::Core::Vertex* ROCKET_UNUSED(vertices), int ROCKET_UNUSED(num_vertices), int* ROCKET_UNUSED(indices), int ROCKET_UNUSED(num_indices), const Rocket::Core::TextureHandle ROCKET_UNUSED(texture), const Rocket::Core::Vector2f& ROCKET_UNUSED(translation)) { // We've chosen to not support non-compiled geometry in the DirectX renderer. If you wanted to render non-compiled // geometry, for example for very small sections of geometry, you could use DrawIndexedPrimitiveUP or write to a @@ -95,7 +111,7 @@ Rocket::Core::CompiledGeometryHandle RenderInterfaceDirectX::CompileGeometry(Roc } // Called by Rocket when it wants to render application-compiled geometry. -void RenderInterfaceDirectX::RenderCompiledGeometry(Rocket::Core::CompiledGeometryHandle geometry, const EMP::Core::Vector2f& translation) +void RenderInterfaceDirectX::RenderCompiledGeometry(Rocket::Core::CompiledGeometryHandle geometry, const Rocket::Core::Vector2f& translation) { // Build and set the transform matrix. D3DXMATRIX world_transform; @@ -148,8 +164,28 @@ void RenderInterfaceDirectX::SetScissorRegion(int x, int y, int width, int heigh g_pd3dDevice->SetScissorRect(&scissor_rect); } +// Set to byte packing, or the compiler will expand our struct, which means it won't read correctly from file +#pragma pack(1) +struct TGAHeader +{ + char idLength; + char colourMapType; + char dataType; + short int colourMapOrigin; + short int colourMapLength; + char colourMapDepth; + short int xOrigin; + short int yOrigin; + short int width; + short int height; + char bitsPerPixel; + char imageDescriptor; +}; +// Restore packing +#pragma pack() + // Called by Rocket when a texture is required by the library. -bool RenderInterfaceDirectX::LoadTexture(Rocket::Core::TextureHandle& texture_handle, EMP::Core::Vector2i& texture_dimensions, const EMP::Core::String& source) +bool RenderInterfaceDirectX::LoadTexture(Rocket::Core::TextureHandle& texture_handle, Rocket::Core::Vector2i& texture_dimensions, const Rocket::Core::String& source) { Rocket::Core::FileInterface* file_interface = Rocket::Core::GetFileInterface(); Rocket::Core::FileHandle file_handle = file_interface->Open(source); @@ -218,7 +254,7 @@ bool RenderInterfaceDirectX::LoadTexture(Rocket::Core::TextureHandle& texture_ha } // Called by Rocket when a texture is required to be built from an internally-generated sequence of pixels. -bool RenderInterfaceDirectX::GenerateTexture(Rocket::Core::TextureHandle& texture_handle, const byte* source, const EMP::Core::Vector2i& source_dimensions) +bool RenderInterfaceDirectX::GenerateTexture(Rocket::Core::TextureHandle& texture_handle, const byte* source, const Rocket::Core::Vector2i& source_dimensions) { // Create a Direct3DTexture9, which will be set as the texture handle. Note that we only create one surface for // this texture; because we're rendering in a 2D context, mip-maps are not required. diff --git a/Samples/basic/directx/src/RenderInterfaceDirectX.h b/Samples/basic/directx/src/RenderInterfaceDirectX.h index 471c668f6..6aa4b7861 100644 --- a/Samples/basic/directx/src/RenderInterfaceDirectX.h +++ b/Samples/basic/directx/src/RenderInterfaceDirectX.h @@ -1,11 +1,27 @@ /* - * Copyright (c) 2006 - 2008 - * Wandering Monster Studios Limited + * This source file is part of libRocket, the HTML/CSS Interface Middleware * - * Any use of this program is governed by the terms of Wandering Monster - * Studios Limited's Licence Agreement included with this program, a copy - * of which can be obtained by contacting Wandering Monster Studios - * Limited at info@wanderingmonster.co.nz. + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. * */ @@ -28,7 +44,7 @@ class RenderInterfaceDirectX : public Rocket::Core::RenderInterface virtual ~RenderInterfaceDirectX(); /// Called by Rocket when it wants to render geometry that it does not wish to optimise. - virtual void RenderGeometry(Rocket::Core::Vertex* vertices, int num_vertices, short int* indices, int num_indices, Rocket::Core::TextureHandle texture, const Rocket::Core::Vector2f& translation); + virtual void RenderGeometry(Rocket::Core::Vertex* vertices, int num_vertices, int* indices, int num_indices, Rocket::Core::TextureHandle texture, const Rocket::Core::Vector2f& translation); /// Called by Rocket when it wants to compile geometry it believes will be static for the forseeable future. virtual Rocket::Core::CompiledGeometryHandle CompileGeometry(Rocket::Core::Vertex* vertices, int num_vertices, int* indices, int num_indices, Rocket::Core::TextureHandle texture); diff --git a/Samples/basic/directx/src/main.cpp b/Samples/basic/directx/src/main.cpp index e7537921f..b650948f4 100644 --- a/Samples/basic/directx/src/main.cpp +++ b/Samples/basic/directx/src/main.cpp @@ -1,11 +1,27 @@ /* - * Copyright (c) 2006 - 2008 - * Wandering Monster Studios Limited + * This source file is part of libRocket, the HTML/CSS Interface Middleware * - * Any use of this program is governed by the terms of Wandering Monster - * Studios Limited's Licence Agreement included with this program, a copy - * of which can be obtained by contacting Wandering Monster Studios - * Limited at info@wanderingmonster.co.nz. + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. * */ @@ -107,15 +123,15 @@ void GameLoop() g_pd3dDevice->Present(NULL, NULL, NULL, NULL); } -#if defined EMP_PLATFORM_WIN32 +#if defined ROCKET_PLATFORM_WIN32 #include -int APIENTRY WinMain(HINSTANCE EMP_UNUSED(instance_handle), HINSTANCE EMP_UNUSED(previous_instance_handle), char* EMP_UNUSED(command_line), int EMP_UNUSED(command_show)) +int APIENTRY WinMain(HINSTANCE ROCKET_UNUSED(instance_handle), HINSTANCE ROCKET_UNUSED(previous_instance_handle), char* ROCKET_UNUSED(command_line), int ROCKET_UNUSED(command_show)) #else -int main(int EMP_UNUSED(argc), char** EMP_UNUSED(argv)) +int main(int ROCKET_UNUSED(argc), char** ROCKET_UNUSED(argv)) #endif { // Generic OS initialisation, creates a window and does not attach OpenGL. - if (!Shell::Initialise("../../Samples/basic/directx/") || + if (!Shell::Initialise("../Samples/basic/directx/") || !Shell::OpenWindow("DirectX Sample", false)) { Shell::Shutdown(); @@ -141,7 +157,7 @@ int main(int EMP_UNUSED(argc), char** EMP_UNUSED(argv)) Rocket::Core::Initialise(); // Create the main Rocket context and set it on the shell's input layer. - context = Rocket::Core::CreateContext("main", EMP::Core::Vector2i(1024, 768)); + context = Rocket::Core::CreateContext("main", Rocket::Core::Vector2i(1024, 768)); if (context == NULL) { Rocket::Core::Shutdown(); diff --git a/Samples/basic/drag/Drag.vcproj.user b/Samples/basic/drag/Drag.vcproj.user index b606ebb81..fb290f041 100644 --- a/Samples/basic/drag/Drag.vcproj.user +++ b/Samples/basic/drag/Drag.vcproj.user @@ -1,65 +1,65 @@ - - - - - - - - - - - + + + + + + + + + + + diff --git a/Samples/basic/drag/src/DragListener.cpp b/Samples/basic/drag/src/DragListener.cpp index f30bd0b99..99937805e 100644 --- a/Samples/basic/drag/src/DragListener.cpp +++ b/Samples/basic/drag/src/DragListener.cpp @@ -1,3 +1,30 @@ +/* + * This source file is part of libRocket, the HTML/CSS Interface Middleware + * + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + #include "DragListener.h" #include diff --git a/Samples/basic/drag/src/DragListener.h b/Samples/basic/drag/src/DragListener.h index 6f3a86e3e..834c6aad4 100644 --- a/Samples/basic/drag/src/DragListener.h +++ b/Samples/basic/drag/src/DragListener.h @@ -1,3 +1,30 @@ +/* + * This source file is part of libRocket, the HTML/CSS Interface Middleware + * + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + #ifndef DRAGLISTENER_H #define DRAGLISTENER_H diff --git a/Samples/basic/drag/src/Inventory.cpp b/Samples/basic/drag/src/Inventory.cpp index 84159144b..c9ae329c1 100644 --- a/Samples/basic/drag/src/Inventory.cpp +++ b/Samples/basic/drag/src/Inventory.cpp @@ -1,3 +1,30 @@ +/* + * This source file is part of libRocket, the HTML/CSS Interface Middleware + * + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + #include "Inventory.h" #include #include "DragListener.h" diff --git a/Samples/basic/drag/src/Inventory.h b/Samples/basic/drag/src/Inventory.h index 2fe6b0c5e..6841bd59e 100644 --- a/Samples/basic/drag/src/Inventory.h +++ b/Samples/basic/drag/src/Inventory.h @@ -1,3 +1,30 @@ +/* + * This source file is part of libRocket, the HTML/CSS Interface Middleware + * + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + #ifndef INVENTORY_H #define INVENTORY_H diff --git a/Samples/basic/drag/src/main.cpp b/Samples/basic/drag/src/main.cpp index 74e1083c8..91191774f 100644 --- a/Samples/basic/drag/src/main.cpp +++ b/Samples/basic/drag/src/main.cpp @@ -1,11 +1,27 @@ /* - * Copyright (c) 2006 - 2008 - * Wandering Monster Studios Limited + * This source file is part of libRocket, the HTML/CSS Interface Middleware * - * Any use of this program is governed by the terms of Wandering Monster - * Studios Limited's Licence Agreement included with this program, a copy - * of which can be obtained by contacting Wandering Monster Studios - * Limited at info@wanderingmonster.co.nz. + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. * */ @@ -27,11 +43,11 @@ void GameLoop() Shell::FlipBuffers(); } -#if defined EMP_PLATFORM_WIN32 +#if defined ROCKET_PLATFORM_WIN32 #include -int APIENTRY WinMain(HINSTANCE EMP_UNUSED(instance_handle), HINSTANCE EMP_UNUSED(previous_instance_handle), char* EMP_UNUSED(command_line), int EMP_UNUSED(command_show)) +int APIENTRY WinMain(HINSTANCE ROCKET_UNUSED(instance_handle), HINSTANCE ROCKET_UNUSED(previous_instance_handle), char* ROCKET_UNUSED(command_line), int ROCKET_UNUSED(command_show)) #else -int main(int EMP_UNUSED(argc), char** EMP_UNUSED(argv)) +int main(int ROCKET_UNUSED(argc), char** ROCKET_UNUSED(argv)) #endif { // Generic OS initialisation, creates a window and attaches OpenGL. diff --git a/Samples/basic/loaddocument/.sconsign.dblite b/Samples/basic/loaddocument/.sconsign.dblite deleted file mode 100644 index 8395a37aa..000000000 Binary files a/Samples/basic/loaddocument/.sconsign.dblite and /dev/null differ diff --git a/Samples/basic/loaddocument/LoadDocument.vcproj.user b/Samples/basic/loaddocument/LoadDocument.vcproj.user index b606ebb81..fb290f041 100644 --- a/Samples/basic/loaddocument/LoadDocument.vcproj.user +++ b/Samples/basic/loaddocument/LoadDocument.vcproj.user @@ -1,65 +1,65 @@ - - - - - - - - - - - + + + + + + + + + + + diff --git a/Samples/basic/loaddocument/src/main.cpp b/Samples/basic/loaddocument/src/main.cpp index ddefbabe0..d3fd68238 100644 --- a/Samples/basic/loaddocument/src/main.cpp +++ b/Samples/basic/loaddocument/src/main.cpp @@ -1,11 +1,27 @@ /* - * Copyright (c) 2006 - 2008 - * Wandering Monster Studios Limited + * This source file is part of libRocket, the HTML/CSS Interface Middleware * - * Any use of this program is governed by the terms of Wandering Monster - * Studios Limited's Licence Agreement included with this program, a copy - * of which can be obtained by contacting Wandering Monster Studios - * Limited at info@wanderingmonster.co.nz. + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. * */ @@ -26,11 +42,11 @@ void GameLoop() Shell::FlipBuffers(); } -#if defined EMP_PLATFORM_WIN32 +#if defined ROCKET_PLATFORM_WIN32 #include -int APIENTRY WinMain(HINSTANCE EMP_UNUSED(instance_handle), HINSTANCE EMP_UNUSED(previous_instance_handle), char* EMP_UNUSED(command_line), int EMP_UNUSED(command_show)) +int APIENTRY WinMain(HINSTANCE ROCKET_UNUSED(instance_handle), HINSTANCE ROCKET_UNUSED(previous_instance_handle), char* ROCKET_UNUSED(command_line), int ROCKET_UNUSED(command_show)) #else -int main(int EMP_UNUSED(argc), char** EMP_UNUSED(argv)) +int main(int ROCKET_UNUSED(argc), char** ROCKET_UNUSED(argv)) #endif { // Generic OS initialisation, creates a window and attaches OpenGL. diff --git a/Samples/basic/ogre3d/Ogre3D.vcproj b/Samples/basic/ogre3d/Ogre3D.vcproj index 1f956b639..42bba48d1 100644 --- a/Samples/basic/ogre3d/Ogre3D.vcproj +++ b/Samples/basic/ogre3d/Ogre3D.vcproj @@ -57,8 +57,8 @@ - - - - - - - - - - + + + + + + + + + + + diff --git a/Samples/basic/ogre3d/src/RenderInterfaceOgre3D.cpp b/Samples/basic/ogre3d/src/RenderInterfaceOgre3D.cpp index ef3ef6009..b3eab1375 100644 --- a/Samples/basic/ogre3d/src/RenderInterfaceOgre3D.cpp +++ b/Samples/basic/ogre3d/src/RenderInterfaceOgre3D.cpp @@ -1,11 +1,27 @@ /* - * Copyright (c) 2006 - 2008 - * Wandering Monster Studios Limited + * This source file is part of libRocket, the HTML/CSS Interface Middleware * - * Any use of this program is governed by the terms of Wandering Monster - * Studios Limited's Licence Agreement included with this program, a copy - * of which can be obtained by contacting Wandering Monster Studios - * Limited at info@wanderingmonster.co.nz. + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. * */ @@ -66,7 +82,7 @@ RenderInterfaceOgre3D::~RenderInterfaceOgre3D() } // Called by Rocket when it wants to render geometry that it does not wish to optimise. -void RenderInterfaceOgre3D::RenderGeometry(Rocket::Core::Vertex* EMP_UNUSED(vertices), int EMP_UNUSED(num_vertices), int* EMP_UNUSED(indices), int EMP_UNUSED(num_indices), Rocket::Core::TextureHandle EMP_UNUSED(texture), const EMP::Core::Vector2f& EMP_UNUSED(translation)) +void RenderInterfaceOgre3D::RenderGeometry(Rocket::Core::Vertex* ROCKET_UNUSED(vertices), int ROCKET_UNUSED(num_vertices), int* ROCKET_UNUSED(indices), int ROCKET_UNUSED(num_indices), Rocket::Core::TextureHandle ROCKET_UNUSED(texture), const Rocket::Core::Vector2f& ROCKET_UNUSED(translation)) { // We've chosen to not support non-compiled geometry in the Ogre3D renderer. } @@ -134,7 +150,7 @@ Rocket::Core::CompiledGeometryHandle RenderInterfaceOgre3D::CompileGeometry(Rock } // Called by Rocket when it wants to render application-compiled geometry. -void RenderInterfaceOgre3D::RenderCompiledGeometry(Rocket::Core::CompiledGeometryHandle geometry, const EMP::Core::Vector2f& translation) +void RenderInterfaceOgre3D::RenderCompiledGeometry(Rocket::Core::CompiledGeometryHandle geometry, const Rocket::Core::Vector2f& translation) { Ogre::Matrix4 transform; transform.makeTrans(translation.x, translation.y, 0); @@ -191,7 +207,7 @@ void RenderInterfaceOgre3D::SetScissorRegion(int x, int y, int width, int height } // Called by Rocket when a texture is required by the library. -bool RenderInterfaceOgre3D::LoadTexture(Rocket::Core::TextureHandle& texture_handle, EMP::Core::Vector2i& texture_dimensions, const EMP::Core::String& source) +bool RenderInterfaceOgre3D::LoadTexture(Rocket::Core::TextureHandle& texture_handle, Rocket::Core::Vector2i& texture_dimensions, const Rocket::Core::String& source) { Ogre::TextureManager* texture_manager = Ogre::TextureManager::getSingletonPtr(); Ogre::TexturePtr ogre_texture = texture_manager->getByName(Ogre::String(source.CString())); @@ -214,11 +230,11 @@ bool RenderInterfaceOgre3D::LoadTexture(Rocket::Core::TextureHandle& texture_han } // Called by Rocket when a texture is required to be built from an internally-generated sequence of pixels. -bool RenderInterfaceOgre3D::GenerateTexture(Rocket::Core::TextureHandle& texture_handle, const EMP::Core::byte* source, const EMP::Core::Vector2i& source_dimensions) +bool RenderInterfaceOgre3D::GenerateTexture(Rocket::Core::TextureHandle& texture_handle, const Rocket::Core::byte* source, const Rocket::Core::Vector2i& source_dimensions) { static int texture_id = 1; - Ogre::TexturePtr ogre_texture = Ogre::TextureManager::getSingleton().loadRawData(EMP::Core::String(16, "%d", texture_id++).CString(), + Ogre::TexturePtr ogre_texture = Ogre::TextureManager::getSingleton().loadRawData(Rocket::Core::String(16, "%d", texture_id++).CString(), "Rocket", Ogre::DataStreamPtr(new Ogre::MemoryDataStream((void*) source, source_dimensions.x * source_dimensions.y * sizeof(unsigned int))), source_dimensions.x, diff --git a/Samples/basic/ogre3d/src/RenderInterfaceOgre3D.h b/Samples/basic/ogre3d/src/RenderInterfaceOgre3D.h index ea8dd1b6a..a31743ef8 100644 --- a/Samples/basic/ogre3d/src/RenderInterfaceOgre3D.h +++ b/Samples/basic/ogre3d/src/RenderInterfaceOgre3D.h @@ -1,11 +1,27 @@ /* - * Copyright (c) 2006 - 2008 - * Wandering Monster Studios Limited + * This source file is part of libRocket, the HTML/CSS Interface Middleware * - * Any use of this program is governed by the terms of Wandering Monster - * Studios Limited's Licence Agreement included with this program, a copy - * of which can be obtained by contacting Wandering Monster Studios - * Limited at info@wanderingmonster.co.nz. + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. * */ @@ -28,13 +44,13 @@ class RenderInterfaceOgre3D : public Rocket::Core::RenderInterface virtual ~RenderInterfaceOgre3D(); /// Called by Rocket when it wants to render geometry that it does not wish to optimise. - virtual void RenderGeometry(Rocket::Core::Vertex* vertices, int num_vertices, int* indices, int num_indices, Rocket::Core::TextureHandle texture, const EMP::Core::Vector2f& translation); + virtual void RenderGeometry(Rocket::Core::Vertex* vertices, int num_vertices, int* indices, int num_indices, Rocket::Core::TextureHandle texture, const Rocket::Core::Vector2f& translation); /// Called by Rocket when it wants to compile geometry it believes will be static for the forseeable future. virtual Rocket::Core::CompiledGeometryHandle CompileGeometry(Rocket::Core::Vertex* vertices, int num_vertices, int* indices, int num_indices, Rocket::Core::TextureHandle texture); /// Called by Rocket when it wants to render application-compiled geometry. - virtual void RenderCompiledGeometry(Rocket::Core::CompiledGeometryHandle geometry, const EMP::Core::Vector2f& translation); + virtual void RenderCompiledGeometry(Rocket::Core::CompiledGeometryHandle geometry, const Rocket::Core::Vector2f& translation); /// Called by Rocket when it wants to release application-compiled geometry. virtual void ReleaseCompiledGeometry(Rocket::Core::CompiledGeometryHandle geometry); @@ -44,9 +60,9 @@ class RenderInterfaceOgre3D : public Rocket::Core::RenderInterface virtual void SetScissorRegion(int x, int y, int width, int height); /// Called by Rocket when a texture is required by the library. - virtual bool LoadTexture(Rocket::Core::TextureHandle& texture_handle, EMP::Core::Vector2i& texture_dimensions, const EMP::Core::String& source); + virtual bool LoadTexture(Rocket::Core::TextureHandle& texture_handle, Rocket::Core::Vector2i& texture_dimensions, const Rocket::Core::String& source); /// Called by Rocket when a texture is required to be built from an internally-generated sequence of pixels. - virtual bool GenerateTexture(Rocket::Core::TextureHandle& texture_handle, const EMP::Core::byte* source, const EMP::Core::Vector2i& source_dimensions); + virtual bool GenerateTexture(Rocket::Core::TextureHandle& texture_handle, const Rocket::Core::byte* source, const Rocket::Core::Vector2i& source_dimensions); /// Called by Rocket when a loaded texture is no longer required. virtual void ReleaseTexture(Rocket::Core::TextureHandle texture); diff --git a/Samples/basic/ogre3d/src/RocketApplication.cpp b/Samples/basic/ogre3d/src/RocketApplication.cpp index 5945e2342..81df144b0 100644 --- a/Samples/basic/ogre3d/src/RocketApplication.cpp +++ b/Samples/basic/ogre3d/src/RocketApplication.cpp @@ -1,11 +1,27 @@ /* - * Copyright (c) 2006 - 2008 - * Wandering Monster Studios Limited + * This source file is part of libRocket, the HTML/CSS Interface Middleware * - * Any use of this program is governed by the terms of Wandering Monster - * Studios Limited's Licence Agreement included with this program, a copy - * of which can be obtained by contacting Wandering Monster Studios - * Limited at info@wanderingmonster.co.nz. + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. * */ @@ -32,12 +48,12 @@ RocketApplication::RocketApplication() // Normalise the path. This path is used to specify the resource location (see line 56 below). _fullpath(path, rocket_path.CString(), MAX_PATH); - rocket_path = EMP::Core::String(path).Replace("\\", "/"); + rocket_path = Rocket::Core::String(path).Replace("\\", "/"); // The sample path is the path to the Ogre3D sample directory. All resources are loaded // relative to this path. sample_path = getcwd(path, MAX_PATH); - sample_path += "/../../projects/Rocket/samples/basic/ogre3d/"; + sample_path += "/../Samples/basic/ogre3d/"; #if OGRE_DEBUG_MODE chdir((Ogre::String(getenv("OGRE_HOME")) + "\\bin\\debug\\").c_str()); #else @@ -71,7 +87,7 @@ void RocketApplication::createScene() Rocket::Core::FontDatabase::LoadFontFace(sample_path + "../../assets/Delicious-Italic.otf"); Rocket::Core::FontDatabase::LoadFontFace(sample_path + "../../assets/Delicious-BoldItalic.otf"); - context = Rocket::Core::CreateContext("main", EMP::Core::Vector2i(mWindow->getWidth(), mWindow->getHeight())); + context = Rocket::Core::CreateContext("main", Rocket::Core::Vector2i(mWindow->getWidth(), mWindow->getHeight())); Rocket::Debugger::Initialise(context); // Load the mouse cursor and release the caller's reference. @@ -114,7 +130,7 @@ void RocketApplication::createFrameListener() } // Called from Ogre before a queue group is rendered. -void RocketApplication::renderQueueStarted(uint8 queueGroupId, const Ogre::String& invocation, bool& EMP_UNUSED(skipThisInvocation)) +void RocketApplication::renderQueueStarted(uint8 queueGroupId, const Ogre::String& invocation, bool& ROCKET_UNUSED(skipThisInvocation)) { if (queueGroupId == Ogre::RENDER_QUEUE_OVERLAY && Ogre::Root::getSingleton().getRenderSystem()->_getViewport()->getOverlaysEnabled()) { @@ -126,7 +142,7 @@ void RocketApplication::renderQueueStarted(uint8 queueGroupId, const Ogre::Strin } // Called from Ogre after a queue group is rendered. -void RocketApplication::renderQueueEnded(uint8 EMP_UNUSED(queueGroupId), const Ogre::String& EMP_UNUSED(invocation), bool& EMP_UNUSED(repeatThisInvocation)) +void RocketApplication::renderQueueEnded(uint8 ROCKET_UNUSED(queueGroupId), const Ogre::String& ROCKET_UNUSED(invocation), bool& ROCKET_UNUSED(repeatThisInvocation)) { } diff --git a/Samples/basic/ogre3d/src/RocketApplication.h b/Samples/basic/ogre3d/src/RocketApplication.h index fd2f4aa30..75833be43 100644 --- a/Samples/basic/ogre3d/src/RocketApplication.h +++ b/Samples/basic/ogre3d/src/RocketApplication.h @@ -1,11 +1,27 @@ /* - * Copyright (c) 2006 - 2008 - * Wandering Monster Studios Limited + * This source file is part of libRocket, the HTML/CSS Interface Middleware * - * Any use of this program is governed by the terms of Wandering Monster - * Studios Limited's Licence Agreement included with this program, a copy - * of which can be obtained by contacting Wandering Monster Studios - * Limited at info@wanderingmonster.co.nz. + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. * */ @@ -55,9 +71,9 @@ class RocketApplication : public ExampleApplication, public Ogre::RenderQueueLis void BuildProjectionMatrix(Ogre::Matrix4& matrix); // Absolute path to the libRocket directory. - EMP::Core::String rocket_path; + Rocket::Core::String rocket_path; // Absolute path to the Ogre3d sample directory; - EMP::Core::String sample_path; + Rocket::Core::String sample_path; Rocket::Core::Context* context; diff --git a/Samples/basic/ogre3d/src/RocketFrameListener.cpp b/Samples/basic/ogre3d/src/RocketFrameListener.cpp index 1bd6e425b..f94722a0e 100644 --- a/Samples/basic/ogre3d/src/RocketFrameListener.cpp +++ b/Samples/basic/ogre3d/src/RocketFrameListener.cpp @@ -1,11 +1,27 @@ /* - * Copyright (c) 2006 - 2008 - * Wandering Monster Studios Limited + * This source file is part of libRocket, the HTML/CSS Interface Middleware * - * Any use of this program is governed by the terms of Wandering Monster - * Studios Limited's Licence Agreement included with this program, a copy - * of which can be obtained by contacting Wandering Monster Studios - * Limited at info@wanderingmonster.co.nz. + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. * */ @@ -45,13 +61,13 @@ bool RocketFrameListener::mouseMoved(const OIS::MouseEvent& e) return true; } -bool RocketFrameListener::mousePressed(const OIS::MouseEvent& EMP_UNUSED(e), OIS::MouseButtonID id) +bool RocketFrameListener::mousePressed(const OIS::MouseEvent& ROCKET_UNUSED(e), OIS::MouseButtonID id) { context->ProcessMouseButtonDown((int) id, GetKeyModifierState()); return true; } -bool RocketFrameListener::mouseReleased(const OIS::MouseEvent& EMP_UNUSED(e), OIS::MouseButtonID id) +bool RocketFrameListener::mouseReleased(const OIS::MouseEvent& ROCKET_UNUSED(e), OIS::MouseButtonID id) { context->ProcessMouseButtonUp((int) id, GetKeyModifierState()); return true; @@ -74,9 +90,9 @@ bool RocketFrameListener::keyPressed(const OIS::KeyEvent& e) // Send through the ASCII value as text input if it is printable. if (e.text >= 32) - context->ProcessTextInput((EMP::Core::word) e.text); + context->ProcessTextInput((Rocket::Core::word) e.text); else if (key_identifier == Rocket::Core::Input::KI_RETURN) - context->ProcessTextInput((EMP::Core::word) '\n'); + context->ProcessTextInput((Rocket::Core::word) '\n'); return true; } diff --git a/Samples/basic/ogre3d/src/RocketFrameListener.h b/Samples/basic/ogre3d/src/RocketFrameListener.h index e248a8772..b2b046198 100644 --- a/Samples/basic/ogre3d/src/RocketFrameListener.h +++ b/Samples/basic/ogre3d/src/RocketFrameListener.h @@ -1,11 +1,27 @@ /* - * Copyright (c) 2006 - 2008 - * Wandering Monster Studios Limited + * This source file is part of libRocket, the HTML/CSS Interface Middleware * - * Any use of this program is governed by the terms of Wandering Monster - * Studios Limited's Licence Agreement included with this program, a copy - * of which can be obtained by contacting Wandering Monster Studios - * Limited at info@wanderingmonster.co.nz. + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. * */ diff --git a/Samples/basic/ogre3d/src/SystemInterfaceOgre3D.cpp b/Samples/basic/ogre3d/src/SystemInterfaceOgre3D.cpp index 8ac1266ca..38e4392fd 100644 --- a/Samples/basic/ogre3d/src/SystemInterfaceOgre3D.cpp +++ b/Samples/basic/ogre3d/src/SystemInterfaceOgre3D.cpp @@ -1,11 +1,27 @@ /* - * Copyright (c) 2006 - 2008 - * Wandering Monster Studios Limited + * This source file is part of libRocket, the HTML/CSS Interface Middleware * - * Any use of this program is governed by the terms of Wandering Monster - * Studios Limited's Licence Agreement included with this program, a copy - * of which can be obtained by contacting Wandering Monster Studios - * Limited at info@wanderingmonster.co.nz. + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. * */ @@ -26,15 +42,15 @@ float SystemInterfaceOgre3D::GetElapsedTime() } // Logs the specified message. -bool SystemInterfaceOgre3D::LogMessage(EMP::Core::Log::Type type, const EMP::Core::String& message) +bool SystemInterfaceOgre3D::LogMessage(Rocket::Core::Log::Type type, const Rocket::Core::String& message) { Ogre::LogMessageLevel message_level; switch (type) { - case EMP::Core::Log::LT_ALWAYS: - case EMP::Core::Log::LT_ERROR: - case EMP::Core::Log::LT_ASSERT: - case EMP::Core::Log::LT_WARNING: + case Rocket::Core::Log::LT_ALWAYS: + case Rocket::Core::Log::LT_ERROR: + case Rocket::Core::Log::LT_ASSERT: + case Rocket::Core::Log::LT_WARNING: message_level = Ogre::LML_CRITICAL; break; diff --git a/Samples/basic/ogre3d/src/SystemInterfaceOgre3D.h b/Samples/basic/ogre3d/src/SystemInterfaceOgre3D.h index b7a93e91b..3649b4e4b 100644 --- a/Samples/basic/ogre3d/src/SystemInterfaceOgre3D.h +++ b/Samples/basic/ogre3d/src/SystemInterfaceOgre3D.h @@ -1,11 +1,27 @@ /* - * Copyright (c) 2006 - 2008 - * Wandering Monster Studios Limited + * This source file is part of libRocket, the HTML/CSS Interface Middleware * - * Any use of this program is governed by the terms of Wandering Monster - * Studios Limited's Licence Agreement included with this program, a copy - * of which can be obtained by contacting Wandering Monster Studios - * Limited at info@wanderingmonster.co.nz. + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. * */ @@ -31,7 +47,7 @@ class SystemInterfaceOgre3D : public Rocket::Core::SystemInterface virtual float GetElapsedTime(); /// Logs the specified message. - virtual bool LogMessage(EMP::Core::Log::Type type, const EMP::Core::String& message); + virtual bool LogMessage(Rocket::Core::Log::Type type, const Rocket::Core::String& message); private: Ogre::Timer timer; diff --git a/Samples/basic/ogre3d/src/main.cpp b/Samples/basic/ogre3d/src/main.cpp index d819f1115..903e7589a 100644 --- a/Samples/basic/ogre3d/src/main.cpp +++ b/Samples/basic/ogre3d/src/main.cpp @@ -1,11 +1,27 @@ /* - * Copyright (c) 2006 - 2008 - * Wandering Monster Studios Limited + * This source file is part of libRocket, the HTML/CSS Interface Middleware * - * Any use of this program is governed by the terms of Wandering Monster - * Studios Limited's Licence Agreement included with this program, a copy - * of which can be obtained by contacting Wandering Monster Studios - * Limited at info@wanderingmonster.co.nz. + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. * */ @@ -13,9 +29,9 @@ #if OGRE_PLATFORM == OGRE_PLATFORM_WIN32 #include -int APIENTRY WinMain(HINSTANCE EMP_UNUSED(instance_handle), HINSTANCE EMP_UNUSED(previous_instance_handle), char* EMP_UNUSED(command_line), int EMP_UNUSED(command_show)) +int APIENTRY WinMain(HINSTANCE ROCKET_UNUSED(instance_handle), HINSTANCE ROCKET_UNUSED(previous_instance_handle), char* ROCKET_UNUSED(command_line), int ROCKET_UNUSED(command_show)) #else -int main(int EMP_UNUSED(argc), char** EMP_UNUSED(argv)) +int main(int ROCKET_UNUSED(argc), char** ROCKET_UNUSED(argv)) #endif { RocketApplication application; diff --git a/Samples/basic/treeview/.sconsign.dblite b/Samples/basic/treeview/.sconsign.dblite deleted file mode 100644 index e114f3bc9..000000000 Binary files a/Samples/basic/treeview/.sconsign.dblite and /dev/null differ diff --git a/Samples/basic/treeview/TreeView.vcproj.user b/Samples/basic/treeview/TreeView.vcproj.user index b606ebb81..fb290f041 100644 --- a/Samples/basic/treeview/TreeView.vcproj.user +++ b/Samples/basic/treeview/TreeView.vcproj.user @@ -1,65 +1,65 @@ - - - - - - - - - - - + + + + + + + + + + + diff --git a/Samples/basic/treeview/src/FileFormatter.cpp b/Samples/basic/treeview/src/FileFormatter.cpp index e2958ee93..2aac5af4c 100644 --- a/Samples/basic/treeview/src/FileFormatter.cpp +++ b/Samples/basic/treeview/src/FileFormatter.cpp @@ -1,3 +1,30 @@ +/* + * This source file is part of libRocket, the HTML/CSS Interface Middleware + * + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + #include "FileFormatter.h" FileFormatter::FileFormatter() : Rocket::Controls::DataFormatter("file") diff --git a/Samples/basic/treeview/src/FileFormatter.h b/Samples/basic/treeview/src/FileFormatter.h index d3187d881..6ae3a906f 100644 --- a/Samples/basic/treeview/src/FileFormatter.h +++ b/Samples/basic/treeview/src/FileFormatter.h @@ -1,3 +1,30 @@ +/* + * This source file is part of libRocket, the HTML/CSS Interface Middleware + * + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + #ifndef FILEFORMATTER_H #define FILEFORMATTER_H diff --git a/Samples/basic/treeview/src/FileSystem.cpp b/Samples/basic/treeview/src/FileSystem.cpp index 615aa1de8..7aebd72fa 100644 --- a/Samples/basic/treeview/src/FileSystem.cpp +++ b/Samples/basic/treeview/src/FileSystem.cpp @@ -1,11 +1,27 @@ /* - * Copyright (c) 2006 - 2008 - * Wandering Monster Studios Limited + * This source file is part of libRocket, the HTML/CSS Interface Middleware * - * Any use of this program is governed by the terms of Wandering Monster - * Studios Limited's Licence Agreement included with this program, a copy - * of which can be obtained by contacting Wandering Monster Studios - * Limited at info@wanderingmonster.co.nz. + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. * */ diff --git a/Samples/basic/treeview/src/FileSystem.h b/Samples/basic/treeview/src/FileSystem.h index 9b96163f7..bbd2ad4ef 100644 --- a/Samples/basic/treeview/src/FileSystem.h +++ b/Samples/basic/treeview/src/FileSystem.h @@ -1,11 +1,27 @@ /* - * Copyright (c) 2006 - 2008 - * Wandering Monster Studios Limited + * This source file is part of libRocket, the HTML/CSS Interface Middleware * - * Any use of this program is governed by the terms of Wandering Monster - * Studios Limited's Licence Agreement included with this program, a copy - * of which can be obtained by contacting Wandering Monster Studios - * Limited at info@wanderingmonster.co.nz. + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. * */ diff --git a/Samples/basic/treeview/src/main.cpp b/Samples/basic/treeview/src/main.cpp index f64a88014..d34ab81f3 100644 --- a/Samples/basic/treeview/src/main.cpp +++ b/Samples/basic/treeview/src/main.cpp @@ -1,11 +1,27 @@ /* - * Copyright (c) 2006 - 2008 - * Wandering Monster Studios Limited + * This source file is part of libRocket, the HTML/CSS Interface Middleware * - * Any use of this program is governed by the terms of Wandering Monster - * Studios Limited's Licence Agreement included with this program, a copy - * of which can be obtained by contacting Wandering Monster Studios - * Limited at info@wanderingmonster.co.nz. + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. * */ @@ -29,11 +45,11 @@ void GameLoop() Shell::FlipBuffers(); } -#if defined EMP_PLATFORM_WIN32 +#if defined ROCKET_PLATFORM_WIN32 #include -int APIENTRY WinMain(HINSTANCE EMP_UNUSED(instance_handle), HINSTANCE EMP_UNUSED(previous_instance_handle), char* EMP_UNUSED(command_line), int EMP_UNUSED(command_show)) +int APIENTRY WinMain(HINSTANCE ROCKET_UNUSED(instance_handle), HINSTANCE ROCKET_UNUSED(previous_instance_handle), char* ROCKET_UNUSED(command_line), int ROCKET_UNUSED(command_show)) #else -int main(int EMP_UNUSED(argc), char** EMP_UNUSED(argv)) +int main(int ROCKET_UNUSED(argc), char** ROCKET_UNUSED(argv)) #endif { // Generic OS initialisation, creates a window and attaches OpenGL. diff --git a/Samples/invaders/RocketInvaders.vcproj.user b/Samples/invaders/RocketInvaders.vcproj.user index fae1477c4..1275c709f 100644 --- a/Samples/invaders/RocketInvaders.vcproj.user +++ b/Samples/invaders/RocketInvaders.vcproj.user @@ -1,65 +1,65 @@ - - - - - - - - - - - + + + + + + + + + + + diff --git a/Samples/invaders/src/DecoratorDefender.cpp b/Samples/invaders/src/DecoratorDefender.cpp index 78c60742d..adf7b142e 100644 --- a/Samples/invaders/src/DecoratorDefender.cpp +++ b/Samples/invaders/src/DecoratorDefender.cpp @@ -47,18 +47,18 @@ bool DecoratorDefender::Initialise(const Rocket::Core::String& image_source, con } /// Called on a decorator to generate any required per-element data for a newly decorated element. -Rocket::Core::DecoratorDataHandle DecoratorDefender::GenerateElementData(Rocket::Core::Element* EMP_UNUSED(element)) +Rocket::Core::DecoratorDataHandle DecoratorDefender::GenerateElementData(Rocket::Core::Element* ROCKET_UNUSED(element)) { return NULL; } // Called to release element data generated by this decorator. -void DecoratorDefender::ReleaseElementData(Rocket::Core::DecoratorDataHandle EMP_UNUSED(element_data)) +void DecoratorDefender::ReleaseElementData(Rocket::Core::DecoratorDataHandle ROCKET_UNUSED(element_data)) { } // Called to render the decorator on an element. -void DecoratorDefender::RenderElement(Rocket::Core::Element* element, Rocket::Core::DecoratorDataHandle EMP_UNUSED(element_data)) +void DecoratorDefender::RenderElement(Rocket::Core::Element* element, Rocket::Core::DecoratorDataHandle ROCKET_UNUSED(element_data)) { Rocket::Core::Vector2f position = element->GetAbsoluteOffset(Rocket::Core::Box::PADDING); Rocket::Core::Vector2f size = element->GetBox().GetSize(Rocket::Core::Box::PADDING); diff --git a/Samples/invaders/src/DecoratorInstancerDefender.cpp b/Samples/invaders/src/DecoratorInstancerDefender.cpp index 1781f1688..24d5a6a68 100644 --- a/Samples/invaders/src/DecoratorInstancerDefender.cpp +++ b/Samples/invaders/src/DecoratorInstancerDefender.cpp @@ -40,7 +40,7 @@ DecoratorInstancerDefender::~DecoratorInstancerDefender() } // Instances a decorator given the property tag and attributes from the RCSS file. -Rocket::Core::Decorator* DecoratorInstancerDefender::InstanceDecorator(const Rocket::Core::String& EMP_UNUSED(name), const Rocket::Core::PropertyDictionary& properties) +Rocket::Core::Decorator* DecoratorInstancerDefender::InstanceDecorator(const Rocket::Core::String& ROCKET_UNUSED(name), const Rocket::Core::PropertyDictionary& properties) { const Rocket::Core::Property* image_source_property = properties.GetProperty("image-src"); Rocket::Core::String image_source = image_source_property->Get< Rocket::Core::String >(); diff --git a/Samples/invaders/src/DecoratorInstancerStarfield.cpp b/Samples/invaders/src/DecoratorInstancerStarfield.cpp index c20d8ee93..3988c71dc 100644 --- a/Samples/invaders/src/DecoratorInstancerStarfield.cpp +++ b/Samples/invaders/src/DecoratorInstancerStarfield.cpp @@ -45,7 +45,7 @@ DecoratorInstancerStarfield::~DecoratorInstancerStarfield() } // Instances a decorator given the property tag and attributes from the RCSS file. -Rocket::Core::Decorator* DecoratorInstancerStarfield::InstanceDecorator(const Rocket::Core::String& EMP_UNUSED(name), const Rocket::Core::PropertyDictionary& properties) +Rocket::Core::Decorator* DecoratorInstancerStarfield::InstanceDecorator(const Rocket::Core::String& ROCKET_UNUSED(name), const Rocket::Core::PropertyDictionary& properties) { int num_layers = Rocket::Core::Math::RealToInteger(properties.GetProperty("num-layers")->Get< float >()); Rocket::Core::Colourb top_colour = properties.GetProperty("top-colour")->Get< Rocket::Core::Colourb >(); diff --git a/Samples/invaders/src/DecoratorStarfield.cpp b/Samples/invaders/src/DecoratorStarfield.cpp index 57bfb368d..03599e183 100644 --- a/Samples/invaders/src/DecoratorStarfield.cpp +++ b/Samples/invaders/src/DecoratorStarfield.cpp @@ -95,7 +95,7 @@ void DecoratorStarfield::ReleaseElementData(Rocket::Core::DecoratorDataHandle el } // Called to render the decorator on an element. -void DecoratorStarfield::RenderElement(Rocket::Core::Element* EMP_UNUSED(element), Rocket::Core::DecoratorDataHandle element_data) +void DecoratorStarfield::RenderElement(Rocket::Core::Element* ROCKET_UNUSED(element), Rocket::Core::DecoratorDataHandle element_data) { StarField* star_field = (StarField*)element_data; star_field->Update(); diff --git a/Samples/invaders/src/Event.cpp b/Samples/invaders/src/Event.cpp index ff142c1bd..8c88e0d98 100644 --- a/Samples/invaders/src/Event.cpp +++ b/Samples/invaders/src/Event.cpp @@ -43,7 +43,7 @@ void Event::ProcessEvent(Rocket::Core::Event& event) } // Destroys the event. -void Event::OnDetach(Rocket::Core::Element* EMP_UNUSED(element)) +void Event::OnDetach(Rocket::Core::Element* ROCKET_UNUSED(element)) { delete this; } diff --git a/Samples/invaders/src/HighScores.cpp b/Samples/invaders/src/HighScores.cpp index 361d8bd24..6808e01e9 100644 --- a/Samples/invaders/src/HighScores.cpp +++ b/Samples/invaders/src/HighScores.cpp @@ -33,7 +33,7 @@ HighScores* HighScores::instance = NULL; HighScores::HighScores() : Rocket::Controls::DataSource("high_scores") { - EMP_ASSERT(instance == NULL); + ROCKET_ASSERT(instance == NULL); instance = this; for (int i = 0; i < NUM_SCORES; i++) @@ -46,7 +46,7 @@ HighScores::HighScores() : Rocket::Controls::DataSource("high_scores") HighScores::~HighScores() { - EMP_ASSERT(instance == this); + ROCKET_ASSERT(instance == this); SaveScores(); diff --git a/Samples/invaders/src/main.cpp b/Samples/invaders/src/main.cpp index 56993f42c..37c4c2159 100644 --- a/Samples/invaders/src/main.cpp +++ b/Samples/invaders/src/main.cpp @@ -53,7 +53,7 @@ void GameLoop() Shell::FlipBuffers(); } -#if defined EMP_PLATFORM_WIN32 +#if defined ROCKET_PLATFORM_WIN32 #include int APIENTRY WinMain(HINSTANCE, HINSTANCE, char*, int) #else diff --git a/Samples/pyinvaders/PyRocketInvaders.sln b/Samples/pyinvaders/PyRocketInvaders.sln new file mode 100644 index 000000000..e4080ea69 --- /dev/null +++ b/Samples/pyinvaders/PyRocketInvaders.sln @@ -0,0 +1,29 @@ + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual C++ Express 2008 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PyRocketInvaders", "PyRocketInvaders.vcproj", "{D343E357-BF62-424F-B22A-16D7B8A6422B}" + ProjectSection(ProjectDependencies) = postProject + {AF4FF882-AFD9-457B-979E-A5B482388D46} = {AF4FF882-AFD9-457B-979E-A5B482388D46} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Shell", "..\shell\Shell.vcproj", "{AF4FF882-AFD9-457B-979E-A5B482388D46}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {D343E357-BF62-424F-B22A-16D7B8A6422B}.Debug|Win32.ActiveCfg = Debug|Win32 + {D343E357-BF62-424F-B22A-16D7B8A6422B}.Debug|Win32.Build.0 = Debug|Win32 + {D343E357-BF62-424F-B22A-16D7B8A6422B}.Release|Win32.ActiveCfg = Release|Win32 + {D343E357-BF62-424F-B22A-16D7B8A6422B}.Release|Win32.Build.0 = Release|Win32 + {AF4FF882-AFD9-457B-979E-A5B482388D46}.Debug|Win32.ActiveCfg = Debug|Win32 + {AF4FF882-AFD9-457B-979E-A5B482388D46}.Debug|Win32.Build.0 = Debug|Win32 + {AF4FF882-AFD9-457B-979E-A5B482388D46}.Release|Win32.ActiveCfg = Release|Win32 + {AF4FF882-AFD9-457B-979E-A5B482388D46}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Samples/pyinvaders/PyRocketInvaders.vcproj b/Samples/pyinvaders/PyRocketInvaders.vcproj new file mode 100644 index 000000000..e7edc895e --- /dev/null +++ b/Samples/pyinvaders/PyRocketInvaders.vcproj @@ -0,0 +1,292 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Samples/pyinvaders/PyRocketInvaders.vcproj.user b/Samples/pyinvaders/PyRocketInvaders.vcproj.user new file mode 100644 index 000000000..71fed1f18 --- /dev/null +++ b/Samples/pyinvaders/PyRocketInvaders.vcproj.user @@ -0,0 +1,65 @@ + + + + + + + + + + + diff --git a/Samples/pyinvaders/data/background.rml b/Samples/pyinvaders/data/background.rml new file mode 100644 index 000000000..7f604459a --- /dev/null +++ b/Samples/pyinvaders/data/background.rml @@ -0,0 +1,35 @@ + + + + + + + + + diff --git a/Samples/pyinvaders/data/background.tga b/Samples/pyinvaders/data/background.tga new file mode 100644 index 000000000..faec89c90 Binary files /dev/null and b/Samples/pyinvaders/data/background.tga differ diff --git a/Samples/pyinvaders/data/game.rml b/Samples/pyinvaders/data/game.rml new file mode 100644 index 000000000..386119bb0 --- /dev/null +++ b/Samples/pyinvaders/data/game.rml @@ -0,0 +1,124 @@ + + + game + + + + + + +
+ + score: +
+
+ + high score: +
+
+ + lives: +
+
+ + wave: +
+
+ +
diff --git a/Samples/pyinvaders/data/help.rml b/Samples/pyinvaders/data/help.rml new file mode 100644 index 000000000..3a0fd4bbe --- /dev/null +++ b/Samples/pyinvaders/data/help.rml @@ -0,0 +1,55 @@ + + + Help + + + + +

Story

+

+ One day, without warning, they came for us; endless waves of the invaders, numbers too vast to count, fresh from the Martian foundries. Earth's orbital defences took a heavy toll, but were inevitably overrun, buying enough time only for a single rocket ship to launch. The prototype X-42 'Defender'-class, not yet tested but piloted by the finest astronaut the Space Corps had to offer. +

+

+ Do you have what it takes to defeat the invaders and save Earth? +

+

The X-42

+

+ The culmination of decades of research and the pinnacle of Earth's technology, the X-42 'Defender' is the finest weapon mankind has to fight the alien menace. Equipped with the dual-layer ablative tridranium armour, low-velocity depleted-narconium chain-fed belt gun and state-of-the-art liquid-hydrangea turbo-thrusters, it is still going to be nearly impossible for its pilot to secure the safety of mankind. +

+

The Invaders

+

+ The most numerous invader you'll face is a primitive drone that is primarily employed by its Martian overlords in the mines of Cydonia. It is large, ungainly and poorly-armed, so ill-suited to its new role as the backbone of the invasion fleet. However, whatever it lacks in pugilistic prowess it makes up for with numbers. Each drone is worth 10 points. +

+

+ Behind the drones stand the formidable berserker units, encased in their zyterium battle-suits and wielding the dreaded Nimbus death-rods. A lone unit is no match for a skilled X-42 pilot, but in large groups they adopt complex flight patterns that can confuse even the best targetting computer. Pick them off and separate them when you can. Each berserker is worth 20 points. +

+

+ The dreaded commander death-droids lie at the back of every Martian wave. Small, nimble and deadly, these ships are the true test of an X-42 pilot's abilities. Consider yourself warned, and watch out especially for their mind control attack! Each droid is worth 40 points. +

+

+ Occasionally one of the invasion motherships will drop into low-orbit to provide the Martian Overbrain with a close look at the progress of the battle; this is when they are most vulnerable, destroy them if you can! The loss of even a single mothership will be keenly felt by the fleet. The points value of each mothership is variable, depending on the seniority of its command synapse. +

+

+ Destroy all the invaders in each wave before any get past your ship to invade Earth, unleash their deadly toxin and wipe out all of humanity! +

+ + +
diff --git a/Samples/pyinvaders/data/help_defender.tga b/Samples/pyinvaders/data/help_defender.tga new file mode 100644 index 000000000..e10f9463b Binary files /dev/null and b/Samples/pyinvaders/data/help_defender.tga differ diff --git a/Samples/pyinvaders/data/help_invader_mothership.tga b/Samples/pyinvaders/data/help_invader_mothership.tga new file mode 100644 index 000000000..3bcd56d0e Binary files /dev/null and b/Samples/pyinvaders/data/help_invader_mothership.tga differ diff --git a/Samples/pyinvaders/data/help_invader_rank1.tga b/Samples/pyinvaders/data/help_invader_rank1.tga new file mode 100644 index 000000000..722557738 Binary files /dev/null and b/Samples/pyinvaders/data/help_invader_rank1.tga differ diff --git a/Samples/pyinvaders/data/help_invader_rank2.tga b/Samples/pyinvaders/data/help_invader_rank2.tga new file mode 100644 index 000000000..025cc3383 Binary files /dev/null and b/Samples/pyinvaders/data/help_invader_rank2.tga differ diff --git a/Samples/pyinvaders/data/help_invader_rank3.tga b/Samples/pyinvaders/data/help_invader_rank3.tga new file mode 100644 index 000000000..9f832c3b7 Binary files /dev/null and b/Samples/pyinvaders/data/help_invader_rank3.tga differ diff --git a/Samples/pyinvaders/data/high_score.rml b/Samples/pyinvaders/data/high_score.rml new file mode 100644 index 000000000..112228276 --- /dev/null +++ b/Samples/pyinvaders/data/high_score.rml @@ -0,0 +1,68 @@ + + + High Scores + + + + + + + Pilot: + Ship: + Wave: + Score: + + + + diff --git a/Samples/pyinvaders/data/high_scores_defender.tga b/Samples/pyinvaders/data/high_scores_defender.tga new file mode 100644 index 000000000..05163e9eb Binary files /dev/null and b/Samples/pyinvaders/data/high_scores_defender.tga differ diff --git a/Samples/pyinvaders/data/invaders.tga b/Samples/pyinvaders/data/invaders.tga new file mode 100644 index 000000000..5f0e40d00 Binary files /dev/null and b/Samples/pyinvaders/data/invaders.tga differ diff --git a/Samples/pyinvaders/data/logo.rml b/Samples/pyinvaders/data/logo.rml new file mode 100644 index 000000000..63478d4e3 --- /dev/null +++ b/Samples/pyinvaders/data/logo.rml @@ -0,0 +1,23 @@ + + + + + + + + diff --git a/Samples/pyinvaders/data/logo.tga b/Samples/pyinvaders/data/logo.tga new file mode 100644 index 000000000..424251071 Binary files /dev/null and b/Samples/pyinvaders/data/logo.tga differ diff --git a/Samples/pyinvaders/data/main_menu.rml b/Samples/pyinvaders/data/main_menu.rml new file mode 100644 index 000000000..b284b98d3 --- /dev/null +++ b/Samples/pyinvaders/data/main_menu.rml @@ -0,0 +1,33 @@ + + + Main Menu + + + + + +
+
+
+
+ + +
diff --git a/Samples/pyinvaders/data/options.rml b/Samples/pyinvaders/data/options.rml new file mode 100644 index 000000000..8c64d24d2 --- /dev/null +++ b/Samples/pyinvaders/data/options.rml @@ -0,0 +1,85 @@ + + + Options + + + + + +
+
+

+ Graphics:
+ Good
+ OK
+ Bad
+

+ +

+ Audio:
+ Reverb
+ 3D Spatialisation +

+
+ Accept + Cancel +
+ +
diff --git a/Samples/pyinvaders/data/pause.rml b/Samples/pyinvaders/data/pause.rml new file mode 100644 index 000000000..892e78a28 --- /dev/null +++ b/Samples/pyinvaders/data/pause.rml @@ -0,0 +1,27 @@ + + + Quit? + + + + +
+

Are you sure you want to end this game?

+ + + +
diff --git a/Samples/pyinvaders/data/start_game.rml b/Samples/pyinvaders/data/start_game.rml new file mode 100644 index 000000000..aaba07889 --- /dev/null +++ b/Samples/pyinvaders/data/start_game.rml @@ -0,0 +1,65 @@ + + + Start Game + + + + + +
+
+

+ Difficulty:
+ Easy
+ Hard +

+

+ Colour:
+ +

+
+ Start Game! +
+ +
diff --git a/Samples/pyinvaders/data/window.rml b/Samples/pyinvaders/data/window.rml new file mode 100644 index 000000000..3593b1bb2 --- /dev/null +++ b/Samples/pyinvaders/data/window.rml @@ -0,0 +1,20 @@ + diff --git a/Samples/pyinvaders/python/autoexec.py b/Samples/pyinvaders/python/autoexec.py new file mode 100644 index 000000000..8afa138d4 --- /dev/null +++ b/Samples/pyinvaders/python/autoexec.py @@ -0,0 +1,40 @@ +import rocket + +def Startup(): + context = rocket.contexts['main'] + context.LoadDocument('data/background.rml').Show() + doc = context.LoadDocument('data/main_menu.rml') + doc.Show() + +Startup() + + +class NameDataFormatter(rocket.DataFormatter): + def __init__(self): + rocket.DataFormatter.__init__(self, "name") + + def FormatData(self, raw_data): + """ + Data format: + raw_data[0] is the name. + raw_data[1] is a bool - True means the name has to be entered. False means the name has been entered already. + """ + + formatted_data = "" + + if (raw_data[1] == "1"): + formatted_data = "" + else: + formatted_data = raw_data[0] + + return formatted_data + +class ShipDataFormatter(rocket.DataFormatter): + def __init__(self): + rocket.DataFormatter.__init__(self, "ship") + + def FormatData(self, raw_data): + return ""; + +name_formatter = NameDataFormatter() +ship_formatter = ShipDataFormatter() diff --git a/Samples/pyinvaders/src/DecoratorDefender.cpp b/Samples/pyinvaders/src/DecoratorDefender.cpp new file mode 100644 index 000000000..adf7b142e --- /dev/null +++ b/Samples/pyinvaders/src/DecoratorDefender.cpp @@ -0,0 +1,86 @@ +/* + * This source file is part of libRocket, the HTML/CSS Interface Middleware + * + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +#include "DecoratorDefender.h" +#include +#include +#include +#include + +DecoratorDefender::~DecoratorDefender() +{ +} + +bool DecoratorDefender::Initialise(const Rocket::Core::String& image_source, const Rocket::Core::String& image_path) +{ + image_index = LoadTexture(image_source, image_path); + if (image_index == -1) + { + return false; + } + + return true; +} + +/// Called on a decorator to generate any required per-element data for a newly decorated element. +Rocket::Core::DecoratorDataHandle DecoratorDefender::GenerateElementData(Rocket::Core::Element* ROCKET_UNUSED(element)) +{ + return NULL; +} + +// Called to release element data generated by this decorator. +void DecoratorDefender::ReleaseElementData(Rocket::Core::DecoratorDataHandle ROCKET_UNUSED(element_data)) +{ +} + +// Called to render the decorator on an element. +void DecoratorDefender::RenderElement(Rocket::Core::Element* element, Rocket::Core::DecoratorDataHandle ROCKET_UNUSED(element_data)) +{ + Rocket::Core::Vector2f position = element->GetAbsoluteOffset(Rocket::Core::Box::PADDING); + Rocket::Core::Vector2f size = element->GetBox().GetSize(Rocket::Core::Box::PADDING); + + glEnable(GL_TEXTURE_2D); + glBindTexture(GL_TEXTURE_2D, (GLuint) GetTexture(image_index)->GetHandle(element->GetRenderInterface())); + Rocket::Core::Colourb colour = element->GetProperty< Rocket::Core::Colourb >("color"); + glColor4ubv(element->GetProperty< Rocket::Core::Colourb >("color")); + glBegin(GL_QUADS); + + glVertex2f(position.x, position.y); + glTexCoord2f(0, 1); + + glVertex2f(position.x, position.y + size.y); + glTexCoord2f(1, 1); + + glVertex2f(position.x + size.x, position.y + size.y); + glTexCoord2f(1, 0); + + glVertex2f(position.x + size.x, position.y); + glTexCoord2f(0, 0); + + glEnd(); + glColor4ub(255, 255, 255, 255); +} diff --git a/Samples/pyinvaders/src/DecoratorDefender.h b/Samples/pyinvaders/src/DecoratorDefender.h new file mode 100644 index 000000000..e64d20ea3 --- /dev/null +++ b/Samples/pyinvaders/src/DecoratorDefender.h @@ -0,0 +1,57 @@ +/* + * This source file is part of libRocket, the HTML/CSS Interface Middleware + * + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +#ifndef ROCKETINVADERSDECORATORDEFENDER_H +#define ROCKETINVADERSDECORATORDEFENDER_H + +#include + +class DecoratorDefender : public Rocket::Core::Decorator +{ +public: + virtual ~DecoratorDefender(); + + bool Initialise(const Rocket::Core::String& image_source, const Rocket::Core::String& image_path); + + /// Called on a decorator to generate any required per-element data for a newly decorated element. + /// @param element[in] The newly decorated element. + /// @return A handle to a decorator-defined data handle, or NULL if none is needed for the element. + virtual Rocket::Core::DecoratorDataHandle GenerateElementData(Rocket::Core::Element* element); + /// Called to release element data generated by this decorator. + /// @param element_data[in] The element data handle to release. + virtual void ReleaseElementData(Rocket::Core::DecoratorDataHandle element_data); + + /// Called to render the decorator on an element. + /// @param element[in] The element to render the decorator on. + /// @param element_data[in] The handle to the data generated by the decorator for the element. + virtual void RenderElement(Rocket::Core::Element* element, Rocket::Core::DecoratorDataHandle element_data); + +private: + int image_index; +}; + +#endif diff --git a/Samples/pyinvaders/src/DecoratorInstancerDefender.cpp b/Samples/pyinvaders/src/DecoratorInstancerDefender.cpp new file mode 100644 index 000000000..24d5a6a68 --- /dev/null +++ b/Samples/pyinvaders/src/DecoratorInstancerDefender.cpp @@ -0,0 +1,67 @@ +/* + * This source file is part of libRocket, the HTML/CSS Interface Middleware + * + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +#include "DecoratorInstancerDefender.h" +#include +#include +#include "DecoratorDefender.h" + +DecoratorInstancerDefender::DecoratorInstancerDefender() +{ + RegisterProperty("image-src", "").AddParser("string"); +} + +DecoratorInstancerDefender::~DecoratorInstancerDefender() +{ +} + +// Instances a decorator given the property tag and attributes from the RCSS file. +Rocket::Core::Decorator* DecoratorInstancerDefender::InstanceDecorator(const Rocket::Core::String& ROCKET_UNUSED(name), const Rocket::Core::PropertyDictionary& properties) +{ + const Rocket::Core::Property* image_source_property = properties.GetProperty("image-src"); + Rocket::Core::String image_source = image_source_property->Get< Rocket::Core::String >(); + + DecoratorDefender* decorator = new DecoratorDefender(); + if (decorator->Initialise(image_source, image_source_property->source)) + return decorator; + + decorator->RemoveReference(); + ReleaseDecorator(decorator); + return NULL; +} + +// Releases the given decorator. +void DecoratorInstancerDefender::ReleaseDecorator(Rocket::Core::Decorator* decorator) +{ + delete decorator; +} + +// Releases the instancer. +void DecoratorInstancerDefender::Release() +{ + delete this; +} diff --git a/Samples/pyinvaders/src/DecoratorInstancerDefender.h b/Samples/pyinvaders/src/DecoratorInstancerDefender.h new file mode 100644 index 000000000..9f768df3b --- /dev/null +++ b/Samples/pyinvaders/src/DecoratorInstancerDefender.h @@ -0,0 +1,56 @@ +/* + * This source file is part of libRocket, the HTML/CSS Interface Middleware + * + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +#ifndef ROCKETINVADERSDECORATORINSTANCERDEFENDER_H +#define ROCKETINVADERSDECORATORINSTANCERDEFENDER_H + +#include + +/** + @author Robert Curry + */ + +class DecoratorInstancerDefender : public Rocket::Core::DecoratorInstancer +{ +public: + DecoratorInstancerDefender(); + virtual ~DecoratorInstancerDefender(); + + /// Instances a decorator given the property tag and attributes from the RCSS file. + /// @param[in] name The type of decorator desired. For example, "background-decorator: simple;" is declared as type "simple". + /// @param[in] properties All RCSS properties associated with the decorator. + /// @return The decorator if it was instanced successful, NULL if an error occured. + Rocket::Core::Decorator* InstanceDecorator(const Rocket::Core::String& name, const Rocket::Core::PropertyDictionary& properties); + /// Releases the given decorator. + /// @param[in] decorator Decorator to release. This is guaranteed to have been constructed by this instancer. + void ReleaseDecorator(Rocket::Core::Decorator* decorator); + + /// Releases the instancer. + void Release(); +}; + +#endif diff --git a/Samples/pyinvaders/src/DecoratorInstancerStarfield.cpp b/Samples/pyinvaders/src/DecoratorInstancerStarfield.cpp new file mode 100644 index 000000000..4af5d733a --- /dev/null +++ b/Samples/pyinvaders/src/DecoratorInstancerStarfield.cpp @@ -0,0 +1,78 @@ +/* + * This source file is part of libRocket, the HTML/CSS Interface Middleware + * + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +#include "DecoratorStarfield.h" +#include +#include +#include "DecoratorInstancerStarfield.h" + +DecoratorInstancerStarfield::DecoratorInstancerStarfield() +{ + RegisterProperty("num-layers", "3").AddParser("number"); + RegisterProperty("top-colour", "#dddc").AddParser("color"); + RegisterProperty("bottom-colour", "#333c").AddParser("color"); + RegisterProperty("top-speed", "10.0").AddParser("number"); + RegisterProperty("bottom-speed", "2.0").AddParser("number"); + RegisterProperty("top-density", "15").AddParser("number"); + RegisterProperty("bottom-density", "10").AddParser("number"); +} + +DecoratorInstancerStarfield::~DecoratorInstancerStarfield() +{ +} + +// Instances a decorator given the property tag and attributes from the RCSS file. +Rocket::Core::Decorator* DecoratorInstancerStarfield::InstanceDecorator(const Rocket::Core::String& ROCKET_UNUSED(name), const Rocket::Core::PropertyDictionary& properties) +{ + int num_layers = Rocket::Core::Math::RealToInteger(properties.GetProperty("num-layers")->Get< float >()); + Rocket::Core::Colourb top_colour = properties.GetProperty("top-colour")->Get< Rocket::Core::Colourb >(); + Rocket::Core::Colourb bottom_colour = properties.GetProperty("bottom-colour")->Get< Rocket::Core::Colourb >(); + float top_speed = properties.GetProperty("top-speed")->Get< float >(); + float bottom_speed = properties.GetProperty("bottom-speed")->Get< float >(); + int top_density = Rocket::Core::Math::RealToInteger(properties.GetProperty("top-density")->Get< float >()); + int bottom_density = Rocket::Core::Math::RealToInteger(properties.GetProperty("bottom-density")->Get< float >()); + + DecoratorStarfield* decorator = new DecoratorStarfield(); + if (decorator->Initialise(num_layers, top_colour, bottom_colour, top_speed, bottom_speed, top_density, bottom_density)) + return decorator; + + decorator->RemoveReference(); + ReleaseDecorator(decorator); + return NULL; +} + +// Releases the given decorator. +void DecoratorInstancerStarfield::ReleaseDecorator(Rocket::Core::Decorator* decorator) +{ + delete decorator; +} + +// Releases the instancer. +void DecoratorInstancerStarfield::Release() +{ + delete this; +} diff --git a/Samples/pyinvaders/src/DecoratorInstancerStarfield.h b/Samples/pyinvaders/src/DecoratorInstancerStarfield.h new file mode 100644 index 000000000..9d69c8839 --- /dev/null +++ b/Samples/pyinvaders/src/DecoratorInstancerStarfield.h @@ -0,0 +1,57 @@ +/* + * This source file is part of libRocket, the HTML/CSS Interface Middleware + * + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +#ifndef ROCKETINVADERSDECORATORINSTANCERSTARFIELD_H +#define ROCKETINVADERSDECORATORINSTANCERSTARFIELD_H + +#include +#include "DecoratorStarfield.h" + +/** + @author Robert Curry + */ + +class DecoratorInstancerStarfield : public Rocket::Core::DecoratorInstancer +{ +public: + DecoratorInstancerStarfield(); + virtual ~DecoratorInstancerStarfield(); + + /// Instances a decorator given the property tag and attributes from the RCSS file. + /// @param name The type of decorator desired. For example, "background-decorator: simple;" is declared as type "simple". + /// @param properties All RCSS properties associated with the decorator. + /// @return The decorator if it was instanced successful, NULL if an error occured. + Rocket::Core::Decorator* InstanceDecorator(const Rocket::Core::String& name, const Rocket::Core::PropertyDictionary& properties); + /// Releases the given decorator. + /// @param decorator Decorator to release. This is guaranteed to have been constructed by this instancer. + void ReleaseDecorator(Rocket::Core::Decorator* decorator); + + /// Releases the instancer. + void Release(); +}; + +#endif diff --git a/Samples/pyinvaders/src/DecoratorStarfield.cpp b/Samples/pyinvaders/src/DecoratorStarfield.cpp new file mode 100644 index 000000000..03599e183 --- /dev/null +++ b/Samples/pyinvaders/src/DecoratorStarfield.cpp @@ -0,0 +1,145 @@ +/* + * This source file is part of libRocket, the HTML/CSS Interface Middleware + * + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +#include "DecoratorStarfield.h" +#include +#include +#include +#include +#include "GameDetails.h" + +float last_update_time = 0.0f; + +DecoratorStarfield::~DecoratorStarfield() +{ +} + +bool DecoratorStarfield::Initialise(int _num_layers, const Rocket::Core::Colourb& _top_colour, const Rocket::Core::Colourb& _bottom_colour, float _top_speed, float _bottom_speed, int _top_density, int _bottom_density) +{ + num_layers = _num_layers; + top_colour = _top_colour; + bottom_colour = _bottom_colour; + top_speed = _top_speed; + bottom_speed = _bottom_speed; + top_density = _top_density; + bottom_density = _bottom_density; + + return true; +} + +/// Called on a decorator to generate any required per-element data for a newly decorated element. +Rocket::Core::DecoratorDataHandle DecoratorStarfield::GenerateElementData(Rocket::Core::Element* element) +{ + StarField* star_field = new StarField(); + + star_field->star_layers.resize(num_layers); + + for (int i = 0; i < num_layers; i++) + { + float layer_depth = i / (float)num_layers; + + int density = Rocket::Core::Math::RealToInteger((top_density * layer_depth) + (bottom_density * (1.0f - layer_depth))); + star_field->star_layers[i].stars.resize(density); + + Rocket::Core::Colourb colour = (top_colour * layer_depth) + (bottom_colour * (1.0f - layer_depth)); + star_field->star_layers[i].colour = colour; + + float speed = (top_speed * layer_depth) + (bottom_speed * (1.0f - layer_depth)); + star_field->star_layers[i].speed = speed; + + star_field->dimensions = element->GetBox().GetSize(Rocket::Core::Box::PADDING); + + if (star_field->dimensions.x > 0) + { + for (int j = 0; j < density; j++) + { + star_field->star_layers[i].stars[j].x = (float) Rocket::Core::Math::RandomReal(star_field->dimensions.x); + star_field->star_layers[i].stars[j].y = (float) Rocket::Core::Math::RandomReal(star_field->dimensions.y); + } + } + + star_field->last_update = Shell::GetElapsedTime(); + } + + return star_field; +} + +// Called to release element data generated by this decorator. +void DecoratorStarfield::ReleaseElementData(Rocket::Core::DecoratorDataHandle element_data) +{ + delete (StarField*)element_data; +} + +// Called to render the decorator on an element. +void DecoratorStarfield::RenderElement(Rocket::Core::Element* ROCKET_UNUSED(element), Rocket::Core::DecoratorDataHandle element_data) +{ + StarField* star_field = (StarField*)element_data; + star_field->Update(); + + glDisable(GL_TEXTURE_2D); + glPointSize(2); + glBegin(GL_POINTS); + + for (size_t i = 0; i < star_field->star_layers.size(); i++) + { + glColor4ubv(star_field->star_layers[i].colour); + + for (size_t j = 0; j < star_field->star_layers[i].stars.size(); j++) + { + glVertex2f(star_field->star_layers[i].stars[j].x, star_field->star_layers[i].stars[j].y); + } + } + + glEnd(); + + glColor4ub(255, 255, 255, 255); +} + +void DecoratorStarfield::StarField::Update() +{ + float time = Shell::GetElapsedTime(); + float delta_time = time - last_update; + last_update = time; + + if (!GameDetails::GetPaused()) + { + for (size_t i = 0; i < star_layers.size(); i++) + { + float movement = star_layers[i].speed * delta_time; + + for (size_t j = 0; j < star_layers[i].stars.size(); j++) + { + star_layers[i].stars[j].y += movement; + if (star_layers[i].stars[j].y > dimensions.y) + { + star_layers[i].stars[j].y = 0; + star_layers[i].stars[j].x = Rocket::Core::Math::RandomReal(dimensions.x); + } + } + } + } +} diff --git a/Samples/pyinvaders/src/DecoratorStarfield.h b/Samples/pyinvaders/src/DecoratorStarfield.h new file mode 100644 index 000000000..acbc9e9b3 --- /dev/null +++ b/Samples/pyinvaders/src/DecoratorStarfield.h @@ -0,0 +1,82 @@ +/* + * This source file is part of libRocket, the HTML/CSS Interface Middleware + * + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +#ifndef ROCKETINVADERSDECORATORSTARFIELD_H +#define ROCKETINVADERSDECORATORSTARFIELD_H + +#include +#include + +class DecoratorStarfield : public Rocket::Core::Decorator +{ +public: + virtual ~DecoratorStarfield(); + + bool Initialise(int num_layers, const Rocket::Core::Colourb& top_colour, const Rocket::Core::Colourb& bottom_colour, float top_speed, float bottom_speed, int top_density, int bottom_density); + + /// Called on a decorator to generate any required per-element data for a newly decorated element. + /// @param[in] element The newly decorated element. + /// @return A handle to a decorator-defined data handle, or NULL if none is needed for the element. + virtual Rocket::Core::DecoratorDataHandle GenerateElementData(Rocket::Core::Element* element); + /// Called to release element data generated by this decorator. + /// @param[in] element_data The element data handle to release. + virtual void ReleaseElementData(Rocket::Core::DecoratorDataHandle element_data); + + /// Called to render the decorator on an element. + /// @param[in] element The element to render the decorator on. + /// @param[in] element_data The handle to the data generated by the decorator for the element. + virtual void RenderElement(Rocket::Core::Element* element, Rocket::Core::DecoratorDataHandle element_data); + +private: + int num_layers; + Rocket::Core::Colourb top_colour; + Rocket::Core::Colourb bottom_colour; + float top_speed; + float bottom_speed; + int top_density; + int bottom_density; + + struct StarLayer + { + typedef std::vector< Rocket::Core::Vector2f > StarList; + StarList stars; + Rocket::Core::Colourb colour; + float speed; + }; + + struct StarField + { + void Update(); + float last_update; + Rocket::Core::Vector2f dimensions; + + typedef std::vector< StarLayer > StarLayerList; + StarLayerList star_layers; + }; +}; + +#endif diff --git a/Samples/pyinvaders/src/Defender.cpp b/Samples/pyinvaders/src/Defender.cpp new file mode 100644 index 000000000..5398cd5e4 --- /dev/null +++ b/Samples/pyinvaders/src/Defender.cpp @@ -0,0 +1,182 @@ +/* + * This source file is part of libRocket, the HTML/CSS Interface Middleware + * + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +#include "Defender.h" +#include +#include +#include "Game.h" +#include "GameDetails.h" +#include "Invader.h" +#include "Mothership.h" +#include "Shield.h" +#include "Sprite.h" + +const float UPDATE_FREQ = 0.01f; +const float MOVEMENT_SPEED = 15; +const float BULLET_SPEED = 15; +const int SPRITE_WIDTH = 64; +const float RESPAWN_TIME = 1.0f; + +Sprite defender_sprite(Rocket::Core::Vector2f(60, 31), Rocket::Core::Vector2f(0, 0.5), Rocket::Core::Vector2f(0.23437500, 0.98437500)); +Sprite bullet_sprite(Rocket::Core::Vector2f(4, 20), Rocket::Core::Vector2f(0.4921875, 0.515625), Rocket::Core::Vector2f(0.5078125, 0.828125)); +Sprite explosion_sprite(Rocket::Core::Vector2f(52, 28), Rocket::Core::Vector2f(0.71484375f, 0.51562500f), Rocket::Core::Vector2f(0.91796875f, 0.95312500f)); + +Defender::Defender(Game* _game) +{ + move_direction = 0; + defender_frame_start = 0; + bullet_in_flight = false; + game = _game; + position.x = game->GetWindowDimensions().x / 2; + position.y = game->GetWindowDimensions().y - 50; + state = ALIVE; + render = true; +} + +Defender::~Defender() +{ +} + +void Defender::Update() +{ + if (Shell::GetElapsedTime() - defender_frame_start < UPDATE_FREQ) + return; + + defender_frame_start = Shell::GetElapsedTime(); + + position.x += (move_direction * MOVEMENT_SPEED); + + if (position.x < 5) + position.x = 5; + else if (position.x > (game->GetWindowDimensions().x - SPRITE_WIDTH - 5)) + position.x = game->GetWindowDimensions().x - SPRITE_WIDTH - 5; + + // Update the bullet + if (bullet_in_flight) + { + // Move it up and mark it dead if it flies off the top of the screen + bullet_position.y -= BULLET_SPEED; + if (bullet_position.y < 0) + bullet_in_flight = false; + } + + if (state == RESPAWN) + { + // Switch the render flag so the defender "flickers" + render = !render; + + // Check if we should switch back to our alive state + if (Shell::GetElapsedTime() - respawn_start > RESPAWN_TIME) + { + state = ALIVE; + render = true; + } + } +} + +void Defender::Render() +{ + glColor4ubv(GameDetails::GetDefenderColour()); + + // Render our sprite if rendering is enabled + if (render) + defender_sprite.Render(Rocket::Core::Vector2f(position.x, position.y)); + + // Update the bullet, doing collision detection + if (bullet_in_flight) + { + bullet_sprite.Render(Rocket::Core::Vector2f(bullet_position.x, bullet_position.y)); + + // Check if we hit the shields + for (int i = 0; i < game->GetNumShields(); i++) + { + if (game->GetShield(i)->CheckHit(bullet_position)) + { + bullet_in_flight = false; + break; + } + } + + if (bullet_in_flight) + { + for (int i = 0; i < game->GetNumInvaders(); i++) + { + if (game->GetInvader(i)->CheckHit(bullet_position)) + { + bullet_in_flight = false; + break; + } + } + } + } + + glColor4ub(255, 255, 255, 255); +} + +void Defender::StartMove(float direction) +{ + move_direction = direction > 0.0f ? 1.0f : -1.0f; +} + +void Defender::StopMove(float direction) +{ + float stop_direction = direction > 0.0f ? 1.0f : -1.0f; + if (stop_direction == move_direction) + move_direction = 0.0f; +} + +void Defender::Fire() +{ + if (!bullet_in_flight) + { + bullet_position = position + Rocket::Core::Vector2f((SPRITE_WIDTH/2) - 4, 0); + bullet_in_flight = true; + } +} + +bool Defender::CheckHit(const Rocket::Core::Vector2f& check_position) +{ + float sprite_width = defender_sprite.dimensions.x; + float sprite_height = defender_sprite.dimensions.y; + + // If the position is within our bounds, set ourselves + // as exploding and return a valid hit. + if (state == ALIVE + && check_position.x >= position.x + && check_position.x <= position.x + sprite_width + && check_position.y >= position.y + && check_position.y <= position.y + sprite_height) + { + game->RemoveLife(); + state = RESPAWN; + respawn_start = Shell::GetElapsedTime(); + + return true; + } + + return false; +} diff --git a/Samples/pyinvaders/src/Defender.h b/Samples/pyinvaders/src/Defender.h new file mode 100644 index 000000000..2630d3d9f --- /dev/null +++ b/Samples/pyinvaders/src/Defender.h @@ -0,0 +1,81 @@ +/* + * This source file is part of libRocket, the HTML/CSS Interface Middleware + * + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +#ifndef ROCKETINVADERSDEFENDER_H +#define ROCKETINVADERSDEFENDER_H + +#include + +class Game; +class Sprite; + +/** + Represents the Earth defender. Stores position and performs the update of the bullet position and collision detection. + @author Lloyd Weehuizen + */ + +class Defender +{ +public: + Defender(Game* game); + ~Defender(); + + /// Update the defender state. + void Update(); + /// Render the defender. + void Render(); + + /// Move the defender left. + void StartMove(float direction); + /// Stop the movement. + void StopMove(float direction); + /// Fire a bullet (if one isn't already in flight). + void Fire(); + + /// Check if an object at the given position would hit the defender. + bool CheckHit(const Rocket::Core::Vector2f& position); + +private: + Game* game; + Rocket::Core::Vector2f position; + + float move_direction; + + bool bullet_in_flight; + Rocket::Core::Vector2f bullet_position; + + float defender_frame_start; + float respawn_start; + + bool render; + + enum State { ALIVE, RESPAWN }; + State state; +}; + + +#endif diff --git a/Samples/pyinvaders/src/ElementGame.cpp b/Samples/pyinvaders/src/ElementGame.cpp new file mode 100644 index 000000000..cdcccc836 --- /dev/null +++ b/Samples/pyinvaders/src/ElementGame.cpp @@ -0,0 +1,113 @@ +/* + * This source file is part of libRocket, the HTML/CSS Interface Middleware + * + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +#include "ElementGame.h" +#include +#include +#include +#include +#include +#include +#include "Defender.h" +#include "Game.h" + +ElementGame::ElementGame(const Rocket::Core::String& tag) : Rocket::Core::Element(tag) +{ + game = new Game(); +} + +ElementGame::~ElementGame() +{ + delete game; +} + +void ElementGame::InitialisePythonInterface() +{ + PyObject* object = python::class_, python::bases, boost::noncopyable >("ElementGame", python::init()) + .ptr(); + + Rocket::Core::Factory::RegisterElementInstancer("game", new Rocket::Core::Python::ElementInstancer(object))->RemoveReference(); +} + +// Intercepts and handles key events. +void ElementGame::ProcessEvent(Rocket::Core::Event& event) +{ + Rocket::Core::Element::ProcessEvent(event); + + if (event == "keydown" || + event == "keyup") + { + bool key_down = event == "keydown"; + Rocket::Core::Input::KeyIdentifier key_identifier = (Rocket::Core::Input::KeyIdentifier) event.GetParameter< int >("key_identifier", 0); + + // Process left and right keys + if (key_down) + { + if (key_identifier == Rocket::Core::Input::KI_LEFT) + game->GetDefender()->StartMove(-1.0f); + if (key_identifier == Rocket::Core::Input::KI_RIGHT) + game->GetDefender()->StartMove(1.0f); + if (key_identifier == Rocket::Core::Input::KI_SPACE) + game->GetDefender()->Fire(); + } + else if (!key_down) + { + if (key_identifier == Rocket::Core::Input::KI_LEFT) + game->GetDefender()->StopMove(-1.0f); + if (key_identifier == Rocket::Core::Input::KI_RIGHT) + game->GetDefender()->StopMove(1.0f); + } + } + + if (event == "load") + { + game->Initialise(); + } +} + +// Updates the game. +void ElementGame::OnUpdate() +{ + game->Update(); + + if (game->IsGameOver()) + DispatchEvent("gameover", Rocket::Core::Dictionary(), false); +} + +// Renders the game. +void ElementGame::OnRender() +{ + game->Render(); +} + +void ElementGame::OnChildAdd(Rocket::Core::Element* element) +{ + Rocket::Core::Element::OnChildAdd(element); + + if (element == this) + GetOwnerDocument()->AddEventListener("load", this); +} diff --git a/Samples/pyinvaders/src/ElementGame.h b/Samples/pyinvaders/src/ElementGame.h new file mode 100644 index 000000000..41295466d --- /dev/null +++ b/Samples/pyinvaders/src/ElementGame.h @@ -0,0 +1,67 @@ +/* + * This source file is part of libRocket, the HTML/CSS Interface Middleware + * + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +#ifndef ROCKETINVADERSELEMENTGAME_H +#define ROCKETINVADERSELEMENTGAME_H + +#include +#include + +class Game; + +/** + @author Peter Curry + */ + +class ElementGame : public Rocket::Core::Element, public Rocket::Core::EventListener +{ +public: + ElementGame(const Rocket::Core::String& tag); + virtual ~ElementGame(); + + /// Initialises the python interface and registers the serialiser + static void InitialisePythonInterface(); + + /// Intercepts and handles key events. + void ProcessEvent(Rocket::Core::Event& event); + + /// Receive notifications when child elements are added + /// This will only get called when we're added to the tree, + /// which allows us to bind to onload + void OnChildAdd(Rocket::Core::Element* element); + +protected: + /// Updates the game. + virtual void OnUpdate(); + /// Renders the game. + virtual void OnRender(); + +private: + Game* game; +}; + +#endif diff --git a/Samples/pyinvaders/src/Game.cpp b/Samples/pyinvaders/src/Game.cpp new file mode 100644 index 000000000..471b35bc6 --- /dev/null +++ b/Samples/pyinvaders/src/Game.cpp @@ -0,0 +1,445 @@ +/* + * This source file is part of libRocket, the HTML/CSS Interface Middleware + * + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +#include "Game.h" +#include +#include +#include +#include "Defender.h" +#include "GameDetails.h" +#include "HighScores.h" +#include "Invader.h" +#include "Mothership.h" +#include "Shield.h" + +const int WINDOW_WIDTH = 1024; +const int WINDOW_HEIGHT = 768; + +const int NUM_LIVES = 3; + +const int NUM_INVADER_ROWS = 5; +const int NUM_INVADERS_PER_ROW = 11; +const int NUM_INVADERS = (NUM_INVADER_ROWS * NUM_INVADERS_PER_ROW); +const int INVADER_SPACING_X = 64; +const int INVADER_SPACING_Y = 48; +const int INVADER_START_Y = 96; + +const float INVADER_MOVEMENT = 10; +const float INVADER_START_MOVE_FREQ = 0.5f; +const float INVADER_UPDATE_MODIFIER = 0.7f; + +const int MOTHERSHIP = NUM_INVADERS; + +const int NUM_SHIELD_ARRAYS = 4; +const int NUM_SHIELDS_PER_ARRAY = 10; +const int NUM_SHIELDS = (NUM_SHIELD_ARRAYS * NUM_SHIELDS_PER_ARRAY); +const int SHIELD_SIZE = (NUM_SHIELD_CELLS * PIXEL_SIZE); +const int SHIELD_SPACING_X = 192; +const int SHIELD_START_X = 176; +const int SHIELD_START_Y = 600; + +// The game's element context (declared in main.cpp). +extern Rocket::Core::Context* context; + +Game::Game() +{ + invader_frame_start = 0; + defender_lives = 3; + game_over = false; + current_invader_direction = 1.0f; + invaders = new Invader*[NUM_INVADERS + 1]; + for (int i = 0; i < NUM_INVADERS + 1; i++) + invaders[i] = NULL; + + shields = new Shield*[NUM_SHIELDS]; + for (int i = 0; i < NUM_SHIELDS; i++) + shields[i] = NULL; + + // Use the OpenGL render interface to load our texture. + Rocket::Core::Vector2i texture_dimensions; + Rocket::Core::GetRenderInterface()->LoadTexture(texture, texture_dimensions, "data/invaders.tga"); + + defender = new Defender(this); +} + +Game::~Game() +{ + delete defender; + + for (int i = 0; i < NUM_INVADERS + 1; i++) + delete invaders[i]; + + delete [] invaders; + + for (int i = 0; i < NUM_SHIELDS; i++) + delete shields[i]; + + delete [] shields; +} + +void Game::Initialise() +{ + // Initialise the scores and wave information + SetScore(0); + SetWave(1); + SetHighScore(HighScores::GetHighScore()); + SetLives(NUM_LIVES); + + // Initialise the shields. + InitialiseShields(); + + // Create a new wave + InitialiseWave(); +} + +void Game::Update() +{ + if (!GameDetails::GetPaused()) + { + if (defender_lives <= 0) + return; + + // Determine if we should advance the invaders + if (Shell::GetElapsedTime() - invader_frame_start >= invader_move_freq) + { + MoveInvaders(); + + invader_frame_start = Shell::GetElapsedTime(); + } + + // Update all invaders + for (int i = 0; i < NUM_INVADERS + 1; i++) + invaders[i]->Update(); + + defender->Update(); + } +} + +void Game::Render() +{ + if (defender_lives <= 0) + return; + + // Render all available shields + for (int i = 0; i < NUM_SHIELDS; i++) + { + shields[i]->Render(); + } + + glEnable(GL_TEXTURE_2D); + glBindTexture(GL_TEXTURE_2D, (GLuint) texture); + glColor4ub(255, 255, 255, 255); + glBegin(GL_QUADS); + + // Render all available invaders + for (int i = 0; i < NUM_INVADERS + 1; i++) + { + invaders[i]->Render(); + } + + defender->Render(); + + glEnd(); +} + +Defender* Game::GetDefender() +{ + return defender; +} + +Invader* Game::GetInvader(int index) +{ + return invaders[index]; +} + +int Game::GetNumInvaders() +{ + return NUM_INVADERS + 1; +} + +bool Game::CanDropBomb(int index) +{ + // Determines if the given invader can drop a bomb by checking if theres any other invaders under it + int y = (index / NUM_INVADERS_PER_ROW); + int x = index - (y * NUM_INVADERS_PER_ROW); + + // The mothership can never drop bombs + if (index == MOTHERSHIP) + return false; + + // Check each row under the given invader to see if there is space + for (int i = y + 1; i < NUM_INVADER_ROWS; i++) + { + if (invaders[(i * NUM_INVADERS_PER_ROW) + x]->GetState() == Invader::ALIVE) + return false; + } + + return true; +} + +// Access the shields. +Shield* Game::GetShield(int index) +{ + return shields[index]; +} + +// Get the total number of shields +int Game::GetNumShields() +{ + return NUM_SHIELDS; +} + +// Adds a score onto the player's score. +void Game::AddScore(int score) +{ + SetScore(GameDetails::GetScore() + score); +} + +// Sets the player's score. +void Game::SetScore(int score) +{ + GameDetails::SetScore(score); + + Rocket::Core::Element* score_element = context->GetDocument("game_window")->GetElementById("score"); + if (score_element != NULL) + score_element->SetInnerRML(Rocket::Core::String(128, "%d", score).CString()); + + // Update the high score if we've beaten it. + if (score > HighScores::GetHighScore()) + SetHighScore(score); +} + +// Sets the player's high-score. +void Game::SetHighScore(int score) +{ + Rocket::Core::Element* high_score_element = context->GetDocument("game_window")->GetElementById("hiscore"); + if (high_score_element != NULL) + high_score_element->SetInnerRML(Rocket::Core::String(128, "%d", score).CString()); +} + +void Game::SetLives(int lives) +{ + defender_lives = lives; + + Rocket::Core::Element* score_element = context->GetDocument("game_window")->GetElementById("lives"); + if (score_element != NULL) + score_element->SetInnerRML(Rocket::Core::String(128, "%d", defender_lives).CString()); +} + +void Game::SetWave(int wave) +{ + GameDetails::SetWave(wave); + + Rocket::Core::Element* waves_element = context->GetDocument("game_window")->GetElementById("waves"); + if (waves_element != NULL) + waves_element->SetInnerRML(Rocket::Core::String(128, "%d", wave).CString()); +} + +void Game::RemoveLife() +{ + if (defender_lives > 0) + { + SetLives(defender_lives - 1); + + if (defender_lives == 0) + { + OnGameOver(); + } + } +} + +bool Game::IsGameOver() const +{ + return game_over; +} + +const Rocket::Core::Vector2f Game::GetWindowDimensions() +{ + return Rocket::Core::Vector2f((float) WINDOW_WIDTH, (float) WINDOW_HEIGHT); +} + +void Game::MoveInvaders() +{ + Rocket::Core::Vector2f new_positions[NUM_INVADERS]; + + // We loop through all invaders, calculating their new positions, if any of them go over the screen bounds, + // then we switch direction, move the invaders down and start at 0 again + for (int i = 0; i < NUM_INVADERS; i++) + { + if (invaders[i]->GetState() == Invader::DEAD) + continue; + + new_positions[i] = invaders[i]->GetPosition(); + new_positions[i].x += INVADER_MOVEMENT * current_invader_direction; + if (new_positions[i].x < 0 || new_positions[i].x + INVADER_SPACING_X > WINDOW_WIDTH) + { + // Switch direction and start back at 0 (-1 as the for loop increments) + current_invader_direction *= -1.0f; + i = -1; + + // Move all invaders down + for (int j = 0; j < NUM_INVADERS; j++) + { + if (invaders[j]->GetState() == Invader::DEAD) + continue; + + Rocket::Core::Vector2f position = invaders[j]->GetPosition(); + position.y += INVADER_SPACING_Y; + invaders[j]->SetPosition(position); + } + + // Increase speed of invaders + invader_move_freq *= INVADER_UPDATE_MODIFIER; + } + } + + // Assign invaders their new position and advance their animation frame + bool invaders_alive = false; + + for (int i = 0; i < NUM_INVADERS; i++) + { + if (invaders[i]->GetState() == Invader::DEAD) + continue; + + invaders[i]->SetPosition(new_positions[i]); + invaders[i]->UpdateAnimation(); + + // If an invader hits the bottom, instant death + if (new_positions[i].y >= GetWindowDimensions().y - INVADER_SPACING_Y) + { + OnGameOver(); + return; + } + + invaders_alive = true; + } + + if (!invaders_alive) + { + SetWave(GameDetails::GetWave() + 1); + InitialiseWave(); + } +} + +void Game::OnGameOver() +{ + // Set lives to zero and continue to the high scores + defender_lives = 0; + game_over = true; +} + +void Game::InitialiseShields() +{ + Rocket::Core::Vector2f shield_array_start_position((float) SHIELD_START_X, (float) SHIELD_START_Y); + + for (int x = 0; x < NUM_SHIELD_ARRAYS; x++) + { + // Top row (row of 4) + for (int i = 0; i < 4; i++) + { + Shield::ShieldType type = Shield::REGULAR; + if (i == 0) + type = Shield::TOP_LEFT; + else if (i == 3) + { + type = Shield::TOP_RIGHT; + } + + shields[(x * NUM_SHIELDS_PER_ARRAY) + i] = new Shield(this, type); + shields[(x * NUM_SHIELDS_PER_ARRAY) + i]->SetPosition(shield_array_start_position + Rocket::Core::Vector2f((float) SHIELD_SIZE * i, 0)); + } + + // Middle row (row of 4) + for (int i = 0; i < 4; i++) + { + + Shield::ShieldType type = Shield::REGULAR; + if (i == 1) + type = Shield::BOTTOM_RIGHT; + else if (i == 2) + { + type = Shield::BOTTOM_LEFT; + } + + shields[(x * NUM_SHIELDS_PER_ARRAY) + 4 + i] = new Shield(this, type); + shields[(x * NUM_SHIELDS_PER_ARRAY) + 4 + i]->SetPosition(shield_array_start_position + Rocket::Core::Vector2f((float) SHIELD_SIZE * i, (float) SHIELD_SIZE)); + } + + // Bottom row (2, one on each end) + shields[(x * NUM_SHIELDS_PER_ARRAY) + 8] = new Shield(this, Shield::REGULAR); + shields[(x * NUM_SHIELDS_PER_ARRAY) + 8]->SetPosition(shield_array_start_position + Rocket::Core::Vector2f(0, (float) SHIELD_SIZE * 2)); + + shields[(x * NUM_SHIELDS_PER_ARRAY) + 9] = new Shield(this, Shield::REGULAR); + shields[(x * NUM_SHIELDS_PER_ARRAY) + 9]->SetPosition(shield_array_start_position + Rocket::Core::Vector2f((float) SHIELD_SIZE * 3, (float) SHIELD_SIZE * 2)); + + shield_array_start_position.x += SHIELD_SPACING_X; + } +} + +void Game::InitialiseWave() +{ + // Set up the rows + for (int y = 0; y < NUM_INVADER_ROWS; y++) + { + // Determine invader type + Invader::InvaderType type = Invader::UNKNOWN; + switch (y) + { + case 0: + type = Invader::RANK3; break; + case 1: + case 2: + type = Invader::RANK2; break; + default: + type = Invader::RANK1; break; + } + + // Determine position of top left invader + Rocket::Core::Vector2f invader_position((float) (WINDOW_WIDTH - (NUM_INVADERS_PER_ROW * INVADER_SPACING_X)) / 2, (float) (INVADER_START_Y + (y * INVADER_SPACING_Y))); + + for (int x = 0; x < NUM_INVADERS_PER_ROW; x++) + { + // Determine invader type based on row position + int index = (y * NUM_INVADERS_PER_ROW) + x; + + delete invaders[index]; + invaders[index] = new Invader(this, type, (y * NUM_INVADERS_PER_ROW) + x); + invaders[index]->SetPosition(invader_position); + + // Increase invader position + invader_position.x += INVADER_SPACING_X; + } + } + + // Reset mother ship + delete invaders[MOTHERSHIP]; + invaders[MOTHERSHIP] = new Mothership(this, MOTHERSHIP); + + // Update the move frequency + invader_move_freq = ((((float)GameDetails::GetWave())-100.0f)/140.0f); + invader_move_freq *= invader_move_freq; +} diff --git a/Samples/pyinvaders/src/Game.h b/Samples/pyinvaders/src/Game.h new file mode 100644 index 000000000..17de5c420 --- /dev/null +++ b/Samples/pyinvaders/src/Game.h @@ -0,0 +1,128 @@ +/* + * This source file is part of libRocket, the HTML/CSS Interface Middleware + * + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +#ifndef ROCKETINVADERSGAME_H +#define ROCKETINVADERSGAME_H + +#include +#include + +class Shield; +class Invader; +class Defender; +class Mothership; + +/** + Runs the game. + - Updates the Invader positions, animations and bombs. + - Updates the player position and bullets + + @author Lloyd Weehuizen + */ + +class Game +{ +public: + Game(); + ~Game(); + + /// Initialise a new game + void Initialise(); + + /// Update the game + void Update(); + + /// Render the game + void Render(); + + /// Access the defender + Defender* GetDefender(); + /// Access the invaders + Invader* GetInvader(int index); + /// Get the total number of invaders + int GetNumInvaders(); + + /// Returns true if the given invader can drop bomb + bool CanDropBomb(int invader_index); + + /// Access the shields. + Shield* GetShield(int index); + /// Get the total number of shields + int GetNumShields(); + + /// Adds a score onto the player's score. + void AddScore(int score); + /// Sets the player's score. + void SetScore(int score); + /// Sets the player's high-score. + void SetHighScore(int score); + /// Set the number of defender lives. + void SetLives(int lives); + /// Set the current wave + void SetWave(int wave); + /// Remove a defender life + void RemoveLife(); + /// Checks if the game is over + bool IsGameOver() const; + + /// Get the dimensions of the game window. + const Rocket::Core::Vector2f GetWindowDimensions(); + +private: + + // The current invaders + Invader** invaders; + // The direction they're moving + float current_invader_direction; + // Time of the last invader update + Rocket::Core::Time invader_frame_start; + // How often the invaders move + Rocket::Core::Time invader_move_freq; + // Is the game over + bool game_over; + + // Helper function to move the invaders + void MoveInvaders(); + + // Our current defener + Defender* defender; + + // Number of lives the defender has left + int defender_lives; + + // The current shields + Shield** shields; + + // Texture that contains the sprites + Rocket::Core::TextureHandle texture; + + void InitialiseShields(); + void InitialiseWave(); + void OnGameOver(); +}; + +#endif diff --git a/Samples/pyinvaders/src/GameDetails.cpp b/Samples/pyinvaders/src/GameDetails.cpp new file mode 100644 index 000000000..df7b6222a --- /dev/null +++ b/Samples/pyinvaders/src/GameDetails.cpp @@ -0,0 +1,148 @@ +/* + * This source file is part of libRocket, the HTML/CSS Interface Middleware + * + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +#include "GameDetails.h" + +static GameDetails::Difficulty difficulty = GameDetails::EASY; +static Rocket::Core::Colourb colour = Rocket::Core::Colourb(255, 0, 0); +static int score = -1; +static int wave = 0; +static bool paused = false; + +static GameDetails::GraphicsQuality graphics_quality = GameDetails::OK; +static bool reverb = true; +static bool spatialisation = false; + +GameDetails::GameDetails() +{ +} + +GameDetails::~GameDetails() +{ +} + +// Sets the game difficulty. +void GameDetails::SetDifficulty(Difficulty _difficulty) +{ + difficulty = _difficulty; +} + +// Returns the game difficulty. +GameDetails::Difficulty GameDetails::GetDifficulty() +{ + return difficulty; +} + +// Sets the colour of the player's ship. +void GameDetails::SetDefenderColour(const Rocket::Core::Colourb& _colour) +{ + colour = _colour; +} + +// Returns the player's ship colour. +const Rocket::Core::Colourb& GameDetails::GetDefenderColour() +{ + return colour; +} + +// Sets the score the player achieved in the last game. +void GameDetails::SetScore(int _score) +{ + score = _score; +} + +// Resets the player's score. +void GameDetails::ResetScore() +{ + score = -1; +} + +// Returns the score the player achieved in the last game. +int GameDetails::GetScore() +{ + return score; +} + +// Set the current wave number +void GameDetails::SetWave(int _wave) +{ + wave = _wave; +} + +// Get the current wave number +int GameDetails::GetWave() +{ + return wave; +} + +// Sets the pauses state of the game +void GameDetails::SetPaused(bool _paused) +{ + paused = _paused; +} + +// Gets if the game is paused or not +bool GameDetails::GetPaused() +{ + return paused; +} + +// Sets the quality of the graphics used in-game. +void GameDetails::SetGraphicsQuality(GraphicsQuality quality) +{ + graphics_quality = quality; +} + +// Returns the quality of the graphics to use in-game. +GameDetails::GraphicsQuality GameDetails::GetGraphicsQuality() +{ + return graphics_quality; +} + +// Enables or disables reverb. +void GameDetails::SetReverb(bool enabled) +{ + reverb = enabled; +} + +// Returns the current state of reverb. +bool GameDetails::GetReverb() +{ + return reverb; +} + +// Enables or disables 3D spatialisation in the audio engine. +void GameDetails::Set3DSpatialisation(bool enabled) +{ + spatialisation = enabled; +} + +// Returns the current state of audio spatialisation. +bool GameDetails::Get3DSpatialisation() +{ + return spatialisation; +} diff --git a/Samples/pyinvaders/src/GameDetails.h b/Samples/pyinvaders/src/GameDetails.h new file mode 100644 index 000000000..a66058394 --- /dev/null +++ b/Samples/pyinvaders/src/GameDetails.h @@ -0,0 +1,107 @@ +/* + * This source file is part of libRocket, the HTML/CSS Interface Middleware + * + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +#ifndef ROCKETINVADERSGAMEDETAILS_H +#define ROCKETINVADERSGAMEDETAILS_H + +#include + +/** + @author Peter Curry + */ + +class GameDetails +{ +public: + enum Difficulty { EASY, HARD }; + + /// Sets the game difficulty. + /// @param[in] difficulty The new game difficulty. + static void SetDifficulty(Difficulty difficulty); + /// Returns the game difficulty. + /// @return The current game difficulty. + static Difficulty GetDifficulty(); + + /// Sets the colour of the player's ship. + /// @param[in] colour The new ship colour. + static void SetDefenderColour(const Rocket::Core::Colourb& colour); + /// Returns the player's ship colour. + /// @return The colour of the player's ship. + static const Rocket::Core::Colourb& GetDefenderColour(); + + /// Sets the score the player achieved in the last game. + /// @param[in] score The player's score. + static void SetScore(int score); + /// Resets the player's score. + static void ResetScore(); + /// Returns the score the player achieved in the last game. + /// @return The player's score. + static int GetScore(); + + /// Sets the current wave number + /// @param[in] wave The wave number + static void SetWave(int wave); + /// Get the current wave number + /// @return The wave number + static int GetWave(); + + /// Sets the pauses state of the game + /// @param[in] paused Whether the game is paused or not + static void SetPaused(bool paused); + /// Gets if the game is paused or not + /// @return True if the game is paused, false otherwise. + static bool GetPaused(); + + enum GraphicsQuality { GOOD, OK, BAD }; + + /// Sets the quality of the graphics used in-game. + /// @param[in] quality The new graphics quality. + static void SetGraphicsQuality(GraphicsQuality quality); + /// Returns the quality of the graphics to use in-game. + /// @return The currently-set graphical quality. + static GraphicsQuality GetGraphicsQuality(); + + /// Enables or disables reverb. + /// @param[in] enabled True to enable reverb, false to disable. + static void SetReverb(bool enabled); + /// Returns the current state of reverb. + /// @return The current reverb state. + static bool GetReverb(); + + /// Enables or disables 3D spatialisation in the audio engine. + /// @param[in] enabled True to enable spatialisation, false to disable. + static void Set3DSpatialisation(bool enabled); + /// Returns the current state of audio spatialisation. + /// @return The current audio spatialisation state. + static bool Get3DSpatialisation(); + +private: + GameDetails(); + ~GameDetails(); +}; + +#endif diff --git a/Samples/pyinvaders/src/HighScores.cpp b/Samples/pyinvaders/src/HighScores.cpp new file mode 100644 index 000000000..d7724f7d0 --- /dev/null +++ b/Samples/pyinvaders/src/HighScores.cpp @@ -0,0 +1,236 @@ +/* + * This source file is part of libRocket, the HTML/CSS Interface Middleware + * + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +#include "HighScores.h" +#include +#include + +HighScores* HighScores::instance = NULL; + +HighScores::HighScores() : Rocket::Controls::DataSource("high_scores") +{ + ROCKET_ASSERT(instance == NULL); + instance = this; + + for (int i = 0; i < NUM_SCORES; i++) + { + scores[i].score = -1; + } + + LoadScores(); +} + +HighScores::~HighScores() +{ + ROCKET_ASSERT(instance == this); + + SaveScores(); + + instance = NULL; +} + +void HighScores::Initialise() +{ + new HighScores(); +} + +void HighScores::Shutdown() +{ + delete instance; +} + +void HighScores::GetRow(Rocket::Core::StringList& row, const Rocket::Core::String& table, int row_index, const Rocket::Core::StringList& columns) +{ + if (table == "scores") + { + for (size_t i = 0; i < columns.size(); i++) + { + if (columns[i] == "name") + { + row.push_back(scores[row_index].name); + } + else if (columns[i] == "name_required") + { + row.push_back(Rocket::Core::String(4, "%d", scores[row_index].name_required)); + } + else if (columns[i] == "score") + { + row.push_back(Rocket::Core::String(32, "%d", scores[row_index].score)); + } + else if (columns[i] == "colour") + { + Rocket::Core::String colour_string; + Rocket::Core::TypeConverter< Rocket::Core::Colourb, Rocket::Core::String >::Convert(scores[row_index].colour, colour_string); + row.push_back(colour_string); + } + else if (columns[i] == "wave") + { + row.push_back(Rocket::Core::String(8, "%d", scores[row_index].wave)); + } + } + } +} + +int HighScores::GetNumRows(const Rocket::Core::String& table) +{ + if (table == "scores") + { + for (int i = 0; i < NUM_SCORES; i++) + { + if (scores[i].score == -1) + { + return i; + } + } + + return NUM_SCORES; + } + + return 0; +} + +int HighScores::GetHighScore() +{ + if (instance->GetNumRows("scores") == 0) + { + return 0; + } + + return instance->scores[0].score; +} + +void HighScores::SubmitScore(const Rocket::Core::String& name, const Rocket::Core::Colourb& colour, int wave, int score) +{ + instance->SubmitScore(name, colour, wave, score, false); +} + +void HighScores::SubmitScore(const Rocket::Core::Colourb& colour, int wave, int score) +{ + instance->SubmitScore("", colour, wave, score, true); +} + +// Sets the name of the last player to submit their score. +void HighScores::SubmitName(const Rocket::Core::String& name) +{ + for (int i = 0; i < instance->GetNumRows("scores"); i++) + { + if (instance->scores[i].name_required) + { + instance->scores[i].name = name; + instance->scores[i].name_required = false; + instance->NotifyRowChange("scores", i, 1); + } + } +} + +void HighScores::SubmitScore(const Rocket::Core::String& name, const Rocket::Core::Colourb& colour, int wave, int score, bool name_required) +{ + for (int i = 0; i < NUM_SCORES; i++) + { + if (score > scores[i].score) + { + // If we've already got the maximum number of scores, then we have + // to send a RowsRemoved message as we're going to delete the last + // row from the data source. + bool max_rows = scores[NUM_SCORES - 1].score != -1; + + // Push down all the other scores. + for (int j = NUM_SCORES - 1; j > i; j--) + { + scores[j] = scores[j - 1]; + } + + // Insert our new score. + scores[i].name = name; + scores[i].colour = colour; + scores[i].wave = wave; + scores[i].score = score; + scores[i].name_required = name_required; + + // Send the row removal message (if necessary). + if (max_rows) + { + NotifyRowRemove("scores", NUM_SCORES - 1, 1); + } + + // Then send the rows added message. + NotifyRowAdd("scores", i, 1); + + return; + } + } +} + +void HighScores::LoadScores() +{ + // Open and read the high score file. + FILE* scores_file = fopen("scores.txt", "rt"); + + if (scores_file) + { + char buffer[1024]; + while (fgets(buffer, 1024, scores_file)) + { + Rocket::Core::StringList score_parts; + Rocket::Core::StringUtilities::ExpandString(score_parts, Rocket::Core::String(buffer), '\t'); + if (score_parts.size() == 4) + { + Rocket::Core::Colourb colour; + int wave; + int score; + + if (Rocket::Core::TypeConverter< Rocket::Core::String , Rocket::Core::Colourb >::Convert(score_parts[1], colour) && + Rocket::Core::TypeConverter< Rocket::Core::String, int >::Convert(score_parts[2], wave) && + Rocket::Core::TypeConverter< Rocket::Core::String, int >::Convert(score_parts[3], score)) + { + SubmitScore(score_parts[0], colour, wave, score); + } + } + } + + fclose(scores_file); + } +} + +void HighScores::SaveScores() +{ + FILE* scores_file = fopen("scores.txt", "wt"); + + if (scores_file) + { + for (int i = 0; i < GetNumRows("scores"); i++) + { + Rocket::Core::String colour_string; + Rocket::Core::TypeConverter< Rocket::Core::Colourb, Rocket::Core::String >::Convert(scores[i].colour, colour_string); + + Rocket::Core::String score(1024, "%s\t%s\t%d\t%d\n", scores[i].name.CString(), colour_string.CString(), scores[i].wave, scores[i].score); + fputs(score.CString(), scores_file); + } + + fclose(scores_file); + } +} diff --git a/Samples/pyinvaders/src/HighScores.h b/Samples/pyinvaders/src/HighScores.h new file mode 100644 index 000000000..604c86dcc --- /dev/null +++ b/Samples/pyinvaders/src/HighScores.h @@ -0,0 +1,77 @@ +/* + * This source file is part of libRocket, the HTML/CSS Interface Middleware + * + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +#ifndef ROCKETINVADERSHIGHSCORES_H +#define ROCKETINVADERSHIGHSCORES_H + +#include +#include + +const int NUM_SCORES = 10; + +class HighScores : public Rocket::Controls::DataSource +{ +public: + static void Initialise(); + static void Shutdown(); + + void GetRow(Rocket::Core::StringList& row, const Rocket::Core::String& table, int row_index, const Rocket::Core::StringList& columns); + int GetNumRows(const Rocket::Core::String& table); + + static int GetHighScore(); + + /// Two functions to add a score to the chart. + /// Adds a full score, including a name. This won't prompt the user to enter their name. + static void SubmitScore(const Rocket::Core::String& name, const Rocket::Core::Colourb& colour, int wave, int score); + /// Adds a score, and causes an input field to appear to request the user for their name. + static void SubmitScore(const Rocket::Core::Colourb& colour, int wave, int score); + /// Sets the name of the last player to submit their score. + static void SubmitName(const Rocket::Core::String& name); + +private: + HighScores(); + ~HighScores(); + + static HighScores* instance; + + void SubmitScore(const Rocket::Core::String& name, const Rocket::Core::Colourb& colour, int wave, int score, bool name_required); + void LoadScores(); + void SaveScores(); + + struct Score + { + Rocket::Core::String name; + bool name_required; + Rocket::Core::Colourb colour; + int score; + int wave; + }; + + Score scores[NUM_SCORES]; +}; + +#endif diff --git a/Samples/pyinvaders/src/Invader.cpp b/Samples/pyinvaders/src/Invader.cpp new file mode 100644 index 000000000..eb9b8f89a --- /dev/null +++ b/Samples/pyinvaders/src/Invader.cpp @@ -0,0 +1,266 @@ +/* + * This source file is part of libRocket, the HTML/CSS Interface Middleware + * + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +#include "Invader.h" +#include +#include +#include +#include "Defender.h" +#include "Game.h" +#include "GameDetails.h" +#include "Shield.h" +#include "Sprite.h" + +const float BOMB_UPDATE_FREQ = 0.04f; +const float BOMB_RAY_SPEED = 10; +const float BOMB_MISSILE_SPEED = 7; +const float BOMB_PROBABILITY_EASY = 0.002f; +const float BOMB_PROBABILITY_HARD = 0.005f; +const float EXPLOSION_TIME = 0.25f; +const Rocket::Core::Colourb MOTHERSHIP_COLOUR = Rocket::Core::Colourb(255, 0, 0, 255); + +Sprite invader_sprites[] = +{ + // Rank 1 + Sprite(Rocket::Core::Vector2f(48, 32), Rocket::Core::Vector2f(0.609375f, 0), Rocket::Core::Vector2f(0.796875f, 0.5f)), + Sprite(Rocket::Core::Vector2f(48, 32), Rocket::Core::Vector2f(0.80078125f, 0), Rocket::Core::Vector2f(0.98828125f, 0.5f)), + // Rank 2 + Sprite(Rocket::Core::Vector2f(44, 32), Rocket::Core::Vector2f(0.2578125f, 0), Rocket::Core::Vector2f(0.4296875f, 0.5f)), + Sprite(Rocket::Core::Vector2f(44, 32), Rocket::Core::Vector2f(0.43359375f, 0), Rocket::Core::Vector2f(0.60546875f, 0.5f)), + // Rank 3 + Sprite(Rocket::Core::Vector2f(32, 32), Rocket::Core::Vector2f(0, 0), Rocket::Core::Vector2f(0.125f, 0.5f)), + Sprite(Rocket::Core::Vector2f(32, 32), Rocket::Core::Vector2f(0.12890625f, 0), Rocket::Core::Vector2f(0.25390625f, 0.5f)), + // Mothership + Sprite(Rocket::Core::Vector2f(64, 28), Rocket::Core::Vector2f(0.23828125f, 0.515625f), Rocket::Core::Vector2f(0.48828125f, 0.953125f)), + // Explosion + Sprite(Rocket::Core::Vector2f(52, 28), Rocket::Core::Vector2f(0.71484375f, 0.51562500f), Rocket::Core::Vector2f(0.91796875f, 0.95312500f)) +}; + +Sprite bomb_sprites[] = +{ + // Ray + Sprite(Rocket::Core::Vector2f(12, 20), Rocket::Core::Vector2f(0.51171875f, 0.51562500f), Rocket::Core::Vector2f(0.55859375f, 0.82812500f)), + Sprite(Rocket::Core::Vector2f(12, 20), Rocket::Core::Vector2f(0.56250000, 0.51562500), Rocket::Core::Vector2f(0.60937500, 0.82812500)), + Sprite(Rocket::Core::Vector2f(12, 20), Rocket::Core::Vector2f(0.61328125, 0.51562500), Rocket::Core::Vector2f(0.66015625, 0.82812500)), + Sprite(Rocket::Core::Vector2f(12, 20), Rocket::Core::Vector2f(0.66406250, 0.51562500), Rocket::Core::Vector2f(0.71093750, 0.82812500)), + // Missile + Sprite(Rocket::Core::Vector2f(12, 20), Rocket::Core::Vector2f(0.92578125, 0.51562500), Rocket::Core::Vector2f(0.97265625, 0.82812500)) +}; + +Invader::Invader(Game* _game, InvaderType _type, int _index) : position(0,0) +{ + type = UNKNOWN; + animation_frame = 0; + bomb_animation_frame = 0; + bomb_frame_start = 0; + death_time = 0; + state = ALIVE; + bomb = NONE; + game = _game; + type = _type; + death_time = 0; + invader_index = _index; + + bomb_probability = GameDetails::GetDifficulty() == GameDetails::EASY ? BOMB_PROBABILITY_EASY : BOMB_PROBABILITY_HARD; + bomb_probability *= type; +} + +Invader::~Invader() +{ +} + +void Invader::SetPosition(const Rocket::Core::Vector2f& _position) +{ + position = _position; +} + +const Rocket::Core::Vector2f& Invader::GetPosition() const +{ + return position; +} + +void Invader::Update() +{ + // Update the bombs + if (Shell::GetElapsedTime() - bomb_frame_start > BOMB_UPDATE_FREQ) + { + + // Update the bomb position if its in flight, or check if we should drop one + if (bomb != NONE) + { + if (bomb == RAY) + { + bomb_animation_frame++; + if (bomb_animation_frame > 3) + bomb_animation_frame = 0; + + bomb_position.y += BOMB_RAY_SPEED; + } + else + { + bomb_position.y += BOMB_MISSILE_SPEED; + } + + if (bomb_position.y > game->GetWindowDimensions().y) + bomb = NONE; + + // Check if we hit the shields + for (int i = 0; i < game->GetNumShields(); i++) + { + if (game->GetShield(i)->CheckHit(bomb_position)) + { + bomb = NONE; + break; + } + } + + // Check if we hit the defender + if (bomb != NONE) + { + if (game->GetDefender()->CheckHit(bomb_position)) + bomb = NONE; + } + } + else if (state == ALIVE && + Rocket::Core::Math::RandomReal(1.0f) < bomb_probability && + game->CanDropBomb(invader_index)) + { + bomb = Rocket::Core::Math::RandomInteger(2) == 0 ? RAY : MISSILE; + bomb_position = position; + bomb_position.x += invader_sprites[GetSpriteIndex()].dimensions.x / 2; + + if (bomb == RAY) + bomb_animation_frame = 0; + else + bomb_animation_frame = 4; + } + + bomb_frame_start = Shell::GetElapsedTime(); + } + + if (state == EXPLODING && Shell::GetElapsedTime() > death_time) + state = DEAD; +} + +void Invader::UpdateAnimation() +{ + switch (state) + { + case ALIVE: + animation_frame++; + if (animation_frame > 1) + animation_frame = 0; + break; + + default: + break; + } +} + +void Invader::Render() +{ + if (type == MOTHERSHIP) + { + glColor4ubv(MOTHERSHIP_COLOUR); + } + int sprite_index = GetSpriteIndex(); + int sprite_offset = Rocket::Core::Math::RealToInteger((invader_sprites[sprite_index].dimensions.x - 48) / 2); + + if (state != DEAD) + invader_sprites[sprite_index].Render(Rocket::Core::Vector2f(position.x - sprite_offset, position.y)); + + if (bomb != NONE) + { + bomb_sprites[bomb_animation_frame].Render(bomb_position); + } + + if (type == MOTHERSHIP) + { + glColor4ub(255, 255, 255, 255); + } +} + +Invader::InvaderState Invader::GetState() +{ + return state; +} + +bool Invader::CheckHit(const Rocket::Core::Vector2f& check_position) +{ + // Get the sprite index we're currently using for collision detection + int sprite_index = GetSpriteIndex(); + int sprite_offset = Rocket::Core::Math::RealToInteger((invader_sprites[sprite_index].dimensions.x - 48) / 2); + float sprite_width = invader_sprites[sprite_index].dimensions.x; + float sprite_height = invader_sprites[sprite_index].dimensions.y; + + // If we're alive and the position is within our bounds, set ourselves + // as exploding and return a valid hit + if (state == ALIVE + && check_position.x >= position.x - sprite_offset + && check_position.x <= position.x - sprite_offset + sprite_width + && check_position.y >= position.y + && check_position.y <= position.y + sprite_height) + { + int score = 0; + switch (type) + { + case MOTHERSHIP: score = (Rocket::Core::Math::RandomInteger(6) + 1) * 50; break; // 50 -> 300 + case RANK3: score = 40; break; + case RANK2: score = 20; break; + case RANK1: score = 10; break; + } + + // Add the number of points + game->AddScore(score); + + // Set our state to exploding and start the timer to our doom + state = EXPLODING; + death_time = Shell::GetElapsedTime() + EXPLOSION_TIME; + + return true; + } + + return false; +} + +int Invader::GetSpriteIndex() const +{ + // Calculate our sprite index based on animation and type + int index = animation_frame; + switch (type) + { + case RANK2: index += 2; break; + case RANK3: index += 4; break; + case MOTHERSHIP: index = 6; break; + } + + // If we're in exploding state, use the exploding sprite + if (state == EXPLODING) + index = 7; + + return index; +} diff --git a/Samples/pyinvaders/src/Invader.h b/Samples/pyinvaders/src/Invader.h new file mode 100644 index 000000000..65180488e --- /dev/null +++ b/Samples/pyinvaders/src/Invader.h @@ -0,0 +1,114 @@ +/* + * This source file is part of libRocket, the HTML/CSS Interface Middleware + * + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +#ifndef ROCKETINVADERSINVADER_H +#define ROCKETINVADERSINVADER_H + +#include + +class Game; + +/** + An alien invader. + + @author Lloyd Weehuizen + */ + +class Invader +{ +public: + enum InvaderType { UNKNOWN, RANK1, RANK2, RANK3, MOTHERSHIP }; + enum BombType { NONE, RAY, MISSILE }; + + /// Construct the invader + Invader(Game* game, InvaderType type, int index); + ~Invader(); + + /// Set the invaders screen position + /// @param position Position in screen space + void SetPosition(const Rocket::Core::Vector2f& position); + /// Get the current invader position + /// @returns The invaders position in screen space + const Rocket::Core::Vector2f& GetPosition() const; + + /// Update the invader + virtual void Update(); + + /// Render the invader + void Render(); + + /// Update the invaders animation + void UpdateAnimation(); + + /// The current invaders state + enum InvaderState { ALIVE, EXPLODING, DEAD }; + /// Get the current invader state + /// @returns Invader state + InvaderState GetState(); + + /// Returns true if the position hits the invader + /// If a hit is detected, will explode and start the death timer + /// @param position Position to do the hit check at + /// @returns If the invader was hit + bool CheckHit(const Rocket::Core::Vector2f& position); + +protected: + // Game this invader is in + Game* game; + // The index/id of this invader + int invader_index; + + // The invader type we represent + InvaderType type; + // The current position in screen space of the invader + Rocket::Core::Vector2f position; + // Our current animation frame + int animation_frame; + + // Our current state + InvaderState state; + + // Our current in-flight bomb, or none. (may be not none if we're dead.) + BombType bomb; + // The current position of the bomb in screen space + Rocket::Core::Vector2f bomb_position; + // The animation frame the bomb is on + int bomb_animation_frame; + // When the last bomb update occured + float bomb_frame_start; + // Probability of us dropping a bomb - this is calculated + // at construction time and based on our rank and the game + // difficulty level + float bomb_probability; + + // Time when we should die - 0, until we're hit + float death_time; + + int GetSpriteIndex() const; +}; + +#endif diff --git a/Samples/pyinvaders/src/Mothership.cpp b/Samples/pyinvaders/src/Mothership.cpp new file mode 100644 index 000000000..e94c1e811 --- /dev/null +++ b/Samples/pyinvaders/src/Mothership.cpp @@ -0,0 +1,84 @@ +/* + * This source file is part of libRocket, the HTML/CSS Interface Middleware + * + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +#include "Mothership.h" +#include +#include "Shell.h" +#include "Game.h" +#include "Sprite.h" + +const int SPRITE_WIDTH = 64; +const int SPRITE_HEIGHT = 28; + +const float APPEARANCE_PROBABILITY = 0.001f; +const float UPDATE_FREQ = 0.025f; +const float MOVEMENT_SPEED = 5; + +Mothership::Mothership(Game* game, int index) : Invader(game, Invader::MOTHERSHIP, index) +{ + // Start off dead, and set up our position + state = DEAD; + update_frame_start = 0; + position = Rocket::Core::Vector2f(-SPRITE_WIDTH, 64.0f); +} + +Mothership::~Mothership() +{ +} + +void Mothership::Update() +{ + // Generic Invader update + Invader::Update(); + + if (Shell::GetElapsedTime() - update_frame_start < UPDATE_FREQ) + return; + + // We're alive, keep moving! + if (state == ALIVE) + { + position.x += (direction * MOVEMENT_SPEED); + + if ((direction < 0.0f && position.x < -SPRITE_WIDTH) + || (direction > 0.0f && position.x > game->GetWindowDimensions().x)) + state = DEAD; + + update_frame_start = Shell::GetElapsedTime(); + } + // Determine if we should come out of hiding + else if (Rocket::Core::Math::RandomReal(1.0f) < APPEARANCE_PROBABILITY) + { + direction = Rocket::Core::Math::RandomReal(1.0f) < 0.5 ? -1.0f : 1.0f; + + if (direction < 0) + position.x = game->GetWindowDimensions().x + SPRITE_WIDTH; + else + position.x = -SPRITE_WIDTH; + + state = ALIVE; + } +} diff --git a/Samples/pyinvaders/src/Mothership.h b/Samples/pyinvaders/src/Mothership.h new file mode 100644 index 000000000..b7a704f5d --- /dev/null +++ b/Samples/pyinvaders/src/Mothership.h @@ -0,0 +1,53 @@ +/* + * This source file is part of libRocket, the HTML/CSS Interface Middleware + * + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +#ifndef ROCKETINVADERSMOTHERSHIP_H +#define ROCKETINVADERSMOTHERSHIP_H + +#include "Invader.h" + +/** + */ + +class Mothership : public Invader +{ +public: + Mothership(Game* game, int index); + ~Mothership(); + + /// Update the mothership + virtual void Update(); + +private: + // Time of the last update + float update_frame_start; + + // Direction mothership is flying in + float direction; +}; + +#endif diff --git a/Samples/pyinvaders/src/PythonInterface.cpp b/Samples/pyinvaders/src/PythonInterface.cpp new file mode 100644 index 000000000..64d820942 --- /dev/null +++ b/Samples/pyinvaders/src/PythonInterface.cpp @@ -0,0 +1,124 @@ +/* + * This source file is part of libRocket, the HTML/CSS Interface Middleware + * + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +#include "PythonInterface.h" +#include +#include "GameDetails.h" +#include "ElementGame.h" +#include "HighScores.h" + +void SubmitHighScore() +{ + int score = GameDetails::GetScore(); + if (score > 0) + { + // Submit the score the player just got to the high scores chart. + HighScores::SubmitScore(GameDetails::GetDefenderColour(), GameDetails::GetWave(), GameDetails::GetScore()); + // Reset the score so the chart won't get confused next time we enter. + GameDetails::ResetScore(); + } +} + +BOOST_PYTHON_MODULE(game) +{ + python::def("Shutdown", &Shell::RequestExit); + python::def("SetPaused", &GameDetails::SetPaused); + python::def("SetDifficulty", &GameDetails::SetDifficulty); + python::def("SetDefenderColour", &GameDetails::SetDefenderColour); + python::def("SubmitHighScore", &SubmitHighScore); + python::def("SetHighScoreName", &HighScores::SubmitName); + + python::enum_("difficulty") + .value("HARD", GameDetails::HARD) + .value("EASY", GameDetails::EASY) + ; + + ElementGame::InitialisePythonInterface(); +} + +PythonInterface::PythonInterface() +{ +} + +PythonInterface::~PythonInterface() +{ +} + +bool PythonInterface::Initialise(const char* path) +{ + // Initialise Python. + Py_Initialize(); + + // Setup the Python search path. + const char* python_path = Py_GetPath(); + char buffer[1024]; + snprintf(buffer, 1024, "%s%s%s", path, PATH_SEPARATOR, python_path); + buffer[1023] = '\0'; + PySys_SetPath(buffer); + + // Import Rocket. + if (!Import("rocket")) + return false; + + // Define our game specific interface. + initgame(); + + return true; +} + +void PythonInterface::Shutdown() +{ + Py_Finalize(); +} + +bool PythonInterface::Import(const Rocket::Core::String& name) +{ + PyObject* module = PyImport_ImportModule(name.CString()); + if (!module) + { + PrintError(true); + return false; + } + + Py_DECREF(module); + return true; +} + +// Print the pending python error to stderr, optionally clearing it +void PythonInterface::PrintError(bool clear_error) +{ + // Print the error and restore it to the caller + PyObject *type, *value, *traceback; + PyErr_Fetch(&type, &value, &traceback); + Py_XINCREF(type); + Py_XINCREF(value); + Py_XINCREF(traceback); + PyErr_Restore(type, value, traceback); + PyErr_Print(); + if (!clear_error) + PyErr_Restore(type, value, traceback); +} diff --git a/Samples/pyinvaders/src/PythonInterface.h b/Samples/pyinvaders/src/PythonInterface.h new file mode 100644 index 000000000..30641bfc2 --- /dev/null +++ b/Samples/pyinvaders/src/PythonInterface.h @@ -0,0 +1,57 @@ +/* + * This source file is part of libRocket, the HTML/CSS Interface Middleware + * + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +#ifndef PYTHONINTERFACE_H +#define PYTHONINTERFACE_H + +#include +#include + +/** + Creates and maintains the python interface to Invaders. + + @author Lloyd Weehuizen + */ + +class PythonInterface +{ +public: + static bool Initialise(const char* python_path); + static void Shutdown(); + + /// Import a python module + static bool Import(const Rocket::Core::String& name); + + /// Print out current errors + static void PrintError(bool clear_error = false); + +private: + PythonInterface(); + ~PythonInterface(); +}; + +#endif diff --git a/Samples/pyinvaders/src/Shield.cpp b/Samples/pyinvaders/src/Shield.cpp new file mode 100644 index 000000000..0062c407f --- /dev/null +++ b/Samples/pyinvaders/src/Shield.cpp @@ -0,0 +1,188 @@ +/* + * This source file is part of libRocket, the HTML/CSS Interface Middleware + * + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +#include "Shield.h" +#include +#include +#include "Game.h" +#include "GameDetails.h" +#include "Sprite.h" + +const int MAX_HEALTH = 4; + +Shield::Shield(Game* _game, ShieldType _type) : position(0,0) +{ + game = _game; + type = _type; + health = MAX_HEALTH; + + InitialiseCells(); +} + +Shield::~Shield() +{ +} + +void Shield::InitialiseCells() +{ + if (type == REGULAR || type == TOP_LEFT || type == TOP_RIGHT) + { + for (int i = 0; i < NUM_SHIELD_CELLS; i++) + { + for (int j = 0; j < NUM_SHIELD_CELLS; j++) + { + shield_cells[i][j] = ON; + } + } + + // Take the bites out of the cells if they're a corner cell: + if (type == TOP_LEFT) + { + for (int x = 0; x < NUM_SHIELD_CELLS - 1; x++) + { + for (int y = 0; y < (NUM_SHIELD_CELLS - 1) - x; y++) + shield_cells[x][y] = OFF; + } + } + + else if (type == TOP_RIGHT) + { + for (int x = 0; x < NUM_SHIELD_CELLS - 1; x++) + { + for (int y = 0; y < (NUM_SHIELD_CELLS - 1) - x; y++) + shield_cells[(NUM_SHIELD_CELLS - 1) - x][y] = OFF; + } + } + } + else + { + for (int i = 0; i < NUM_SHIELD_CELLS; i++) + { + for (int j = 0; j < NUM_SHIELD_CELLS; j++) + { + shield_cells[i][j] = OFF; + } + } + + if (type == BOTTOM_LEFT) + { + for (int x = 0; x < NUM_SHIELD_CELLS - 1; x++) + { + for (int y = 0; y < (NUM_SHIELD_CELLS - 1) - x; y++) + shield_cells[(NUM_SHIELD_CELLS - 1) - x][y] = ON; + } + } + + else if (type == BOTTOM_RIGHT) + { + for (int x = 0; x < NUM_SHIELD_CELLS - 1; x++) + { + for (int y = 0; y < (NUM_SHIELD_CELLS - 1) - x; y++) + shield_cells[x][y] = ON; + } + } + } +} + +void Shield::SetPosition(const Rocket::Core::Vector2f& _position) +{ + position = _position; +} + +const Rocket::Core::Vector2f& Shield::GetPosition() const +{ + return position; +} + +void Shield::Render() +{ + if (health > 0) + { + glPointSize((GLfloat) PIXEL_SIZE); + glDisable(GL_TEXTURE_2D); + glColor4ubv(GameDetails::GetDefenderColour()); + + glBegin(GL_POINTS); + + for (int i = 0; i < NUM_SHIELD_CELLS; i++) + { + for (int j = 0; j < NUM_SHIELD_CELLS; j++) + { + if (shield_cells[i][j] == ON) + { + Rocket::Core::Vector2f cell_position = position + Rocket::Core::Vector2f((float) (PIXEL_SIZE * i), (float) (PIXEL_SIZE * j)); + glVertex2f(cell_position.x, cell_position.y); + } + } + } + + glEnd(); + + glEnable(GL_TEXTURE_2D); + } +} + +bool Shield::CheckHit(const Rocket::Core::Vector2f& check_position) +{ + float sprite_size = PIXEL_SIZE * NUM_SHIELD_CELLS; + + // If we're alive and the position is within our bounds, set ourselves + // as exploding and return a valid hit + if (health > 0 + && check_position.x >= position.x + && check_position.x <= position.x + sprite_size + && check_position.y >= position.y + && check_position.y <= position.y + sprite_size) + { + // Take damage. + SustainDamage(); + + return true; + } + + return false; +} + +void Shield::SustainDamage() +{ + health--; + + if (health > 0) + { + int num_shields_to_lose = (NUM_SHIELD_CELLS * NUM_SHIELD_CELLS) / MAX_HEALTH; + while (num_shields_to_lose > 0) + { + int x = Rocket::Core::Math::RandomInteger(NUM_SHIELD_CELLS); + int y = Rocket::Core::Math::RandomInteger(NUM_SHIELD_CELLS); + if (shield_cells[x][y] != DESTROYED) + { + shield_cells[x][y] = DESTROYED; + num_shields_to_lose--; + } + } + } +} diff --git a/Samples/pyinvaders/src/Shield.h b/Samples/pyinvaders/src/Shield.h new file mode 100644 index 000000000..6b04d15a1 --- /dev/null +++ b/Samples/pyinvaders/src/Shield.h @@ -0,0 +1,90 @@ +/* + * This source file is part of libRocket, the HTML/CSS Interface Middleware + * + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +#ifndef ROCKETINVADERSSHIELD_H +#define ROCKETINVADERSSHIELD_H + +#include + +class Game; + +const int NUM_SHIELD_CELLS = 6; +const int PIXEL_SIZE = 4; + +/** + A shield, protecting the player. + + @author Robert Curry + */ + +class Shield +{ +public: + enum ShieldType { REGULAR, TOP_LEFT, TOP_RIGHT, BOTTOM_LEFT, BOTTOM_RIGHT }; + + /// Construct the invader + Shield(Game* game, ShieldType type); + ~Shield(); + + /// Sets up which cells are on and off, based on the type. + void InitialiseCells(); + + /// Set the shield's screen position + /// @param position Position in screen space + void SetPosition(const Rocket::Core::Vector2f& position); + /// Get the current shield position + /// @returns The shield's position in screen space + const Rocket::Core::Vector2f& GetPosition() const; + + /// Render the shield. + void Render(); + + /// Returns true if the position hits the shield + /// If a hit is detected, will degrade the shield. + /// @param position Position to do the hit check at + /// @returns If the shield was hit + bool CheckHit(const Rocket::Core::Vector2f& position); + +protected: + void SustainDamage(); + + // Game this shield is in + Game* game; + + // The invader type we represent + ShieldType type; + // The current position in screen space of the shield + Rocket::Core::Vector2f position; + + // Our current state - starts at 4, degrades once per hit. + int health; + + enum ShieldCellState { ON, OFF, DESTROYED }; + ShieldCellState shield_cells[NUM_SHIELD_CELLS][NUM_SHIELD_CELLS]; +}; + +#endif diff --git a/Samples/pyinvaders/src/Sprite.cpp b/Samples/pyinvaders/src/Sprite.cpp new file mode 100644 index 000000000..b09a7ff02 --- /dev/null +++ b/Samples/pyinvaders/src/Sprite.cpp @@ -0,0 +1,52 @@ +/* + * This source file is part of libRocket, the HTML/CSS Interface Middleware + * + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +#include "Sprite.h" +#include + +Sprite::Sprite(const Rocket::Core::Vector2f& dimensions, const Rocket::Core::Vector2f& top_left_texcoord, const Rocket::Core::Vector2f& bottom_right_texcoord) : dimensions(dimensions), top_left_texcoord(top_left_texcoord), bottom_right_texcoord(bottom_right_texcoord) +{ +} + +Sprite::~Sprite() +{ +} + +void Sprite::Render(const Rocket::Core::Vector2f& position) +{ + glTexCoord2f(top_left_texcoord.x, top_left_texcoord.y); + glVertex2f(position.x, position.y); + + glTexCoord2f(top_left_texcoord.x, bottom_right_texcoord.y); + glVertex2f(position.x, position.y + dimensions.y); + + glTexCoord2f(bottom_right_texcoord.x, bottom_right_texcoord.y); + glVertex2f(position.x + dimensions.x, position.y + dimensions.y); + + glTexCoord2f(bottom_right_texcoord.x, top_left_texcoord.y); + glVertex2f(position.x + dimensions.x, position.y); +} diff --git a/Source/Core/TrialLogo.h b/Samples/pyinvaders/src/Sprite.h similarity index 71% rename from Source/Core/TrialLogo.h rename to Samples/pyinvaders/src/Sprite.h index a201d991e..6c47830cb 100644 --- a/Source/Core/TrialLogo.h +++ b/Samples/pyinvaders/src/Sprite.h @@ -25,42 +25,26 @@ * */ -#ifndef ROCKETCORETRIALLOGO_H -#define ROCKETCORETRIALLOGO_H +#ifndef ROCKETINVADERSSPRITE_H +#define ROCKETINVADERSSPRITE_H -#include -#include - -namespace Rocket { -namespace Core { - -class Context; +#include /** - Loads and renders the Rocket logo in the bottom-right of the screen for trial versions. - @author Peter Curry */ -class TrialLogo +class Sprite { public: - TrialLogo(Context* context); - ~TrialLogo(); + Sprite(const Rocket::Core::Vector2f& dimensions, const Rocket::Core::Vector2f& top_left_texcoord, const Rocket::Core::Vector2f& bottom_right_texcoord); + ~Sprite(); - void Render(); + void Render(const Rocket::Core::Vector2f& position); - static void GenerateTexture(const byte*& texture_data, Vector2i& texture_dimensions); - -private: - Context* context; - float start_time; - - Geometry logo_geometry; - Texture logo_texture; + Rocket::Core::Vector2f dimensions; + Rocket::Core::Vector2f top_left_texcoord; + Rocket::Core::Vector2f bottom_right_texcoord; }; -} -} - #endif diff --git a/Samples/pyinvaders/src/main.cpp b/Samples/pyinvaders/src/main.cpp new file mode 100644 index 000000000..c20675bf3 --- /dev/null +++ b/Samples/pyinvaders/src/main.cpp @@ -0,0 +1,193 @@ +/* + * This source file is part of libRocket, the HTML/CSS Interface Middleware + * + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +#define _WIN32_WINNT 0x0500 +#include +#include +#include + +#include +#include +#include "DecoratorInstancerDefender.h" +#include "DecoratorInstancerStarfield.h" +#include "ElementGame.h" +#include "HighScores.h" +#include "PythonInterface.h" + +Rocket::Core::Context* context = NULL; + +void DoAllocConsole(); + +void GameLoop() +{ + context->Update(); + + glClear(GL_COLOR_BUFFER_BIT); + context->Render(); + Shell::FlipBuffers(); +} + +#if defined ROCKET_PLATFORM_WIN32 +#include +int APIENTRY WinMain(HINSTANCE, HINSTANCE, char*, int) +#else +int main(int, char**) +#endif +{ + #ifdef ROCKET_PLATFORM_MACOSX + #define APP_PATH "../" + #define ROCKET_PATH "../../bin/" + #else + #define APP_PATH "../Samples/pyinvaders/" + #define ROCKET_PATH "." + #endif + + #ifdef ROCKET_PLATFORM_WIN32 + DoAllocConsole(); + #endif + + // Generic OS initialisation, creates a window and attaches OpenGL. + if (!Shell::Initialise("../Samples/pyinvaders/") || + !Shell::OpenWindow("Rocket Invaders from Mars (Python Powered)", true)) + { + Shell::Shutdown(); + return -1; + } + + // Rocket initialisation. + ShellRenderInterfaceOpenGL opengl_renderer; + Rocket::Core::SetRenderInterface(&opengl_renderer); + + ShellSystemInterface system_interface; + Rocket::Core::SetSystemInterface(&system_interface); + + Rocket::Core::Initialise(); + // Initialise the Rocket Controls library. + Rocket::Controls::Initialise(); + + // Initialise the Python interface. + PythonInterface::Initialise((Shell::GetExecutablePath() + (APP_PATH "python") + PATH_SEPARATOR + Shell::GetExecutablePath() + ROCKET_PATH).CString()); + + // Create the main Rocket context and set it on the shell's input layer. + context = Rocket::Core::CreateContext("main", Rocket::Core::Vector2i(1024, 768)); + if (context == NULL) + { + Rocket::Core::Shutdown(); + Shell::Shutdown(); + return -1; + } + + Rocket::Debugger::Initialise(context); + Input::SetContext(context); + + // Load the font faces required for Invaders. + Shell::LoadFonts("../assets/"); + + // Register Invader's custom decorator instancers. + Rocket::Core::DecoratorInstancer* decorator_instancer = new DecoratorInstancerStarfield(); + Rocket::Core::Factory::RegisterDecoratorInstancer("starfield", decorator_instancer); + decorator_instancer->RemoveReference(); + + decorator_instancer = new DecoratorInstancerDefender(); + Rocket::Core::Factory::RegisterDecoratorInstancer("defender", decorator_instancer); + decorator_instancer->RemoveReference(); + + // Construct the game singletons. + HighScores::Initialise(); + + // Fire off the startup script. + PythonInterface::Import("autoexec"); + + Shell::EventLoop(GameLoop); + + // Shutdown the Rocket contexts. + context->RemoveReference(); + + // Shutdown Python before we shut down Rocket. + PythonInterface::Shutdown(); + + // Shut down the game singletons. + HighScores::Shutdown(); + + // Shutdown Rocket. + Rocket::Core::Shutdown(); + + Shell::CloseWindow(); + Shell::Shutdown(); + + return 0; +} + +#ifdef ROCKET_PLATFORM_WIN32 + +#include +#include +#include +#include + +void DoAllocConsole() +{ + static const WORD MAX_CONSOLE_LINES = 500; + int hConHandle; + long lStdHandle; + CONSOLE_SCREEN_BUFFER_INFO coninfo; + FILE *fp; + + // allocate a console for this app + AllocConsole(); + + // set the screen buffer to be big enough to let us scroll text + GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &coninfo); + coninfo.dwSize.Y = MAX_CONSOLE_LINES; + SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), coninfo.dwSize); + + // redirect unbuffered STDOUT to the console + lStdHandle = (long)GetStdHandle(STD_OUTPUT_HANDLE); + hConHandle = _open_osfhandle(lStdHandle, _O_TEXT); + fp = _fdopen( hConHandle, "w" ); + + *stdout = *fp; + setvbuf( stdout, NULL, _IONBF, 0 ); + + // redirect unbuffered STDIN to the console + lStdHandle = (long)GetStdHandle(STD_INPUT_HANDLE); + hConHandle = _open_osfhandle(lStdHandle, _O_TEXT); + fp = _fdopen( hConHandle, "r" ); + + *stdin = *fp; + setvbuf( stdin, NULL, _IONBF, 0 ); + + // redirect unbuffered STDERR to the console + lStdHandle = (long)GetStdHandle(STD_ERROR_HANDLE); + hConHandle = _open_osfhandle(lStdHandle, _O_TEXT); + fp = _fdopen( hConHandle, "w" ); + *stderr = *fp; + + setvbuf( stderr, NULL, _IONBF, 0 ); + ShowWindow(GetConsoleWindow(), SW_SHOW); +} +#endif diff --git a/Samples/shell/include/Shell.h b/Samples/shell/include/Shell.h index d7e571f96..2ec732b69 100644 --- a/Samples/shell/include/Shell.h +++ b/Samples/shell/include/Shell.h @@ -31,7 +31,7 @@ #include #include -#ifdef EMP_PLATFORM_WIN32 +#ifdef ROCKET_PLATFORM_WIN32 #define PATH_SEPARATOR ";" #else #define PATH_SEPARATOR ":" diff --git a/Samples/shell/include/ShellOpenGL.h b/Samples/shell/include/ShellOpenGL.h index 8afb5cad2..0445549b1 100644 --- a/Samples/shell/include/ShellOpenGL.h +++ b/Samples/shell/include/ShellOpenGL.h @@ -30,16 +30,16 @@ #include -#if defined EMP_PLATFORM_WIN32 +#if defined ROCKET_PLATFORM_WIN32 #define WIN32_LEAN_AND_MEAN #include #include #include -#elif defined EMP_PLATFORM_MACOSX +#elif defined ROCKET_PLATFORM_MACOSX #include #include #include -#elif defined EMP_PLATFORM_UNIX +#elif defined ROCKET_PLATFORM_UNIX #include #include #include diff --git a/Samples/shell/src/ShellRenderInterfaceOpenGL.cpp b/Samples/shell/src/ShellRenderInterfaceOpenGL.cpp index d57593298..74d26ca21 100644 --- a/Samples/shell/src/ShellRenderInterfaceOpenGL.cpp +++ b/Samples/shell/src/ShellRenderInterfaceOpenGL.cpp @@ -35,7 +35,7 @@ ShellRenderInterfaceOpenGL::ShellRenderInterfaceOpenGL() } // Called by Rocket when it wants to render geometry that it does not wish to optimise. -void ShellRenderInterfaceOpenGL::RenderGeometry(Rocket::Core::Vertex* vertices, int EMP_UNUSED(num_vertices), int* indices, int num_indices, const Rocket::Core::TextureHandle texture, const Rocket::Core::Vector2f& translation) +void ShellRenderInterfaceOpenGL::RenderGeometry(Rocket::Core::Vertex* vertices, int ROCKET_UNUSED(num_vertices), int* indices, int num_indices, const Rocket::Core::TextureHandle texture, const Rocket::Core::Vector2f& translation) { glPushMatrix(); glTranslatef(translation.x, translation.y, 0); @@ -62,18 +62,18 @@ void ShellRenderInterfaceOpenGL::RenderGeometry(Rocket::Core::Vertex* vertices, } // Called by Rocket when it wants to compile geometry it believes will be static for the forseeable future. -Rocket::Core::CompiledGeometryHandle ShellRenderInterfaceOpenGL::CompileGeometry(Rocket::Core::Vertex* EMP_UNUSED(vertices), int EMP_UNUSED(num_vertices), int* EMP_UNUSED(indices), int EMP_UNUSED(num_indices), const Rocket::Core::TextureHandle EMP_UNUSED(texture)) +Rocket::Core::CompiledGeometryHandle ShellRenderInterfaceOpenGL::CompileGeometry(Rocket::Core::Vertex* ROCKET_UNUSED(vertices), int ROCKET_UNUSED(num_vertices), int* ROCKET_UNUSED(indices), int ROCKET_UNUSED(num_indices), const Rocket::Core::TextureHandle ROCKET_UNUSED(texture)) { return (Rocket::Core::CompiledGeometryHandle) NULL; } // Called by Rocket when it wants to render application-compiled geometry. -void ShellRenderInterfaceOpenGL::RenderCompiledGeometry(Rocket::Core::CompiledGeometryHandle EMP_UNUSED(geometry), const Rocket::Core::Vector2f& EMP_UNUSED(translation)) +void ShellRenderInterfaceOpenGL::RenderCompiledGeometry(Rocket::Core::CompiledGeometryHandle ROCKET_UNUSED(geometry), const Rocket::Core::Vector2f& ROCKET_UNUSED(translation)) { } // Called by Rocket when it wants to release application-compiled geometry. -void ShellRenderInterfaceOpenGL::ReleaseCompiledGeometry(Rocket::Core::CompiledGeometryHandle EMP_UNUSED(geometry)) +void ShellRenderInterfaceOpenGL::ReleaseCompiledGeometry(Rocket::Core::CompiledGeometryHandle ROCKET_UNUSED(geometry)) { } diff --git a/Source/Controls/Clipboard.cpp b/Source/Controls/Clipboard.cpp index 2fd67549c..258339256 100644 --- a/Source/Controls/Clipboard.cpp +++ b/Source/Controls/Clipboard.cpp @@ -28,14 +28,14 @@ #include #include #include -#if defined EMP_PLATFORM_WIN32 +#if defined ROCKET_PLATFORM_WIN32 #include #endif namespace Rocket { namespace Controls { -#if defined EMP_PLATFORM_WIN32 +#if defined ROCKET_PLATFORM_WIN32 static HWND application_hwnd = NULL; static BOOL CALLBACK FindApplicationWindow(HWND hwnd, LPARAM process_id) @@ -66,7 +66,7 @@ static Core::WString content; // Get the current contents of the clipboard. Core::WString Clipboard::Get() { - #if defined EMP_PLATFORM_WIN32 + #if defined ROCKET_PLATFORM_WIN32 if (GetHWND()) { Core::WString clipboard_content; @@ -95,7 +95,7 @@ Core::WString Clipboard::Get() // Set the contents of the clipboard. void Clipboard::Set(const Core::WString& _content) { - #if defined EMP_PLATFORM_WIN32 + #if defined ROCKET_PLATFORM_WIN32 if (GetHWND()) { if (!OpenClipboard(GetHWND())) @@ -124,7 +124,7 @@ void Clipboard::Set(const Core::WString& _content) #endif } -#if defined EMP_PLATFORM_WIN32 +#if defined ROCKET_PLATFORM_WIN32 // Set the window handle of the application. void Clipboard::SetHWND(void* hwnd) { diff --git a/Source/Controls/DataQuery.cpp b/Source/Controls/DataQuery.cpp index f7fb6bc62..9e03a09a8 100644 --- a/Source/Controls/DataQuery.cpp +++ b/Source/Controls/DataQuery.cpp @@ -40,7 +40,7 @@ class DataQuerySort order_parameters = _order_parameters; } - bool operator()(const Rocket::Core::StringList& EMP_UNUSED(left), const Rocket::Core::StringList& EMP_UNUSED(right)) + bool operator()(const Rocket::Core::StringList& ROCKET_UNUSED(left), const Rocket::Core::StringList& ROCKET_UNUSED(right)) { return false; } @@ -145,7 +145,7 @@ bool DataQuery::IsFieldSet(const Rocket::Core::String& field) const void DataQuery::LoadRow() { - EMP_ASSERT(current_row <= (int)rows.size()); + ROCKET_ASSERT(current_row <= (int)rows.size()); if (current_row >= (int)rows.size()) { rows.push_back(Rocket::Core::StringList()); diff --git a/Source/Controls/DataSource.cpp b/Source/Controls/DataSource.cpp index 8058e5721..1fb5e6991 100644 --- a/Source/Controls/DataSource.cpp +++ b/Source/Controls/DataSource.cpp @@ -90,7 +90,7 @@ void DataSource::AttachListener(DataSourceListener* listener) { if (find(listeners.begin(), listeners.end(), listener) != listeners.end()) { - EMP_ERROR; + ROCKET_ERROR; return; } listeners.push_back(listener); @@ -99,7 +99,7 @@ void DataSource::AttachListener(DataSourceListener* listener) void DataSource::DetachListener(DataSourceListener* listener) { ListenerList::iterator i = find(listeners.begin(), listeners.end(), listener); - EMP_ASSERT(i != listeners.end()); + ROCKET_ASSERT(i != listeners.end()); if (i != listeners.end()) { listeners.erase(i); diff --git a/Source/Controls/DataSourceListener.cpp b/Source/Controls/DataSourceListener.cpp index e6b6390c3..373e9b840 100644 --- a/Source/Controls/DataSourceListener.cpp +++ b/Source/Controls/DataSourceListener.cpp @@ -42,27 +42,27 @@ DataSourceListener::~DataSourceListener() } // Notification of the destruction of an observed data source. -void DataSourceListener::OnDataSourceDestroy(DataSource* EMP_UNUSED(data_source)) +void DataSourceListener::OnDataSourceDestroy(DataSource* ROCKET_UNUSED(data_source)) { } // Notification of the addition of one or more rows to an observed data source's table. -void DataSourceListener::OnRowAdd(DataSource* EMP_UNUSED(data_source), const Rocket::Core::String& EMP_UNUSED(table), int EMP_UNUSED(first_row_added), int EMP_UNUSED(num_rows_added)) +void DataSourceListener::OnRowAdd(DataSource* ROCKET_UNUSED(data_source), const Rocket::Core::String& ROCKET_UNUSED(table), int ROCKET_UNUSED(first_row_added), int ROCKET_UNUSED(num_rows_added)) { } // Notification of the removal of one or more rows from an observed data source's table. -void DataSourceListener::OnRowRemove(DataSource* EMP_UNUSED(data_source), const Rocket::Core::String& EMP_UNUSED(table), int EMP_UNUSED(first_row_removed), int EMP_UNUSED(num_rows_removed)) +void DataSourceListener::OnRowRemove(DataSource* ROCKET_UNUSED(data_source), const Rocket::Core::String& ROCKET_UNUSED(table), int ROCKET_UNUSED(first_row_removed), int ROCKET_UNUSED(num_rows_removed)) { } // Notification of the changing of one or more rows from an observed data source's table. -void DataSourceListener::OnRowChange(DataSource* EMP_UNUSED(data_source), const Rocket::Core::String& EMP_UNUSED(table), int EMP_UNUSED(first_row_changed), int EMP_UNUSED(num_rows_changed)) +void DataSourceListener::OnRowChange(DataSource* ROCKET_UNUSED(data_source), const Rocket::Core::String& ROCKET_UNUSED(table), int ROCKET_UNUSED(first_row_changed), int ROCKET_UNUSED(num_rows_changed)) { } // Notification of the change of all of the data of an observed data source's table. -void DataSourceListener::OnRowChange(DataSource* EMP_UNUSED(data_source), const Rocket::Core::String& EMP_UNUSED(table)) +void DataSourceListener::OnRowChange(DataSource* ROCKET_UNUSED(data_source), const Rocket::Core::String& ROCKET_UNUSED(table)) { } diff --git a/Source/Controls/ElementDataGrid.cpp b/Source/Controls/ElementDataGrid.cpp index 4a95c06a9..c7fa5b369 100644 --- a/Source/Controls/ElementDataGrid.cpp +++ b/Source/Controls/ElementDataGrid.cpp @@ -152,7 +152,7 @@ const ElementDataGrid::Column* ElementDataGrid::GetColumn(int column_index) { if (column_index < 0 || column_index >= (int)columns.size()) { - EMP_ERROR; + ROCKET_ERROR; return NULL; } diff --git a/Source/Controls/ElementDataGridRow.cpp b/Source/Controls/ElementDataGridRow.cpp index ed14733e0..c42872fcd 100644 --- a/Source/Controls/ElementDataGridRow.cpp +++ b/Source/Controls/ElementDataGridRow.cpp @@ -243,7 +243,7 @@ ElementDataGrid* ElementDataGridRow::GetParentGrid() return parent_grid; } -void ElementDataGridRow::OnDataSourceDestroy(DataSource* EMP_UNUSED(_data_source)) +void ElementDataGridRow::OnDataSourceDestroy(DataSource* ROCKET_UNUSED(_data_source)) { data_source->DetachListener(this); data_source = NULL; @@ -514,7 +514,7 @@ void ElementDataGridRow::Load(const DataQuery& row_information) } else { - EMP_ERROR; + ROCKET_ERROR; } } diff --git a/Source/Controls/ElementFormControlDataSelect.cpp b/Source/Controls/ElementFormControlDataSelect.cpp index a4798a1b2..95d3e18ba 100644 --- a/Source/Controls/ElementFormControlDataSelect.cpp +++ b/Source/Controls/ElementFormControlDataSelect.cpp @@ -103,28 +103,28 @@ void ElementFormControlDataSelect::OnDataSourceDestroy(DataSource* _data_source) } // Rebuilds the available options from the data source. -void ElementFormControlDataSelect::OnRowAdd(DataSource* EMP_UNUSED(data_source), const Rocket::Core::String& table, int EMP_UNUSED(first_row_added), int EMP_UNUSED(num_rows_added)) +void ElementFormControlDataSelect::OnRowAdd(DataSource* ROCKET_UNUSED(data_source), const Rocket::Core::String& table, int ROCKET_UNUSED(first_row_added), int ROCKET_UNUSED(num_rows_added)) { if (table == data_table) BuildOptions(); } // Rebuilds the available options from the data source. -void ElementFormControlDataSelect::OnRowRemove(DataSource* EMP_UNUSED(data_source), const Rocket::Core::String& table, int EMP_UNUSED(first_row_removed), int EMP_UNUSED(num_rows_removed)) +void ElementFormControlDataSelect::OnRowRemove(DataSource* ROCKET_UNUSED(data_source), const Rocket::Core::String& table, int ROCKET_UNUSED(first_row_removed), int ROCKET_UNUSED(num_rows_removed)) { if (table == data_table) BuildOptions(); } // Rebuilds the available options from the data source. -void ElementFormControlDataSelect::OnRowChange(DataSource* EMP_UNUSED(data_source), const Rocket::Core::String& table, int EMP_UNUSED(first_row_changed), int EMP_UNUSED(num_rows_changed)) +void ElementFormControlDataSelect::OnRowChange(DataSource* ROCKET_UNUSED(data_source), const Rocket::Core::String& table, int ROCKET_UNUSED(first_row_changed), int ROCKET_UNUSED(num_rows_changed)) { if (table == data_table) BuildOptions(); } // Rebuilds the available options from the data source. -void ElementFormControlDataSelect::OnRowChange(DataSource* EMP_UNUSED(data_source), const Rocket::Core::String& table) +void ElementFormControlDataSelect::OnRowChange(DataSource* ROCKET_UNUSED(data_source), const Rocket::Core::String& table) { if (table == data_table) BuildOptions(); diff --git a/Source/Controls/ElementFormControlSelect.cpp b/Source/Controls/ElementFormControlSelect.cpp index 110dfb3b7..a430eaff4 100644 --- a/Source/Controls/ElementFormControlSelect.cpp +++ b/Source/Controls/ElementFormControlSelect.cpp @@ -48,7 +48,7 @@ ElementFormControlSelect::~ElementFormControlSelect() // Returns a string representation of the current value of the form control. Rocket::Core::String ElementFormControlSelect::GetValue() const { - EMP_ASSERT(widget != NULL); + ROCKET_ASSERT(widget != NULL); return widget->GetValue(); } @@ -57,7 +57,7 @@ void ElementFormControlSelect::SetValue(const Rocket::Core::String& value) { OnUpdate(); - EMP_ASSERT(widget != NULL); + ROCKET_ASSERT(widget != NULL); widget->SetValue(value); } @@ -66,14 +66,14 @@ void ElementFormControlSelect::SetSelection(int selection) { OnUpdate(); - EMP_ASSERT(widget != NULL); + ROCKET_ASSERT(widget != NULL); widget->SetSelection(selection); } // Returns the index of the currently selected item. int ElementFormControlSelect::GetSelection() const { - EMP_ASSERT(widget != NULL); + ROCKET_ASSERT(widget != NULL); return widget->GetSelection(); } @@ -82,7 +82,7 @@ SelectOption* ElementFormControlSelect::GetOption(int index) { OnUpdate(); - EMP_ASSERT(widget != NULL); + ROCKET_ASSERT(widget != NULL); return widget->GetOption(index); } @@ -91,7 +91,7 @@ int ElementFormControlSelect::GetNumOptions() { OnUpdate(); - EMP_ASSERT(widget != NULL); + ROCKET_ASSERT(widget != NULL); return widget->GetNumOptions(); } @@ -100,7 +100,7 @@ int ElementFormControlSelect::Add(const Rocket::Core::String& rml, const Rocket: { OnUpdate(); - EMP_ASSERT(widget != NULL); + ROCKET_ASSERT(widget != NULL); return widget->AddOption(rml, value, before, false, selectable); } @@ -109,7 +109,7 @@ void ElementFormControlSelect::Remove(int index) { OnUpdate(); - EMP_ASSERT(widget != NULL); + ROCKET_ASSERT(widget != NULL); widget->RemoveOption(index); } @@ -118,7 +118,7 @@ void ElementFormControlSelect::RemoveAll() { OnUpdate(); - EMP_ASSERT(widget != NULL); + ROCKET_ASSERT(widget != NULL); widget->ClearOptions(); } diff --git a/Source/Controls/InputType.cpp b/Source/Controls/InputType.cpp index 41f51bf5a..2b4906271 100644 --- a/Source/Controls/InputType.cpp +++ b/Source/Controls/InputType.cpp @@ -62,13 +62,13 @@ void InputType::OnRender() } // Checks for necessary functional changes in the control as a result of changed attributes. -bool InputType::OnAttributeChange(const Core::AttributeNameList& EMP_UNUSED(changed_attributes)) +bool InputType::OnAttributeChange(const Core::AttributeNameList& ROCKET_UNUSED(changed_attributes)) { return true; } // Called when properties on the control are changed. -void InputType::OnPropertyChange(const Core::PropertyNameList& EMP_UNUSED(changed_properties)) +void InputType::OnPropertyChange(const Core::PropertyNameList& ROCKET_UNUSED(changed_properties)) { } diff --git a/Source/Controls/InputTypeButton.cpp b/Source/Controls/InputTypeButton.cpp index 3ad523701..085346237 100644 --- a/Source/Controls/InputTypeButton.cpp +++ b/Source/Controls/InputTypeButton.cpp @@ -67,7 +67,7 @@ void InputTypeButton::ProcessEvent(Core::Event& event) } // Sizes the dimensions to the element's inherent size. -bool InputTypeButton::GetIntrinsicDimensions(Rocket::Core::Vector2f& EMP_UNUSED(dimensions)) +bool InputTypeButton::GetIntrinsicDimensions(Rocket::Core::Vector2f& ROCKET_UNUSED(dimensions)) { return false; } diff --git a/Source/Controls/InputTypeSubmit.cpp b/Source/Controls/InputTypeSubmit.cpp index cb7880a0a..c8ed6733d 100644 --- a/Source/Controls/InputTypeSubmit.cpp +++ b/Source/Controls/InputTypeSubmit.cpp @@ -70,7 +70,7 @@ void InputTypeSubmit::ProcessEvent(Core::Event& event) } // Sizes the dimensions to the element's inherent size. -bool InputTypeSubmit::GetIntrinsicDimensions(Rocket::Core::Vector2f& EMP_UNUSED(dimensions)) +bool InputTypeSubmit::GetIntrinsicDimensions(Rocket::Core::Vector2f& ROCKET_UNUSED(dimensions)) { return false; } diff --git a/Source/Controls/InputTypeText.cpp b/Source/Controls/InputTypeText.cpp index 35f1bf1fe..79e03a0e4 100644 --- a/Source/Controls/InputTypeText.cpp +++ b/Source/Controls/InputTypeText.cpp @@ -96,7 +96,7 @@ void InputTypeText::OnPropertyChange(const Core::PropertyNameList& changed_prope } // Checks for necessary functional changes in the control as a result of the event. -void InputTypeText::ProcessEvent(Core::Event& EMP_UNUSED(event)) +void InputTypeText::ProcessEvent(Core::Event& ROCKET_UNUSED(event)) { } diff --git a/Source/Controls/Python/DataSourceWrapper.cpp b/Source/Controls/Python/DataSourceWrapper.cpp new file mode 100644 index 000000000..639d76466 --- /dev/null +++ b/Source/Controls/Python/DataSourceWrapper.cpp @@ -0,0 +1,238 @@ +/* + * This source file is part of libRocket, the HTML/CSS Interface Middleware + * + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +#include "precompiled.h" +#include "DataSourceWrapper.h" +#include +#include + +namespace Rocket { +namespace Controls { +namespace Python { + +// Returns the string representation of a python class name +static Core::String GetPythonClassName(PyObject* object) +{ + Core::String full_name; + + // Check if the object is a class; either a standard Python class or a Boost Python class metatype. If so, we can + // query the name of the class object directly; otherwise, it is an object that we have to query the class type + // from. + bool is_class = PyClass_Check(object) || + object->ob_type == python::objects::class_metatype().get(); + PyObject* py_class = NULL; + if (!is_class) + { + py_class = PyObject_GetAttrString(object, "__class__"); + object = py_class; + if (!object) + { + PyErr_Clear(); + return full_name; + } + } + + PyObject* py_class_name = PyObject_GetAttrString(object, "__name__"); + if (py_class_name != NULL) + { + const char* class_name = PyString_AsString(py_class_name); + + PyObject* py_module_name = PyObject_GetAttrString(object, "__module__"); + const char* module_name = PyString_AsString(py_module_name); + + full_name.FormatString(128, "%s.%s", module_name, class_name); + + Py_DECREF(py_module_name); + Py_DECREF(py_class_name); + } + else + { + PyErr_Clear(); + } + + if (py_class != NULL) + Py_DECREF(py_class); + + return full_name; +} + + +DataSourceWrapper::DataSourceWrapper(PyObject* _self, const char* name) : DataSource(name) +{ + self = _self; +} + +DataSourceWrapper::~DataSourceWrapper() +{ +} + +void DataSourceWrapper::InitialisePythonInterface() +{ + void (DataSourceWrapper::*NotifyRowChange)(const Core::String&) = &DataSourceWrapper::NotifyRowChange; + void (DataSourceWrapper::*NotifyRowChangeParams)(const Core::String&, int, int) = &DataSourceWrapper::NotifyRowChange; + + python::scope datasource_scope = python::class_("DataSource", python::init< const char* >()) + .def("NotifyRowAdd", &DataSourceWrapper::NotifyRowAdd) + .def("NotifyRowRemove", &DataSourceWrapper::NotifyRowRemove) + .def("NotifyRowChange", NotifyRowChange) + .def("NotifyRowChange", NotifyRowChangeParams) + ; + + // Register the column names for use in python + python::scope().attr("COLUMN_CHILD_SOURCE") = DataSource::CHILD_SOURCE; + python::scope().attr("COLUMN_DEPTH") = DataSource::DEPTH; + python::scope().attr("COLUMN_NUM_CHILDREN") = DataSource::NUM_CHILDREN; +} + +void DataSourceWrapper::GetRow(Core::StringList& row, const Core::String& table, int row_index, const Core::StringList& columns) +{ + PyObject* callable = PyObject_GetAttrString(self, "GetRow"); + if (!callable) + { + Core::String error_message(128, "Function \"GetRow\" not found on python data source %s.", GetPythonClassName(self).CString()); + Core::Log::Message(Core::Log::LT_WARNING, "%s", error_message.CString()); + PyErr_SetString(PyExc_RuntimeError, error_message.CString()); + python::throw_error_already_set(); + return; + } + + python::tuple t = python::make_tuple(table.CString(), row_index, columns); + PyObject* result = PyObject_CallObject(callable, t.ptr()); + Py_DECREF(callable); + + // If it's a list, then just get the entries out of it + if (result && PyList_Check(result)) + { + int num_entries = PyList_Size(result); + for (int i = 0; i < num_entries; i++) + { + Core::String entry; + + PyObject* entry_object = PyList_GetItem(result, i); + if (PyString_Check(entry_object)) + { + entry = PyString_AS_STRING(entry_object); + } + else if (PyInt_Check(entry_object)) + { + int entry_int = (int)PyInt_AS_LONG(entry_object); + Core::TypeConverter< int, Core::String >::Convert(entry_int, entry); + } + else if (PyFloat_Check(entry_object)) + { + float entry_float = (float)PyFloat_AS_DOUBLE(entry_object); + Core::TypeConverter< float, Core::String >::Convert(entry_float, entry); + } + else + { + Core::String error_message(128, "Failed to convert row %d entry %d on data source %s.", row_index, i, GetPythonClassName(self).CString()); + Core::Log::Message(Core::Log::LT_WARNING, "%s", error_message.CString()); + PyErr_SetString(PyExc_RuntimeError, error_message.CString()); + python::throw_error_already_set(); + } + + row.push_back(entry); + } + } + else + { + // Print the error and restore it to the caller + PyObject *type, *value, *traceback; + PyErr_Fetch(&type, &value, &traceback); + Py_XINCREF(type); + Py_XINCREF(value); + Py_XINCREF(traceback); + + Core::String error_message(128, "Failed to get entries for table %s row %d from python data source %s.", table.CString(), row_index, GetPythonClassName(self).CString()); + Core::Log::Message(Core::Log::LT_WARNING, "%s", error_message.CString()); + if (type == NULL) + PyErr_SetString(PyExc_RuntimeError, error_message.CString()); + else + PyErr_Restore(type, value, traceback); + + python::throw_error_already_set(); + } + + if (result) + Py_DECREF(result); +} + +int DataSourceWrapper::GetNumRows(const Core::String& table) +{ + int num_rows = 0; + + PyObject* callable = PyObject_GetAttrString(self, "GetNumRows"); + if (!callable) + { + Core::String error_message(128, "Function \"GetNumRows\" not found on python data source %s.", GetPythonClassName(self).CString()); + Core::Log::Message(Core::Log::LT_WARNING, "%s", error_message.CString()); + PyErr_SetString(PyExc_RuntimeError, error_message.CString()); + python::throw_error_already_set(); + + return 0; + } + + PyObject* result = PyObject_CallObject(callable, python::make_tuple(table.CString()).ptr()); + Py_DECREF(callable); + + if (result && PyInt_Check(result)) + { + num_rows = PyInt_AsLong(result); + } + else + { + // Print the error and restore it to the caller + PyObject *type, *value, *traceback; + PyErr_Fetch(&type, &value, &traceback); + Py_XINCREF(type); + Py_XINCREF(value); + Py_XINCREF(traceback); + + Core::String error_message(128, "Failed to get number of rows from python data source %s.", GetPythonClassName(self).CString()); + Core::Log::Message(Core::Log::LT_WARNING, "%s", error_message.CString()); + if (type == NULL) + PyErr_SetString(PyExc_RuntimeError, error_message.CString()); + else + PyErr_Restore(type, value, traceback); + + python::throw_error_already_set(); + } + + if (result) + Py_DECREF(result); + + return num_rows; +} + +Core::ScriptObject DataSourceWrapper::GetScriptObject() const +{ + return self; +} + +} +} +} diff --git a/Source/Controls/Python/DataSourceWrapper.h b/Source/Controls/Python/DataSourceWrapper.h new file mode 100644 index 000000000..ae449befb --- /dev/null +++ b/Source/Controls/Python/DataSourceWrapper.h @@ -0,0 +1,68 @@ +/* + * This source file is part of libRocket, the HTML/CSS Interface Middleware + * + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +#ifndef ROCKETCOREPYTHONDATASOURCEWRAPPER_H +#define ROCKETCOREPYTHONDATASOURCEWRAPPER_H + +#include +#include +#include + +namespace Rocket { +namespace Controls { +namespace Python { + +/** + Python DataSource Wrapper + + Exposes a DataSource to python. + + @author Lloyd Weehuizen + */ + +class DataSourceWrapper : public DataSource +{ + public: + DataSourceWrapper(PyObject* self, const char* name); + ~DataSourceWrapper(); + + static void InitialisePythonInterface(); + + void GetRow(Core::StringList& row, const Core::String& table, int row_index, const Core::StringList& columns); + int GetNumRows(const Core::String& table); + + virtual Core::ScriptObject GetScriptObject() const; + + private: + PyObject* self; +}; + +} +} +} + +#endif diff --git a/Source/Controls/Python/ElementInterface.cpp b/Source/Controls/Python/ElementInterface.cpp index f121b75a9..443e97957 100644 --- a/Source/Controls/Python/ElementInterface.cpp +++ b/Source/Controls/Python/ElementInterface.cpp @@ -48,7 +48,7 @@ namespace Rocket { namespace Controls { namespace Python { -typedef Rocket::Core::STL::map< Rocket::Core::String, PyObject* > ClassDefinitions; +typedef std::map< Rocket::Core::String, PyObject* > ClassDefinitions; ClassDefinitions class_definitions; void ElementInterface::InitialisePythonInterface() diff --git a/Source/Controls/Python/Module.cpp b/Source/Controls/Python/Module.cpp index 555daf62c..8bee202c2 100644 --- a/Source/Controls/Python/Module.cpp +++ b/Source/Controls/Python/Module.cpp @@ -28,8 +28,11 @@ #include "precompiled.h" #include "Module.h" #include +#include +#include #include "ElementInterface.h" #include "DataFormatterWrapper.h" +#include "DataSourceWrapper.h" namespace Rocket { namespace Controls { @@ -43,10 +46,12 @@ BOOST_PYTHON_MODULE(_rocketcontrols) // the boost python definitions Py_XDECREF(PyImport_ImportModule("_rocketcore")); + Rocket::Core::Python::ConverterScriptObject< DataSource >(); // Initialise the python bindings ElementInterface::InitialisePythonInterface(); DataFormatterWrapper::InitialisePythonInterface(); + DataSourceWrapper::InitialisePythonInterface(); // Register this plugin with rocket Rocket::Core::RegisterPlugin(&module); diff --git a/Source/Controls/Python/precompiled.h b/Source/Controls/Python/precompiled.h index 077d8e68d..a479d06c7 100644 --- a/Source/Controls/Python/precompiled.h +++ b/Source/Controls/Python/precompiled.h @@ -30,4 +30,4 @@ #include // Python header. -//#include +#include diff --git a/Source/Controls/WidgetTextInput.cpp b/Source/Controls/WidgetTextInput.cpp index feada9ce7..88af24f0b 100644 --- a/Source/Controls/WidgetTextInput.cpp +++ b/Source/Controls/WidgetTextInput.cpp @@ -546,7 +546,7 @@ void WidgetTextInput::MoveCursorVertical(int distance, bool select) // Updates the absolute cursor index from the relative cursor indices. void WidgetTextInput::UpdateAbsoluteCursor() { - EMP_ASSERT(cursor_line_index < (int) lines.size()) + ROCKET_ASSERT(cursor_line_index < (int) lines.size()) absolute_cursor_index = cursor_character_index; edit_index = cursor_character_index; diff --git a/Source/Controls/XMLNodeHandlerDataGrid.cpp b/Source/Controls/XMLNodeHandlerDataGrid.cpp index cf14660f1..526a03b8c 100644 --- a/Source/Controls/XMLNodeHandlerDataGrid.cpp +++ b/Source/Controls/XMLNodeHandlerDataGrid.cpp @@ -48,7 +48,7 @@ Core::Element* XMLNodeHandlerDataGrid::ElementStart(Core::XMLParser* parser, con Core::Element* element = NULL; Core::Element* parent = parser->GetParseFrame()->element; - EMP_ASSERT(name == "datagrid" || + ROCKET_ASSERT(name == "datagrid" || name == "col"); if (name == "datagrid") @@ -94,13 +94,13 @@ Core::Element* XMLNodeHandlerDataGrid::ElementStart(Core::XMLParser* parser, con } else { - EMP_ERROR; + ROCKET_ERROR; } return element; } -bool XMLNodeHandlerDataGrid::ElementEnd(Core::XMLParser* EMP_UNUSED(parser), const Rocket::Core::String& EMP_UNUSED(name)) +bool XMLNodeHandlerDataGrid::ElementEnd(Core::XMLParser* ROCKET_UNUSED(parser), const Rocket::Core::String& ROCKET_UNUSED(name)) { return true; } diff --git a/Source/Controls/XMLNodeHandlerTabSet.cpp b/Source/Controls/XMLNodeHandlerTabSet.cpp index 9da9929bf..334619ca7 100644 --- a/Source/Controls/XMLNodeHandlerTabSet.cpp +++ b/Source/Controls/XMLNodeHandlerTabSet.cpp @@ -44,7 +44,7 @@ XMLNodeHandlerTabSet::~XMLNodeHandlerTabSet() Core::Element* XMLNodeHandlerTabSet::ElementStart(Core::XMLParser* parser, const Rocket::Core::String& name, const Rocket::Core::XMLAttributes& attributes) { - EMP_ASSERT(name == "tabset" || + ROCKET_ASSERT(name == "tabset" || name == "tabs" || name == "tab" || name == "panels" || @@ -129,7 +129,7 @@ Core::Element* XMLNodeHandlerTabSet::ElementStart(Core::XMLParser* parser, const return NULL; } -bool XMLNodeHandlerTabSet::ElementEnd(Core::XMLParser* EMP_UNUSED(parser), const Rocket::Core::String& EMP_UNUSED(name)) +bool XMLNodeHandlerTabSet::ElementEnd(Core::XMLParser* ROCKET_UNUSED(parser), const Rocket::Core::String& ROCKET_UNUSED(name)) { return true; } diff --git a/Source/Controls/XMLNodeHandlerTextArea.cpp b/Source/Controls/XMLNodeHandlerTextArea.cpp index 2befe5828..b0ff229da 100644 --- a/Source/Controls/XMLNodeHandlerTextArea.cpp +++ b/Source/Controls/XMLNodeHandlerTextArea.cpp @@ -58,7 +58,7 @@ Core::Element* XMLNodeHandlerTextArea::ElementStart(Core::XMLParser* parser, con return NULL; } -bool XMLNodeHandlerTextArea::ElementEnd(Core::XMLParser* EMP_UNUSED(parser), const Rocket::Core::String& EMP_UNUSED(name)) +bool XMLNodeHandlerTextArea::ElementEnd(Core::XMLParser* ROCKET_UNUSED(parser), const Rocket::Core::String& ROCKET_UNUSED(name)) { return true; } diff --git a/Source/Core/BaseXMLParser.cpp b/Source/Core/BaseXMLParser.cpp index 815862287..992ab767f 100644 --- a/Source/Core/BaseXMLParser.cpp +++ b/Source/Core/BaseXMLParser.cpp @@ -81,17 +81,17 @@ int BaseXMLParser::GetLineNumber() } // Called when the parser finds the beginning of an element tag. -void BaseXMLParser::HandleElementStart(const String& EMP_UNUSED(name), const XMLAttributes& EMP_UNUSED(attributes)) +void BaseXMLParser::HandleElementStart(const String& ROCKET_UNUSED(name), const XMLAttributes& ROCKET_UNUSED(attributes)) { } // Called when the parser finds the end of an element tag. -void BaseXMLParser::HandleElementEnd(const String& EMP_UNUSED(name)) +void BaseXMLParser::HandleElementEnd(const String& ROCKET_UNUSED(name)) { } // Called when the parser encounters data. -void BaseXMLParser::HandleData(const String& EMP_UNUSED(data)) +void BaseXMLParser::HandleData(const String& ROCKET_UNUSED(data)) { } diff --git a/Source/Core/Box.cpp b/Source/Core/Box.cpp index 7cdabe7b7..83a1f0c7e 100644 --- a/Source/Core/Box.cpp +++ b/Source/Core/Box.cpp @@ -25,7 +25,7 @@ * */ -//#include "precompiled.h" +#include "precompiled.h" #include namespace Rocket { diff --git a/Source/Core/Context.cpp b/Source/Core/Context.cpp index fd7d0e984..75ec389f0 100644 --- a/Source/Core/Context.cpp +++ b/Source/Core/Context.cpp @@ -33,18 +33,12 @@ #include "PluginRegistry.h" #include "StreamFile.h" #include -#include "TrialLogo.h" namespace Rocket { namespace Core { const float DOUBLE_CLICK_TIME = 0.5f; -bool use_trial_logo = false; - -typedef std::map< Context*, TrialLogo* > TrialLogoMap; -static TrialLogoMap trial_logos; - Context::Context(const String& name) : name(name), mouse_position(0, 0), dimensions(0, 0) { instancer = NULL; @@ -76,23 +70,10 @@ Context::Context(const String& name) : name(name), mouse_position(0, 0), dimensi last_click_element = NULL; last_click_time = 0; - - if (use_trial_logo) - trial_logos[this] = new TrialLogo(this); } Context::~Context() { - if (use_trial_logo) - { - TrialLogoMap::iterator logo_iterator = trial_logos.find(this); - if (logo_iterator != trial_logos.end()) - { - delete logo_iterator->second; - trial_logos.erase(logo_iterator); - } - } - PluginRegistry::NotifyContextDestroy(this); UnloadAllDocuments(); @@ -174,13 +155,6 @@ bool Context::Render() root->Render(); - if (use_trial_logo) - { - TrialLogoMap::iterator logo_iterator = trial_logos.find(this); - if (logo_iterator != trial_logos.end()) - logo_iterator->second->Render(); - } - ElementUtilities::SetClippingRegion(NULL, this); // Render the cursor proxy so any elements attached the cursor will be rendered below the cursor. @@ -804,7 +778,7 @@ RenderInterface* Context::GetRenderInterface() const // Sets the instancer to use for releasing this object. void Context::SetInstancer(ContextInstancer* _instancer) { - EMP_ASSERT(instancer == NULL); + ROCKET_ASSERT(instancer == NULL); instancer = _instancer; instancer->AddReference(); } diff --git a/Source/Core/ConvolutionFilter.cpp b/Source/Core/ConvolutionFilter.cpp index 326f64364..c30db9aab 100644 --- a/Source/Core/ConvolutionFilter.cpp +++ b/Source/Core/ConvolutionFilter.cpp @@ -63,7 +63,7 @@ bool ConvolutionFilter::Initialise(int _kernel_size, FilterOperation _operation) // Returns a reference to one of the rows of the filter kernel. float* ConvolutionFilter::operator[](int index) { - EMP_ASSERT(kernel != NULL); + ROCKET_ASSERT(kernel != NULL); index = Math::Max(index, 0); index = Math::Min(index, kernel_size - 1); diff --git a/Source/Core/Core.cpp b/Source/Core/Core.cpp index 5d30beb4c..dd554dd8e 100644 --- a/Source/Core/Core.cpp +++ b/Source/Core/Core.cpp @@ -34,11 +34,11 @@ #include "StyleSheetFactory.h" #include "TemplateCache.h" #include "TextureDatabase.h" -/*#if defined EMP_PLATFORM_WIN32 +/*#if defined ROCKET_PLATFORM_WIN32 #include -#elif defined EMP_PLATFORM_MACOSX +#elif defined ROCKET_PLATFORM_MACOSX #include -#elif defined EMP_PLATFORM_LINUX +#elif defined ROCKET_PLATFORM_LINUX #include #endif*/ @@ -55,13 +55,11 @@ static FileInterfaceDefault file_interface_default; static bool initialised = false; -extern bool use_trial_logo; - typedef std::map< String, Context* > ContextMap; static ContextMap contexts; -#ifndef RKT_VERSION - #define RKT_VERSION "dev" +#ifndef ROCKET_VERSION + #define ROCKET_VERSION "custom" #endif /** @@ -97,9 +95,6 @@ bool Initialise() file_interface->AddReference(); } - // Never display logo - use_trial_logo = false; - Log::Initialise(); TextureDatabase::Initialise(); @@ -156,7 +151,7 @@ void Shutdown() // Returns the version of this Rocket library. String GetVersion() { - return RKT_VERSION; + return ROCKET_VERSION; } // Sets the interface through which all Rocket messages will be routed. diff --git a/Source/Core/Decorator.cpp b/Source/Core/Decorator.cpp index b42d8196c..95f755a26 100644 --- a/Source/Core/Decorator.cpp +++ b/Source/Core/Decorator.cpp @@ -109,7 +109,7 @@ float Decorator::ResolveProperty(const PropertyDictionary& properties, const Str const Property* property = properties.GetProperty(name); if (property == NULL) { - EMP_ERROR; + ROCKET_ERROR; return 0; } @@ -120,7 +120,7 @@ float Decorator::ResolveProperty(const PropertyDictionary& properties, const Str if (property->unit & Property::NUMBER || property->unit & Property::PX) return property->value.Get< float >(); - EMP_ERROR; + ROCKET_ERROR; return 0; } diff --git a/Source/Core/DecoratorNone.cpp b/Source/Core/DecoratorNone.cpp index 504c05ca1..af2448e6b 100644 --- a/Source/Core/DecoratorNone.cpp +++ b/Source/Core/DecoratorNone.cpp @@ -36,18 +36,18 @@ DecoratorNone::~DecoratorNone() } // Called on a decorator to generate any required per-element data for a newly decorated element. -DecoratorDataHandle DecoratorNone::GenerateElementData(Element* EMP_UNUSED(element)) +DecoratorDataHandle DecoratorNone::GenerateElementData(Element* ROCKET_UNUSED(element)) { return NULL; } // Called to release element data generated by this decorator. -void DecoratorNone::ReleaseElementData(DecoratorDataHandle EMP_UNUSED(element_data)) +void DecoratorNone::ReleaseElementData(DecoratorDataHandle ROCKET_UNUSED(element_data)) { } // Called to render the decorator on an element. -void DecoratorNone::RenderElement(Element* EMP_UNUSED(element), DecoratorDataHandle EMP_UNUSED(element_data)) +void DecoratorNone::RenderElement(Element* ROCKET_UNUSED(element), DecoratorDataHandle ROCKET_UNUSED(element_data)) { } diff --git a/Source/Core/DecoratorNoneInstancer.cpp b/Source/Core/DecoratorNoneInstancer.cpp index 1b68a8ea3..d4541545a 100644 --- a/Source/Core/DecoratorNoneInstancer.cpp +++ b/Source/Core/DecoratorNoneInstancer.cpp @@ -37,7 +37,7 @@ DecoratorNoneInstancer::~DecoratorNoneInstancer() } // Instances a decorator given the property tag and attributes from the RCSS file. -Decorator* DecoratorNoneInstancer::InstanceDecorator(const String& EMP_UNUSED(name), const PropertyDictionary& EMP_UNUSED(properties)) +Decorator* DecoratorNoneInstancer::InstanceDecorator(const String& ROCKET_UNUSED(name), const PropertyDictionary& ROCKET_UNUSED(properties)) { return new DecoratorNone(); } diff --git a/Source/Core/DecoratorTiledBoxInstancer.cpp b/Source/Core/DecoratorTiledBoxInstancer.cpp index 4f2ed1f12..484bc340e 100644 --- a/Source/Core/DecoratorTiledBoxInstancer.cpp +++ b/Source/Core/DecoratorTiledBoxInstancer.cpp @@ -52,7 +52,7 @@ DecoratorTiledBoxInstancer::~DecoratorTiledBoxInstancer() } // Instances a box decorator. -Decorator* DecoratorTiledBoxInstancer::InstanceDecorator(const String& EMP_UNUSED(name), const PropertyDictionary& properties) +Decorator* DecoratorTiledBoxInstancer::InstanceDecorator(const String& ROCKET_UNUSED(name), const PropertyDictionary& properties) { DecoratorTiled::Tile tiles[9]; String texture_names[9]; diff --git a/Source/Core/DecoratorTiledHorizontalInstancer.cpp b/Source/Core/DecoratorTiledHorizontalInstancer.cpp index 5839c58d1..e799a6e52 100644 --- a/Source/Core/DecoratorTiledHorizontalInstancer.cpp +++ b/Source/Core/DecoratorTiledHorizontalInstancer.cpp @@ -44,7 +44,7 @@ DecoratorTiledHorizontalInstancer::~DecoratorTiledHorizontalInstancer() } // Instances a box decorator. -Decorator* DecoratorTiledHorizontalInstancer::InstanceDecorator(const String& EMP_UNUSED(name), const PropertyDictionary& properties) +Decorator* DecoratorTiledHorizontalInstancer::InstanceDecorator(const String& ROCKET_UNUSED(name), const PropertyDictionary& properties) { DecoratorTiled::Tile tiles[3]; String texture_names[3]; diff --git a/Source/Core/DecoratorTiledImageInstancer.cpp b/Source/Core/DecoratorTiledImageInstancer.cpp index 1c89b0a0e..45bbdd419 100644 --- a/Source/Core/DecoratorTiledImageInstancer.cpp +++ b/Source/Core/DecoratorTiledImageInstancer.cpp @@ -42,7 +42,7 @@ DecoratorTiledImageInstancer::~DecoratorTiledImageInstancer() } // Instances a box decorator. -Decorator* DecoratorTiledImageInstancer::InstanceDecorator(const String& EMP_UNUSED(name), const PropertyDictionary& properties) +Decorator* DecoratorTiledImageInstancer::InstanceDecorator(const String& ROCKET_UNUSED(name), const PropertyDictionary& properties) { DecoratorTiled::Tile tile; String texture_name; diff --git a/Source/Core/DecoratorTiledVerticalInstancer.cpp b/Source/Core/DecoratorTiledVerticalInstancer.cpp index b4287dfd0..2a50469ac 100644 --- a/Source/Core/DecoratorTiledVerticalInstancer.cpp +++ b/Source/Core/DecoratorTiledVerticalInstancer.cpp @@ -44,7 +44,7 @@ DecoratorTiledVerticalInstancer::~DecoratorTiledVerticalInstancer() } // Instances a box decorator. -Decorator* DecoratorTiledVerticalInstancer::InstanceDecorator(const String& EMP_UNUSED(name), const PropertyDictionary& properties) +Decorator* DecoratorTiledVerticalInstancer::InstanceDecorator(const String& ROCKET_UNUSED(name), const PropertyDictionary& properties) { DecoratorTiled::Tile tiles[3]; String texture_names[3]; diff --git a/Source/Core/Dictionary.cpp b/Source/Core/Dictionary.cpp index f5c785f02..d6d51c110 100644 --- a/Source/Core/Dictionary.cpp +++ b/Source/Core/Dictionary.cpp @@ -171,7 +171,7 @@ namespace Core { equally good collision statistics, needed less code & used less memory. */ -static String dummy_key = String(128, "###DUMMYEMPDICTKEY%d###", &dummy_key); +static String dummy_key = String(128, "###DUMMYROCKETDICTKEY%d###", &dummy_key); Dictionary::Dictionary() { @@ -312,14 +312,14 @@ bool Dictionary::Reserve(int minused) DictionaryEntry small_copy[DICTIONARY_MINSIZE]; DICTIONARY_DEBUG_CODE( Log::Message(LC_CORE, Log::LT_ALWAYS, "Dictionary::Reserve %d", minused); ) - EMP_ASSERT(minused >= 0); + ROCKET_ASSERT(minused >= 0); /* Find the smallest table size > minused. */ for (newsize = DICTIONARY_MINSIZE; newsize <= minused && newsize > 0; newsize <<= 1); - EMP_ASSERT(newsize > 0); + ROCKET_ASSERT(newsize > 0); if (newsize <= 0) { return false; @@ -331,7 +331,7 @@ bool Dictionary::Reserve(int minused) /* Get space for a new table. */ oldtable = table; - EMP_ASSERT(oldtable != NULL); + ROCKET_ASSERT(oldtable != NULL); is_oldtable_malloced = oldtable != small_table; if (newsize == DICTIONARY_MINSIZE) { @@ -348,14 +348,14 @@ bool Dictionary::Reserve(int minused) as lookdict needs at least one virgin slot to terminate failing searches. If fill < size, it's merely desirable, as dummies slow searches. */ - EMP_ASSERT(num_full > num_used); + ROCKET_ASSERT(num_full > num_used); memcpy(small_copy, oldtable, sizeof(small_copy)); oldtable = small_copy; } } else { newtable = new DictionaryEntry[newsize]; - EMP_ASSERT(newtable); + ROCKET_ASSERT(newtable); if (newtable == NULL) { return false; @@ -363,7 +363,7 @@ bool Dictionary::Reserve(int minused) } /* Make the dict empty, using the new table. */ - EMP_ASSERT(newtable != oldtable); + ROCKET_ASSERT(newtable != oldtable); table = newtable; mask = newsize - 1; //memset(newtable, 0, sizeof(DictionaryEntry) * newsize); @@ -382,7 +382,7 @@ bool Dictionary::Reserve(int minused) } else if (!ep->key.Empty()) { /* dummy_key entry */ --i; - EMP_ASSERT(ep->key == dummy_key); + ROCKET_ASSERT(ep->key == dummy_key); } /* else key == value == NULL: nothing to do */ } @@ -433,7 +433,7 @@ void Dictionary::Set(const String& key, const Variant &value) DICTIONARY_DEBUG_CODE( Log::Message(LC_CORE, Log::LT_ALWAYS, "Dictionary::Set %s", key); ); hash = StringUtilities::FNVHash( key.CString() ); - EMP_ASSERT(num_full <= mask); /* at least one empty slot */ + ROCKET_ASSERT(num_full <= mask); /* at least one empty slot */ n_used = num_used; Insert( key, hash, value ); @@ -492,7 +492,7 @@ void Dictionary::Clear() // Clear things up for (ep = table; n_full > 0; ++ep) { - EMP_ASSERT(i < n); + ROCKET_ASSERT(i < n); ++i; if (!ep->key.Empty()) { @@ -500,7 +500,7 @@ void Dictionary::Clear() ep->key.Clear(); ep->value.Clear(); } else { - EMP_ASSERT(ep->value.GetType() == Variant::NONE); + ROCKET_ASSERT(ep->value.GetType() == Variant::NONE); } } diff --git a/Source/Core/Element.cpp b/Source/Core/Element.cpp index d773f0d2a..8d0c5735a 100644 --- a/Source/Core/Element.cpp +++ b/Source/Core/Element.cpp @@ -109,7 +109,7 @@ Element::Element(const String& _tag) : absolute_offset(0, 0), relative_offset_ba Element::~Element() { - EMP_ASSERT(parent == NULL); + ROCKET_ASSERT(parent == NULL); PluginRegistry::NotifyElementDestroy(this); @@ -443,7 +443,7 @@ float Element::GetBaseline() const } // Gets the intrinsic dimensions of this element, if it is of a type that has an inherent size. -bool Element::GetIntrinsicDimensions(Vector2f& EMP_UNUSED(dimensions)) +bool Element::GetIntrinsicDimensions(Vector2f& ROCKET_UNUSED(dimensions)) { return false; } @@ -504,7 +504,7 @@ void Element::RemoveProperty(const String& name) // Sets a local property override on the element to a pre-parsed value. bool Element::SetProperty(const String& name, const Property& property) { - EMP_ASSERTMSG(property.unit != Property::KEYWORD || property.definition != NULL, "Keyword properties should not be set pre-parsed on an element."); + ROCKET_ASSERTMSG(property.unit != Property::KEYWORD || property.definition != NULL, "Keyword properties should not be set pre-parsed on an element."); return style->SetProperty(name, property); } diff --git a/Source/Core/ElementDefinition.cpp b/Source/Core/ElementDefinition.cpp index 4f8704a30..caff86905 100644 --- a/Source/Core/ElementDefinition.cpp +++ b/Source/Core/ElementDefinition.cpp @@ -408,7 +408,7 @@ void ElementDefinition::BuildPropertyGroup(PropertyGroupMap& groups, const Strin } // Updates a property dictionary of all properties for a single group. -int ElementDefinition::BuildPropertyGroupDictionary(PropertyDictionary& group_properties, const String& EMP_UNUSED(group_type), const String& group_name, const PropertyDictionary& element_properties) +int ElementDefinition::BuildPropertyGroupDictionary(PropertyDictionary& group_properties, const String& ROCKET_UNUSED(group_type), const String& group_name, const PropertyDictionary& element_properties) { int num_properties = 0; diff --git a/Source/Core/ElementDocument.cpp b/Source/Core/ElementDocument.cpp index 08abb798d..d96e6027f 100644 --- a/Source/Core/ElementDocument.cpp +++ b/Source/Core/ElementDocument.cpp @@ -287,7 +287,7 @@ bool ElementDocument::IsModal() const } // Default load script implementation -void ElementDocument::LoadScript(Stream* EMP_UNUSED(stream), const String& EMP_UNUSED(source_name)) +void ElementDocument::LoadScript(Stream* ROCKET_UNUSED(stream), const String& ROCKET_UNUSED(source_name)) { } diff --git a/Source/Core/ElementStyle.cpp b/Source/Core/ElementStyle.cpp index 977bf10b5..fb7618182 100644 --- a/Source/Core/ElementStyle.cpp +++ b/Source/Core/ElementStyle.cpp @@ -304,7 +304,7 @@ float ElementStyle::ResolveProperty(const String& name, float base_value) const Property* property = GetProperty(name); if (!property) { - EMP_ERROR; + ROCKET_ERROR; return 0.0f; } diff --git a/Source/Core/ElementTextDefault.cpp b/Source/Core/ElementTextDefault.cpp index a1316a4f1..9fa355c29 100644 --- a/Source/Core/ElementTextDefault.cpp +++ b/Source/Core/ElementTextDefault.cpp @@ -391,7 +391,7 @@ void ElementTextDefault::GenerateDecoration(FontFaceHandle* font_face_handle, co static bool BuildToken(WString& token, const word*& token_begin, const word* string_end, bool first_token, bool collapse_white_space, bool break_at_endline, int text_transformation) { - EMP_ASSERT(token_begin != string_end); + ROCKET_ASSERT(token_begin != string_end); // Check what the first character of the token is; all we need to know is if it is white-space or not. bool parsing_white_space = StringUtilities::IsWhitespace(*token_begin); diff --git a/Source/Core/ElementUtilities.cpp b/Source/Core/ElementUtilities.cpp index 30c78ce16..05027c518 100644 --- a/Source/Core/ElementUtilities.cpp +++ b/Source/Core/ElementUtilities.cpp @@ -449,7 +449,7 @@ bool ElementUtilities::PositionElement(Element* element, const Vector2f& offset, } /* // Returns true if the element is visible within the current clipping region (if any), false if not. -static bool IsElementVisible(const Element* EMP_UNUSED(element)) +static bool IsElementVisible(const Element* ROCKET_UNUSED(element)) { // Fix this when text elements have their sizes correctly set! return true; @@ -498,7 +498,7 @@ static bool IsElementVisible(const Element* EMP_UNUSED(element)) static void SetBox(Element* element) { Element* parent = element->GetParentNode(); - EMP_ASSERT(parent != NULL); + ROCKET_ASSERT(parent != NULL); Vector2f containing_block = parent->GetBox().GetSize(); containing_block.x -= parent->GetElementScroll()->GetScrollbarSize(ElementScroll::VERTICAL); diff --git a/Source/Core/FontDatabase.cpp b/Source/Core/FontDatabase.cpp index 8f781f3be..b67a000ab 100644 --- a/Source/Core/FontDatabase.cpp +++ b/Source/Core/FontDatabase.cpp @@ -44,13 +44,13 @@ static FT_Library ft_library = NULL; FontDatabase::FontDatabase() { - EMP_ASSERT(instance == NULL); + ROCKET_ASSERT(instance == NULL); instance = this; } FontDatabase::~FontDatabase() { - EMP_ASSERT(instance == this); + ROCKET_ASSERT(instance == this); instance = NULL; } diff --git a/Source/Core/FontEffect.cpp b/Source/Core/FontEffect.cpp index fae6fb6df..80611b74c 100644 --- a/Source/Core/FontEffect.cpp +++ b/Source/Core/FontEffect.cpp @@ -57,13 +57,13 @@ bool FontEffect::HasUniqueTexture() const } // Gets the effect to resize and reposition a glyph's bitmap. -bool FontEffect::GetGlyphMetrics(Vector2i& EMP_UNUSED(origin), Vector2i& EMP_UNUSED(dimensions), const FontGlyph& EMP_UNUSED(glyph)) const +bool FontEffect::GetGlyphMetrics(Vector2i& ROCKET_UNUSED(origin), Vector2i& ROCKET_UNUSED(dimensions), const FontGlyph& ROCKET_UNUSED(glyph)) const { return false; } // Requests the effect to generate the texture data for a single glyph's bitmap. -void FontEffect::GenerateGlyphTexture(byte* EMP_UNUSED(destination_data), const Vector2i& EMP_UNUSED(destination_dimensions), int EMP_UNUSED(destination_stride), const FontGlyph& EMP_UNUSED(glyph)) const +void FontEffect::GenerateGlyphTexture(byte* ROCKET_UNUSED(destination_data), const Vector2i& ROCKET_UNUSED(destination_dimensions), int ROCKET_UNUSED(destination_stride), const FontGlyph& ROCKET_UNUSED(glyph)) const { } diff --git a/Source/Core/FontEffectNone.cpp b/Source/Core/FontEffectNone.cpp index 22d8fda45..8fb81131f 100644 --- a/Source/Core/FontEffectNone.cpp +++ b/Source/Core/FontEffectNone.cpp @@ -40,13 +40,13 @@ FontEffectNone::~FontEffectNone() } // Resizes and repositions the glyph to fit the outline. -bool FontEffectNone::GetGlyphSize(Vector2i& EMP_UNUSED(origin), Vector2i& EMP_UNUSED(dimensions), const FontGlyph& EMP_UNUSED(glyph)) const +bool FontEffectNone::GetGlyphSize(Vector2i& ROCKET_UNUSED(origin), Vector2i& ROCKET_UNUSED(dimensions), const FontGlyph& ROCKET_UNUSED(glyph)) const { return false; } // Expands the original glyph texture for the outline. -void FontEffectNone::GenerateGlyphTexture(byte* EMP_UNUSED(destination_data), const Vector2i& EMP_UNUSED(destination_dimensions), int EMP_UNUSED(destination_stride), const FontGlyph& EMP_UNUSED(glyph)) const +void FontEffectNone::GenerateGlyphTexture(byte* ROCKET_UNUSED(destination_data), const Vector2i& ROCKET_UNUSED(destination_dimensions), int ROCKET_UNUSED(destination_stride), const FontGlyph& ROCKET_UNUSED(glyph)) const { } diff --git a/Source/Core/FontEffectNoneInstancer.cpp b/Source/Core/FontEffectNoneInstancer.cpp index 36c40b38f..969bf8825 100644 --- a/Source/Core/FontEffectNoneInstancer.cpp +++ b/Source/Core/FontEffectNoneInstancer.cpp @@ -41,7 +41,7 @@ FontEffectNoneInstancer::~FontEffectNoneInstancer() } // Instances an outline font effect. -FontEffect* FontEffectNoneInstancer::InstanceFontEffect(const String& EMP_UNUSED(name), const PropertyDictionary& EMP_UNUSED(properties)) +FontEffect* FontEffectNoneInstancer::InstanceFontEffect(const String& ROCKET_UNUSED(name), const PropertyDictionary& ROCKET_UNUSED(properties)) { FontEffectNone* none_effect = new FontEffectNone(); return none_effect; diff --git a/Source/Core/FontEffectOutline.cpp b/Source/Core/FontEffectOutline.cpp index 438bbd152..e37657dc0 100644 --- a/Source/Core/FontEffectOutline.cpp +++ b/Source/Core/FontEffectOutline.cpp @@ -79,7 +79,7 @@ bool FontEffectOutline::Initialise(int _width) } // Resizes and repositions the glyph to fit the outline. -bool FontEffectOutline::GetGlyphMetrics(Vector2i& origin, Vector2i& dimensions, const FontGlyph& EMP_UNUSED(glyph)) const +bool FontEffectOutline::GetGlyphMetrics(Vector2i& origin, Vector2i& dimensions, const FontGlyph& ROCKET_UNUSED(glyph)) const { if (dimensions.x * dimensions.y > 0) { diff --git a/Source/Core/FontEffectOutlineInstancer.cpp b/Source/Core/FontEffectOutlineInstancer.cpp index 9e1934b23..35c6b8570 100644 --- a/Source/Core/FontEffectOutlineInstancer.cpp +++ b/Source/Core/FontEffectOutlineInstancer.cpp @@ -43,7 +43,7 @@ FontEffectOutlineInstancer::~FontEffectOutlineInstancer() } // Instances an outline font effect. -FontEffect* FontEffectOutlineInstancer::InstanceFontEffect(const String& EMP_UNUSED(name), const PropertyDictionary& properties) +FontEffect* FontEffectOutlineInstancer::InstanceFontEffect(const String& ROCKET_UNUSED(name), const PropertyDictionary& properties) { float width = properties.GetProperty("width")->Get< float >(); diff --git a/Source/Core/FontEffectShadow.cpp b/Source/Core/FontEffectShadow.cpp index 66d6bb2a4..66796fb79 100644 --- a/Source/Core/FontEffectShadow.cpp +++ b/Source/Core/FontEffectShadow.cpp @@ -55,7 +55,7 @@ bool FontEffectShadow::HasUniqueTexture() const } // Resizes and repositions the glyph to fit the outline. -bool FontEffectShadow::GetGlyphMetrics(Vector2i& origin, Vector2i& EMP_UNUSED(dimensions), const FontGlyph& EMP_UNUSED(glyph)) const +bool FontEffectShadow::GetGlyphMetrics(Vector2i& origin, Vector2i& ROCKET_UNUSED(dimensions), const FontGlyph& ROCKET_UNUSED(glyph)) const { origin += offset; return true; diff --git a/Source/Core/FontEffectShadowInstancer.cpp b/Source/Core/FontEffectShadowInstancer.cpp index 668b22493..67a4668c5 100644 --- a/Source/Core/FontEffectShadowInstancer.cpp +++ b/Source/Core/FontEffectShadowInstancer.cpp @@ -46,7 +46,7 @@ FontEffectShadowInstancer::~FontEffectShadowInstancer() } // Instances an outline font effect. -FontEffect* FontEffectShadowInstancer::InstanceFontEffect(const String& EMP_UNUSED(name), const PropertyDictionary& properties) +FontEffect* FontEffectShadowInstancer::InstanceFontEffect(const String& ROCKET_UNUSED(name), const PropertyDictionary& properties) { Vector2i offset; offset.x = Math::RealToInteger(properties.GetProperty("offset-x")->Get< float >()); diff --git a/Source/Core/FontFaceHandle.cpp b/Source/Core/FontFaceHandle.cpp index 4a81cf7a9..5f818f465 100644 --- a/Source/Core/FontFaceHandle.cpp +++ b/Source/Core/FontFaceHandle.cpp @@ -252,8 +252,8 @@ int FontFaceHandle::GenerateString(GeometryList& geometry, const WString& string int geometry_index = 0; int line_width = 0; - EMP_ASSERT(layer_configuration_index >= 0); - EMP_ASSERT(layer_configuration_index < (int) layer_configurations.size()); + ROCKET_ASSERT(layer_configuration_index >= 0); + ROCKET_ASSERT(layer_configuration_index < (int) layer_configurations.size()); // Fetch the requested configuration and generate the geometry for each one. const LayerConfiguration& layer_configuration = layer_configurations[layer_configuration_index]; diff --git a/Source/Core/FontFaceLayer.cpp b/Source/Core/FontFaceLayer.cpp index deae4bebf..8e2259221 100644 --- a/Source/Core/FontFaceLayer.cpp +++ b/Source/Core/FontFaceLayer.cpp @@ -220,8 +220,8 @@ const FontEffect* FontFaceLayer::GetFontEffect() const // Returns on the layer's textures. const Texture* FontFaceLayer::GetTexture(int index) { - EMP_ASSERT(index >= 0); - EMP_ASSERT(index < GetNumTextures()); + ROCKET_ASSERT(index >= 0); + ROCKET_ASSERT(index < GetNumTextures()); return &(textures[index]); } diff --git a/Source/Core/LayoutBlockBox.cpp b/Source/Core/LayoutBlockBox.cpp index ec15a7637..66f340ee8 100644 --- a/Source/Core/LayoutBlockBox.cpp +++ b/Source/Core/LayoutBlockBox.cpp @@ -276,7 +276,7 @@ LayoutBlockBox::CloseResult LayoutBlockBox::Close() // Called by a closing block box child. bool LayoutBlockBox::CloseBlockBox(LayoutBlockBox* child) { - EMP_ASSERT(context == BLOCK); + ROCKET_ASSERT(context == BLOCK); box_cursor = (child->GetPosition().y - child->box.GetEdge(Box::MARGIN, Box::TOP) - (box.GetPosition().y + position.y)) + child->GetBox().GetSize(Box::MARGIN).y; return CatchVerticalOverflow(); @@ -285,7 +285,7 @@ bool LayoutBlockBox::CloseBlockBox(LayoutBlockBox* child) // Called by a closing line box child. LayoutInlineBox* LayoutBlockBox::CloseLineBox(LayoutLineBox* child, LayoutInlineBox* overflow, LayoutInlineBox* overflow_chain) { - EMP_ASSERT(context == INLINE); + ROCKET_ASSERT(context == INLINE); if (child->GetDimensions().x > 0) box_cursor = (child->GetPosition().y - (box.GetPosition().y + position.y)) + child->GetDimensions().y; @@ -313,7 +313,7 @@ LayoutInlineBox* LayoutBlockBox::CloseLineBox(LayoutLineBox* child, LayoutInline // Adds a new block element to this block box. LayoutBlockBox* LayoutBlockBox::AddBlockElement(Element* element) { - EMP_ASSERT(context == BLOCK); + ROCKET_ASSERT(context == BLOCK); // Check if our most previous block box is rendering in an inline context. if (!block_boxes.empty() && @@ -424,7 +424,7 @@ bool LayoutBlockBox::AddFloatElement(Element* element) // Adds an element to this block box to be handled as an absolutely-positioned element. void LayoutBlockBox::AddAbsoluteElement(Element* element) { - EMP_ASSERT(context == BLOCK); + ROCKET_ASSERT(context == BLOCK); AbsoluteElement absolute_element; absolute_element.element = element; diff --git a/Source/Core/LayoutEngine.cpp b/Source/Core/LayoutEngine.cpp index 8a63faa98..09d1432de 100644 --- a/Source/Core/LayoutEngine.cpp +++ b/Source/Core/LayoutEngine.cpp @@ -263,7 +263,7 @@ float LayoutEngine::Round(float value) void* LayoutEngine::AllocateLayoutChunk(size_t size) { (size); - EMP_ASSERT(size <= LayoutChunk::size); + ROCKET_ASSERT(size <= LayoutChunk::size); return layout_chunk_pool.AllocateObject(); } @@ -313,7 +313,7 @@ bool LayoutEngine::FormatElement(Element* element) case DISPLAY_BLOCK: return FormatElementBlock(element); break; case DISPLAY_INLINE: return FormatElementInline(element); break; case DISPLAY_INLINE_BLOCK: FormatElementReplaced(element); break; - default: EMP_ERROR; + default: ROCKET_ERROR; } return true; @@ -428,7 +428,7 @@ Vector2f LayoutEngine::GetContainingBlock(const LayoutBlockBox* containing_box) containing_box = containing_box->GetParent(); if (containing_box == NULL) { - EMP_ERROR; + ROCKET_ERROR; containing_block.y = 0; } } diff --git a/Source/Core/LayoutInlineBox.cpp b/Source/Core/LayoutInlineBox.cpp index e7f7cd151..5fe12e3d6 100644 --- a/Source/Core/LayoutInlineBox.cpp +++ b/Source/Core/LayoutInlineBox.cpp @@ -129,7 +129,7 @@ void LayoutInlineBox::Close() chain->Close(); else { - EMP_ASSERT(line != NULL); + ROCKET_ASSERT(line != NULL); line->CloseInlineBox(this); } } @@ -151,7 +151,7 @@ bool LayoutInlineBox::IsLastChild() const } // Flows the inline box's content into its parent line. -LayoutInlineBox* LayoutInlineBox::FlowContent(bool EMP_UNUSED(first_box), float EMP_UNUSED(available_width), float EMP_UNUSED(right_spacing_width)) +LayoutInlineBox* LayoutInlineBox::FlowContent(bool ROCKET_UNUSED(first_box), float ROCKET_UNUSED(available_width), float ROCKET_UNUSED(right_spacing_width)) { // If we're representing a sized element, then add our element's width onto our parent's. if (parent != NULL && diff --git a/Source/Core/LayoutInlineBoxText.cpp b/Source/Core/LayoutInlineBoxText.cpp index 3f5db60e7..6d4e8618c 100644 --- a/Source/Core/LayoutInlineBoxText.cpp +++ b/Source/Core/LayoutInlineBoxText.cpp @@ -60,7 +60,7 @@ bool LayoutInlineBoxText::CanOverflow() const LayoutInlineBox* LayoutInlineBoxText::FlowContent(bool first_box, float available_width, float right_spacing_width) { ElementText* text_element = GetTextElement(); - EMP_ASSERT(text_element != NULL); + ROCKET_ASSERT(text_element != NULL); int line_length; float line_width; @@ -122,7 +122,7 @@ void LayoutInlineBoxText::PositionElement() } // Sizes the inline box's element. -void LayoutInlineBoxText::SizeElement(bool EMP_UNUSED(split)) +void LayoutInlineBoxText::SizeElement(bool ROCKET_UNUSED(split)) { } @@ -146,7 +146,7 @@ ElementText* LayoutInlineBoxText::GetTextElement() void LayoutInlineBoxText::BuildWordBox() { ElementText* text_element = GetTextElement(); - EMP_ASSERT(text_element != NULL); + ROCKET_ASSERT(text_element != NULL); FontFaceHandle* font_face_handle = text_element->GetFontFaceHandle(); if (font_face_handle == NULL) diff --git a/Source/Core/LayoutLineBox.cpp b/Source/Core/LayoutLineBox.cpp index 677764b3e..bfa357427 100644 --- a/Source/Core/LayoutLineBox.cpp +++ b/Source/Core/LayoutLineBox.cpp @@ -186,7 +186,7 @@ LayoutInlineBox* LayoutLineBox::Close(LayoutInlineBox* overflow) // Closes one of the line box's inline boxes. void LayoutLineBox::CloseInlineBox(LayoutInlineBox* inline_box) { - EMP_ASSERT(open_inline_box == inline_box); + ROCKET_ASSERT(open_inline_box == inline_box); open_inline_box = inline_box->GetParent(); box_cursor += GetSpacing(inline_box->GetBox(), Box::RIGHT); diff --git a/Source/Core/Log.cpp b/Source/Core/Log.cpp index 06e5b6993..1965827ba 100644 --- a/Source/Core/Log.cpp +++ b/Source/Core/Log.cpp @@ -28,7 +28,7 @@ #include "precompiled.h" #include #include -#ifdef EMP_PLATFORM_WIN32 +#ifdef ROCKET_PLATFORM_WIN32 #include #endif @@ -92,7 +92,7 @@ void Log::ParseError(const String& filename, int line_number, const char* fmt, . // Low-level platform message. void Log::PlatformMessage(const char *message) { -#ifdef EMP_PLATFORM_WIN32 +#ifdef ROCKET_PLATFORM_WIN32 OutputDebugStringA(message); OutputDebugStringA("\r\n"); #else diff --git a/Source/Core/Math.cpp b/Source/Core/Math.cpp index 9d8985b07..16ecb8d94 100644 --- a/Source/Core/Math.cpp +++ b/Source/Core/Math.cpp @@ -144,7 +144,7 @@ ROCKETCORE_API int RoundDown(float value) // Efficiently truncates a floating-point value into an integer. ROCKETCORE_API int RealToInteger(float value) { -#if defined EMP_PLATFORM_WIN32 +#if defined ROCKET_PLATFORM_WIN32 int i; _asm { diff --git a/Source/Core/Plugin.cpp b/Source/Core/Plugin.cpp index 919d8aba1..0b0449296 100644 --- a/Source/Core/Plugin.cpp +++ b/Source/Core/Plugin.cpp @@ -44,38 +44,38 @@ void Plugin::OnShutdown() } // Called when a new context is created. -void Plugin::OnContextCreate(Context* EMP_UNUSED(context)) +void Plugin::OnContextCreate(Context* ROCKET_UNUSED(context)) { } // Called when a context is destroyed. -void Plugin::OnContextDestroy(Context* EMP_UNUSED(context)) +void Plugin::OnContextDestroy(Context* ROCKET_UNUSED(context)) { } // Called when a document load request occurs, before the document's file is opened. -void Plugin::OnDocumentOpen(Context* EMP_UNUSED(context), const String& EMP_UNUSED(document_path)) +void Plugin::OnDocumentOpen(Context* ROCKET_UNUSED(context), const String& ROCKET_UNUSED(document_path)) { } // Called when a document is successfully loaded from file or instanced, initialised and added to // its context. -void Plugin::OnDocumentLoad(ElementDocument* EMP_UNUSED(document)) +void Plugin::OnDocumentLoad(ElementDocument* ROCKET_UNUSED(document)) { } // Called when a document is unloaded from its context. -void Plugin::OnDocumentUnload(ElementDocument* EMP_UNUSED(document)) +void Plugin::OnDocumentUnload(ElementDocument* ROCKET_UNUSED(document)) { } // Called when a new element is created. -void Plugin::OnElementCreate(Element* EMP_UNUSED(element)) +void Plugin::OnElementCreate(Element* ROCKET_UNUSED(element)) { } // Called when an element is destroyed. -void Plugin::OnElementDestroy(Element* EMP_UNUSED(element)) +void Plugin::OnElementDestroy(Element* ROCKET_UNUSED(element)) { } diff --git a/Source/Core/Pool.h b/Source/Core/Pool.h index 9944ae47e..a70fb5829 100644 --- a/Source/Core/Pool.h +++ b/Source/Core/Pool.h @@ -68,7 +68,7 @@ class Pool /// node this iterator references is invalid. inline void operator++() { - EMP_ASSERT(node != NULL); + ROCKET_ASSERT(node != NULL); node = node->next; } /// Returns true if it is OK to deference or increment this diff --git a/Source/Core/Pool.inl b/Source/Core/Pool.inl index e90102aa2..51dcdebf2 100644 --- a/Source/Core/Pool.inl +++ b/Source/Core/Pool.inl @@ -1,11 +1,27 @@ /* - * Copyright (c) 2006 - 2008 - * Wandering Monster Studios Limited + * This source file is part of libRocket, the HTML/CSS Interface Middleware * - * Any use of this program is governed by the terms of Wandering Monster - * Studios Limited's Licence Agreement included with this program, a copy - * of which can be obtained by contacting Wandering Monster Studios - * Limited at info@wanderingmonster.co.nz. + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. * */ @@ -133,7 +149,7 @@ void Pool< PoolType >::DeallocateObject(Iterator& iterator) previous_object->next = next_object; else { - EMP_ASSERT(first_allocated_node == object); + ROCKET_ASSERT(first_allocated_node == object); first_allocated_node = next_object; } diff --git a/Source/Core/PropertyParserColour.cpp b/Source/Core/PropertyParserColour.cpp index c8a280c16..aee760f97 100644 --- a/Source/Core/PropertyParserColour.cpp +++ b/Source/Core/PropertyParserColour.cpp @@ -59,7 +59,7 @@ PropertyParserColour::~PropertyParserColour() } // Called to parse a RCSS colour declaration. -bool PropertyParserColour::ParseValue(Property& property, const String& value, const ParameterMap& EMP_UNUSED(parameters)) const +bool PropertyParserColour::ParseValue(Property& property, const String& value, const ParameterMap& ROCKET_UNUSED(parameters)) const { if (value.Empty()) return false; diff --git a/Source/Core/PropertyParserNumber.cpp b/Source/Core/PropertyParserNumber.cpp index b5973571c..5e7aca52c 100644 --- a/Source/Core/PropertyParserNumber.cpp +++ b/Source/Core/PropertyParserNumber.cpp @@ -43,7 +43,7 @@ PropertyParserNumber::~PropertyParserNumber() } // Called to parse a RCSS number declaration. -bool PropertyParserNumber::ParseValue(Property& property, const String& value, const ParameterMap& EMP_UNUSED(parameters)) const +bool PropertyParserNumber::ParseValue(Property& property, const String& value, const ParameterMap& ROCKET_UNUSED(parameters)) const { // Default to a simple number. property.unit = Property::NUMBER; diff --git a/Source/Core/PropertyParserString.cpp b/Source/Core/PropertyParserString.cpp index 7366321b7..1e6fe9659 100644 --- a/Source/Core/PropertyParserString.cpp +++ b/Source/Core/PropertyParserString.cpp @@ -40,7 +40,7 @@ PropertyParserString::~PropertyParserString() } // Called to parse a RCSS string declaration. -bool PropertyParserString::ParseValue(Property& property, const String& value, const ParameterMap& EMP_UNUSED(parameters)) const +bool PropertyParserString::ParseValue(Property& property, const String& value, const ParameterMap& ROCKET_UNUSED(parameters)) const { property.value = Variant(value); property.unit = Property::STRING; diff --git a/Source/Core/Python/ContextDocumentProxy.cpp b/Source/Core/Python/ContextDocumentProxy.cpp index c523a7a29..333a343a9 100644 --- a/Source/Core/Python/ContextDocumentProxy.cpp +++ b/Source/Core/Python/ContextDocumentProxy.cpp @@ -27,8 +27,8 @@ #include "precompiled.h" #include "ContextDocumentProxy.h" -#include -#include +#include +#include #include namespace Rocket { @@ -56,7 +56,7 @@ class ContextDocumentIndexAccessor class ContextDocumentNameAccessor { public: - ElementDocument* operator()(ContextDocumentProxy& proxy, const EMP::Core::String& name) + ElementDocument* operator()(ContextDocumentProxy& proxy, const Rocket::Core::String& name) { return proxy.context->GetDocument(name); } @@ -70,7 +70,7 @@ ContextDocumentProxy::ContextDocumentProxy(Context* _context) void ContextDocumentProxy::InitialisePythonInterface() { python::class_< ContextDocumentProxy >("documentproxy", python::no_init) - .def(EMP::Core::Python::NameIndexInterface< ContextDocumentProxy, ContextDocumentLenAccessor, ContextDocumentIndexAccessor, ContextDocumentNameAccessor >()) + .def(Rocket::Core::Python::NameIndexInterface< ContextDocumentProxy, ContextDocumentLenAccessor, ContextDocumentIndexAccessor, ContextDocumentNameAccessor >()) ; } diff --git a/Source/Core/Python/ContextInstancer.cpp b/Source/Core/Python/ContextInstancer.cpp index c2df675ec..04d71c7db 100644 --- a/Source/Core/Python/ContextInstancer.cpp +++ b/Source/Core/Python/ContextInstancer.cpp @@ -27,7 +27,7 @@ #include "precompiled.h" #include "ContextInstancer.h" -#include +#include namespace Rocket { namespace Core { @@ -45,7 +45,7 @@ ContextInstancer::~ContextInstancer() } // Instances a context. -Context* ContextInstancer::InstanceContext(const EMP::Core::String& name) +Context* ContextInstancer::InstanceContext(const Rocket::Core::String& name) { // Put the arguments into a tuple. PyObject* args = PyTuple_New(1); @@ -56,7 +56,7 @@ Context* ContextInstancer::InstanceContext(const EMP::Core::String& name) Py_DECREF(args); // Rebind the target element. - Context* context = python::extract< Context* >(EMP::Core::Python::Utilities::MakeObject(instance)); + Context* context = python::extract< Context* >(Rocket::Core::Python::Utilities::MakeObject(instance)); if (context != NULL) { // The wrapper will remove the initial C++ reference (as the object may have been made in Python), so we have @@ -69,7 +69,7 @@ Context* ContextInstancer::InstanceContext(const EMP::Core::String& name) } // Releases a context previously created by this context. -void ContextInstancer::ReleaseContext(Context* EMP_UNUSED(context)) +void ContextInstancer::ReleaseContext(Context* ROCKET_UNUSED(context)) { } diff --git a/Source/Core/Python/ContextInstancer.h b/Source/Core/Python/ContextInstancer.h index a544828f1..981d01551 100644 --- a/Source/Core/Python/ContextInstancer.h +++ b/Source/Core/Python/ContextInstancer.h @@ -49,7 +49,7 @@ class ContextInstancer : public Rocket::Core::ContextInstancer /// Instances a context. /// @param[in] name Name of this context. /// @return The instanced context. - virtual Context* InstanceContext(const EMP::Core::String& name); + virtual Context* InstanceContext(const Rocket::Core::String& name); /// Releases a context previously created by this context. /// @param[in] context The context to release. diff --git a/Source/Core/Python/ContextInterface.cpp b/Source/Core/Python/ContextInterface.cpp index 717af7d7b..ebeef3b2e 100644 --- a/Source/Core/Python/ContextInterface.cpp +++ b/Source/Core/Python/ContextInterface.cpp @@ -28,8 +28,8 @@ #include "precompiled.h" #include "ContextInterface.h" -#include -#include +#include +#include #include #include @@ -47,7 +47,7 @@ bool ContextInterface::InitialisePythonInterface() { ContextDocumentProxy::InitialisePythonInterface(); - py_context = python::class_< Context, EMP::Core::Python::Wrapper< Context, const EMP::Core::String& >, boost::noncopyable>("Context", python::init< const EMP::Core::String& >()) + py_context = python::class_< Context, Rocket::Core::Python::Wrapper< Context, const Rocket::Core::String& >, boost::noncopyable>("Context", python::init< const Rocket::Core::String& >()) .def("AddEventListener", &ContextInterface::AddEventListener) .def("AddMouseCursor", &Context::AddMouseCursor, python::return_value_policy< python::return_by_value >()) .def("CreateDocument", &ContextInterface::CreateDocument) @@ -92,7 +92,7 @@ python::object ContextInterface::CreateDocument(Context* self, const char* tag) return python::object(); // Remove the C++ caller reference and add a Python one to replace it. - python::object py_document = EMP::Core::Python::Utilities::MakeObject(document); + python::object py_document = Rocket::Core::Python::Utilities::MakeObject(document); document->RemoveReference(); return py_document; @@ -106,7 +106,7 @@ python::object ContextInterface::LoadDocument(Context* self, const char* documen return python::object(); // Remove the C++ caller reference and return the python::object - python::object py_document = EMP::Core::Python::Utilities::MakeObject(document); + python::object py_document = Rocket::Core::Python::Utilities::MakeObject(document); document->RemoveReference(); return py_document; @@ -120,7 +120,7 @@ python::object ContextInterface::LoadDocumentFromMemory(Context* self, const cha return python::object(); // Remove the C++ caller reference and return the python::object - python::object py_document = EMP::Core::Python::Utilities::MakeObject(document); + python::object py_document = Rocket::Core::Python::Utilities::MakeObject(document); document->RemoveReference(); return py_document; @@ -134,7 +134,7 @@ python::object ContextInterface::LoadMouseCursor(Context* self, const char* docu return python::object(); // Remove the C++ caller reference and add a Python one to replace it. - python::object py_document = EMP::Core::Python::Utilities::MakeObject(document); + python::object py_document = Rocket::Core::Python::Utilities::MakeObject(document); document->RemoveReference(); return py_document; diff --git a/Source/Core/Python/ContextProxy.cpp b/Source/Core/Python/ContextProxy.cpp index 5d54ef414..dc07ce987 100644 --- a/Source/Core/Python/ContextProxy.cpp +++ b/Source/Core/Python/ContextProxy.cpp @@ -27,8 +27,8 @@ #include "precompiled.h" #include "ContextProxy.h" -#include -#include +#include +#include #include namespace Rocket { @@ -38,7 +38,7 @@ namespace Python { class ContextLenAccessor { public: - int operator()(ContextProxy& EMP_UNUSED(proxy)) + int operator()(ContextProxy& ROCKET_UNUSED(proxy)) { return GetNumContexts(); } @@ -47,7 +47,7 @@ class ContextLenAccessor class ContextIndexAccessor { public: - Context* operator()(ContextProxy& EMP_UNUSED(proxy), int index) + Context* operator()(ContextProxy& ROCKET_UNUSED(proxy), int index) { return GetContext(index); } @@ -56,7 +56,7 @@ class ContextIndexAccessor class ContextNameAccessor { public: - Context* operator()(ContextProxy& EMP_UNUSED(proxy), const EMP::Core::String& name) + Context* operator()(ContextProxy& ROCKET_UNUSED(proxy), const Rocket::Core::String& name) { return GetContext(name); } @@ -65,7 +65,7 @@ class ContextNameAccessor void ContextProxy::InitialisePythonInterface() { python::class_< ContextProxy >("contextproxy", python::no_init) - .def(EMP::Core::Python::NameIndexInterface< ContextProxy, ContextLenAccessor, ContextIndexAccessor, ContextNameAccessor >()) + .def(Rocket::Core::Python::NameIndexInterface< ContextProxy, ContextLenAccessor, ContextIndexAccessor, ContextNameAccessor >()) ; } diff --git a/Source/Core/Python/Converters.cpp b/Source/Core/Python/Converters.cpp index 80a65d702..ce4313c1c 100644 --- a/Source/Core/Python/Converters.cpp +++ b/Source/Core/Python/Converters.cpp @@ -27,9 +27,9 @@ #include "precompiled.h" -#include -#include -#include +#include +#include +#include #include #include "EventListener.h" @@ -40,6 +40,152 @@ namespace Rocket { namespace Core { namespace Python { +// Boost helper class for converting from Variant to a python object +struct VariantConverter +{ + VariantConverter() + { + // Register custom Variant to python converter + boost::python::to_python_converter< Variant, VariantConverter >(); + boost::python::to_python_converter< Variant*, VariantConverter >(); + + // Register the python to variant converter + boost::python::converter::registry::push_back(&Convertible, &Construct, boost::python::type_id< Variant >()); + } + + static PyObject* convert(Variant* variant) + { + if (!variant) + { + Py_INCREF(Py_None); + return Py_None; + } + return convert(*variant); + } + + static PyObject* convert(const Variant& variant) + { + PyObject* object = NULL; + + switch (variant.GetType()) + { + case Variant::STRING: + { + object = PyString_FromString(variant.Get< String >().CString()); + } + break; + + case Variant::INT: + { + object = PyInt_FromLong(variant.Get< int >()); + } + break; + + case Variant::WORD: + { + object = PyInt_FromLong(variant.Get< word >()); + } + break; + + case Variant::FLOAT: + { + object = PyFloat_FromDouble(variant.Get< float >()); + } + break; + + case Variant::VECTOR2: + { + python::object o(variant.Get< Vector2f >()); + object = o.ptr(); + Py_INCREF( object ); + } + break; + + case Variant::SCRIPTINTERFACE: + { + object = (PyObject*)(variant.Get< ScriptInterface* >())->GetScriptObject(); + Py_INCREF(object); + } + break; + + default: + { + object = Py_None; + Py_INCREF(object); + } + break; + } + + return object; + } + + static void* Convertible(PyObject* object) + { + if (!PyString_Check(object) && !PyInt_Check(object) && !PyFloat_Check(object)) + return 0; + return object; + } + + static void Construct(PyObject* object, boost::python::converter::rvalue_from_python_stage1_data* data) + { + void* storage = ((boost::python::converter::rvalue_from_python_storage< Variant >*)data)->storage.bytes; + Variant* variant = new (storage) Variant(); + + if (PyString_Check(object)) + { + variant->Set(String(PyString_AsString(object))); + } + else if (PyInt_Check(object)) + { + variant->Set((int)PyInt_AsLong(object)); + } + else if (PyFloat_Check(object)) + { + variant->Set((float)PyFloat_AsDouble(object)); + } + else + { + boost::python::throw_error_already_set(); + return; + } + + data->convertible = storage; + } +}; + +// String Converter +struct StringConverter +{ + StringConverter() + { + boost::python::to_python_converter< String, StringConverter >(); + + boost::python::converter::registry::push_back( &Convertible, &Construct, boost::python::type_id< String >() ); + } + + static PyObject* convert(const String& s) + { + return boost::python::incref(boost::python::object(s.CString()).ptr()); + } + + static void* Convertible(PyObject* obj_ptr) + { + if (!PyString_Check(obj_ptr)) + return 0; + return obj_ptr; + } + + static void Construct(PyObject* obj_ptr, boost::python::converter::rvalue_from_python_stage1_data* data) + { + const char* value = PyString_AsString(obj_ptr); + if (value == 0) + boost::python::throw_error_already_set(); + void* storage = ((boost::python::converter::rvalue_from_python_storage< String >*)data)->storage.bytes; + new (storage) String(value); + data->convertible = storage; + } +}; + // Helper class for converting from python to an event listener struct EventListenerFromPython { @@ -56,10 +202,16 @@ struct EventListenerFromPython void RegisterPythonConverters() { + StringConverter(); + VariantConverter(); + + ConverterScriptObject< ScriptInterface >(); + EventListenerFromPython(); - EMP::Core::Python::ConverterScriptObject< Context, true >(); - EMP::Core::Python::ConverterScriptObject< Element, true >(); - EMP::Core::Python::ConverterScriptObject< ElementDocument, true >(); + + ConverterScriptObject< Context >(); + ConverterScriptObject< Element >(); + ConverterScriptObject< ElementDocument >(); } } diff --git a/Source/Core/Python/DataSourceWrapper.cpp b/Source/Core/Python/DataSourceWrapper.cpp new file mode 100644 index 000000000..4153f8c50 --- /dev/null +++ b/Source/Core/Python/DataSourceWrapper.cpp @@ -0,0 +1,191 @@ +/* + * This source file is part of libRocket, the HTML/CSS Interface Middleware + * + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +#include "precompiled.h" +#include "DataSourceWrapper.h" +#include +#include + +namespace EMP { +namespace Core { +namespace Python { + +DataSourceWrapper::DataSourceWrapper(PyObject* _self, const char* name) : DataSource(name) +{ + self = _self; +} + +DataSourceWrapper::~DataSourceWrapper() +{ +} + +void DataSourceWrapper::InitialisePythonInterface() +{ + void (DataSourceWrapper::*NotifyRowChange)(const String&) = &DataSourceWrapper::NotifyRowChange; + void (DataSourceWrapper::*NotifyRowChangeParams)(const String&, int, int) = &DataSourceWrapper::NotifyRowChange; + + python::scope datasource_scope = python::class_("DataSource", python::init< const char* >()) + .def("NotifyRowAdd", &DataSourceWrapper::NotifyRowAdd) + .def("NotifyRowRemove", &DataSourceWrapper::NotifyRowRemove) + .def("NotifyRowChange", NotifyRowChange) + .def("NotifyRowChange", NotifyRowChangeParams) + ; + + // Register the column names for use in python + python::scope().attr("COLUMN_CHILD_SOURCE") = DataSource::CHILD_SOURCE; + python::scope().attr("COLUMN_DEPTH") = DataSource::DEPTH; + python::scope().attr("COLUMN_NUM_CHILDREN") = DataSource::NUM_CHILDREN; +} + +void DataSourceWrapper::GetRow(StringList& row, const String& table, int row_index, const StringList& columns) +{ + PyObject* callable = PyObject_GetAttrString(self, "GetRow"); + if (!callable) + { + Core::String error_message(128, "Function \"GetRow\" not found on python data source %s.", Utilities::GetPythonClassName(self).CString()); + Log::Message(LC_COREPYTHON, Log::LT_WARNING, "%s", error_message.CString()); + PyErr_SetString(PyExc_RuntimeError, error_message.CString()); + python::throw_error_already_set(); + return; + } + + python::tuple t = python::make_tuple(table.CString(), row_index, columns); + PyObject* result = PyObject_CallObject(callable, t.ptr()); + Py_DECREF(callable); + + // If it's a list, then just get the entries out of it + if (result && PyList_Check(result)) + { + int num_entries = PyList_Size(result); + for (int i = 0; i < num_entries; i++) + { + Core::String entry; + + PyObject* entry_object = PyList_GetItem(result, i); + if (PyString_Check(entry_object)) + { + entry = PyString_AS_STRING(entry_object); + } + else if (PyInt_Check(entry_object)) + { + int entry_int = (int)PyInt_AS_LONG(entry_object); + Core::TypeConverter< int, Core::String >::Convert(entry_int, entry); + } + else if (PyFloat_Check(entry_object)) + { + float entry_float = (float)PyFloat_AS_DOUBLE(entry_object); + Core::TypeConverter< float, Core::String >::Convert(entry_float, entry); + } + else + { + Core::String error_message(128, "Failed to convert row %d entry %d on data source %s.", row_index, i, Utilities::GetPythonClassName(self).CString()); + Log::Message(LC_COREPYTHON, Log::LT_WARNING, "%s", error_message.CString()); + PyErr_SetString(PyExc_RuntimeError, error_message.CString()); + python::throw_error_already_set(); + } + + row.push_back(entry); + } + } + else + { + // Print the error and restore it to the caller + PyObject *type, *value, *traceback; + PyErr_Fetch(&type, &value, &traceback); + Py_XINCREF(type); + Py_XINCREF(value); + Py_XINCREF(traceback); + + Core::String error_message(128, "Failed to get entries for table %s row %d from python data source %s.", table.CString(), row_index, Utilities::GetPythonClassName(self).CString()); + Log::Message(LC_COREPYTHON, Log::LT_WARNING, "%s", error_message.CString()); + if (type == NULL) + PyErr_SetString(PyExc_RuntimeError, error_message.CString()); + else + PyErr_Restore(type, value, traceback); + + python::throw_error_already_set(); + } + + if (result) + Py_DECREF(result); +} + +int DataSourceWrapper::GetNumRows(const String& table) +{ + int num_rows = 0; + + PyObject* callable = PyObject_GetAttrString(self, "GetNumRows"); + if (!callable) + { + Core::String error_message(128, "Function \"GetNumRows\" not found on python data source %s.", Utilities::GetPythonClassName(self).CString()); + Log::Message(LC_COREPYTHON, Log::LT_WARNING, "%s", error_message.CString()); + PyErr_SetString(PyExc_RuntimeError, error_message.CString()); + python::throw_error_already_set(); + + return 0; + } + + PyObject* result = PyObject_CallObject(callable, python::make_tuple(table.CString()).ptr()); + Py_DECREF(callable); + + if (result && PyInt_Check(result)) + { + num_rows = PyInt_AsLong(result); + } + else + { + // Print the error and restore it to the caller + PyObject *type, *value, *traceback; + PyErr_Fetch(&type, &value, &traceback); + Py_XINCREF(type); + Py_XINCREF(value); + Py_XINCREF(traceback); + + Core::String error_message(128, "Failed to get number of rows from python data source %s.", Utilities::GetPythonClassName(self).CString()); + Log::Message(LC_COREPYTHON, Log::LT_WARNING, "%s", error_message.CString()); + if (type == NULL) + PyErr_SetString(PyExc_RuntimeError, error_message.CString()); + else + PyErr_Restore(type, value, traceback); + + python::throw_error_already_set(); + } + + if (result) + Py_DECREF(result); + + return num_rows; +} + +ScriptObject DataSourceWrapper::GetScriptObject() const +{ + return self; +} + +} +} +} diff --git a/Source/Core/Python/DataSourceWrapper.h b/Source/Core/Python/DataSourceWrapper.h new file mode 100644 index 000000000..fd61c0ad4 --- /dev/null +++ b/Source/Core/Python/DataSourceWrapper.h @@ -0,0 +1,68 @@ +/* + * This source file is part of libRocket, the HTML/CSS Interface Middleware + * + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +#ifndef EMPCOREPYTHONDATASOURCEWRAPPER_H +#define EMPCOREPYTHONDATASOURCEWRAPPER_H + +#include +#include +#include + +namespace EMP { +namespace Core { +namespace Python { + +/** + Python DataSource Wrapper + + Exposes a DataSource to python. + + @author Lloyd Weehuizen + */ + +class DataSourceWrapper : public DataSource +{ + public: + DataSourceWrapper(PyObject* self, const char* name); + ~DataSourceWrapper(); + + static void InitialisePythonInterface(); + + void GetRow(StringList& row, const String& table, int row_index, const StringList& columns); + int GetNumRows(const String& table); + + virtual ScriptObject GetScriptObject() const; + + private: + PyObject* self; +}; + +} +} +} + +#endif diff --git a/Source/Core/Python/ElementAttributeProxy.cpp b/Source/Core/Python/ElementAttributeProxy.cpp index 0c39a9f03..25884eb75 100644 --- a/Source/Core/Python/ElementAttributeProxy.cpp +++ b/Source/Core/Python/ElementAttributeProxy.cpp @@ -69,8 +69,8 @@ ElementAttributeProxy::AttributeProxy ElementAttributeProxy::GetItem(int index) index = element->GetNumAttributes() + index; } - EMP::Core::String name; - EMP::Core::String value; + Rocket::Core::String name; + Rocket::Core::String value; // Throw exception if we're out of range, this is required to support python iteration if (!element->IterateAttributes(index, name, value)) diff --git a/Source/Core/Python/ElementAttributeProxy.h b/Source/Core/Python/ElementAttributeProxy.h index b0149d98a..cc8ca7a87 100644 --- a/Source/Core/Python/ElementAttributeProxy.h +++ b/Source/Core/Python/ElementAttributeProxy.h @@ -55,11 +55,11 @@ class ElementAttributeProxy class AttributeProxy { public: - AttributeProxy(const EMP::Core::String& _name, const EMP::Core::String& _value) : name(_name), value(_value) {} + AttributeProxy(const Rocket::Core::String& _name, const Rocket::Core::String& _value) : name(_name), value(_value) {} const char* GetName() { return name.CString(); } const char* GetValue() { return value.CString(); } - EMP::Core::String name; - EMP::Core::String value; + Rocket::Core::String name; + Rocket::Core::String value; }; /// Python __getitem__ override diff --git a/Source/Core/Python/ElementDocumentWrapper.cpp b/Source/Core/Python/ElementDocumentWrapper.cpp index ace5185e2..cca252e1d 100644 --- a/Source/Core/Python/ElementDocumentWrapper.cpp +++ b/Source/Core/Python/ElementDocumentWrapper.cpp @@ -27,8 +27,8 @@ #include "precompiled.h" #include "ElementDocumentWrapper.h" -#include -#include +#include +#include namespace Rocket { namespace Core { @@ -36,7 +36,7 @@ namespace Python { ElementDocumentWrapper::ElementDocumentWrapper(PyObject* self, const char* tag) : ElementWrapper< ElementDocument >(self, tag) { - EMP::Core::String module_id(32, "document_%x", this); + Rocket::Core::String module_id(32, "document_%x", this); // Create a new module module = PyModule_New(module_id.CString()); @@ -54,19 +54,19 @@ ElementDocumentWrapper::~ElementDocumentWrapper() Py_DECREF(module); } -void ElementDocumentWrapper::LoadScript(EMP::Core::Stream* stream, const EMP::Core::String& source_name) +void ElementDocumentWrapper::LoadScript(Rocket::Core::Stream* stream, const Rocket::Core::String& source_name) { // If theres a source, check if the code is already loaded and just reuse it if (!source_name.Empty()) { - EMP::Core::String module_name = EMP::Core::String(source_name).Replace("/", "_"); + Rocket::Core::String module_name = Rocket::Core::String(source_name).Replace("/", "_"); module_name = module_name.Replace("\\", "_"); module_name = module_name.Replace(".py", ""); PyObject* modules = PyImport_GetModuleDict(); PyObject* merge_module = PyDict_GetItemString(modules, module_name.CString()); -#ifdef EMP_DEBUG +#ifdef ROCKET_DEBUG // In debug builds, force module to NULL so that scripts are always reloaded merge_module = NULL; #else @@ -79,7 +79,7 @@ void ElementDocumentWrapper::LoadScript(EMP::Core::Stream* stream, const EMP::Co if (!merge_module) { // Compile the code as a python module - EMP::Core::String source_buffer; + Rocket::Core::String source_buffer; PreprocessCode(source_buffer, stream); PyObject* code = Py_CompileString(source_buffer.CString(), source_name.CString(), Py_file_input); @@ -98,19 +98,19 @@ void ElementDocumentWrapper::LoadScript(EMP::Core::Stream* stream, const EMP::Co } else { - EMP::Core::Python::Utilities::PrintError(); + Rocket::Core::Python::Utilities::PrintError(); } } else { // Compile directly onto the python module - EMP::Core::String source_buffer; + Rocket::Core::String source_buffer; PreprocessCode(source_buffer, stream); PyObject* result = PyRun_String(source_buffer.CString(), Py_file_input, module_namespace, module_namespace); if ( !result ) { - EMP::Core::Python::Utilities::PrintError(); + Rocket::Core::Python::Utilities::PrintError(); } else { @@ -124,10 +124,10 @@ PyObject* ElementDocumentWrapper::GetModuleNamespace() return module_namespace; } -void ElementDocumentWrapper::PreprocessCode(EMP::Core::String &code, EMP::Core::Stream *stream) +void ElementDocumentWrapper::PreprocessCode(Rocket::Core::String &code, Rocket::Core::Stream *stream) { // Load in the script - EMP::Core::String buffer; + Rocket::Core::String buffer; stream->Read(buffer, stream->Length()); // Strip comments and build up code @@ -157,7 +157,7 @@ void ElementDocumentWrapper::PreprocessCode(EMP::Core::String &code, EMP::Core:: // Check for the start of comments or non whitespace data if (buffer[i] == '#') state = COMMENT; - else if (!EMP::Core::StringUtilities::IsWhitespace(buffer[i])) + else if (!Rocket::Core::StringUtilities::IsWhitespace(buffer[i])) state = DATA; } break; diff --git a/Source/Core/Python/ElementDocumentWrapper.h b/Source/Core/Python/ElementDocumentWrapper.h index 3f501894a..d938be271 100644 --- a/Source/Core/Python/ElementDocumentWrapper.h +++ b/Source/Core/Python/ElementDocumentWrapper.h @@ -50,7 +50,7 @@ class ElementDocumentWrapper : public ElementWrapper< ElementDocument > virtual ~ElementDocumentWrapper(); /// Load a python script into this document - virtual void LoadScript(EMP::Core::Stream* stream, const EMP::Core::String& source_name); + virtual void LoadScript(Rocket::Core::Stream* stream, const Rocket::Core::String& source_name); /// Get the namespace for this module PyObject* GetModuleNamespace(); @@ -61,7 +61,7 @@ class ElementDocumentWrapper : public ElementWrapper< ElementDocument > PyObject* module_namespace; // Preprocess the python code - void PreprocessCode(EMP::Core::String& code, EMP::Core::Stream* stream); + void PreprocessCode(Rocket::Core::String& code, Rocket::Core::Stream* stream); }; } diff --git a/Source/Core/Python/ElementInterface.cpp b/Source/Core/Python/ElementInterface.cpp index 676ac5b21..2cbc5ca69 100644 --- a/Source/Core/Python/ElementInterface.cpp +++ b/Source/Core/Python/ElementInterface.cpp @@ -27,25 +27,25 @@ #include "precompiled.h" #include "ElementInterface.h" -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include #include #include -#include -#include -#include +#include +#include +#include +#include #include -#include #include namespace Rocket { namespace Core { namespace Python { -typedef EMP::Core::STL::map< EMP::Core::String, PyObject* > ClassDefinitions; +typedef std::map< Rocket::Core::String, PyObject* > ClassDefinitions; ClassDefinitions class_definitions; void ElementInterface::InitialisePythonInterface() @@ -55,7 +55,7 @@ void ElementInterface::InitialisePythonInterface() ElementAttributeProxy::InitialisePythonInterface(); // Element list - EMP::Core::Python::VectorInterface< ElementList > element_list("ElementList"); + Rocket::Core::Python::VectorInterface< ElementList > element_list("ElementList"); // Document focus flags python::enum_< ElementDocument::FocusFlags >("focus") @@ -162,7 +162,7 @@ void ElementInterface::InitialiseRocketInterface() } // Get the element's address. -EMP::Core::String ElementInterface::GetAddress(Element* element) +Rocket::Core::String ElementInterface::GetAddress(Element* element) { return element->GetAddress(false); } @@ -200,7 +200,7 @@ void ElementInterface::AppendChild(Element* element, Element* child) void ElementInterface::DispatchEvent(Element* element, const char* event, const python::dict& parameters, bool interruptible) { - EMP::Core::Dictionary emp_parameters; + Rocket::Core::Dictionary ROCKET_parameters; PyObject* keys = PyDict_Keys(parameters.ptr()); int num_keys = PyList_Size(keys); @@ -214,8 +214,8 @@ void ElementInterface::DispatchEvent(Element* element, const char* event, const python::throw_error_already_set(); } - EMP::Core::Variant value; - if (!EMP::Core::Python::Utilities::ConvertToVariant(value, PyDict_GetItem(parameters.ptr(), py_key))) + Rocket::Core::Variant value; + if (!Rocket::Core::Python::Utilities::ConvertToVariant(value, PyDict_GetItem(parameters.ptr(), py_key))) { Py_DECREF(keys); PyErr_SetString(PyExc_ValueError, "Unable to convert parameter value."); @@ -223,15 +223,15 @@ void ElementInterface::DispatchEvent(Element* element, const char* event, const } const char* key = PyString_AsString(py_key); - emp_parameters.Set(key, value); + ROCKET_parameters.Set(key, value); } - element->DispatchEvent(event, emp_parameters, interruptible); + element->DispatchEvent(event, ROCKET_parameters, interruptible); } -EMP::Core::String ElementInterface::GetAttribute(Element* element, const char* name) +Rocket::Core::String ElementInterface::GetAttribute(Element* element, const char* name) { - return element->GetAttribute< EMP::Core::String >(name, ""); + return element->GetAttribute< Rocket::Core::String >(name, ""); } // Returns the list of elements. @@ -247,16 +247,16 @@ void ElementInterface::SetAttribute(Element* element, const char* name, const ch element->SetAttribute(name, value); } -EMP::Core::String ElementInterface::GetInnerRML(Element* element) +Rocket::Core::String ElementInterface::GetInnerRML(Element* element) { - EMP::Core::String rml; + Rocket::Core::String rml; element->GetInnerRML(rml); return rml; } -EMP::Core::String ElementInterface::GetText(ElementText* element) +Rocket::Core::String ElementInterface::GetText(ElementText* element) { - EMP::Core::String text; + Rocket::Core::String text; element->GetText().ToUTF8(text); return text; } @@ -278,7 +278,7 @@ python::object ElementInterface::CreateElement(ElementDocument* document, const if (new_element == NULL) return python::object(); - python::object py_element = EMP::Core::Python::Utilities::MakeObject(new_element); + python::object py_element = Rocket::Core::Python::Utilities::MakeObject(new_element); new_element->RemoveReference(); return py_element; } @@ -290,7 +290,7 @@ python::object ElementInterface::CreateTextNode(ElementDocument* document, const if (new_element == NULL) return python::object(); - python::object py_element = EMP::Core::Python::Utilities::MakeObject(new_element); + python::object py_element = Rocket::Core::Python::Utilities::MakeObject(new_element); new_element->RemoveReference(); return py_element; } diff --git a/Source/Core/Python/ElementInterface.h b/Source/Core/Python/ElementInterface.h index d47067c52..68e8c60af 100644 --- a/Source/Core/Python/ElementInterface.h +++ b/Source/Core/Python/ElementInterface.h @@ -57,7 +57,7 @@ class ElementInterface static void InitialiseRocketInterface(); /// Get the element's address. - static EMP::Core::String GetAddress(Element* element); + static Rocket::Core::String GetAddress(Element* element); /// Get a style proxy object for the element static ElementStyleProxy GetStyle(Element* element); /// Get a children proxy object for the element @@ -73,7 +73,7 @@ class ElementInterface /// Dispatches an event. static void DispatchEvent(Element* element, const char* event, const python::dict& parameters, bool interruptible); /// Get the specified attribute - static EMP::Core::String GetAttribute(Element* element, const char* name); + static Rocket::Core::String GetAttribute(Element* element, const char* name); /// Returns the list of elements. static ElementList GetElementsByTagName(Element* element, const char* tag); /// Override for RemoveEventListener without the third parameter. @@ -81,10 +81,10 @@ class ElementInterface /// Get the specified attribute static void SetAttribute(Element* element, const char* name, const char* value); /// Get the inner html of the given element - static EMP::Core::String GetInnerRML(Element* element); + static Rocket::Core::String GetInnerRML(Element* element); /// ElementText interface. - static EMP::Core::String GetText(ElementText* element); + static Rocket::Core::String GetText(ElementText* element); static void SetText(ElementText* element, const char* text); /// Document Interface. diff --git a/Source/Core/Python/ElementStyleProxy.cpp b/Source/Core/Python/ElementStyleProxy.cpp index 9a86173ca..7d2749c39 100644 --- a/Source/Core/Python/ElementStyleProxy.cpp +++ b/Source/Core/Python/ElementStyleProxy.cpp @@ -54,20 +54,20 @@ void ElementStyleProxy::InitialisePythonInterface() void ElementStyleProxy::SetAttr(const char* _key, const char* value) { // Switch underscores to dashes, as the script interface can't use -'s - EMP::Core::String key = EMP::Core::String(_key).Replace("_", "-"); + Rocket::Core::String key = Rocket::Core::String(_key).Replace("_", "-"); element->SetProperty(key.CString(), value); } -EMP::Core::String ElementStyleProxy::GetAttr(const char* _key) +Rocket::Core::String ElementStyleProxy::GetAttr(const char* _key) { // Switch underscores to dashes, as the script interface can't use -'s - EMP::Core::String key = EMP::Core::String(_key).Replace("_", "-"); + Rocket::Core::String key = Rocket::Core::String(_key).Replace("_", "-"); const Property* property = element->GetProperty(key.CString()); if ( !property ) { - EMP::Core::String message(128, "Invalid style property %s", _key); + Rocket::Core::String message(128, "Invalid style property %s", _key); PyErr_SetString(PyExc_KeyError, message.CString()); python::throw_error_already_set(); } diff --git a/Source/Core/Python/ElementStyleProxy.h b/Source/Core/Python/ElementStyleProxy.h index 3e16c8196..f193157b5 100644 --- a/Source/Core/Python/ElementStyleProxy.h +++ b/Source/Core/Python/ElementStyleProxy.h @@ -55,7 +55,7 @@ class ElementStyleProxy /// Python SetAttr override void SetAttr(const char* key, const char* value); /// Python GetAttr override - EMP::Core::String GetAttr(const char* key); + Rocket::Core::String GetAttr(const char* key); private: Element* element; diff --git a/Source/Core/Python/EventInstancer.cpp b/Source/Core/Python/EventInstancer.cpp index 37d53ac94..8956eb27b 100644 --- a/Source/Core/Python/EventInstancer.cpp +++ b/Source/Core/Python/EventInstancer.cpp @@ -27,8 +27,8 @@ #include "precompiled.h" #include -#include -#include +#include +#include "EventWrapper.h" #include "EventInstancer.h" namespace Rocket { @@ -46,7 +46,7 @@ EventInstancer::~EventInstancer() Py_DECREF( instancer ); } -Event* EventInstancer::InstanceEvent(Element* target, const EMP::Core::String& name, const EMP::Core::Dictionary& parameters, bool interruptable) +Event* EventInstancer::InstanceEvent(Element* target, const Rocket::Core::String& name, const Rocket::Core::Dictionary& parameters, bool interruptable) { EventWrapper* event = NULL; @@ -71,7 +71,7 @@ Event* EventInstancer::InstanceEvent(Element* target, const EMP::Core::String& n // Rebind the target element if (instance) { - event = python::extract(EMP::Core::Python::Utilities::MakeObject(instance)); + event = python::extract(Rocket::Core::Python::Utilities::MakeObject(instance)); if (event) { event->SetTargetElement(target); @@ -85,7 +85,7 @@ Event* EventInstancer::InstanceEvent(Element* target, const EMP::Core::String& n if (!event) { - EMP::Core::Python::Utilities::PrintError(true); + Rocket::Core::Python::Utilities::PrintError(true); } return event; diff --git a/Source/Core/Python/EventInstancer.h b/Source/Core/Python/EventInstancer.h index c11816ec9..e60d562e6 100644 --- a/Source/Core/Python/EventInstancer.h +++ b/Source/Core/Python/EventInstancer.h @@ -50,7 +50,7 @@ class EventInstancer : public Rocket::Core::EventInstancer virtual ~EventInstancer(); /// Instance an event - virtual Event* InstanceEvent(Element* target, const EMP::Core::String& name, const EMP::Core::Dictionary& parameters, bool interuptable); + virtual Event* InstanceEvent(Element* target, const Rocket::Core::String& name, const Rocket::Core::Dictionary& parameters, bool interuptable); /// Releases an event instanced by this instancer. /// @param[in] event The event to release. virtual void ReleaseEvent(Event* event); diff --git a/Source/Core/Python/EventInterface.cpp b/Source/Core/Python/EventInterface.cpp index 634acc1c9..e99a49781 100644 --- a/Source/Core/Python/EventInterface.cpp +++ b/Source/Core/Python/EventInterface.cpp @@ -28,7 +28,7 @@ #include "precompiled.h" #include "EventInstancer.h" -#include +#include #include @@ -45,7 +45,7 @@ static PyObject* py_event = NULL; void EventInterface::InitialisePythonInterface() { // Define the event. - py_event = python::class_< Event, EventWrapper, boost::noncopyable >("event", python::init< const char*, EMP::Core::Dictionary&, bool >()) + py_event = python::class_< Event, EventWrapper, boost::noncopyable >("event", python::init< const char*, Rocket::Core::Dictionary&, bool >()) .add_property("type", python::make_function( &Event::GetType, python::return_value_policy< python::return_by_value >())) .add_property("target_element", python::make_function(&Event::GetTargetElement, python::return_value_policy< python::return_by_value >())) .add_property("current_element", python::make_function(&Event::GetCurrentElement, python::return_value_policy< python::return_by_value >())) @@ -53,7 +53,7 @@ void EventInterface::InitialisePythonInterface() .def("StopPropagation", &Event::StopPropagation) .ptr(); - EMP::Core::Python::ConverterScriptObject< Event, true >(); + Rocket::Core::Python::ConverterScriptObject< Event >(); } void EventInterface::InitialiseRocketInterface() @@ -63,7 +63,7 @@ void EventInterface::InitialiseRocketInterface() Factory::RegisterEventListenerInstancer(new EventListenerInstancer())->RemoveReference(); } -const EMP::Core::Dictionary& EventInterface::GetParameters(EventWrapper* self) +const Rocket::Core::Dictionary& EventInterface::GetParameters(EventWrapper* self) { return *self->GetParameters(); } diff --git a/Source/Core/Python/EventInterface.h b/Source/Core/Python/EventInterface.h index 97f6e44b3..91f3fa7c4 100644 --- a/Source/Core/Python/EventInterface.h +++ b/Source/Core/Python/EventInterface.h @@ -52,7 +52,7 @@ class EventInterface static void InitialiseRocketInterface(); /// Attribute accessor for getting event details - static const EMP::Core::Dictionary& GetParameters(EventWrapper* self); + static const Rocket::Core::Dictionary& GetParameters(EventWrapper* self); }; } diff --git a/Source/Core/Python/EventListener.cpp b/Source/Core/Python/EventListener.cpp index 00853b9bd..507465388 100644 --- a/Source/Core/Python/EventListener.cpp +++ b/Source/Core/Python/EventListener.cpp @@ -28,7 +28,7 @@ #include "precompiled.h" #include "EventListener.h" -#include +#include #include "EventWrapper.h" #include "ElementDocumentWrapper.h" @@ -85,11 +85,11 @@ EventListener::EventListener(PyObject* object) else { // Unknown, log an error - Log::Message(EMP::Core::Log::LT_ERROR, "Failed to initialise python based event listener. Unknown python object type, should be a callable or a string."); + Log::Message(Rocket::Core::Log::LT_ERROR, "Failed to initialise python based event listener. Unknown python object type, should be a callable or a string."); } } -EventListener::EventListener(const EMP::Core::String& code, Element* context) +EventListener::EventListener(const Rocket::Core::String& code, Element* context) { callable = NULL; element = context; @@ -136,9 +136,9 @@ void EventListener::ProcessEvent(Event& event) Py_XINCREF(old_document); // Set up the new expected globals - PyDict_SetItemString(py_namespace, "event", EMP::Core::Python::Utilities::MakeObject(&event).ptr()); - PyDict_SetItemString(py_namespace, "self", EMP::Core::Python::Utilities::MakeObject(element).ptr()); - PyDict_SetItemString(py_namespace, "document", EMP::Core::Python::Utilities::MakeObject(element->GetOwnerDocument()).ptr()); + PyDict_SetItemString(py_namespace, "event", Rocket::Core::Python::Utilities::MakeObject(&event).ptr()); + PyDict_SetItemString(py_namespace, "self", Rocket::Core::Python::Utilities::MakeObject(element).ptr()); + PyDict_SetItemString(py_namespace, "document", Rocket::Core::Python::Utilities::MakeObject(element->GetOwnerDocument()).ptr()); // Call the bound function PyObject* result = NULL; @@ -157,7 +157,7 @@ void EventListener::ProcessEvent(Event& event) } else { - EMP::Core::Python::Utilities::PrintError(true); + Rocket::Core::Python::Utilities::PrintError(true); } // Remove the globals @@ -196,18 +196,18 @@ void EventListener::OnDetach(Element* /*element*/) bool EventListener::Compile() { - EMP::Core::String function_name(64, "Event_%x", this); - EMP::Core::String function_code(64, "def %s():", function_name.CString()); + Rocket::Core::String function_name(64, "Event_%x", this); + Rocket::Core::String function_code(64, "def %s():", function_name.CString()); - EMP::Core::StringList lines; - EMP::Core::StringUtilities::ExpandString(lines, source_code, ';'); + Rocket::Core::StringList lines; + Rocket::Core::StringUtilities::ExpandString(lines, source_code, ';'); for (size_t i = 0; i < lines.size(); i++) { // Python doesn't handle \r's, strip em and indent the code correctly - function_code += EMP::Core::String(1024, "\n\t%s", lines[i].CString()).Replace("\r", ""); + function_code += Rocket::Core::String(1024, "\n\t%s", lines[i].CString()).Replace("\r", ""); } - EMP_ASSERT(element != NULL); + ROCKET_ASSERT(element != NULL); PyObject* py_namespace = GetGlobalNamespace(); @@ -215,7 +215,7 @@ bool EventListener::Compile() PyObject* result = PyRun_String(function_code.CString(), Py_file_input, py_namespace, py_namespace); if (!result) { - EMP::Core::Python::Utilities::PrintError(); + Rocket::Core::Python::Utilities::PrintError(); return false; } Py_DECREF(result); @@ -237,7 +237,7 @@ PyObject* EventListener::GetGlobalNamespace() ElementDocumentWrapper* document = dynamic_cast< ElementDocumentWrapper* >(element->GetOwnerDocument()); if (!document) { - Log::Message(EMP::Core::Log::LT_ERROR, "Failed to find python accessible document for element %s, unable to create event. Did you create a context/document before initialising RocketPython?", element->GetAddress().CString()); + Log::Message(Rocket::Core::Log::LT_ERROR, "Failed to find python accessible document for element %s, unable to create event. Did you create a context/document before initialising RocketPython?", element->GetAddress().CString()); return NULL; } diff --git a/Source/Core/Python/EventListener.h b/Source/Core/Python/EventListener.h index 5995de5dd..c8f30714b 100644 --- a/Source/Core/Python/EventListener.h +++ b/Source/Core/Python/EventListener.h @@ -52,7 +52,7 @@ class EventListener : public Rocket::Core::EventListener /// Constructor for inline string /// @param code Python code string to fire /// @param context Optional, if set the code will be executed in this element's namespace - EventListener( const EMP::Core::String& code, Element* context = NULL ); + EventListener( const Rocket::Core::String& code, Element* context = NULL ); virtual ~EventListener(); /// Process the event @@ -71,7 +71,7 @@ class EventListener : public Rocket::Core::EventListener PyObject* global_namespace; // Source code, if any - EMP::Core::String source_code; + Rocket::Core::String source_code; // Compile the source code bool Compile(); diff --git a/Source/Core/Python/EventListenerInstancer.cpp b/Source/Core/Python/EventListenerInstancer.cpp index 7734b39ab..d93cb7255 100644 --- a/Source/Core/Python/EventListenerInstancer.cpp +++ b/Source/Core/Python/EventListenerInstancer.cpp @@ -34,7 +34,7 @@ namespace Core { namespace Python { // Instance and event listener object -Rocket::Core::EventListener* EventListenerInstancer::InstanceEventListener(const EMP::Core::String& value) +Rocket::Core::EventListener* EventListenerInstancer::InstanceEventListener(const Rocket::Core::String& value) { return new EventListener(value); } diff --git a/Source/Core/Python/EventListenerInstancer.h b/Source/Core/Python/EventListenerInstancer.h index ce4bcc246..7d6e5555c 100644 --- a/Source/Core/Python/EventListenerInstancer.h +++ b/Source/Core/Python/EventListenerInstancer.h @@ -49,7 +49,7 @@ class EventListenerInstancer : public Rocket::Core::EventListenerInstancer /// Instance and event listener object /// @param value Value of the event - virtual EventListener* InstanceEventListener(const EMP::Core::String& value); + virtual EventListener* InstanceEventListener(const Rocket::Core::String& value); /// Releases this event listener instancer virtual void Release(); diff --git a/Source/Core/Python/EventWrapper.cpp b/Source/Core/Python/EventWrapper.cpp index b8d9f46bd..e23739f9d 100644 --- a/Source/Core/Python/EventWrapper.cpp +++ b/Source/Core/Python/EventWrapper.cpp @@ -32,7 +32,7 @@ namespace Rocket { namespace Core { namespace Python { -EventWrapper::EventWrapper(PyObject* _self, const char* type, const EMP::Core::Dictionary& parameters, bool interruptable) : Event(NULL, type, parameters, interruptable) +EventWrapper::EventWrapper(PyObject* _self, const char* type, const Rocket::Core::Dictionary& parameters, bool interruptable) : Event(NULL, type, parameters, interruptable) { self = _self; } @@ -40,7 +40,7 @@ EventWrapper::EventWrapper(PyObject* _self, const char* type, const EMP::Core::D EventWrapper::~EventWrapper() { // Little security check, ensure we're not being deleted incorrectly - EMP_ASSERT( self == NULL ); + ROCKET_ASSERT( self == NULL ); } void EventWrapper::SetTargetElement(Element* _target_element) diff --git a/Source/Core/Python/EventWrapper.h b/Source/Core/Python/EventWrapper.h index 75485f386..6c29c42df 100644 --- a/Source/Core/Python/EventWrapper.h +++ b/Source/Core/Python/EventWrapper.h @@ -28,8 +28,8 @@ #ifndef ROCKETCOREPYTHONEVENTWRAPPER_H #define ROCKETCOREPYTHONEVENTWRAPPER_H -#include -#include +#include +#include #include namespace Rocket { @@ -47,7 +47,7 @@ class EventInstancer; class EventWrapper : public Event { public: - EventWrapper(PyObject* self, const char* type, const EMP::Core::Dictionary& parameters, bool interruptable); + EventWrapper(PyObject* self, const char* type, const Rocket::Core::Dictionary& parameters, bool interruptable); virtual ~EventWrapper(); /// Return the python script object associated with this element diff --git a/Source/Core/Python/Interfaces.cpp b/Source/Core/Python/Interfaces.cpp new file mode 100644 index 000000000..5059bb964 --- /dev/null +++ b/Source/Core/Python/Interfaces.cpp @@ -0,0 +1,174 @@ +/* + * This source file is part of libRocket, the HTML/CSS Interface Middleware + * + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +#include "precompiled.h" +#include +#include +#include +//#include "DataSourceWrapper.h" +#include +#include +#include +#include +#include + +namespace Rocket { +namespace Core { +namespace Python { + +// Dictionary Interface +class DictionaryInterface +{ +public: + DictionaryInterface() + { + python::class_< Dictionary >("Dictionary") + .def("__len__", &DictionaryInterface::Size) + .def("__setitem__", &DictionaryInterface::SetItem) + .def("__delitem__", &DictionaryInterface::DelItem) + .def("__getitem__", &DictionaryInterface::GetItem, python::return_value_policy< python::return_by_value >()) + .def("__contains__", &DictionaryInterface::Contains) + ; + } + + static size_t Size(const Dictionary& dict) + { + return dict.Size(); + } + + static void SetItem(Dictionary& dict, const char* key, const Variant& value) + { + dict.Set(key, value); + } + + static void DelItem(Dictionary& dict, const char* key) + { + dict.Remove(key); + } + + static Variant& GetItem(const Dictionary& dict, const char* key) + { + Variant* variant = dict.Get(key); + if (!variant) + { + PyErr_SetString(PyExc_KeyError, Rocket::Core::String(64, "Invalid key %s", key).CString()); + python::throw_error_already_set(); + } + return *variant; + } + + static bool Contains(const Dictionary& dict, const char* key) + { + return dict.Get(key) != NULL; + } +}; + +static void Log(Log::Type level, const char* message) +{ + Core::Log::Message(level, "%s", message); +} + +void RegisterPythonInterfaces() +{ + python::class_< ScriptInterface, boost::noncopyable >("ScriptInterface", python::no_init); + + VectorInterface< StringList >("StringList"); + + python::class_< Vector2f >("Vector2f") + .def(python::init< float, float >()) + .def_readwrite("x", &Vector2f::x) + .def_readwrite("y", &Vector2f::y) + .def(python::self * float()) // * float + .def(python::self / float()) // / float + .def(python::self + Vector2f()) // + Vector2f + .def(python::self - Vector2f()) // - Vector2f + .def(python::self == Vector2f()) // == + .def(python::self != Vector2f()) // != + .def("DotProduct", &Vector2f::DotProduct) + .def("Normalise", &Vector2f::Normalise) + .def("Rotate", &Vector2f::Rotate) + .add_property("magnitude", &Vector2f::Magnitude) + .def_pickle(PickleTypeConverter< Vector2f >()) + ; + + python::class_< Vector2i >("Vector2i") + .def(python::init< int, int >()) + .def_readwrite("x", &Vector2i::x) + .def_readwrite("y", &Vector2i::y) + .def(python::self * int()) // * int + .def(python::self / int()) // / int + .def(python::self + Vector2i()) // + Vector2i + .def(python::self - Vector2i()) // - Vector2i + .def(python::self == Vector2i()) // == + .def(python::self != Vector2i()) // != + .def_pickle(PickleTypeConverter< Vector2i >()) + ; + + python::class_< Colourf >("Colourf") + .def(python::init< float, float, float, float >()) + .def_readwrite("red", &Colourf::red) + .def_readwrite("green", &Colourf::green) + .def_readwrite("blue", &Colourf::blue) + .def_readwrite("alpha", &Colourf::alpha) + .def(python::self == Colourf()) // == + .def_pickle(PickleTypeConverter< Colourf >()) + ; + + python::class_< Colourb >("Colourb") + .def(python::init< byte, byte, byte, byte>()) + .def_readwrite("red", &Colourb::red) + .def_readwrite("green", &Colourb::green) + .def_readwrite("blue", &Colourb::blue) + .def_readwrite("alpha", &Colourb::alpha) + .def(python::self == Colourb()) // == + .def(python::self + Colourb()) // + + .def(python::self *= float()) // *= + .def(python::self * float()) // * + .def_pickle(PickleTypeConverter< Colourb >()) + ; + + python::class_< URL >("URL") + .def(python::init< const char* >()) + .def_pickle(PickleTypeConverter< URL >()) + ; + + python::def("Log", &Log); + python::enum_< Core::Log::Type >("logtype") + .value("always", Core::Log::LT_ALWAYS) + .value("error", Core::Log::LT_ERROR) + .value("warning", Core::Log::LT_WARNING) + .value("info", Core::Log::LT_INFO) + .value("debug", Core::Log::LT_DEBUG) + ; + + DictionaryInterface(); + //DataSourceWrapper::InitialisePythonInterface(); +} + +} +} +} diff --git a/Source/Core/Python/Module.cpp b/Source/Core/Python/Module.cpp index b461c5c12..7da796ea9 100644 --- a/Source/Core/Python/Module.cpp +++ b/Source/Core/Python/Module.cpp @@ -27,7 +27,7 @@ #include "precompiled.h" #include "Module.h" -#include +#include #include #include #include @@ -42,16 +42,16 @@ namespace Core { namespace Python { static Module module; -static python::object CreateContext(const char* name, const EMP::Core::Vector2i& dimensions); +static python::object CreateContext(const char* name, const Rocket::Core::Vector2i& dimensions); static void RegisterTag(const char* tag, python::object& object); -static void LogMessage(EMP::Core::Log::Type type, const char* message); static void InitialisePythonKeyMap(); + +void RegisterPythonInterfaces(); void RegisterPythonConverters(); BOOST_PYTHON_MODULE(_rocketcore) { - PyObject* mod = PyImport_ImportModule("_empcore"); - Py_XDECREF(mod); + RegisterPythonInterfaces(); RegisterPythonConverters(); ContextInterface::InitialisePythonInterface(); @@ -60,12 +60,11 @@ BOOST_PYTHON_MODULE(_rocketcore) InitialisePythonKeyMap(); - bool (*LoadFontFace)(const EMP::Core::String&) = &FontDatabase::LoadFontFace; + bool (*LoadFontFace)(const Rocket::Core::String&) = &FontDatabase::LoadFontFace; python::def("CreateContext", &CreateContext); python::def("LoadFontFace", LoadFontFace); python::def("RegisterTag", &RegisterTag); - python::def("Log", &LogMessage); ContextProxy::InitialisePythonInterface(); python::scope().attr("contexts") = ContextProxy(); @@ -73,13 +72,13 @@ BOOST_PYTHON_MODULE(_rocketcore) Rocket::Core::RegisterPlugin(&module); } -python::object CreateContext(const char* name, const EMP::Core::Vector2i& dimensions) +python::object CreateContext(const char* name, const Rocket::Core::Vector2i& dimensions) { Context* new_context = Rocket::Core::CreateContext(name, dimensions); if (new_context == NULL) return python::object(); - python::object py_context = EMP::Core::Python::Utilities::MakeObject(new_context); + python::object py_context = Rocket::Core::Python::Utilities::MakeObject(new_context); new_context->RemoveReference(); return py_context; } @@ -90,11 +89,6 @@ void RegisterTag(const char* tag, python::object& object) Factory::RegisterElementInstancer(tag, new ElementInstancer(object.ptr()))->RemoveReference(); } -void LogMessage(EMP::Core::Log::Type type, const char* message) -{ - Rocket::Core::Log::Message(type, "%s", message); -} - void Module::OnInitialise() { ContextInterface::InitialiseRocketInterface(); diff --git a/Source/Core/Python/Utilities.cpp b/Source/Core/Python/Utilities.cpp new file mode 100644 index 000000000..047b0d002 --- /dev/null +++ b/Source/Core/Python/Utilities.cpp @@ -0,0 +1,153 @@ +/* + * This source file is part of libRocket, the HTML/CSS Interface Middleware + * + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +#include "precompiled.h" +#include + +namespace Rocket { +namespace Core { +namespace Python { + +bool Utilities::IsCallable(PyObject* self, const char* method_name) +{ + PyObject* object = NULL; + + // If its a dictionary, access it like a dictionary + if (PyDict_Check(self)) + { + object = PyDict_GetItemString(self, (char*)method_name); + // This is a borrowed ref, Incref so the decref below is cancelled out + Py_XINCREF( object ); + } + // otherwise attempt normal object access + else + { + object = PyObject_GetAttrString(self, (char*)method_name); + } + + // If we couldn't find it, clear error and return false + if (!object) + { + PyErr_Clear(); + return false; + } + + int callable = PyCallable_Check(object); + + Py_DECREF(object); + return callable == 1; +} + +bool Utilities::Call(PyObject* object, const char* method_name, const python::tuple& args) +{ + PyObject* result = PythonCall(object, method_name, args); + if (result) + Py_DECREF(result); + return result != NULL; +} + +// Print the pending python error to stderr, optionally clearing it +void Utilities::PrintError(bool clear_error) +{ + // Print the error and restore it to the caller + PyObject *type, *value, *traceback; + PyErr_Fetch(&type, &value, &traceback); + Py_XINCREF(type); + Py_XINCREF(value); + Py_XINCREF(traceback); + PyErr_Restore(type, value, traceback); + PyErr_Print(); + if (clear_error) + { + Py_XDECREF(type); + Py_XDECREF(value); + Py_XDECREF(traceback); + } + else + { + PyErr_Restore(type, value, traceback); + } +} + +// Converts a python object into an Rocket variant. +bool Utilities::ConvertToVariant(Variant& variant, PyObject* object) +{ + if (PyFloat_Check(object)) + { + variant.Set((float) PyFloat_AsDouble(object)); + return true; + } + else if (PyInt_Check(object)) + { + variant.Set((int) PyInt_AsLong(object)); + return true; + } + else if (PyString_Check(object)) + { + variant.Set(String(PyString_AsString(object))); + return true; + } + + return false; +} + +// Internal Python call method +PyObject* Utilities::PythonCall(PyObject* object, const char* method_name, const python::tuple& args ) +{ + ROCKET_ASSERT(IsCallable(object, method_name)); + + PyObject* result = NULL; + PyObject* method = NULL; + + if (PyDict_Check(object)) + { + method = PyDict_GetItemString(object, (char*)method_name); + // Borrowed reference, so increase so dec at bottom matches + Py_XINCREF(method); + } + else + { + method = PyObject_GetAttrString(object, (char*)method_name); + } + + if (!method) + return NULL; + + result = PyObject_CallObject(method, args.ptr()); + Py_DECREF(method); + if (!result) + { + PrintError(); + return NULL; + } + + return result; +} + +} +} +} diff --git a/Source/Core/Python/precompiled.h b/Source/Core/Python/precompiled.h index f57d2961f..026b2c7ee 100644 --- a/Source/Core/Python/precompiled.h +++ b/Source/Core/Python/precompiled.h @@ -29,4 +29,4 @@ #include // Python header. -#include +#include diff --git a/Source/Core/ReferenceCountable.cpp b/Source/Core/ReferenceCountable.cpp index 23f01beb9..f76a3025b 100644 --- a/Source/Core/ReferenceCountable.cpp +++ b/Source/Core/ReferenceCountable.cpp @@ -43,7 +43,7 @@ ReferenceCountable::ReferenceCountable(int initial_count) // Destructor. The reference count must be 0 when this is invoked. ReferenceCountable::~ReferenceCountable() { - EMP_ASSERT(reference_count == 0); + ROCKET_ASSERT(reference_count == 0); --num_outstanding_objects; } @@ -66,7 +66,7 @@ void ReferenceCountable::AddReference() // Removes a reference from the object. void ReferenceCountable::RemoveReference() { - EMP_ASSERT(reference_count > 0); + ROCKET_ASSERT(reference_count > 0); reference_count--; if (reference_count == 0) { @@ -76,7 +76,7 @@ void ReferenceCountable::RemoveReference() ReferenceCountable& ReferenceCountable::operator=(const ReferenceCountable& /*copy*/) { - EMP_ERRORMSG("Attempting to copy a reference counted object. This is not advisable."); + ROCKET_ERRORMSG("Attempting to copy a reference counted object. This is not advisable."); return *this; } diff --git a/Source/Core/RenderInterface.cpp b/Source/Core/RenderInterface.cpp index 7645efb81..6896ca7fe 100644 --- a/Source/Core/RenderInterface.cpp +++ b/Source/Core/RenderInterface.cpp @@ -42,35 +42,35 @@ RenderInterface::~RenderInterface() } // Called by Rocket when it wants to compile geometry it believes will be static for the forseeable future. -CompiledGeometryHandle RenderInterface::CompileGeometry(Vertex* EMP_UNUSED(vertices), int EMP_UNUSED(num_vertices), int* EMP_UNUSED(indices), int EMP_UNUSED(num_indices), TextureHandle EMP_UNUSED(texture)) +CompiledGeometryHandle RenderInterface::CompileGeometry(Vertex* ROCKET_UNUSED(vertices), int ROCKET_UNUSED(num_vertices), int* ROCKET_UNUSED(indices), int ROCKET_UNUSED(num_indices), TextureHandle ROCKET_UNUSED(texture)) { return NULL; } // Called by Rocket when it wants to render application-compiled geometry. -void RenderInterface::RenderCompiledGeometry(CompiledGeometryHandle EMP_UNUSED(geometry), const Vector2f& EMP_UNUSED(translation)) +void RenderInterface::RenderCompiledGeometry(CompiledGeometryHandle ROCKET_UNUSED(geometry), const Vector2f& ROCKET_UNUSED(translation)) { } // Called by Rocket when it wants to release application-compiled geometry. -void RenderInterface::ReleaseCompiledGeometry(CompiledGeometryHandle EMP_UNUSED(geometry)) +void RenderInterface::ReleaseCompiledGeometry(CompiledGeometryHandle ROCKET_UNUSED(geometry)) { } // Called by Rocket when a texture is required by the library. -bool RenderInterface::LoadTexture(TextureHandle& EMP_UNUSED(texture_handle), Vector2i& EMP_UNUSED(texture_dimensions), const String& EMP_UNUSED(source)) +bool RenderInterface::LoadTexture(TextureHandle& ROCKET_UNUSED(texture_handle), Vector2i& ROCKET_UNUSED(texture_dimensions), const String& ROCKET_UNUSED(source)) { return false; } // Called by Rocket when a texture is required to be built from an internally-generated sequence of pixels. -bool RenderInterface::GenerateTexture(TextureHandle& EMP_UNUSED(texture_handle), const byte* EMP_UNUSED(source), const Vector2i& EMP_UNUSED(source_dimensions)) +bool RenderInterface::GenerateTexture(TextureHandle& ROCKET_UNUSED(texture_handle), const byte* ROCKET_UNUSED(source), const Vector2i& ROCKET_UNUSED(source_dimensions)) { return false; } // Called by Rocket when a loaded texture is no longer required. -void RenderInterface::ReleaseTexture(TextureHandle EMP_UNUSED(texture)) +void RenderInterface::ReleaseTexture(TextureHandle ROCKET_UNUSED(texture)) { } diff --git a/Source/Core/Stream.cpp b/Source/Core/Stream.cpp index 7853c07e3..8184039d6 100644 --- a/Source/Core/Stream.cpp +++ b/Source/Core/Stream.cpp @@ -118,9 +118,9 @@ size_t Stream::Write(const String& string) } // Push onto the front of the stream -size_t Stream::PushFront(const void* EMP_UNUSED(buffer), size_t EMP_UNUSED(bytes)) +size_t Stream::PushFront(const void* ROCKET_UNUSED(buffer), size_t ROCKET_UNUSED(bytes)) { - EMP_ERRORMSG("No generic way to PushFront to a stream."); + ROCKET_ERRORMSG("No generic way to PushFront to a stream."); return false; } @@ -135,9 +135,9 @@ size_t Stream::PushBack(const void* buffer, size_t bytes) } // Push onto the front of the stream -size_t Stream::PopFront(size_t EMP_UNUSED(bytes)) +size_t Stream::PopFront(size_t ROCKET_UNUSED(bytes)) { - EMP_ERRORMSG("No generic way to PopFront from a stream."); + ROCKET_ERRORMSG("No generic way to PopFront from a stream."); return 0; } diff --git a/Source/Core/StreamFile.cpp b/Source/Core/StreamFile.cpp index 7e76436a8..f3d988001 100644 --- a/Source/Core/StreamFile.cpp +++ b/Source/Core/StreamFile.cpp @@ -105,16 +105,16 @@ size_t StreamFile::Read(void* buffer, size_t bytes) const } // Write to the stream at the current position. -size_t StreamFile::Write(const void* EMP_UNUSED(buffer), size_t EMP_UNUSED(bytes)) +size_t StreamFile::Write(const void* ROCKET_UNUSED(buffer), size_t ROCKET_UNUSED(bytes)) { - EMP_ERROR; + ROCKET_ERROR; return 0; } // Truncate the stream to the specified length. -size_t StreamFile::Truncate(size_t EMP_UNUSED(bytes)) +size_t StreamFile::Truncate(size_t ROCKET_UNUSED(bytes)) { - EMP_ERROR; + ROCKET_ERROR; return 0; } diff --git a/Source/Core/StreamMemory.cpp b/Source/Core/StreamMemory.cpp index b0f68a488..eaa603ff6 100644 --- a/Source/Core/StreamMemory.cpp +++ b/Source/Core/StreamMemory.cpp @@ -241,7 +241,7 @@ void StreamMemory::SetSourceURL(const URL& url) // Resize the buffer bool StreamMemory::Reallocate( size_t size ) { - EMP_ASSERT( owns_buffer ); + ROCKET_ASSERT( owns_buffer ); if ( !owns_buffer ) return false; diff --git a/Source/Core/String.cpp b/Source/Core/String.cpp index 872d592a6..8720da675 100644 --- a/Source/Core/String.cpp +++ b/Source/Core/String.cpp @@ -32,7 +32,7 @@ namespace Rocket { namespace Core { -int ROCKETCORE_API EMPStringFormatString(StringBase& string, int max_size, const char* format, va_list argument_list) +int ROCKETCORE_API RocketStringFormatString(StringBase& string, int max_size, const char* format, va_list argument_list) { const int INTERNAL_BUFFER_SIZE = 1024; static char buffer[INTERNAL_BUFFER_SIZE]; @@ -43,7 +43,7 @@ int ROCKETCORE_API EMPStringFormatString(StringBase& string, int max_size, int length = vsnprintf(buffer_ptr, max_size, format, argument_list); buffer_ptr[length >= 0 ? length : max_size] = '\0'; - #ifdef EMP_DEBUG + #ifdef ROCKET_DEBUG if (length == -1) { Log::Message(Log::LT_WARNING, "String::sprintf: String truncated to %d bytes when processing %s", max_size, format); @@ -68,7 +68,7 @@ StringBase::StringBase(StringBase::size_type max_size, const char* f va_list argument_list; va_start(argument_list, fmt); - EMPStringFormatString(*this, max_size, fmt, argument_list); + RocketStringFormatString(*this, max_size, fmt, argument_list); va_end(argument_list); } @@ -79,7 +79,7 @@ int StringBase::FormatString(StringBase::size_type max_size, const c va_list argument_list; va_start(argument_list, fmt); - int length = EMPStringFormatString(*this, max_size, fmt, argument_list); + int length = RocketStringFormatString(*this, max_size, fmt, argument_list); va_end(argument_list); diff --git a/Source/Core/StringStorage.cpp b/Source/Core/StringStorage.cpp index 816b9a361..3a54943e1 100644 --- a/Source/Core/StringStorage.cpp +++ b/Source/Core/StringStorage.cpp @@ -33,8 +33,8 @@ namespace Core { const int MIN_STRING = 16; // Smallest string size. const int NUM_POOLS = 4; // Number of pools we have, in powers of 2 starting from the smallest string (16, 32, 64 and 128) -const int EMP_MAX_POOL_SIZE = 128; // Maximum number of free strings to keep in a pool -const int EMP_MAX_HASH_LENGTH = 32; // Maximum number of character to use when calculating the string hash (saves hashing HUGE strings) +const int ROCKET_MAX_POOL_SIZE = 128; // Maximum number of free strings to keep in a pool +const int ROCKET_MAX_HASH_LENGTH = 32; // Maximum number of character to use when calculating the string hash (saves hashing HUGE strings) #define HASH(hval, string, length) \ { \ @@ -89,9 +89,9 @@ void StringStorage::ClearPools() char* StringStorage::ReallocString(char* string, size_t old_length, size_t new_length, size_t character_size) { - EMP_ASSERT(old_length < (1 << 24)); - EMP_ASSERT(new_length < (1 << 24)); - EMP_ASSERT(new_length >= old_length); + ROCKET_ASSERT(old_length < (1 << 24)); + ROCKET_ASSERT(new_length < (1 << 24)); + ROCKET_ASSERT(new_length >= old_length); size_t new_size = (new_length + 1) * character_size; if (string == empty_string) @@ -106,7 +106,7 @@ char* StringStorage::ReallocString(char* string, size_t old_length, size_t new_l } size_t alloc_size = ALLOC_SIZE(new_size); - EMP_ASSERT(alloc_size > new_size); + ROCKET_ASSERT(alloc_size > new_size); // Check if we can use an old allocation from our pools if (alloc_size < (MIN_STRING << NUM_POOLS)) @@ -122,7 +122,7 @@ char* StringStorage::ReallocString(char* string, size_t old_length, size_t new_l pool_index++; size = size >> 1; } - EMP_ASSERT(pool_index < NUM_POOLS); + ROCKET_ASSERT(pool_index < NUM_POOLS); if (!storage->pools[pool_index].empty()) { @@ -166,9 +166,9 @@ void StringStorage::ReleaseString(char* string, size_t size) pool_index++; size = size >> 1; } - EMP_ASSERT(pool_index < NUM_POOLS); + ROCKET_ASSERT(pool_index < NUM_POOLS); - if (storage->pools[pool_index].size() < EMP_MAX_POOL_SIZE) + if (storage->pools[pool_index].size() < ROCKET_MAX_POOL_SIZE) { storage->pools[pool_index].push_back(string); return; @@ -188,7 +188,7 @@ StringStorage::StringID StringStorage::AddString(const char* &string, size_t str // Hash the incoming string Hash hash; - size_t hash_length = (length < EMP_MAX_HASH_LENGTH ? length : EMP_MAX_HASH_LENGTH); + size_t hash_length = (length < ROCKET_MAX_HASH_LENGTH ? length : ROCKET_MAX_HASH_LENGTH); HASH(hash, string, hash_length); // See if we can find the entry group for this hash ( strings with the same hash ) @@ -265,7 +265,7 @@ void StringStorage::RemoveReference(StringID string_id) StringEntry* entry = (StringEntry*)string_id; - EMP_ASSERT(entry->reference_count > 0); + ROCKET_ASSERT(entry->reference_count > 0); entry->reference_count--; if (entry->reference_count > 0) return; @@ -299,7 +299,7 @@ void StringStorage::RemoveReference(StringID string_id) entry->prev->next = NULL; } - EMP_ASSERT(storage->lookup.find(entry->hash) == storage->lookup.end() || (*storage->lookup.find(entry->hash)).second != entry); + ROCKET_ASSERT(storage->lookup.find(entry->hash) == storage->lookup.end() || (*storage->lookup.find(entry->hash)).second != entry); } free(entry->buffer); diff --git a/Source/Core/StringUtilities.cpp b/Source/Core/StringUtilities.cpp index 2023313fd..e43697de0 100644 --- a/Source/Core/StringUtilities.cpp +++ b/Source/Core/StringUtilities.cpp @@ -494,7 +494,7 @@ bool StringUtilities::UCS2toUTF8(const word* input, size_t input_size, String& o // Convert to little endian. word ch = (*w >> 8) & 0x00FF; ch |= (*w << 8) & 0xFF00; -// word ch = EMPConvertEndian(*w, EMP_ENDIAN_BIG); +// word ch = EMPConvertEndian(*w, ROCKET_ENDIAN_BIG); oc = (unsigned char *)&ch; switch (n) diff --git a/Source/Core/StyleSheetFactory.cpp b/Source/Core/StyleSheetFactory.cpp index 770661603..66bf1f228 100644 --- a/Source/Core/StyleSheetFactory.cpp +++ b/Source/Core/StyleSheetFactory.cpp @@ -49,7 +49,7 @@ static StyleSheetFactory* instance = NULL; StyleSheetFactory::StyleSheetFactory() { - EMP_ASSERT(instance == NULL); + ROCKET_ASSERT(instance == NULL); instance = this; } diff --git a/Source/Core/StyleSheetNode.cpp b/Source/Core/StyleSheetNode.cpp index 24e82d603..6895cbd46 100644 --- a/Source/Core/StyleSheetNode.cpp +++ b/Source/Core/StyleSheetNode.cpp @@ -295,7 +295,7 @@ bool StyleSheetNode::IsApplicable(const Element* element) const // We must have a parent; if not, something's amok with the style tree. if (parent == NULL) { - EMP_ERRORMSG("Invalid RCSS hierarchy."); + ROCKET_ERRORMSG("Invalid RCSS hierarchy."); return false; } @@ -318,7 +318,7 @@ bool StyleSheetNode::IsApplicable(const Element* element) const case CLASS: ancestor_classes.push_back(parent_node->name); break; case PSEUDO_CLASS: ancestor_pseudo_classes.push_back(parent_node->name); break; case STRUCTURAL_PSEUDO_CLASS: ancestor_structural_pseudo_classes.push_back(parent_node); break; - default: EMP_ERRORMSG("Invalid RCSS hierarchy."); return false; + default: ROCKET_ERRORMSG("Invalid RCSS hierarchy."); return false; } parent_node = parent_node->parent; @@ -327,7 +327,7 @@ bool StyleSheetNode::IsApplicable(const Element* element) const // Check for an invalid RCSS hierarchy. if (parent_node == NULL) { - EMP_ERRORMSG("Invalid RCSS hierarchy."); + ROCKET_ERRORMSG("Invalid RCSS hierarchy."); return false; } diff --git a/Source/Core/StyleSheetNodeSelectorEmpty.cpp b/Source/Core/StyleSheetNodeSelectorEmpty.cpp index 855db35eb..f8024502b 100644 --- a/Source/Core/StyleSheetNodeSelectorEmpty.cpp +++ b/Source/Core/StyleSheetNodeSelectorEmpty.cpp @@ -42,7 +42,7 @@ StyleSheetNodeSelectorEmpty::~StyleSheetNodeSelectorEmpty() } // Returns true if the element has no DOM children. -bool StyleSheetNodeSelectorEmpty::IsApplicable(const Element* element, int EMP_UNUSED(a), int EMP_UNUSED(b)) +bool StyleSheetNodeSelectorEmpty::IsApplicable(const Element* element, int ROCKET_UNUSED(a), int ROCKET_UNUSED(b)) { for (int i = 0; i < element->GetNumChildren(); ++i) { diff --git a/Source/Core/StyleSheetNodeSelectorFirstChild.cpp b/Source/Core/StyleSheetNodeSelectorFirstChild.cpp index 2de740ca3..3c619c883 100644 --- a/Source/Core/StyleSheetNodeSelectorFirstChild.cpp +++ b/Source/Core/StyleSheetNodeSelectorFirstChild.cpp @@ -42,7 +42,7 @@ StyleSheetNodeSelectorFirstChild::~StyleSheetNodeSelectorFirstChild() } // Returns true if the element is the first DOM child in its parent. -bool StyleSheetNodeSelectorFirstChild::IsApplicable(const Element* element, int EMP_UNUSED(a), int EMP_UNUSED(b)) +bool StyleSheetNodeSelectorFirstChild::IsApplicable(const Element* element, int ROCKET_UNUSED(a), int ROCKET_UNUSED(b)) { Element* parent = element->GetParentNode(); if (parent == NULL) diff --git a/Source/Core/StyleSheetNodeSelectorFirstOfType.cpp b/Source/Core/StyleSheetNodeSelectorFirstOfType.cpp index 2580e00bb..04d2c6a5a 100644 --- a/Source/Core/StyleSheetNodeSelectorFirstOfType.cpp +++ b/Source/Core/StyleSheetNodeSelectorFirstOfType.cpp @@ -42,7 +42,7 @@ StyleSheetNodeSelectorFirstOfType::~StyleSheetNodeSelectorFirstOfType() } // Returns true if the element is the first DOM child in its parent of its type. -bool StyleSheetNodeSelectorFirstOfType::IsApplicable(const Element* element, int EMP_UNUSED(a), int EMP_UNUSED(b)) +bool StyleSheetNodeSelectorFirstOfType::IsApplicable(const Element* element, int ROCKET_UNUSED(a), int ROCKET_UNUSED(b)) { Element* parent = element->GetParentNode(); if (parent == NULL) diff --git a/Source/Core/StyleSheetNodeSelectorLastChild.cpp b/Source/Core/StyleSheetNodeSelectorLastChild.cpp index a3d1219f9..abed84655 100644 --- a/Source/Core/StyleSheetNodeSelectorLastChild.cpp +++ b/Source/Core/StyleSheetNodeSelectorLastChild.cpp @@ -42,7 +42,7 @@ StyleSheetNodeSelectorLastChild::~StyleSheetNodeSelectorLastChild() } // Returns true if the element is the last DOM child in its parent. -bool StyleSheetNodeSelectorLastChild::IsApplicable(const Element* element, int EMP_UNUSED(a), int EMP_UNUSED(b)) +bool StyleSheetNodeSelectorLastChild::IsApplicable(const Element* element, int ROCKET_UNUSED(a), int ROCKET_UNUSED(b)) { Element* parent = element->GetParentNode(); if (parent == NULL) diff --git a/Source/Core/StyleSheetNodeSelectorLastOfType.cpp b/Source/Core/StyleSheetNodeSelectorLastOfType.cpp index 9418951ad..9ef6be9bf 100644 --- a/Source/Core/StyleSheetNodeSelectorLastOfType.cpp +++ b/Source/Core/StyleSheetNodeSelectorLastOfType.cpp @@ -42,7 +42,7 @@ StyleSheetNodeSelectorLastOfType::~StyleSheetNodeSelectorLastOfType() } // Returns true if the element is the last DOM child in its parent. -bool StyleSheetNodeSelectorLastOfType::IsApplicable(const Element* element, int EMP_UNUSED(a), int EMP_UNUSED(b)) +bool StyleSheetNodeSelectorLastOfType::IsApplicable(const Element* element, int ROCKET_UNUSED(a), int ROCKET_UNUSED(b)) { Element* parent = element->GetParentNode(); if (parent == NULL) diff --git a/Source/Core/StyleSheetNodeSelectorOnlyChild.cpp b/Source/Core/StyleSheetNodeSelectorOnlyChild.cpp index 689596e57..de70fbbf4 100644 --- a/Source/Core/StyleSheetNodeSelectorOnlyChild.cpp +++ b/Source/Core/StyleSheetNodeSelectorOnlyChild.cpp @@ -42,7 +42,7 @@ StyleSheetNodeSelectorOnlyChild::~StyleSheetNodeSelectorOnlyChild() } // Returns true if the element is the only non-trivial DOM child of its parent. -bool StyleSheetNodeSelectorOnlyChild::IsApplicable(const Element* element, int EMP_UNUSED(a), int EMP_UNUSED(b)) +bool StyleSheetNodeSelectorOnlyChild::IsApplicable(const Element* element, int ROCKET_UNUSED(a), int ROCKET_UNUSED(b)) { Element* parent = element->GetParentNode(); if (parent == NULL) diff --git a/Source/Core/StyleSheetNodeSelectorOnlyOfType.cpp b/Source/Core/StyleSheetNodeSelectorOnlyOfType.cpp index 4545e3d2d..a4a21846a 100644 --- a/Source/Core/StyleSheetNodeSelectorOnlyOfType.cpp +++ b/Source/Core/StyleSheetNodeSelectorOnlyOfType.cpp @@ -42,7 +42,7 @@ StyleSheetNodeSelectorOnlyOfType::~StyleSheetNodeSelectorOnlyOfType() } // Returns true if the element is the only DOM child of its parent of its type. -bool StyleSheetNodeSelectorOnlyOfType::IsApplicable(const Element* element, int EMP_UNUSED(a), int EMP_UNUSED(b)) +bool StyleSheetNodeSelectorOnlyOfType::IsApplicable(const Element* element, int ROCKET_UNUSED(a), int ROCKET_UNUSED(b)) { Element* parent = element->GetParentNode(); if (parent == NULL) diff --git a/Source/Core/StyleSheetSpecification.cpp b/Source/Core/StyleSheetSpecification.cpp index bbd1c6f15..959d5e800 100644 --- a/Source/Core/StyleSheetSpecification.cpp +++ b/Source/Core/StyleSheetSpecification.cpp @@ -39,13 +39,13 @@ static StyleSheetSpecification* instance = NULL; StyleSheetSpecification::StyleSheetSpecification() { - EMP_ASSERT(instance == NULL); + ROCKET_ASSERT(instance == NULL); instance = this; } StyleSheetSpecification::~StyleSheetSpecification() { - EMP_ASSERT(instance == this); + ROCKET_ASSERT(instance == this); instance = NULL; } diff --git a/Source/Core/SystemInterface.cpp b/Source/Core/SystemInterface.cpp index 239fcf5da..86f529d61 100644 --- a/Source/Core/SystemInterface.cpp +++ b/Source/Core/SystemInterface.cpp @@ -40,7 +40,7 @@ SystemInterface::~SystemInterface() { } -bool SystemInterface::LogMessage(Log::Type EMP_UNUSED(logtype), const String& message) +bool SystemInterface::LogMessage(Log::Type ROCKET_UNUSED(logtype), const String& message) { // By default we just send a platform message Log::PlatformMessage(message.CString()); diff --git a/Source/Core/TemplateCache.cpp b/Source/Core/TemplateCache.cpp index d445dc4ae..268e603b5 100644 --- a/Source/Core/TemplateCache.cpp +++ b/Source/Core/TemplateCache.cpp @@ -38,7 +38,7 @@ static TemplateCache* instance = NULL; TemplateCache::TemplateCache() { - EMP_ASSERT(instance == NULL); + ROCKET_ASSERT(instance == NULL); instance = this; } diff --git a/Source/Core/TextureDatabase.cpp b/Source/Core/TextureDatabase.cpp index 42760f469..d0c154e90 100644 --- a/Source/Core/TextureDatabase.cpp +++ b/Source/Core/TextureDatabase.cpp @@ -37,13 +37,13 @@ static TextureDatabase* instance = NULL; TextureDatabase::TextureDatabase() { - EMP_ASSERT(instance == NULL); + ROCKET_ASSERT(instance == NULL); instance = this; } TextureDatabase::~TextureDatabase() { - EMP_ASSERT(instance == this); + ROCKET_ASSERT(instance == this); instance = NULL; } diff --git a/Source/Core/TextureLayout.cpp b/Source/Core/TextureLayout.cpp index a998da92d..9c4af4cd0 100644 --- a/Source/Core/TextureLayout.cpp +++ b/Source/Core/TextureLayout.cpp @@ -59,8 +59,8 @@ void TextureLayout::AddRectangle(int id, const Vector2i& dimensions) // Returns one of the layout's rectangles. TextureLayoutRectangle& TextureLayout::GetRectangle(int index) { - EMP_ASSERT(index >= 0); - EMP_ASSERT(index < GetNumRectangles()); + ROCKET_ASSERT(index >= 0); + ROCKET_ASSERT(index < GetNumRectangles()); return rectangles[index]; } @@ -74,8 +74,8 @@ int TextureLayout::GetNumRectangles() const // Returns one of the layout's textures. TextureLayoutTexture& TextureLayout::GetTexture(int index) { - EMP_ASSERT(index >= 0); - EMP_ASSERT(index < GetNumTextures()); + ROCKET_ASSERT(index >= 0); + ROCKET_ASSERT(index < GetNumTextures()); return textures[index]; } diff --git a/Source/Core/TextureResource.cpp b/Source/Core/TextureResource.cpp index b33a7634b..b009bc729 100644 --- a/Source/Core/TextureResource.cpp +++ b/Source/Core/TextureResource.cpp @@ -29,7 +29,6 @@ #include "TextureResource.h" #include "FontFaceHandle.h" #include "TextureDatabase.h" -#include "TrialLogo.h" #include namespace Rocket { @@ -143,12 +142,6 @@ bool TextureResource::Load(RenderInterface* render_interface) const atoi(parameters[2].CString())); } } - else if (protocol == "trial") - { - // The requested texture is the trial logo. - TrialLogo::GenerateTexture(data, dimensions); - delete_data = false; - } // If texture data was generated, great! Otherwise, fallback to the LoadTexture() code and // hope the client knows what the hell to do with the question mark in their file name. diff --git a/Source/Core/TrialLogo.cpp b/Source/Core/TrialLogo.cpp deleted file mode 100644 index d3f7f711c..000000000 --- a/Source/Core/TrialLogo.cpp +++ /dev/null @@ -1,92 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "precompiled.h" -#include "TrialLogo.h" -#include "FontFaceHandle.h" -#include "LayoutEngine.h" -#include "TrialLogoTexture.h" -#include - -namespace Rocket { -namespace Core { - -const float LOGO_BEGIN = 5; -const float LOGO_END = 25; -const float LOGO_SLIDE = 1.5f; - -TrialLogo::TrialLogo(Context* _context) : logo_geometry(_context) -{ - context = _context; - start_time = GetSystemInterface()->GetElapsedTime(); - - logo_texture.Load("?trial::"); - - logo_geometry.SetTexture(&logo_texture); - std::vector< Vertex >& vertices = logo_geometry.GetVertices(); - std::vector< int >& indices = logo_geometry.GetIndices(); - - vertices.resize(4); - indices.resize(6); - - GeometryUtilities::GenerateQuad(&vertices[0], &indices[0], Vector2f(0, 0), Vector2f(128, 128), Colourb(255, 255, 255), Vector2f(0, 0), Vector2f(1, 1)); -} - -TrialLogo::~TrialLogo() -{ -} - -void TrialLogo::Render() -{ - float time_delta = GetSystemInterface()->GetElapsedTime() - start_time; - if (time_delta < LOGO_BEGIN || - time_delta > LOGO_END) - return; - - const Vector2i& dimensions = context->GetDimensions(); - if (dimensions.x < 256 || - dimensions.y < 256) - return; - - Vector2f logo_position((float) dimensions.x - 128, (float) dimensions.y - 96); - if (time_delta < LOGO_BEGIN + LOGO_SLIDE) - logo_position.x += (1.0f - (time_delta - LOGO_BEGIN) / LOGO_SLIDE) * 128; - if (time_delta > LOGO_END - LOGO_SLIDE) - logo_position.y += ((time_delta - (LOGO_END - LOGO_SLIDE)) / LOGO_SLIDE) * 96; - - logo_geometry.Render(logo_position); -} - -void TrialLogo::GenerateTexture(const byte*& texture_data, Vector2i& texture_dimensions) -{ - texture_data = (const byte*) logo_source; - texture_dimensions.x = 128; - texture_dimensions.y = 128; -} - -} -} diff --git a/Source/Core/TrialLogoTexture.h b/Source/Core/TrialLogoTexture.h deleted file mode 100644 index 61a205eb6..000000000 --- a/Source/Core/TrialLogoTexture.h +++ /dev/null @@ -1,4132 +0,0 @@ -/* - * This source file is part of libRocket, the HTML/CSS Interface Middleware - * - * For the latest information, see http://www.librocket.com - * - * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd - * - * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -namespace Rocket { -namespace Core { - -static const unsigned char logo_source[] = -{ - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xdc, 0xdd, 0xdf, 0x30, - 0xdb, 0xdc, 0xdd, 0x40, 0xd9, 0xda, 0xdc, 0x40, 0xd9, 0xda, 0xdb, 0x60, 0xd7, 0xd9, 0xda, 0x70, - 0xd4, 0xd6, 0xd7, 0x40, 0xd2, 0xd4, 0xd6, 0x40, 0xd2, 0xd3, 0xd5, 0x30, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0x23, 0x1f, 0x20, 0x40, 0x7c, 0x43, 0x37, 0x9f, 0x54, 0x3d, 0x38, 0xff, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xda, 0xdb, 0xdd, 0x10, 0xda, 0xdb, 0xdc, 0x50, - 0xd9, 0xda, 0xdc, 0x8f, 0xda, 0xdb, 0xdc, 0xcf, 0xd9, 0xda, 0xdb, 0xff, 0xd7, 0xd8, 0xda, 0xff, - 0xd5, 0xd6, 0xd8, 0xff, 0xd4, 0xd5, 0xd6, 0xff, 0xd2, 0xd4, 0xd5, 0xff, 0xd1, 0xd3, 0xd4, 0xff, - 0xcf, 0xd1, 0xd3, 0xff, 0xce, 0xd0, 0xd1, 0xff, 0xcc, 0xce, 0xcf, 0xff, 0xcb, 0xcd, 0xcf, 0xff, - 0xc9, 0xca, 0xcc, 0xcf, 0xc7, 0xc8, 0xca, 0x8f, 0xc4, 0xc6, 0xc8, 0x30, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0x23, 0x1f, 0x20, 0x40, - 0x7d, 0x4c, 0x3f, 0xbf, 0xa4, 0x35, 0x2a, 0xff, 0x9f, 0x1d, 0x1e, 0xff, 0x73, 0x38, 0x2d, 0xbf, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xd5, 0xd6, 0xd8, 0x50, 0xd6, 0xd7, 0xd9, 0xaf, 0xd5, 0xd7, 0xd8, 0xff, 0xd4, 0xd6, 0xd7, 0xff, - 0xd3, 0xd4, 0xd6, 0xff, 0xd1, 0xd2, 0xd4, 0xff, 0xd0, 0xd1, 0xd3, 0xff, 0xce, 0xcf, 0xd1, 0xff, - 0xcd, 0xce, 0xd0, 0xff, 0xcc, 0xcd, 0xcf, 0xff, 0xc9, 0xcb, 0xcd, 0xff, 0xc8, 0xca, 0xcb, 0xff, - 0xc7, 0xc9, 0xca, 0xff, 0xc5, 0xc7, 0xc9, 0xff, 0xc4, 0xc6, 0xc8, 0xff, 0xc3, 0xc4, 0xc6, 0xff, - 0xc2, 0xc3, 0xc6, 0xff, 0xc0, 0xc1, 0xc4, 0xff, 0xbe, 0xbf, 0xc2, 0xff, 0xbc, 0xbe, 0xc1, 0xdf, - 0xba, 0xbc, 0xbe, 0x70, 0xb7, 0xb9, 0xbc, 0x10, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0x23, 0x20, 0x20, 0x20, 0x7c, 0x53, 0x46, 0xbf, 0xbb, 0x3a, 0x2e, 0xff, - 0xba, 0x1f, 0x24, 0xff, 0xa3, 0x1d, 0x1f, 0xff, 0x8e, 0x1a, 0x1b, 0xff, 0x53, 0x36, 0x30, 0xbf, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xd0, 0xd2, 0xd3, 0x10, 0xd1, 0xd2, 0xd4, 0x80, 0xd1, 0xd3, 0xd4, 0xdf, - 0xd0, 0xd1, 0xd3, 0xff, 0xce, 0xd0, 0xd1, 0xff, 0xcd, 0xce, 0xd0, 0xff, 0xcb, 0xcd, 0xcf, 0xff, - 0xca, 0xcc, 0xcd, 0xff, 0xc8, 0xca, 0xcc, 0xff, 0xc7, 0xc9, 0xcb, 0xff, 0xc6, 0xc8, 0xca, 0xbf, - 0xc6, 0xc8, 0xca, 0x8f, 0xc6, 0xc7, 0xc9, 0x60, 0xc4, 0xc6, 0xc8, 0x40, 0xc3, 0xc5, 0xc7, 0x40, - 0xc2, 0xc3, 0xc5, 0x30, 0xc0, 0xc2, 0xc4, 0x40, 0xbf, 0xc1, 0xc3, 0x40, 0xbd, 0xbf, 0xc1, 0x40, - 0xbb, 0xbd, 0xbf, 0x70, 0xb9, 0xbb, 0xbd, 0x9f, 0xb7, 0xb9, 0xbb, 0xdf, 0xb5, 0xb7, 0xb9, 0xff, - 0xb4, 0xb6, 0xb8, 0xff, 0xb2, 0xb4, 0xb6, 0xef, 0xaf, 0xb1, 0xb4, 0x60, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0x57, 0x58, 0x5a, 0x70, 0xae, 0x62, 0x4e, 0xef, 0xe1, 0x6c, 0x55, 0xff, 0xc8, 0x50, 0x40, 0xff, - 0xa8, 0x1e, 0x20, 0xff, 0x92, 0x1a, 0x1c, 0xff, 0x7f, 0x16, 0x16, 0xff, 0x49, 0x31, 0x2c, 0x80, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xcb, 0xcd, 0xcf, 0x80, 0xcb, 0xcd, 0xcf, 0xef, 0xcb, 0xcc, 0xce, 0xff, 0xc9, 0xcb, 0xcc, 0xff, - 0xc7, 0xc9, 0xcb, 0xff, 0xc6, 0xc8, 0xca, 0xff, 0xc5, 0xc7, 0xc9, 0xff, 0xc3, 0xc5, 0xc7, 0xef, - 0xc3, 0xc5, 0xc7, 0x9f, 0xc3, 0xc4, 0xc6, 0x50, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xaf, 0xb1, 0xb4, 0x30, - 0xae, 0xb0, 0xb2, 0x9f, 0xab, 0xad, 0xaf, 0xff, 0xa9, 0xab, 0xae, 0xff, 0xa8, 0xaa, 0xad, 0xbf, - 0xa5, 0xa7, 0xa9, 0x10, 0xff, 0xff, 0xff, 0x0, 0x23, 0x1f, 0x20, 0x10, 0x89, 0x8a, 0x8d, 0xaf, - 0xcb, 0xcd, 0xcf, 0xff, 0xce, 0xae, 0xa2, 0xff, 0xd8, 0x77, 0x61, 0xff, 0xb5, 0x3d, 0x33, 0xff, - 0x97, 0x1b, 0x1c, 0xff, 0x83, 0x17, 0x17, 0xff, 0x6c, 0x18, 0x14, 0xff, 0x23, 0x1f, 0x20, 0x50, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xc5, 0xc7, 0xc9, 0x40, 0xc5, 0xc7, 0xc9, 0xdf, - 0xc4, 0xc6, 0xc8, 0xff, 0xc3, 0xc5, 0xc7, 0xff, 0xc2, 0xc4, 0xc6, 0xff, 0xc0, 0xc2, 0xc4, 0xff, - 0xbf, 0xc1, 0xc3, 0xff, 0xbf, 0xc1, 0xc3, 0xbf, 0xbf, 0xc1, 0xc3, 0x60, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xa6, 0xa8, 0xaa, 0x20, 0xa3, 0xa5, 0xa8, 0xaf, 0xa1, 0xa3, 0xa6, 0xff, - 0xa0, 0xa2, 0xa5, 0xdf, 0x7e, 0x80, 0x82, 0x60, 0xa1, 0xa3, 0xa6, 0xdf, 0xd6, 0xd7, 0xd9, 0xff, - 0xd7, 0xd9, 0xda, 0xff, 0xd2, 0xd3, 0xd5, 0xff, 0xae, 0x89, 0x7e, 0xff, 0x9c, 0x1c, 0x1e, 0xff, - 0x87, 0x17, 0x18, 0xff, 0x73, 0x11, 0x11, 0xff, 0x53, 0x23, 0x1c, 0xff, 0x23, 0x1f, 0x20, 0x20, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xbe, 0xc0, 0xc2, 0x10, 0xbf, 0xc1, 0xc3, 0x8f, 0xbf, 0xc0, 0xc3, 0xff, 0xbe, 0xc0, 0xc2, 0xff, - 0xbc, 0xbe, 0xc0, 0xff, 0xbb, 0xbd, 0xbf, 0xff, 0xba, 0xbc, 0xbe, 0xff, 0xb9, 0xbb, 0xbe, 0xbf, - 0xba, 0xbc, 0xbe, 0x40, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0x9c, 0x9e, 0xa1, 0x70, - 0x8f, 0x91, 0x94, 0xff, 0xb1, 0xb3, 0xb5, 0xff, 0xdd, 0xde, 0xdf, 0xff, 0xd8, 0xd9, 0xdb, 0xff, - 0xd3, 0xd5, 0xd6, 0xff, 0xcc, 0xce, 0xd0, 0xff, 0xb8, 0xba, 0xbc, 0xff, 0x8c, 0x7a, 0x75, 0xff, - 0x73, 0x2b, 0x23, 0xff, 0x64, 0xa, 0xa, 0xff, 0x44, 0x24, 0x1f, 0xdf, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xb8, 0xba, 0xbc, 0x30, - 0xb9, 0xbb, 0xbd, 0xcf, 0xb8, 0xba, 0xbc, 0xff, 0xb7, 0xb9, 0xbb, 0xff, 0xb6, 0xb8, 0xba, 0xff, - 0xb4, 0xb6, 0xb9, 0xff, 0xb3, 0xb5, 0xb8, 0xef, 0xb4, 0xb6, 0xb9, 0x60, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0x74, 0x75, 0x78, 0x60, - 0xb6, 0xb8, 0xba, 0xef, 0xe0, 0xe1, 0xe2, 0xff, 0xd9, 0xda, 0xdb, 0xff, 0xd3, 0xd4, 0xd6, 0xff, - 0xce, 0xcf, 0xd1, 0xff, 0xbb, 0xbd, 0xbf, 0xff, 0xb5, 0xb7, 0xba, 0xff, 0xb6, 0xb7, 0xba, 0xff, - 0xa5, 0xa7, 0xa9, 0xff, 0x73, 0x54, 0x4f, 0xff, 0x46, 0x39, 0x36, 0x8f, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xb2, 0xb4, 0xb6, 0x40, 0xb3, 0xb5, 0xb7, 0xef, - 0xb3, 0xb5, 0xb7, 0xff, 0xb0, 0xb3, 0xb5, 0xff, 0xaf, 0xb1, 0xb4, 0xff, 0xae, 0xb0, 0xb2, 0xff, - 0xae, 0xb0, 0xb2, 0xaf, 0xaf, 0xb1, 0xb4, 0x10, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0x74, 0x75, 0x78, 0x60, 0xbf, 0xc1, 0xc3, 0xff, - 0xe1, 0xe2, 0xe3, 0xff, 0xda, 0xdb, 0xdc, 0xff, 0xd4, 0xd5, 0xd7, 0xff, 0xce, 0xd0, 0xd2, 0xff, - 0xbe, 0xc0, 0xc2, 0xff, 0xb5, 0xb7, 0xba, 0xff, 0xb5, 0xb7, 0xba, 0xff, 0xb6, 0xb8, 0xba, 0xff, - 0xb6, 0xb8, 0xba, 0xff, 0xad, 0xaf, 0xb1, 0xff, 0x23, 0x20, 0x20, 0x30, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xad, 0xaf, 0xb2, 0x60, 0xad, 0xaf, 0xb2, 0xff, 0xac, 0xae, 0xb0, 0xff, - 0xaa, 0xac, 0xaf, 0xff, 0xaa, 0xac, 0xae, 0xff, 0xa7, 0xa9, 0xac, 0xff, 0xa8, 0xaa, 0xad, 0x60, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0x5d, 0x5e, 0x60, 0x30, 0xb6, 0xb8, 0xba, 0xff, 0xe2, 0xe3, 0xe4, 0xff, - 0xdb, 0xdc, 0xdd, 0xff, 0xd5, 0xd6, 0xd8, 0xff, 0xd0, 0xd1, 0xd3, 0xff, 0xc2, 0xc4, 0xc6, 0xff, - 0xb6, 0xb8, 0xba, 0xff, 0xb6, 0xb8, 0xba, 0xff, 0xb6, 0xb8, 0xba, 0xff, 0xb6, 0xb8, 0xba, 0xff, - 0xb5, 0xb7, 0xb9, 0xff, 0x8f, 0x91, 0x93, 0xdf, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xa6, 0xa9, 0xab, 0x60, 0xa6, 0xa9, 0xab, 0xff, 0xa5, 0xa8, 0xaa, 0xff, 0xa5, 0xa7, 0xa9, 0xff, - 0xa3, 0xa5, 0xa8, 0xff, 0xa2, 0xa5, 0xa7, 0xef, 0xa3, 0xa5, 0xa8, 0x30, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0x5d, 0x5e, 0x60, 0x30, 0xb7, 0xb9, 0xbb, 0xef, 0xe3, 0xe4, 0xe5, 0xff, 0xdc, 0xdd, 0xdf, 0xff, - 0xd5, 0xd7, 0xd8, 0xff, 0xcf, 0xd1, 0xd3, 0xff, 0xc4, 0xc5, 0xc7, 0xff, 0xb6, 0xb8, 0xba, 0xff, - 0xb6, 0xb7, 0xba, 0xff, 0xb6, 0xb8, 0xba, 0xff, 0xb6, 0xb8, 0xba, 0xff, 0xb5, 0xb7, 0xba, 0xff, - 0xb6, 0xb7, 0xba, 0xff, 0x7b, 0x7d, 0x7f, 0x8f, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xa0, 0xa3, 0xa5, 0x50, - 0xa1, 0xa3, 0xa6, 0xff, 0xa0, 0xa2, 0xa4, 0xff, 0x9f, 0xa1, 0xa3, 0xff, 0x9d, 0xa0, 0xa2, 0xff, - 0x9d, 0x9f, 0xa1, 0xef, 0x9e, 0xa0, 0xa2, 0x30, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0x22, 0x1f, 0x20, 0x10, - 0xae, 0xb0, 0xb3, 0xef, 0xe4, 0xe5, 0xe6, 0xff, 0xdb, 0xdd, 0xde, 0xff, 0xd7, 0xd8, 0xd9, 0xff, - 0xd0, 0xd1, 0xd3, 0xff, 0xc3, 0xc5, 0xc7, 0xff, 0xb6, 0xb8, 0xba, 0xff, 0xb5, 0xb7, 0xba, 0xff, - 0xb6, 0xb8, 0xba, 0xff, 0xb5, 0xb7, 0xba, 0xff, 0xb5, 0xb7, 0xba, 0xff, 0xb5, 0xb7, 0xba, 0xff, - 0xa5, 0xa7, 0xa9, 0xff, 0x23, 0x1f, 0x20, 0x20, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0x9a, 0x9c, 0x9f, 0x30, 0x9b, 0x9d, 0xa0, 0xef, - 0x9a, 0x9c, 0x9f, 0xff, 0x9a, 0x9c, 0x9e, 0xff, 0x98, 0x9b, 0x9d, 0xff, 0x98, 0x9a, 0x9c, 0xef, - 0x99, 0x9b, 0x9d, 0x30, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0x23, 0x1f, 0x20, 0x10, 0xa2, 0xa4, 0xa6, 0xcf, - 0xe6, 0xe7, 0xe8, 0xff, 0xdd, 0xde, 0xe0, 0xff, 0xd7, 0xd8, 0xda, 0xff, 0xd1, 0xd3, 0xd4, 0xff, - 0xc8, 0xca, 0xcc, 0xff, 0xb7, 0xb9, 0xbb, 0xff, 0xb6, 0xb8, 0xba, 0xff, 0xb5, 0xb7, 0xba, 0xff, - 0xb5, 0xb7, 0xb9, 0xff, 0xb5, 0xb7, 0xba, 0xff, 0xb6, 0xb8, 0xba, 0xff, 0xb5, 0xb7, 0xba, 0xff, - 0x85, 0x87, 0x8a, 0xaf, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0x94, 0x96, 0x99, 0x10, 0x96, 0x98, 0x9b, 0xdf, 0x95, 0x97, 0x9a, 0xff, - 0x94, 0x96, 0x99, 0xff, 0x93, 0x95, 0x98, 0xff, 0x92, 0x94, 0x97, 0xef, 0x93, 0x95, 0x98, 0x30, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0x85, 0x87, 0x89, 0x9f, 0xe3, 0xe4, 0xe5, 0xff, - 0xdf, 0xe0, 0xe1, 0xff, 0xd7, 0xd8, 0xda, 0xff, 0xd2, 0xd3, 0xd5, 0xff, 0xc8, 0xca, 0xcc, 0xff, - 0xb7, 0xb9, 0xbb, 0xff, 0xb6, 0xb8, 0xba, 0xff, 0xb6, 0xb8, 0xba, 0xff, 0xb6, 0xb8, 0xba, 0xff, - 0xb5, 0xb7, 0xb9, 0xff, 0xb5, 0xb7, 0xba, 0xff, 0xb6, 0xb8, 0xba, 0xff, 0xad, 0xaf, 0xb2, 0xff, - 0x51, 0x51, 0x53, 0x40, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0x90, 0x92, 0x95, 0xaf, 0x90, 0x92, 0x94, 0xff, 0x8f, 0x91, 0x93, 0xff, - 0x8e, 0x90, 0x92, 0xff, 0x8d, 0x8f, 0x92, 0xff, 0x8d, 0x8f, 0x92, 0x60, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0x74, 0x75, 0x78, 0x60, 0xd4, 0xd6, 0xd7, 0xff, 0xdf, 0xe0, 0xe2, 0xff, - 0xd8, 0xd9, 0xda, 0xff, 0xd2, 0xd3, 0xd5, 0xff, 0xcc, 0xce, 0xcf, 0xff, 0xb8, 0xba, 0xbc, 0xff, - 0xb5, 0xb7, 0xba, 0xff, 0xb6, 0xb8, 0xba, 0xff, 0xb6, 0xb8, 0xba, 0xff, 0xb6, 0xb8, 0xba, 0xff, - 0xb6, 0xb8, 0xba, 0xff, 0xb5, 0xb7, 0xba, 0xff, 0xb6, 0xb8, 0xba, 0xff, 0x88, 0x8a, 0x8d, 0xbf, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0x8b, 0x8d, 0x90, 0x70, 0x8c, 0x8e, 0x90, 0xff, 0x8a, 0x8c, 0x8f, 0xff, 0x89, 0x8b, 0x8e, 0xff, - 0x88, 0x8a, 0x8d, 0xff, 0x89, 0x8b, 0x8d, 0x8f, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0x23, 0x20, 0x21, 0x20, 0xc1, 0xc2, 0xc4, 0xef, 0xe0, 0xe1, 0xe2, 0xff, 0xd8, 0xda, 0xdb, 0xff, - 0xd3, 0xd5, 0xd6, 0xff, 0xcc, 0xce, 0xcf, 0xff, 0xba, 0xbb, 0xbe, 0xff, 0xb6, 0xb8, 0xba, 0xff, - 0xb6, 0xb7, 0xba, 0xff, 0xb6, 0xb8, 0xba, 0xff, 0xb5, 0xb7, 0xba, 0xff, 0xb5, 0xb7, 0xba, 0xff, - 0xb6, 0xb8, 0xba, 0xff, 0xb6, 0xb8, 0xba, 0xff, 0xad, 0xaf, 0xb1, 0xff, 0x51, 0x52, 0x54, 0x40, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0x85, 0x88, 0x8a, 0x10, - 0x87, 0x89, 0x8b, 0xef, 0x86, 0x88, 0x8b, 0xff, 0x84, 0x87, 0x89, 0xff, 0x84, 0x86, 0x89, 0xff, - 0x83, 0x85, 0x88, 0xdf, 0x85, 0x87, 0x89, 0x10, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0x9a, 0x9c, 0x9e, 0xcf, 0xe0, 0xe1, 0xe2, 0xff, 0xd9, 0xdb, 0xdc, 0xff, 0xd4, 0xd5, 0xd7, 0xff, - 0xcf, 0xd0, 0xd2, 0xff, 0xbc, 0xbe, 0xc1, 0xff, 0xb6, 0xb8, 0xba, 0xff, 0xb6, 0xb8, 0xba, 0xff, - 0xb6, 0xb8, 0xba, 0xff, 0xb6, 0xb8, 0xba, 0xff, 0xb6, 0xb8, 0xba, 0xff, 0xb5, 0xb7, 0xba, 0xff, - 0xb6, 0xb8, 0xba, 0xff, 0xb6, 0xb8, 0xba, 0xff, 0x86, 0x88, 0x8a, 0xaf, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0x82, 0x84, 0x86, 0x9f, - 0x81, 0x83, 0x86, 0xff, 0x80, 0x82, 0x85, 0xff, 0x80, 0x82, 0x84, 0xff, 0x7e, 0x80, 0x83, 0xff, - 0x7e, 0x80, 0x83, 0x60, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0x74, 0x75, 0x78, 0x80, - 0xdc, 0xdd, 0xde, 0xff, 0xda, 0xdb, 0xdc, 0xff, 0xd4, 0xd5, 0xd7, 0xff, 0xcf, 0xd0, 0xd2, 0xff, - 0xbe, 0xc0, 0xc2, 0xff, 0xb5, 0xb7, 0xba, 0xff, 0xb5, 0xb7, 0xba, 0xff, 0xb5, 0xb7, 0xba, 0xff, - 0xb6, 0xb8, 0xba, 0xff, 0xb5, 0xb7, 0xba, 0xff, 0xb6, 0xb8, 0xba, 0xff, 0xb6, 0xb8, 0xba, 0xff, - 0xb6, 0xb8, 0xba, 0xff, 0xa1, 0xa3, 0xa6, 0xff, 0x60, 0x61, 0x63, 0x40, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0x7d, 0x7e, 0x81, 0x20, 0x7e, 0x7f, 0x82, 0xff, - 0x7c, 0x7e, 0x81, 0xff, 0x7b, 0x7c, 0x7f, 0xff, 0x7a, 0x7c, 0x7e, 0xff, 0x79, 0x7b, 0x7e, 0xdf, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0x23, 0x1f, 0x20, 0x20, 0xb9, 0xbb, 0xbe, 0xef, - 0xdb, 0xdc, 0xde, 0xff, 0xd5, 0xd7, 0xd8, 0xff, 0xd0, 0xd1, 0xd3, 0xff, 0xc4, 0xc6, 0xc8, 0xff, - 0xb6, 0xb8, 0xba, 0xff, 0xb5, 0xb7, 0xba, 0xff, 0xb6, 0xb7, 0xba, 0xff, 0xb6, 0xb8, 0xba, 0xff, - 0xb5, 0xb7, 0xba, 0xff, 0xb6, 0xb8, 0xba, 0xff, 0xb6, 0xb8, 0xba, 0xff, 0xb5, 0xb7, 0xba, 0xff, - 0xb6, 0xb8, 0xba, 0xff, 0x82, 0x83, 0x86, 0xff, 0x93, 0x95, 0x98, 0x40, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0x78, 0x79, 0x7c, 0x9f, 0x78, 0x7a, 0x7d, 0xff, - 0x78, 0x79, 0x7c, 0xff, 0x77, 0x78, 0x7b, 0xff, 0x75, 0x76, 0x79, 0xff, 0x75, 0x76, 0x79, 0x60, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0x8c, 0x8e, 0x90, 0xbf, 0xd9, 0xda, 0xdc, 0xff, - 0xd6, 0xd7, 0xd8, 0xff, 0xd0, 0xd1, 0xd3, 0xff, 0xc3, 0xc5, 0xc7, 0xff, 0xb6, 0xb8, 0xba, 0xff, - 0xb6, 0xb8, 0xba, 0xff, 0xb6, 0xb8, 0xba, 0xff, 0xb6, 0xb8, 0xba, 0xff, 0xb5, 0xb7, 0xba, 0xff, - 0xb5, 0xb7, 0xba, 0xff, 0xb5, 0xb7, 0xba, 0xff, 0xb6, 0xb8, 0xba, 0xff, 0xb6, 0xb8, 0xba, 0xff, - 0x8d, 0x8f, 0x91, 0xef, 0x9c, 0x9f, 0xa1, 0xff, 0x9b, 0x9d, 0xa0, 0x30, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0x73, 0x74, 0x77, 0x20, 0x73, 0x75, 0x77, 0xff, 0x73, 0x74, 0x77, 0xff, - 0x72, 0x73, 0x76, 0xff, 0x71, 0x73, 0x75, 0xff, 0x70, 0x72, 0x74, 0xef, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0x23, 0x1f, 0x20, 0x30, 0x6c, 0x59, 0x54, 0x8f, 0xc3, 0xc4, 0xc6, 0xff, 0xd6, 0xd7, 0xd9, 0xff, - 0xd1, 0xd2, 0xd4, 0xff, 0xc8, 0xca, 0xcb, 0xff, 0xb7, 0xb9, 0xbc, 0xff, 0xb6, 0xb7, 0xba, 0xff, - 0xb6, 0xb7, 0xba, 0xff, 0xb6, 0xb8, 0xba, 0xff, 0xb6, 0xb8, 0xba, 0xff, 0xb6, 0xb8, 0xba, 0xff, - 0xb5, 0xb7, 0xba, 0xff, 0xb6, 0xb8, 0xba, 0xff, 0xb5, 0xb7, 0xba, 0xff, 0xa3, 0xa5, 0xa7, 0xef, - 0x86, 0x88, 0x8a, 0x70, 0xa6, 0xa9, 0xab, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0x6f, 0x71, 0x73, 0x80, 0x6f, 0x70, 0x73, 0xff, 0x6e, 0x70, 0x72, 0xff, - 0x6d, 0x6f, 0x71, 0xff, 0x6d, 0x6e, 0x71, 0xff, 0x6c, 0x6d, 0x70, 0x9f, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0x6b, 0x4e, 0x45, 0x60, 0x9e, 0x48, 0x38, 0xdf, - 0xab, 0x2c, 0x26, 0xff, 0x94, 0x87, 0x83, 0xff, 0xd4, 0xd6, 0xd7, 0xff, 0xd1, 0xd3, 0xd4, 0xff, - 0xc9, 0xcb, 0xcd, 0xff, 0xb7, 0xb9, 0xbb, 0xff, 0xb5, 0xb7, 0xba, 0xff, 0xb6, 0xb8, 0xba, 0xff, - 0xb6, 0xb8, 0xba, 0xff, 0xb5, 0xb7, 0xba, 0xff, 0xb6, 0xb8, 0xba, 0xff, 0xb5, 0xb7, 0xba, 0xff, - 0xb6, 0xb8, 0xba, 0xff, 0xb6, 0xb8, 0xba, 0xff, 0xac, 0xaf, 0xb1, 0xff, 0x67, 0x68, 0x6a, 0x50, - 0xb1, 0xb3, 0xb6, 0x80, 0xb1, 0xb3, 0xb6, 0xbf, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0x6a, 0x6c, 0x6e, 0xdf, 0x6b, 0x6c, 0x6e, 0xff, 0x69, 0x6a, 0x6d, 0xff, - 0x68, 0x69, 0x6c, 0xff, 0x68, 0x6a, 0x6c, 0xff, 0x67, 0x69, 0x6b, 0x60, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0x72, 0x52, 0x48, 0x30, 0xaf, 0x51, 0x3e, 0xcf, 0xd0, 0x1e, 0x26, 0xff, 0xb9, 0x1f, 0x24, 0xff, - 0x8c, 0x4b, 0x3e, 0xff, 0xc1, 0xc3, 0xc5, 0xff, 0xd2, 0xd3, 0xd5, 0xff, 0xc6, 0xc8, 0xca, 0xff, - 0xb7, 0xb9, 0xbb, 0xff, 0xb6, 0xb8, 0xba, 0xff, 0xb5, 0xb7, 0xba, 0xff, 0xb6, 0xb8, 0xba, 0xff, - 0xb6, 0xb8, 0xba, 0xff, 0xb5, 0xb7, 0xba, 0xff, 0xb6, 0xb8, 0xba, 0xff, 0xb5, 0xb7, 0xba, 0xff, - 0xb5, 0xb7, 0xba, 0xff, 0xb5, 0xb7, 0xba, 0xff, 0x7b, 0x7d, 0x7f, 0x8f, 0xff, 0xff, 0xff, 0x0, - 0xbd, 0xbf, 0xc1, 0xaf, 0xbc, 0xbd, 0xc0, 0x70, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0x66, 0x67, 0x69, 0x20, 0x66, 0x67, 0x69, 0xff, 0x65, 0x66, 0x69, 0xff, 0x65, 0x66, 0x68, 0xff, - 0x63, 0x65, 0x67, 0xff, 0x63, 0x64, 0x66, 0xff, 0x63, 0x64, 0x66, 0x40, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0x23, 0x1f, 0x20, 0x10, - 0xc6, 0x57, 0x42, 0xef, 0xd6, 0x1f, 0x27, 0xff, 0xbe, 0x1f, 0x24, 0xff, 0xa6, 0x1d, 0x20, 0xff, - 0x91, 0x84, 0x81, 0xff, 0xbd, 0xbf, 0xc1, 0xff, 0xc0, 0xc1, 0xc4, 0xff, 0xb6, 0xb8, 0xba, 0xff, - 0xb6, 0xb8, 0xba, 0xff, 0xb5, 0xb7, 0xba, 0xff, 0xb6, 0xb8, 0xba, 0xff, 0xb5, 0xb7, 0xba, 0xff, - 0xb6, 0xb8, 0xba, 0xff, 0xb6, 0xb8, 0xba, 0xff, 0xb5, 0xb7, 0xba, 0xff, 0xb5, 0xb7, 0xba, 0xff, - 0xb5, 0xb7, 0xba, 0xff, 0x81, 0x82, 0x85, 0x9f, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xc9, 0xca, 0xcc, 0xef, 0xc3, 0xc5, 0xc7, 0x10, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0x62, 0x63, 0x66, 0x70, 0x62, 0x63, 0x65, 0xff, 0x61, 0x63, 0x65, 0xff, 0x60, 0x61, 0x64, 0xff, - 0x5f, 0x60, 0x63, 0xff, 0x5e, 0x5f, 0x62, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xb2, 0x80, 0x70, 0xbf, - 0xe0, 0x5e, 0x48, 0xff, 0xc3, 0x1f, 0x25, 0xff, 0xac, 0x1e, 0x22, 0xff, 0x84, 0x47, 0x3a, 0xff, - 0xb6, 0xb8, 0xba, 0xff, 0xb6, 0xb8, 0xba, 0xff, 0xb6, 0xb8, 0xba, 0xff, 0xb5, 0xb7, 0xba, 0xff, - 0xb5, 0xb7, 0xba, 0xff, 0xb5, 0xb7, 0xba, 0xff, 0xb5, 0xb7, 0xba, 0xff, 0xb5, 0xb7, 0xba, 0xff, - 0xb6, 0xb8, 0xba, 0xff, 0xb5, 0xb7, 0xba, 0xff, 0xb5, 0xb7, 0xba, 0xff, 0xb6, 0xb8, 0xba, 0xff, - 0x96, 0x98, 0x9b, 0xcf, 0x23, 0x1f, 0x20, 0x10, 0xff, 0xff, 0xff, 0x0, 0xd6, 0xd7, 0xd9, 0x50, - 0xd4, 0xd6, 0xd7, 0x9f, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0x5e, 0x5f, 0x61, 0xaf, 0x5d, 0x5e, 0x61, 0xff, 0x5d, 0x5e, 0x60, 0xff, 0x5c, 0x5d, 0x5f, 0xff, - 0x5b, 0x5c, 0x5f, 0xff, 0x5b, 0x5c, 0x5e, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0x73, 0x60, 0x5a, 0x60, 0xec, 0x8e, 0x75, 0xff, - 0xc8, 0x20, 0x26, 0xff, 0xb0, 0x1f, 0x22, 0xff, 0x99, 0x1c, 0x1d, 0xff, 0x8d, 0x7a, 0x75, 0xff, - 0xb5, 0xb7, 0xba, 0xff, 0x99, 0x93, 0x92, 0xff, 0x7c, 0x5a, 0x54, 0xff, 0x58, 0x35, 0x2f, 0xff, - 0xa5, 0xa7, 0xa9, 0xff, 0xb6, 0xb8, 0xba, 0xff, 0xb6, 0xb7, 0xba, 0xff, 0xb5, 0xb7, 0xb9, 0xff, - 0xb6, 0xb8, 0xba, 0xff, 0xb5, 0xb7, 0xba, 0xff, 0xb6, 0xb8, 0xba, 0xff, 0x96, 0x98, 0x9b, 0xcf, - 0x23, 0x1f, 0x20, 0x10, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xe2, 0xe3, 0xe4, 0x8f, - 0xde, 0xdf, 0xe0, 0x10, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0x5a, 0x5b, 0x5d, 0xcf, 0x59, 0x5a, 0x5c, 0xff, 0x58, 0x59, 0x5b, 0xff, 0x58, 0x59, 0x5b, 0xff, - 0x57, 0x58, 0x5a, 0xff, 0x56, 0x57, 0x59, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0x23, 0x1f, 0x20, 0x10, 0xcb, 0x95, 0x84, 0xef, 0xd1, 0x3e, 0x33, 0xff, - 0xb7, 0x20, 0x24, 0xff, 0x9f, 0x1d, 0x1f, 0xff, 0x7b, 0x2e, 0x25, 0xff, 0x94, 0x87, 0x83, 0xff, - 0x89, 0x50, 0x44, 0xff, 0x7f, 0x20, 0x1b, 0xff, 0x63, 0x14, 0x10, 0xff, 0x90, 0x84, 0x82, 0xff, - 0xb6, 0xb8, 0xba, 0xff, 0xb6, 0xb8, 0xba, 0xff, 0xb6, 0xb8, 0xba, 0xff, 0xb6, 0xb8, 0xba, 0xff, - 0xb5, 0xb7, 0xba, 0xff, 0xb6, 0xb7, 0xba, 0xff, 0x96, 0x98, 0x9b, 0xcf, 0x23, 0x1f, 0x20, 0x10, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xf3, 0xf4, 0xf4, 0x20, 0xee, 0xee, 0xef, 0x70, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0x56, 0x56, 0x59, 0xff, 0x56, 0x56, 0x58, 0xff, 0x54, 0x55, 0x57, 0xff, 0x53, 0x54, 0x56, 0xff, - 0x53, 0x53, 0x55, 0xff, 0x52, 0x52, 0x54, 0xff, 0x51, 0x51, 0x53, 0x30, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0x92, 0x85, 0x81, 0x80, 0xe0, 0x78, 0x60, 0xff, 0xbb, 0x1f, 0x24, 0xff, - 0x8a, 0x3c, 0x2f, 0xff, 0x79, 0x34, 0x29, 0xff, 0x8e, 0x44, 0x35, 0xff, 0xa7, 0x2a, 0x25, 0xff, - 0x8d, 0x19, 0x1a, 0xff, 0x6b, 0xe, 0xd, 0xff, 0x78, 0x5e, 0x59, 0xff, 0xb6, 0xb8, 0xba, 0xff, - 0xb5, 0xb7, 0xba, 0xff, 0xb6, 0xb8, 0xba, 0xff, 0xb6, 0xb8, 0xba, 0xff, 0xb6, 0xb8, 0xba, 0xff, - 0xb6, 0xb8, 0xba, 0xff, 0x8b, 0x8e, 0x90, 0xcf, 0x23, 0x20, 0x20, 0x10, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xf9, 0xf9, 0xf9, 0x20, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0x52, 0x52, 0x54, 0xff, 0x51, 0x52, 0x54, 0xff, 0x50, 0x50, 0x52, 0xff, 0x50, 0x51, 0x53, 0xff, - 0x4f, 0x4f, 0x51, 0xff, 0x4e, 0x4e, 0x50, 0xff, 0x4e, 0x4e, 0x50, 0x60, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0x23, 0x1f, 0x20, 0x10, 0xc5, 0x94, 0x85, 0xef, 0xbb, 0x39, 0x2e, 0xff, 0x76, 0x48, 0x3c, 0x80, - 0x72, 0x53, 0x49, 0x30, 0xc4, 0x3d, 0x30, 0xef, 0xb8, 0x1f, 0x23, 0xff, 0x94, 0x1b, 0x1c, 0xff, - 0x72, 0x11, 0x11, 0xff, 0x65, 0x36, 0x2e, 0xff, 0xad, 0xaf, 0xb1, 0xff, 0xb6, 0xb7, 0xba, 0xff, - 0xb6, 0xb8, 0xba, 0xff, 0xb6, 0xb7, 0xba, 0xff, 0xb5, 0xb7, 0xba, 0xff, 0xb6, 0xb8, 0xba, 0xff, - 0x79, 0x7b, 0x7d, 0xaf, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0x4c, 0x4c, 0x4e, 0x20, - 0x4d, 0x4e, 0x50, 0xff, 0x4d, 0x4d, 0x4f, 0xff, 0x4d, 0x4d, 0x4f, 0xff, 0x4b, 0x4c, 0x4e, 0xff, - 0x4c, 0x4c, 0x4e, 0xff, 0x4b, 0x4b, 0x4d, 0xff, 0x49, 0x49, 0x4b, 0x9f, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0x9a, 0x62, 0x53, 0x9f, 0xc8, 0x61, 0x4e, 0xff, 0x79, 0x49, 0x3d, 0x60, 0x72, 0x52, 0x49, 0x30, - 0xca, 0x3f, 0x31, 0xef, 0xc0, 0x20, 0x25, 0xff, 0x9c, 0x1c, 0x1e, 0xff, 0x79, 0x14, 0x14, 0xff, - 0x5f, 0x21, 0x1a, 0xff, 0x9f, 0x98, 0x98, 0xff, 0xb6, 0xb8, 0xba, 0xff, 0xb5, 0xb7, 0xba, 0xff, - 0xb6, 0xb8, 0xba, 0xff, 0xb6, 0xb7, 0xba, 0xff, 0xac, 0xaf, 0xb1, 0xff, 0x7f, 0x50, 0x46, 0xff, - 0x74, 0x39, 0x2e, 0xbf, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0x4a, 0x4a, 0x4c, 0x40, - 0x49, 0x49, 0x4b, 0xff, 0x4a, 0x4a, 0x4c, 0xff, 0x48, 0x48, 0x4a, 0xff, 0x48, 0x48, 0x4a, 0xff, - 0x47, 0x47, 0x49, 0xff, 0x47, 0x46, 0x48, 0xff, 0x46, 0x46, 0x48, 0xff, 0x45, 0x44, 0x46, 0x10, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0x23, 0x1f, 0x20, 0x20, - 0xae, 0x41, 0x32, 0xff, 0x7b, 0x4b, 0x3e, 0x60, 0xbe, 0x50, 0x3b, 0x40, 0xca, 0x79, 0x63, 0xef, - 0xcd, 0x49, 0x3a, 0xff, 0xa3, 0x1d, 0x1f, 0xff, 0x81, 0x15, 0x16, 0xff, 0x61, 0x13, 0xf, 0xff, - 0x8b, 0x79, 0x76, 0xff, 0xb6, 0xb8, 0xba, 0xff, 0xb5, 0xb7, 0xb9, 0xff, 0xb5, 0xb7, 0xba, 0xff, - 0xb5, 0xb7, 0xba, 0xff, 0xa0, 0x9a, 0x99, 0xff, 0x7c, 0x3d, 0x32, 0xff, 0x91, 0x1a, 0x1b, 0xff, - 0x83, 0x3a, 0x2e, 0xef, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0x46, 0x45, 0x47, 0xff, 0x45, 0x45, 0x47, 0xff, 0x45, 0x45, 0x47, 0xff, 0x45, 0x45, 0x46, 0xff, - 0x44, 0x44, 0x46, 0xff, 0x43, 0x43, 0x45, 0xff, 0x43, 0x43, 0x44, 0xff, 0x42, 0x42, 0x44, 0x80, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0x8d, 0x4c, 0x3d, 0x9f, - 0x89, 0x4a, 0x3b, 0x9f, 0xed, 0x1c, 0x27, 0x9f, 0xc0, 0x67, 0x51, 0xff, 0xdf, 0x78, 0x61, 0xff, - 0xab, 0x1f, 0x21, 0xff, 0x87, 0x17, 0x18, 0xff, 0x68, 0xc, 0xc, 0xff, 0x6c, 0x4a, 0x43, 0xff, - 0xb6, 0xb8, 0xba, 0xff, 0xb5, 0xb7, 0xba, 0xff, 0xb5, 0xb7, 0xba, 0xff, 0xb6, 0xb8, 0xba, 0xff, - 0x84, 0x6d, 0x68, 0xff, 0x77, 0x25, 0x1e, 0xff, 0x8e, 0x1a, 0x1a, 0xff, 0x9e, 0x1d, 0x1f, 0xff, - 0x8e, 0x3d, 0x30, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0x43, 0x43, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x42, 0x41, 0x43, 0xff, 0x41, 0x40, 0x42, 0xff, - 0x41, 0x40, 0x42, 0xff, 0x40, 0x3f, 0x41, 0xff, 0x40, 0x3f, 0x41, 0xff, 0x3f, 0x3e, 0x40, 0xff, - 0x3e, 0x3d, 0x3f, 0x30, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0x22, 0x1f, 0x20, 0x10, 0x76, 0x4b, 0x3f, 0xcf, - 0xee, 0x1d, 0x28, 0x70, 0xc9, 0x48, 0x36, 0xff, 0xde, 0x94, 0x7e, 0xff, 0xb6, 0x2c, 0x28, 0xff, - 0x8f, 0x1a, 0x1b, 0xff, 0x6f, 0x10, 0x10, 0xff, 0x56, 0x2f, 0x28, 0xff, 0x30, 0x2e, 0x30, 0xff, - 0x9c, 0x9e, 0xa1, 0xff, 0xb5, 0xb7, 0xba, 0xff, 0xa5, 0xa7, 0xa9, 0xff, 0x74, 0x75, 0x78, 0x80, - 0x70, 0x29, 0x21, 0xff, 0x8a, 0x19, 0x19, 0xff, 0x99, 0x1c, 0x1d, 0xff, 0xaa, 0x1f, 0x21, 0xff, - 0xbb, 0x20, 0x24, 0xff, 0x23, 0x1f, 0x20, 0x40, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0x40, 0x40, 0x42, 0xef, 0x3f, 0x3e, 0x40, 0xff, 0x3f, 0x3e, 0x40, 0xff, 0x3e, 0x3d, 0x3f, 0xff, - 0x3d, 0x3d, 0x3e, 0xff, 0x3e, 0x3d, 0x3e, 0xff, 0x3c, 0x3b, 0x3d, 0xff, 0x3c, 0x3c, 0x3d, 0xff, - 0x3a, 0x3a, 0x3b, 0xdf, 0x3a, 0x39, 0x3a, 0x10, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0x23, 0x1f, 0x20, 0x70, 0x23, 0x1f, 0x20, 0x10, - 0xed, 0x1c, 0x27, 0xdf, 0xbf, 0x80, 0x6e, 0xff, 0xc5, 0x52, 0x42, 0xff, 0x97, 0x1b, 0x1c, 0xff, - 0x72, 0x1b, 0x16, 0xff, 0x94, 0x75, 0x6e, 0xff, 0xef, 0xef, 0xf0, 0xff, 0x94, 0x8e, 0x82, 0xff, - 0x23, 0x1f, 0x20, 0xff, 0x6f, 0x70, 0x73, 0xcf, 0x5d, 0x5e, 0x61, 0x30, 0xff, 0xff, 0xff, 0x0, - 0x6f, 0x36, 0x2b, 0xbf, 0x97, 0x1b, 0x1d, 0xff, 0xa6, 0x1d, 0x20, 0xff, 0xb7, 0x1f, 0x23, 0xff, - 0xc8, 0x20, 0x25, 0xff, 0x23, 0x1f, 0x20, 0x40, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0x3d, 0x3c, 0x3e, 0xbf, 0x3c, 0x3b, 0x3d, 0xff, 0x3c, 0x3b, 0x3d, 0xff, 0x3b, 0x3b, 0x3c, 0xff, - 0x3a, 0x3a, 0x3b, 0xff, 0x3a, 0x39, 0x3a, 0xff, 0x3a, 0x39, 0x3b, 0xff, 0x39, 0x38, 0x39, 0xff, - 0x39, 0x37, 0x39, 0xff, 0x38, 0x37, 0x38, 0xcf, 0x37, 0x35, 0x37, 0x30, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0x23, 0x1f, 0x20, 0x10, 0xee, 0x1c, 0x27, 0x20, - 0xbd, 0x5e, 0x49, 0xff, 0xd9, 0x7e, 0x68, 0xff, 0x9f, 0x1d, 0x1e, 0xff, 0x7a, 0x35, 0x2b, 0xff, - 0xca, 0xc1, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xef, 0xff, 0xff, 0xd1, 0x67, 0xff, - 0xcc, 0x67, 0x3b, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0x68, 0x3f, 0x35, 0x80, 0xa2, 0x1d, 0x1f, 0xff, 0xb3, 0x1f, 0x23, 0xff, 0xc4, 0x1f, 0x25, 0xff, - 0xcd, 0x44, 0x36, 0xff, 0x23, 0x20, 0x20, 0x30, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0x3a, 0x39, 0x3b, 0x80, 0x38, 0x37, 0x39, 0xff, 0x39, 0x38, 0x3a, 0xff, 0x38, 0x36, 0x38, 0xff, - 0x37, 0x36, 0x37, 0xff, 0x37, 0x35, 0x37, 0xff, 0x37, 0x35, 0x37, 0xff, 0x37, 0x35, 0x37, 0xff, - 0x36, 0x34, 0x36, 0xff, 0x35, 0x34, 0x35, 0xff, 0x34, 0x33, 0x34, 0xef, 0x34, 0x32, 0x33, 0x50, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0x5f, 0x60, 0x62, 0x20, 0x5e, 0x5f, 0x62, 0x70, 0x88, 0x70, 0x69, 0xdf, - 0xc3, 0x87, 0x76, 0xff, 0xab, 0x30, 0x2a, 0xff, 0x8e, 0x4a, 0x32, 0xff, 0xf1, 0xd6, 0x95, 0xff, - 0xff, 0xfa, 0xf0, 0xff, 0xff, 0xe1, 0x93, 0xff, 0xff, 0xd2, 0x51, 0xff, 0xfb, 0xae, 0x3c, 0xff, - 0xf0, 0x58, 0x26, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0x74, 0x42, 0x36, 0x8f, 0xb0, 0x1f, 0x22, 0xff, 0xc1, 0x20, 0x25, 0xff, 0xd6, 0x44, 0x36, 0xff, - 0xb0, 0x74, 0x63, 0xcf, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0x37, 0x35, 0x37, 0x30, 0x36, 0x35, 0x36, 0xff, 0x35, 0x34, 0x35, 0xff, 0x36, 0x34, 0x36, 0xff, - 0x35, 0x33, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x34, 0x32, 0x34, 0xff, 0x33, 0x31, 0x32, 0xff, - 0x33, 0x31, 0x33, 0xff, 0x32, 0x30, 0x32, 0xff, 0x32, 0x30, 0x31, 0xff, 0x32, 0x30, 0x31, 0xff, - 0x31, 0x2f, 0x30, 0xbf, 0x2f, 0x2d, 0x2e, 0x40, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0x5f, 0x60, 0x62, 0x9f, 0x8d, 0x8d, 0x8f, 0xff, 0x96, 0x97, 0x98, 0xff, 0xa2, 0x8b, 0x84, 0xff, - 0xbe, 0x58, 0x48, 0xff, 0x92, 0x42, 0x2e, 0xff, 0xee, 0xb4, 0x4c, 0xff, 0xff, 0xe6, 0xa7, 0xff, - 0xff, 0xd5, 0x5f, 0xff, 0xfd, 0xbd, 0x43, 0xff, 0xf8, 0x9d, 0x33, 0xff, 0xf4, 0x7b, 0x25, 0xff, - 0xee, 0x30, 0x27, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0x8d, 0x41, 0x33, 0xdf, 0xbd, 0x20, 0x25, 0xff, 0xd0, 0x33, 0x2d, 0xff, 0xd1, 0x7f, 0x6a, 0xff, - 0x70, 0x51, 0x48, 0x30, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0x34, 0x32, 0x33, 0xdf, 0x33, 0x31, 0x33, 0xff, 0x32, 0x30, 0x32, 0xff, - 0x31, 0x30, 0x31, 0xff, 0x31, 0x30, 0x31, 0xff, 0x31, 0x2f, 0x30, 0xff, 0x30, 0x2e, 0x30, 0xff, - 0x31, 0x2f, 0x30, 0xff, 0x30, 0x2e, 0x2f, 0xff, 0x2f, 0x2d, 0x2e, 0xff, 0x30, 0x2e, 0x2f, 0xff, - 0x2e, 0x2c, 0x2d, 0xff, 0x2e, 0x2b, 0x2d, 0xff, 0x2e, 0x2c, 0x2d, 0xdf, 0x4f, 0x50, 0x52, 0x8f, - 0x73, 0x74, 0x77, 0xbf, 0x88, 0x89, 0x8b, 0xbf, 0x80, 0x81, 0x83, 0xaf, 0x69, 0x6a, 0x6c, 0xbf, - 0xa3, 0xa3, 0xa4, 0xff, 0xc0, 0xbe, 0xbd, 0xff, 0xbc, 0xbb, 0xba, 0xff, 0x94, 0x47, 0x39, 0xff, - 0x98, 0x41, 0x2f, 0xff, 0xe6, 0x83, 0x2f, 0xff, 0xff, 0xd2, 0x52, 0xff, 0xfe, 0xc3, 0x48, 0xff, - 0xf7, 0x94, 0x2e, 0xff, 0xf4, 0x7f, 0x24, 0xff, 0xf4, 0x77, 0x25, 0xff, 0xee, 0x39, 0x27, 0xff, - 0xed, 0x1c, 0x27, 0x8f, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0x23, 0x1f, 0x20, 0x30, - 0xb2, 0x2e, 0x28, 0xff, 0xca, 0x29, 0x29, 0xff, 0xe2, 0x77, 0x5f, 0xff, 0x91, 0x7a, 0x72, 0x60, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0x31, 0x2f, 0x30, 0x80, 0x30, 0x2e, 0x30, 0xff, 0x2f, 0x2d, 0x2e, 0xff, - 0x2f, 0x2d, 0x2f, 0xff, 0x2f, 0x2d, 0x2f, 0xff, 0x2e, 0x2c, 0x2d, 0xff, 0x2e, 0x2b, 0x2d, 0xff, - 0x2e, 0x2c, 0x2d, 0xff, 0x2d, 0x2a, 0x2b, 0xff, 0x2d, 0x2a, 0x2c, 0xff, 0x2d, 0x2a, 0x2c, 0xff, - 0x2c, 0x29, 0x2a, 0xff, 0x2c, 0x2a, 0x2b, 0xff, 0x4b, 0x4b, 0x4d, 0xff, 0xb1, 0xb1, 0xb2, 0xff, - 0xdb, 0xd9, 0xd9, 0xff, 0xd7, 0xd5, 0xd5, 0xff, 0xd5, 0xd3, 0xd2, 0xff, 0xd1, 0xcf, 0xcf, 0xff, - 0xce, 0xcc, 0xcb, 0xff, 0xca, 0xc8, 0xc7, 0xff, 0xa4, 0x94, 0x8f, 0xff, 0x90, 0x37, 0x2b, 0xff, - 0xe2, 0x5b, 0x2d, 0xff, 0xf8, 0x9d, 0x33, 0xff, 0xfb, 0xae, 0x3c, 0xff, 0xf5, 0x80, 0x25, 0xff, - 0xf2, 0x6d, 0x25, 0xff, 0xf0, 0x47, 0x27, 0xff, 0xed, 0x1c, 0x27, 0xff, 0xc1, 0x5b, 0x46, 0xff, - 0xa6, 0x65, 0x53, 0x20, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0x87, 0x49, 0x3b, 0x9f, - 0xc6, 0x23, 0x26, 0xff, 0xe0, 0x63, 0x4d, 0xff, 0xa3, 0x82, 0x77, 0x9f, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0x2f, 0x2d, 0x2e, 0x10, 0x2e, 0x2c, 0x2d, 0xef, 0x2d, 0x2b, 0x2c, 0xff, - 0x2d, 0x2b, 0x2c, 0xff, 0x2d, 0x2b, 0x2c, 0xff, 0x2d, 0x2a, 0x2b, 0xff, 0x2b, 0x29, 0x2a, 0xff, - 0x2c, 0x29, 0x2b, 0xff, 0x2c, 0x29, 0x2a, 0xff, 0x2a, 0x27, 0x28, 0xff, 0x2b, 0x28, 0x29, 0xff, - 0x2a, 0x27, 0x28, 0xff, 0x32, 0x30, 0x31, 0xff, 0x92, 0x93, 0x95, 0xff, 0xe9, 0xe8, 0xe7, 0xff, - 0xe4, 0xe3, 0xe2, 0xff, 0xe2, 0xe0, 0xdf, 0xff, 0xde, 0xdd, 0xdc, 0xff, 0xdb, 0xd9, 0xd8, 0xff, - 0xd7, 0xd5, 0xd5, 0xff, 0xd3, 0xd2, 0xd2, 0xff, 0x87, 0x60, 0x57, 0xff, 0xcd, 0x49, 0x38, 0xff, - 0xf3, 0x72, 0x25, 0xff, 0xf6, 0x8a, 0x29, 0xff, 0xf4, 0x77, 0x25, 0xff, 0xef, 0x40, 0x27, 0xff, - 0xed, 0x1c, 0x27, 0xff, 0xc7, 0x53, 0x3e, 0xff, 0x88, 0x66, 0x5b, 0xff, 0x5e, 0x5e, 0x61, 0xff, - 0x5f, 0x60, 0x62, 0x70, 0xff, 0xff, 0xff, 0x0, 0x23, 0x1f, 0x20, 0x10, 0xa8, 0x41, 0x32, 0xef, - 0xd8, 0x4e, 0x3c, 0xff, 0xa1, 0x78, 0x6a, 0x9f, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0x2c, 0x2a, 0x2b, 0x70, 0x2c, 0x29, 0x2b, 0xff, - 0x2b, 0x28, 0x29, 0xff, 0x2b, 0x28, 0x29, 0xff, 0x2a, 0x27, 0x28, 0xff, 0x2a, 0x27, 0x28, 0xff, - 0x29, 0x27, 0x28, 0xff, 0x29, 0x26, 0x27, 0xff, 0x2a, 0x27, 0x28, 0xff, 0x29, 0x26, 0x27, 0xff, - 0x29, 0x26, 0x27, 0xff, 0x39, 0x37, 0x39, 0xff, 0xc4, 0xc5, 0xc7, 0xff, 0xf4, 0xf2, 0xf2, 0xff, - 0xf0, 0xef, 0xee, 0xff, 0xed, 0xec, 0xeb, 0xff, 0xe7, 0xe6, 0xe6, 0xff, 0xe5, 0xe3, 0xe3, 0xff, - 0xe1, 0xdf, 0xdf, 0xff, 0xdd, 0xdc, 0xdb, 0xff, 0xbf, 0xab, 0xa4, 0xff, 0xee, 0x30, 0x27, 0xff, - 0xf5, 0x80, 0x25, 0xff, 0xf1, 0x58, 0x26, 0xff, 0xed, 0x1c, 0x27, 0xff, 0xe3, 0x71, 0x59, 0xff, - 0x82, 0x74, 0x70, 0xff, 0x63, 0x64, 0x66, 0xff, 0x5a, 0x5b, 0x5d, 0xff, 0x5c, 0x5d, 0x60, 0xff, - 0x5f, 0x60, 0x62, 0xaf, 0xff, 0xff, 0xff, 0x0, 0x74, 0x4c, 0x41, 0x70, 0xd0, 0x1e, 0x26, 0xff, - 0x97, 0x5a, 0x4a, 0xbf, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0x29, 0x27, 0x28, 0xbf, - 0x29, 0x26, 0x27, 0xff, 0x29, 0x26, 0x27, 0xff, 0x29, 0x26, 0x27, 0xff, 0x28, 0x25, 0x26, 0xff, - 0x28, 0x25, 0x26, 0xff, 0x28, 0x25, 0x26, 0xff, 0x28, 0x25, 0x26, 0xff, 0x28, 0x25, 0x26, 0xff, - 0x26, 0x23, 0x24, 0xff, 0x4d, 0x4d, 0x4f, 0xff, 0xdc, 0xdd, 0xdf, 0xff, 0xfd, 0xfc, 0xfc, 0xff, - 0xf9, 0xf9, 0xf9, 0xff, 0xf6, 0xf6, 0xf6, 0xff, 0xf2, 0xf2, 0xf1, 0xff, 0xef, 0xee, 0xed, 0xff, - 0xed, 0xea, 0xea, 0xff, 0xc2, 0xc0, 0xc0, 0xff, 0xbc, 0x76, 0x64, 0xff, 0xf1, 0x5e, 0x26, 0xff, - 0xef, 0x40, 0x27, 0xff, 0xe9, 0x5f, 0x49, 0xff, 0xde, 0xb8, 0xac, 0xff, 0xb0, 0xb0, 0xb0, 0xff, - 0x71, 0x72, 0x73, 0xff, 0x68, 0x69, 0x6a, 0xff, 0x5e, 0x5f, 0x61, 0xff, 0x5c, 0x5d, 0x60, 0xff, - 0x5e, 0x5f, 0x62, 0x9f, 0xff, 0xff, 0xff, 0x0, 0xa3, 0x4a, 0x39, 0xdf, 0x96, 0x50, 0x40, 0x9f, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0x28, 0x25, 0x26, 0x10, - 0x28, 0x25, 0x26, 0xef, 0x28, 0x25, 0x26, 0xff, 0x27, 0x24, 0x25, 0xff, 0x26, 0x23, 0x24, 0xff, - 0x27, 0x24, 0x25, 0xff, 0x26, 0x23, 0x24, 0xff, 0x26, 0x23, 0x24, 0xff, 0x27, 0x24, 0x25, 0xff, - 0x49, 0x49, 0x4b, 0xff, 0xd3, 0xd4, 0xd6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfd, 0xfc, 0xff, 0xfa, 0xfa, 0xfa, 0xff, - 0xde, 0xdc, 0xdc, 0xff, 0x93, 0x93, 0x93, 0xff, 0xdf, 0x3c, 0x31, 0xff, 0xe5, 0x37, 0x2c, 0xff, - 0xb7, 0x71, 0x60, 0xff, 0x8a, 0x8a, 0x8a, 0xff, 0x83, 0x84, 0x85, 0xff, 0x7c, 0x7d, 0x7e, 0xff, - 0x74, 0x74, 0x76, 0xff, 0x6b, 0x6b, 0x6d, 0xff, 0x60, 0x61, 0x63, 0xff, 0x5f, 0x5f, 0x62, 0xff, - 0x5f, 0x60, 0x62, 0x60, 0x4c, 0x3f, 0x3b, 0x60, 0x94, 0x4f, 0x3f, 0x9f, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0x27, 0x24, 0x25, 0x30, 0x27, 0x24, 0x25, 0xef, 0x26, 0x22, 0x23, 0xff, 0x25, 0x22, 0x23, 0xff, - 0x25, 0x22, 0x23, 0xff, 0x26, 0x22, 0x23, 0xff, 0x25, 0x22, 0x23, 0xff, 0x26, 0x22, 0x23, 0xff, - 0x79, 0x7a, 0x7d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xdb, 0xda, 0xda, 0xff, 0xac, 0x81, 0x76, 0xff, 0xdb, 0x46, 0x38, 0xff, 0xa6, 0x86, 0x7d, 0xff, - 0x91, 0x91, 0x91, 0xff, 0x8c, 0x8d, 0x8d, 0xff, 0x86, 0x86, 0x87, 0xff, 0x7e, 0x7e, 0x7f, 0xff, - 0x76, 0x77, 0x78, 0xff, 0x6d, 0x6e, 0x6f, 0xff, 0x60, 0x61, 0x64, 0xff, 0x5f, 0x5f, 0x62, 0xcf, - 0xff, 0xff, 0xff, 0x0, 0x23, 0x1f, 0x20, 0x20, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0x25, 0x22, 0x23, 0x30, 0x26, 0x22, 0x23, 0xdf, 0x26, 0x22, 0x23, 0xff, - 0x24, 0x20, 0x21, 0xff, 0x24, 0x20, 0x21, 0xff, 0x25, 0x21, 0x22, 0xff, 0x24, 0x21, 0x21, 0xff, - 0x84, 0x87, 0x89, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc2, 0xc1, 0xc1, 0xff, 0xbe, 0x73, 0x62, 0xff, 0x9d, 0x92, 0x8e, 0xff, 0x95, 0x95, 0x95, 0xff, - 0x92, 0x92, 0x92, 0xff, 0x8d, 0x8d, 0x8e, 0xff, 0x86, 0x87, 0x88, 0xff, 0x7e, 0x7f, 0x80, 0xff, - 0x77, 0x77, 0x79, 0xff, 0x6a, 0x6b, 0x6d, 0xff, 0x5f, 0x60, 0x62, 0xff, 0x5f, 0x60, 0x62, 0x40, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0x24, 0x21, 0x21, 0x10, 0x24, 0x21, 0x22, 0xaf, - 0x24, 0x20, 0x21, 0xff, 0x25, 0x21, 0x22, 0xff, 0x24, 0x21, 0x21, 0xff, 0x24, 0x20, 0x21, 0xff, - 0x5a, 0x5b, 0x5d, 0xff, 0xf1, 0xf2, 0xf2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xd5, 0xd5, 0xd5, 0xff, 0xd7, 0xd6, 0xd7, 0xff, 0xca, 0xc9, 0xca, 0xff, 0xb2, 0xb1, 0xb2, 0xff, - 0x93, 0x93, 0x93, 0xff, 0x94, 0x94, 0x95, 0xff, 0x95, 0x95, 0x95, 0xff, 0x94, 0x93, 0x94, 0xff, - 0x91, 0x90, 0x91, 0xff, 0x8c, 0x8c, 0x8d, 0xff, 0x86, 0x86, 0x87, 0xff, 0x7e, 0x7e, 0x80, 0xff, - 0x6a, 0x6b, 0x6d, 0xff, 0x5f, 0x60, 0x63, 0xff, 0x5f, 0x5f, 0x62, 0x9f, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0x24, 0x21, 0x22, 0x50, 0x22, 0x1f, 0x20, 0xdf, 0x23, 0x1f, 0x20, 0xff, 0x23, 0x1f, 0x20, 0xff, - 0x31, 0x2f, 0x30, 0xff, 0x8b, 0x8d, 0x90, 0xff, 0xaa, 0xac, 0xaf, 0xff, 0x76, 0x76, 0x78, 0xff, - 0x79, 0x7a, 0x7b, 0xff, 0x81, 0x81, 0x82, 0xff, 0x87, 0x87, 0x88, 0xff, 0x8c, 0x8c, 0x8d, 0xff, - 0x90, 0x90, 0x90, 0xff, 0x92, 0x92, 0x92, 0xff, 0x92, 0x91, 0x92, 0xff, 0x91, 0x91, 0x91, 0xff, - 0x8e, 0x8e, 0x8e, 0xff, 0x88, 0x89, 0x8a, 0xff, 0x83, 0x83, 0x84, 0xff, 0x7b, 0x7c, 0x7d, 0xff, - 0x65, 0x66, 0x68, 0xff, 0x5f, 0x60, 0x62, 0x80, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0x23, 0x1f, 0x20, 0x60, 0x23, 0x20, 0x21, 0xdf, - 0x23, 0x1f, 0x20, 0xff, 0x41, 0x40, 0x42, 0xff, 0x5f, 0x60, 0x62, 0xff, 0x6a, 0x6b, 0x6c, 0xff, - 0x75, 0x76, 0x77, 0xff, 0x7c, 0x7d, 0x7e, 0xff, 0x83, 0x83, 0x84, 0xff, 0x87, 0x88, 0x89, 0xff, - 0x8b, 0x8b, 0x8b, 0xff, 0x8d, 0x8d, 0x8e, 0xff, 0x8e, 0x8e, 0x8f, 0xff, 0x8d, 0x8d, 0x8e, 0xff, - 0x89, 0x89, 0x8a, 0xff, 0x84, 0x84, 0x85, 0xff, 0x7f, 0x7f, 0x81, 0xff, 0x78, 0x78, 0x7a, 0xff, - 0x63, 0x64, 0x66, 0xff, 0x5f, 0x60, 0x62, 0x80, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0x35, 0x34, 0x35, 0x40, 0x5b, 0x5c, 0x5f, 0xff, 0x5f, 0x60, 0x62, 0xff, 0x68, 0x68, 0x6a, 0xff, - 0x70, 0x70, 0x72, 0xff, 0x77, 0x78, 0x7a, 0xff, 0x7d, 0x7e, 0x7f, 0xff, 0x82, 0x82, 0x83, 0xff, - 0x85, 0x86, 0x87, 0xff, 0x87, 0x87, 0x88, 0xff, 0x7e, 0x7e, 0x7f, 0xff, 0x83, 0x83, 0x84, 0xff, - 0x83, 0x83, 0x84, 0xff, 0x7e, 0x7f, 0x80, 0xff, 0x79, 0x79, 0x7b, 0xff, 0x6d, 0x6e, 0x70, 0xff, - 0x5f, 0x60, 0x62, 0xff, 0x5f, 0x5f, 0x62, 0x30, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0x5f, 0x60, 0x62, 0x40, 0x5f, 0x60, 0x62, 0xff, 0x5a, 0x5b, 0x5d, 0xff, 0x61, 0x62, 0x64, 0xff, - 0x69, 0x6a, 0x6c, 0xff, 0x71, 0x72, 0x73, 0xff, 0x77, 0x78, 0x7a, 0xff, 0x7a, 0x7b, 0x7c, 0xff, - 0x7e, 0x7f, 0x80, 0xff, 0x80, 0x80, 0x81, 0xff, 0x72, 0x72, 0x74, 0xff, 0x61, 0x62, 0x64, 0xff, - 0x6f, 0x6f, 0x71, 0xff, 0x6d, 0x6e, 0x70, 0xff, 0x69, 0x69, 0x6b, 0xff, 0x5f, 0x60, 0x62, 0xff, - 0x5f, 0x60, 0x62, 0x8f, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0x5f, 0x60, 0x62, 0x30, 0x5f, 0x60, 0x62, 0xff, 0x5a, 0x5b, 0x5d, 0xff, 0x5b, 0x5c, 0x5e, 0xff, - 0x63, 0x63, 0x65, 0xff, 0x69, 0x6a, 0x6b, 0xff, 0x6e, 0x6f, 0x70, 0xff, 0x73, 0x74, 0x76, 0xff, - 0x76, 0x76, 0x78, 0xff, 0x77, 0x78, 0x79, 0xff, 0x64, 0x65, 0x67, 0xff, 0x5f, 0x60, 0x62, 0xcf, - 0x5f, 0x60, 0x62, 0xbf, 0x5f, 0x60, 0x62, 0xbf, 0x5f, 0x60, 0x62, 0xaf, 0x5f, 0x60, 0x62, 0x50, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0x5f, 0x60, 0x62, 0xbf, 0x5d, 0x5e, 0x60, 0xff, 0x5a, 0x5b, 0x5d, 0xff, - 0x5c, 0x5d, 0x5f, 0xff, 0x60, 0x60, 0x62, 0xff, 0x61, 0x62, 0x64, 0xff, 0x67, 0x67, 0x69, 0xff, - 0x6b, 0x6b, 0x6d, 0xff, 0x64, 0x65, 0x67, 0xff, 0x5f, 0x60, 0x62, 0xff, 0x5f, 0x60, 0x62, 0x30, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, - 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, - 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, - 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, - 0xd7, 0xd8, 0xd9, 0x0, 0x5f, 0x60, 0x62, 0x10, 0x5f, 0x5f, 0x62, 0xbf, 0x5f, 0x60, 0x62, 0xff, - 0x5f, 0x60, 0x62, 0xff, 0x5e, 0x5f, 0x62, 0xdf, 0x5f, 0x5f, 0x62, 0xbf, 0x5f, 0x60, 0x62, 0xff, - 0x5e, 0x5f, 0x62, 0xff, 0x5f, 0x60, 0x62, 0xdf, 0x5e, 0x5f, 0x62, 0x40, 0xd7, 0xd8, 0xd9, 0x0, - 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, - 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, - 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, - 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, - 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, - 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, - 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, - 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, - 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, - 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, - 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, - 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, - 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, - 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, - 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, - 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, - 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, - 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, - 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, - 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, - 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, - 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, - 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, - 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xd7, 0xd8, 0xd9, 0x3b, - 0xd7, 0xd8, 0xd9, 0xc3, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xc3, 0xd7, 0xd8, 0xd9, 0x2c, - 0xd7, 0xd8, 0xd9, 0x2c, 0xd7, 0xd8, 0xd9, 0xc3, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xcc, - 0xd7, 0xd8, 0xd9, 0x90, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, - 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, - 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, - 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, - 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, - 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x1b, 0xd7, 0xd8, 0xd9, 0xb2, 0xd7, 0xd8, 0xd9, 0xef, - 0xd7, 0xd8, 0xd9, 0xb2, 0xd7, 0xd8, 0xd9, 0x4c, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, - 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, - 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, - 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, - 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, - 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, - 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, - 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, - 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xd7, 0xd8, 0xd9, 0x3b, 0xd7, 0xd8, 0xd9, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xeb, - 0xd7, 0xd8, 0xd9, 0xc3, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0x90, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, - 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, - 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, - 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, - 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, - 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0xb2, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0x4c, 0xd7, 0xd8, 0xd9, 0x0, - 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, - 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, - 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, - 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, - 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, - 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, - 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, - 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xd7, 0xd8, 0xd9, 0x78, 0xd7, 0xd8, 0xd9, 0xff, - 0x73, 0x73, 0x74, 0xff, 0x0, 0x0, 0x0, 0xff, 0x8f, 0x90, 0x91, 0xff, 0xd7, 0xd8, 0xd9, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0xc9, 0xca, 0xcb, 0xff, 0x0, 0x0, 0x0, 0xff, 0x2b, 0x2b, 0x2b, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xcc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd7, 0xd8, 0xd9, 0xef, 0xd7, 0xd8, 0xd9, 0xff, 0xe, 0xe, 0xe, 0xff, - 0x64, 0x65, 0x65, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0x89, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd7, 0xd8, 0xd9, 0x4c, - 0xd7, 0xd8, 0xd9, 0xb2, 0xd7, 0xd8, 0xd9, 0xef, 0xd7, 0xd8, 0xd9, 0xb2, 0xd7, 0xd8, 0xd9, 0x1b, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xd7, 0xd8, 0xd9, 0x78, 0xd7, 0xd8, 0xd9, 0xff, - 0x73, 0x73, 0x74, 0xff, 0x0, 0x0, 0x0, 0xff, 0x8f, 0x90, 0x91, 0xff, 0xd7, 0xd8, 0xd9, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0xc9, 0xca, 0xcb, 0xff, 0x0, 0x0, 0x0, 0xff, 0x48, 0x48, 0x48, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xab, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd7, 0xd8, 0xd9, 0xef, 0xd7, 0xd8, 0xd9, 0xff, 0xe, 0xe, 0xe, 0xff, - 0x64, 0x65, 0x65, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0x89, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd7, 0xd8, 0xd9, 0x4c, 0xd7, 0xd8, 0xd9, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xb2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xd7, 0xd8, 0xd9, 0x78, 0xd7, 0xd8, 0xd9, 0xff, - 0x73, 0x73, 0x74, 0xff, 0x0, 0x0, 0x0, 0xff, 0x8f, 0x90, 0x91, 0xff, 0x48, 0x48, 0x48, 0xff, - 0x0, 0x0, 0x0, 0xff, 0xc9, 0xca, 0xcb, 0xff, 0xe, 0xe, 0xe, 0xff, 0x48, 0x48, 0x48, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xef, 0xd7, 0xd8, 0xd9, 0xb2, 0xd7, 0xd8, 0xd9, 0x4c, - 0xd7, 0xd8, 0xd9, 0xb2, 0xd7, 0xd8, 0xd9, 0xef, 0xd7, 0xd8, 0xd9, 0xcc, 0xd7, 0xd8, 0xd9, 0xff, - 0xd7, 0xd8, 0xd9, 0xc3, 0xd7, 0xd8, 0xd9, 0x3b, 0xd7, 0xd8, 0xd9, 0x5d, 0xd7, 0xd8, 0xd9, 0xc3, - 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xcc, 0xd7, 0xd8, 0xd9, 0x90, - 0xd7, 0xd8, 0xd9, 0x1b, 0xd7, 0xd8, 0xd9, 0xb2, 0xd7, 0xd8, 0xd9, 0xef, 0xd7, 0xd8, 0xd9, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xef, 0xd7, 0xd8, 0xd9, 0xff, 0xe, 0xe, 0xe, 0xff, - 0x64, 0x65, 0x65, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xde, 0xd7, 0xd8, 0xd9, 0xa1, - 0xd7, 0xd8, 0xd9, 0x5d, 0xd7, 0xd8, 0xd9, 0xb2, 0xd7, 0xd8, 0xd9, 0xef, 0xd7, 0xd8, 0xd9, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xc3, 0xd7, 0xd8, 0xd9, 0x89, 0xd7, 0xd8, 0xd9, 0xff, - 0x64, 0x65, 0x65, 0xff, 0xe, 0xe, 0xe, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xef, - 0xd7, 0xd8, 0xd9, 0x2c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd7, 0xd8, 0xd9, 0x90, - 0xd7, 0xd8, 0xd9, 0xcc, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xc3, - 0xd7, 0xd8, 0xd9, 0x6e, 0xd7, 0xd8, 0xd9, 0xa1, 0xd7, 0xd8, 0xd9, 0xde, 0xd7, 0xd8, 0xd9, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xc3, 0xd7, 0xd8, 0xd9, 0xb2, 0xd7, 0xd8, 0xd9, 0xef, - 0xd7, 0xd8, 0xd9, 0xcc, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xef, 0xd7, 0xd8, 0xd9, 0xc3, - 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xc3, 0xd7, 0xd8, 0xd9, 0x2c, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xd7, 0xd8, 0xd9, 0x78, 0xd7, 0xd8, 0xd9, 0xff, - 0x73, 0x73, 0x74, 0xff, 0x0, 0x0, 0x0, 0xff, 0x9e, 0x9e, 0x9f, 0xff, 0xac, 0xad, 0xae, 0xff, - 0x73, 0x73, 0x74, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xe, 0xe, 0xe, 0xff, 0x39, 0x3a, 0x3a, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, - 0xd7, 0xd8, 0xd9, 0xc9, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xe, 0xe, 0xe, 0xff, - 0x64, 0x65, 0x65, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, - 0x64, 0x65, 0x65, 0xff, 0xe, 0xe, 0xe, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, - 0xd7, 0xd8, 0xd9, 0xeb, 0xd7, 0xd8, 0xd9, 0x19, 0xd7, 0xd8, 0xd9, 0xa7, 0xd7, 0xd8, 0xd9, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xfc, - 0xd7, 0xd8, 0xd9, 0x2a, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xd7, 0xd8, 0xd9, 0x78, 0xd7, 0xd8, 0xd9, 0xff, - 0x73, 0x73, 0x74, 0xff, 0x0, 0x0, 0x0, 0xff, 0xac, 0xad, 0xae, 0xff, 0x48, 0x48, 0x48, 0xff, - 0xe, 0xe, 0xe, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xe, 0xe, 0xe, 0xff, 0x0, 0x0, 0x0, 0xff, - 0x0, 0x0, 0x0, 0xff, 0xe, 0xe, 0xe, 0xff, 0xac, 0xad, 0xae, 0xff, 0xd7, 0xd8, 0xd9, 0xff, - 0x64, 0x65, 0x65, 0xff, 0xe, 0xe, 0xe, 0xff, 0x2b, 0x2b, 0x2b, 0xff, 0x0, 0x0, 0x0, 0xff, - 0x73, 0x73, 0x74, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0x56, 0x56, 0x57, 0xff, - 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0xff, 0x2b, 0x2b, 0x2b, 0xff, 0xba, 0xbb, 0xbc, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0xac, 0xad, 0xae, 0xff, 0xe, 0xe, 0xe, 0xff, 0x0, 0x0, 0x0, 0xff, - 0x0, 0x0, 0x0, 0xff, 0x73, 0x73, 0x74, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xe, 0xe, 0xe, 0xff, - 0x64, 0x65, 0x65, 0xff, 0xc9, 0xca, 0xcb, 0xff, 0x1d, 0x1d, 0x1d, 0xff, 0x56, 0x56, 0x57, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0xac, 0xad, 0xae, 0xff, 0xe, 0xe, 0xe, 0xff, 0x0, 0x0, 0x0, 0xff, - 0x0, 0x0, 0x0, 0xff, 0x73, 0x73, 0x74, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0x64, 0x65, 0x65, 0xff, - 0x39, 0x3a, 0x3a, 0xff, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0xff, 0x8f, 0x90, 0x91, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0x56, 0xd7, 0xd8, 0xd9, 0xff, 0xc9, 0xca, 0xcb, 0xff, - 0x2b, 0x2b, 0x2b, 0xff, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0xff, 0x48, 0x48, 0x48, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0xac, 0xad, 0xae, 0xff, 0x1d, 0x1d, 0x1d, 0xff, 0x0, 0x0, 0x0, 0xff, - 0x0, 0x0, 0x0, 0xff, 0x73, 0x73, 0x74, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xe, 0xe, 0xe, 0xff, - 0x2b, 0x2b, 0x2b, 0xff, 0x0, 0x0, 0x0, 0xff, 0xe, 0xe, 0xe, 0xff, 0x64, 0x65, 0x65, 0xff, - 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0xff, 0x81, 0x82, 0x82, 0xff, 0xd7, 0xd8, 0xd9, 0xff, - 0xd7, 0xd8, 0xd9, 0xb2, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xd7, 0xd8, 0xd9, 0x78, 0xd7, 0xd8, 0xd9, 0xff, - 0x73, 0x73, 0x74, 0xff, 0x0, 0x0, 0x0, 0xff, 0xac, 0xad, 0xae, 0xff, 0x48, 0x48, 0x48, 0xff, - 0xe, 0xe, 0xe, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xe, 0xe, 0xe, 0xff, 0x48, 0x48, 0x48, 0xff, - 0x64, 0x65, 0x65, 0xff, 0x39, 0x3a, 0x3a, 0xff, 0x1d, 0x1d, 0x1d, 0xff, 0xd7, 0xd8, 0xd9, 0xff, - 0x64, 0x65, 0x65, 0xff, 0x0, 0x0, 0x0, 0xff, 0x56, 0x56, 0x57, 0xff, 0x39, 0x3a, 0x3a, 0xff, - 0x0, 0x0, 0x0, 0xff, 0xba, 0xbb, 0xbc, 0xff, 0x9e, 0x9e, 0x9f, 0xff, 0x0, 0x0, 0x0, 0xff, - 0x56, 0x56, 0x57, 0xff, 0x64, 0x65, 0x65, 0xff, 0x0, 0x0, 0x0, 0xff, 0x73, 0x73, 0x74, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0x39, 0x3a, 0x3a, 0xff, 0x2b, 0x2b, 0x2b, 0xff, 0x64, 0x65, 0x65, 0xff, - 0x39, 0x3a, 0x3a, 0xff, 0xe, 0xe, 0xe, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xe, 0xe, 0xe, 0xff, - 0x64, 0x65, 0x65, 0xff, 0x56, 0x56, 0x57, 0xff, 0x1d, 0x1d, 0x1d, 0xff, 0xc9, 0xca, 0xcb, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0x39, 0x3a, 0x3a, 0xff, 0x2b, 0x2b, 0x2b, 0xff, 0x64, 0x65, 0x65, 0xff, - 0x39, 0x3a, 0x3a, 0xff, 0x0, 0x0, 0x0, 0xff, 0xac, 0xad, 0xae, 0xff, 0x0, 0x0, 0x0, 0xff, - 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0xff, 0x8f, 0x90, 0x91, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0x7f, 0xd7, 0xd8, 0xd9, 0xff, 0x73, 0x73, 0x74, 0xff, - 0xe, 0xe, 0xe, 0xff, 0x64, 0x65, 0x65, 0xff, 0x48, 0x48, 0x48, 0xff, 0x0, 0x0, 0x0, 0xff, - 0x9e, 0x9e, 0x9f, 0xff, 0x39, 0x3a, 0x3a, 0xff, 0x2b, 0x2b, 0x2b, 0xff, 0x64, 0x65, 0x65, 0xff, - 0x39, 0x3a, 0x3a, 0xff, 0xe, 0xe, 0xe, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xe, 0xe, 0xe, 0xff, - 0x1d, 0x1d, 0x1d, 0xff, 0x64, 0x65, 0x65, 0xff, 0x2b, 0x2b, 0x2b, 0xff, 0x0, 0x0, 0x0, 0xff, - 0x64, 0x65, 0x65, 0xff, 0x39, 0x3a, 0x3a, 0xff, 0xe, 0xe, 0xe, 0xff, 0xd7, 0xd8, 0xd9, 0xff, - 0xd7, 0xd8, 0xd9, 0xef, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xd7, 0xd8, 0xd9, 0x78, 0xd7, 0xd8, 0xd9, 0xff, - 0x73, 0x73, 0x74, 0xff, 0x0, 0x0, 0x0, 0xff, 0xac, 0xad, 0xae, 0xff, 0x48, 0x48, 0x48, 0xff, - 0xe, 0xe, 0xe, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xe, 0xe, 0xe, 0xff, 0xac, 0xad, 0xae, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0x64, 0x65, 0x65, 0xff, 0x0, 0x0, 0x0, 0xff, 0xba, 0xbb, 0xbc, 0xff, - 0x64, 0x65, 0x65, 0xff, 0xe, 0xe, 0xe, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0x8f, 0x90, 0x91, 0xff, - 0x0, 0x0, 0x0, 0xff, 0xac, 0xad, 0xae, 0xff, 0x73, 0x73, 0x74, 0xff, 0xe, 0xe, 0xe, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0x1d, 0x1d, 0x1d, 0xff, 0x48, 0x48, 0x48, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0xe, 0xe, 0xe, 0xff, 0x73, 0x73, 0x74, 0xff, 0xd7, 0xd8, 0xd9, 0xff, - 0x81, 0x82, 0x82, 0xff, 0x0, 0x0, 0x0, 0xff, 0xac, 0xad, 0xae, 0xff, 0xe, 0xe, 0xe, 0xff, - 0x39, 0x3a, 0x3a, 0xff, 0x0, 0x0, 0x0, 0xff, 0x81, 0x82, 0x82, 0xff, 0xd7, 0xd8, 0xd9, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0xe, 0xe, 0xe, 0xff, 0x73, 0x73, 0x74, 0xff, 0xd7, 0xd8, 0xd9, 0xff, - 0x81, 0x82, 0x82, 0xff, 0x0, 0x0, 0x0, 0xff, 0xac, 0xad, 0xae, 0xff, 0xd7, 0xd8, 0xd9, 0xff, - 0x2b, 0x2b, 0x2b, 0xff, 0x2b, 0x2b, 0x2b, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, - 0xd7, 0xd8, 0xd9, 0xeb, 0xd7, 0xd8, 0xd9, 0xbc, 0xd7, 0xd8, 0xd9, 0xff, 0x39, 0x3a, 0x3a, 0xff, - 0x48, 0x48, 0x48, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xba, 0xbb, 0xbc, 0xff, 0x0, 0x0, 0x0, 0xff, - 0x73, 0x73, 0x74, 0xff, 0xe, 0xe, 0xe, 0xff, 0x73, 0x73, 0x74, 0xff, 0xd7, 0xd8, 0xd9, 0xff, - 0x81, 0x82, 0x82, 0xff, 0x0, 0x0, 0x0, 0xff, 0xac, 0xad, 0xae, 0xff, 0xe, 0xe, 0xe, 0xff, - 0x48, 0x48, 0x48, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0x48, 0x48, 0x48, 0xff, 0xe, 0xe, 0xe, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0x73, 0x73, 0x74, 0xff, 0x0, 0x0, 0x0, 0xff, 0xc9, 0xca, 0xcb, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0x12, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xd7, 0xd8, 0xd9, 0x78, 0xd7, 0xd8, 0xd9, 0xff, - 0x73, 0x73, 0x74, 0xff, 0x0, 0x0, 0x0, 0xff, 0xac, 0xad, 0xae, 0xff, 0x48, 0x48, 0x48, 0xff, - 0xe, 0xe, 0xe, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xe, 0xe, 0xe, 0xff, 0x9e, 0x9e, 0x9f, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0x64, 0x65, 0x65, 0xff, 0x0, 0x0, 0x0, 0xff, 0xac, 0xad, 0xae, 0xff, - 0x64, 0x65, 0x65, 0xff, 0x0, 0x0, 0x0, 0xff, 0xc9, 0xca, 0xcb, 0xff, 0xd7, 0xd8, 0xd9, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0x73, 0x73, 0x74, 0xff, 0xe, 0xe, 0xe, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0x2b, 0x2b, 0x2b, 0xff, 0x48, 0x48, 0x48, 0xff, - 0xc9, 0xca, 0xcb, 0xff, 0x0, 0x0, 0x0, 0xff, 0x73, 0x73, 0x74, 0xff, 0xd7, 0xd8, 0xd9, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xe, 0xe, 0xe, 0xff, - 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0xff, 0x73, 0x73, 0x74, 0xff, 0xd7, 0xd8, 0xd9, 0xff, - 0xc9, 0xca, 0xcb, 0xff, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0xff, - 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0xff, 0x8f, 0x90, 0x91, 0xff, 0xd7, 0xd8, 0xd9, 0xff, - 0x2b, 0x2b, 0x2b, 0xff, 0x2b, 0x2b, 0x2b, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, - 0xd7, 0xd8, 0xd9, 0xeb, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0x2b, 0x2b, 0x2b, 0xff, - 0x48, 0x48, 0x48, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0xe, 0xe, 0xe, 0xff, 0x73, 0x73, 0x74, 0xff, 0xd7, 0xd8, 0xd9, 0xff, - 0x8f, 0x90, 0x91, 0xff, 0x0, 0x0, 0x0, 0xff, 0xac, 0xad, 0xae, 0xff, 0xe, 0xe, 0xe, 0xff, - 0x48, 0x48, 0x48, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0x48, 0x48, 0x48, 0xff, 0xe, 0xe, 0xe, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0x73, 0x73, 0x74, 0xff, 0x0, 0x0, 0x0, 0xff, 0xc9, 0xca, 0xcb, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0x12, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xd7, 0xd8, 0xd9, 0x78, 0xd7, 0xd8, 0xd9, 0xff, - 0x73, 0x73, 0x74, 0xff, 0x0, 0x0, 0x0, 0xff, 0xac, 0xad, 0xae, 0xff, 0x48, 0x48, 0x48, 0xff, - 0xe, 0xe, 0xe, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xe, 0xe, 0xe, 0xff, 0x8f, 0x90, 0x91, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0x64, 0x65, 0x65, 0xff, 0x0, 0x0, 0x0, 0xff, 0xba, 0xbb, 0xbc, 0xff, - 0x64, 0x65, 0x65, 0xff, 0x0, 0x0, 0x0, 0xff, 0xc9, 0xca, 0xcb, 0xff, 0xd7, 0xd8, 0xd9, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0x73, 0x73, 0x74, 0xff, 0xe, 0xe, 0xe, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0x1d, 0x1d, 0x1d, 0xff, 0x48, 0x48, 0x48, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0xe, 0xe, 0xe, 0xff, 0x73, 0x73, 0x74, 0xff, 0xd7, 0xd8, 0xd9, 0xff, - 0xac, 0xad, 0xae, 0xff, 0x64, 0x65, 0x65, 0xff, 0xc9, 0xca, 0xcb, 0xff, 0xe, 0xe, 0xe, 0xff, - 0x64, 0x65, 0x65, 0xff, 0x2b, 0x2b, 0x2b, 0xff, 0x2b, 0x2b, 0x2b, 0xff, 0xd7, 0xd8, 0xd9, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0xe, 0xe, 0xe, 0xff, 0x64, 0x65, 0x65, 0xff, 0xd7, 0xd8, 0xd9, 0xff, - 0xba, 0xbb, 0xbc, 0xff, 0x64, 0x65, 0x65, 0xff, 0xc9, 0xca, 0xcb, 0xff, 0xd7, 0xd8, 0xd9, 0xff, - 0x2b, 0x2b, 0x2b, 0xff, 0x2b, 0x2b, 0x2b, 0xff, 0x73, 0x73, 0x74, 0xff, 0x8f, 0x90, 0x91, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0x39, 0x3a, 0x3a, 0xff, - 0x39, 0x3a, 0x3a, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xc9, 0xca, 0xcb, 0xff, 0x64, 0x65, 0x65, 0xff, - 0xac, 0xad, 0xae, 0xff, 0xe, 0xe, 0xe, 0xff, 0x73, 0x73, 0x74, 0xff, 0xd7, 0xd8, 0xd9, 0xff, - 0x81, 0x82, 0x82, 0xff, 0x0, 0x0, 0x0, 0xff, 0xac, 0xad, 0xae, 0xff, 0xe, 0xe, 0xe, 0xff, - 0x48, 0x48, 0x48, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0x48, 0x48, 0x48, 0xff, 0xe, 0xe, 0xe, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0x73, 0x73, 0x74, 0xff, 0x0, 0x0, 0x0, 0xff, 0xc9, 0xca, 0xcb, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0x12, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xd7, 0xd8, 0xd9, 0x78, 0xd7, 0xd8, 0xd9, 0xff, - 0x73, 0x73, 0x74, 0xff, 0x0, 0x0, 0x0, 0xff, 0xac, 0xad, 0xae, 0xff, 0x48, 0x48, 0x48, 0xff, - 0xe, 0xe, 0xe, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xe, 0xe, 0xe, 0xff, 0x48, 0x48, 0x48, 0xff, - 0x64, 0x65, 0x65, 0xff, 0x2b, 0x2b, 0x2b, 0xff, 0x1d, 0x1d, 0x1d, 0xff, 0xd7, 0xd8, 0xd9, 0xff, - 0x64, 0x65, 0x65, 0xff, 0x0, 0x0, 0x0, 0xff, 0xc9, 0xca, 0xcb, 0xff, 0xd7, 0xd8, 0xd9, 0xff, - 0xd7, 0xd8, 0xd9, 0x45, 0xd7, 0xd8, 0xd9, 0xff, 0x9e, 0x9e, 0x9f, 0xff, 0x0, 0x0, 0x0, 0xff, - 0x48, 0x48, 0x48, 0xff, 0x64, 0x65, 0x65, 0xff, 0x0, 0x0, 0x0, 0xff, 0x73, 0x73, 0x74, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0x2b, 0x2b, 0x2b, 0xff, 0x1d, 0x1d, 0x1d, 0xff, 0x64, 0x65, 0x65, 0xff, - 0x39, 0x3a, 0x3a, 0xff, 0x0, 0x0, 0x0, 0xff, 0xba, 0xbb, 0xbc, 0xff, 0xe, 0xe, 0xe, 0xff, - 0x64, 0x65, 0x65, 0xff, 0x81, 0x82, 0x82, 0xff, 0x0, 0x0, 0x0, 0xff, 0x8f, 0x90, 0x91, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0x39, 0x3a, 0x3a, 0xff, 0x1d, 0x1d, 0x1d, 0xff, 0x64, 0x65, 0x65, 0xff, - 0x39, 0x3a, 0x3a, 0xff, 0x0, 0x0, 0x0, 0xff, 0xba, 0xbb, 0xbc, 0xff, 0xd7, 0xd8, 0xd9, 0xff, - 0x2b, 0x2b, 0x2b, 0xff, 0x2b, 0x2b, 0x2b, 0xff, 0x2b, 0x2b, 0x2b, 0xff, 0x73, 0x73, 0x74, 0xff, - 0x56, 0x56, 0x57, 0xff, 0x0, 0x0, 0x0, 0xff, 0x8f, 0x90, 0x91, 0xff, 0x64, 0x65, 0x65, 0xff, - 0x0, 0x0, 0x0, 0xff, 0x64, 0x65, 0x65, 0xff, 0x48, 0x48, 0x48, 0xff, 0x0, 0x0, 0x0, 0xff, - 0x81, 0x82, 0x82, 0xff, 0x39, 0x3a, 0x3a, 0xff, 0x1d, 0x1d, 0x1d, 0xff, 0x64, 0x65, 0x65, 0xff, - 0x39, 0x3a, 0x3a, 0xff, 0xe, 0xe, 0xe, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xe, 0xe, 0xe, 0xff, - 0x48, 0x48, 0x48, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0x48, 0x48, 0x48, 0xff, 0xe, 0xe, 0xe, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0x73, 0x73, 0x74, 0xff, 0x0, 0x0, 0x0, 0xff, 0xc9, 0xca, 0xcb, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0x12, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xd7, 0xd8, 0xd9, 0x78, 0xd7, 0xd8, 0xd9, 0xff, - 0x73, 0x73, 0x74, 0xff, 0x0, 0x0, 0x0, 0xff, 0xac, 0xad, 0xae, 0xff, 0x48, 0x48, 0x48, 0xff, - 0xe, 0xe, 0xe, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xe, 0xe, 0xe, 0xff, 0x2b, 0x2b, 0x2b, 0xff, - 0xe, 0xe, 0xe, 0xff, 0x0, 0x0, 0x0, 0xff, 0x8f, 0x90, 0x91, 0xff, 0xd7, 0xd8, 0xd9, 0xff, - 0x64, 0x65, 0x65, 0xff, 0x0, 0x0, 0x0, 0xff, 0xc9, 0xca, 0xcb, 0xff, 0xd7, 0xd8, 0xd9, 0xff, - 0xd7, 0xd8, 0xd9, 0x12, 0xd7, 0xd8, 0xd9, 0xda, 0xd7, 0xd8, 0xd9, 0xff, 0x48, 0x48, 0x48, 0xff, - 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0xff, 0x2b, 0x2b, 0x2b, 0xff, 0xc9, 0xca, 0xcb, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0xac, 0xad, 0xae, 0xff, 0xe, 0xe, 0xe, 0xff, 0x0, 0x0, 0x0, 0xff, - 0x0, 0x0, 0x0, 0xff, 0x73, 0x73, 0x74, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xe, 0xe, 0xe, 0xff, - 0x64, 0x65, 0x65, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xe, 0xe, 0xe, 0xff, 0x48, 0x48, 0x48, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0xac, 0xad, 0xae, 0xff, 0xe, 0xe, 0xe, 0xff, 0x0, 0x0, 0x0, 0xff, - 0x0, 0x0, 0x0, 0xff, 0x73, 0x73, 0x74, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, - 0x73, 0x73, 0x74, 0xff, 0x0, 0x0, 0x0, 0xff, 0xe, 0xe, 0xe, 0xff, 0xba, 0xbb, 0xbc, 0xff, - 0x56, 0x56, 0x57, 0xff, 0x0, 0x0, 0x0, 0xff, 0x8f, 0x90, 0x91, 0xff, 0xc9, 0xca, 0xcb, 0xff, - 0x2b, 0x2b, 0x2b, 0xff, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0xff, 0x39, 0x3a, 0x3a, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0xac, 0xad, 0xae, 0xff, 0xe, 0xe, 0xe, 0xff, 0x0, 0x0, 0x0, 0xff, - 0x0, 0x0, 0x0, 0xff, 0x73, 0x73, 0x74, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xe, 0xe, 0xe, 0xff, - 0x48, 0x48, 0x48, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0x48, 0x48, 0x48, 0xff, 0xe, 0xe, 0xe, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0x73, 0x73, 0x74, 0xff, 0x0, 0x0, 0x0, 0xff, 0xc9, 0xca, 0xcb, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0x12, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xd7, 0xd8, 0xd9, 0x3b, 0xd7, 0xd8, 0xd9, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xc3, - 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x6e, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, - 0xd7, 0xd8, 0xd9, 0xc9, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, - 0xd7, 0xd8, 0xd9, 0xc3, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xd7, 0xd8, 0xd9, 0x3b, - 0xd7, 0xd8, 0xd9, 0xc3, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xc3, 0xd7, 0xd8, 0xd9, 0xb2, - 0xd7, 0xd8, 0xd9, 0xef, 0xd7, 0xd8, 0xd9, 0xb2, 0xd7, 0xd8, 0xd9, 0xef, 0xd7, 0xd8, 0xd9, 0xcc, - 0xd7, 0xd8, 0xd9, 0xef, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xc3, 0xd7, 0xd8, 0xd9, 0x4c, - 0xd7, 0xd8, 0xd9, 0xc3, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xc3, 0xd7, 0xd8, 0xd9, 0x2c, - 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x0, 0xd7, 0xd8, 0xd9, 0x6e, 0xd7, 0xd8, 0xd9, 0xc3, - 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xcc, 0xd7, 0xd8, 0xd9, 0x90, - 0xd7, 0xd8, 0xd9, 0x1b, 0xd7, 0xd8, 0xd9, 0xb2, 0xd7, 0xd8, 0xd9, 0xef, 0xd7, 0xd8, 0xd9, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xc3, 0xd7, 0xd8, 0xd9, 0xb2, 0xd7, 0xd8, 0xd9, 0xef, - 0xd7, 0xd8, 0xd9, 0xb2, 0xd7, 0xd8, 0xd9, 0xb2, 0xd7, 0xd8, 0xd9, 0xef, 0xd7, 0xd8, 0xd9, 0xb2, - 0xd7, 0xd8, 0xd9, 0x6e, 0xd7, 0xd8, 0xd9, 0xb2, 0xd7, 0xd8, 0xd9, 0xef, 0xd7, 0xd8, 0xd9, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xc3, 0xd7, 0xd8, 0xd9, 0x3b, 0xd7, 0xd8, 0xd9, 0x3b, - 0xd7, 0xd8, 0xd9, 0xc3, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xef, 0xd7, 0xd8, 0xd9, 0xb2, - 0xd7, 0xd8, 0xd9, 0xc3, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xc3, 0xd7, 0xd8, 0xd9, 0x90, - 0xd7, 0xd8, 0xd9, 0xcc, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xc3, - 0xd7, 0xd8, 0xd9, 0x7f, 0xd7, 0xd8, 0xd9, 0xb2, 0xd7, 0xd8, 0xd9, 0xef, 0xd7, 0xd8, 0xd9, 0xff, - 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xc3, 0xd7, 0xd8, 0xd9, 0xb2, 0xd7, 0xd8, 0xd9, 0xef, - 0xd7, 0xd8, 0xd9, 0xb2, 0xd7, 0xd8, 0xd9, 0x6e, 0xd7, 0xd8, 0xd9, 0xb2, 0xd7, 0xd8, 0xd9, 0xef, - 0xd7, 0xd8, 0xd9, 0xb2, 0xd7, 0xd8, 0xd9, 0xc3, 0xd7, 0xd8, 0xd9, 0xff, 0xd7, 0xd8, 0xd9, 0xc3, - 0xd7, 0xd8, 0xd9, 0x2c, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0 -}; - -} -} diff --git a/Source/Core/URL.cpp b/Source/Core/URL.cpp index 678a5f018..a7101d2d6 100644 --- a/Source/Core/URL.cpp +++ b/Source/Core/URL.cpp @@ -45,14 +45,14 @@ URL::URL() URL::URL(const String& _url) { port = 0; - EMP_VERIFY(SetURL(_url)); + ROCKET_VERIFY(SetURL(_url)); } // Constructs a new URL from the given string. URL::URL(const char* _url) { port = 0; - EMP_VERIFY(SetURL(_url)); + ROCKET_VERIFY(SetURL(_url)); } // Destroys the URL. @@ -492,7 +492,7 @@ void URL::ConstructURL() const } url.Append( "@" ); } - EMP_ASSERTMSG( password.Empty() || ( !password.Empty() && !login.Empty() ), "Can't have a password without a login!" ); + ROCKET_ASSERTMSG( password.Empty() || ( !password.Empty() && !login.Empty() ), "Can't have a password without a login!" ); // Append the host. url += host; @@ -502,7 +502,7 @@ void URL::ConstructURL() const { if (port > 0) { - EMP_ASSERTMSG( !host.Empty(), "Can't have a port without a host!" ); + ROCKET_ASSERTMSG( !host.Empty(), "Can't have a port without a host!" ); char port_string[16]; sprintf(port_string, ":%d/", port); url.Append(port_string); diff --git a/Source/Core/UnicodeRange.cpp b/Source/Core/UnicodeRange.cpp index db36e52a0..399c50a33 100644 --- a/Source/Core/UnicodeRange.cpp +++ b/Source/Core/UnicodeRange.cpp @@ -42,7 +42,7 @@ UnicodeRange::UnicodeRange(int _min_codepoint, int _max_codepoint) min_codepoint = _min_codepoint; max_codepoint = _max_codepoint; - EMP_ASSERT(min_codepoint <= max_codepoint); + ROCKET_ASSERT(min_codepoint <= max_codepoint); } // Initialises the range from a unicode range in string form. diff --git a/Source/Core/Variant.cpp b/Source/Core/Variant.cpp index f2af40a38..36d0e978a 100644 --- a/Source/Core/Variant.cpp +++ b/Source/Core/Variant.cpp @@ -36,11 +36,11 @@ Variant::Variant() data_block = NULL; // Make sure our object size assumptions fit inside the static buffer - //EMP_STATIC_ASSERT(sizeof(Quaternion) <= 16, Invalid_Size_Quaternion); - //EMP_STATIC_ASSERT(sizeof(Vector4f) <= 16, Invalid_Size_Vector4f); - //EMP_STATIC_ASSERT(sizeof(Vector4i) <= 16, Invalid_Size_Vector4i); - EMP_STATIC_ASSERT(sizeof(Colourb) <= 16, Invalid_Size_Colourb); - EMP_STATIC_ASSERT(sizeof(Colourf) <= 16, Invalid_Size_Colourf); + //ROCKET_STATIC_ASSERT(sizeof(Quaternion) <= 16, Invalid_Size_Quaternion); + //ROCKET_STATIC_ASSERT(sizeof(Vector4f) <= 16, Invalid_Size_Vector4f); + //ROCKET_STATIC_ASSERT(sizeof(Vector4i) <= 16, Invalid_Size_Vector4i); + ROCKET_STATIC_ASSERT(sizeof(Colourb) <= 16, Invalid_Size_Colourb); + ROCKET_STATIC_ASSERT(sizeof(Colourf) <= 16, Invalid_Size_Colourf); } Variant::Variant( const Variant& copy ) @@ -191,7 +191,7 @@ void Variant::ReleaseDataBlock() return; data_block->reference_count--; - EMP_ASSERT(data_block->reference_count >= 0); + ROCKET_ASSERT(data_block->reference_count >= 0); if (data_block->reference_count == 0) { delete data_block; @@ -215,7 +215,7 @@ Variant::DataBlock::~DataBlock() void Variant::DataBlock::Clear() { // Should only clear when we have no references - EMP_ASSERT(reference_count == 0); + ROCKET_ASSERT(reference_count == 0); // Free any allocated types. switch (type) diff --git a/Source/Core/Vector2.cpp b/Source/Core/Vector2.cpp new file mode 100644 index 000000000..8eadb12b7 --- /dev/null +++ b/Source/Core/Vector2.cpp @@ -0,0 +1,65 @@ +/* + * This source file is part of libRocket, the HTML/CSS Interface Middleware + * + * For the latest information, see http://www.librocket.com + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * + * 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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +#include "precompiled.h" +#include + +namespace Rocket { +namespace Core { + +Vector2i operator*(int lhs, const Vector2i& rhs) +{ + return Vector2i(lhs * rhs.x, lhs * rhs.y); +} + +Vector2f operator*(float lhs, const Vector2f& rhs) +{ + return Vector2f(lhs * rhs.x, lhs * rhs.y); +} + +template <> +Vector2< float > Vector2< float >::Normalise() const +{ + float magnitude = Magnitude(); + if (Math::IsZero(magnitude)) + return *this; + + return *this / magnitude; +} + +template <> +Vector2< float > Vector2< float >::Rotate(float theta) const +{ + float cos_theta = Math::Cos(theta); + float sin_theta = Math::Sin(theta); + + return Vector2< float >(cos_theta * x - sin_theta * y, + sin_theta * x + cos_theta * y); +} + +} +} diff --git a/Source/Core/WidgetSlider.cpp b/Source/Core/WidgetSlider.cpp index 2a56b3990..353110003 100644 --- a/Source/Core/WidgetSlider.cpp +++ b/Source/Core/WidgetSlider.cpp @@ -86,7 +86,7 @@ bool WidgetSlider::Initialise(Orientation _orientation) // Check that we haven't already been successfully initialised. if (orientation != UNKNOWN) { - EMP_ERROR; + ROCKET_ERROR; return false; } @@ -94,7 +94,7 @@ bool WidgetSlider::Initialise(Orientation _orientation) if (_orientation != HORIZONTAL && _orientation != VERTICAL) { - EMP_ERROR; + ROCKET_ERROR; return false; } diff --git a/Source/Core/WidgetSliderScroll.cpp b/Source/Core/WidgetSliderScroll.cpp index 6c093a126..4b56191d9 100644 --- a/Source/Core/WidgetSliderScroll.cpp +++ b/Source/Core/WidgetSliderScroll.cpp @@ -43,7 +43,7 @@ WidgetSliderScroll::~WidgetSliderScroll() } // Sets the length of the entire track in some arbitrary unit. -void WidgetSliderScroll::SetTrackLength(float _track_length, bool EMP_UNUSED(force_resize)) +void WidgetSliderScroll::SetTrackLength(float _track_length, bool ROCKET_UNUSED(force_resize)) { if (track_length != _track_length) { @@ -53,7 +53,7 @@ void WidgetSliderScroll::SetTrackLength(float _track_length, bool EMP_UNUSED(for } // Sets the length the bar represents in some arbitrary unit, relative to the track length. -void WidgetSliderScroll::SetBarLength(float _bar_length, bool EMP_UNUSED(force_resize)) +void WidgetSliderScroll::SetBarLength(float _bar_length, bool ROCKET_UNUSED(force_resize)) { if (bar_length != _bar_length) { @@ -105,14 +105,14 @@ float WidgetSliderScroll::OnLineDecrement() // Called when the slider is incremented by one 'page', either by the page-up key or a mouse-click on the track // below / right of the bar. -float WidgetSliderScroll::OnPageIncrement(float EMP_UNUSED(click_position)) +float WidgetSliderScroll::OnPageIncrement(float ROCKET_UNUSED(click_position)) { return Scroll(bar_length); } // Called when the slider is incremented by one 'page', either by the page-down key or a mouse-click on the track // above / left of the bar. -float WidgetSliderScroll::OnPageDecrement(float EMP_UNUSED(click_position)) +float WidgetSliderScroll::OnPageDecrement(float ROCKET_UNUSED(click_position)) { return Scroll(-bar_length); } diff --git a/Source/Core/XMLNodeHandlerBody.cpp b/Source/Core/XMLNodeHandlerBody.cpp index 81e134f9e..0b71d1f2e 100644 --- a/Source/Core/XMLNodeHandlerBody.cpp +++ b/Source/Core/XMLNodeHandlerBody.cpp @@ -44,7 +44,7 @@ XMLNodeHandlerBody::~XMLNodeHandlerBody() Element* XMLNodeHandlerBody::ElementStart(XMLParser* parser, const String& name, const XMLAttributes& attributes) { (name); - EMP_ASSERT(name == "body"); + ROCKET_ASSERT(name == "body"); Element* element = parser->GetParseFrame()->element; @@ -66,7 +66,7 @@ Element* XMLNodeHandlerBody::ElementStart(XMLParser* parser, const String& name, return element; } -bool XMLNodeHandlerBody::ElementEnd(XMLParser* EMP_UNUSED(parser), const String& EMP_UNUSED(name)) +bool XMLNodeHandlerBody::ElementEnd(XMLParser* ROCKET_UNUSED(parser), const String& ROCKET_UNUSED(name)) { return true; } diff --git a/Source/Core/XMLNodeHandlerDefault.cpp b/Source/Core/XMLNodeHandlerDefault.cpp index 6ef996e87..0e73ef43d 100644 --- a/Source/Core/XMLNodeHandlerDefault.cpp +++ b/Source/Core/XMLNodeHandlerDefault.cpp @@ -64,7 +64,7 @@ Element* XMLNodeHandlerDefault::ElementStart(XMLParser* parser, const String& na return element; } -bool XMLNodeHandlerDefault::ElementEnd(XMLParser* EMP_UNUSED(parser), const String& EMP_UNUSED(name)) +bool XMLNodeHandlerDefault::ElementEnd(XMLParser* ROCKET_UNUSED(parser), const String& ROCKET_UNUSED(name)) { return true; } diff --git a/Source/Core/XMLNodeHandlerTemplate.cpp b/Source/Core/XMLNodeHandlerTemplate.cpp index c57533aff..53967c56d 100644 --- a/Source/Core/XMLNodeHandlerTemplate.cpp +++ b/Source/Core/XMLNodeHandlerTemplate.cpp @@ -46,7 +46,7 @@ XMLNodeHandlerTemplate::~XMLNodeHandlerTemplate() Element* XMLNodeHandlerTemplate::ElementStart(XMLParser* parser, const String& name, const XMLAttributes& attributes) { name; - EMP_ASSERT(name == "template"); + ROCKET_ASSERT(name == "template"); (name); String template_name = attributes.Get("src", ""); @@ -57,7 +57,7 @@ Element* XMLNodeHandlerTemplate::ElementStart(XMLParser* parser, const String& n return XMLParseTools::ParseTemplate(parser->GetParseFrame()->element, template_name); } -bool XMLNodeHandlerTemplate::ElementEnd(XMLParser* EMP_UNUSED(parser), const String& EMP_UNUSED(name)) +bool XMLNodeHandlerTemplate::ElementEnd(XMLParser* ROCKET_UNUSED(parser), const String& ROCKET_UNUSED(name)) { return true; } diff --git a/bin/rocket.py b/bin/rocket.py new file mode 100644 index 000000000..fe620a260 --- /dev/null +++ b/bin/rocket.py @@ -0,0 +1,6 @@ +from _rocketcore import * + +try: + from _rocketcontrols import * +except ImportError: + pass \ No newline at end of file diff --git a/changelog.txt b/changelog.txt index 79f0c1c52..a09b1739c 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,194 +1,194 @@ -libRocket changelog - -v1.2.0 -5th September 2010 -========================================== -Features: - * Licensing requirements removed, entire library switched to MIT license - -API Changes: - * All of EMP::Core moved into Rocket::Core, except EMP::Data* which has moved into Rocket::Controls - * License key removed. - -v1.1.3008 -29th September 2009 -========================================== -Features: - * Added the 'focus' property, which can be set to 'auto' (the default) or 'none'. Elements which are set to 'none' can never have focus. - * Added the 'text-transform' property, which can be set to 'auto' (the default), 'uppercase' or 'lowercase'. It currently only supports transformations on ASCII characters. - * Added the ClearStyleSheetCache() function to Rocket::Core::Factory. - * Upgraded to Freetype 2.39. - * Upgraded to Python 2.6.2. - * Upgraded to Boost 1.40.0. - -Fixes: - * Fixed a rounding error when offsetting an element with a relative position. - * Fixed the Ogre3D sample to render properly with the Ogre's compositing system. - * When an element is unparented, it is now also removed from its context's focus and hover chains if appropriate. - -v1.1.2979 -29th October 2008 -========================================== -API changes: - * The 'source_path' parameter has been removed from the Rocket::Core::RenderInterface::LoadTexture() function. Custom path concatenation is now achieved through the new JoinPath() function on Rocket::Core::SystemInterface (see below). - -Features: - * Added the JoinPath() function to Rocket::Core::SystemInterface. This allows an application to customise the way a resource path is concatenated onto the path of the RML / RCSS document that specified it. It is an optional override, the default implementation simply adds the paths together and normalises the paths. - * Installing a render interface into libRocket before initialisation through Rocket::Core::SetRenderInterface() is now optional. If one isn't specified, all contexts must have a custom render interface provided in Rocket::Core::CreateContext(). - * If a context has a custom render interface, textures used by that context will now be loaded and release through that context instead of the default context. - * Changed the Ogre3D sample to more correctly support resource locations. - * Upgraded libRocket Python to boost 1.36. - * Text controls (text input fields and multi-line text areas) now support selection with the mouse or keyboard, and content can be copied and pasted from a clipboard. - * The 'change' event dispatched by a scrollbar has been changed to 'scrollchange' to distinguish it from events sent by input elements. - * Added the 'button' input type (ie, '