diff -Nru kodi-visualization-goom-1.1.0/bootstrap/autoreconf.txt kodi-visualization-goom-2.1.0/bootstrap/autoreconf.txt --- kodi-visualization-goom-1.1.0/bootstrap/autoreconf.txt 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/bootstrap/autoreconf.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -lib/goom2k4-0 diff -Nru kodi-visualization-goom-1.1.0/CMakeLists.txt kodi-visualization-goom-2.1.0/CMakeLists.txt --- kodi-visualization-goom-1.1.0/CMakeLists.txt 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/CMakeLists.txt 2019-12-15 17:36:28.000000000 +0000 @@ -1,34 +1,38 @@ +cmake_minimum_required(VERSION 3.5) project(visualization.goom) -cmake_minimum_required(VERSION 2.6) - set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${PROJECT_SOURCE_DIR}) find_package(Kodi REQUIRED) +find_package(glm REQUIRED) -find_package(OpenGL REQUIRED) -include_directories(${OpenGL_INCLUDE_DIR} - ${KODI_INCLUDE_DIR} - ${PROJECT_SOURCE_DIR}/lib/goom2k4-0/src) - -include(ExternalProject) -set(update_command "") -if(BOOTSTRAP_IN_TREE OR NOT DEFINED BOOTSTRAP_IN_TREE) - set(update_command UPDATE_COMMAND autoreconf -vif WORKING_DIRECTORY ) +if(APP_RENDER_SYSTEM STREQUAL "gl" OR NOT APP_RENDER_SYSTEM) + find_package(OpenGl REQUIRED) + set(DEPLIBS ${OPENGL_LIBRARIES}) + set(includes ${OPENGL_INCLUDE_DIR}) + add_definitions(${OPENGL_DEFINITIONS}) +else() + find_package(OpenGLES REQUIRED) + set(DEPLIBS ${OPENGLES_LIBRARIES}) + set(includes ${OPENGLES_INCLUDE_DIR}) + add_definitions(${OPENGLES_DEFINITIONS}) endif() -externalproject_add(libgoom SOURCE_DIR ${PROJECT_SOURCE_DIR}/lib/goom2k4-0 - "${update_command}" - CONFIGURE_COMMAND ${PROJECT_SOURCE_DIR}/lib/goom2k4-0/configure --disable-shared --enable-static --with-pic --prefix= - BUILD_COMMAND ${MAKE} - INSTALL_COMMAND "") + +add_subdirectory(lib/goom) + +include_directories(${includes} + ${GLM_INCLUDE_DIR} + ${KODI_INCLUDE_DIR}/.. # Hack way with "/..", need bigger Kodi cmake rework to match right include ways (becomes done in future) + ${PROJECT_SOURCE_DIR}/lib + ${PROJECT_SOURCE_DIR}/lib/goom/src) set(GOOM_SOURCES src/Main.cpp) -set(DEPLIBS ${OPENGL_LIBRARIES} - ${CMAKE_BINARY_DIR}/libgoom-prefix/src/libgoom-build/src/.libs/libgoom2.a) +set(GOOM_HEADERS src/CircularBuffer.h + src/Main.h) + +list(APPEND DEPLIBS goom) build_addon(visualization.goom GOOM DEPLIBS) -add_dependencies(visualization.goom libgoom) include(CPack) - diff -Nru kodi-visualization-goom-1.1.0/debian/changelog kodi-visualization-goom-2.1.0/debian/changelog --- kodi-visualization-goom-1.1.0/debian/changelog 2018-04-30 15:14:22.000000000 +0000 +++ kodi-visualization-goom-2.1.0/debian/changelog 2013-05-31 22:59:22.000000000 +0000 @@ -1,9 +1,6 @@ -kodi-visualization-goom (1.1.0-1~bionic) bionic; urgency=low +kodi-visualization-goom (2.1.0-1~bionic) bionic; urgency=low - [ xbmc ] + [ kodi ] * autogenerated dummy changelog - [ wsnipex ] - * no upstream changelog available - - -- wsnipex Mon, 30 Apr 2018 17:14:22 +0200 + -- Nobody Sat, 01 Jun 2013 00:59:22 +0200 diff -Nru kodi-visualization-goom-1.1.0/debian/changelog.in kodi-visualization-goom-2.1.0/debian/changelog.in --- kodi-visualization-goom-1.1.0/debian/changelog.in 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/debian/changelog.in 2013-05-31 22:59:22.000000000 +0000 @@ -1,7 +1,6 @@ kodi-visualization-goom (#PACKAGEVERSION#-#TAGREV#~#DIST#) #DIST#; urgency=low - [ xbmc ] + [ kodi ] * autogenerated dummy changelog - -- Arne Morten Kvarving Sat, 01 Jun 2013 00:59:22 +0200 - + -- Nobody Sat, 01 Jun 2013 00:59:22 +0200 diff -Nru kodi-visualization-goom-1.1.0/debian/changelog.tmp kodi-visualization-goom-2.1.0/debian/changelog.tmp --- kodi-visualization-goom-1.1.0/debian/changelog.tmp 2018-04-30 15:14:17.000000000 +0000 +++ kodi-visualization-goom-2.1.0/debian/changelog.tmp 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ -kodi-visualization-goom (1.1.0-1~#DIST#) #DIST#; urgency=low - - [ xbmc ] - * autogenerated dummy changelog - - -- Arne Morten Kvarving Sat, 01 Jun 2013 00:59:22 +0200 - diff -Nru kodi-visualization-goom-1.1.0/debian/compat kodi-visualization-goom-2.1.0/debian/compat --- kodi-visualization-goom-1.1.0/debian/compat 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/debian/compat 2013-05-31 22:59:22.000000000 +0000 @@ -1 +1 @@ -8 +9 diff -Nru kodi-visualization-goom-1.1.0/debian/control kodi-visualization-goom-2.1.0/debian/control --- kodi-visualization-goom-1.1.0/debian/control 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/debian/control 2013-05-31 22:59:22.000000000 +0000 @@ -1,12 +1,12 @@ Source: kodi-visualization-goom Priority: extra -Maintainer: Arne Morten Kvarving -Build-Depends: debhelper (>= 8.0.0), cmake, kodi-addon-dev, - kodi-visualization-dev, libgl1-mesa-dev, - automake, autoconf, libtool -Standards-Version: 3.9.2 +Maintainer: Nobody +Build-Depends: debhelper (>= 9.0.0), cmake, kodi-addon-dev, + libgles2-mesa-dev [arm64 armhf], libgl1-mesa-dev [i386 amd64], + libglm-dev +Standards-Version: 4.1.2 Section: libs -Homepage: http://xbmc.org +Homepage: http://kodi.tv Package: kodi-visualization-goom Section: libs diff -Nru kodi-visualization-goom-1.1.0/debian/copyright kodi-visualization-goom-2.1.0/debian/copyright --- kodi-visualization-goom-1.1.0/debian/copyright 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/debian/copyright 2013-05-31 22:59:22.000000000 +0000 @@ -2,7 +2,7 @@ Upstream-Name: visualization.goom Files: * -Copyright: 2005-2013 Team XBMC +Copyright: 2005-2019 Team Kodi License: GPL-2+ This package is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -24,6 +24,7 @@ Files: debian/* Copyright: 2013 Arne Morten Kvarving 2013 wsnipex + 2005-2019 Team Kodi License: GPL-2+ This package is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff -Nru kodi-visualization-goom-1.1.0/debian/kodi-visualization-goom.install kodi-visualization-goom-2.1.0/debian/kodi-visualization-goom.install --- kodi-visualization-goom-1.1.0/debian/kodi-visualization-goom.install 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/debian/kodi-visualization-goom.install 2013-05-31 22:59:22.000000000 +0000 @@ -0,0 +1,2 @@ +usr/lib/* +usr/share/* diff -Nru kodi-visualization-goom-1.1.0/debian/rules kodi-visualization-goom-2.1.0/debian/rules --- kodi-visualization-goom-1.1.0/debian/rules 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/debian/rules 2013-05-31 22:59:22.000000000 +0000 @@ -18,9 +18,6 @@ override_dh_strip: dh_strip --dbg-package=kodi-visualization-goom-dbg -override_dh_auto_install: - dh_auto_install --destdir=debian/kodi-visualization-goom - override_dh_installdocs: dh_installdocs --link-doc=kodi-visualization-goom diff -Nru kodi-visualization-goom-1.1.0/depends/common/glm/flags.txt kodi-visualization-goom-2.1.0/depends/common/glm/flags.txt --- kodi-visualization-goom-1.1.0/depends/common/glm/flags.txt 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/depends/common/glm/flags.txt 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1 @@ +-DGLM_TEST_ENABLE_CXX_11=1 -DGLM_TEST_ENABLE=0 -DGLM_TEST_ENABLE_SIMD_SSE2=0 -DCMAKE_INSTALL_LIBDIR=lib diff -Nru kodi-visualization-goom-1.1.0/depends/common/glm/glm.sha256 kodi-visualization-goom-2.1.0/depends/common/glm/glm.sha256 --- kodi-visualization-goom-1.1.0/depends/common/glm/glm.sha256 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/depends/common/glm/glm.sha256 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1 @@ +3a073eb8f3be07cee74481db0e1f78eda553b554941e405c863ab64de6a2e954 diff -Nru kodi-visualization-goom-1.1.0/depends/common/glm/glm.txt kodi-visualization-goom-2.1.0/depends/common/glm/glm.txt --- kodi-visualization-goom-1.1.0/depends/common/glm/glm.txt 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/depends/common/glm/glm.txt 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1 @@ +glm https://github.com/g-truc/glm/archive/0.9.9.4.tar.gz diff -Nru kodi-visualization-goom-1.1.0/depends/osx/glm/flags.txt kodi-visualization-goom-2.1.0/depends/osx/glm/flags.txt --- kodi-visualization-goom-1.1.0/depends/osx/glm/flags.txt 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/depends/osx/glm/flags.txt 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1 @@ +-DGLM_TEST_ENABLE_CXX_11=1 -DGLM_TEST_ENABLE=0 -DGLM_TEST_ENABLE_SIMD_SSE2=1 -DCMAKE_INSTALL_LIBDIR=lib diff -Nru kodi-visualization-goom-1.1.0/depends/osx/glm/glm.sha256 kodi-visualization-goom-2.1.0/depends/osx/glm/glm.sha256 --- kodi-visualization-goom-1.1.0/depends/osx/glm/glm.sha256 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/depends/osx/glm/glm.sha256 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1 @@ +3a073eb8f3be07cee74481db0e1f78eda553b554941e405c863ab64de6a2e954 diff -Nru kodi-visualization-goom-1.1.0/depends/osx/glm/glm.txt kodi-visualization-goom-2.1.0/depends/osx/glm/glm.txt --- kodi-visualization-goom-1.1.0/depends/osx/glm/glm.txt 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/depends/osx/glm/glm.txt 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1 @@ +glm https://github.com/g-truc/glm/archive/0.9.9.4.tar.gz diff -Nru kodi-visualization-goom-1.1.0/FindOpenGl.cmake kodi-visualization-goom-2.1.0/FindOpenGl.cmake --- kodi-visualization-goom-1.1.0/FindOpenGl.cmake 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/FindOpenGl.cmake 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,41 @@ +#.rst: +# FindOpenGl +# ---------- +# Finds the FindOpenGl library +# +# This will define the following variables:: +# +# OPENGL_FOUND - system has OpenGl +# OPENGL_INCLUDE_DIRS - the OpenGl include directory +# OPENGL_LIBRARIES - the OpenGl libraries +# OPENGL_DEFINITIONS - the OpenGl definitions + +if(PKG_CONFIG_FOUND) + pkg_check_modules(PC_OPENGL gl QUIET) +endif() + +if(NOT CORE_SYSTEM_NAME STREQUAL osx) + find_path(OPENGL_INCLUDE_DIR GL/gl.h + PATHS ${PC_OPENGL_gl_INCLUDEDIR}) + find_library(OPENGL_gl_LIBRARY NAMES GL + PATHS ${PC_OPENGL_gl_LIBDIR}) +else() + find_library(OPENGL_gl_LIBRARY NAMES OpenGL + PATHS ${CMAKE_OSX_SYSROOT}/System/Library + PATH_SUFFIXES Frameworks + NO_DEFAULT_PATH) + set(OPENGL_INCLUDE_DIR ${OPENGL_gl_LIBRARY}/Headers) +endif() + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(OpenGl + REQUIRED_VARS OPENGL_gl_LIBRARY OPENGL_INCLUDE_DIR) + +if(OPENGL_FOUND) + set(OPENGL_INCLUDE_DIRS ${OPENGL_INCLUDE_DIR}) + set(OPENGL_LIBRARIES ${OPENGL_gl_LIBRARY}) + set(OPENGL_DEFINITIONS -DHAS_GL=1) +endif() + +mark_as_advanced(OPENGL_INCLUDE_DIR OPENGL_gl_LIBRARY) + diff -Nru kodi-visualization-goom-1.1.0/FindOpenGLES.cmake kodi-visualization-goom-2.1.0/FindOpenGLES.cmake --- kodi-visualization-goom-1.1.0/FindOpenGLES.cmake 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/FindOpenGLES.cmake 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,56 @@ +#.rst: +# FindOpenGLES +# ------------ +# Finds the OpenGLES2 and OpenGLES3 library +# +# This will define the following variables: +# +# OPENGLES_FOUND - system has OpenGLES +# OPENGLES_INCLUDE_DIRS - the OpenGLES include directory +# OPENGLES_LIBRARIES - the OpenGLES libraries +# OPENGLES_DEFINITIONS - the OpenGLES definitions +# + +if(CORE_PLATFORM_NAME_LC STREQUAL rbpi) + set(_brcmprefix brcm) +endif() + +if(PKG_CONFIG_FOUND) + pkg_check_modules(PC_OPENGLES ${_brcmprefix}glesv2 QUIET) +endif() + +if(NOT CORE_SYSTEM_NAME STREQUAL ios AND + NOT CORE_SYSTEM_NAME STREQUAL darwin_embedded) + find_path(OPENGLES_INCLUDE_DIR GLES2/gl2.h + PATHS ${PC_OPENGLES_INCLUDEDIR}) + find_library(OPENGLES_gl_LIBRARY NAMES ${_brcmprefix}GLESv2 + PATHS ${PC_OPENGLES_LIBDIR}) +else() + find_library(OPENGLES_gl_LIBRARY NAMES OpenGLES + PATHS ${CMAKE_OSX_SYSROOT}/System/Library + PATH_SUFFIXES Frameworks + NO_DEFAULT_PATH) + set(OPENGLES_INCLUDE_DIR ${OPENGLES_gl_LIBRARY}/Headers) +endif() + +find_path(OPENGLES3_INCLUDE_DIR GLES3/gl3.h) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(OpenGLES + REQUIRED_VARS OPENGLES_gl_LIBRARY OPENGLES_INCLUDE_DIR) + +find_path(OPENGLES3_INCLUDE_DIR GLES3/gl3.h + PATHS ${PC_OPENGLES_INCLUDEDIR}) + +if(OPENGLES_FOUND) + set(OPENGLES_LIBRARIES ${OPENGLES_gl_LIBRARY}) + if(OPENGLES3_INCLUDE_DIR) + set(OPENGLES_INCLUDE_DIRS ${OPENGLES_INCLUDE_DIR} ${OPENGLES3_INCLUDE_DIR}) + set(OPENGLES_DEFINITIONS -DHAS_GLES=3) + mark_as_advanced(OPENGLES_INCLUDE_DIR OPENGLES3_INCLUDE_DIR OPENGLES_gl_LIBRARY) + else() + set(OPENGLES_INCLUDE_DIRS ${OPENGLES_INCLUDE_DIR}) + set(OPENGLES_DEFINITIONS -DHAS_GLES=2) + mark_as_advanced(OPENGLES_INCLUDE_DIR OPENGLES_gl_LIBRARY) + endif() +endif() diff -Nru kodi-visualization-goom-1.1.0/.gitignore kodi-visualization-goom-2.1.0/.gitignore --- kodi-visualization-goom-1.1.0/.gitignore 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/.gitignore 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,42 @@ +# build artifacts +build/ +visualization.*/addon.xml + +# Debian build files +debian/changelog +debian/files +debian/*.log +debian/*.substvars +debian/.debhelper/ +debian/tmp/ +debian/kodi-visualization-*/ +obj-x86_64-linux-gnu/ + +# commonly used editors +# vim +*.swp + +# Eclipse +*.project +*.cproject +.classpath +*.sublime-* +.settings/ + +# KDevelop 4 +*.kdev4 + +# gedit +*~ + +# CLion +/.idea + +# clion +.idea/ + +# to prevent add after a "git format-patch VALUE" and "git add ." call +/*.patch + +# to prevent add if project code opened by Visual Studio over CMake file +.vs/ diff -Nru kodi-visualization-goom-1.1.0/Jenkinsfile kodi-visualization-goom-2.1.0/Jenkinsfile --- kodi-visualization-goom-1.1.0/Jenkinsfile 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/Jenkinsfile 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1 @@ +buildPlugin(version: "Leia", platforms: ['android-armv7', 'android-aarch64', 'ios-armv7', 'ios-aarch64', 'osx-x86_64', 'ubuntu-ppa']) diff -Nru kodi-visualization-goom-1.1.0/lib/goom/AUTHORS kodi-visualization-goom-2.1.0/lib/goom/AUTHORS --- kodi-visualization-goom-1.1.0/lib/goom/AUTHORS 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/AUTHORS 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,17 @@ +What a GOOM! +============ + +Copyright (c)2000-2009, Jean-Christophe Hoelt + Programmer and Software Designer at Fovea. + +Guillaume Borios + iTunes port/PowerPC/Core-Hacking + +Fred + WINAMP/WMP port + +--- + +Rémi Duraffort + Fix our bugs for integration into VLC. + diff -Nru kodi-visualization-goom-1.1.0/lib/goom/autogen.sh kodi-visualization-goom-2.1.0/lib/goom/autogen.sh --- kodi-visualization-goom-1.1.0/lib/goom/autogen.sh 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/autogen.sh 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,8 @@ +#!/bin/sh + +if libtoolize --version 2> /dev/null; then +aclocal -I m4 && libtoolize --copy --force && automake --foreign --add-missing && autoconf && ./configure $* +else +aclocal -I m4 && glibtoolize --copy --force && automake --foreign --add-missing && autoconf && ./configure $* +fi + diff -Nru kodi-visualization-goom-1.1.0/lib/goom/ChangeLog kodi-visualization-goom-2.1.0/lib/goom/ChangeLog --- kodi-visualization-goom-1.1.0/lib/goom/ChangeLog 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/ChangeLog 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,85 @@ +ChangeLogs for GOOM +------------------- + +.10/03/2004: version 2k4-dev12 + - A Goom Scripting Language embedded in. It allows hi level of + configuration and easy hacking of the effect's behaviour. + - Zoom filter now works on relative screen coordinates. +.04/12/2003: version 2k4-dev2 + A long time since last entry here but some work has been done during + this year, Goom v2 is now on the track and working pretty well. + Added: + - Configurability. + - A particule system for rain, fireworks and fountains. + - Dynamic brightness changes to make gooms more impressive. + - Cleaning the code. +.30/12/2002: + Auto-CPU detection. New font.. now stored in the binary file. +.28/12/2002: + Optimisation of the asm loop in ExtendedMMX +.30/11/2002: + Added tentacle3d. +.15/11/2002: + Dirty Hack to make inline asm compile well : + remove the -fPIC flag (by modifying ltconfig) +.11/11/2002: + Partial rewriting of the sound evaluator. +.10/11/2002: + bug fixes (crash with some song title, ...) + display/hide of the fps. + show information messages. +.10/08/2002: + xmms-goom now uses SDL. +.**/07/2002: + display the title. +.07/06/2002: version 1.9 + Slow change between FX. +.20/04/2002: version 1.8.1 + Hypercos effect. + - added a param to goom_core to force the fx change + - fullscreen for xmms works well + - keyboard input for xmms + - xmms-ctrl (control xmms from goom) + - auto-change fx after a large number of cycle with the same one +.11/04/2002: version 1.8.0 + IFS point effect.. +.10/12/2001: + Adding some new stuff from iGoom (circle line) + removing the init-close bug. + adding the oportunity to double the size of the pixel. +.11/07/2001: + Hello mister proper.. The code is more portable now. +.16/06/2001: + Fixing a little bug with the initial config loading. + Using the 2 new FX of the zoom filter. + + +ChangeLogs for KOP2ZEDEMO: the zoom filter +------------------------------------------ + +.16/06/2001: + NEW FX -> vPlane & hPlane. (to do rotations) + NEW FX -> noisify ; to add noise to the transformation buffer. +.03/01/2001: + All buffers are now created by a malloc + reduction of the performances... but it is now more configurable... + .(MMX version is now 50 clocks per pixel) +.28/12/2000: + Optimizing a little the sinFilter +.27/12/2000: + Optimizing the buffer generator + .(previous : 767 clocks/pixel => now : 234 clk/pxl) + Adding two effect: AMULETTE and SCRUNCH +.22/12/2000: + Good optimization : reducing mem access + .(MMX version is now 45 clocks per pixel) +.13/12/2000: + Unrolling loop +.12/12/2000: + Optimisation of the ASM code -> 64bits RAM access + .(MMX version is now 55 clocks per pixel) +.10/12/2000: + MMX version of the zoomer + .(MMX version is now 70 clocks per pixel) + +author: Jean-Christophe Hoelt diff -Nru kodi-visualization-goom-1.1.0/lib/goom/CMakeLists.txt kodi-visualization-goom-2.1.0/lib/goom/CMakeLists.txt --- kodi-visualization-goom-1.1.0/lib/goom/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/CMakeLists.txt 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,54 @@ +cmake_minimum_required(VERSION 3.5) +project(goom) + +if(WIN32) + add_definitions(-D_WIN32PC) +endif() + +set(GOOM_SOURCES src/goomsl_yacc.c + src/goomsl_lex.c + src/goomsl_lex.l + src/goomsl.c + src/goomsl_hash.c + src/goomsl_heap.c + src/goom_tools.c + src/config_param.c + src/convolve_fx.c + src/filters.c + src/flying_stars_fx.c + src/gfontlib.c + src/gfontrle.c + src/goom_core.c + src/graphic.c + src/ifs.c + src/lines.c + src/mathtools.c + src/mmx.c + src/sound_tester.c + src/surf3d.c + src/tentacle3d.c + src/plugin_info.c + src/v3d.c + src/drawmethods.c + src/cpu_info.c + src/xmmx.c) + +set(GOOM_HEADERS src/goom.h + src/goom_plugin_info.h + src/goom_typedefs.h + src/goom_graphic.h + src/goom_config_param.h + src/goom_visual_fx.h + src/goom_filters.h + src/goom_tools.h + src/goomsl.h + src/goomsl_hash.h + src/goomsl_heap.h + src/goom_tools.h + src/goom_config.h + src/tentacle3d.h + src/mmx.h + src/xmmx.h) + +add_library(goom STATIC ${GOOM_SOURCES} ${GOOM_HEADERS}) +set_property(TARGET goom PROPERTY POSITION_INDEPENDENT_CODE ON) diff -Nru kodi-visualization-goom-1.1.0/lib/goom/configure.in kodi-visualization-goom-2.1.0/lib/goom/configure.in --- kodi-visualization-goom-1.1.0/lib/goom/configure.in 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/configure.in 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,151 @@ +AC_INIT(README) + +AM_DISABLE_STATIC +AM_INIT_AUTOMAKE(SDL_Goom, 2k9) + +ACLOCAL="$ACLOCAL -I m4" + +AM_PROG_LIBTOOL +AC_PROG_CC +AC_PROG_LN_S +AM_PROG_LEX +AC_PROG_YACC + +AC_C_BIGENDIAN + +dnl Get the CFlags +CFLAGS="${CFLAGS}" +LDFLAGS="${LDFLAGS}" + +dnl *** check for xmms *** + +AM_PATH_XMMS2(0.9.5.1, HAVE_XMMS="yes", HAVE_XMMS="no") +AM_CONDITIONAL(HAVE_XMMS,test "x$HAVE_XMMS" = "xyes") + + +dnl *** SDL *** + +if test "x$HAVE_XMMS" = "xyes"; then + AM_PATH_SDL2(1.2.0, HAVE_SDL="yes", HAVE_SDL="no"]) +else + HAVE_SDL="yes" +fi +AM_CONDITIONAL(HAVE_SDL,test "x$HAVE_SDL" = "xyes") + + +dnl *** MMX *** + +dnl rm -f mmx_zoom.s +HAVE_MMX="no" +HAVE_PPC="no" +MACTARGET="no" + +dnl HOST +case "$host" in +*-apple-darwin*) + MACTARGET="yes" + MACFOLDER="mac" + AC_SUBST(MACFOLDER) + CCAS='$(CC)' + AC_SUBST(CCAS) + ;; +*-*-cygwin*) + CFLAGS="$CFLAGS -mno-cygwin -mwindows" + LDFLAGS="$LDFLAGS -lmingw32" + ;; +esac + +dnl ARCH +case "$host" in +i*86-*-*) + AC_DEFINE(HAVE_MMX) + AC_DEFINE(CPU_X86) + HAVE_MMX="yes" + ;; + +powerpc-*-*) + CCASFLAGS=-force_cpusubtype_ALL + AC_SUBST(CCASFLAGS) + AC_DEFINE(CPU_POWERPC) + HAVE_PPC="yes" + ;; + +esac +AM_CONDITIONAL(HAVE_MMX,test "x$HAVE_MMX" = "xyes") +AM_CONDITIONAL(HAVE_PPC,test "x$HAVE_PPC" = "xyes") +AM_CONDITIONAL(MACTARGET,test "x$MACTARGET" = "xyes") + + +AC_CHECK_HEADER(pthread.h,,AC_MSG_ERROR([*** POSIX thread support not installed - please install first ***])) + +PTHREAD_LIBS=error +AC_CHECK_LIB(pthread, pthread_attr_init, PTHREAD_LIBS="-lpthread") + +if test "x$PTHREAD_LIBS" = xerror; then + AC_CHECK_LIB(pthreads, pthread_attr_init, PTHREAD_LIBS="-lpthreads") +fi + +if test "x$PTHREAD_LIBS" = xerror; then + AC_CHECK_LIB(c_r, pthread_attr_init, PTHREAD_LIBS="-lc_r") +fi + +if test "x$PTHREAD_LIBS" = xerror; then + AC_CHECK_FUNC(pthread_attr_init, PTHREAD_LIBS="") +fi + +AC_SUBST(PTHREAD_LIBS) + +dnl rm -f mmx_zoom.s +dnl echo -n checking for nasm... +dnl if nasm -r 1> /dev/null 2> /dev/null +dnl then +dnl echo " `nasm -r` founded.."; +dnl else +dnl echo " not found." +dnl echo '*** NASM needed to build x86 assembly..***' +dnl AC_MSG_ERROR +dnl fi +dnl esac + +dnl AC_DEFINE(USE_ASM_MMX) +dnl ln -s mmx_zoom_x86.s mmx_zoom.s ;; +dnl *) +dnl ln -s mmx_zoom_dummy.s mmx_zoom.s ;; +dnl esac + +AC_SUBST(CFLAGS) +AC_SUBST(LDFLAGS) + +AC_OUTPUT(Makefile src/Makefile xmms-goom/Makefile sdl-goom/Makefile libgoom2.pc) + +dnl *** nice user info *** + +AC_MSG_NOTICE([goom2k4 was configured with the following options:]) +if test "x$HAVE_PPC" = "xyes"; then + AC_MSG_NOTICE([ ** PPC support enabled]) +else + AC_MSG_NOTICE([ PPC support disabled]) +fi +if test "x$HAVE_MMX" = "xyes"; then + AC_MSG_NOTICE([ ** MMX support enabled]) +else + AC_MSG_NOTICE([ MMX support disabled]) +fi +AC_MSG_NOTICE([ ** goom lib will be built]) +if test "x$HAVE_XMMS" = "xyes"; then + AC_MSG_NOTICE([ ** XMMS plugin will be built]) +else + AC_MSG_NOTICE([ XMMS plugin will not be built]) +fi +if test "x$MACTARGET" = "xyes"; then + AC_MSG_NOTICE([ ** goom mac application will be built]) + AC_MSG_NOTICE([ ** goom mac iTunes plugin will be built]) +else + AC_MSG_NOTICE([ goom mac application will not be built]) + AC_MSG_NOTICE([ goom mac iTunes plugin will not be built]) +fi +if test "x$HAVE_SDL" = "xyes"; then + AC_MSG_NOTICE([ ** goom sdl application will be built]) +else + AC_MSG_NOTICE([ goom sdl application will not be built]) +fi diff -Nru kodi-visualization-goom-1.1.0/lib/goom/COPYING kodi-visualization-goom-2.1.0/lib/goom/COPYING --- kodi-visualization-goom-1.1.0/lib/goom/COPYING 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/COPYING 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,3 @@ +This program is under the LGPL. +You can find the terms of this licence somewhere on the internet. +(for exemple, search "LGPL" on your favorite search engine). Binary files /tmp/tmpPt54Nf/VKyUZvMq5a/kodi-visualization-goom-1.1.0/lib/goom/goom2k4.png and /tmp/tmpPt54Nf/jSnkFgw56d/kodi-visualization-goom-2.1.0/lib/goom/goom2k4.png differ diff -Nru kodi-visualization-goom-1.1.0/lib/goom/INSTALL kodi-visualization-goom-2.1.0/lib/goom/INSTALL --- kodi-visualization-goom-1.1.0/lib/goom/INSTALL 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/INSTALL 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,28 @@ +What a GOOM! +------------ + +********************************** +** How to compile on Linux/unix ** +********************************** +'./configure' +'make' && 'make install' + +** Needed packages ** +- xmms-devel +- SDL & SDL-devel + + +******************************* +** How to compile on MacOS X ** +******************************* +In a shell, type the following (without quotes): "./autogen.sh && make" +Do not use "make install" +The iTunes plugin and the standalone app should be built in the mac folder. +Distributor only : The mac Makefile also contains a special "package" target to build the distribution disk image. + + +-- +(c) 2000-2005, by: +* Jean-Christophe Hoelt "jeko" +* Guillaume Borios "gyom" +for iOS-Software. diff -Nru kodi-visualization-goom-1.1.0/lib/goom/KNOWNBUGS kodi-visualization-goom-2.1.0/lib/goom/KNOWNBUGS --- kodi-visualization-goom-1.1.0/lib/goom/KNOWNBUGS 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/KNOWNBUGS 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1 @@ + diff -Nru kodi-visualization-goom-1.1.0/lib/goom/libgoom2.pc.in kodi-visualization-goom-2.1.0/lib/goom/libgoom2.pc.in --- kodi-visualization-goom-1.1.0/lib/goom/libgoom2.pc.in 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/libgoom2.pc.in 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,12 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: libgoom2 +Version: @VERSION@ +Description: goom audio visualisation effects. +Requires: +Libs: -L${libdir} -lgoom2 +Cflags: -I${includedir} + diff -Nru kodi-visualization-goom-1.1.0/lib/goom/m4/sdl.m4 kodi-visualization-goom-2.1.0/lib/goom/m4/sdl.m4 --- kodi-visualization-goom-1.1.0/lib/goom/m4/sdl.m4 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/m4/sdl.m4 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,175 @@ +# Configure paths for SDL +# Sam Lantinga 9/21/99 +# stolen from Manish Singh +# stolen back from Frank Belew +# stolen from Manish Singh +# Shamelessly stolen from Owen Taylor + +dnl AM_PATH_SDL([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]]) +dnl Test for SDL, and define SDL_CFLAGS and SDL_LIBS +dnl +AC_DEFUN([AM_PATH_SDL2], +[dnl +dnl Get the cflags and libraries from the sdl-config script +dnl +AC_ARG_WITH(sdl-prefix,[ --with-sdl-prefix=PFX Prefix where SDL is installed (optional)], + sdl_prefix="$withval", sdl_prefix="") +AC_ARG_WITH(sdl-exec-prefix,[ --with-sdl-exec-prefix=PFX Exec prefix where SDL is installed (optional)], + sdl_exec_prefix="$withval", sdl_exec_prefix="") +AC_ARG_ENABLE(sdltest, [ --disable-sdltest Do not try to compile and run a test SDL program], + , enable_sdltest=yes) + + if test x$sdl_exec_prefix != x ; then + sdl_args="$sdl_args --exec-prefix=$sdl_exec_prefix" + if test x${SDL_CONFIG+set} != xset ; then + SDL_CONFIG=$sdl_exec_prefix/bin/sdl-config + fi + fi + if test x$sdl_prefix != x ; then + sdl_args="$sdl_args --prefix=$sdl_prefix" + if test x${SDL_CONFIG+set} != xset ; then + SDL_CONFIG=$sdl_prefix/bin/sdl-config + fi + fi + + AC_REQUIRE([AC_CANONICAL_HOST]) + PATH="$prefix/bin:$prefix/usr/bin:$PATH" + AC_PATH_PROG(SDL_CONFIG, sdl-config, no, [$PATH]) + min_sdl_version=ifelse([$1], ,0.11.0,$1) + AC_MSG_CHECKING(for SDL - version >= $min_sdl_version) + no_sdl="" + if test "$SDL_CONFIG" = "no" ; then + no_sdl=yes + else + SDL_CFLAGS=`$SDL_CONFIG $sdlconf_args --cflags` + SDL_LIBS=`$SDL_CONFIG $sdlconf_args --libs` + + sdl_major_version=`$SDL_CONFIG $sdl_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` + sdl_minor_version=`$SDL_CONFIG $sdl_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` + sdl_micro_version=`$SDL_CONFIG $sdl_config_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` + if test "x$enable_sdltest" = "xyes" ; then + ac_save_CFLAGS="$CFLAGS" + ac_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $SDL_CFLAGS" + LIBS="$LIBS $SDL_LIBS" +dnl +dnl Now check if the installed SDL is sufficiently new. (Also sanity +dnl checks the results of sdl-config to some extent +dnl + rm -f conf.sdltest + AC_TRY_RUN([ +#include +#include +#include +#include "SDL.h" + +char* +my_strdup (char *str) +{ + char *new_str; + + if (str) + { + new_str = (char *)malloc ((strlen (str) + 1) * sizeof(char)); + strcpy (new_str, str); + } + else + new_str = NULL; + + return new_str; +} + +int main (int argc, char *argv[]) +{ + int major, minor, micro; + char *tmp_version; + + /* This hangs on some systems (?) + system ("touch conf.sdltest"); + */ + { FILE *fp = fopen("conf.sdltest", "a"); if ( fp ) fclose(fp); } + + /* HP/UX 9 (%@#!) writes to sscanf strings */ + tmp_version = my_strdup("$min_sdl_version"); + if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { + printf("%s, bad version string\n", "$min_sdl_version"); + exit(1); + } + + if (($sdl_major_version > major) || + (($sdl_major_version == major) && ($sdl_minor_version > minor)) || + (($sdl_major_version == major) && ($sdl_minor_version == minor) && ($sdl_micro_version >= micro))) + { + return 0; + } + else + { + printf("\n*** 'sdl-config --version' returned %d.%d.%d, but the minimum version\n", $sdl_major_version, $sdl_minor_version, $sdl_micro_version); + printf("*** of SDL required is %d.%d.%d. If sdl-config is correct, then it is\n", major, minor, micro); + printf("*** best to upgrade to the required version.\n"); + printf("*** If sdl-config was wrong, set the environment variable SDL_CONFIG\n"); + printf("*** to point to the correct copy of sdl-config, and remove the file\n"); + printf("*** config.cache before re-running configure\n"); + return 1; + } +} + +],, no_sdl=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + if test "x$no_sdl" = x ; then + AC_MSG_RESULT(yes) + ifelse([$2], , :, [$2]) + else + AC_MSG_RESULT(no) + if test "$SDL_CONFIG" = "no" ; then + echo "*** The sdl-config script installed by SDL could not be found" + echo "*** If SDL was installed in PREFIX, make sure PREFIX/bin is in" + echo "*** your path, or set the SDL_CONFIG environment variable to the" + echo "*** full path to sdl-config." + else + if test -f conf.sdltest ; then + : + else + echo "*** Could not run SDL test program, checking why..." + CFLAGS="$CFLAGS $SDL_CFLAGS" + LIBS="$LIBS $SDL_LIBS" + AC_TRY_LINK([ +#include +#include "SDL.h" + +int main(int argc, char *argv[]) +{ return 0; } +#undef main +#define main K_and_R_C_main +], [ return 0; ], + [ echo "*** The test program compiled, but did not run. This usually means" + echo "*** that the run-time linker is not finding SDL or finding the wrong" + echo "*** version of SDL. If it is not finding SDL, you'll need to set your" + echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" + echo "*** to the installed location Also, make sure you have run ldconfig if that" + echo "*** is required on your system" + echo "***" + echo "*** If you have an old version installed, it is best to remove it, although" + echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"], + [ echo "*** The test program failed to compile or link. See the file config.log for the" + echo "*** exact error that occured. This usually means SDL was incorrectly installed" + echo "*** or that you have moved SDL since it was installed. In the latter case, you" + echo "*** may want to edit the sdl-config script: $SDL_CONFIG" ]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + SDL_CFLAGS="" + SDL_LIBS="" + ifelse([$3], , :, [$3]) + fi + AC_SUBST(SDL_CFLAGS) + AC_SUBST(SDL_LIBS) + rm -f conf.sdltest +]) diff -Nru kodi-visualization-goom-1.1.0/lib/goom/m4/xmms.m4 kodi-visualization-goom-2.1.0/lib/goom/m4/xmms.m4 --- kodi-visualization-goom-1.1.0/lib/goom/m4/xmms.m4 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/m4/xmms.m4 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,148 @@ +# CFLAGS and library paths for XMMS +# written 15 December 1999 by Ben Gertzfield + +dnl Usage: +dnl AM_PATH_XMMS([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]]) +dnl +dnl Example: +dnl AM_PATH_XMMS(0.9.5.1, , AC_MSG_ERROR([*** XMMS >= 0.9.5.1 not installed - please install first ***])) +dnl +dnl Defines XMMS_CFLAGS, XMMS_LIBS, XMMS_DATA_DIR, XMMS_PLUGIN_DIR, +dnl XMMS_VISUALIZATION_PLUGIN_DIR, XMMS_INPUT_PLUGIN_DIR, +dnl XMMS_OUTPUT_PLUGIN_DIR, XMMS_GENERAL_PLUGIN_DIR, XMMS_EFFECT_PLUGIN_DIR, +dnl and XMMS_VERSION for your plugin pleasure. +dnl + +dnl XMMS_TEST_VERSION(AVAILABLE-VERSION, NEEDED-VERSION [, ACTION-IF-OKAY [, ACTION-IF-NOT-OKAY]]) +AC_DEFUN(XMMS_TEST_VERSION2, [ + +# Determine which version number is greater. Prints 2 to stdout if +# the second number is greater, 1 if the first number is greater, +# 0 if the numbers are equal. + +# Written 15 December 1999 by Ben Gertzfield +# Revised 15 December 1999 by Jim Monty + + AC_PROG_AWK + xmms_got_version=[` $AWK ' \ +BEGIN { \ + print vercmp(ARGV[1], ARGV[2]); \ +} \ + \ +function vercmp(ver1, ver2, ver1arr, ver2arr, \ + ver1len, ver2len, \ + ver1int, ver2int, len, i, p) { \ + \ + ver1len = split(ver1, ver1arr, /\./); \ + ver2len = split(ver2, ver2arr, /\./); \ + \ + len = ver1len > ver2len ? ver1len : ver2len; \ + \ + for (i = 1; i <= len; i++) { \ + p = 1000 ^ (len - i); \ + ver1int += ver1arr[i] * p; \ + ver2int += ver2arr[i] * p; \ + } \ + \ + if (ver1int < ver2int) \ + return 2; \ + else if (ver1int > ver2int) \ + return 1; \ + else \ + return 0; \ +}' $1 $2`] + + if test $xmms_got_version -eq 2; then # failure + ifelse([$4], , :, $4) + else # success! + ifelse([$3], , :, $3) + fi +]) + +AC_DEFUN(AM_PATH_XMMS2, +[ +AC_ARG_WITH(xmms-prefix,[ --with-xmms-prefix=PFX Prefix where XMMS is installed (optional)], + xmms_config_prefix="$withval", xmms_config_prefix="") +AC_ARG_WITH(xmms-exec-prefix,[ --with-xmms-exec-prefix=PFX Exec prefix where XMMS is installed (optional)], + xmms_config_exec_prefix="$withval", xmms_config_exec_prefix="") + +if test x$xmms_config_exec_prefix != x; then + xmms_config_args="$xmms_config_args --exec-prefix=$xmms_config_exec_prefix" + if test x${XMMS_CONFIG+set} != xset; then + XMMS_CONFIG=$xmms_config_exec_prefix/bin/xmms-config + fi +fi + +if test x$xmms_config_prefix != x; then + xmms_config_args="$xmms_config_args --prefix=$xmms_config_prefix" + if test x${XMMS_CONFIG+set} != xset; then + XMMS_CONFIG=$xmms_config_prefix/bin/xmms-config + fi +fi + +AC_PATH_PROG(XMMS_CONFIG, xmms-config, no) +min_xmms_version=ifelse([$1], ,0.9.5.1, $1) + +if test "$XMMS_CONFIG" = "no"; then + no_xmms=yes +else + XMMS_CFLAGS=`$XMMS_CONFIG $xmms_config_args --cflags` + XMMS_LIBS=`$XMMS_CONFIG $xmms_config_args --libs` + XMMS_VERSION=`$XMMS_CONFIG $xmms_config_args --version` + XMMS_DATA_DIR=`$XMMS_CONFIG $xmms_config_args --data-dir` + XMMS_PLUGIN_DIR=`$XMMS_CONFIG $xmms_config_args --plugin-dir` + XMMS_VISUALIZATION_PLUGIN_DIR=`$XMMS_CONFIG $xmms_config_args \ + --visualization-plugin-dir` + XMMS_INPUT_PLUGIN_DIR=`$XMMS_CONFIG $xmms_config_args --input-plugin-dir` + XMMS_OUTPUT_PLUGIN_DIR=`$XMMS_CONFIG $xmms_config_args --output-plugin-dir` + XMMS_EFFECT_PLUGIN_DIR=`$XMMS_CONFIG $xmms_config_args --effect-plugin-dir` + XMMS_GENERAL_PLUGIN_DIR=`$XMMS_CONFIG $xmms_config_args --general-plugin-dir` + + XMMS_TEST_VERSION2($XMMS_VERSION, $min_xmms_version, ,no_xmms=version) +fi + +AC_MSG_CHECKING(for XMMS - version >= $min_xmms_version) + +if test "x$no_xmms" = x; then + AC_MSG_RESULT(yes) + ifelse([$2], , :, [$2]) +else + AC_MSG_RESULT(no) + + if test "$XMMS_CONFIG" = "no" ; then + echo "*** The xmms-config script installed by XMMS could not be found." + echo "*** If XMMS was installed in PREFIX, make sure PREFIX/bin is in" + echo "*** your path, or set the XMMS_CONFIG environment variable to the" + echo "*** full path to xmms-config." + else + if test "$no_xmms" = "version"; then + echo "*** An old version of XMMS, $XMMS_VERSION, was found." + echo "*** You need a version of XMMS newer than $min_xmms_version." + echo "*** The latest version of XMMS is always available from" + echo "*** http://www.xmms.org/" + echo "***" + + echo "*** If you have already installed a sufficiently new version, this error" + echo "*** probably means that the wrong copy of the xmms-config shell script is" + echo "*** being found. The easiest way to fix this is to remove the old version" + echo "*** of XMMS, but you can also set the XMMS_CONFIG environment to point to the" + echo "*** correct copy of xmms-config. (In this case, you will have to" + echo "*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf" + echo "*** so that the correct libraries are found at run-time)" + fi + fi + XMMS_CFLAGS="" + XMMS_LIBS="" + ifelse([$3], , :, [$3]) +fi +AC_SUBST(XMMS_CFLAGS) +AC_SUBST(XMMS_LIBS) +AC_SUBST(XMMS_VERSION) +AC_SUBST(XMMS_DATA_DIR) +AC_SUBST(XMMS_PLUGIN_DIR) +AC_SUBST(XMMS_VISUALIZATION_PLUGIN_DIR) +AC_SUBST(XMMS_INPUT_PLUGIN_DIR) +AC_SUBST(XMMS_OUTPUT_PLUGIN_DIR) +AC_SUBST(XMMS_GENERAL_PLUGIN_DIR) +AC_SUBST(XMMS_EFFECT_PLUGIN_DIR) +]) diff -Nru kodi-visualization-goom-1.1.0/lib/goom/mac/Makefile kodi-visualization-goom-2.1.0/lib/goom/mac/Makefile --- kodi-visualization-goom-1.1.0/lib/goom/mac/Makefile 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/mac/Makefile 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,88 @@ +# Makefile +# author: Gyom / iOS-Software +# Jan 2005 + + +############### +# Settings +macimage_name=iGoom +libobjects=../src/.libs/*.o +#buildroot=defaults read com.apple.Xcode "PBXApplicationwideBuildSettings" | cut -f2 -d"SYMROOT" | cut -f2 -d"\"" +buildroot=. +BUNDLE=$(buildroot)/iGoom.bundle +APP=$(buildroot)/iGoom.app +installer=iTunes/iTunes-Installer.app + + +all: $(APP) $(BUNDLE) + + +############### +# Misc library Targets + +# We build an embedable version of libgoom +StandAlone/libgoom2.0.dylib:$(libobjects) + gcc -dynamiclib -flat_namespace -o StandAlone/libgoom2.0.dylib $(libobjects) -install_name @executable_path/../Frameworks/libgoom2.0.dylib -compatibility_version 1 -current_version 1.0 -seg1addr 0x40000 -prebind + +# We link static only with iTunes because the install_path +# cannot be set properly to embed the lib in the bundle +# We must not place it in the mac folder because the bundle will +# link against the dynamic version if it is present +iTunes/libgoom2.0.a:$(libobjects) + libtool -static -o iTunes/libgoom2.0.a $(libobjects) + + +######################### +# Standalone Application + +standalone:$(APP) + +$(APP): StandAlone/libgoom2.0.dylib Makefile + xcodebuild -target "iGoom - StandAlone" -buildstyle Deployment SYMROOT=$(buildroot) + +cleanstandalone: + xcodebuild clean -target "iGoom - StandAlone" -buildstyle Deployment SYMROOT=$(buildroot) + + + +############### +# iTunes Plugin + +itunes:$(BUNDLE) + +$(BUNDLE):iTunes/libgoom2.0.a Makefile + xcodebuild -target "iGoom - iTunes" -buildstyle Deployment SYMROOT=$(buildroot) + +cleanitunes: + xcodebuild clean -target "iGoom - iTunes" -buildstyle Deployment SYMROOT=$(buildroot) + +$(installer):iTunes/Installer.applescript + osacompile -o $(installer) -x iTunes/Installer.applescript + + + +###################### +# Distribution Package + +all: $(APP) $(BUNDLE) + +package:$(macimage_name).dmg + +$(macimage_name).dmg:all ReadMe.rtf $(installer) + rm -rf $(macimage_name).dmg $(macimage_name) + mkdir -p $(macimage_name) + cp -r $(BUNDLE) $(macimage_name) + cp -r $(APP) $(macimage_name) + cp ReadMe.rtf $(macimage_name) + cp -rf $(installer) $(macimage_name)/ + hdiutil create -srcfolder $(macimage_name) $(macimage_name).dmg + + +########## +# Clean up + +clean: + rm -rf $(BUNDLE) $(APP) $(installer) + rm -rf $(macimage_name).dmg $(macimage_name) $(buildroot)/iGoom.build + rm -f StandAlone/libgoom2.* iTunes/libgoom2.* libgoom2.* + diff -Nru kodi-visualization-goom-1.1.0/lib/goom/mac/ReadMe.rtf kodi-visualization-goom-2.1.0/lib/goom/mac/ReadMe.rtf --- kodi-visualization-goom-1.1.0/lib/goom/mac/ReadMe.rtf 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/mac/ReadMe.rtf 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,256 @@ +{\rtf1\mac\ansicpg10000\cocoartf102 +{\fonttbl\f0\fswiss\fcharset77 Helvetica-Bold;\f1\fswiss\fcharset77 Helvetica;\f2\fnil\fcharset77 LucidaGrande; +} +{\colortbl;\red255\green255\blue255;\red255\green0\blue0;\red1\green128\blue0;\red0\green12\blue255; +\red0\green0\blue255;\red0\green22\blue255;\red0\green0\blue0;\red0\green132\blue14;} +\vieww15220\viewh13580\viewkind0 +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\qc + +\f0\b\fs36 \cf0 iGoom 2k4\ +\'a9 2001/2005 iOS-Software\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f1\b0\fs24 \cf0 \ +\cf2 \ +iGoom\cf0 is a wonderful visual effect plug-in for \cf3 iTunes\cf0 for Mac OS X. A mac standalone version is now also available. This is the Mac version of Goom, originally written by Jean-Christophe Hoelt "jeko" (\cf4 \ul \ulc4 jeko@ios-software.com\cf0 \ulnone ) and ported to iTunes by Guillaume Borios "gyom" (\cf4 \ul gyom@ios-software.com\cf0 \ulnone ).\ +\ +Check for informations or updates at \cf5 \ul \ulc5 http://www.\cf4 \ul \ulc4 ios-software.com\cf5 \ul \ulc5 /?page=projet&quoi=1\cf0 \ulnone .\cf6 \ul \ulc6 \ +\cf0 \ulnone \ +\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f0\b\fs28 \cf0 License and Warranty\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f1\b0\fs24 \cf0 \ +The iTunes plug-in and the StandAlone application are\cf7 distributed under the terms of the GNU General Public License.\ +See \cf5 http://www.gnu.org/licenses/gpl.html\cf7 .\ +\cf0 \ +\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f0\b\fs28 \cf0 How to install\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f1\b0\fs24 \cf0 \ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f0\b \cf0 iTunes:\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f1\b0 \cf0 Use the included install script\ +OR\ +Quit iTunes and drag the iGoom.bundle file into your "~/Library/iTunes/iTunes Plug-ins" folder. (the "~" means your home folder, the one with your user name). If any previous version of iGoom was already there, you MUST overwrite it or put it away, don't just rename.\ +\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f0\b \cf0 Standalone:\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f1\b0 \cf0 Drag and drop the application anywhere you want on your hard drive.\ +\ +\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f0\b\fs28 \cf0 How to use the iTunes plugin\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f1\b0\fs24 \cf0 Launch iTunes, then select iGoom in the iTunes "Visual" menu, enable the visual effects ( +\f2 \AppleTypeServicesU1 \uc0\u8984 +\f1 \AppleTypeServicesU0 +T) and play your favorite songs.\ +\ +When iGoom is activated you can click the option button in the iTunes window to get the Preference panel.\ +\ +The preferences can also be set 'live' by simply hitting the following keys :\ +\ +* \cf8 Pixel doubling\cf0 (Key : Q): when activated, iGoom calculates a half sized image and artificially doubles its size when rendering.\ +* \cf8 Sensitivity\cf0 (Keys : < to decrease and > to increase) : Use this to make iGoom match the music YOU hear.\ +* \cf8 Presets\cf0 (Keys : 0 to 9) : Presets selection (0 Blocks the current effect).\ +* \cf8 Framerate\cf0 (Key : F) : Display the frame rate.\ +* \cf8 Information display\cf0 (Key : T) : Toggle information display when iTunes is Idle.\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f0\b\fs28 \cf0 \ +\ +Performance tips +\f1\b0\fs24 \ +To accelerate iGoom, try these tips :\ +\'a5 Quit all other applications you don't need\ +\'a5 Enable the Quick Mode (Lower quality)\ +\'a5 Prefer the full screen mode to large windows in iTunes (full screen mode switches the resolution)\ +\'a5 Reduce the render size in iTunes (select medium size or low size in the visual menu).\ +\'a5 Buy a new Machine ;-)\ +\ +For full screen playback, I recommend at least a G4@800 (better with G4 or G5 and higher clock rates of course). Please note that iGoom can't use a lot of 3D acceleration and is not easily optimizable with Velocity Engine. \cf2 A fast CPU with lots of cache is the key.\cf0 \ +\ +\ + +\f0\b\fs28 Known bugs / Things to do\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f1\b0\fs24 \cf0 Try to make it even faster (But don't expect too much now...),\ +Add new effects,\ +Finish the scripting system,\ +Enhance the functionalities of the standalone application.\ +\ +\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f0\b\fs28 \cf0 Version history +\f1\b0\fs24 \ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f0\b \cf0 \ +2k4 ~ January 2005\ +\'a5 +\f1\b0 In sync with the final Goom 2k4\ +\'a5 The StandAlone version is available.\ +\'a5 The source tree is back to the sourceforge cvs and mac compatible. +\f0\b \ +\ +2k4 dev 14 ~ March 2004\ +\'a5 +\f1\b0 Added the scripting system into the core (not yet scriptable without recompilation). +\f0\b \ +\ +2k4 dev 8 ~ February 2004\ +\'a5 +\f1\b0 Added G5 optimizations. +\f0\b \ +\'a5 +\f1\b0 Caught a crashing bug in the PowerPC render.\ + +\f0\b \'a5 +\f1\b0 Added luminosity post-processing. +\f0\b \ +\'a5 +\f1\b0 Rewrote the transformation computation to make it independent from the resolution.\ + +\f0\b \'a5 +\f1\b0 A new fireworks effect. +\f0\b \ +\'a5 +\f1\b0 Lots of internal modifications to prepare future features. +\f0\b \ +\'a5 +\f1\b0 Many little optimizations. +\f0\b \ +\ +1.99.5 ~ January 7th 2003\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f1\b0 \cf0 \'a5 Information display can now be set on and off using the key T or the preference panel. Since many users seem to find it annoying, this feature is off by default.\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f0\b \cf0 \ +1.99.4 ~ January 6th 2003\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f1\b0 \cf0 \'a5 Not faster but does more than before.\ +\'a5 Smoother animations.\ +\'a5 Nice text display with cool font and effect.\ +\'a5 New "tentacle" line effect.\ +\'a5 New zooms.\ +\'a5 Resize crashing bug hopefully corrected.\ +\'a5 Tuned many effects.\ +\'a5 Preferences window modified.\ +\'a5 iGoom now uses its own preference file instead of parasiting the iTune's one. \ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f0\b \cf0 \ +1.9Dev5 ~ July 21st 2002\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f1\b0 \cf0 \'a5 Dynamic transitions between transforms.\ +\'a5 Dynamic lines effects transitions with new colors.\ +\'a5 1 new transform.\ +\'a5 Assembly routines rewritten but G4 optimisations disabled.\ +\'a5 Tuned many effects.\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f0\b \cf0 \ +1.7.8 ~ April 12th 2002\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f1\b0 \cf0 \'a5 Added a tuned version of the fabulous ifs effect.\ +(Copyright (c) 1997 by Massimino Pascal ).\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f0\b \cf0 \ +1.7.7 ~ April 5th 2002\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f1\b0 \cf0 \'a5 Little speed bump (+8%) on G3\ +(Improved the G3 assembly code, lend me a G4 and I'll do it for Altivec too!)\ +\'a5 Finally caught the crashing lines bug.\ +\'a5 Enabled the original lines effects again.\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f0\b \cf0 \ +1.7.6 ~ March 15th 2002\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f1\b0 \cf0 \'a5 In sync with goom 1.7.6,\ +\'a5 Now retains the quality mode.\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f0\b \cf0 \ +1.7.5a3 ~ Not released\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f1\b0 \cf0 \'a5 Big speed bump on Smooth Mode (full quality) of about 30%.\ +\'a5 Little speed bump on Quick Mode (doubled pixels) of about 5%.\ +\'a5 Minor speed bump for G3 users.\ +\'a5 Added graphic visualization of setup (not available on fullscreen smooth mode).\ +\'a5 Added sensitivity setup.\ +\'a5 Tuned the moving pixels filter.\ +\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f0\b \cf0 1.7.4 ~ November 8th 2001\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f1\b0 \cf0 \'a5 Pixel doubling mode is now the default.\ +\'a5 Better default parameters.\ +\'a5 Accelerated the full quality mode by about 8%\ +\'a5 Added that nice (?) purple circle in the centre.\ +\'a5 Code clean-up (1.7.0 - 180kb -> 1.7.4 - 72kb)\ +\'a5 Version number corrected again (should be good this time)\ +\'a5 The random resizing crashes seem to be corrected by the code clean up.\ +\ +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f0\b \cf0 1.7.3 ~ July 26th 2001 +\f1\b0 \ +\'a5 The 1.7.2 archive was broken for G3, corrected the archive\ +\ + +\f0\b 1.7.2 ~ July 26th 2001 +\f1\b0 \ +\'a5 Now detects if Altivec (Velocity Engine) is present or not and enables a new G4 assembly zoom routine whenever possible. This makes it about 30% faster than before on G4 CPUs.\ +\'a5 Corrected a bug that would make the render go weird with odd horizontal resolutions and pixel doubling enabled.\ +\'a5 G3 Assembly acceleration rewritten for easier Altivec integration (No speed loss).\ +\'a5 Core goom code cleaned up to make possible Altivec accelerations (better data alignment and misc details). This make the G3 version a bit faster too and should accelerate future releases for other platforms.\ +\'a5 Corrected the bundle version number\ +\ + +\f0\b 1.7.1 ~ July 19th 2001 +\f1\b0 \ +\'a5 Added a PowerPC assembly routine instead of pure C to execute the critical part of the zoom (just like on MMX processors). We gain about 50% more Frame Per Second !\ +\ + +\f0\b 1.7.0 ~ July 17th 2001 +\f1\b0 \ +\'a5 In sync with Goom 1.7 (with some new effects available).\ +\'a5 Code clean up.\ +\'a5 Rendering functions (both normal and pixel doubling) rewritten for speed concerns.\ +\ + +\f0\b 1.6.1 ~ July 14th 2001 +\f1\b0 \ +\'a5 Pixel doubling bug corrected.\ +\ + +\f0\b 1.6.0 ~ July 11th 2001 +\f1\b0 \ +\'a5 Initial release, in sync with Goom 1.6 for XMMS.} \ No newline at end of file diff -Nru kodi-visualization-goom-1.1.0/lib/goom/Makefile.am kodi-visualization-goom-2.1.0/lib/goom/Makefile.am --- kodi-visualization-goom-1.1.0/lib/goom/Makefile.am 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/Makefile.am 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,8 @@ +ACLOCAL_AMFLAGS = -I m4 +SUBDIRS = src xmms-goom sdl-goom @MACFOLDER@ + +#.pc file +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = libgoom2.pc + +DISTCLEANFILES = libgoom2.pc diff -Nru kodi-visualization-goom-1.1.0/lib/goom/NEWS kodi-visualization-goom-2.1.0/lib/goom/NEWS --- kodi-visualization-goom-1.1.0/lib/goom/NEWS 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/NEWS 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1 @@ +see ChangeLog diff -Nru kodi-visualization-goom-1.1.0/lib/goom/README kodi-visualization-goom-2.1.0/lib/goom/README --- kodi-visualization-goom-1.1.0/lib/goom/README 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/README 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,25 @@ +************************** +* What a GOOM! version 2 * +************************** +copyright 2000-2004, by Jean-Christophe Hoelt + +This is my first visual plugins for XMMS, and I think that it's the best +I have ever done ! + + /-----------------\\ +--< where to get Goom >-- + \\-----------------/ + +You can find the last version on the website of +iOS software: +http://www.ios-software.com/ + + /------\\ +--< thanks >-- + \\------/ + +Skal for the code of IFS +Burkhard for the initial fullscreen patch +Gyom for the iTunes version +Fred for the Windows version and a lot of other Goom Stuff + diff -Nru kodi-visualization-goom-1.1.0/lib/goom/sdl-goom/frame_rate_tester.c kodi-visualization-goom-2.1.0/lib/goom/sdl-goom/frame_rate_tester.c --- kodi-visualization-goom-1.1.0/lib/goom/sdl-goom/frame_rate_tester.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/sdl-goom/frame_rate_tester.c 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,83 @@ +/* + * file : frame_rate_tester.c + * author : JC Hoelt + * + * birth : 2001-03-07 22:56 + * version : 2001-03-07 22:56 + * + * content : the function to calculate the frame rate + */ + +#include "goom_config.h" +#include "frame_rate_tester.h" +#include "gmtimer.h" +#include + +pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER; + +/************** data ******************/ + +#define NUMBER_OF_FRAMES_IN_BUFFER 20 + +static float endlessTable[NUMBER_OF_FRAMES_IN_BUFFER]; +static guint32 currentPosInET; + +static GMTimer *timer = 0; + +/************** functions **************/ + +/* initialize the tester. do nothing if it has ever been initialized */ +void +framerate_tester_init () +{ + float curTime; + guint32 i; + + pthread_mutex_lock (&mut); + + if (!timer) { + timer = gmtimer_new (); + } + curTime = gmtimer_getvalue (timer); + for (i = 0; i < NUMBER_OF_FRAMES_IN_BUFFER; i++) + endlessTable[i] = curTime; + currentPosInET = 0; + + pthread_mutex_unlock (&mut); +} + +/* close the tester. do nothing if it hasn't been initialized */ +void +framerate_tester_close () +{ + pthread_mutex_lock (&mut); + gmtimer_delete (&timer); + timer = 0; + pthread_mutex_unlock (&mut); +} + +/* return the frame displayed by seconds */ +float +framerate_tester_getvalue () +{ + guint32 oldPos; + int ret; + + pthread_mutex_lock (&mut); + oldPos = (currentPosInET + 1) % NUMBER_OF_FRAMES_IN_BUFFER; + + ret = (float) NUMBER_OF_FRAMES_IN_BUFFER + / (endlessTable[currentPosInET] - endlessTable[oldPos]); + pthread_mutex_unlock (&mut); + return ret; +} + +/* inform the tester that a new frame has been displayed */ +void +framerate_tester_newframe () +{ + pthread_mutex_lock (&mut); + currentPosInET = (currentPosInET + 1) % NUMBER_OF_FRAMES_IN_BUFFER; + endlessTable[currentPosInET] = gmtimer_getvalue (timer); + pthread_mutex_unlock (&mut); +} diff -Nru kodi-visualization-goom-1.1.0/lib/goom/sdl-goom/frame_rate_tester.h kodi-visualization-goom-2.1.0/lib/goom/sdl-goom/frame_rate_tester.h --- kodi-visualization-goom-1.1.0/lib/goom/sdl-goom/frame_rate_tester.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/sdl-goom/frame_rate_tester.h 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,30 @@ +/* + * file : frame_rate_tester.h + * author : JC Hoelt + * + * birth : 2001-03-07 22:56 + * version : 2001-03-07 22:56 + * + * content : the function to calculate the frame rate + */ + +#ifndef _FRAME_RATE_TESTER_H +#define _FRAME_RATE_TESTER_H + +#include "goom_config.h" + +/************** functions **************/ + +/* initialize the tester. do nothing if it has ever been initialized */ +void framerate_tester_init (); + +/* close the tester. do nothing if it hasn't been initialized */ +void framerate_tester_close (); + +/* return the frame displayed per seconds */ +float framerate_tester_getvalue (); + +/* inform the tester that a new frame has been displayed */ +void framerate_tester_newframe (); + +#endif diff -Nru kodi-visualization-goom-1.1.0/lib/goom/sdl-goom/gmtimer.c kodi-visualization-goom-2.1.0/lib/goom/sdl-goom/gmtimer.c --- kodi-visualization-goom-1.1.0/lib/goom/sdl-goom/gmtimer.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/sdl-goom/gmtimer.c 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,42 @@ +/* + * file : linux/glibfunc.c + * author : JC Hoelt + * + * birth : 2001-03-03 13:42 + * version : 2001-03-03 14:10 + * + * content : the function to manipulate the time, etc. + */ + +#include +#include "gmtimer.h" + +/************** functions **************/ + +/* initialize the timer. do nothing if the timer has ever been initialized */ +GMTimer * +gmtimer_new () +{ + GTimer *goom_timer = g_timer_new (); + + g_timer_start (goom_timer); + return (void *) goom_timer; +} + +/* close the timer. do nothing if the timer hasn't been initialized */ +void +gmtimer_delete (GMTimer ** t) +{ + GTimer *goom_timer = *(GTimer **) t; + + g_timer_stop (goom_timer); + g_free (goom_timer); + *t = 0; +} + +/* return the number of seconds since the initialization of the timer */ +float +gmtimer_getvalue (GMTimer * t) +{ + return g_timer_elapsed ((GTimer *) t, NULL); +} diff -Nru kodi-visualization-goom-1.1.0/lib/goom/sdl-goom/gmtimer.h kodi-visualization-goom-2.1.0/lib/goom/sdl-goom/gmtimer.h --- kodi-visualization-goom-1.1.0/lib/goom/sdl-goom/gmtimer.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/sdl-goom/gmtimer.h 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,31 @@ +/* + * file : timer.h + * author : JC Hoelt + * + * birth : 2001-03-03 13:42 + * version : 2001-03-03 13:42 + * + * content : the function to manipulate the time. + * + * this functions are implemented on an os-dependant directory. + */ + +#ifndef _GMTIMER_H +#define _GMTIMER_H + +#include "goom_config.h" + +typedef void GMTimer; + +/************** functions **************/ + +/* initialize the timer. do nothing if the timer has ever been initialized */ +GMTimer *gmtimer_new (); + +/* close the timer. do nothing if the timer hasn't been initialized */ +void gmtimer_delete (GMTimer ** t); + +/* return the number of seconds since the initialization of the timer */ +float gmtimer_getvalue (GMTimer *); + +#endif /* _GMTIMER_H */ diff -Nru kodi-visualization-goom-1.1.0/lib/goom/sdl-goom/gtk-callbacks.c kodi-visualization-goom-2.1.0/lib/goom/sdl-goom/gtk-callbacks.c --- kodi-visualization-goom-1.1.0/lib/goom/sdl-goom/gtk-callbacks.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/sdl-goom/gtk-callbacks.c 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,416 @@ +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +#include "gtk-callbacks.h" +#include "gtk-interface.h" +#include "gtk-support.h" + +#define WINSIZE_COMBO "combo_winsize" + +#include "sdl_goom.h" +#include "goom_config_param.h" + +#include +#include +#include + +static SdlGoom *sdlGoom; +static GtkObject *owin; + +static GdkColor color_blue; +static GdkColor color_red; + +void highlight_buffer(GtkText *editable) +{ + static int last_len = 0; + int i, len; + int next_add = 0; + + return; + + gint save_pos = gtk_editable_get_position(GTK_EDITABLE(editable)); /* save current pos */ + gchar *txt = gtk_editable_get_chars (GTK_EDITABLE(editable),0,-1); + len = strlen(txt); + if (len == 0) return; + + if (len == last_len) return; + last_len = len; + + gtk_text_freeze(editable); + + gtk_text_set_point(editable,0); + gtk_text_forward_delete(editable,len); + + for (i=0;inext_add) { + gtk_text_insert (editable, 0, 0, 0, txt+next_add, i-next_add); + next_add = i; + } + } + if ((txt[i]=='*')&&(txt[i+1]=='/')) { + if (i>next_add) { + gtk_text_insert (editable, 0, &color_blue, 0, txt+next_add, i-next_add+2); + next_add = i + 2; + } + } + } + if (next_add < len) { + gtk_text_insert (editable, 0, 0, 0, txt+next_add, len-next_add); + } + + /* gtk_editable_set_position(GTK_EDITABLE(editable),save_pos+40); + gtk_editable_set_position(GTK_EDITABLE(editable),save_pos-40); */ + + gtk_editable_set_position(GTK_EDITABLE(editable),save_pos); /* restore current pos */ + gtk_text_thaw(editable); + g_free(txt); +} + +void +on_spinbutton_int_changed (GtkEditable *editable, + gpointer user_data) +{ + PluginParam *param = (PluginParam*)gtk_object_get_data (GTK_OBJECT(editable),"param"); + IVAL(*param) = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON(editable)); + param->changed(param); +} + +void +on_adj_float_changed (GtkWidget *w, + gpointer user_data) +{ + PluginParam *param = (PluginParam*)gtk_object_get_data (GTK_OBJECT(w),"param"); + FVAL(*param) = GTK_ADJUSTMENT(w)->value; + param->changed(param); +} + +void +on_text_changed (GtkEditable *editable, + gpointer user_data) +{ + PluginParam *param = (PluginParam*)gtk_object_get_data (GTK_OBJECT(editable),"param"); + gchar *txt = gtk_editable_get_chars (editable,0,-1); + set_str_param_value(param, txt); + param->changed(param); + g_free(txt); + highlight_buffer(GTK_TEXT(editable)); +} + +void +on_list_changed (GtkEditable *editable, + gpointer user_data) +{ + PluginParam *param = (PluginParam*)gtk_object_get_data (GTK_OBJECT(editable),"param"); + gchar *txt = gtk_editable_get_chars (editable,0,-1); + set_list_param_value(param, txt); + param->changed(param); + g_free(txt); +} + +void +on_bool_toggled (GtkToggleButton *togglebutton, + gpointer user_data) +{ + PluginParam *param = (PluginParam*)gtk_object_get_data (GTK_OBJECT(togglebutton),"param"); + BVAL(*param) = gtk_toggle_button_get_active(togglebutton); + param->changed(param); +} + +void my_int_listener (PluginParam *param) { + GtkEditable *editable; + + if (sdlGoom->config_win == 0) return; + editable = GTK_EDITABLE(param->user_data); + + if (editable) { + int pos = 0; + char str[256]; + sprintf (str, "%d", IVAL(*param)); + if (strcmp(str,gtk_editable_get_chars(editable,0,-1))) { + gtk_editable_delete_text (editable,0,-1); + gtk_editable_insert_text (editable,str,strlen(str),&pos); + } + } +} + +void my_list_listener (PluginParam *param) { + GtkEntry *editable; + + if (sdlGoom->config_win == 0) return; + editable = GTK_ENTRY(param->user_data); + + if (editable) { + if (strcmp(gtk_entry_get_text(editable),LVAL(*param))) { + gtk_entry_set_text (editable, LVAL(*param)); + } + } +} + +void my_bool_listener (PluginParam *param) { + GtkCheckButton *editable; + + if (sdlGoom->config_win == 0) return; + editable = GTK_CHECK_BUTTON(param->user_data); + + if (editable) { + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(editable)) != BVAL(*param)) + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(editable),BVAL(*param)); + } +} + +void my_float_listener_progress (PluginParam *param) { + GtkProgressBar *progress; + + if (sdlGoom->config_win == 0) return; + progress = GTK_PROGRESS_BAR(param->user_data); + + if (progress) { + if (FVAL(*param)FMAX(*param)) + FVAL(*param) = FMAX(*param); + gtk_progress_bar_update (progress, FVAL(*param)); + } +} + +void my_float_listener_scale (PluginParam *param) { + GtkRange *range; + + if (sdlGoom->config_win == 0) return; + range = GTK_RANGE(param->user_data); + + if (range) { + GtkAdjustment *adj; + if (FVAL(*param) < FMIN(*param)) + FVAL(*param) = FMIN(*param); + if (FVAL(*param) > FMAX(*param)) + FVAL(*param) = FMAX(*param); + + adj = gtk_range_get_adjustment(range); + adj->value = FVAL(*param); + gtk_adjustment_value_changed(adj); +// gtk_range_set_adjustment(range, adj); + } +} + +void addParams (GtkNotebook *notebook, PluginParameters *params) { + int n; + GtkWidget *table = gtk_table_new (params->nbParams, 2, FALSE); + gtk_container_set_border_width (GTK_CONTAINER (table), 11); + gtk_table_set_row_spacings (GTK_TABLE (table), 6); + gtk_table_set_col_spacings (GTK_TABLE (table), 6); + + for (n=0;nnbParams;++n) { + if (params->params[n] == 0) { + GtkWidget *hseparator = gtk_hseparator_new (); + gtk_widget_show (hseparator); + gtk_table_attach (GTK_TABLE (table), hseparator, 0, 2, n, n+1, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (GTK_FILL), 0, 5); + } else { + PluginParam *p = params->params[n]; + int type = p->type; + + if (type != PARAM_BOOLVAL) { + GtkWidget *label4 = gtk_label_new (p->name); + gtk_widget_show (label4); + gtk_table_attach (GTK_TABLE (table), label4, 0, 1, n, n+1, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + gtk_label_set_justify (GTK_LABEL (label4), GTK_JUSTIFY_RIGHT); + gtk_misc_set_alignment (GTK_MISC (label4), 0, 0.5); + } + + switch (type) { + case PARAM_INTVAL: { + GtkWidget *spinbutton_adj,*spinbutton; + + spinbutton_adj = (GtkWidget*)gtk_adjustment_new ( + p->param.ival.value, + p->param.ival.min, p->param.ival.max, + p->param.ival.step, p->param.ival.step*10, + p->param.ival.step*10); + spinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (spinbutton_adj), 1, 0); + gtk_widget_show (spinbutton); + gtk_table_attach (GTK_TABLE (table), spinbutton, 1, 2, n, n+1, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), 0, 1); + gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbutton), TRUE); + gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (spinbutton), + GTK_UPDATE_IF_VALID); + p->user_data = spinbutton; + gtk_object_set_data (GTK_OBJECT(spinbutton),"param",(void*)p); + p->change_listener = my_int_listener; + gtk_signal_connect (GTK_OBJECT (spinbutton), "changed", + GTK_SIGNAL_FUNC (on_spinbutton_int_changed), + NULL); + break; + } + + case PARAM_FLOATVAL: { + GtkWidget *progress,*prog_adj; + + prog_adj = (GtkWidget*)gtk_adjustment_new ( + p->param.fval.value, + p->param.fval.min, p->param.fval.max, + p->param.fval.step, p->param.fval.step*10, + p->param.fval.step*10); + + if (p->rw) + progress = gtk_hscale_new(GTK_ADJUSTMENT(prog_adj)); + else + progress = gtk_progress_bar_new_with_adjustment(GTK_ADJUSTMENT(prog_adj)); + gtk_widget_show(progress); + gtk_table_attach (GTK_TABLE (table), progress, 1, 2, n, n+1, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), 0, 1); + + p->user_data = progress; + if (p->rw) { + p->change_listener = my_float_listener_scale; + gtk_object_set_data (GTK_OBJECT(prog_adj),"param",(void*)p); + gtk_signal_connect (GTK_OBJECT (prog_adj), "value-changed", + GTK_SIGNAL_FUNC (on_adj_float_changed), + NULL); + } + else + p->change_listener = my_float_listener_progress; + break; + } + + case PARAM_STRVAL: { + GtkWidget *vscrollbar = 0; + GtkWidget *text_winsize = gtk_text_new (0,0); + gtk_widget_show (text_winsize); + gtk_table_attach (GTK_TABLE (table), text_winsize, 1, 2, n, n+1, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); + gtk_text_insert (GTK_TEXT(text_winsize), 0, 0, 0, p->param.sval.value, strlen(p->param.sval.value)); + gtk_text_set_editable(GTK_TEXT(text_winsize), p->rw); + /* Add a vertical scrollbar to the GtkText widget */ + vscrollbar = gtk_vscrollbar_new (GTK_TEXT (text_winsize)->vadj); + gtk_table_attach (GTK_TABLE (table), vscrollbar, 2, 3, n, n+1, + GTK_FILL, GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0); + gtk_widget_show (vscrollbar); + +/* combo_entry_winsize = GTK_COMBO (combo_winsize)->entry; + gtk_widget_show (combo_entry_winsize); + gtk_entry_set_editable (GTK_ENTRY (combo_entry_winsize), FALSE); + gtk_entry_set_text (GTK_ENTRY (combo_entry_winsize), LVAL(*p)); + p->change_listener = my_list_listener;*/ + p->user_data = text_winsize; + gtk_object_set_data (GTK_OBJECT(text_winsize),"param",(void*)p); + gtk_signal_connect (GTK_OBJECT (text_winsize), "changed", + GTK_SIGNAL_FUNC (on_text_changed), + NULL); + break; + } + + case PARAM_LISTVAL: { + int i; + GList *combo_winsize_items = NULL; + GtkWidget *combo_entry_winsize = NULL; + GtkWidget *combo_winsize = gtk_combo_new (); + gtk_widget_show (combo_winsize); + gtk_table_attach (GTK_TABLE (table), combo_winsize, 1, 2, n, n+1, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + gtk_combo_set_value_in_list (GTK_COMBO (combo_winsize), TRUE, TRUE); + for (i=0;iparam.slist.nbChoices;++i) + combo_winsize_items = g_list_append (combo_winsize_items, + p->param.slist.choices[i]); + gtk_combo_set_popdown_strings (GTK_COMBO (combo_winsize), combo_winsize_items); + g_list_free (combo_winsize_items); + + combo_entry_winsize = GTK_COMBO (combo_winsize)->entry; + gtk_widget_show (combo_entry_winsize); + gtk_entry_set_editable (GTK_ENTRY (combo_entry_winsize), FALSE); + gtk_entry_set_text (GTK_ENTRY (combo_entry_winsize), LVAL(*p)); + p->change_listener = my_list_listener; + p->user_data = combo_entry_winsize; + gtk_object_set_data (GTK_OBJECT(combo_entry_winsize),"param",(void*)p); + gtk_signal_connect (GTK_OBJECT (combo_entry_winsize), "changed", + GTK_SIGNAL_FUNC (on_list_changed), + NULL); + break; + } + + case PARAM_BOOLVAL: { + GtkWidget *checkbutton_double = + gtk_check_button_new_with_label (p->name); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton_double),BVAL(*p)); + gtk_widget_show (checkbutton_double); + gtk_table_attach (GTK_TABLE (table), checkbutton_double, 1, 2, n, n+1, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + gtk_signal_connect (GTK_OBJECT (checkbutton_double), "toggled", + GTK_SIGNAL_FUNC (on_bool_toggled), + NULL); + gtk_object_set_data (GTK_OBJECT(checkbutton_double),"param",(void*)p); + p->user_data = checkbutton_double; + p->change_listener = my_bool_listener; + break; + } + } + } + } + + gtk_widget_show_all(GTK_WIDGET(table)); + gtk_container_add(GTK_CONTAINER(notebook),table); + gtk_notebook_set_tab_label_text(notebook,GTK_WIDGET(table),params->name); +} + +void gtk_data_init(SdlGoom *sg) { + + sdlGoom = sg; + if (sdlGoom->config_win) { + int i; + GtkNotebook *notebook; + GdkColormap *cmap; + + cmap = gdk_colormap_get_system(); + color_blue.red = 0; + color_blue.blue = 0xffff; + color_blue.green = 0; + color_red.red = 0xffff; + color_red.blue = 0; + color_red.green = 0; + if ((!gdk_color_alloc(cmap, &color_blue))||(!gdk_color_alloc(cmap, &color_red))) { + g_error("couldn't allocate color"); + } + + owin = GTK_OBJECT(sdlGoom->config_win); + notebook = GTK_NOTEBOOK(gtk_object_get_data (owin, "notebook1")); + addParams (notebook, &sdlGoom->screen); + for (i = 0; i < sdlGoom->plugin->nbParams; ++i) { + addParams (notebook, &sdlGoom->plugin->params[i]); + } + } + +} + +gboolean +on_config_window_destroy_event (GtkWidget *widget, + GdkEvent *event, + gpointer user_data) +{ + sdlGoom->config_win = 0; + owin = 0; + return FALSE; +} + + +gboolean +on_config_window_delete_event (GtkWidget *widget, + GdkEvent *event, + gpointer user_data) +{ + sdlGoom->config_win = 0; + owin = 0; + return FALSE; +} + diff -Nru kodi-visualization-goom-1.1.0/lib/goom/sdl-goom/gtk-callbacks.h kodi-visualization-goom-2.1.0/lib/goom/sdl-goom/gtk-callbacks.h --- kodi-visualization-goom-1.1.0/lib/goom/sdl-goom/gtk-callbacks.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/sdl-goom/gtk-callbacks.h 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,24 @@ +#include + + +void +on_checkbutton_double_toggled (GtkToggleButton *togglebutton, + gpointer user_data); + +void +on_spinbutton_fps_changed (GtkEditable *editable, + gpointer user_data); + +void +on_combo_entry_winsize_changed (GtkEditable *editable, + gpointer user_data); + +gboolean +on_config_window_destroy_event (GtkWidget *widget, + GdkEvent *event, + gpointer user_data); + +gboolean +on_config_window_delete_event (GtkWidget *widget, + GdkEvent *event, + gpointer user_data); diff -Nru kodi-visualization-goom-1.1.0/lib/goom/sdl-goom/gtk-interface.c kodi-visualization-goom-2.1.0/lib/goom/sdl-goom/gtk-interface.c --- kodi-visualization-goom-1.1.0/lib/goom/sdl-goom/gtk-interface.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/sdl-goom/gtk-interface.c 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,138 @@ +/* + * DO NOT EDIT THIS FILE - it is generated by Glade. + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include + +#include +#include + +#include "gtk-callbacks.h" +#include "gtk-interface.h" +#include "gtk-support.h" + +GtkWidget* +create_config_window (void) +{ + GtkWidget *config_window; + GtkWidget *vbox1; + GtkWidget *toolbar1; + GtkWidget *b_open_config; + GtkWidget *b_save_config; + GtkWidget *notebook1; + GtkWidget *scrolledwindow1; + GtkWidget *text1; + GtkWidget *goom_control; + GtkWidget *statusbar1; + + config_window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_widget_set_name (config_window, "config_window"); + gtk_object_set_data (GTK_OBJECT (config_window), "config_window", config_window); + gtk_window_set_title (GTK_WINDOW (config_window), _("Goom Control Center")); + + vbox1 = gtk_vbox_new (FALSE, 0); + gtk_widget_set_name (vbox1, "vbox1"); + gtk_widget_ref (vbox1); + gtk_object_set_data_full (GTK_OBJECT (config_window), "vbox1", vbox1, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (vbox1); + gtk_container_add (GTK_CONTAINER (config_window), vbox1); + + toolbar1 = gtk_toolbar_new (GTK_ORIENTATION_HORIZONTAL, GTK_TOOLBAR_TEXT); + gtk_widget_set_name (toolbar1, "toolbar1"); + gtk_widget_ref (toolbar1); + gtk_object_set_data_full (GTK_OBJECT (config_window), "toolbar1", toolbar1, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (toolbar1); + gtk_box_pack_start (GTK_BOX (vbox1), toolbar1, FALSE, FALSE, 0); + gtk_container_set_border_width (GTK_CONTAINER (toolbar1), 3); + gtk_toolbar_set_space_size (GTK_TOOLBAR (toolbar1), 8); + gtk_toolbar_set_space_style (GTK_TOOLBAR (toolbar1), GTK_TOOLBAR_SPACE_LINE); + + b_open_config = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar1), + GTK_TOOLBAR_CHILD_BUTTON, + NULL, + _("Open..."), + NULL, NULL, + NULL, NULL, NULL); + gtk_widget_set_name (b_open_config, "b_open_config"); + gtk_widget_ref (b_open_config); + gtk_object_set_data_full (GTK_OBJECT (config_window), "b_open_config", b_open_config, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (b_open_config); + + b_save_config = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar1), + GTK_TOOLBAR_CHILD_BUTTON, + NULL, + _("Save..."), + NULL, NULL, + NULL, NULL, NULL); + gtk_widget_set_name (b_save_config, "b_save_config"); + gtk_widget_ref (b_save_config); + gtk_object_set_data_full (GTK_OBJECT (config_window), "b_save_config", b_save_config, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (b_save_config); + + notebook1 = gtk_notebook_new (); + gtk_widget_set_name (notebook1, "notebook1"); + gtk_widget_ref (notebook1); + gtk_object_set_data_full (GTK_OBJECT (config_window), "notebook1", notebook1, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (notebook1); + gtk_box_pack_start (GTK_BOX (vbox1), notebook1, TRUE, TRUE, 0); + gtk_notebook_set_tab_pos (GTK_NOTEBOOK (notebook1), GTK_POS_LEFT); + + scrolledwindow1 = gtk_scrolled_window_new (NULL, NULL); + gtk_widget_set_name (scrolledwindow1, "scrolledwindow1"); + gtk_widget_ref (scrolledwindow1); + gtk_object_set_data_full (GTK_OBJECT (config_window), "scrolledwindow1", scrolledwindow1, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (scrolledwindow1); + gtk_container_add (GTK_CONTAINER (notebook1), scrolledwindow1); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow1), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS); + + text1 = gtk_text_new (NULL, NULL); + gtk_widget_set_name (text1, "text1"); + gtk_widget_ref (text1); + gtk_object_set_data_full (GTK_OBJECT (config_window), "text1", text1, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (text1); + gtk_container_add (GTK_CONTAINER (scrolledwindow1), text1); + gtk_widget_set_usize (text1, 400, 300); + { char *str = _("What a GOOM!!\n\nCopyright (c)2000-2004, by Jean-Christophe Hoelt \n\nThis is my first visual plugins for XMMS, and I\nthink that it's the best I have ever done!\nYou can grab our last version and help us with a donation at\nhttp://www.ios-software.com/\nThanks and enjoy!\n\n\tJeko"); + gtk_text_insert (GTK_TEXT (text1), NULL, NULL, NULL, str, strlen(str)); + } + + goom_control = gtk_label_new (_("About goom...")); + gtk_widget_set_name (goom_control, "goom_control"); + gtk_widget_ref (goom_control); + gtk_object_set_data_full (GTK_OBJECT (config_window), "goom_control", goom_control, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (goom_control); + gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook1), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook1), 0), goom_control); + + statusbar1 = gtk_statusbar_new (); + gtk_widget_set_name (statusbar1, "statusbar1"); + gtk_widget_ref (statusbar1); + gtk_object_set_data_full (GTK_OBJECT (config_window), "statusbar1", statusbar1, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (statusbar1); + gtk_box_pack_start (GTK_BOX (vbox1), statusbar1, FALSE, FALSE, 0); + + gtk_signal_connect (GTK_OBJECT (config_window), "destroy_event", + GTK_SIGNAL_FUNC (on_config_window_destroy_event), + NULL); + gtk_signal_connect (GTK_OBJECT (config_window), "delete_event", + GTK_SIGNAL_FUNC (on_config_window_delete_event), + NULL); + + return config_window; +} + diff -Nru kodi-visualization-goom-1.1.0/lib/goom/sdl-goom/gtk-interface.h kodi-visualization-goom-2.1.0/lib/goom/sdl-goom/gtk-interface.h --- kodi-visualization-goom-1.1.0/lib/goom/sdl-goom/gtk-interface.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/sdl-goom/gtk-interface.h 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,5 @@ +/* + * DO NOT EDIT THIS FILE - it is generated by Glade. + */ + +GtkWidget* create_config_window (void); diff -Nru kodi-visualization-goom-1.1.0/lib/goom/sdl-goom/gtk-support.c kodi-visualization-goom-2.1.0/lib/goom/sdl-goom/gtk-support.c --- kodi-visualization-goom-1.1.0/lib/goom/sdl-goom/gtk-support.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/sdl-goom/gtk-support.c 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,162 @@ +/* + * DO NOT EDIT THIS FILE - it is generated by Glade. + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include + +#include + +#include "gtk-support.h" + +/* This is an internally used function to check if a pixmap file exists. */ +static gchar* check_file_exists (const gchar *directory, + const gchar *filename); + +/* This is an internally used function to create pixmaps. */ +static GtkWidget* create_dummy_pixmap (GtkWidget *widget); + +GtkWidget* +lookup_widget (GtkWidget *widget, + const gchar *widget_name) +{ + GtkWidget *parent, *found_widget; + + for (;;) + { + if (GTK_IS_MENU (widget)) + parent = gtk_menu_get_attach_widget (GTK_MENU (widget)); + else + parent = widget->parent; + if (parent == NULL) + break; + widget = parent; + } + + found_widget = (GtkWidget*) gtk_object_get_data (GTK_OBJECT (widget), + widget_name); + if (!found_widget) + g_warning ("Widget not found: %s", widget_name); + return found_widget; +} + +/* This is a dummy pixmap we use when a pixmap can't be found. */ +static char *dummy_pixmap_xpm[] = { +/* columns rows colors chars-per-pixel */ +"1 1 1 1", +" c None", +/* pixels */ +" " +}; + +/* This is an internally used function to create pixmaps. */ +static GtkWidget* +create_dummy_pixmap (GtkWidget *widget) +{ + GdkColormap *colormap; + GdkPixmap *gdkpixmap; + GdkBitmap *mask; + GtkWidget *pixmap; + + colormap = gtk_widget_get_colormap (widget); + gdkpixmap = gdk_pixmap_colormap_create_from_xpm_d (NULL, colormap, &mask, + NULL, dummy_pixmap_xpm); + if (gdkpixmap == NULL) + g_error ("Couldn't create replacement pixmap."); + pixmap = gtk_pixmap_new (gdkpixmap, mask); + gdk_pixmap_unref (gdkpixmap); + gdk_bitmap_unref (mask); + return pixmap; +} + +static GList *pixmaps_directories = NULL; + +/* Use this function to set the directory containing installed pixmaps. */ +void +add_pixmap_directory (const gchar *directory) +{ + pixmaps_directories = g_list_prepend (pixmaps_directories, + g_strdup (directory)); +} + +/* This is an internally used function to create pixmaps. */ +GtkWidget* +create_pixmap (GtkWidget *widget, + const gchar *filename) +{ + gchar *found_filename = NULL; + GdkColormap *colormap; + GdkPixmap *gdkpixmap; + GdkBitmap *mask; + GtkWidget *pixmap; + GList *elem; + + if (!filename || !filename[0]) + return create_dummy_pixmap (widget); + + /* We first try any pixmaps directories set by the application. */ + elem = pixmaps_directories; + while (elem) + { + found_filename = check_file_exists ((gchar*)elem->data, filename); + if (found_filename) + break; + elem = elem->next; + } + + /* If we haven't found the pixmap, try the source directory. */ + if (!found_filename) + { + found_filename = check_file_exists ("../pixmaps", filename); + } + + if (!found_filename) + { + g_warning (_("Couldn't find pixmap file: %s"), filename); + return create_dummy_pixmap (widget); + } + + colormap = gtk_widget_get_colormap (widget); + gdkpixmap = gdk_pixmap_colormap_create_from_xpm (NULL, colormap, &mask, + NULL, found_filename); + if (gdkpixmap == NULL) + { + g_warning (_("Error loading pixmap file: %s"), found_filename); + g_free (found_filename); + return create_dummy_pixmap (widget); + } + g_free (found_filename); + pixmap = gtk_pixmap_new (gdkpixmap, mask); + gdk_pixmap_unref (gdkpixmap); + gdk_bitmap_unref (mask); + return pixmap; +} + +/* This is an internally used function to check if a pixmap file exists. */ +gchar* +check_file_exists (const gchar *directory, + const gchar *filename) +{ + gchar *full_filename; + struct stat s; + gint status; + + full_filename = (gchar*) g_malloc (strlen (directory) + 1 + + strlen (filename) + 1); + strcpy (full_filename, directory); + strcat (full_filename, G_DIR_SEPARATOR_S); + strcat (full_filename, filename); + + status = stat (full_filename, &s); + if (status == 0 && S_ISREG (s.st_mode)) + return full_filename; + g_free (full_filename); + return NULL; +} + diff -Nru kodi-visualization-goom-1.1.0/lib/goom/sdl-goom/gtk-support.h kodi-visualization-goom-2.1.0/lib/goom/sdl-goom/gtk-support.h --- kodi-visualization-goom-1.1.0/lib/goom/sdl-goom/gtk-support.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/sdl-goom/gtk-support.h 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,61 @@ +/* + * DO NOT EDIT THIS FILE - it is generated by Glade. + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +/* + * Standard gettext macros. + */ +#ifdef ENABLE_NLS +# include +# undef _ +# define _(String) dgettext (PACKAGE, String) +# ifdef gettext_noop +# define N_(String) gettext_noop (String) +# else +# define N_(String) (String) +# endif +#else +# define textdomain(String) (String) +# define gettext(String) (String) +# define dgettext(Domain,Message) (Message) +# define dcgettext(Domain,Message,Type) (Message) +# define bindtextdomain(Domain,Directory) (Domain) +# define _(String) (String) +# define N_(String) (String) +#endif + + +/* + * Public Functions. + */ + +/* + * This function returns a widget in a component created by Glade. + * Call it with the toplevel widget in the component (i.e. a window/dialog), + * or alternatively any widget in the component, and the name of the widget + * you want returned. + */ +GtkWidget* lookup_widget (GtkWidget *widget, + const gchar *widget_name); + +/* get_widget() is deprecated. Use lookup_widget instead. */ +#define get_widget lookup_widget + +/* Use this function to set the directory containing installed pixmaps. */ +void add_pixmap_directory (const gchar *directory); + + +/* + * Private Functions. + */ + +/* This is used to create the pixmaps in the interface. */ +GtkWidget* create_pixmap (GtkWidget *widget, + const gchar *filename); + diff -Nru kodi-visualization-goom-1.1.0/lib/goom/sdl-goom/Makefile.am kodi-visualization-goom-2.1.0/lib/goom/sdl-goom/Makefile.am --- kodi-visualization-goom-1.1.0/lib/goom/sdl-goom/Makefile.am 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/sdl-goom/Makefile.am 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,11 @@ +# the goom2 stand alone program + +if HAVE_SDL +bin_PROGRAMS = goom2 + +goom2_LDADD = $(top_builddir)/src/libgoom2.la +goom2_LDFLAGS = $(SDL_LIBS) `gtk-config --libs` -lSDL +goom2_SOURCES = frame_rate_tester.c gmtimer.c gtk-callbacks.c gtk-interface.c gtk-support.c pixeldoubler.c readme.c sdl_goom.c sdl_pixeldoubler.c surface.c +INCLUDES=$(SDL_CFLAGS) `gtk-config --cflags` -I../src/ -I/usr/include/SDL -D_GNU_SOURCE=1 -D_REENTRANT +endif + diff -Nru kodi-visualization-goom-1.1.0/lib/goom/sdl-goom/pixeldoubler_athlon.s kodi-visualization-goom-2.1.0/lib/goom/sdl-goom/pixeldoubler_athlon.s --- kodi-visualization-goom-1.1.0/lib/goom/sdl-goom/pixeldoubler_athlon.s 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/sdl-goom/pixeldoubler_athlon.s 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,118 @@ +bits 32 +global pixel_doubler + +%macro twopixproc 0 +%rep 2 + movq mm0,[esi] ; -> P1P2 + movq mm2,[esi+8] ; -> P3P4 + + movq mm1,mm0 + movq mm3,mm2 + + punpckldq mm1,mm1 ; P1P2 | P1P2 -> P1P1 + punpckhdq mm0,mm0 ; P1P2 | P1P2 -> P2P2 + + movntq [edi],mm1 + punpckldq mm3,mm3 ; P3P4 | P3P4 -> P3P3 + + movntq [edi+8],mm0 + punpckhdq mm2,mm2 ; P3P4 | P3P4 -> P4P4 + + movntq [edi+16],mm3 + movq mm4,[esi+16] + + movntq [edi+24],mm2 + movq mm6,[esi+24] + + movq mm5,mm4 + movq mm7,mm6 + + punpckldq mm5,mm5 ; P1P2 | P1P2 -> P1P1 + punpckhdq mm4,mm4 ; P1P2 | P1P2 -> P2P2 + + movntq [edi+32],mm5 + punpckldq mm7,mm7 ; P3P4 | P3P4 -> P3P3 + + movntq [edi+40],mm4 + punpckhdq mm6,mm6 ; P3P4 | P3P4 -> P4P4 + + movntq [edi+48],mm7 + add esi,32 + + movntq [edi+56],mm6 + add edi,64 +%endrep +%endmacro + +%macro prefetcher 0 + prefetch [esi+128] +%endmacro + + +align 16 +pixel_doubler: + push ebp + mov ebp,esp + push edi + push esi + push ebx + push ecx + push edx + + mov ecx,[ebp+8] ; ecx <- src + mov edx,[ebp+12] ; edx <- dest + + mov esi,[ecx] ; esi <- src->buf + mov edi,[edx] ; edi <- dest->buf + + mov ebx,[ecx+4] ; ebx <- src->width + mov eax,[ecx+8] ; eax <- src->height + + shl ebx,2 ; width *= 4 (in byte) + mov edx,ebx ; edx <- width in byte + shr ebx,6 ; width in cache page + +align 16 +while_1: + prefetch [esi] ; prefetch the first cache line + prefetch [esi+64] + + mov ecx,ebx + +while_2: + prefetcher + twopixproc + + dec ecx + jnz while_2 +; end_while_2 + + sub esi,edx + mov ecx,ebx + + prefetch [esi] ; prefetch the first cache line + prefetch [esi+64] + +while_3: + prefetcher + twopixproc + + dec ecx + jnz while_3 +; end_while_3 + + dec eax ; decremente le nombre de ligne testee + jnz while_1 ; on continue si c'etait pas la derniere + +; end_while_1: + + sfence + femms + + pop edx + pop ecx + pop ebx + pop esi + pop edi + leave + ret diff -Nru kodi-visualization-goom-1.1.0/lib/goom/sdl-goom/pixeldoubler.c kodi-visualization-goom-2.1.0/lib/goom/sdl-goom/pixeldoubler.c --- kodi-visualization-goom-1.1.0/lib/goom/sdl-goom/pixeldoubler.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/sdl-goom/pixeldoubler.c 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,44 @@ +#include "pixeldoubler.h" +#include +#include + +void pixel_doubler (Surface *src, Surface *dest) { + register int *d; // pointeur sur le pixel courant a marquer + register int *s; // pointeur sur le pixel coutant en cours de lecture + int sw; // nombre d'octet de largeur de ligne de la surface source + int sw2; + int fd; // adresse de la fin du buffer destination + int fin; // adresse de fin d'une ligne du buffer source + + d = dest->buf; + s = src->buf; + + sw = src->width << 2; + sw2 = sw << 1; + + fin = (int)s; + fd = (int)d + (dest->size<<2); + + // tant que tout le buffer source n'est pas remplit + while ((int)d < fd) { + + // passer a la ligne suivante du buffer source + fin += sw; + + // l'afficher sur une ligne du buffer destination + while ((int)s < fin) { + register int col = *(s++); + // 2 affichage par point du buffer source (doubling horizontal) + *(d++) = col; *(d++) = col; + } + + // puis l'afficher sur une autre ligne (doubling vertical) + memcpy (d, ((char*)d) - sw2, sw2); +/* s = (int*)((int)s - sw); // retour au debut de la ligne src + while ((int)s < fin) { + register int col = *(s++); + *(d++) = col; *(d++) = col; // idem (cf plus haut) + } */ + d = (int*)((char*)d + sw2); + } +} diff -Nru kodi-visualization-goom-1.1.0/lib/goom/sdl-goom/pixeldoubler.h kodi-visualization-goom-2.1.0/lib/goom/sdl-goom/pixeldoubler.h --- kodi-visualization-goom-1.1.0/lib/goom/sdl-goom/pixeldoubler.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/sdl-goom/pixeldoubler.h 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,58 @@ +#ifndef _PIXELDOUBLER_H +#define _PIXELDOUBLER_H + +#include "surface.h" + +/* + * copie la surface src dans la surface dest en doublant la taille des pixels. + * + * la surface dest doit faire exactement 2 fois la taille de la surface src. + * (segfault sinon). + * + * auteur : JeKo + * + * bench : <2001-11-28|20h00> 9 cycles par pixel marqu (cpm) sur un PII 266. + * (surement limit par le debit de la memoire vive.. + * je fonce chez moi verifier) + * 11 cpm sur un Duron 800. (i.e. pas loin de 300fps) + * surement que les acces memoires sont assez penalisant. + * je tente d'aligner les donnes des surfaces pour voir. + * => pas mieux : le systeme doit deja faire ca comme il faut. + * mais pour l'alignement 64bits ca va etre utile : je passe a l'ASM + * <3h00> l'optimisation asm a permi de gagner vraiment pas grand + * chose (0.1 ms sur mon Duron).. le code en C semble suffisant. + * et je persiste a croire ke la vitesse est plafonn par la vitesse + * d'acces a la memoire.. ceci expliquerait aussi cela. + * + * <2001-12-08|1h20> Travail sur le code assembleur : + * pour reduire les temps d'acces memoire, utilisation de + * l'instruction 3Dnow! PREFETCH/W pour le prechargement des + * page de cache. pour pousser cette optimisation jusque au bout : + * j'ai droul la boucle pour qu'elle traite a chaque passage + * une page de cache complete en lecture et 2 en ecriture. + * (optimis sur un Duron=Athlon, page de cache = 64 octets) + * preformances sur mon Duron 800 : 9 CPM. + * (ce qui fait 18% de mieux que la version en C) + * ATTENTION : CETTE VERSION NE SUPPORTE DONC QUE DES TAILLES DE + * SURFACE AYANT UNE LARGEUR MULTIPLE DE 32 POUR DEST, + * DONC 16 POUR SRC. (ce qui n'est pas tres genant puisque ce sont + * des resolutions standard, mais il faut le savoir) + * explication : alignement des donnes sur la taille des pages de + * cache. + * + * <2001-12-08|14h20> Apres intense potassage de la doc de l'Athlon, + * decouverte certaines subtilits de ce FABULEUX processeur :) + * entrelacement de la copie de 2 pixel, plus utilisation de + * l'instruction de transfert rapide 3Dnow! MOVNTQ... attention les + * chiffres -> sur mon Duron 800 : 4 CPM !!!!! + * + * note : ne fonctionne que sur un systeme 32bits.. mais le faire fonctionner + * sur une machine autre ne posera aucun probleme. + * (le seul truc c'est ke j'ai considr mes pointeurs comme des entiers + * 32bits <- je sais je suis vaxiste, et alors???:) + * + * copyright (c)2001, JC Hoelt for iOS software. + */ +void pixel_doubler (Surface *src, Surface *dest) ; + +#endif diff -Nru kodi-visualization-goom-1.1.0/lib/goom/sdl-goom/readme.c kodi-visualization-goom-2.1.0/lib/goom/sdl-goom/readme.c --- kodi-visualization-goom-1.1.0/lib/goom/sdl-goom/readme.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/sdl-goom/readme.c 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,49 @@ +#ifndef _GOOM_README_H +#define _GOOM_README_H + +/* Automatically generated from README, via Makefile.am */ +static char goom_readme[] = +"TAB - Enter/Leave Fullscreen\n" +"Numpad +/- - Change resolution\n" +"F1-F8 - Set Background FX\n" +"\n" +"F - Display Frame Rate\n" +"Q - Quit\n"; + +static char goom_big_readme[] = +"****************************\n" +"* What a GOOM! version 2k4 *\n" +"****************************\n" +"by Jean-Christophe 'Jeko' Hoelt\n" +"\n" +"\n" +"The incredible trippy visualization plugin!!\n" +"\n" +"\n" +"\n" +"...... freely offered by iOS-Software\n" +"Wanna find the last version of goom or support\n" +"us with a donation? There you go:\n" +"\n" +"http://www.ios-software.com/\n" +"\n" +"\n" +"\n" +"...... many thanks to:\n" +"\n" +"Skal for the code of IFS\n" +"\n" +"Gyom for the iTunes version\n" +" and some of the main work\n" +"\n" +"Fred for the Windows version and a lot of\n" +" other Goom Stuff\n" +"\n" +"Dennis and guys of libvisual for their\n" +" help on the unix package\n" +"\n" +"\n" +"\n" +"Enjoy!"; + +#endif /* _GOOM_README_H */ diff -Nru kodi-visualization-goom-1.1.0/lib/goom/sdl-goom/sdl_goom.c kodi-visualization-goom-2.1.0/lib/goom/sdl-goom/sdl_goom.c --- kodi-visualization-goom-1.1.0/lib/goom/sdl-goom/sdl_goom.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/sdl-goom/sdl_goom.c 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,746 @@ +#include +#include +#include "goom_config.h" + +#include +#include + +#include +#include +#include +#include +#include +#include + +#include "goom_tools.h" +#include "goom.h" + +#include "frame_rate_tester.h" +#include "gmtimer.h" + +#include "pixeldoubler.h" +#include "sdl_pixeldoubler.h" + +#include "readme.c" + +#include "gtk-support.h" +#include "gtk-interface.h" + +#include "sdl_goom.h" + +static SdlGoom sdlGoom; + +//#define BENCHMARK_X86 +#ifdef BENCHMARK_X86 +#include +static uint64_t GetTick() +{ + uint64_t x; + /* __asm__ volatile (".byte 0x0f, 0x31" : "=A" (x));*/ + asm volatile ("RDTSC" : "=A" (x)); + return x; +} +#endif + +/** + * Callback des parametres + */ +static void screen_size_changed (PluginParam *); +static void fps_limit_changed (PluginParam *); +static void pix_double_changed (PluginParam *); +static void hide_cursor_changed (PluginParam *); + +/** + * Initialise les parametres de la version SDL + */ +static void init_parameters() { + + static char *resolutions[4] = {"320x240","400x300","640x480","800x600"}; + static struct ListVal reslist = { + value:0, + nbChoices:4, + choices:resolutions + }; + + sdlGoom.screen_size = secure_param (); + sdlGoom.screen_size.name = "Window's Size:"; + sdlGoom.screen_size.desc = ""; + sdlGoom.screen_size.type = PARAM_LISTVAL; + sdlGoom.screen_size.param.slist = reslist; + sdlGoom.screen_size.changed = screen_size_changed; + set_list_param_value(&sdlGoom.screen_size, "400x300"); + + sdlGoom.fps_limit = secure_param (); + sdlGoom.fps_limit.name = "Frame Rate:"; + sdlGoom.fps_limit.desc = ""; + sdlGoom.fps_limit.type = PARAM_INTVAL; + sdlGoom.fps_limit.param.ival.min = 1; + sdlGoom.fps_limit.param.ival.max = 35; + sdlGoom.fps_limit.param.ival.value = 30; + sdlGoom.fps_limit.param.ival.step = 1; + sdlGoom.fps_limit.changed = fps_limit_changed; + + sdlGoom.pix_double = secure_param (); + sdlGoom.pix_double.name = "Double Pixel"; + sdlGoom.pix_double.type = PARAM_BOOLVAL; + sdlGoom.pix_double.changed = pix_double_changed; + BVAL(sdlGoom.pix_double) = 0; + + sdlGoom.hide_cursor = secure_param (); + sdlGoom.hide_cursor.name = "Hide Cursor"; + sdlGoom.hide_cursor.type = PARAM_BOOLVAL; + sdlGoom.hide_cursor.changed = hide_cursor_changed; + BVAL(sdlGoom.hide_cursor) = 1; + + sdlGoom.display_fps = secure_param (); + sdlGoom.display_fps.name = "Display FPS"; + sdlGoom.display_fps.type = PARAM_BOOLVAL; + BVAL(sdlGoom.display_fps) = 0; + + sdlGoom.screen = plugin_parameters("Display", 7); + sdlGoom.screen.params[0]=&sdlGoom.screen_size; + sdlGoom.screen.params[1]=&sdlGoom.pix_double; + sdlGoom.screen.params[2]=0; + sdlGoom.screen.params[3]=&sdlGoom.fps_limit; + sdlGoom.screen.params[4]=&sdlGoom.display_fps; + sdlGoom.screen.params[5]=0; + sdlGoom.screen.params[6]=&sdlGoom.hide_cursor; + + sdlGoom.config_win = 0; + sdlGoom.screen_height = 300; + sdlGoom.screen_width = 400; + sdlGoom.doublepix = 0; + sdlGoom.active = 1; +} + +/* + * Methodes utilitaires + */ +char *sdl_goom_set_doublepix (int dp); +static void apply_double (); + + +static int resx = 400; +static int resy = 300; +static int doublepix = 0; +static int doubledec = 0; + +static int MAX_FRAMERATE = 32; +static double INTERPIX = 1000.0f / 32; + +static SDL_Surface *surface = NULL; +static int is_fs = 0; + +/* static void thread_func (); */ + +static void sdl_goom_init (int argc, char **argv); +static void sdl_goom_cleanup (); +static void sdl_goom_loop (); +static void sdl_goom_render_pcm (gint16 data[2][512], gchar *title); + +static Surface *gsurf2 = NULL; +static Surface gsurf; +static char *main_script = NULL; +static char *init_script = NULL; + +static int fini = 0; +static int disable = 0; +static gint16 snd_data[2][512]; + +#include + +void on_kill(int i) { + fini = 1; + disable = 1; +} + +int main (int argc, char **argv) { + + //gtk_set_locale (); + gtk_init (&argc, &argv); + + sdl_goom_init(argc, argv); + signal(SIGQUIT, on_kill); + sdl_goom_loop(); + sdl_goom_cleanup(); + return 0; +} + +static char *load_file(const char *fname) +{ + FILE *f = fopen(fname, "rt"); + long size; + char *sc; + + if (!f) { + fprintf(stderr, "Could not load file %s\n", fname); + return ""; + } + + fseek(f, 0L, SEEK_END); + size = ftell(f); + rewind(f); + sc = (char*)malloc(size+1); + fread(sc,1,size,f); + sc[size] = 0; + fclose(f); + printf("%s loaded\n", fname); + return sc; +} + +static void display_help() +{ + printf("usage: goom2 \n"); +} + +static void check_arg(int argc, char *argv) +{ + static int has_init = 0; + static int has_main = 0; + + if (argv[0] == '-') { + if ((!strcmp(argv,"-h"))||(!strcmp(argv,"--help"))) { + display_help(); + exit(0); + } + } + else if (!has_init) { + init_script = load_file(argv); + has_init = 1; + } + else if (!has_main) { + main_script = load_file(argv); + has_main = 1; + } +} + +void sdl_goom_init (int argc, char **argv) +{ + gint16 data[2][512]; + int i; + int init_flags = SDL_INIT_VIDEO; + + for (i=1; i INITIALIZING GOOM\n"); +#endif + + fini = FALSE; +#ifdef THIS_MAKES_ATI_CARDS_TO_CRASH__linux__ + /* This Hack Allows Hardware Surface on Linux */ + setenv("SDL_VIDEODRIVER","dga",0); + + if (SDL_Init(init_flags) < 0) { + printf(":-( Could not use DGA. Try using goom2 as root.\n"); + setenv("SDL_VIDEODRIVER","x11",1); + if (SDL_Init(init_flags) < 0) { + fprintf(stderr, "SDL initialisation error: %s\n", SDL_GetError()); + exit(1); + } + } + else { + printf(":-) DGA Available !\n"); + SDL_WM_GrabInput(SDL_GRAB_ON); + } +#else + if ( SDL_Init(init_flags) < 0 ) { + fprintf(stderr, "SDL initialisation error: %s\n", SDL_GetError()); + exit(1); + } +#endif + surface = SDL_SetVideoMode (resx, resy, 32, + SDL_RESIZABLE|SDL_SWSURFACE); + SDL_WM_SetCaption ("What A Goom!!", NULL); + SDL_ShowCursor (0); + SDL_EnableKeyRepeat (0, 0); + atexit(SDL_Quit); + + apply_double (); + sdlGoom.plugin = goom_init (resx, resy); + + /*if (init_script != NULL) { + gsl_ex(sdlGoom.plugin, init_script); + } + + if (main_script != NULL) { + goom_set_main_script(sdlGoom.plugin, main_script); + }*/ + + for (i = 0; i < 512; i++) { + data[0][i] = 0; + data[1][i] = 0; + } + + framerate_tester_init (); +} + +/* retourne x>>s , en testant le signe de x */ +#define ShiftRight(_x,_s) ((_x<0) ? -(-_x>>_s) : (_x>>_s)) + +static void +sdl_goom_loop() +{ + static double tnext = 0; + static gint16 prev0 = 0; + static int i, j; + gchar *ptitle = NULL; + static char title[2048]; + + if (tnext < 0.01) + tnext = INTERPIX + SDL_GetTicks(); + + while (!fini) { + double t; + sdl_goom_render_pcm (snd_data, ptitle); + ptitle = NULL; + + /* load the sound data */ + { + fd_set rfds; + struct timeval tv; + int retval; + + tv.tv_sec = 0; + tv.tv_usec = 10; + + FD_ZERO(&rfds); + FD_SET(0, &rfds); + retval = select(1, &rfds, NULL, NULL, &tv); + + if (retval) { + int type; + read (0, &type, sizeof(int)); + switch (type) { + case 0: + read (0, snd_data, 512*2*2); + break; + case 1: + read (0, title, 2048); + ptitle = &title[0]; + break; + case 2: + fini = 1; + disable = TRUE; + break; + } + } + } + + if (prev0 == snd_data[0][0]) { + for (i = 0; i < 2; i++) + for (j = 0; j < 512; j++) + snd_data[i][j] = ShiftRight((snd_data[i][j] * 31),5); + } + prev0 = snd_data[0][0]; + + t = SDL_GetTicks(); + if (t < tnext) { + float t2s = (tnext-t); + while (t2s>20) { + usleep(20*1000); + gtk_main_iteration_do(FALSE); + t = SDL_GetTicks(); + t2s = tnext-t; + } + tnext += INTERPIX; + } + else { + tnext = t+INTERPIX; + } + i = 0; + while (gtk_main_iteration_do(FALSE) == TRUE) { + if (i++ > 10) + break; + } + } + /* else { + * gtk_main_quit(); + * } + */ +} + +static void +sdl_goom_cleanup (void) +{ +#ifdef VERBOSE + printf ("--> CLEANUP GOOM\n"); +#endif + + if (is_fs) { + SDL_WM_ToggleFullScreen (surface); + } + SDL_Quit (); + + goom_close (sdlGoom.plugin); + framerate_tester_close (); +} + + +/*===============================*/ + +static void apply_double () { + + if (gsurf2) surface_delete (&gsurf2); + if (!doublepix) + return; + + if (surface->format->BytesPerPixel == 4) + doublepix = 2; + else + doublepix = 1; + + if (doublepix==2) { + resx /= 2; + resy /= 2; + doubledec = 0; + } + else if (doublepix == 1) { + doubledec = resx % 32; + resx = resx - doubledec; + resx /= 2; + resy /= 2; + doubledec /= 2; + gsurf2 = surface_new (resx*2,resy*2); + } + + gsurf.width = resx; + gsurf.height = resy; + gsurf.size = resx*resy; +} + + +static char * resize_win (int w, int h, int force) { + static char s[256]; + if ((w != sdlGoom.screen_width)||(h != sdlGoom.screen_height)||force) { + static SDL_Event e; + e.resize.type = SDL_VIDEORESIZE; + e.resize.w = w; + e.resize.h = h; + SDL_PushEvent (&e); + } + sprintf (s,"%dx%d",w,h); + return s; +} + +static void +sdl_goom_render_pcm (gint16 data[2][512], gchar *title) +{ +#ifdef BENCHMARK_X86 + uint64_t t0,t1,t2; +#endif + static char *msg_tab[] = { + "What a GOOM! version " VERSION + "\n\n\n\n\n\n\n\n" + "an iOS sotfware production.\n" + "\n\n\n" + "http://www.ios-software.com/", + goom_readme, + goom_big_readme, + "Copyright (c)2000-2004, by Jeko" + }; + static int msg_pos = 0; +#define ENCORE_NUL_LOCK (32*200) + static int encore_nul = 0; + + guint32 *buf; + SDL_Surface *tmpsurf = NULL; + + /* static int spos = -1; */ + + gchar *message = NULL; + + /* TODO : Utiliser une commande dans le pipe * + * int pos = xmms_remote_get_playlist_pos (jeko_vp.xmms_session); + */ + + int forceMode = 0; + +#define NBresoli 11 + static int resoli = 7; + static int resolx[] = {320,320,400,400,512,512,640,640,640,800,800}; + static int resoly[] = {180,240,200,300,280,384,320,400,480,400,600}; + + int i; + SDL_Event event; + + /* Check for events */ + while (SDL_PollEvent (&event)) { /* Loop until there are no events left on + * the queue */ + switch (event.type) { /* Process the appropiate event type */ + case SDL_QUIT: + { + fini = 1; + disable = TRUE; + } + break; + + case SDL_ACTIVEEVENT: + if (event.active.state & SDL_APPACTIVE) + sdlGoom.active = event.active.gain; + break; + + case SDL_KEYDOWN: /* Handle a KEYDOWN event */ + if (event.key.keysym.sym == SDLK_TAB) { + SDL_WM_ToggleFullScreen (surface); + is_fs = !is_fs; + } + + if (event.key.keysym.sym == SDLK_q) { + fini = 1; + } + /* + * TODO : GERER TOUT CA AVEC XMMS REMOTE CTRL ? ou le pipe * + if (event.key.keysym.sym == SDLK_q) { + xmms_remote_quit (jeko_vp.xmms_session); + } + + if (event.key.keysym.sym == SDLK_x) + xmms_remote_play (jeko_vp.xmms_session); + if (event.key.keysym.sym == SDLK_c) + xmms_remote_pause (jeko_vp.xmms_session); + if (event.key.keysym.sym == SDLK_v) + xmms_remote_stop (jeko_vp.xmms_session); + if (event.key.keysym.sym == SDLK_b) + xmms_remote_playlist_next (jeko_vp.xmms_session); + if (event.key.keysym.sym == SDLK_z) + xmms_remote_playlist_prev (jeko_vp.xmms_session); + */ + + if (event.key.keysym.sym == SDLK_f) { + BVAL(sdlGoom.display_fps) = !BVAL(sdlGoom.display_fps); + sdlGoom.display_fps.change_listener(&sdlGoom.display_fps); + } + + if ((event.key.keysym.sym == SDLK_KP_PLUS) && (resoli+10)) { + resoli = resoli-1; + resize_win (resolx[resoli],resoly[resoli],FALSE); + } + + if (event.key.keysym.sym == SDLK_KP_MULTIPLY) { + title = sdl_goom_set_doublepix (!doublepix); + } + if (event.key.keysym.sym == SDLK_ESCAPE) { + if (is_fs) { + SDL_WM_ToggleFullScreen (surface); + is_fs = !is_fs; + } + else if (sdlGoom.config_win == 0) { + sdlGoom.config_win = create_config_window (); + gtk_data_init (&sdlGoom); + gtk_widget_show (sdlGoom.config_win); + message = ""; + } + else { + message = "Configuration Window is Already Open"; + } + } + if (event.key.keysym.sym == SDLK_SPACE) { + encore_nul = ENCORE_NUL_LOCK; + } + + if (event.key.keysym.sym == SDLK_F1) + forceMode = 1; + if (event.key.keysym.sym == SDLK_F2) + forceMode = 2; + if (event.key.keysym.sym == SDLK_F3) + forceMode = 3; + if (event.key.keysym.sym == SDLK_F4) + forceMode = 4; + if (event.key.keysym.sym == SDLK_F5) + forceMode = 5; + if (event.key.keysym.sym == SDLK_F6) + forceMode = 6; + if (event.key.keysym.sym == SDLK_F7) + forceMode = 7; + if (event.key.keysym.sym == SDLK_F8) + forceMode = 8; + if (event.key.keysym.sym == SDLK_F9) + forceMode = 9; + if (event.key.keysym.sym == SDLK_F10) + forceMode = 10; + + break; + case SDL_VIDEORESIZE: + resx = sdlGoom.screen_width = event.resize.w; + resy = sdlGoom.screen_height = event.resize.h; + sdlGoom.doublepix = doublepix; + { + static char s[512]; + sprintf (s,"%dx%d",resx,resy); + title = s; + set_list_param_value(&sdlGoom.screen_size, s); + sdlGoom.screen_size.change_listener (&sdlGoom.screen_size); + } + surface = SDL_SetVideoMode (resx, resy, 32, + SDL_RESIZABLE|SDL_SWSURFACE); + apply_double(); + goom_set_resolution (sdlGoom.plugin,resx, resy); + if (is_fs) + SDL_WM_ToggleFullScreen (surface); + break; + /* default: * Report an unhandled event */ + /* printf("I don't know what this event is!\n"); */ + } + } + + for (i=0;i<512;i++) + if (data[0][i]>2) { + if (encore_nul > ENCORE_NUL_LOCK) + encore_nul = 0; + break; + } + + if ((i == 512) && (!encore_nul)) + encore_nul = ENCORE_NUL_LOCK + 100; + + if (encore_nul == ENCORE_NUL_LOCK) { + message = msg_tab[msg_pos]; + msg_pos ++; + msg_pos %= 4; + } + + if (encore_nul) + encore_nul --; + + if (!sdlGoom.active) { + return; + } + + /* + * TODO: + * if (pos != spos) { + * title = xmms_remote_get_playlist_title (jeko_vp.xmms_session, pos); + * spos = pos; + * } + */ + +#ifdef BENCHMARK_X86 + t0 = GetTick(); +#endif + if (doublepix == 0) + goom_set_screenbuffer(sdlGoom.plugin, surface->pixels); + + buf = goom_update (sdlGoom.plugin, data, forceMode, + BVAL(sdlGoom.display_fps)?framerate_tester_getvalue ():-1, + title, message); + +#ifdef BENCHMARK_X86 + t1 = GetTick(); +#endif + + if (doublepix == 2) { + gsurf.buf = buf; + sdl_pixel_doubler (&gsurf,surface); + } else if (doublepix == 1) { + SDL_Rect rect; + gsurf.buf = buf; + pixel_doubler (&gsurf,gsurf2); + tmpsurf = + SDL_CreateRGBSurfaceFrom (gsurf2->buf, resx*2, resy*2, + 32, resx*8, + 0x00ff0000, 0x0000ff00, 0x000000ff, + 0x00000000); + rect.x = doubledec; + rect.y = 0; + rect.w = resx * 2; + rect.h = resy * 2; + SDL_BlitSurface (tmpsurf, NULL, surface, &rect); + SDL_FreeSurface (tmpsurf); + } + else { +/* tmpsurf = + SDL_CreateRGBSurfaceFrom (buf, resx, resy, 32, resx * 4, + 0x00ff0000, 0x0000ff00, 0x000000ff, + 0x00000000); + SDL_BlitSurface (tmpsurf, NULL, surface, NULL); + SDL_FreeSurface (tmpsurf); + SDL_LockSurface(surface); + memcpy(surface->pixels, buf, resx * resy * 4); + SDL_UnlockSurface(surface); +*/ + } + SDL_Flip (surface); +#ifdef BENCHMARK_X86 + t2 = GetTick(); + + t2 -= t1; + t1 -= t0; + { + double ft1, ft2; + static double min_t1 = 1000.0, + min_t2 = 1000.0; + static double moy_t1 = 150.0; + static double moy_t2 = 40.0; + + ft1 = (double)(t1 / sdlGoom.plugin->screen.size); + ft2 = (double)(t2 / sdlGoom.plugin->screen.size); + + if (ft1 < min_t1) + min_t1 = ft1; + if (ft2 < min_t2) + min_t2 = ft2; + + moy_t1 = ((moy_t1 * 15.0) + ft1) / 16.0; + moy_t2 = ((moy_t2 * 15.0) + ft2) / 16.0; + printf("UPDATE = %4.0f/%3.0f CPP ", moy_t1, min_t1); + printf("DISPLAY = %4.0f/%3.0f CPP\n", moy_t2, min_t2); + } +#endif + + framerate_tester_newframe (); +} + + +char *sdl_goom_set_doublepix (int dp) { + if (doublepix && dp) return " "; + if (!doublepix && !dp) return " "; + + doublepix = dp; + BVAL(sdlGoom.pix_double) = dp; + sdlGoom.pix_double.change_listener(&sdlGoom.pix_double); + if (doublepix) + return resize_win (resx,resy,TRUE); + else + return resize_win (resx*2,resy*2,TRUE); +} + +void sdl_goom_set_fps (int fps) { + MAX_FRAMERATE = fps; + INTERPIX = 1000.0 / MAX_FRAMERATE; +} + +void pix_double_changed (PluginParam *p) { + sdl_goom_set_doublepix (BVAL(*p)); +} + +void screen_size_changed (PluginParam *p) { + int i; + static struct Resol { char*name; int x; int y; } res[4] = { + {"320x240", 320, 240}, + {"400x300", 400, 300}, + {"640x480", 640, 480}, + {"800x600", 800, 600}}; + + for (i=4;i--;) { + if (!strcmp(LVAL(*p),res[i].name)) + resize_win (res[i].x,res[i].y,FALSE); + } +} + +void fps_limit_changed (PluginParam *p) { + MAX_FRAMERATE = IVAL(*p); + INTERPIX = 1000.0 / MAX_FRAMERATE; +} + +void hide_cursor_changed (PluginParam *p) { + SDL_ShowCursor(!BVAL(*p)); +} diff -Nru kodi-visualization-goom-1.1.0/lib/goom/sdl-goom/sdl_goom.h kodi-visualization-goom-2.1.0/lib/goom/sdl-goom/sdl_goom.h --- kodi-visualization-goom-1.1.0/lib/goom/sdl-goom/sdl_goom.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/sdl-goom/sdl_goom.h 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,30 @@ +#ifndef _SDL_GOOM_H +#define _SDL_GOOM_H + +#include +#include "goom_config_param.h" +#include "goom_plugin_info.h" + +typedef struct _SDL_GOOM { + GtkWidget *config_win; + + int screen_width; + int screen_height; + int doublepix; + int active; + + PluginInfo *plugin; /* infos about the plugin (see plugin_info.h) */ + + PluginParameters screen; /* contains screen_size, pix_double, fps_limit */ + + PluginParam screen_size; + PluginParam pix_double; + PluginParam fps_limit; + PluginParam display_fps; + PluginParam hide_cursor; + +} SdlGoom; + +void gtk_data_init(SdlGoom *sdlGoom); + +#endif diff -Nru kodi-visualization-goom-1.1.0/lib/goom/sdl-goom/sdl_pixeldoubler.c kodi-visualization-goom-2.1.0/lib/goom/sdl-goom/sdl_pixeldoubler.c --- kodi-visualization-goom-1.1.0/lib/goom/sdl-goom/sdl_pixeldoubler.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/sdl-goom/sdl_pixeldoubler.c 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,51 @@ +#include "pixeldoubler.h" +#include +#include +#include + +void sdl_pixel_doubler (Surface *src, SDL_Surface *dest) { + register int *d; // pointeur sur le pixel courant a marquer + register int *s; // pointeur sur le pixel coutant en cours de lecture + int sw; // nombre d'octet de largeur de ligne de la surface source + int sw2,swd; + int fd; // adresse de la fin du buffer destination + int fin; // adresse de fin d'une ligne du buffer source + + SDL_LockSurface (dest); + + d = dest->pixels; + s = src->buf; + + sw = src->width << 2; + sw2 = dest->pitch; + swd = sw2 - sw * 2; + + fin = (int)s; + fd = (int)d + (sw2 * src->height * 2); + + // tant que tout le buffer source n'est pas remplit + while ((int)d < fd) { + + // passer a la ligne suivante du buffer source + fin += sw; + + // l'afficher sur une ligne du buffer destination + while ((int)s < fin) { + register int col = *(s++); + // 2 affichage par point du buffer source (doubling horizontal) + *(d++) = col; *(d++) = col; + } + d = (int*)((char*)d + swd); + + // puis l'afficher sur une autre ligne (doubling vertical) + memcpy (d, ((char*)d) - sw2, sw2); +/* s = (int*)((int)s - sw); // retour au debut de la ligne src + while ((int)s < fin) { + register int col = *(s++); + *(d++) = col; *(d++) = col; // idem (cf plus haut) + } */ + d = (int*)((char*)d + sw2); + } + + SDL_UnlockSurface (dest); +} diff -Nru kodi-visualization-goom-1.1.0/lib/goom/sdl-goom/sdl_pixeldoubler.h kodi-visualization-goom-2.1.0/lib/goom/sdl-goom/sdl_pixeldoubler.h --- kodi-visualization-goom-1.1.0/lib/goom/sdl-goom/sdl_pixeldoubler.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/sdl-goom/sdl_pixeldoubler.h 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,2 @@ +#include +void sdl_pixel_doubler (Surface *src, SDL_Surface *dest); diff -Nru kodi-visualization-goom-1.1.0/lib/goom/sdl-goom/surface.c kodi-visualization-goom-2.1.0/lib/goom/sdl-goom/surface.c --- kodi-visualization-goom-1.1.0/lib/goom/sdl-goom/surface.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/sdl-goom/surface.c 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,18 @@ +#include "surface.h" +#include + +Surface * surface_new (int w, int h) { + Surface * s = (Surface*)malloc(sizeof(Surface)); + s->realstart = (int*)malloc(w*h*4 + 128); + s->buf = (int*)((int)s->realstart + 128 - (((int)s->realstart) % 128)); + s->size = w*h; + s->width = w; + s->height = h; + return s; +} + +void surface_delete (Surface **s) { + free ((*s)->realstart); + free (*s); + *s = NULL; +} diff -Nru kodi-visualization-goom-1.1.0/lib/goom/sdl-goom/surface.h kodi-visualization-goom-2.1.0/lib/goom/sdl-goom/surface.h --- kodi-visualization-goom-1.1.0/lib/goom/sdl-goom/surface.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/sdl-goom/surface.h 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,16 @@ +#ifndef _SURFACE_H +#define _SURFACE_H + +typedef struct { + int * buf; + int width; + int height; + int size; + + int * realstart; +} Surface; + +Surface * surface_new (int w, int h) ; +void surface_delete (Surface **s) ; + +#endif diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/config_param.c kodi-visualization-goom-2.1.0/lib/goom/src/config_param.c --- kodi-visualization-goom-1.1.0/lib/goom/src/config_param.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/config_param.c 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,110 @@ +/*---------------------------------------------------------------------------*/ +/* +** config_param.c +** Goom Project +** +** Created by Jean-Christophe Hoelt on Sat Jul 19 2003 +** Copyright (c) 2003 iOS. All rights reserved. +*/ +/*---------------------------------------------------------------------------*/ + +#include "goom_config_param.h" +#include + +/* TODO: Ajouter goom_ devant ces fonctions */ + +static void empty_fct(PluginParam *dummy) { +} + +PluginParam goom_secure_param() { + PluginParam p; + p.changed = empty_fct; + p.change_listener = empty_fct; + p.user_data = 0; + p.name = p.desc = 0; + p.rw = 1; + return p; +} + +PluginParam goom_secure_f_param(char *name) { + PluginParam p = secure_param(); + p.name = name; + p.type = PARAM_FLOATVAL; + FVAL(p) = 0.5f; + FMIN(p) = 0.0f; + FMAX(p) = 1.0f; + FSTEP(p) = 0.01f; + return p; +} + +PluginParam goom_secure_f_feedback(char *name) { + PluginParam p = secure_f_param(name); + p.rw = 0; + return p; +} + +PluginParam goom_secure_s_param(char *name) { + PluginParam p = secure_param(); + p.name = name; + p.type = PARAM_STRVAL; + SVAL(p) = 0; + return p; +} + +PluginParam goom_secure_b_param(char *name, int value) { + PluginParam p = secure_param(); + p.name = name; + p.type = PARAM_BOOLVAL; + BVAL(p) = value; + return p; +} + +PluginParam goom_secure_i_param(char *name) { + PluginParam p = secure_param(); + p.name = name; + p.type = PARAM_INTVAL; + IVAL(p) = 50; + IMIN(p) = 0; + IMAX(p) = 100; + ISTEP(p) = 1; + return p; +} + +PluginParam goom_secure_i_feedback(char *name) { + PluginParam p = secure_i_param(name); + p.rw = 0; + return p; +} + +PluginParameters goom_plugin_parameters(const char *name, int nb) { + PluginParameters p; + p.name = (char *)name; + p.desc = ""; + p.nbParams = nb; + p.params = (PluginParam**)malloc(nb*sizeof(PluginParam*)); + return p; +} + +/*---------------------------------------------------------------------------*/ + +void goom_set_str_param_value(PluginParam *p, const char *str) { + int len = strlen(str); + if (SVAL(*p)) + SVAL(*p) = (char*)realloc(SVAL(*p), len+1); + else + SVAL(*p) = (char*)malloc(len+1); + memcpy(SVAL(*p), str, len+1); +} + +void goom_set_list_param_value(PluginParam *p, const char *str) { + int len = strlen(str); +#ifdef VERBOSE + printf("%s: %d\n", str, len); +#endif + if (LVAL(*p)) + LVAL(*p) = (char*)realloc(LVAL(*p), len+1); + else + LVAL(*p) = (char*)malloc(len+1); + memcpy(LVAL(*p), str, len+1); +} + diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/convolve_fx.c kodi-visualization-goom-2.1.0/lib/goom/src/convolve_fx.c --- kodi-visualization-goom-1.1.0/lib/goom/src/convolve_fx.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/convolve_fx.c 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,339 @@ +#include "goom_fx.h" +#include "goom_plugin_info.h" +#include "goomsl.h" +#include "goom_config.h" +#include +#include +#include +#include + +//#define CONV_MOTIF_W 32 +//#define CONV_MOTIF_WMASK 0x1f + +#define CONV_MOTIF_W 128 +#define CONV_MOTIF_WMASK 0x7f + +typedef char Motif[CONV_MOTIF_W][CONV_MOTIF_W]; + +#include "motif_blank.h" +#include "motif_goom1.h" +#include "motif_goom2.h" + +#define NB_THETA 512 + +#define MAX 2.0f + +typedef struct _CONV_DATA{ + PluginParam light; + PluginParam factor_adj_p; + PluginParam factor_p; + PluginParameters params; + + GoomSL *script; + + /* rotozoom */ + int theta; + float ftheta; + int h_sin[NB_THETA]; + int h_cos[NB_THETA]; + int h_height; + float visibility; + Motif conv_motif; + int inverse_motif; + +} ConvData; + +/* init rotozoom tables */ +static void compute_tables(VisualFX *_this, PluginInfo *info) +{ + ConvData *data = (ConvData*)_this->fx_data; + double screen_coef; + int i; + double h; + double radian; + + if (data->h_height == info->screen.height) return; + + screen_coef = 2.0 * 300.0 / (double)info->screen.height; + data->h_height = info->screen.height; + + for ( i=0 ; ih_cos[i] = 0x10000 * (-h * cos (radian) * cos(radian)); + data->h_sin[i] = 0x10000 * (h * sin (radian + 1.57) * sin(radian)); + } +} + +static void set_motif(ConvData *data, Motif motif) +{ + int i,j; + for (i=0;iconv_motif[i][j] = motif[CONV_MOTIF_W-i-1][CONV_MOTIF_W-j-1]; +} + +static void convolve_init(VisualFX *_this, PluginInfo *info) { + ConvData *data; + data = (ConvData*)malloc(sizeof(ConvData)); + _this->fx_data = (void*)data; + + data->light = secure_f_param("Screen Brightness"); + data->light.param.fval.max = 300.0f; + data->light.param.fval.step = 1.0f; + data->light.param.fval.value = 100.0f; + + data->factor_adj_p = secure_f_param("Flash Intensity"); + data->factor_adj_p.param.fval.max = 200.0f; + data->factor_adj_p.param.fval.step = 1.0f; + data->factor_adj_p.param.fval.value = 70.0f; + + data->factor_p = secure_f_feedback("Factor"); + + data->params = plugin_parameters ("Bright Flash", 5); + data->params.params[0] = &data->light; + data->params.params[1] = &data->factor_adj_p; + data->params.params[2] = 0; + data->params.params[3] = &data->factor_p; + data->params.params[4] = 0; + + /* init rotozoom tables */ + compute_tables(_this, info); + data->theta = 0; + data->ftheta = 0.0; + data->visibility = 1.0; + set_motif(data, CONV_MOTIF_BLANK); + data->inverse_motif = 0; + + _this->params = &data->params; +} + +static void convolve_free(VisualFX *_this) { + ConvData *data = _this->fx_data; + free (data->params.params); + free (data); +} + +static void create_output_with_brightness(VisualFX *_this, Pixel *src, Pixel *dest, + PluginInfo *info, int iff) +{ + ConvData *data = (ConvData*)_this->fx_data; + + int x,y; + int i = 0;//info->screen.height * info->screen.width - 1; + + const int c = data->h_cos [data->theta]; + const int s = data->h_sin [data->theta]; + + const int xi = -(info->screen.width/2) * c; + const int yi = (info->screen.width/2) * s; + + const int xj = -(info->screen.height/2) * s; + const int yj = -(info->screen.height/2) * c; + + int xprime = xj; + int yprime = yj; + + int ifftab[16]; + if (data->inverse_motif) { + int i; + for (i=0;i<16;++i) + ifftab[i] = (double)iff * (1.0 + data->visibility * (15.0 - i) / 15.0); + } + else { + int i; + for (i=0;i<16;++i) + ifftab[i] = (double)iff / (1.0 + data->visibility * (15.0 - i) / 15.0); + } + + for (y=info->screen.height;y--;) { + int xtex,ytex; + + xtex = xprime + xi + CONV_MOTIF_W * 0x10000 / 2; + xprime += s; + + ytex = yprime + yi + CONV_MOTIF_W * 0x10000 / 2; + yprime += c; + +#ifdef HAVE_MMX + __asm__ __volatile__ + ("\n\t pxor %%mm7, %%mm7" /* mm7 = 0 */ + "\n\t movd %[xtex], %%mm2" + "\n\t movd %[ytex], %%mm3" + "\n\t punpckldq %%mm3, %%mm2" /* mm2 = [ ytex | xtex ] */ + "\n\t movd %[c], %%mm4" + "\n\t movd %[s], %%mm6" + "\n\t pxor %%mm5, %%mm5" + "\n\t psubd %%mm6, %%mm5" + "\n\t punpckldq %%mm5, %%mm4" /* mm4 = [ -s | c ] */ + "\n\t movd %[motif], %%mm6" /* mm6 = motif */ + + ::[xtex]"g"(xtex) ,[ytex]"g"(ytex) + , [c]"g"(c), [s]"g"(s) + , [motif] "g"(&data->conv_motif[0][0])); + + for (x=info->screen.width;x--;) + { + __asm__ __volatile__ + ( + "\n\t movd %[src], %%mm0" /* mm0 = src */ + "\n\t paddd %%mm4, %%mm2" /* [ ytex | xtex ] += [ -s | s ] */ + "\n\t movd %%esi, %%mm5" /* save esi into mm5 */ + "\n\t movq %%mm2, %%mm3" + "\n\t psrld $16, %%mm3" /* mm3 = [ (ytex>>16) | (xtex>>16) ] */ + "\n\t movd %%mm3, %%eax" /* eax = xtex' */ + + "\n\t psrlq $25, %%mm3" + "\n\t movd %%mm3, %%ecx" /* ecx = ytex' << 7 */ + + "\n\t andl $127, %%eax" + "\n\t andl $16256, %%ecx" + + "\n\t addl %%ecx, %%eax" + "\n\t movd %%mm6, %%esi" /* esi = motif */ + "\n\t xorl %%ecx, %%ecx" + "\n\t movb (%%eax,%%esi), %%cl" + + "\n\t movl %[ifftab], %%eax" + "\n\t movd %%mm5, %%esi" /* restore esi from mm5 */ + "\n\t movd (%%eax,%%ecx,4), %%mm1" /* mm1 = [0|0|0|iff2] */ + + "\n\t punpcklwd %%mm1, %%mm1" + "\n\t punpcklbw %%mm7, %%mm0" + "\n\t punpckldq %%mm1, %%mm1" + "\n\t psrlw $1, %%mm0" + "\n\t psrlw $2, %%mm1" + "\n\t pmullw %%mm1, %%mm0" + "\n\t psrlw $5, %%mm0" + "\n\t packuswb %%mm7, %%mm0" + "\n\t movd %%mm0, %[dest]" + : [dest] "=g" (dest[i].val) + : [src] "g" (src[i].val) + , [ifftab]"g"(&ifftab[0]) + : "eax","ecx"); + + i++; + } +#else + for (x=info->screen.width;x--;) { + + int iff2; + unsigned int f0,f1,f2,f3; + + xtex += c; + ytex -= s; + + iff2 = ifftab[data->conv_motif[(ytex >>16) & CONV_MOTIF_WMASK][(xtex >> 16) & CONV_MOTIF_WMASK]]; + +#define sat(a) ((a)>0xFF?0xFF:(a)) + f0 = src[i].val; + f1 = ((f0 >> R_OFFSET) & 0xFF) * iff2 >> 8; + f2 = ((f0 >> G_OFFSET) & 0xFF) * iff2 >> 8; + f3 = ((f0 >> B_OFFSET) & 0xFF) * iff2 >> 8; + dest[i].val = (sat(f1) << R_OFFSET) | (sat(f2) << G_OFFSET) | (sat(f3) << B_OFFSET); +/* + f0 = (src[i].cop[0] * iff2) >> 8; + f1 = (src[i].cop[1] * iff2) >> 8; + f2 = (src[i].cop[2] * iff2) >> 8; + f3 = (src[i].cop[3] * iff2) >> 8; + + dest[i].cop[0] = (f0 & 0xffffff00) ? 0xff : (unsigned char)f0; + dest[i].cop[1] = (f1 & 0xffffff00) ? 0xff : (unsigned char)f1; + dest[i].cop[2] = (f2 & 0xffffff00) ? 0xff : (unsigned char)f2; + dest[i].cop[3] = (f3 & 0xffffff00) ? 0xff : (unsigned char)f3; +*/ + i++; + } +#endif + } +#ifdef HAVE_MMX + __asm__ __volatile__ ("\n\t emms"); +#endif + + compute_tables(_this, info); +} + + +/*#include + +static uint64_t GetTick() +{ + uint64_t x; + asm volatile ("RDTSC" : "=A" (x)); + return x; +}*/ + + +static void convolve_apply(VisualFX *_this, Pixel *src, Pixel *dest, PluginInfo *info) { + + ConvData *data = (ConvData*)_this->fx_data; + float ff; + int iff; + + ff = (FVAL(data->factor_p) * FVAL(data->factor_adj_p) + FVAL(data->light) ) / 100.0f; + iff = (unsigned int)(ff * 256); + + { + double fcycle = (double)info->cycle; + double rotate_param, rotate_coef; + float INCREASE_RATE = 1.5; + float DECAY_RATE = 0.955; + if (FVAL(info->sound.last_goom_p) > 0.8) + FVAL(data->factor_p) += FVAL(info->sound.goom_power_p) * INCREASE_RATE; + FVAL(data->factor_p) *= DECAY_RATE; + + rotate_param = FVAL(info->sound.last_goom_p); + if (rotate_param < 0.0) + rotate_param = 0.0; + rotate_param += FVAL(info->sound.goom_power_p); + + rotate_coef = 4.0 + FVAL(info->sound.goom_power_p) * 6.0; + data->ftheta = (data->ftheta + rotate_coef * sin(rotate_param * 6.3)); + data->theta = ((unsigned int)data->ftheta) % NB_THETA; + data->visibility = (cos(fcycle * 0.001 + 1.5) * sin(fcycle * 0.008) + cos(fcycle * 0.011 + 5.0) - 0.8 + info->sound.speedvar) * 1.5; + if (data->visibility < 0.0) data->visibility = 0.0; + data->factor_p.change_listener(&data->factor_p); + } + +/*** Get rid of the Goom fly-in. + if (data->visibility < 0.01) { + switch (goom_irand(info->gRandom, 300)) + { + case 1: + set_motif(data, CONV_MOTIF1); data->inverse_motif = 1; break; + case 2: + set_motif(data, CONV_MOTIF2); data->inverse_motif = 0; break; + } + } +***/ + + if ((ff > 0.98f) && (ff < 1.02f)) + memcpy(dest, src, info->screen.size * sizeof(Pixel)); + else + create_output_with_brightness(_this,src,dest,info,iff); +/* +// Benching suite... + { + uint64_t before, after; + double timed; + static double stimed = 10000.0; + before = GetTick(); + data->visibility = 1.0; + create_output_with_brightness(_this,src,dest,info,iff); + after = GetTick(); + timed = (double)((after-before) / info->screen.size); + if (timed < stimed) { + stimed = timed; + printf ("CLK = %3.0f CPP\n", stimed); + } + } +*/ +} + +VisualFX convolve_create(void) { + VisualFX vfx; + vfx.init = convolve_init; + vfx.free = convolve_free; + vfx.apply = convolve_apply; + vfx.fx_data = 0; + return vfx; +} diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/convolve_fx.c.jc kodi-visualization-goom-2.1.0/lib/goom/src/convolve_fx.c.jc --- kodi-visualization-goom-1.1.0/lib/goom/src/convolve_fx.c.jc 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/convolve_fx.c.jc 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,333 @@ +#include "goom_fx.h" +#include "goom_plugin_info.h" +#include "goomsl.h" +#include "goom_config.h" +#include +#include +#include +#include + +//#define CONV_MOTIF_W 32 +//#define CONV_MOTIF_WMASK 0x1f + +#define CONV_MOTIF_W 128 +#define CONV_MOTIF_WMASK 0x7f + +typedef char Motif[CONV_MOTIF_W][CONV_MOTIF_W]; + +#include "motif_goom1.h" +#include "motif_goom2.h" + +#define NB_THETA 512 + +#define MAX 2.0f + +typedef struct _CONV_DATA{ + PluginParam light; + PluginParam factor_adj_p; + PluginParam factor_p; + PluginParameters params; + + GoomSL *script; + + /* rotozoom */ + int theta; + float ftheta; + int h_sin[NB_THETA]; + int h_cos[NB_THETA]; + int h_height; + float visibility; + Motif conv_motif; + int inverse_motif; + +} ConvData; + +/* init rotozoom tables */ +static void compute_tables(VisualFX *_this, PluginInfo *info) +{ + ConvData *data = (ConvData*)_this->fx_data; + double screen_coef; + int i; + double h; + double radian; + + if (data->h_height == info->screen.height) return; + + screen_coef = 2.0 * 300.0 / (double)info->screen.height; + data->h_height = info->screen.height; + + for ( i=0 ; ih_cos[i] = 0x10000 * (-h * cos (radian) * cos(radian)); + data->h_sin[i] = 0x10000 * (h * sin (radian + 1.57) * sin(radian)); + } +} + +static void set_motif(ConvData *data, Motif motif) +{ + int i,j; + for (i=0;iconv_motif[i][j] = motif[CONV_MOTIF_W-i-1][CONV_MOTIF_W-j-1]; +} + +static void convolve_init(VisualFX *_this, PluginInfo *info) { + ConvData *data; + data = (ConvData*)malloc(sizeof(ConvData)); + _this->fx_data = (void*)data; + + data->light = secure_f_param("Screen Brightness"); + data->light.param.fval.max = 300.0f; + data->light.param.fval.step = 1.0f; + data->light.param.fval.value = 100.0f; + + data->factor_adj_p = secure_f_param("Flash Intensity"); + data->factor_adj_p.param.fval.max = 200.0f; + data->factor_adj_p.param.fval.step = 1.0f; + data->factor_adj_p.param.fval.value = 70.0f; + + data->factor_p = secure_f_feedback("Factor"); + + data->params = plugin_parameters ("Bright Flash", 5); + data->params.params[0] = &data->light; + data->params.params[1] = &data->factor_adj_p; + data->params.params[2] = 0; + data->params.params[3] = &data->factor_p; + data->params.params[4] = 0; + + /* init rotozoom tables */ + compute_tables(_this, info); + data->theta = 0; + data->ftheta = 0.0; + data->visibility = 1.0; + set_motif(data, CONV_MOTIF2); + data->inverse_motif = 0; + + _this->params = &data->params; +} + +static void convolve_free(VisualFX *_this) { + free (_this->fx_data); +} + +static void create_output_with_brightness(VisualFX *_this, Pixel *src, Pixel *dest, + PluginInfo *info, int iff) +{ + ConvData *data = (ConvData*)_this->fx_data; + + int x,y; + int i = 0;//info->screen.height * info->screen.width - 1; + + const int c = data->h_cos [data->theta]; + const int s = data->h_sin [data->theta]; + + const int xi = -(info->screen.width/2) * c; + const int yi = (info->screen.width/2) * s; + + const int xj = -(info->screen.height/2) * s; + const int yj = -(info->screen.height/2) * c; + + int xprime = xj; + int yprime = yj; + + int ifftab[16]; + if (data->inverse_motif) { + int i; + for (i=0;i<16;++i) + ifftab[i] = (double)iff * (1.0 + data->visibility * (15.0 - i) / 15.0); + } + else { + int i; + for (i=0;i<16;++i) + ifftab[i] = (double)iff / (1.0 + data->visibility * (15.0 - i) / 15.0); + } + + for (y=info->screen.height;y--;) { + int xtex,ytex; + + xtex = xprime + xi + CONV_MOTIF_W * 0x10000 / 2; + xprime += s; + + ytex = yprime + yi + CONV_MOTIF_W * 0x10000 / 2; + yprime += c; + +#ifdef HAVE_MMX + __asm__ __volatile__ + ("\n\t pxor %%mm7, %%mm7" /* mm7 = 0 */ + "\n\t movd %[xtex], %%mm2" + "\n\t movd %[ytex], %%mm3" + "\n\t punpckldq %%mm3, %%mm2" /* mm2 = [ ytex | xtex ] */ + "\n\t movd %[c], %%mm4" + "\n\t movd %[s], %%mm6" + "\n\t pxor %%mm5, %%mm5" + "\n\t psubd %%mm6, %%mm5" + "\n\t punpckldq %%mm5, %%mm4" /* mm4 = [ -s | c ] */ + "\n\t movd %[motif], %%mm6" /* mm6 = motif */ + + ::[xtex]"g"(xtex) ,[ytex]"g"(ytex) + , [c]"g"(c), [s]"g"(s) + , [motif] "g"(&data->conv_motif[0][0])); + + for (x=info->screen.width;x--;) + { + __asm__ __volatile__ + ( + "\n\t movd %[src], %%mm0" /* mm0 = src */ + "\n\t paddd %%mm4, %%mm2" /* [ ytex | xtex ] += [ -s | s ] */ + "\n\t movd %%esi, %%mm5" /* save esi into mm5 */ + "\n\t movq %%mm2, %%mm3" + "\n\t psrld $16, %%mm3" /* mm3 = [ (ytex>>16) | (xtex>>16) ] */ + "\n\t movd %%mm3, %%eax" /* eax = xtex' */ + + "\n\t psrlq $25, %%mm3" + "\n\t movd %%mm3, %%ecx" /* ecx = ytex' << 7 */ + + "\n\t andl $127, %%eax" + "\n\t andl $16256, %%ecx" + + "\n\t addl %%ecx, %%eax" + "\n\t movd %%mm6, %%esi" /* esi = motif */ + "\n\t xorl %%ecx, %%ecx" + "\n\t movb (%%eax,%%esi), %%cl" + + "\n\t movl %[ifftab], %%eax" + "\n\t movd %%mm5, %%esi" /* restore esi from mm5 */ + "\n\t movd (%%eax,%%ecx,4), %%mm1" /* mm1 = [0|0|0|iff2] */ + + "\n\t punpcklwd %%mm1, %%mm1" + "\n\t punpcklbw %%mm7, %%mm0" + "\n\t punpckldq %%mm1, %%mm1" + "\n\t psrlw $1, %%mm0" + "\n\t psrlw $1, %%mm1" + "\n\t pmullw %%mm1, %%mm0" + "\n\t psrlw $6, %%mm0" + "\n\t packuswb %%mm7, %%mm0" + "\n\t movd %%mm0, %[dest]" + : [dest] "=g" (dest[i].val) + : [src] "g" (src[i].val) + , [ifftab]"g"(&ifftab[0]) + : "eax","ecx"); + + i++; + } +#else + for (x=info->screen.width;x--;) { + + int iff2; + unsigned int f0,f1,f2,f3; + + xtex += c; + ytex -= s; + + iff2 = ifftab[data->conv_motif[(ytex >>16) & CONV_MOTIF_WMASK][(xtex >> 16) & CONV_MOTIF_WMASK]]; + +#define sat(a) ((a)>0xFF?0xFF:(a)) + f0 = src[i].val; + f1 = ((f0 >> R_OFFSET) & 0xFF) * iff2 >> 8; + f2 = ((f0 >> G_OFFSET) & 0xFF) * iff2 >> 8; + f3 = ((f0 >> B_OFFSET) & 0xFF) * iff2 >> 8; + dest[i].val = (sat(f1) << R_OFFSET) | (sat(f2) << G_OFFSET) | (sat(f3) << B_OFFSET); +/* + f0 = (src[i].cop[0] * iff2) >> 8; + f1 = (src[i].cop[1] * iff2) >> 8; + f2 = (src[i].cop[2] * iff2) >> 8; + f3 = (src[i].cop[3] * iff2) >> 8; + + dest[i].cop[0] = (f0 & 0xffffff00) ? 0xff : (unsigned char)f0; + dest[i].cop[1] = (f1 & 0xffffff00) ? 0xff : (unsigned char)f1; + dest[i].cop[2] = (f2 & 0xffffff00) ? 0xff : (unsigned char)f2; + dest[i].cop[3] = (f3 & 0xffffff00) ? 0xff : (unsigned char)f3; +*/ + i++; + } +#endif + } + __asm__ __volatile__ ("\n\t emms"); + + compute_tables(_this, info); +} + +/* +#include + +static uint64_t GetTick() +{ + uint64_t x; + asm volatile ("RDTSC" : "=A" (x)); + return x; +} +*/ + +static void convolve_apply(VisualFX *_this, Pixel *src, Pixel *dest, PluginInfo *info) { + + ConvData *data = (ConvData*)_this->fx_data; + float ff; + int iff; + + ff = (FVAL(data->factor_p) * FVAL(data->factor_adj_p) + FVAL(data->light) ) / 100.0f; + iff = (unsigned int)(ff * 256); + + { + double fcycle = (double)info->cycle; + double rotate_param, rotate_coef; + float INCREASE_RATE = 1.5; + float DECAY_RATE = 0.955; + if (FVAL(info->sound.last_goom_p) > 0.8) + FVAL(data->factor_p) += FVAL(info->sound.goom_power_p) * INCREASE_RATE; + FVAL(data->factor_p) *= DECAY_RATE; + + rotate_param = FVAL(info->sound.last_goom_p); + if (rotate_param < 0.0) + rotate_param = 0.0; + rotate_param += FVAL(info->sound.goom_power_p); + + rotate_coef = 4.0 + FVAL(info->sound.goom_power_p) * 6.0; + data->ftheta = (data->ftheta + rotate_coef * sin(rotate_param * 6.3)); + data->theta = ((unsigned int)data->ftheta) % NB_THETA; + data->visibility = (cos(fcycle * 0.001 + 1.5) * sin(fcycle * 0.008) + cos(fcycle * 0.011 + 5.0) - 0.8 + info->sound.speedvar) * 1.5; + if (data->visibility < 0.0) data->visibility = 0.0; + data->factor_p.change_listener(&data->factor_p); + } + + if (data->visibility < 0.01) { + switch (goom_irand(info->gRandom, 300)) + { + case 1: + set_motif(data, CONV_MOTIF1); data->inverse_motif = 1; break; + case 2: + set_motif(data, CONV_MOTIF2); data->inverse_motif = 0; break; + } + } + + if ((ff > 0.96f) && (ff < 1.04f)) + memcpy(dest, src, info->screen.size * sizeof(Pixel)); + else + create_output_with_brightness(_this,src,dest,info,iff); +/* + Benching suite... + { + uint64_t before, after; + double timed; + static double stimed = 10000.0; + before = GetTick(); + data->visibility = 1.0; + create_output_with_brightness(_this,src,dest,info,iff); + after = GetTick(); + timed = (double)((after-before) / info->screen.size); + if (timed < stimed) { + stimed = timed; + printf ("CLK = %3.0f CPP\n", stimed); + } + } +*/ +} + +VisualFX convolve_create(void) { + VisualFX vfx = { + init: convolve_init, + free: convolve_free, + apply: convolve_apply, + fx_data: 0 + }; + return vfx; +} diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/cpu_info.c kodi-visualization-goom-2.1.0/lib/goom/src/cpu_info.c --- kodi-visualization-goom-1.1.0/lib/goom/src/cpu_info.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/cpu_info.c 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,71 @@ +/* + * cpu_info.c + * Goom + * + * Created by Guillaume Borios on Sun Dec 28 2003. + * Copyright (c) 2003 iOS. All rights reserved. + * + */ + +#include "cpu_info.h" + +#ifdef CPU_X86 +#include "mmx.h" +#endif + +#ifdef CPU_POWERPC +#include +#include +#endif + +static unsigned int CPU_FLAVOUR = 0; +static unsigned int CPU_NUMBER = 1; +static unsigned int CPU_DETECTED = 0; + +static void autoset_cpu_info (void) +{ + CPU_DETECTED = 1; + +#ifdef CPU_POWERPC + int result; + size_t size; + + result = 0; + size = 4; + if (sysctlbyname("hw.optional.altivec",&result,&size,NULL,NULL) == 0) + { + if (result != 0) CPU_FLAVOUR |= CPU_OPTION_ALTIVEC; + } + + result = 0; + size = 4; + if (sysctlbyname("hw.optional.64bitops",&result,&size,NULL,NULL) == 0) + { + if (result != 0) CPU_FLAVOUR |= CPU_OPTION_64_BITS; + } + + result = 0; + size = 4; + if (sysctlbyname("hw.ncpu",&result,&size,NULL,NULL) == 0) + { + if (result != 0) CPU_NUMBER = result; + } +#endif /* CPU_POWERPC */ + +#ifdef CPU_X86 + if (mmx_supported()) CPU_FLAVOUR |= CPU_OPTION_MMX; + if (xmmx_supported()) CPU_FLAVOUR |= CPU_OPTION_XMMX; +#endif /* CPU_X86 */ +} + +unsigned int cpu_flavour (void) +{ + if (CPU_DETECTED == 0) autoset_cpu_info(); + return CPU_FLAVOUR; +} + +unsigned int cpu_number (void) +{ + if (CPU_DETECTED == 0) autoset_cpu_info(); + return CPU_NUMBER; +} diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/cpu_info.h kodi-visualization-goom-2.1.0/lib/goom/src/cpu_info.h --- kodi-visualization-goom-1.1.0/lib/goom/src/cpu_info.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/cpu_info.h 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,34 @@ +#ifndef CPU_INFO_H +#define CPU_INFO_H + +/* + * cpu_info.h + * Goom + * + * Created by Guillaume Borios on Sun Dec 28 2003. + * Copyright (c) 2003 iOS. All rights reserved. + * + */ + +#ifdef HAVE_MMX +#ifndef CPU_X86 +#define CPU_X86 +#endif +#endif + +/* Returns the CPU flavour described with the constants below */ +unsigned int cpu_flavour (void); + +#define CPU_OPTION_ALTIVEC 0x1 +#define CPU_OPTION_64_BITS 0x2 +#define CPU_OPTION_MMX 0x4 +#define CPU_OPTION_XMMX 0x8 +#define CPU_OPTION_SSE 0x10 +#define CPU_OPTION_SSE2 0x20 +#define CPU_OPTION_3DNOW 0x40 + + +/* Returns the CPU number */ +unsigned int cpu_number (void); + +#endif diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/default_script.goom kodi-visualization-goom-2.1.0/lib/goom/src/default_script.goom --- kodi-visualization-goom-1.1.0/lib/goom/src/default_script.goom 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/default_script.goom 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,34 @@ +/* + * specify here high-level properties of a flash. + */ + +flash_occurs when (Sound.Goom_Detection > 50%) and (Sound.Sound_Speed > 14%); + +max_flash = 200%; +slow_down_coef = 96%; + +/* + * Here you have the fx's state machin behaviour. + */ + +(locked) ? locked--; + +(not locked) and (flash_occurs) ? +{ + cur_power = Sound_Speed.Goom_Detection; + start flashing_up; +} + +(not locked) and (flashing_up) ? +{ + factor += cur_power * 2 * (speedvar / 4 + 0.95); + if (factor > max_flash) factor = max_flash; + + (not flash_occurs) ? + { + locked = 200; + stop flashing_up; + } +} + +factor *= slow_down_coef; diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/default_scripts.h kodi-visualization-goom-2.1.0/lib/goom/src/default_scripts.h --- kodi-visualization-goom-1.1.0/lib/goom/src/default_scripts.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/default_scripts.h 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,6 @@ +#ifndef _DEFAULT_SCRIPTS_H +#define _DEFAULT_SCRIPTS_H + +#define GOOM_MAIN_SCRIPT "" + +#endif diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/DOCODE.TXT kodi-visualization-goom-2.1.0/lib/goom/src/DOCODE.TXT --- kodi-visualization-goom-1.1.0/lib/goom/src/DOCODE.TXT 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/DOCODE.TXT 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,55 @@ +Les diffrentes donnes.. +----- + +typedef struct { + int32 * buf; + int32 width; + int32 height; + int32 size; + + int32 * realstart; +} Surface; +----- + +>> taille du buffer de zoom +guint32 mmx_zoom_size; +----- + +>> les buffers bruts contiennent les px et py de chaque point +>> => brutS[0] = px0, brutS[1] = py0, brutS[2] = px1, [...] + +signed int *brutS = 0, *freebrutS = 0; // source +signed int *brutD = 0, *freebrutD = 0; // dest +signed int *brutT = 0, *freebrutT = 0; // temp (en cours de gnration) + +>> pointeur vers p1 +guint32 *expix1 = 0; +>> pointeur vers p2 +guint32 *expix2 = 0; + +>> largeur d'une ligne = prevX +guint32 zoom_width; + +>> largeur et hauteur des differents buffers. +int prevX=0,prevY=0; +----- + +>> buffratio est un fixpoint : 16,16 +>> valeur normalement comprise entre 0 et 1, +>> soit 0<=buffratio<=BUFFPOINTMASK + +int buffratio = 0; + +#define BUFFPOINTNB 16 +#define BUFFPOINTMASK 0xffff +#define BUFFINCR 0xff +----- + +#define sqrtperte 16 +>> faire : a % sqrtperte <=> a & pertemask +#define PERTEMASK 0xf +>> faire : a / sqrtperte <=> a >> PERTEDEC +#define PERTEDEC 4 +----- + +int precalCoef[16][16]; diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/drawmethods.c kodi-visualization-goom-2.1.0/lib/goom/src/drawmethods.c --- kodi-visualization-goom-1.1.0/lib/goom/src/drawmethods.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/drawmethods.c 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,203 @@ +#include "drawmethods.h" + +#define DRAWMETHOD_PLUS(_out,_backbuf,_col) \ +{\ + int tra=0,i=0;\ + unsigned char *bra = (unsigned char*)&(_backbuf);\ + unsigned char *dra = (unsigned char*)&(_out);\ + unsigned char *cra = (unsigned char*)&(_col);\ + for (;i<4;i++) {\ + tra = *cra;\ + tra += *bra;\ + if (tra>255) tra=255;\ + *dra = tra;\ + ++dra;++cra;++bra;\ + }\ +} + +#define DRAWMETHOD DRAWMETHOD_PLUS(*p,*p,col) + +void draw_line (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny) +{ + int x, y, dx, dy, yy, xx; + Pixel *p; + + if ((y1 < 0) || (y2 < 0) || (x1 < 0) || (x2 < 0) || (y1 >= screeny) || (y2 >= screeny) || (x1 >= screenx) || (x2 >= screenx)) return; + + /* clip to top edge + if ((y1 < 0) && (y2 < 0)) + return; + + if (y1 < 0) { + x1 += (y1 * (x1 - x2)) / (y2 - y1); + y1 = 0; + } + if (y2 < 0) { + x2 += (y2 * (x1 - x2)) / (y2 - y1); + y2 = 0; + } + + clip to bottom edge + if ((y1 >= screeny) && (y2 >= screeny)) + return; + if (y1 >= screeny) { + x1 -= ((screeny - y1) * (x1 - x2)) / (y2 - y1); + y1 = screeny - 1; + } + if (y2 >= screeny) { + x2 -= ((screeny - y2) * (x1 - x2)) / (y2 - y1); + y2 = screeny - 1; + } + clip to left edge + if ((x1 < 0) && (x2 < 0)) + return; + if (x1 < 0) { + y1 += (x1 * (y1 - y2)) / (x2 - x1); + x1 = 0; + } + if (x2 < 0) { + y2 += (x2 * (y1 - y2)) / (x2 - x1); + x2 = 0; + } + clip to right edge + if ((x1 >= screenx) && (x2 >= screenx)) + return; + if (x1 >= screenx) { + y1 -= ((screenx - x1) * (y1 - y2)) / (x2 - x1); + x1 = screenx - 1; + } + if (x2 >= screenx) { + y2 -= ((screenx - x2) * (y1 - y2)) / (x2 - x1); + x2 = screenx - 1; + } + */ + + dx = x2 - x1; + dy = y2 - y1; + if (x1 > x2) { + int tmp; + + tmp = x1; + x1 = x2; + x2 = tmp; + tmp = y1; + y1 = y2; + y2 = tmp; + dx = x2 - x1; + dy = y2 - y1; + } + + /* vertical line */ + if (dx == 0) { + if (y1 < y2) { + p = &(data[(screenx * y1) + x1]); + for (y = y1; y <= y2; y++) { + DRAWMETHOD; + p += screenx; + } + } + else { + p = &(data[(screenx * y2) + x1]); + for (y = y2; y <= y1; y++) { + DRAWMETHOD; + p += screenx; + } + } + return; + } + /* horizontal line */ + if (dy == 0) { + if (x1 < x2) { + p = &(data[(screenx * y1) + x1]); + for (x = x1; x <= x2; x++) { + DRAWMETHOD; + p++; + } + return; + } + else { + p = &(data[(screenx * y1) + x2]); + for (x = x2; x <= x1; x++) { + DRAWMETHOD; + p++; + } + return; + } + } + /* 1 */ + /* \ */ + /* \ */ + /* 2 */ + if (y2 > y1) { + /* steep */ + if (dy > dx) { + dx = ((dx << 16) / dy); + x = x1 << 16; + for (y = y1; y <= y2; y++) { + xx = x >> 16; + p = &(data[(screenx * y) + xx]); + DRAWMETHOD; + if (xx < (screenx - 1)) { + p++; + /* DRAWMETHOD; */ + } + x += dx; + } + return; + } + /* shallow */ + else { + dy = ((dy << 16) / dx); + y = y1 << 16; + for (x = x1; x <= x2; x++) { + yy = y >> 16; + p = &(data[(screenx * yy) + x]); + DRAWMETHOD; + if (yy < (screeny - 1)) { + p += screeny; + /* DRAWMETHOD; */ + } + y += dy; + } + } + } + /* 2 */ + /* / */ + /* / */ + /* 1 */ + else { + /* steep */ + if (-dy > dx) { + dx = ((dx << 16) / -dy); + x = (x1 + 1) << 16; + for (y = y1; y >= y2; y--) { + xx = x >> 16; + p = &(data[(screenx * y) + xx]); + DRAWMETHOD; + if (xx < (screenx - 1)) { + p--; + /* DRAWMETHOD; */ + } + x += dx; + } + return; + } + /* shallow */ + else { + dy = ((dy << 16) / dx); + y = y1 << 16; + for (x = x1; x <= x2; x++) { + yy = y >> 16; + p = &(data[(screenx * yy) + x]); + DRAWMETHOD; + if (yy < (screeny - 1)) { + p += screeny; + /* DRAWMETHOD; */ + } + y += dy; + } + return; + } + } +} + diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/drawmethods.h kodi-visualization-goom-2.1.0/lib/goom/src/drawmethods.h --- kodi-visualization-goom-1.1.0/lib/goom/src/drawmethods.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/drawmethods.h 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,9 @@ +#ifndef _DRAWMETHODS_H +#define _DRAWMETHODS_H + +#include "goom_config.h" +#include "goom_graphic.h" + +void draw_line (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny); + +#endif /* _DRAWMETHODS_H */ diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/filters.c kodi-visualization-goom-2.1.0/lib/goom/src/filters.c --- kodi-visualization-goom-1.1.0/lib/goom/src/filters.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/filters.c 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,773 @@ +// --- CHUI EN TRAIN DE SUPPRIMER LES EXTERN RESOLX ET C_RESOLY --- + +/* filter.c version 0.7 +* contient les filtres applicable a un buffer +* creation : 01/10/2000 +* -ajout de sinFilter() +* -ajout de zoomFilter() +* -copie de zoomFilter() en zoomFilterRGB(), gerant les 3 couleurs +* -optimisation de sinFilter (utilisant une table de sin) +* -asm +* -optimisation de la procedure de generation du buffer de transformation +* la vitesse est maintenant comprise dans [0..128] au lieu de [0..100] +*/ + +/* #define _DEBUG_PIXEL */ + +#include +#include +#include +#include +#include + +#include "goom_filters.h" +#include "goom_graphic.h" +#include "goom_tools.h" +#include "goom_plugin_info.h" +#include "goom_fx.h" +#include "v3d.h" + +/* TODO : MOVE THIS AWAY !!! */ +/* jeko: j'ai essayer de le virer, mais si on veut les laisser inline c'est un peu lourdo... */ +static inline void setPixelRGB (PluginInfo *goomInfo, Pixel *buffer, Uint x, Uint y, Color c) +{ + Pixel i; + + i.channels.b = c.b; + i.channels.g = c.v; + i.channels.r = c.r; + *(buffer + (x + y * goomInfo->screen.width)) = i; +} + +static inline void setPixelRGB_ (Pixel *buffer, Uint x, Color c) +{ + buffer[x].channels.r = c.r; + buffer[x].channels.g = c.v; + buffer[x].channels.b = c.b; +} + +static inline void getPixelRGB (PluginInfo *goomInfo, Pixel *buffer, Uint x, Uint y, Color * c) +{ + Pixel i = *(buffer + (x + y * goomInfo->screen.width)); + c->b = i.channels.b; + c->v = i.channels.g; + c->r = i.channels.r; +} + +static inline void getPixelRGB_ (Pixel *buffer, Uint x, Color * c) +{ + Pixel i = *(buffer + x); + c->b = i.channels.b; + c->v = i.channels.g; + c->r = i.channels.r; +} +/* END TODO */ + + +/* DEPRECATED */ +// retourne x>>s , en testant le signe de x +//#define ShiftRight(_x,_s) (((_x)<0) ? -(-(_x)>>(_s)) : ((_x)>>(_s))) +//#define EFFECT_DISTORS 4 +//#define EFFECT_DISTORS_SL 2 +//#define INTERLACE_ADD 9 +//#define INTERLACE_AND 0xf +/* END DEPRECATED */ + +#define BUFFPOINTNB 16 +#define BUFFPOINTNBF 16.0f +#define BUFFPOINTMASK 0xffff + +#define sqrtperte 16 +/* faire : a % sqrtperte <=> a & pertemask */ +#define PERTEMASK 0xf +/* faire : a / sqrtperte <=> a >> PERTEDEC */ +#define PERTEDEC 4 + +/* pure c version of the zoom filter */ +static void c_zoom (Pixel *expix1, Pixel *expix2, unsigned int prevX, unsigned int prevY, signed int *brutS, signed int *brutD, int buffratio, int precalCoef[BUFFPOINTNB][BUFFPOINTNB]); + +/* simple wrapper to give it the same proto than the others */ +void zoom_filter_c (int sizeX, int sizeY, Pixel *src, Pixel *dest, int *brutS, int *brutD, int buffratio, int precalCoef[16][16]) { + c_zoom(src, dest, sizeX, sizeY, brutS, brutD, buffratio, precalCoef); +} + +static void generatePrecalCoef (int precalCoef[BUFFPOINTNB][BUFFPOINTNB]); + + +typedef struct _ZOOM_FILTER_FX_WRAPPER_DATA { + + PluginParam enabled_bp; + PluginParameters params; + + unsigned int *coeffs, *freecoeffs; + + signed int *brutS, *freebrutS; /* source */ + signed int *brutD, *freebrutD; /* dest */ + signed int *brutT, *freebrutT; /* temp (en cours de generation) */ + + guint32 zoom_width; + + unsigned int prevX, prevY; + + float general_speed; + int reverse; /* reverse the speed */ + char theMode; + int waveEffect; + int hypercosEffect; + int vPlaneEffect; + int hPlaneEffect; + char noisify; + int middleX, middleY; + + int mustInitBuffers; + int interlace_start; + + /** modif by jeko : fixedpoint : buffration = (16:16) (donc 0<=buffration<=2^16) */ + int buffratio; + int *firedec; + + /** modif d'optim by Jeko : precalcul des 4 coefs resultant des 2 pos */ + int precalCoef[BUFFPOINTNB][BUFFPOINTNB]; + + /** calculatePXandPY statics */ + int wave; + int wavesp; + +} ZoomFilterFXWrapperData; + + + + +static inline v2g zoomVector(ZoomFilterFXWrapperData *data, float X, float Y) +{ + v2g vecteur; + float vx, vy; + float sq_dist = X*X + Y*Y; + + /* sx = (X < 0.0f) ? -1.0f : 1.0f; + sy = (Y < 0.0f) ? -1.0f : 1.0f; + */ + float coefVitesse = (1.0f+ data->general_speed) / 50.0f; + + // Effects + + /* Centralized FX */ + + switch (data->theMode) { + case CRYSTAL_BALL_MODE: + coefVitesse -= (sq_dist-0.3f)/15.0f; + break; + case AMULETTE_MODE: + coefVitesse += sq_dist * 3.5f; + break; + case WAVE_MODE: + coefVitesse += sin(sq_dist*20.0f) / 100.0f; + break; + case SCRUNCH_MODE: + coefVitesse += sq_dist / 10.0f; + break; + //case HYPERCOS1_MODE: + break; + //case HYPERCOS2_MODE: + break; + //case YONLY_MODE: + break; + case SPEEDWAY_MODE: + coefVitesse *= 4.0f * Y; + break; + default: + break; + } + + if (coefVitesse < -2.01f) + coefVitesse = -2.01f; + if (coefVitesse > 2.01f) + coefVitesse = 2.01f; + + vx = coefVitesse * X; + vy = coefVitesse * Y; + + /* Amulette 2 */ + // vx = X * tan(dist); + // vy = Y * tan(dist); + + /* Rotate */ + //vx = (X+Y)*0.1; + //vy = (Y-X)*0.1; + + + // Effects adds-on + + /* Noise */ + if (data->noisify) + { + vx += (((float)random()) / ((float)RAND_MAX) - 0.5f) / 50.0f; + vy += (((float)random()) / ((float)RAND_MAX) - 0.5f) / 50.0f; + } + + /* Hypercos */ + if (data->hypercosEffect) + { + vx += sin(Y*10.0f)/120.0f; + vy += sin(X*10.0f)/120.0f; + } + + /* H Plane */ + if (data->hPlaneEffect) vx += Y * 0.0025f * data->hPlaneEffect; + + /* V Plane */ + if (data->vPlaneEffect) vy += X * 0.0025f * data->vPlaneEffect; + + /* TODO : Water Mode */ + // if (data->waveEffect) + + vecteur.x = vx; + vecteur.y = vy; + + return vecteur; +} + + +/* + * Makes a stripe of a transform buffer (brutT) + * + * The transform is (in order) : + * Translation (-data->middleX, -data->middleY) + * Homothetie (Center : 0,0 Coeff : 2/data->prevX) + */ +static void makeZoomBufferStripe(ZoomFilterFXWrapperData * data, int INTERLACE_INCR) +{ + // Position of the pixel to compute in pixmap coordinates + Uint x, y; + // Where (verticaly) to stop generating the buffer stripe + int maxEnd = (data->interlace_start + INTERLACE_INCR); + // Ratio from pixmap to normalized coordinates + float ratio = 2.0f/((float)data->prevX); + // Ratio from normalized to virtual pixmap coordinates + float inv_ratio = BUFFPOINTNBF/ratio; + float min = ratio/BUFFPOINTNBF; + // Y position of the pixel to compute in normalized coordinates + float Y = ((float)(data->interlace_start - data->middleY)) * ratio; + + maxEnd = data->prevY; + if (maxEnd > (data->interlace_start + INTERLACE_INCR)) + maxEnd = (data->interlace_start + INTERLACE_INCR); + + for (y = data->interlace_start; (y < data->prevY) && ((signed int)yprevX * 2; + float X = - ((float)data->middleX) * ratio; + for (x = 0; x < data->prevX; x++) + { + v2g vector = zoomVector (data, X, Y); + + /* Finish and avoid null displacement */ + if (fabs(vector.x) < min) vector.x = (vector.x < 0.0f) ? -min : min; + if (fabs(vector.y) < min) vector.y = (vector.y < 0.0f) ? -min : min; + + data->brutT[premul_y_prevX] = ((int)((X-vector.x)*inv_ratio)+((int)(data->middleX*BUFFPOINTNB))); + data->brutT[premul_y_prevX+1] = ((int)((Y-vector.y)*inv_ratio)+((int)(data->middleY*BUFFPOINTNB))); + premul_y_prevX += 2; + X += ratio; + } + Y += ratio; + } + data->interlace_start += INTERLACE_INCR; + if (y >= data->prevY-1) data->interlace_start = -1; +} + + +/* + * calculer px et py en fonction de x,y,middleX,middleY et theMode + * px et py indique la nouvelle position (en sqrtperte ieme de pixel) + * (valeur * 16) + + inline void calculatePXandPY (PluginInfo *goomInfo, ZoomFilterFXWrapperData *data, int x, int y, int *px, int *py) + { + if (data->theMode == WATER_MODE) { + int yy; + + yy = y + goom_irand(goomInfo->gRandom, 4) - goom_irand(goomInfo->gRandom, 4) + data->wave / 10; + if (yy < 0) + yy = 0; + if (yy >= (signed int)goomInfo->screen.height) + yy = goomInfo->screen.height - 1; + + *px = (x << 4) + data->firedec[yy] + (data->wave / 10); + *py = (y << 4) + 132 - ((data->vitesse < 131) ? data->vitesse : 130); + + data->wavesp += goom_irand(goomInfo->gRandom, 3) - goom_irand(goomInfo->gRandom, 3); + if (data->wave < -10) + data->wavesp += 2; + if (data->wave > 10) + data->wavesp -= 2; + data->wave += (data->wavesp / 10) + goom_irand(goomInfo->gRandom, 3) - goom_irand(goomInfo->gRandom, 3); + if (data->wavesp > 100) + data->wavesp = (data->wavesp * 9) / 10; + } + else { + int dist = 0, vx9, vy9; + int vx, vy; + int ppx, ppy; + int fvitesse = data->vitesse << 4; + + if (data->noisify) { + x += goom_irand(goomInfo->gRandom, data->noisify) - goom_irand(goomInfo->gRandom, data->noisify); + y += goom_irand(goomInfo->gRandom, data->noisify) - goom_irand(goomInfo->gRandom, data->noisify); + } + vx = (x - data->middleX) << 9; + vy = (y - data->middleY) << 9; + + if (data->hPlaneEffect) + vx += data->hPlaneEffect * (y - data->middleY); + + if (data->vPlaneEffect) + vy += data->vPlaneEffect * (x - data->middleX); + + if (data->waveEffect) { + fvitesse *= + 1024 + + ShiftRight (goomInfo->sintable + [(unsigned short) (dist * 0xffff + EFFECT_DISTORS)], 6); + fvitesse /= 1024; + } + + if (data->hypercosEffect) { + vx += ShiftRight (goomInfo->sintable[(-vy + dist) & 0xffff], 1); + vy += ShiftRight (goomInfo->sintable[(vx + dist) & 0xffff], 1); + } + + vx9 = ShiftRight (vx, 9); + vy9 = ShiftRight (vy, 9); + dist = vx9 * vx9 + vy9 * vy9; + + switch (data->theMode) { + case WAVE_MODE: + fvitesse *= + 1024 + + ShiftRight (goomInfo->sintable + [(unsigned short) (dist * 0xffff * EFFECT_DISTORS)], 6); + fvitesse>>=10; + break; + case CRYSTAL_BALL_MODE: + fvitesse += (dist >> (10-EFFECT_DISTORS_SL)); + break; + case AMULETTE_MODE: + fvitesse -= (dist >> (4 - EFFECT_DISTORS_SL)); + break; + case SCRUNCH_MODE: + fvitesse -= (dist >> (10 - EFFECT_DISTORS_SL)); + break; + case HYPERCOS1_MODE: + vx = vx + ShiftRight (goomInfo->sintable[(-vy + dist) & 0xffff], 1); + vy = vy + ShiftRight (goomInfo->sintable[(vx + dist) & 0xffff], 1); + break; + case HYPERCOS2_MODE: + vx = + vx + ShiftRight (goomInfo->sintable[(-ShiftRight (vy, 1) + dist) & 0xffff], 0); + vy = + vy + ShiftRight (goomInfo->sintable[(ShiftRight (vx, 1) + dist) & 0xffff], 0); + fvitesse = 128 << 4; + break; + case YONLY_MODE: + fvitesse *= 1024 + ShiftRight (goomInfo->sintable[vy & 0xffff], 6); + fvitesse >>= 10; + break; + case SPEEDWAY_MODE: + fvitesse -= (ShiftRight(vy,10-EFFECT_DISTORS_SL)); + break; + } + + if (fvitesse < -3024) + fvitesse = -3024; + + if (vx < 0) // pb avec decalage sur nb negatif + ppx = -(-(vx * fvitesse) >> 16); + // 16 = 9 + 7 (7 = nb chiffre virgule de vitesse * (v = 128 => immobile) + // * * * * * 9 = nb chiffre virgule de vx) + else + ppx = ((vx * fvitesse) >> 16); + + if (vy < 0) + ppy = -(-(vy * fvitesse) >> 16); + else + ppy = ((vy * fvitesse) >> 16); + + *px = (data->middleX << 4) + ppx; + *py = (data->middleY << 4) + ppy; + } + } + */ + + + +static void c_zoom (Pixel *expix1, Pixel *expix2, unsigned int prevX, unsigned int prevY, signed int *brutS, signed int *brutD, + int buffratio, int precalCoef[16][16]) +{ + int myPos, myPos2; + Color couleur; + + unsigned int ax = (prevX - 1) << PERTEDEC, ay = (prevY - 1) << PERTEDEC; + + int bufsize = prevX * prevY * 2; + int bufwidth = prevX; + + expix1[0].val=expix1[prevX-1].val=expix1[prevX*prevY-1].val=expix1[prevX*prevY-prevX].val=0; + + for (myPos = 0; myPos < bufsize; myPos += 2) { + Color col1, col2, col3, col4; + int c1, c2, c3, c4, px, py; + int pos; + int coeffs; + + int brutSmypos = brutS[myPos]; + + myPos2 = myPos + 1; + + px = brutSmypos + (((brutD[myPos] - brutSmypos) * buffratio) >> BUFFPOINTNB); + brutSmypos = brutS[myPos2]; + py = brutSmypos + (((brutD[myPos2] - brutSmypos) * buffratio) >> BUFFPOINTNB); + + if ((py >= ay) || (px >= ax)) { + pos = coeffs = 0; + } else { + pos = ((px >> PERTEDEC) + prevX * (py >> PERTEDEC)); + /* coef en modulo 15 */ + coeffs = precalCoef[px & PERTEMASK][py & PERTEMASK]; + } + getPixelRGB_ (expix1, pos, &col1); + getPixelRGB_ (expix1, pos + 1, &col2); + getPixelRGB_ (expix1, pos + bufwidth, &col3); + getPixelRGB_ (expix1, pos + bufwidth + 1, &col4); + + c1 = coeffs; + c2 = (c1 >> 8) & 0xFF; + c3 = (c1 >> 16) & 0xFF; + c4 = (c1 >> 24) & 0xFF; + c1 = c1 & 0xff; + + couleur.r = col1.r * c1 + col2.r * c2 + col3.r * c3 + col4.r * c4; + if (couleur.r > 5) + couleur.r -= 5; + couleur.r >>= 8; + + couleur.v = col1.v * c1 + col2.v * c2 + col3.v * c3 + col4.v * c4; + if (couleur.v > 5) + couleur.v -= 5; + couleur.v >>= 8; + + couleur.b = col1.b * c1 + col2.b * c2 + col3.b * c3 + col4.b * c4; + if (couleur.b > 5) + couleur.b -= 5; + couleur.b >>= 8; + + setPixelRGB_ (expix2, myPos >> 1, couleur); + } +} + +/** generate the water fx horizontal direction buffer */ +static void generateTheWaterFXHorizontalDirectionBuffer(PluginInfo *goomInfo, ZoomFilterFXWrapperData *data) { + + int loopv; + int decc = goom_irand(goomInfo->gRandom, 8) - 4; + int spdc = goom_irand(goomInfo->gRandom, 8) - 4; + int accel = goom_irand(goomInfo->gRandom, 8) - 4; + + for (loopv = data->prevY; loopv != 0;) { + + loopv--; + data->firedec[loopv] = decc; + decc += spdc / 10; + spdc += goom_irand(goomInfo->gRandom, 3) - goom_irand(goomInfo->gRandom, 3); + + if (decc > 4) + spdc -= 1; + if (decc < -4) + spdc += 1; + + if (spdc > 30) + spdc = spdc - goom_irand(goomInfo->gRandom, 3) + accel / 10; + if (spdc < -30) + spdc = spdc + goom_irand(goomInfo->gRandom, 3) + accel / 10; + + if (decc > 8 && spdc > 1) + spdc -= goom_irand(goomInfo->gRandom, 3) - 2; + + if (decc < -8 && spdc < -1) + spdc += goom_irand(goomInfo->gRandom, 3) + 2; + + if (decc > 8 || decc < -8) + decc = decc * 8 / 9; + + accel += goom_irand(goomInfo->gRandom, 2) - goom_irand(goomInfo->gRandom, 2); + if (accel > 20) + accel -= 2; + if (accel < -20) + accel += 2; + } +} + + + +/** +* Main work for the dynamic displacement map. + * + * Reads data from pix1, write to pix2. + * + * Useful datas for this FX are stored in ZoomFilterData. + * + * If you think that this is a strange function name, let me say that a long time ago, + * there has been a slow version and a gray-level only one. Then came these function, + * fast and workin in RGB colorspace ! nice but it only was applying a zoom to the image. + * So that is why you have this name, for the nostalgy of the first days of goom + * when it was just a tiny program writen in Turbo Pascal on my i486... + */ +void zoomFilterFastRGB (PluginInfo *goomInfo, Pixel * pix1, Pixel * pix2, ZoomFilterData * zf, Uint resx, Uint resy, int switchIncr, float switchMult) +{ + Uint x, y; + + ZoomFilterFXWrapperData *data = (ZoomFilterFXWrapperData*)goomInfo->zoomFilter_fx.fx_data; + + if (!BVAL(data->enabled_bp)) return; + + /** changement de taille **/ + if ((data->prevX != resx) || (data->prevY != resy)) { + data->prevX = resx; + data->prevY = resy; + + if (data->brutS) free (data->freebrutS); + data->brutS = 0; + if (data->brutD) free (data->freebrutD); + data->brutD = 0; + if (data->brutT) free (data->freebrutT); + data->brutT = 0; + + data->middleX = resx / 2; + data->middleY = resy / 2; + data->mustInitBuffers = 1; + if (data->firedec) free (data->firedec); + data->firedec = 0; + } + + if (data->interlace_start != -2) + zf = NULL; + + /** changement de config **/ + if (zf) { + data->reverse = zf->reverse; + data->general_speed = (float)(zf->vitesse-128)/128.0f; + if (data->reverse) data->general_speed = -data->general_speed; + data->middleX = zf->middleX; + data->middleY = zf->middleY; + data->theMode = zf->mode; + data->hPlaneEffect = zf->hPlaneEffect; + data->vPlaneEffect = zf->vPlaneEffect; + data->waveEffect = zf->waveEffect; + data->hypercosEffect = zf->hypercosEffect; + data->noisify = zf->noisify; + data->interlace_start = 0; + } + + + if (data->mustInitBuffers) { + + data->mustInitBuffers = 0; + data->freebrutS = (signed int *) calloc (resx * resy * 2 + 128, sizeof(unsigned int)); + data->brutS = (gint32 *) ((1 + ((uintptr_t) (data->freebrutS)) / 128) * 128); + + data->freebrutD = (signed int *) calloc (resx * resy * 2 + 128, sizeof(unsigned int)); + data->brutD = (gint32 *) ((1 + ((uintptr_t) (data->freebrutD)) / 128) * 128); + + data->freebrutT = (signed int *) calloc (resx * resy * 2 + 128, sizeof(unsigned int)); + data->brutT = (gint32 *) ((1 + ((uintptr_t) (data->freebrutT)) / 128) * 128); + + data->buffratio = 0; + + data->firedec = (int *) malloc (data->prevY * sizeof (int)); + generateTheWaterFXHorizontalDirectionBuffer(goomInfo, data); + + data->interlace_start = 0; + makeZoomBufferStripe(data,resy); + + /* Copy the data from temp to dest and source */ + memcpy(data->brutS,data->brutT,resx * resy * 2 * sizeof(int)); + memcpy(data->brutD,data->brutT,resx * resy * 2 * sizeof(int)); + } + + /* generation du buffer de trans */ + if (data->interlace_start == -1) { + + /* sauvegarde de l'etat actuel dans la nouvelle source + * TODO: write that in MMX (has been done in previous version, but did not follow some new fonctionnalities) */ + y = data->prevX * data->prevY * 2; + for (x = 0; x < y; x += 2) { + int brutSmypos = data->brutS[x]; + int x2 = x + 1; + + data->brutS[x] = brutSmypos + (((data->brutD[x] - brutSmypos) * data->buffratio) >> BUFFPOINTNB); + brutSmypos = data->brutS[x2]; + data->brutS[x2] = brutSmypos + (((data->brutD[x2] - brutSmypos) * data->buffratio) >> BUFFPOINTNB); + } + data->buffratio = 0; + } + + if (data->interlace_start == -1) { + signed int * tmp; + tmp = data->brutD; + data->brutD=data->brutT; + data->brutT=tmp; + tmp = data->freebrutD; + data->freebrutD=data->freebrutT; + data->freebrutT=tmp; + data->interlace_start = -2; + } + + if (data->interlace_start>=0) + { + /* creation de la nouvelle destination */ + makeZoomBufferStripe(data,resy/16); + } + + if (switchIncr != 0) { + data->buffratio += switchIncr; + if (data->buffratio > BUFFPOINTMASK) + data->buffratio = BUFFPOINTMASK; + } + + if (switchMult != 1.0f) { + data->buffratio = (int) ((float) BUFFPOINTMASK * (1.0f - switchMult) + + (float) data->buffratio * switchMult); + } + + data->zoom_width = data->prevX; + + goomInfo->methods.zoom_filter (data->prevX, data->prevY, pix1, pix2, + data->brutS, data->brutD, data->buffratio, data->precalCoef); +} + +static void generatePrecalCoef (int precalCoef[16][16]) +{ + int coefh, coefv; + + for (coefh = 0; coefh < 16; coefh++) { + for (coefv = 0; coefv < 16; coefv++) { + + int i; + int diffcoeffh; + int diffcoeffv; + + diffcoeffh = sqrtperte - coefh; + diffcoeffv = sqrtperte - coefv; + + if (!(coefh || coefv)) { + i = 255; + } + else { + int i1, i2, i3, i4; + + i1 = diffcoeffh * diffcoeffv; + i2 = coefh * diffcoeffv; + i3 = diffcoeffh * coefv; + i4 = coefh * coefv; + + // TODO: faire mieux... + if (i1) i1--; + if (i2) i2--; + if (i3) i3--; + if (i4) i4--; + + i = (i1) | (i2 << 8) | (i3 << 16) | (i4 << 24); + } + precalCoef[coefh][coefv] = i; + } + } +} + +/* VisualFX Wrapper */ + +static void zoomFilterVisualFXWrapper_init (struct _VISUAL_FX *_this, PluginInfo *info) +{ + ZoomFilterFXWrapperData *data = (ZoomFilterFXWrapperData*)malloc(sizeof(ZoomFilterFXWrapperData)); + + data->coeffs = 0; + data->freecoeffs = 0; + data->brutS = 0; + data->freebrutS = 0; + data->brutD = 0; + data->freebrutD = 0; + data->brutT = 0; + data->freebrutT = 0; + data->prevX = 0; + data->prevY = 0; + + data->mustInitBuffers = 1; + data->interlace_start = -2; + + data->general_speed = 0.0f; + data->reverse = 0; + data->theMode = AMULETTE_MODE; + data->waveEffect = 0; + data->hypercosEffect = 0; + data->vPlaneEffect = 0; + data->hPlaneEffect = 0; + data->noisify = 2; + + /** modif by jeko : fixedpoint : buffration = (16:16) (donc 0<=buffration<=2^16) */ + data->buffratio = 0; + data->firedec = 0; + + data->wave = data->wavesp = 0; + + data->enabled_bp = secure_b_param("Enabled", 1); + + data->params = plugin_parameters ("Zoom Filter", 1); + data->params.params[0] = &data->enabled_bp; + + _this->params = &data->params; + _this->fx_data = (void*)data; + + /** modif d'optim by Jeko : precalcul des 4 coefs resultant des 2 pos */ + generatePrecalCoef(data->precalCoef); +} + +static void zoomFilterVisualFXWrapper_free (struct _VISUAL_FX *_this) +{ + ZoomFilterFXWrapperData *data = (ZoomFilterFXWrapperData*)_this->fx_data; + free (data->freebrutS); + free (data->freebrutD); + free (data->freebrutT); + free (data->firedec); + free (data->params.params); + free(_this->fx_data); +} + +static void zoomFilterVisualFXWrapper_apply (struct _VISUAL_FX *_this, Pixel *src, Pixel *dest, PluginInfo *info) +{ +} + +VisualFX zoomFilterVisualFXWrapper_create(void) +{ + VisualFX fx; + fx.init = zoomFilterVisualFXWrapper_init; + fx.free = zoomFilterVisualFXWrapper_free; + fx.apply = zoomFilterVisualFXWrapper_apply; + return fx; +} + + +/* TODO : MOVE THIS AWAY */ + +void pointFilter (PluginInfo *goomInfo, Pixel * pix1, Color c, float t1, float t2, float t3, float t4, Uint cycle) +{ + Uint x = (Uint) ((int) (goomInfo->screen.width / 2) + + (int) (t1 * cos ((float) cycle / t3))); + Uint y = (Uint) ((int) (goomInfo->screen.height/2) + + (int) (t2 * sin ((float) cycle / t4))); + + if ((x > 1) && (y > 1) && (x < goomInfo->screen.width - 2) && (y < goomInfo->screen.height - 2)) { + setPixelRGB (goomInfo, pix1, x + 1, y, c); + setPixelRGB (goomInfo, pix1, x, y + 1, c); + setPixelRGB (goomInfo, pix1, x + 1, y + 1, WHITE); + setPixelRGB (goomInfo, pix1, x + 2, y + 1, c); + setPixelRGB (goomInfo, pix1, x + 1, y + 2, c); + } +} diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/filters.c.rej kodi-visualization-goom-2.1.0/lib/goom/src/filters.c.rej --- kodi-visualization-goom-1.1.0/lib/goom/src/filters.c.rej 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/filters.c.rej 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,31 @@ +*************** +*** 427,439 **** + brutSmypos = brutS[myPos2]; + py = brutSmypos + (((brutD[myPos2] - brutSmypos) * buffratio) >> BUFFPOINTNB); + + pos = ((px >> PERTEDEC) + prevX * (py >> PERTEDEC)); + /* coef en modulo 15 */ + coeffs = precalCoef[px & PERTEMASK][py & PERTEMASK]; +- +- if ((py >= (signed int)ay) || (px >= (signed int)ax)) { +- pos = coeffs = 0; +- } + + getPixelRGB_ (expix1, pos, &col1); + getPixelRGB_ (expix1, pos + 1, &col2); +--- 427,441 ---- + brutSmypos = brutS[myPos2]; + py = brutSmypos + (((brutD[myPos2] - brutSmypos) * buffratio) >> BUFFPOINTNB); + ++ ++ if ((py >= ay) || (px >= ax)) { ++ pos = coeffs = 0; ++ } else { + pos = ((px >> PERTEDEC) + prevX * (py >> PERTEDEC)); + /* coef en modulo 15 */ + coeffs = precalCoef[px & PERTEMASK][py & PERTEMASK]; ++ } ++ + + getPixelRGB_ (expix1, pos, &col1); + getPixelRGB_ (expix1, pos + 1, &col2); diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/filters_mmx.s kodi-visualization-goom-2.1.0/lib/goom/src/filters_mmx.s --- kodi-visualization-goom-1.1.0/lib/goom/src/filters_mmx.s 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/filters_mmx.s 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,200 @@ +;// file : mmx_zoom.s +;// author : JC Hoelt +;// +;// history +;// 07/01/2001 : Changing FEMMS to EMMS : slower... but run on intel machines +;// 03/01/2001 : WIDTH and HEIGHT are now variable +;// 28/12/2000 : adding comments to the code, suppress some useless lines +;// 27/12/2000 : reducing memory access... improving performance by 20% +;// coefficients are now on 1 byte +;// 22/12/2000 : Changing data structure +;// 16/12/2000 : AT&T version +;// 14/12/2000 : unrolling loop +;// 12/12/2000 : 64 bits memory access + + +.data + +chaine: + .string "pos = %d\n\0" + .long 0x0 + +thezero: + .long 0x00000000 + .long 0x00000000 + +.text + +.globl mmx_zoom ;// name of the function to call by C program +/* .extern coeffs ;// the transformation buffer */ +.extern expix1,expix2 ;// the source and destination buffer +.extern mmx_zoom_size, zoom_width ;// size of the buffers + +.extern brutS,brutD,buffratio,precalCoef,prevX,prevY + +#define PERTEMASK 15 +/* faire : a / sqrtperte <=> a >> PERTEDEC*/ +#define PERTEDEC 4 + +.align 16 +mmx_zoom: + + pushl %ebp + movl %esp,%ebp + subl $12,%esp + + movl prevX,%eax + decl %eax + sarl $4,%eax + movl %eax,-4(%ebp) + + movl prevY,%eax + decl %eax + sarl $4,%eax + movl %eax,-8(%ebp) + +;// initialisation du mm7 zero + movq (thezero), %mm7 + +movl mmx_zoom_size, %ecx +decl %ecx + +.while: + ;// esi <- nouvelle position + movl brutS, %eax + leal (%eax, %ecx, 8),%eax + + movl (%eax),%edx /* = brutS.px (brutSmypos) */ + movl 4(%eax),%eax /* = brutS.py */ + + movl brutD,%ebx + leal (%ebx, %ecx, 8),%ebx + movl (%ebx),%esi + subl %edx, %esi + imull buffratio,%esi + sarl $16,%esi + addl %edx,%esi /* esi = px */ + + /* eax contient deja brutS.py = le nouveau brutSmypos*/ + /* ebx pointe sur brutD[myPos] */ + movl 4(%ebx),%edi + subl %eax,%edi + imull buffratio,%edi + sarl $16,%edi + addl %eax,%edi /* edi = py */ + +/* pushl %eax + pushl %ebx*/ +/* popl %ebx + popl %eax*/ + + movl %esi,%eax + andl $15,%eax /* eax = coefh */ + movl %edi,%ebx + andl $15,%ebx /* ebx = coefv */ + + leal 0(,%ebx,4),%ebx + sall $6,%eax + addl %ebx,%eax + movl $precalCoef,%ebx +/* movd (%eax,%ebx),%mm6*/ /* mm6 = coeffs */ + + cmpl -8(%ebp),%edi + jge .then1 + cmpl -4(%ebp),%esi + jge .then1 + + sarl $4,%esi + sarl $4,%edi + imull zoom_width,%edi + leal (%esi,%edi),%esi + jmp .finsi1 + +.then1: + movl $0,%esi +.finsi1: + + /** apres ce calcul, %esi = pos, %mm6 = coeffs **/ +/* pushl %esi + pushl $chaine + call printf + addl $8,%esp*/ + + movl expix1,%eax + + ;// recuperation des deux premiers pixels dans mm0 et mm1 +/* movq (%eax,%esi,4), %mm0 /* b1-v1-r1-a1-b2-v2-r2-a2 */ + movq %mm0, %mm1 /* b1-v1-r1-a1-b2-v2-r2-a2 */ + + ;// depackage du premier pixel + punpcklbw %mm7, %mm0 /* 00-b2-00-v2-00-r2-00-a2 */ + + movq %mm6, %mm5 /* ??-??-??-??-c4-c3-c2-c1 */ + ;// depackage du 2ieme pixel + punpckhbw %mm7, %mm1 /* 00-b1-00-v1-00-r1-00-a1 */ + + ;// extraction des coefficients... + punpcklbw %mm5, %mm6 /* c4-c4-c3-c3-c2-c2-c1-c1 */ + movq %mm6, %mm4 /* c4-c4-c3-c3-c2-c2-c1-c1 */ + movq %mm6, %mm5 /* c4-c4-c3-c3-c2-c2-c1-c1 */ + + punpcklbw %mm5, %mm6 /* c2-c2-c2-c2-c1-c1-c1-c1 */ + punpckhbw %mm5, %mm4 /* c4-c4-c4-c4-c3-c3-c3-c3 */ + + movq %mm6, %mm3 /* c2-c2-c2-c2-c1-c1-c1-c1 */ + punpcklbw %mm7, %mm6 /* 00-c1-00-c1-00-c1-00-c1 */ + punpckhbw %mm7, %mm3 /* 00-c2-00-c2-00-c2-00-c2 */ + + ;// multiplication des pixels par les coefficients + pmullw %mm6, %mm0 /* c1*b2-c1*v2-c1*r2-c1*a2 */ + pmullw %mm3, %mm1 /* c2*b1-c2*v1-c2*r1-c2*a1 */ + paddw %mm1, %mm0 + + ;// ...extraction des 2 derniers coefficients + movq %mm4, %mm5 /* c4-c4-c4-c4-c3-c3-c3-c3 */ + punpcklbw %mm7, %mm4 /* 00-c3-00-c3-00-c3-00-c3 */ + punpckhbw %mm7, %mm5 /* 00-c4-00-c4-00-c4-00-c4 */ + + /* ajouter la longueur de ligne a esi */ + addl prevX,%esi + + ;// recuperation des 2 derniers pixels +/* movq (%eax,%esi,4), %mm1*/ + movq %mm1, %mm2 + + ;// depackage des pixels + punpcklbw %mm7, %mm1 + punpckhbw %mm7, %mm2 + + ;// multiplication pas les coeffs + pmullw %mm4, %mm1 + pmullw %mm5, %mm2 + + ;// ajout des valeurs obtenues la valeur finale + paddw %mm1, %mm0 + paddw %mm2, %mm0 + + ;// division par 256 = 16+16+16+16, puis repackage du pixel final + psrlw $8, %mm0 + packuswb %mm7, %mm0 + + ;// passage au suivant + + ;// enregistrement du resultat + movl expix2,%eax +/* movd %mm0,(%eax,%ecx,4)*/ + + decl %ecx + ;// test de fin du tantque + cmpl $0, %ecx ;// 400x300 + + jz .fin_while + jmp .while + +.fin_while: + emms + + movl %ebp,%esp + popl %ebp + + ret ;//The End diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/filter_test/mmx.h kodi-visualization-goom-2.1.0/lib/goom/src/filter_test/mmx.h --- kodi-visualization-goom-1.1.0/lib/goom/src/filter_test/mmx.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/filter_test/mmx.h 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,705 @@ +/* mmx.h + + MultiMedia eXtensions GCC interface library for IA32. + + To use this library, simply include this header file + and compile with GCC. You MUST have inlining enabled + in order for mmx_ok() to work; this can be done by + simply using -O on the GCC command line. + + Compiling with -DMMX_TRACE will cause detailed trace + output to be sent to stderr for each mmx operation. + This adds lots of code, and obviously slows execution to + a crawl, but can be very useful for debugging. + + THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT + LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS FOR ANY PARTICULAR PURPOSE. + + 1997-99 by H. Dietz and R. Fisher + + Notes: + It appears that the latest gas has the pand problem fixed, therefore + I'll undefine BROKEN_PAND by default. +*/ + +#ifndef _MMX_H +#define _MMX_H + +/* Warning: at this writing, the version of GAS packaged + with most Linux distributions does not handle the + parallel AND operation mnemonic correctly. If the + symbol BROKEN_PAND is defined, a slower alternative + coding will be used. If execution of mmxtest results + in an illegal instruction fault, define this symbol. +*/ +#undef BROKEN_PAND + + +/* The type of an value that fits in an MMX register + (note that long long constant values MUST be suffixed + by LL and unsigned long long values by ULL, lest + they be truncated by the compiler) +*/ +typedef union { + long long q; /* Quadword (64-bit) value */ + unsigned long long uq; /* Unsigned Quadword */ + int d[2]; /* 2 Doubleword (32-bit) values */ + unsigned int ud[2]; /* 2 Unsigned Doubleword */ + short w[4]; /* 4 Word (16-bit) values */ + unsigned short uw[4]; /* 4 Unsigned Word */ + char b[8]; /* 8 Byte (8-bit) values */ + unsigned char ub[8]; /* 8 Unsigned Byte */ + float s[2]; /* Single-precision (32-bit) value */ +} __attribute__ ((aligned (8))) mmx_t; /* On an 8-byte (64-bit) boundary */ + + + +/* Function to test if multimedia instructions are supported... +*/ +inline extern int +mm_support(void) +{ + /* Returns 1 if MMX instructions are supported, + 3 if Cyrix MMX and Extended MMX instructions are supported + 5 if AMD MMX and 3DNow! instructions are supported + 0 if hardware does not support any of these + */ + register int rval = 0; + + __asm__ __volatile__ ( + /* See if CPUID instruction is supported ... */ + /* ... Get copies of EFLAGS into eax and ecx */ + "pushf\n\t" + "popl %%eax\n\t" + "movl %%eax, %%ecx\n\t" + + /* ... Toggle the ID bit in one copy and store */ + /* to the EFLAGS reg */ + "xorl $0x200000, %%eax\n\t" + "push %%eax\n\t" + "popf\n\t" + + /* ... Get the (hopefully modified) EFLAGS */ + "pushf\n\t" + "popl %%eax\n\t" + + /* ... Compare and test result */ + "xorl %%eax, %%ecx\n\t" + "testl $0x200000, %%ecx\n\t" + "jz NotSupported1\n\t" /* CPUID not supported */ + + + /* Get standard CPUID information, and + go to a specific vendor section */ + "movl $0, %%eax\n\t" + "cpuid\n\t" + + /* Check for Intel */ + "cmpl $0x756e6547, %%ebx\n\t" + "jne TryAMD\n\t" + "cmpl $0x49656e69, %%edx\n\t" + "jne TryAMD\n\t" + "cmpl $0x6c65746e, %%ecx\n" + "jne TryAMD\n\t" + "jmp Intel\n\t" + + /* Check for AMD */ + "\nTryAMD:\n\t" + "cmpl $0x68747541, %%ebx\n\t" + "jne TryCyrix\n\t" + "cmpl $0x69746e65, %%edx\n\t" + "jne TryCyrix\n\t" + "cmpl $0x444d4163, %%ecx\n" + "jne TryCyrix\n\t" + "jmp AMD\n\t" + + /* Check for Cyrix */ + "\nTryCyrix:\n\t" + "cmpl $0x69727943, %%ebx\n\t" + "jne NotSupported2\n\t" + "cmpl $0x736e4978, %%edx\n\t" + "jne NotSupported3\n\t" + "cmpl $0x64616574, %%ecx\n\t" + "jne NotSupported4\n\t" + /* Drop through to Cyrix... */ + + + /* Cyrix Section */ + /* See if extended CPUID level 80000001 is supported */ + /* The value of CPUID/80000001 for the 6x86MX is undefined + according to the Cyrix CPU Detection Guide (Preliminary + Rev. 1.01 table 1), so we'll check the value of eax for + CPUID/0 to see if standard CPUID level 2 is supported. + According to the table, the only CPU which supports level + 2 is also the only one which supports extended CPUID levels. + */ + "cmpl $0x2, %%eax\n\t" + "jne MMXtest\n\t" /* Use standard CPUID instead */ + + /* Extended CPUID supported (in theory), so get extended + features */ + "movl $0x80000001, %%eax\n\t" + "cpuid\n\t" + "testl $0x00800000, %%eax\n\t" /* Test for MMX */ + "jz NotSupported5\n\t" /* MMX not supported */ + "testl $0x01000000, %%eax\n\t" /* Test for Ext'd MMX */ + "jnz EMMXSupported\n\t" + "movl $1, %0:\n\n\t" /* MMX Supported */ + "jmp Return\n\n" + "EMMXSupported:\n\t" + "movl $3, %0:\n\n\t" /* EMMX and MMX Supported */ + "jmp Return\n\t" + + + /* AMD Section */ + "AMD:\n\t" + + /* See if extended CPUID is supported */ + "movl $0x80000000, %%eax\n\t" + "cpuid\n\t" + "cmpl $0x80000000, %%eax\n\t" + "jl MMXtest\n\t" /* Use standard CPUID instead */ + + /* Extended CPUID supported, so get extended features */ + "movl $0x80000001, %%eax\n\t" + "cpuid\n\t" + "testl $0x00800000, %%edx\n\t" /* Test for MMX */ + "jz NotSupported6\n\t" /* MMX not supported */ + "testl $0x80000000, %%edx\n\t" /* Test for 3DNow! */ + "jnz ThreeDNowSupported\n\t" + "movl $1, %0:\n\n\t" /* MMX Supported */ + "jmp Return\n\n" + "ThreeDNowSupported:\n\t" + "movl $5, %0:\n\n\t" /* 3DNow! and MMX Supported */ + "jmp Return\n\t" + + + /* Intel Section */ + "Intel:\n\t" + + /* Check for MMX */ + "MMXtest:\n\t" + "movl $1, %%eax\n\t" + "cpuid\n\t" + "testl $0x00800000, %%edx\n\t" /* Test for MMX */ + "jz NotSupported7\n\t" /* MMX Not supported */ + "movl $1, %0:\n\n\t" /* MMX Supported */ + "jmp Return\n\t" + + /* Nothing supported */ + "\nNotSupported1:\n\t" + "#movl $101, %0:\n\n\t" + "\nNotSupported2:\n\t" + "#movl $102, %0:\n\n\t" + "\nNotSupported3:\n\t" + "#movl $103, %0:\n\n\t" + "\nNotSupported4:\n\t" + "#movl $104, %0:\n\n\t" + "\nNotSupported5:\n\t" + "#movl $105, %0:\n\n\t" + "\nNotSupported6:\n\t" + "#movl $106, %0:\n\n\t" + "\nNotSupported7:\n\t" + "#movl $107, %0:\n\n\t" + "movl $0, %0:\n\n\t" + + "Return:\n\t" + : "=a" (rval) + : /* no input */ + : "eax", "ebx", "ecx", "edx" + ); + + /* Return */ + return(rval); +} + +/* Function to test if mmx instructions are supported... +*/ +inline extern int +mmx_ok(void) +{ + /* Returns 1 if MMX instructions are supported, 0 otherwise */ + return ( mm_support() & 0x1 ); +} + + +/* Helper functions for the instruction macros that follow... + (note that memory-to-register, m2r, instructions are nearly + as efficient as register-to-register, r2r, instructions; + however, memory-to-memory instructions are really simulated + as a convenience, and are only 1/3 as efficient) +*/ +#ifdef MMX_TRACE + +/* Include the stuff for printing a trace to stderr... +*/ + +#include + +#define mmx_i2r(op, imm, reg) \ + { \ + mmx_t mmx_trace; \ + mmx_trace.uq = (imm); \ + printf(#op "_i2r(" #imm "=0x%08x%08x, ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ ("movq %%" #reg ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + printf(#reg "=0x%08x%08x) => ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ (#op " %0, %%" #reg \ + : /* nothing */ \ + : "X" (imm)); \ + __asm__ __volatile__ ("movq %%" #reg ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + printf(#reg "=0x%08x%08x\n", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + } + +#define mmx_m2r(op, mem, reg) \ + { \ + mmx_t mmx_trace; \ + mmx_trace = (mem); \ + printf(#op "_m2r(" #mem "=0x%08x%08x, ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ ("movq %%" #reg ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + printf(#reg "=0x%08x%08x) => ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ (#op " %0, %%" #reg \ + : /* nothing */ \ + : "X" (mem)); \ + __asm__ __volatile__ ("movq %%" #reg ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + printf(#reg "=0x%08x%08x\n", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + } + +#define mmx_r2m(op, reg, mem) \ + { \ + mmx_t mmx_trace; \ + __asm__ __volatile__ ("movq %%" #reg ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + printf(#op "_r2m(" #reg "=0x%08x%08x, ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + mmx_trace = (mem); \ + printf(#mem "=0x%08x%08x) => ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ (#op " %%" #reg ", %0" \ + : "=X" (mem) \ + : /* nothing */ ); \ + mmx_trace = (mem); \ + printf(#mem "=0x%08x%08x\n", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + } + +#define mmx_r2r(op, regs, regd) \ + { \ + mmx_t mmx_trace; \ + __asm__ __volatile__ ("movq %%" #regs ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + printf(#op "_r2r(" #regs "=0x%08x%08x, ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ ("movq %%" #regd ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + printf(#regd "=0x%08x%08x) => ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ (#op " %" #regs ", %" #regd); \ + __asm__ __volatile__ ("movq %%" #regd ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + printf(#regd "=0x%08x%08x\n", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + } + +#define mmx_m2m(op, mems, memd) \ + { \ + mmx_t mmx_trace; \ + mmx_trace = (mems); \ + printf(#op "_m2m(" #mems "=0x%08x%08x, ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + mmx_trace = (memd); \ + printf(#memd "=0x%08x%08x) => ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ ("movq %0, %%mm0\n\t" \ + #op " %1, %%mm0\n\t" \ + "movq %%mm0, %0" \ + : "=X" (memd) \ + : "X" (mems)); \ + mmx_trace = (memd); \ + printf(#memd "=0x%08x%08x\n", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + } + +#else + +/* These macros are a lot simpler without the tracing... +*/ + +#define mmx_i2r(op, imm, reg) \ + __asm__ __volatile__ (#op " %0, %%" #reg \ + : /* nothing */ \ + : "X" (imm) ) + +#define mmx_m2r(op, mem, reg) \ + __asm__ __volatile__ (#op " %0, %%" #reg \ + : /* nothing */ \ + : "X" (mem)) + +#define mmx_r2m(op, reg, mem) \ + __asm__ __volatile__ (#op " %%" #reg ", %0" \ + : "=X" (mem) \ + : /* nothing */ ) + +#define mmx_r2r(op, regs, regd) \ + __asm__ __volatile__ (#op " %" #regs ", %" #regd) + +#define mmx_m2m(op, mems, memd) \ + __asm__ __volatile__ ("movq %0, %%mm0\n\t" \ + #op " %1, %%mm0\n\t" \ + "movq %%mm0, %0" \ + : "=X" (memd) \ + : "X" (mems)) + +#endif + + +/* 1x64 MOVe Quadword + (this is both a load and a store... + in fact, it is the only way to store) +*/ +#define movq_m2r(var, reg) mmx_m2r(movq, var, reg) +#define movq_r2m(reg, var) mmx_r2m(movq, reg, var) +#define movq_r2r(regs, regd) mmx_r2r(movq, regs, regd) +#define movq(vars, vard) \ + __asm__ __volatile__ ("movq %1, %%mm0\n\t" \ + "movq %%mm0, %0" \ + : "=X" (vard) \ + : "X" (vars)) + + +/* 1x32 MOVe Doubleword + (like movq, this is both load and store... + but is most useful for moving things between + mmx registers and ordinary registers) +*/ +#define movd_m2r(var, reg) mmx_m2r(movd, var, reg) +#define movd_r2m(reg, var) mmx_r2m(movd, reg, var) +#define movd_r2r(regs, regd) mmx_r2r(movd, regs, regd) +#define movd(vars, vard) \ + __asm__ __volatile__ ("movd %1, %%mm0\n\t" \ + "movd %%mm0, %0" \ + : "=X" (vard) \ + : "X" (vars)) + + +/* 2x32, 4x16, and 8x8 Parallel ADDs +*/ +#define paddd_m2r(var, reg) mmx_m2r(paddd, var, reg) +#define paddd_r2r(regs, regd) mmx_r2r(paddd, regs, regd) +#define paddd(vars, vard) mmx_m2m(paddd, vars, vard) + +#define paddw_m2r(var, reg) mmx_m2r(paddw, var, reg) +#define paddw_r2r(regs, regd) mmx_r2r(paddw, regs, regd) +#define paddw(vars, vard) mmx_m2m(paddw, vars, vard) + +#define paddb_m2r(var, reg) mmx_m2r(paddb, var, reg) +#define paddb_r2r(regs, regd) mmx_r2r(paddb, regs, regd) +#define paddb(vars, vard) mmx_m2m(paddb, vars, vard) + + +/* 4x16 and 8x8 Parallel ADDs using Saturation arithmetic +*/ +#define paddsw_m2r(var, reg) mmx_m2r(paddsw, var, reg) +#define paddsw_r2r(regs, regd) mmx_r2r(paddsw, regs, regd) +#define paddsw(vars, vard) mmx_m2m(paddsw, vars, vard) + +#define paddsb_m2r(var, reg) mmx_m2r(paddsb, var, reg) +#define paddsb_r2r(regs, regd) mmx_r2r(paddsb, regs, regd) +#define paddsb(vars, vard) mmx_m2m(paddsb, vars, vard) + + +/* 4x16 and 8x8 Parallel ADDs using Unsigned Saturation arithmetic +*/ +#define paddusw_m2r(var, reg) mmx_m2r(paddusw, var, reg) +#define paddusw_r2r(regs, regd) mmx_r2r(paddusw, regs, regd) +#define paddusw(vars, vard) mmx_m2m(paddusw, vars, vard) + +#define paddusb_m2r(var, reg) mmx_m2r(paddusb, var, reg) +#define paddusb_r2r(regs, regd) mmx_r2r(paddusb, regs, regd) +#define paddusb(vars, vard) mmx_m2m(paddusb, vars, vard) + + +/* 2x32, 4x16, and 8x8 Parallel SUBs +*/ +#define psubd_m2r(var, reg) mmx_m2r(psubd, var, reg) +#define psubd_r2r(regs, regd) mmx_r2r(psubd, regs, regd) +#define psubd(vars, vard) mmx_m2m(psubd, vars, vard) + +#define psubw_m2r(var, reg) mmx_m2r(psubw, var, reg) +#define psubw_r2r(regs, regd) mmx_r2r(psubw, regs, regd) +#define psubw(vars, vard) mmx_m2m(psubw, vars, vard) + +#define psubb_m2r(var, reg) mmx_m2r(psubb, var, reg) +#define psubb_r2r(regs, regd) mmx_r2r(psubb, regs, regd) +#define psubb(vars, vard) mmx_m2m(psubb, vars, vard) + + +/* 4x16 and 8x8 Parallel SUBs using Saturation arithmetic +*/ +#define psubsw_m2r(var, reg) mmx_m2r(psubsw, var, reg) +#define psubsw_r2r(regs, regd) mmx_r2r(psubsw, regs, regd) +#define psubsw(vars, vard) mmx_m2m(psubsw, vars, vard) + +#define psubsb_m2r(var, reg) mmx_m2r(psubsb, var, reg) +#define psubsb_r2r(regs, regd) mmx_r2r(psubsb, regs, regd) +#define psubsb(vars, vard) mmx_m2m(psubsb, vars, vard) + + +/* 4x16 and 8x8 Parallel SUBs using Unsigned Saturation arithmetic +*/ +#define psubusw_m2r(var, reg) mmx_m2r(psubusw, var, reg) +#define psubusw_r2r(regs, regd) mmx_r2r(psubusw, regs, regd) +#define psubusw(vars, vard) mmx_m2m(psubusw, vars, vard) + +#define psubusb_m2r(var, reg) mmx_m2r(psubusb, var, reg) +#define psubusb_r2r(regs, regd) mmx_r2r(psubusb, regs, regd) +#define psubusb(vars, vard) mmx_m2m(psubusb, vars, vard) + + +/* 4x16 Parallel MULs giving Low 4x16 portions of results +*/ +#define pmullw_m2r(var, reg) mmx_m2r(pmullw, var, reg) +#define pmullw_r2r(regs, regd) mmx_r2r(pmullw, regs, regd) +#define pmullw(vars, vard) mmx_m2m(pmullw, vars, vard) + + +/* 4x16 Parallel MULs giving High 4x16 portions of results +*/ +#define pmulhw_m2r(var, reg) mmx_m2r(pmulhw, var, reg) +#define pmulhw_r2r(regs, regd) mmx_r2r(pmulhw, regs, regd) +#define pmulhw(vars, vard) mmx_m2m(pmulhw, vars, vard) + + +/* 4x16->2x32 Parallel Mul-ADD + (muls like pmullw, then adds adjacent 16-bit fields + in the multiply result to make the final 2x32 result) +*/ +#define pmaddwd_m2r(var, reg) mmx_m2r(pmaddwd, var, reg) +#define pmaddwd_r2r(regs, regd) mmx_r2r(pmaddwd, regs, regd) +#define pmaddwd(vars, vard) mmx_m2m(pmaddwd, vars, vard) + + +/* 1x64 bitwise AND +*/ +#ifdef BROKEN_PAND +#define pand_m2r(var, reg) \ + { \ + mmx_m2r(pandn, (mmx_t) -1LL, reg); \ + mmx_m2r(pandn, var, reg); \ + } +#define pand_r2r(regs, regd) \ + { \ + mmx_m2r(pandn, (mmx_t) -1LL, regd); \ + mmx_r2r(pandn, regs, regd) \ + } +#define pand(vars, vard) \ + { \ + movq_m2r(vard, mm0); \ + mmx_m2r(pandn, (mmx_t) -1LL, mm0); \ + mmx_m2r(pandn, vars, mm0); \ + movq_r2m(mm0, vard); \ + } +#else +#define pand_m2r(var, reg) mmx_m2r(pand, var, reg) +#define pand_r2r(regs, regd) mmx_r2r(pand, regs, regd) +#define pand(vars, vard) mmx_m2m(pand, vars, vard) +#endif + + +/* 1x64 bitwise AND with Not the destination +*/ +#define pandn_m2r(var, reg) mmx_m2r(pandn, var, reg) +#define pandn_r2r(regs, regd) mmx_r2r(pandn, regs, regd) +#define pandn(vars, vard) mmx_m2m(pandn, vars, vard) + + +/* 1x64 bitwise OR +*/ +#define por_m2r(var, reg) mmx_m2r(por, var, reg) +#define por_r2r(regs, regd) mmx_r2r(por, regs, regd) +#define por(vars, vard) mmx_m2m(por, vars, vard) + + +/* 1x64 bitwise eXclusive OR +*/ +#define pxor_m2r(var, reg) mmx_m2r(pxor, var, reg) +#define pxor_r2r(regs, regd) mmx_r2r(pxor, regs, regd) +#define pxor(vars, vard) mmx_m2m(pxor, vars, vard) + + +/* 2x32, 4x16, and 8x8 Parallel CoMPare for EQuality + (resulting fields are either 0 or -1) +*/ +#define pcmpeqd_m2r(var, reg) mmx_m2r(pcmpeqd, var, reg) +#define pcmpeqd_r2r(regs, regd) mmx_r2r(pcmpeqd, regs, regd) +#define pcmpeqd(vars, vard) mmx_m2m(pcmpeqd, vars, vard) + +#define pcmpeqw_m2r(var, reg) mmx_m2r(pcmpeqw, var, reg) +#define pcmpeqw_r2r(regs, regd) mmx_r2r(pcmpeqw, regs, regd) +#define pcmpeqw(vars, vard) mmx_m2m(pcmpeqw, vars, vard) + +#define pcmpeqb_m2r(var, reg) mmx_m2r(pcmpeqb, var, reg) +#define pcmpeqb_r2r(regs, regd) mmx_r2r(pcmpeqb, regs, regd) +#define pcmpeqb(vars, vard) mmx_m2m(pcmpeqb, vars, vard) + + +/* 2x32, 4x16, and 8x8 Parallel CoMPare for Greater Than + (resulting fields are either 0 or -1) +*/ +#define pcmpgtd_m2r(var, reg) mmx_m2r(pcmpgtd, var, reg) +#define pcmpgtd_r2r(regs, regd) mmx_r2r(pcmpgtd, regs, regd) +#define pcmpgtd(vars, vard) mmx_m2m(pcmpgtd, vars, vard) + +#define pcmpgtw_m2r(var, reg) mmx_m2r(pcmpgtw, var, reg) +#define pcmpgtw_r2r(regs, regd) mmx_r2r(pcmpgtw, regs, regd) +#define pcmpgtw(vars, vard) mmx_m2m(pcmpgtw, vars, vard) + +#define pcmpgtb_m2r(var, reg) mmx_m2r(pcmpgtb, var, reg) +#define pcmpgtb_r2r(regs, regd) mmx_r2r(pcmpgtb, regs, regd) +#define pcmpgtb(vars, vard) mmx_m2m(pcmpgtb, vars, vard) + + +/* 1x64, 2x32, and 4x16 Parallel Shift Left Logical +*/ +#define psllq_i2r(imm, reg) mmx_i2r(psllq, imm, reg) +#define psllq_m2r(var, reg) mmx_m2r(psllq, var, reg) +#define psllq_r2r(regs, regd) mmx_r2r(psllq, regs, regd) +#define psllq(vars, vard) mmx_m2m(psllq, vars, vard) + +#define pslld_i2r(imm, reg) mmx_i2r(pslld, imm, reg) +#define pslld_m2r(var, reg) mmx_m2r(pslld, var, reg) +#define pslld_r2r(regs, regd) mmx_r2r(pslld, regs, regd) +#define pslld(vars, vard) mmx_m2m(pslld, vars, vard) + +#define psllw_i2r(imm, reg) mmx_i2r(psllw, imm, reg) +#define psllw_m2r(var, reg) mmx_m2r(psllw, var, reg) +#define psllw_r2r(regs, regd) mmx_r2r(psllw, regs, regd) +#define psllw(vars, vard) mmx_m2m(psllw, vars, vard) + + +/* 1x64, 2x32, and 4x16 Parallel Shift Right Logical +*/ +#define psrlq_i2r(imm, reg) mmx_i2r(psrlq, imm, reg) +#define psrlq_m2r(var, reg) mmx_m2r(psrlq, var, reg) +#define psrlq_r2r(regs, regd) mmx_r2r(psrlq, regs, regd) +#define psrlq(vars, vard) mmx_m2m(psrlq, vars, vard) + +#define psrld_i2r(imm, reg) mmx_i2r(psrld, imm, reg) +#define psrld_m2r(var, reg) mmx_m2r(psrld, var, reg) +#define psrld_r2r(regs, regd) mmx_r2r(psrld, regs, regd) +#define psrld(vars, vard) mmx_m2m(psrld, vars, vard) + +#define psrlw_i2r(imm, reg) mmx_i2r(psrlw, imm, reg) +#define psrlw_m2r(var, reg) mmx_m2r(psrlw, var, reg) +#define psrlw_r2r(regs, regd) mmx_r2r(psrlw, regs, regd) +#define psrlw(vars, vard) mmx_m2m(psrlw, vars, vard) + + +/* 2x32 and 4x16 Parallel Shift Right Arithmetic +*/ +#define psrad_i2r(imm, reg) mmx_i2r(psrad, imm, reg) +#define psrad_m2r(var, reg) mmx_m2r(psrad, var, reg) +#define psrad_r2r(regs, regd) mmx_r2r(psrad, regs, regd) +#define psrad(vars, vard) mmx_m2m(psrad, vars, vard) + +#define psraw_i2r(imm, reg) mmx_i2r(psraw, imm, reg) +#define psraw_m2r(var, reg) mmx_m2r(psraw, var, reg) +#define psraw_r2r(regs, regd) mmx_r2r(psraw, regs, regd) +#define psraw(vars, vard) mmx_m2m(psraw, vars, vard) + + +/* 2x32->4x16 and 4x16->8x8 PACK and Signed Saturate + (packs source and dest fields into dest in that order) +*/ +#define packssdw_m2r(var, reg) mmx_m2r(packssdw, var, reg) +#define packssdw_r2r(regs, regd) mmx_r2r(packssdw, regs, regd) +#define packssdw(vars, vard) mmx_m2m(packssdw, vars, vard) + +#define packsswb_m2r(var, reg) mmx_m2r(packsswb, var, reg) +#define packsswb_r2r(regs, regd) mmx_r2r(packsswb, regs, regd) +#define packsswb(vars, vard) mmx_m2m(packsswb, vars, vard) + + +/* 4x16->8x8 PACK and Unsigned Saturate + (packs source and dest fields into dest in that order) +*/ +#define packuswb_m2r(var, reg) mmx_m2r(packuswb, var, reg) +#define packuswb_r2r(regs, regd) mmx_r2r(packuswb, regs, regd) +#define packuswb(vars, vard) mmx_m2m(packuswb, vars, vard) + + +/* 2x32->1x64, 4x16->2x32, and 8x8->4x16 UNPaCK Low + (interleaves low half of dest with low half of source + as padding in each result field) +*/ +#define punpckldq_m2r(var, reg) mmx_m2r(punpckldq, var, reg) +#define punpckldq_r2r(regs, regd) mmx_r2r(punpckldq, regs, regd) +#define punpckldq(vars, vard) mmx_m2m(punpckldq, vars, vard) + +#define punpcklwd_m2r(var, reg) mmx_m2r(punpcklwd, var, reg) +#define punpcklwd_r2r(regs, regd) mmx_r2r(punpcklwd, regs, regd) +#define punpcklwd(vars, vard) mmx_m2m(punpcklwd, vars, vard) + +#define punpcklbw_m2r(var, reg) mmx_m2r(punpcklbw, var, reg) +#define punpcklbw_r2r(regs, regd) mmx_r2r(punpcklbw, regs, regd) +#define punpcklbw(vars, vard) mmx_m2m(punpcklbw, vars, vard) + + +/* 2x32->1x64, 4x16->2x32, and 8x8->4x16 UNPaCK High + (interleaves high half of dest with high half of source + as padding in each result field) +*/ +#define punpckhdq_m2r(var, reg) mmx_m2r(punpckhdq, var, reg) +#define punpckhdq_r2r(regs, regd) mmx_r2r(punpckhdq, regs, regd) +#define punpckhdq(vars, vard) mmx_m2m(punpckhdq, vars, vard) + +#define punpckhwd_m2r(var, reg) mmx_m2r(punpckhwd, var, reg) +#define punpckhwd_r2r(regs, regd) mmx_r2r(punpckhwd, regs, regd) +#define punpckhwd(vars, vard) mmx_m2m(punpckhwd, vars, vard) + +#define punpckhbw_m2r(var, reg) mmx_m2r(punpckhbw, var, reg) +#define punpckhbw_r2r(regs, regd) mmx_r2r(punpckhbw, regs, regd) +#define punpckhbw(vars, vard) mmx_m2m(punpckhbw, vars, vard) + + +/* Empty MMx State + (used to clean-up when going from mmx to float use + of the registers that are shared by both; note that + there is no float-to-mmx operation needed, because + only the float tag word info is corruptible) +*/ +#ifdef MMX_TRACE + +#define emms() \ + { \ + printf("emms()\n"); \ + __asm__ __volatile__ ("emms"); \ + } + +#else + +#define emms() __asm__ __volatile__ ("emms") + +#endif + +#endif + diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/filter_test/px_py_calc.c kodi-visualization-goom-2.1.0/lib/goom/src/filter_test/px_py_calc.c --- kodi-visualization-goom-1.1.0/lib/goom/src/filter_test/px_py_calc.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/filter_test/px_py_calc.c 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,94 @@ +#include "mmx.h" + +int testD [] = {0x1200, 0x2011, 0, 0x12, 0x5331, 0x8000}; +int testS [] = {0x1205, 0x11, 0x4210, 0x412, 0x121, 0x1211}; + +int ratios [] = {0x8000, 0x4000, 0x1234, 0x6141, 0xffff, 0}; + +int main () { + int nbERROR = 0; + int i,j; + volatile mmx_t ratiox; + + volatile mmx_t sortie; + + /* creation des variables de test */ + volatile int buffratio = 0x8000; + volatile int loop = 0; + volatile int *buffS; + volatile int *buffD; + buffS = malloc (256); + buffD = malloc (256); + + buffS = buffS + (unsigned)buffS % 64; + buffD = buffD + (unsigned)buffD % 64; + + for (j=0;j<6;j++) + for (i=0;i<3;i++) { + + buffratio = ratios[j]; + + buffS[0] = testS[i<<1]; + buffS[1] = testS[(i<<1)+1]; + + buffD[0] = testD[i*2]; + buffD[1] = testD[i*2+1]; + + /* code */ + + ratiox.d[0] = buffratio; + ratiox.d[1] = buffratio; + movq_m2r (ratiox, mm6); + pslld_i2r (16,mm6); + + /* |0hhhhhhh|llllvvvv| + x |00000000|bbbbbbbb| + ================= + |.bl.high|..bl.low| + + |..bh.low|00000000| + ================= + result1 + */ + + /* + * pre : mm6 = [buffratio<<16|buffratio<<16] + */ + + movq_m2r (buffS[loop],mm0); /* mm0 = S */ + movq_m2r (buffD[loop],mm1); /* mm1 = D */ + psubd_r2r (mm0,mm1); /* mm1 = D - S */ + movq_r2r (mm1, mm2); /* mm2 = D - S */ + + pslld_i2r (16,mm1); + mmx_r2r (pmulhuw, mm6, mm1); /* mm1 = ?? */ + pmullw_r2r (mm6, mm2); + + paddd_r2r (mm2, mm1); /* mm1 = (D - S) * buffratio >> 16 */ + pslld_i2r (16,mm0); + + paddd_r2r (mm1, mm0); /* mm0 = S + mm1 */ + psrld_i2r (16, mm0); + movq_r2m (mm0, sortie); + + /* + * post : mm0 = S + ((D-S)*buffratio)>>16 + * modified = mm0,mm1,mm2 + */ + + if ( + (buffS[0] + (((buffD[0]-buffS[0]) * buffratio)>>16) != sortie.d[0]) + | (buffS[1] + (((buffD[1]-buffS[1]) * buffratio)>>16) != sortie.d[1])) + { + nbERROR++; + printf ("\ns : (0x%08x,0x%08x)\n", buffS[0], buffS[1]); + printf ("d : (0x%08x,0x%08x)\n", buffD[0], buffD[1]); + printf ("ratio : (0x%08x,0x%08x)\n", buffratio, buffratio); + + printf ("en mmx : (0x%08x,0x%08x)\n", sortie.d[0], sortie.d[1]); + printf ("en c : (0x%08x,0x%08x)\n", + buffS[0] + (((buffD[0]-buffS[0]) * buffratio)>>16), + buffS[1] + (((buffD[1]-buffS[1]) * buffratio)>>16)); + } + } + printf ("%d errors\n",nbERROR); +} diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/filter_test/zoom_filter_mmx.c kodi-visualization-goom-2.1.0/lib/goom/src/filter_test/zoom_filter_mmx.c --- kodi-visualization-goom-1.1.0/lib/goom/src/filter_test/zoom_filter_mmx.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/filter_test/zoom_filter_mmx.c 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,186 @@ + +#define BUFFPOINTNB 16 +#define BUFFPOINTMASK 0xffff +#define BUFFINCR 0xff + +#define sqrtperte 16 +// faire : a % sqrtperte <=> a & pertemask +#define PERTEMASK 0xf +// faire : a / sqrtperte <=> a >> PERTEDEC +#define PERTEDEC 4 + +//#define MMX_TRACE +#include "mmx.h" + +void zoom_filter_mmx (int prevX, int prevY, + unsigned int *expix1, unsigned int *expix2, + int *lbruS, int *lbruD, int buffratio, + int precalCoef[16][16]) +{ + int bufsize = prevX * prevY; /* taille du buffer */ + volatile int loop; /* variable de boucle */ + + mmx_t *brutS = (mmx_t*)lbruS; /* buffer de transformation source */ + mmx_t *brutD = (mmx_t*)lbruD; /* buffer de transformation dest */ + + int pos; + + volatile mmx_t prevXY; + volatile mmx_t ratiox; + volatile mmx_t interpix; + + volatile mmx_t mask; /* masque des nombres a virgules */ + mask.ud[0] = BUFFPOINTMASK; + mask.ud[1] = BUFFPOINTMASK; + + prevXY.ud[0] = (prevX-1)<>16 format [X|Y] + * modified = mm0,mm1,mm2 + */ + + movq_m2r (brutS[loop],mm0); /* mm0 = S */ + movq_m2r (brutD[loop],mm1); /* mm1 = D */ + psubd_r2r (mm0,mm1); /* mm1 = D - S */ + movq_r2r (mm1, mm2); /* mm2 = D - S */ + + pslld_i2r (16,mm1); + mmx_r2r (pmulhuw, mm6, mm1); /* mm1 = ?? */ + pmullw_r2r (mm6, mm2); + + paddd_r2r (mm2, mm1); /* mm1 = (D - S) * buffratio >> 16 */ + pslld_i2r (16,mm0); + + paddd_r2r (mm1, mm0); /* mm0 = S + mm1 */ + psrld_i2r (16, mm0); + + /* + * pre : mm0 : position vector on screen + * prevXY : coordinate of the lower-right point on screen + * post : clipped mm0 + * modified : mm0,mm1 + */ + movq_m2r (prevXY,mm1); + pcmpgtd_r2r (mm0, mm1); /* mm0 en X contient : + 1111 si prevXY > px + 0000 si prevXY <= px + (idem pour y) */ + pand_r2r (mm1, mm0); /* on met a zero la partie qui deborde */ + + + /* + * pre : mm0 : clipped position on screen + * post : mm6 : coefs for this position + * mm1 : X vector [0|X] + * modif : eax,ebx + */ + __asm__ __volatile__ ( + "movq %%mm0,%%mm1\n" + "movd %%mm0,%%eax\n" + "psrlq $32,%%mm1\n" + "movd %%mm1,%%ebx\n" + "and $15,%%eax\n" + "and $15,%%ebx\n" + "add %0,%%eax\n" + "movd (%%eax,%%ebx,$16),%%mm6\n" + ::"X"(precalCoef):"eax","ebx"); + + /* + * pre : mm0 : Y pos [*|Y] + * mm1 : X pos [*|X] + * post : eax : absolute position of the source pixel. + * modif : ebx + */ + psrld_i2r (PERTEDEC,mm0); + psrld_i2r (PERTEDEC,mm1); + __asm__ __volatile__ ( + "movd %%mm1,%%eax\n" +// "movl %1,%%ebx\n" + "mull %1\n" + "movd %%mm0,%%ebx\n" + "addl %%ebx,%%eax\n" + "movl %%eax,%0\n" + :"=X"(pos):"X"(prevX):"eax","ebx" + ); + + expix2[loop] = expix1[pos]; + /* + * coeffs = precalCoef [px & PERTEMASK][py & PERTEMASK]; + * coef en modulo 15 * + * pos = ((px>>PERTEMASK) + prevX * (py>>PERTEMASK)); + */ +// precal + eax + ebx * 16 + +// movd_m2r (precalCoef[interpix.d[0]][interpix.d[1]],mm6); + + /* recuperation des deux premiers pixels dans mm0 et mm1 */ +// movq_m2r (/*expix1[pos]*/a, mm0); /* b1-v1-r1-a1-b2-v2-r2-a2 */ +// movq_r2r (mm0, mm1); /* b1-v1-r1-a1-b2-v2-r2-a2 */ + + /* depackage du premier pixel */ +// punpcklbw_r2r (mm7, mm0); /* 00-b2-00-v2-00-r2-00-a2 */ + +// movq_r2r (mm6, mm5); /* ??-??-??-??-c4-c3-c2-c1 */ + /* depackage du 2ieme pixel */ +// punpckhbw_r2r (mm7, mm1); /* 00-b1-00-v1-00-r1-00-a1 */ + + /* extraction des coefficients... */ +// punpcklbw_r2r (mm5, mm6); /* c4-c4-c3-c3-c2-c2-c1-c1 */ +// movq_r2r (mm6, mm4); /* c4-c4-c3-c3-c2-c2-c1-c1 */ +// movq_r2r (mm6, mm5); /* c4-c4-c3-c3-c2-c2-c1-c1 */ + +// punpcklbw_r2r (mm5, mm6); /* c2-c2-c2-c2-c1-c1-c1-c1 */ +// punpckhbw_r2r (mm5, mm4); /* c4-c4-c4-c4-c3-c3-c3-c3 */ + +// movq_r2r (mm6, mm3); /* c2-c2-c2-c2-c1-c1-c1-c1 */ +// punpcklbw_r2r (mm7, mm6); /* 00-c1-00-c1-00-c1-00-c1 */ +// punpckhbw_r2r (mm7, mm3); /* 00-c2-00-c2-00-c2-00-c2 */ + + /* multiplication des pixels par les coefficients */ +// pmullw_r2r (mm6, mm0); /* c1*b2-c1*v2-c1*r2-c1*a2 */ +// pmullw_r2r (mm3, mm1); /* c2*b1-c2*v1-c2*r1-c2*a1 */ +// paddw_r2r (mm1, mm0); + + /* ...extraction des 2 derniers coefficients */ +// movq_r2r (mm4, mm5); /* c4-c4-c4-c4-c3-c3-c3-c3 */ +// punpcklbw_r2r (mm7, mm4); /* 00-c3-00-c3-00-c3-00-c3 */ +// punpckhbw_r2r (mm7, mm5); /* 00-c4-00-c4-00-c4-00-c4 */ + + /* recuperation des 2 derniers pixels */ +// movq_m2r (a/*expix1[pos+largeur]*/, mm1); +// movq_r2r (mm1, mm2); + + /* depackage des pixels */ +// punpcklbw_r2r (mm7, mm1); +// punpckhbw_r2r (mm7, mm2); + + /* multiplication pas les coeffs */ +// pmullw_r2r (mm4, mm1); +// pmullw_r2r (mm5, mm2); + + /* ajout des valeurs obtenues la valeur finale */ +// paddw_r2r (mm1, mm0); +// paddw_r2r (mm2, mm0); + + /* division par 256 = 16+16+16+16, puis repackage du pixel final */ +// psrlw_i2r (8, mm0); +// packuswb_r2r (mm7, mm0); + +// movd_r2m (mm0,expix2[loop]); + + // expix2[loop] = couleur; + } + emms(); /* __asm__ __volatile__ ("emms"); */ +} diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/filter_test/zoom_filter_mmx-v0.c kodi-visualization-goom-2.1.0/lib/goom/src/filter_test/zoom_filter_mmx-v0.c --- kodi-visualization-goom-1.1.0/lib/goom/src/filter_test/zoom_filter_mmx-v0.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/filter_test/zoom_filter_mmx-v0.c 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,202 @@ + +#define BUFFPOINTNB 16 +#define BUFFPOINTMASK 0xffff +#define BUFFINCR 0xff + +#define sqrtperte 16 +// faire : a % sqrtperte <=> a & pertemask +#define PERTEMASK 0xf +// faire : a / sqrtperte <=> a >> PERTEDEC +#define PERTEDEC 4 + +//#define MMX_TRACE +#include "mmx.h" + +void zoom_filter_mmx (int prevX, int prevY, + unsigned int *expix1, unsigned int *expix2, + int *lbruS, int *lbruD, int buffratio, + int precalCoef[16][16]) +{ + int bufsize = prevX * prevY; /* taille du buffer */ + volatile int loop; /* variable de boucle */ + + mmx_t *brutS = (mmx_t*)lbruS; /* buffer de transformation source */ + mmx_t *brutD = (mmx_t*)lbruD; /* buffer de transformation dest */ + + volatile mmx_t prevXY; + volatile mmx_t ratiox; + volatile mmx_t interpix; + + volatile mmx_t mask; /* masque des nombres a virgules */ + mask.ud[0] = BUFFPOINTMASK; + mask.ud[1] = BUFFPOINTMASK; + + prevXY.ud[0] = (prevX-1)<>16 format [X|Y] + * modified = mm0,mm1,mm2 + */ + + __asm__ __volatile__ ( + "movq %0,%%mm0\n" + "movq %1,%%mm1\n" + : :"X"(brutS[loop]),"X"(brutD[loop]) + ); /* mm0 = S */ + + psubd_r2r (mm0,mm1); /* mm1 = D - S */ + movq_r2r (mm1, mm2); /* mm2 = D - S */ + + pslld_i2r (16,mm1); + mmx_r2r (pmulhuw, mm6, mm1); /* mm1 = ?? */ + pmullw_r2r (mm6, mm2); + + paddd_r2r (mm2, mm1); /* mm1 = (D - S) * buffratio >> 16 */ + pslld_i2r (16,mm0); + + paddd_r2r (mm1, mm0); /* mm0 = S + mm1 */ + psrld_i2r (16, mm0); + + /* + * pre : mm0 : position vector on screen + * prevXY : coordinate of the lower-right point on screen + * post : clipped mm0 + * modified : mm0,mm1,mm2 + */ + movq_m2r (prevXY,mm1); + pcmpgtd_r2r (mm0, mm1); /* mm0 en X contient : + 1111 si prevXY > px + 0000 si prevXY <= px + (idem pour y) */ + movq_r2r (mm1,mm2); + punpckldq_r2r (mm1,mm1); + punpckhdq_r2r (mm2,mm2); + pand_r2r (mm1, mm0); /* on met a zero la partie qui deborde */ + pand_r2r (mm2, mm0); /* on met a zero la partie qui deborde */ + + /* + * pre : mm0 : clipped position on screen + * post : mm6 : coefs for this position + * mm1 : X vector [0|X] + * modif : eax,ebx + */ + __asm__ __volatile__ ( + "movq %%mm0,%%mm1\n" + "movd %%mm0,%%ebx\n" + "psrlq $32,%%mm1\n" + "movd %%mm1,%%eax\n" + "andl $15,%%eax\n" + "andl $15,%%ebx\n" + + "shll $2,%%eax\n" + "shll $3,%%ebx\n" + + "addl %0,%%eax\n" + + "movd (%%eax,%%ebx,8),%%mm6\n" + ::"X"(precalCoef):"eax","ebx"); + + /* + * pre : mm0 : Y pos [*|Y] + * mm1 : X pos [*|X] + * post : eax : absolute position of the source pixel. + * modif : ebx + */ + psrld_i2r (PERTEDEC,mm0); + psrld_i2r (PERTEDEC,mm1); + __asm__ __volatile__ ( + "movd %%mm1,%%eax\n" + "mull %1\n" + "movd %%mm0,%%ebx\n" + "addl %%ebx,%%eax\n" + "movl %0,%%ebx\n" + "movq (%%ebx,%%eax,4),%%mm0\n" + "addl %1,%%eax\n" + "movq (%%ebx,%%eax,4),%%mm2\n" + + : : "X"(expix1), "X"(prevX):"eax","ebx" + ); + + /* + * coeffs = precalCoef [px & PERTEMASK][py & PERTEMASK]; + * coef en modulo 15 * + * pos = ((px>>PERTEMASK) + prevX * (py>>PERTEMASK)); + */ + + /* recuperation des deux premiers pixels dans mm0 et mm1 */ +// movq_m2r (expix1[pos], mm0); /* b1-v1-r1-a1-b2-v2-r2-a2 */ + movq_r2r (mm0, mm1); /* b1-v1-r1-a1-b2-v2-r2-a2 */ + + /* recuperation des 2 derniers pixels */ +// movq_m2r (expix1[pos+prevX], mm2); + + /* depackage du premier pixel */ + punpcklbw_r2r (mm7, mm0); /* 00-b2-00-v2-00-r2-00-a2 */ + + movq_r2r (mm6, mm5); /* ??-??-??-??-c4-c3-c2-c1 */ + /* depackage du 2ieme pixel */ + punpckhbw_r2r (mm7, mm1); /* 00-b1-00-v1-00-r1-00-a1 */ + + /* extraction des coefficients... */ + punpcklbw_r2r (mm5, mm6); /* c4-c4-c3-c3-c2-c2-c1-c1 */ + movq_r2r (mm6, mm4); /* c4-c4-c3-c3-c2-c2-c1-c1 */ + movq_r2r (mm6, mm5); /* c4-c4-c3-c3-c2-c2-c1-c1 */ + + punpcklbw_r2r (mm5, mm6); /* c2-c2-c2-c2-c1-c1-c1-c1 */ + punpckhbw_r2r (mm5, mm4); /* c4-c4-c4-c4-c3-c3-c3-c3 */ + + movq_r2r (mm6, mm3); /* c2-c2-c2-c2-c1-c1-c1-c1 */ + punpcklbw_r2r (mm7, mm6); /* 00-c1-00-c1-00-c1-00-c1 */ + punpckhbw_r2r (mm7, mm3); /* 00-c2-00-c2-00-c2-00-c2 */ + + /* multiplication des pixels par les coefficients */ + pmullw_r2r (mm6, mm0); /* c1*b2-c1*v2-c1*r2-c1*a2 */ + pmullw_r2r (mm3, mm1); /* c2*b1-c2*v1-c2*r1-c2*a1 */ + paddw_r2r (mm1, mm0); + + /* ...extraction des 2 derniers coefficients */ + movq_r2r (mm4, mm5); /* c4-c4-c4-c4-c3-c3-c3-c3 */ + punpcklbw_r2r (mm7, mm4); /* 00-c3-00-c3-00-c3-00-c3 */ + punpckhbw_r2r (mm7, mm5); /* 00-c4-00-c4-00-c4-00-c4 */ + + /* recuperation des 2 derniers pixels */ + movq_r2r (mm2, mm1); + + /* depackage des pixels */ + punpcklbw_r2r (mm7, mm1); + punpckhbw_r2r (mm7, mm2); + + /* multiplication pas les coeffs */ + pmullw_r2r (mm4, mm1); + pmullw_r2r (mm5, mm2); + + /* ajout des valeurs obtenues la valeur finale */ + paddw_r2r (mm1, mm0); + paddw_r2r (mm2, mm0); + + /* division par 256 = 16+16+16+16, puis repackage du pixel final */ + psrlw_i2r (8, mm0); + packuswb_r2r (mm7, mm0); + + movd_r2m (mm0,expix2[loop]); + + // expix2[loop] = couleur; + ++loop; + } + emms(); /* __asm__ __volatile__ ("emms"); */ +} diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/flying_stars_fx.c kodi-visualization-goom-2.1.0/lib/goom/src/flying_stars_fx.c --- kodi-visualization-goom-1.1.0/lib/goom/src/flying_stars_fx.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/flying_stars_fx.c 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,316 @@ +#include "goom_fx.h" +#include "goom_plugin_info.h" +#include "goom_tools.h" + +#include "mathtools.h" + +/* TODO:-- FAIRE PROPREMENT... BOAH... */ +#define NCOL 15 + +/*static const int colval[] = { +0xfdf6f5, +0xfae4e4, +0xf7d1d1, +0xf3b6b5, +0xefa2a2, +0xec9190, +0xea8282, +0xe87575, +0xe46060, +0xe14b4c, +0xde3b3b, +0xdc2d2f, +0xd92726, +0xd81619, +0xd50c09, +0 +}; +*/ +static const int colval[] = { + 0x1416181a, + 0x1419181a, + 0x141f181a, + 0x1426181a, + 0x142a181a, + 0x142f181a, + 0x1436181a, + 0x142f1819, + 0x14261615, + 0x13201411, + 0x111a100a, + 0x0c180508, + 0x08100304, + 0x00050101, + 0x0 +}; + + +/* The different modes of the visual FX. + * Put this values on fx_mode */ +#define FIREWORKS_FX 0 +#define RAIN_FX 1 +#define FOUNTAIN_FX 2 +#define LAST_FX 3 + +typedef struct _FS_STAR { + float x,y; + float vx,vy; + float ax,ay; + float age,vage; +} Star; + +typedef struct _FS_DATA{ + + int fx_mode; + int nbStars; + + int maxStars; + Star *stars; + + float min_age; + float max_age; + + PluginParam min_age_p; + PluginParam max_age_p; + PluginParam nbStars_p; + PluginParam nbStars_limit_p; + PluginParam fx_mode_p; + + PluginParameters params; +} FSData; + +static void fs_init(VisualFX *_this, PluginInfo *info) { + + FSData *data; + data = (FSData*)malloc(sizeof(FSData)); + + data->fx_mode = FIREWORKS_FX; + data->maxStars = 4096; + data->stars = (Star*)malloc(data->maxStars * sizeof(Star)); + data->nbStars = 0; + + data->max_age_p = secure_i_param ("Fireworks Smallest Bombs"); + IVAL(data->max_age_p) = 80; + IMIN(data->max_age_p) = 0; + IMAX(data->max_age_p) = 100; + ISTEP(data->max_age_p) = 1; + + data->min_age_p = secure_i_param ("Fireworks Largest Bombs"); + IVAL(data->min_age_p) = 99; + IMIN(data->min_age_p) = 0; + IMAX(data->min_age_p) = 100; + ISTEP(data->min_age_p) = 1; + + data->nbStars_limit_p = secure_i_param ("Max Number of Particules"); + IVAL(data->nbStars_limit_p) = 512; + IMIN(data->nbStars_limit_p) = 0; + IMAX(data->nbStars_limit_p) = data->maxStars; + ISTEP(data->nbStars_limit_p) = 64; + + data->fx_mode_p = secure_i_param ("FX Mode"); + IVAL(data->fx_mode_p) = data->fx_mode; + IMIN(data->fx_mode_p) = 1; + IMAX(data->fx_mode_p) = 3; + ISTEP(data->fx_mode_p) = 1; + + data->nbStars_p = secure_f_feedback ("Number of Particules (% of Max)"); + + data->params = plugin_parameters ("Particule System", 7); + data->params.params[0] = &data->fx_mode_p; + data->params.params[1] = &data->nbStars_limit_p; + data->params.params[2] = 0; + data->params.params[3] = &data->min_age_p; + data->params.params[4] = &data->max_age_p; + data->params.params[5] = 0; + data->params.params[6] = &data->nbStars_p; + + _this->params = &data->params; + _this->fx_data = (void*)data; +} + +static void fs_free(VisualFX *_this) { + FSData *data = (FSData*)_this->fx_data; + free (data->stars); + free (data->params.params); + free (data); +} + + +/** + * Cree une nouvelle 'bombe', c'est a dire une particule appartenant a une fusee d'artifice. + */ +static void addABomb (FSData *fs, int mx, int my, float radius, float vage, float gravity, PluginInfo *info) { + + int i = fs->nbStars; + float ro; + int theta; + + if (fs->nbStars >= fs->maxStars) + return; + fs->nbStars++; + + fs->stars[i].x = mx; + fs->stars[i].y = my; + + ro = radius * (float)goom_irand(info->gRandom,100) / 100.0f; + ro *= (float)goom_irand(info->gRandom,100)/100.0f + 1.0f; + theta = goom_irand(info->gRandom,256); + + fs->stars[i].vx = ro * cos256[theta]; + fs->stars[i].vy = -0.2f + ro * sin256[theta]; + + fs->stars[i].ax = 0; + fs->stars[i].ay = gravity; + + fs->stars[i].age = 0; + if (vage < fs->min_age) + vage=fs->min_age; + fs->stars[i].vage = vage; +} + + +/** + * Met a jour la position et vitesse d'une particule. + */ +static void updateStar (Star *s) { + s->x+=s->vx; + s->y+=s->vy; + s->vx+=s->ax; + s->vy+=s->ay; + s->age+=s->vage; +} + + +/** + * Ajoute de nouvelles particules au moment d'un evenement sonore. + */ +static void fs_sound_event_occured(VisualFX *_this, PluginInfo *info) { + + FSData *data = (FSData*)_this->fx_data; + int i; + + int max = (int)((1.0f+info->sound.goomPower)*goom_irand(info->gRandom,150)) + 100; + float radius = (1.0f+info->sound.goomPower) * (float)(goom_irand(info->gRandom,150)+50)/300; + int mx; + int my; + float vage, gravity = 0.02f; + + switch (data->fx_mode) { + case FIREWORKS_FX: + { + double dx,dy; + do { + mx = goom_irand(info->gRandom,info->screen.width); + my = goom_irand(info->gRandom,info->screen.height); + dx = (mx - info->screen.width/2); + dy = (my - info->screen.height/2); + } while (dx*dx + dy*dy < (info->screen.height/2)*(info->screen.height/2)); + vage = data->max_age * (1.0f - info->sound.goomPower); + } + break; + case RAIN_FX: + mx = goom_irand(info->gRandom,info->screen.width); + if (mx > info->screen.width/2) + mx = info->screen.width; + else + mx = 0; + my = -(info->screen.height/3)-goom_irand(info->gRandom,info->screen.width/3); + radius *= 1.5; + vage = 0.002f; + break; + case FOUNTAIN_FX: + my = info->screen.height+2; + vage = 0.001f; + radius += 1.0f; + mx = info->screen.width / 2; + gravity = 0.04f; + break; + default: + return; + /* my = i R A N D (info->screen.height); vage = 0.01f; */ + } + + radius *= info->screen.height / 200.0f; /* why 200 ? because the FX was developped on 320x200 */ + max *= info->screen.height / 200.0f; + + if (info->sound.timeSinceLastBigGoom < 1) { + radius *= 1.5; + max *= 2; + } + for (i=0;ifx_data; + + /* Get the new parameters values */ + data->min_age = 1.0f - (float)IVAL(data->min_age_p)/100.0f; + data->max_age = 1.0f - (float)IVAL(data->max_age_p)/100.0f; + FVAL(data->nbStars_p) = (float)data->nbStars / (float)data->maxStars; + data->nbStars_p.change_listener(&data->nbStars_p); + data->maxStars = IVAL(data->nbStars_limit_p); + data->fx_mode = IVAL(data->fx_mode_p); + + /* look for events */ + if (info->sound.timeSinceLastGoom < 1) { + fs_sound_event_occured(_this, info); + if (goom_irand(info->gRandom,20)==1) { + IVAL(data->fx_mode_p) = goom_irand(info->gRandom,(LAST_FX*3)); + data->fx_mode_p.change_listener(&data->fx_mode_p); + } + } + + /* update particules */ + for (i=0;inbStars;++i) { + updateStar(&data->stars[i]); + + /* dead particule */ + if (data->stars[i].age>=NCOL) + continue; + + /* choose the color of the particule */ + col = colval[(int)data->stars[i].age]; + + /* draws the particule */ + info->methods.draw_line(dest,(int)data->stars[i].x,(int)data->stars[i].y, + (int)(data->stars[i].x-data->stars[i].vx*6), + (int)(data->stars[i].y-data->stars[i].vy*6), + col, + (int)info->screen.width, (int)info->screen.height); + info->methods.draw_line(dest,(int)data->stars[i].x,(int)data->stars[i].y, + (int)(data->stars[i].x-data->stars[i].vx*2), + (int)(data->stars[i].y-data->stars[i].vy*2), + col, + (int)info->screen.width, (int)info->screen.height); + } + + /* look for dead particules */ + for (i=0;inbStars;) { + + if ((data->stars[i].x > info->screen.width + 64) + ||((data->stars[i].vy>=0)&&(data->stars[i].y - 16*data->stars[i].vy > info->screen.height)) + ||(data->stars[i].x < -64) + ||(data->stars[i].age>=NCOL)) { + data->stars[i] = data->stars[data->nbStars-1]; + data->nbStars--; + } + else ++i; + } +} + +VisualFX flying_star_create(void) { + VisualFX vfx; + vfx.init = fs_init; + vfx.free = fs_free; + vfx.apply = fs_apply; + vfx.fx_data = 0; + return vfx; +} diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/gfontlib.c kodi-visualization-goom-2.1.0/lib/goom/src/gfontlib.c --- kodi-visualization-goom-1.1.0/lib/goom/src/gfontlib.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/gfontlib.c 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,231 @@ +#include "goom_config.h" +#include "gfontrle.h" +#include "gfontlib.h" +#include +#include + +static Pixel ***font_chars; +static int *font_width; +static int *font_height; +static Pixel ***small_font_chars; +static int *small_font_width; +static int *small_font_height; + +void gfont_load (void) { + unsigned char *gfont; + unsigned int i = 0, j = 0; + unsigned int nba = 0; + unsigned int current = 32; + int *font_pos; + /* decompress le rle */ + + + + gfont = malloc (the_font.width*the_font.height*the_font.bytes_per_pixel); + while (i>2)<<(ROUGE*8))| + (((g1 + g2 + g3 + g4)>>2)<<(VERT*8))| + (((b1 + b2 + b3 + b4)>>2)<<(BLEU*8))| + (((a1 + a2 + a3 + a4)>>2)<<(ALPHA*8)); + } + } + } + + /* definir les lettres restantes */ + + for (i=0;i<256;i++) { + if (font_chars[i]==0) { + font_chars[i]=font_chars[42]; + small_font_chars[i]=small_font_chars[42]; + font_width[i]=font_width[42]; + font_pos[i]=font_pos[42]; + font_height[i]=font_height[42]; + small_font_width[i]=small_font_width[42]; + small_font_height[i]=small_font_height[42]; + } + } + + font_width [32] = (the_font.height / 2) - 1; + small_font_width [32] = font_width [32]/2; + font_chars [32] = 0; + small_font_chars [32] = 0; + free( gfont ); + free( font_pos ); +} + +void goom_draw_text (Pixel * buf,int resolx,int resoly, + int x, int y, + const char *str, float charspace, int center) { + float fx = (float) x; + int fin = 0; + + Pixel ***cur_font_chars; + int *cur_font_width; + int *cur_font_height; + + if (resolx>320) + { + /* printf("use big\n"); */ + cur_font_chars = font_chars; + cur_font_width = font_width; + cur_font_height = font_height; + } + else + { + /* printf ("use small\n"); */ + cur_font_chars = small_font_chars; + cur_font_width = small_font_width; + cur_font_height = small_font_height; + } + + if (cur_font_chars == NULL) + return ; + + if (center) { + unsigned char *tmp = (unsigned char*)str; + float lg = -charspace; + + while (*tmp != '\0') + lg += cur_font_width[*(tmp++)] + charspace; + + fx -= lg / 2; + } + + while (!fin) { + unsigned char c = *str; + + x = (int) fx; + + if (c == '\0') + fin = 1; + else if (cur_font_chars[c]==0) { + fx += cur_font_width[c] + charspace; + } + else { + int xx, yy; + int xmin = x; + int xmax = x + cur_font_width[c]; + int ymin = y - cur_font_height[c]; + int ymax = y; + + yy = ymin; + + if (xmin < 0) + xmin = 0; + + if (xmin >= resolx - 1) + return; + + if (xmax >= (int) resolx) + xmax = resolx - 1; + + if (yy < 0) + yy = 0; + + if (yy <= (int) resoly - 1) { + if (ymax >= (int) resoly - 1) + ymax = resoly - 1; + + for (; yy < ymax; yy++) + for (xx = xmin; xx < xmax; xx++) + { + Pixel color = cur_font_chars[c][yy - ymin][xx - x]; + Pixel transparency; + transparency.val = color.val & A_CHANNEL; + if (transparency.val) + { + if (transparency.val==A_CHANNEL) buf[yy * resolx + xx] = color; + else + { + Pixel back = buf[yy * resolx + xx]; + unsigned int a1 = color.channels.a; + unsigned int a2 = 255 - a1; + buf[yy * resolx + xx].channels.r = (unsigned char)((((unsigned int)color.channels.r * a1) + ((unsigned int)back.channels.r * a2)) >> 8); + buf[yy * resolx + xx].channels.g = (unsigned char)((((unsigned int)color.channels.g * a1) + ((unsigned int)back.channels.g * a2)) >> 8); + buf[yy * resolx + xx].channels.b = (unsigned char)((((unsigned int)color.channels.b * a1) + ((unsigned int)back.channels.b * a2)) >> 8); + } + } + } + } + fx += cur_font_width[c] + charspace; + } + str++; + } +} diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/gfontlib.h kodi-visualization-goom-2.1.0/lib/goom/src/gfontlib.h --- kodi-visualization-goom-1.1.0/lib/goom/src/gfontlib.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/gfontlib.h 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,10 @@ +#ifndef _GFONTLIB_H +#define _GFONTLIB_H + +#include "goom_graphic.h" + +void gfont_load (void); +void goom_draw_text (Pixel * buf,int resolx,int resoly, int x, int y, + const char *str, float chspace, int center); + +#endif diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/gfontrle.c kodi-visualization-goom-2.1.0/lib/goom/src/gfontrle.c --- kodi-visualization-goom-1.1.0/lib/goom/src/gfontrle.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/gfontrle.c 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,2500 @@ +/* RGBA C-Source image dump (with zRLE compression) */ + +const struct { + unsigned int width; + unsigned int height; + unsigned int bytes_per_pixel; + unsigned int rle_size; + unsigned char rle_pixel [49725]; +} the_font = { +1277, 21, 4, 49725, { +121,17,164,255,121,17,164,255,121,17,164,255,121,17,164,255,0,8,121,17, +164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,36,121,17,164, +0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,52,121,17,164,0, +1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1, +121,17,164,255,121,17,164,255,121,17,164,255,0,52,121,17,164,0,1,121, +17,164,255,121,17,164,255,121,17,164,255,0,52,121,17,164,0,1,121,17, +164,255,121,17,164,255,121,17,164,255,0,12,121,17,164,0,1,121,17,164, +255,121,17,164,255,121,17,164,255,0,20,121,17,164,0,1,121,17,164,255, +121,17,164,255,121,17,164,255,0,20,121,17,164,0,1,121,17,164,255,121, +17,164,255,121,17,164,255,0,52,121,17,164,0,1,121,17,164,255,121,17, +164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164, +255,121,17,164,255,0,12,121,17,164,0,1,121,17,164,255,121,17,164,255, +121,17,164,255,0,36,121,17,164,0,1,121,17,164,255,121,17,164,255,121, +17,164,255,0,12,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17, +164,255,0,36,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164, +255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255, +0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0, +44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44, +121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121, +17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17, +164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164, +0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0, +1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1, +121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121, +17,164,255,121,17,164,255,121,17,164,255,0,12,121,17,164,0,1,121,17, +164,255,121,17,164,255,121,17,164,255,0,12,121,17,164,0,1,121,17,164, +255,121,17,164,255,121,17,164,255,0,36,121,17,164,0,1,121,17,164,255, +121,17,164,255,121,17,164,255,0,36,121,17,164,0,1,121,17,164,255,121, +17,164,255,121,17,164,255,0,36,121,17,164,0,1,121,17,164,255,121,17, +164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164, +255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255, +121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121, +17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17, +164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164, +255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255, +0,36,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0, +36,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44, +121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121, +17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,12,121,17, +164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164, +0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0, +1,121,17,164,255,121,17,164,255,121,17,164,255,0,36,121,17,164,0,1, +121,17,164,255,121,17,164,255,121,17,164,255,0,52,121,17,164,0,1,121, +17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17, +164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164, +255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255, +121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121, +17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17, +164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164, +255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255, +121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121, +17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17, +164,255,0,52,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164, +255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255, +0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0, +44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,20, +121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,36,121, +17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,20,121,17, +164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,36,121,17,164, +0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,36,121,17,164,0, +1,121,17,164,255,121,17,164,255,121,17,164,255,0,12,121,17,164,0,1, +121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121, +17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17, +164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164, +255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255, +121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121, +17,164,255,121,17,164,255,0,28,121,17,164,0,1,121,17,164,255,121,17, +164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164, +255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255, +121,17,164,255,0,12,121,17,164,0,1,121,17,164,255,121,17,164,255,121, +17,164,255,0,28,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17, +164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164, +255,0,12,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255, +0,52,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0, +44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44, +121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121, +17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17, +164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164, +0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0, +1,121,17,164,255,121,17,164,255,121,17,164,255,0,28,121,17,164,0,1, +121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121, +17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17, +164,255,121,17,164,255,121,17,164,255,0,52,121,17,164,0,1,121,17,164, +255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255, +121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121, +17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17, +164,255,121,17,164,255,0,28,121,17,164,0,1,121,17,164,255,121,17,164, +255,121,17,164,255,0,12,121,17,164,0,1,121,17,164,255,121,17,164,255, +121,17,164,255,0,28,121,17,164,0,1,121,17,164,255,121,17,164,255,121, +17,164,255,121,17,164,255,121,17,164,255,0,56,121,17,164,0,1,121,17, +164,255,121,17,164,255,13,4,17,0,1,13,4,17,0,1,13,4,17,0, +1,16,5,22,0,13,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +41,16,5,22,0,1,14,4,19,0,1,16,5,22,0,57,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,57,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +57,16,5,22,0,1,14,4,19,0,1,16,5,22,0,17,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,25,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,25,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +57,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,17,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,41,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +17,16,5,22,0,1,14,4,19,0,1,16,5,22,0,41,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +17,16,5,22,0,1,14,4,19,0,1,16,5,22,0,17,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,41,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,41,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +41,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,41,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +41,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,17,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,41,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,57,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,57,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,25,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,41,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,25,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +41,16,5,22,0,1,14,4,19,0,1,16,5,22,0,41,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,17,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +33,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,17,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +33,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,17,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,57,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,33,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,57,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, +49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,33,16,5,22,0, +1,14,4,19,0,1,16,5,22,0,17,16,5,22,0,1,14,4,19,0, +1,16,5,22,0,33,16,5,22,0,1,14,4,19,0,1,13,4,17,0, +1,13,4,17,0,1,16,5,22,0,61,16,5,22,0,1,14,4,19,0, +255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0, +255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0, +25,8,6,3,57,10,8,5,85,9,7,4,76,0,12,8,6,3,54,9, +8,4,96,9,7,4,85,0,12,8,6,3,57,9,8,4,96,9,7,4, +85,0,24,8,6,3,57,11,8,4,85,9,7,4,79,0,12,8,6,3, +51,10,8,5,85,8,6,3,85,0,40,8,6,3,57,11,8,4,85,8, +6,3,85,0,32,8,6,3,57,10,8,5,85,9,7,4,85,0,28,5, +4,2,14,8,6,3,85,9,7,4,85,0,24,8,6,3,74,9,7,4, +113,8,6,3,167,8,6,3,139,9,7,4,85,5,4,2,14,0,36,8, +6,3,57,9,8,4,110,9,7,4,85,0,24,5,4,2,20,9,7,4, +85,9,8,4,85,0,16,9,8,4,57,9,8,4,85,6,5,3,48,0, +255,0,29,5,4,2,17,8,6,3,85,9,7,4,82,0,20,5,4,2, +3,8,6,3,85,9,7,4,93,8,6,3,153,8,6,3,161,8,6,3, +110,9,8,4,85,8,6,3,85,6,5,3,31,0,32,5,4,2,3,8, +6,3,85,10,8,5,85,10,7,5,85,0,36,5,4,2,57,8,6,3, +85,9,7,4,91,8,6,3,153,8,6,3,170,8,6,3,164,8,6,3, +108,8,6,3,85,6,5,3,71,0,24,5,4,2,42,8,6,3,85,9, +7,4,91,8,6,3,153,8,6,3,170,8,6,3,164,8,6,3,108,8, +6,3,85,6,5,3,71,0,48,5,4,2,3,8,6,3,85,9,8,4, +85,9,7,4,74,0,16,8,6,3,42,9,7,4,85,8,6,3,85,9, +7,4,85,8,6,3,125,8,6,3,170,7,6,4,170,9,7,4,170,12, +9,7,170,19,14,10,170,19,13,10,142,8,6,5,28,0,16,5,4,2, +51,8,6,3,85,9,7,4,91,8,6,3,153,8,6,3,170,8,6,3, +164,8,6,3,108,8,6,3,85,6,5,3,71,0,20,10,8,5,57,9, +7,4,170,8,6,3,170,8,6,3,170,8,6,3,161,8,6,3,142,9, +7,4,96,9,7,4,85,8,6,3,85,9,7,4,85,9,7,4,74,0, +20,5,4,2,42,8,6,3,85,9,7,4,91,8,6,3,153,8,6,3, +170,8,6,3,164,8,6,3,108,8,6,3,85,6,5,3,76,0,24,8, +6,5,82,10,8,7,133,12,9,7,170,15,11,8,170,15,11,8,170,15, +11,8,170,13,10,8,170,10,8,7,161,10,8,7,85,6,5,5,28,0, +96,8,6,3,74,9,8,4,85,8,6,3,57,0,68,7,6,4,28,9, +7,4,85,9,7,4,85,5,4,2,17,0,40,5,4,2,42,8,6,3, +85,9,7,4,91,8,6,3,153,8,6,3,170,8,6,3,164,8,6,3, +108,8,6,3,85,6,5,3,85,0,24,8,6,5,85,10,8,7,133,12, +9,7,170,15,10,8,170,15,11,8,170,15,11,8,170,13,10,8,170,10, +8,7,150,8,6,5,62,0,24,8,6,5,82,10,8,7,133,12,9,7, +170,15,10,8,170,14,10,7,170,9,7,4,170,8,6,5,147,10,8,5, +85,7,6,4,85,5,4,4,3,0,16,12,9,7,57,11,8,6,161,9, +7,6,170,10,8,7,170,13,10,8,170,14,10,7,170,13,10,8,170,12, +9,7,170,10,8,7,156,10,8,7,85,6,5,5,25,0,20,6,5,3, +57,8,7,5,85,9,7,4,110,9,7,4,170,10,8,5,170,10,8,5, +170,11,8,6,170,10,8,7,150,10,8,7,85,6,5,5,25,0,16,15, +11,8,57,11,8,6,170,9,7,6,170,10,8,7,170,13,10,8,170,15, +11,8,170,15,11,8,170,13,10,8,170,10,8,7,159,10,8,7,85,6, +5,5,25,0,16,15,11,8,59,11,9,6,170,9,7,4,125,10,8,5, +85,8,6,3,133,8,6,3,167,8,6,3,170,8,6,3,170,9,8,4, +113,0,16,8,6,3,42,10,8,5,85,10,7,5,85,9,7,4,125,10, +8,5,170,12,10,7,170,14,11,7,170,19,14,10,170,19,14,10,142,8, +6,5,28,0,16,8,6,5,82,10,8,7,133,12,9,7,170,15,11,8, +170,15,11,8,170,15,11,8,170,13,10,8,170,10,8,7,161,10,8,7, +85,6,5,5,25,0,16,12,10,7,74,14,10,7,170,12,9,7,139,7, +6,4,28,0,16,10,8,7,110,14,10,7,170,13,10,8,125,0,16,13, +10,8,71,15,11,8,170,13,10,8,130,5,5,4,8,0,44,11,8,6, +85,9,7,4,170,10,8,5,93,0,16,12,9,7,57,10,8,5,167,11, +8,6,110,6,5,3,8,0,16,11,8,6,57,10,7,5,159,11,8,6, +102,0,16,8,6,3,51,10,8,5,85,9,7,4,85,0,40,10,7,5, +57,11,9,6,85,7,6,4,57,0,28,7,5,4,28,10,8,5,85,11, +8,6,85,0,16,8,6,3,48,10,8,5,85,8,6,3,85,0,20,8, +6,3,57,11,8,4,85,9,7,4,79,0,20,5,4,2,45,8,6,3, +85,9,7,4,85,9,7,4,88,9,7,4,108,9,8,4,93,9,7,4, +85,8,6,3,85,6,5,3,74,0,20,8,6,3,45,9,7,4,85,8, +6,3,85,9,7,4,85,8,6,3,125,8,6,3,170,8,6,3,164,8, +6,3,108,8,6,3,85,6,5,3,74,0,24,6,5,3,57,8,7,5, +85,10,8,5,85,9,7,4,119,8,6,3,142,9,7,4,130,10,8,5, +91,10,7,5,85,6,5,3,85,0,20,9,7,4,57,10,8,5,85,10, +7,5,85,10,8,5,85,8,6,3,144,8,6,3,170,8,6,3,164,8, +6,3,108,8,6,3,85,6,5,3,71,0,24,5,4,2,45,8,6,3, +85,9,7,4,91,8,6,3,153,8,6,3,170,8,6,3,164,9,7,4, +105,8,6,3,85,6,5,3,74,0,20,11,8,4,59,9,7,4,170,8, +6,3,164,9,7,4,91,8,6,3,85,8,6,3,85,8,6,3,85,9, +7,4,85,8,6,3,142,9,6,4,170,9,8,4,116,0,16,8,6,3, +48,10,8,5,85,9,7,4,85,0,20,8,6,3,57,11,8,4,85,9, +7,4,76,0,16,8,6,3,48,10,8,5,85,9,7,4,85,0,20,8, +6,3,57,11,8,4,85,9,7,4,76,0,16,8,6,3,48,10,8,5, +85,9,7,4,85,0,28,8,6,3,57,11,8,4,85,9,7,4,76,0, +16,8,6,3,54,9,8,4,96,9,7,4,85,0,20,8,6,3,57,9, +8,4,96,9,7,4,85,0,16,10,8,5,57,10,7,5,153,10,8,5, +93,0,20,10,8,7,93,14,11,7,170,13,10,8,136,0,16,11,8,6, +91,11,8,6,170,9,7,4,170,9,7,4,170,8,6,5,170,8,6,3, +119,9,7,4,85,8,6,3,85,8,6,3,85,9,7,4,85,9,7,4, +76,0,16,8,6,3,42,9,7,4,85,8,6,3,85,8,6,3,122,9, +8,4,102,0,16,8,6,3,51,9,7,4,85,6,5,3,45,0,40,12, +8,5,57,8,6,3,156,10,7,5,93,11,8,6,85,11,8,6,85,0, +28,6,5,5,14,13,10,8,85,8,7,5,45,0,80,10,8,5,57,10, +7,5,156,10,8,5,96,0,76,9,7,4,57,10,8,5,93,10,8,5, +85,0,140,10,8,7,110,13,10,8,170,12,9,7,133,5,5,4,6,0, +84,8,6,5,79,10,8,7,127,13,10,8,170,16,12,9,142,8,7,5, +28,0,72,8,6,3,57,10,8,5,85,9,6,4,85,0,48,15,11,8, +113,25,18,12,170,20,15,11,142,8,7,5,28,0,28,15,11,8,130,22, +16,11,170,20,15,11,142,7,6,6,23,0,12,13,10,8,68,12,9,7, +170,11,8,6,116,6,5,3,8,0,44,12,9,7,82,15,10,8,170,13, +10,8,130,5,5,4,8,0,255,0,197,6,5,3,57,8,6,3,85,0, +255,0,149,5,4,2,6,8,6,3,85,8,6,3,156,9,8,4,113,0, +16,8,6,3,48,9,8,4,91,9,7,4,76,0,16,10,8,5,57,9, +6,4,170,8,6,3,99,5,4,2,34,0,36,8,6,3,71,9,8,4, +93,9,8,4,96,8,6,3,85,6,5,3,45,0,12,8,6,3,76,0, +44,8,6,3,57,58,31,9,255,93,50,12,255,88,45,11,255,12,10,5, +113,0,4,7,6,4,28,54,29,9,255,93,46,12,255,88,45,11,255,12, +9,5,122,0,4,7,5,4,37,54,29,9,255,93,46,12,255,88,45,11, +255,14,10,5,142,0,16,8,6,3,85,58,31,9,255,93,50,12,255,88, +44,11,255,9,7,4,170,0,4,5,4,2,85,52,28,9,255,93,48,12, +255,88,44,11,255,12,10,5,170,0,32,7,6,4,85,58,31,9,255,93, +50,12,255,88,45,11,255,12,9,5,170,0,24,8,6,3,57,58,31,9, +255,93,50,12,255,88,45,11,255,14,10,5,142,0,20,6,5,3,28,19, +12,6,227,76,37,11,255,88,45,11,255,14,10,5,139,0,16,9,8,4, +170,69,35,10,255,92,47,11,255,92,47,11,255,88,45,11,255,88,45,11, +255,16,11,5,227,7,5,4,28,0,28,8,6,3,57,58,31,9,255,93, +46,12,255,88,45,11,255,14,10,5,142,0,16,6,5,3,28,19,12,6, +227,82,39,11,255,92,47,11,255,14,10,5,105,0,8,7,5,4,20,54, +29,9,255,100,50,13,255,30,19,7,255,8,6,3,85,0,255,0,21,6, +5,3,28,19,12,6,227,76,37,11,255,88,45,11,255,14,10,5,130,0, +12,7,6,4,65,17,11,6,227,71,37,10,255,88,45,11,255,92,47,11, +255,92,47,11,255,88,45,11,255,88,44,11,255,88,44,11,255,25,16,6, +255,8,6,3,142,0,24,7,5,4,85,17,12,6,229,77,39,12,255,107, +51,14,255,113,55,16,255,20,14,9,178,0,28,14,11,7,170,29,18,8, +255,74,39,11,255,88,45,11,255,88,45,11,255,92,47,11,255,92,47,11, +255,88,45,11,255,88,44,11,255,41,23,8,255,12,9,5,227,5,5,4, +23,0,12,9,7,4,170,26,17,6,255,74,39,11,255,88,45,11,255,88, +45,11,255,92,47,11,255,92,47,11,255,88,45,11,255,88,44,11,255,41, +24,8,255,12,9,5,227,6,5,3,28,0,36,6,5,3,85,16,11,5, +227,71,37,10,255,88,45,11,255,88,44,11,255,12,10,5,113,0,8,8, +6,3,28,54,29,9,255,92,47,11,255,88,44,11,255,88,45,11,255,92, +46,13,255,100,52,13,255,109,53,16,255,121,63,20,255,158,74,23,255,180, +88,27,255,183,90,28,255,26,17,11,142,0,12,10,7,5,170,26,17,6, +255,74,39,11,255,88,45,11,255,92,47,11,255,92,47,11,255,92,47,11, +255,88,45,11,255,88,45,11,255,41,24,8,255,12,9,5,227,6,5,3, +28,0,8,7,6,4,8,61,32,10,255,102,51,13,255,92,46,13,255,92, +46,13,255,92,46,13,255,92,46,13,255,92,46,13,255,90,45,11,255,84, +44,11,255,88,45,11,255,88,44,11,255,14,10,5,119,0,12,9,7,4, +153,26,17,6,255,74,39,11,255,88,45,11,255,92,47,11,255,92,47,11, +255,92,47,11,255,88,45,11,255,88,44,11,255,45,25,8,255,13,10,6, +227,7,6,4,28,0,12,17,13,10,170,64,39,21,255,155,78,26,255,169, +83,26,255,165,80,24,255,161,79,24,255,145,71,22,255,136,70,21,255,134, +69,21,255,88,50,23,255,22,17,11,232,9,8,6,31,0,84,4,4,3, +23,12,9,5,173,71,34,10,255,92,43,13,255,33,20,8,255,10,8,5, +57,0,64,20,14,7,227,83,42,12,255,92,46,13,255,19,13,6,227,6, +5,3,34,0,32,10,8,5,170,26,17,6,255,76,37,11,255,90,46,11, +255,92,46,13,255,92,46,13,255,90,45,11,255,90,45,11,255,88,44,11, +255,46,26,9,255,18,13,9,227,8,7,5,28,0,12,15,12,8,170,58, +35,19,255,134,73,23,255,153,76,24,255,142,69,21,255,131,64,20,255,121, +59,18,255,121,59,18,255,121,62,18,255,43,27,12,255,11,9,6,170,0, +16,17,13,10,170,64,39,21,255,164,85,27,255,177,86,26,255,154,75,23, +255,121,62,18,255,115,56,16,255,119,61,18,255,123,61,20,255,80,45,19, +255,22,16,11,227,8,7,5,28,0,8,13,10,8,57,96,48,19,255,165, +80,24,255,159,78,24,255,159,78,24,255,165,80,24,255,165,80,24,255,165, +80,24,255,159,78,24,255,164,81,25,255,91,52,24,255,22,17,11,227,8, +7,5,28,0,12,13,10,8,170,38,24,11,255,99,47,16,255,116,59,17, +255,126,65,21,255,142,69,21,255,153,76,24,255,157,74,24,255,155,76,24, +255,91,52,24,255,23,18,12,227,8,7,5,28,0,8,13,10,8,57,104, +52,21,255,171,84,26,255,155,76,24,255,164,81,25,255,173,81,26,255,180, +88,27,255,180,88,27,255,177,86,26,255,169,80,26,255,92,55,25,255,22, +17,11,227,8,7,5,28,0,8,13,10,8,57,114,63,25,255,177,86,26, +255,114,56,17,255,92,46,13,255,92,47,11,255,93,46,12,255,92,46,13, +255,96,48,13,255,92,46,13,255,18,12,5,91,0,8,8,6,3,40,55, +29,10,255,108,50,15,255,114,56,17,255,130,67,21,255,153,76,24,255,161, +82,24,255,171,84,26,255,179,84,26,255,179,84,26,255,25,17,10,142,0, +12,15,12,8,170,64,39,21,255,162,84,27,255,179,88,28,255,183,90,28, +255,181,89,28,255,181,89,28,255,172,88,27,255,156,77,25,255,88,50,23, +255,22,17,11,227,8,7,5,28,0,8,13,9,6,57,96,48,19,255,153, +71,22,255,134,69,21,255,20,14,9,193,0,12,11,8,6,113,124,62,25, +255,185,91,28,255,169,80,26,255,22,15,9,142,0,8,11,8,6,57,111, +61,24,255,184,90,27,255,177,86,26,255,23,16,10,173,0,40,11,8,6, +113,114,59,23,255,144,73,21,255,126,63,21,255,20,14,9,142,0,8,11, +9,6,57,97,51,20,255,152,71,23,255,134,69,21,255,20,14,9,187,0, +12,12,9,7,96,97,48,18,255,140,71,21,255,138,71,21,255,20,15,9, +142,0,8,8,6,3,40,52,28,9,255,93,50,12,255,88,45,11,255,14, +10,5,142,0,32,13,10,8,82,91,48,16,255,132,71,21,255,63,36,18, +255,10,8,7,136,0,20,7,6,6,62,31,21,12,244,124,66,23,255,134, +69,21,255,20,15,9,142,0,8,8,6,3,28,54,29,9,255,93,46,12, +255,80,39,11,255,14,10,5,142,0,12,8,6,3,57,58,31,9,255,93, +50,12,255,88,44,11,255,14,10,5,116,0,12,9,7,4,153,26,17,6, +255,74,39,11,255,88,45,11,255,88,45,11,255,88,45,11,255,88,45,11, +255,88,44,11,255,88,44,11,255,41,23,8,255,12,9,5,227,5,4,4, +17,0,8,8,6,3,34,54,29,9,255,92,43,11,255,88,44,11,255,88, +45,11,255,92,43,11,255,92,47,11,255,92,47,11,255,88,45,11,255,88, +44,11,255,45,25,8,255,12,10,5,227,6,5,3,28,0,12,13,10,6, +170,40,24,11,255,97,48,16,255,113,55,16,255,115,56,16,255,116,57,17, +255,116,57,17,255,113,55,16,255,113,55,16,255,60,33,13,255,18,14,9, +227,8,6,5,28,0,8,12,9,7,57,77,38,14,255,118,57,17,255,116, +59,17,255,118,60,17,255,109,53,16,255,98,47,13,255,92,47,11,255,88, +45,11,255,88,44,11,255,41,23,8,255,12,9,5,227,6,5,3,28,0, +12,10,8,5,170,28,18,7,255,76,37,11,255,90,45,11,255,92,46,13, +255,94,45,13,255,94,45,13,255,92,46,13,255,92,46,13,255,46,26,9, +255,13,10,6,227,6,5,5,28,0,8,7,6,4,8,61,32,10,255,100, +50,13,255,92,46,13,255,92,46,13,255,92,46,13,255,92,46,13,255,92, +46,13,255,92,46,13,255,94,47,13,255,98,49,13,255,94,47,13,255,18, +12,5,93,0,8,8,6,3,42,60,32,9,255,96,48,13,255,88,45,11, +255,14,10,5,142,0,12,8,6,3,57,58,31,9,255,93,50,12,255,88, +44,11,255,12,10,5,113,0,8,8,6,3,28,54,29,9,255,93,50,12, +255,88,44,11,255,14,10,5,142,0,12,8,6,3,57,58,31,9,255,93, +50,12,255,88,44,11,255,12,10,5,113,0,8,8,6,3,28,54,29,9, +255,93,50,12,255,88,44,11,255,14,10,5,142,0,20,8,6,3,57,58, +31,9,255,93,50,12,255,88,44,11,255,12,10,5,113,0,8,7,6,4, +28,54,29,9,255,93,50,12,255,88,45,11,255,14,10,5,142,0,12,8, +7,3,57,60,31,9,255,96,48,13,255,92,46,13,255,14,10,5,127,0, +8,10,8,5,57,82,42,15,255,135,66,20,255,121,60,20,255,20,15,9, +176,0,12,11,9,6,108,107,56,22,255,172,84,25,255,158,74,23,255,22, +15,9,142,0,8,11,8,6,54,98,51,19,255,142,72,21,255,136,70,21, +255,138,71,21,255,121,59,18,255,100,52,13,255,90,46,11,255,88,44,11, +255,88,44,11,255,88,44,11,255,88,45,11,255,12,10,5,113,0,8,8, +6,3,28,54,29,9,255,92,47,11,255,88,44,11,255,92,47,11,255,92, +47,11,255,18,12,5,85,0,8,7,6,4,45,54,30,9,255,94,47,13, +255,31,20,8,255,9,7,4,85,0,32,8,6,3,48,65,33,10,255,114, +55,15,255,119,58,18,255,126,63,21,255,128,66,21,255,22,15,9,164,0, +20,5,5,4,28,19,14,10,227,141,72,26,255,43,27,16,255,7,6,6, +85,0,72,14,10,7,71,96,49,17,255,138,71,21,255,130,67,21,255,22, +15,9,164,0,68,12,9,7,76,77,39,14,255,118,57,17,255,109,53,16, +255,22,15,9,153,0,132,11,8,6,96,103,53,20,255,144,73,21,255,121, +60,20,255,24,16,9,153,0,80,15,12,8,184,61,36,20,255,141,68,24, +255,168,82,25,255,171,84,26,255,26,18,11,159,0,68,9,7,4,57,60, +32,9,255,96,48,13,255,92,46,13,255,19,12,6,142,0,40,14,10,7, +76,129,67,26,255,190,97,29,255,180,88,27,255,26,17,11,161,0,24,14, +10,7,85,129,67,26,255,190,97,29,255,180,88,27,255,25,17,10,125,0, +8,11,8,6,57,109,60,24,255,175,86,26,255,142,73,23,255,20,14,9, +187,0,40,12,9,7,93,121,65,24,255,183,89,26,255,168,82,25,255,21, +15,10,178,0,255,0,193,10,8,5,170,39,23,8,255,78,41,11,255,16, +11,5,142,0,255,0,141,6,5,3,85,16,11,5,227,71,37,10,255,92, +47,11,255,92,47,11,255,18,12,5,85,0,8,8,6,3,28,54,29,9, +255,93,46,12,255,88,45,11,255,12,10,5,113,0,12,58,31,9,255,93, +50,12,255,88,45,11,255,25,17,6,255,8,6,3,142,0,24,4,4,3, +25,10,8,5,173,65,33,10,255,92,46,13,255,92,46,13,255,67,34,10, +255,27,18,8,255,9,7,4,156,3,3,2,85,10,8,5,184,69,35,10, +255,19,13,6,147,0,40,9,7,4,113,112,55,13,255,141,69,16,255,141, +75,16,255,18,13,5,170,0,4,8,6,3,85,110,54,13,255,143,76,16, +255,139,68,16,255,19,13,6,170,0,4,8,6,3,85,110,54,13,255,143, +76,16,255,141,72,16,255,23,15,6,170,0,12,10,9,5,110,35,21,8, +255,129,63,14,255,141,69,16,255,139,68,16,255,52,27,9,255,9,7,4, +255,27,17,8,255,135,66,16,255,154,75,17,255,155,79,18,255,91,50,16, +255,20,15,9,207,10,9,7,28,0,16,5,4,4,20,8,6,3,127,31, +20,8,255,130,66,15,255,143,76,16,255,143,76,16,255,67,34,10,255,10, +8,5,215,10,8,5,170,13,10,6,142,7,5,4,23,0,8,12,9,5, +85,115,59,14,255,149,72,16,255,143,76,16,255,18,12,5,235,0,16,7, +6,4,28,14,10,5,227,92,46,13,255,143,73,16,255,143,70,16,255,18, +13,5,170,0,12,14,10,5,170,53,28,10,255,114,56,13,255,56,29,9, +255,16,11,5,255,34,20,7,255,112,55,13,255,87,42,12,255,19,13,6, +235,8,7,5,40,0,24,10,8,5,85,114,56,13,255,143,70,16,255,141, +72,16,255,23,15,6,170,0,12,7,6,4,28,14,10,5,227,90,44,13, +255,112,57,13,255,47,26,8,255,11,8,4,57,0,12,25,16,6,227,96, +48,13,255,112,57,13,255,26,16,7,255,8,6,5,85,0,24,13,10,6, +85,8,7,5,57,0,20,6,5,3,28,15,11,6,85,9,7,4,28,0, +36,9,7,4,105,10,8,5,170,10,8,5,130,6,5,3,23,0,156,8, +6,3,136,77,39,12,255,143,73,16,255,139,74,16,255,18,12,5,170,0, +12,21,14,6,227,112,57,13,255,141,69,16,255,80,40,11,255,16,11,5, +255,14,10,5,227,18,13,5,255,72,35,11,255,136,69,15,255,130,66,15, +255,46,26,9,255,8,6,3,105,0,16,8,7,5,57,42,27,13,255,150, +79,21,255,184,94,21,255,195,99,22,255,199,106,24,255,26,18,11,255,0, +24,10,8,7,99,83,45,18,255,144,74,17,255,143,70,16,255,94,47,13, +255,18,13,5,255,16,11,5,173,14,10,5,227,52,27,9,255,132,67,15, +255,139,68,16,255,75,39,12,255,10,7,5,116,0,8,6,5,3,57,52, +27,9,255,137,73,16,255,143,76,16,255,94,47,13,255,18,13,5,255,16, +11,5,173,14,10,5,227,52,27,9,255,132,67,15,255,139,74,16,255,75, +39,12,255,10,8,5,142,0,32,8,6,5,85,22,15,7,255,102,51,13, +255,137,67,16,255,140,71,15,255,141,75,16,255,20,13,5,170,0,8,9, +6,4,85,108,55,13,255,141,69,16,255,139,74,16,255,74,36,11,255,18, +12,7,255,20,13,7,181,22,15,9,207,20,13,9,238,18,13,9,252,23, +16,10,255,31,21,12,218,14,11,7,42,0,8,7,6,4,57,40,22,9, +255,130,66,15,255,141,75,16,255,84,42,11,255,18,12,5,255,16,12,5, +181,14,10,5,241,69,35,10,255,140,69,17,255,154,78,17,255,117,60,18, +255,17,13,8,142,0,12,21,14,8,190,28,18,9,255,23,15,8,255,21, +14,8,255,21,14,8,255,23,15,8,255,38,24,11,255,98,53,17,255,151, +74,18,255,150,76,17,255,141,75,16,255,21,15,6,170,0,8,5,4,2, +28,33,20,8,255,130,66,15,255,141,72,16,255,84,42,11,255,18,12,5, +255,18,12,5,176,14,10,5,235,57,29,10,255,140,72,17,255,165,85,20, +255,121,67,24,255,14,11,7,142,0,8,8,6,5,57,72,46,23,255,198, +113,29,255,200,102,23,255,131,68,22,255,33,21,12,255,17,13,8,255,21, +14,8,255,88,47,19,255,192,99,23,255,203,113,26,255,146,87,29,255,13, +11,8,164,0,12,10,8,5,85,13,10,6,170,11,9,6,142,7,6,4, +28,0,12,13,10,8,113,18,14,9,170,16,13,9,147,10,8,7,28,0, +24,10,8,7,28,20,15,11,227,104,62,21,255,184,94,21,255,117,62,22, +255,17,12,8,227,7,5,4,28,0,64,11,8,6,170,67,35,16,255,164, +85,21,255,115,58,16,255,20,14,7,252,8,6,5,85,0,24,9,7,4, +82,66,37,13,255,145,75,18,255,154,78,17,255,115,58,16,255,29,18,8, +255,14,10,7,255,16,11,7,255,65,34,12,255,150,74,19,255,189,97,22, +255,138,79,27,255,14,12,9,142,0,8,7,6,6,57,55,33,16,255,158, +81,19,255,162,80,19,255,102,53,17,255,24,15,7,255,19,12,6,170,14, +10,5,204,46,26,9,255,137,67,16,255,139,71,16,255,49,27,10,255,7, +6,4,105,0,8,7,6,6,62,72,46,23,255,199,115,32,255,205,111,28, +255,155,84,26,255,41,24,14,255,18,13,9,255,25,16,10,255,110,61,25, +255,199,100,28,255,205,112,30,255,146,87,29,255,13,11,8,142,0,8,10, +8,7,147,180,87,25,255,206,111,27,255,203,105,26,255,164,85,27,255,40, +24,15,255,20,14,9,255,26,17,11,255,121,64,26,255,201,101,28,255,205, +112,30,255,146,87,29,255,14,11,7,142,0,8,8,6,5,57,71,44,22, +255,192,108,25,255,198,101,23,255,150,78,25,255,41,24,14,255,32,21,13, +255,74,41,21,255,184,105,27,255,202,104,25,255,202,118,27,255,174,102,31, +255,17,14,10,142,0,8,11,9,6,136,182,92,25,255,206,112,29,255,205, +111,28,255,166,79,27,255,43,25,16,255,21,15,10,255,29,19,12,255,116, +67,27,255,202,107,31,255,206,113,31,255,146,87,29,255,12,10,7,142,0, +8,11,8,6,144,185,93,26,255,202,103,23,255,157,77,18,255,83,42,12, +255,19,13,6,255,13,10,6,255,20,13,7,255,27,17,8,255,28,18,9, +227,10,8,5,45,0,8,11,9,6,142,139,73,20,255,198,96,21,255,199, +106,24,255,155,78,26,255,41,25,14,255,21,15,10,255,28,18,11,255,38, +24,15,255,40,24,15,227,14,10,7,62,0,8,8,7,5,57,65,41,20, +255,197,108,28,255,205,111,28,255,170,88,27,255,43,27,16,255,19,14,10, +255,29,19,12,255,123,66,24,255,181,84,20,255,170,87,19,255,114,60,17, +255,11,10,6,142,0,8,11,9,6,85,119,60,15,255,154,75,17,255,154, +78,17,255,18,13,7,255,0,12,13,10,8,170,191,102,30,255,209,118,30, +255,207,113,30,255,28,19,11,201,0,8,13,10,8,105,166,87,23,255,198, +101,23,255,198,97,23,255,26,18,11,255,0,40,13,10,8,170,189,100,28, +255,206,111,27,255,204,102,27,255,28,20,11,201,0,8,12,10,7,116,184, +93,27,255,206,107,27,255,203,113,26,255,23,17,10,255,0,8,6,5,5, +28,25,18,12,244,192,105,27,255,206,112,29,255,207,117,30,255,32,22,13, +170,0,8,11,9,6,88,112,57,13,255,143,70,16,255,141,69,16,255,17, +12,6,227,0,32,14,11,9,170,184,92,25,255,206,111,27,255,192,111,31, +255,49,33,18,255,10,8,7,122,0,12,7,7,6,59,22,16,11,232,167, +100,28,255,205,112,30,255,205,116,30,255,26,18,11,210,0,8,8,7,3, +85,110,54,13,255,141,69,16,255,141,75,16,255,25,16,6,255,5,4,4, +40,0,8,10,8,5,85,112,55,13,255,141,75,16,255,141,75,16,255,20, +13,5,170,0,8,5,4,2,28,33,20,8,255,130,66,15,255,141,72,16, +255,112,55,13,255,45,25,8,255,26,17,6,255,33,20,8,255,94,47,13, +255,141,69,16,255,144,71,17,255,80,40,13,255,9,7,4,125,0,8,10, +8,5,85,112,57,13,255,148,79,17,255,141,75,16,255,87,42,12,255,19, +13,6,255,14,10,5,215,15,10,6,255,60,31,11,255,143,71,18,255,160, +82,19,255,96,54,17,255,12,9,7,142,0,8,8,6,5,57,71,44,22, +255,192,100,25,255,199,106,24,255,185,93,26,255,91,50,22,255,58,33,17, +255,72,41,19,255,158,81,25,255,199,106,24,255,199,106,24,255,138,79,27, +255,13,11,8,142,0,8,10,8,7,147,166,87,23,255,203,108,24,255,202, +108,25,255,153,77,26,255,38,22,13,255,15,11,6,255,14,10,5,255,52, +28,9,255,132,70,15,255,141,75,16,255,80,41,13,255,10,8,5,139,0, +8,7,6,6,57,48,29,13,255,154,79,19,255,160,85,19,255,108,56,17, +255,30,18,9,255,16,11,7,255,24,15,9,255,96,51,17,255,167,86,20, +255,181,88,20,255,140,75,23,255,18,14,9,144,0,12,22,14,7,193,22, +13,7,255,20,13,7,255,78,40,15,255,165,81,20,255,177,90,20,255,177, +90,20,255,115,58,20,255,32,20,11,255,24,15,9,255,30,19,9,227,11, +8,6,54,0,8,11,9,6,142,139,68,20,255,166,78,19,255,144,71,17, +255,19,12,6,215,0,12,9,7,4,136,114,56,13,255,143,70,16,255,139, +68,16,255,19,13,6,170,0,8,10,7,5,85,112,55,13,255,143,70,16, +255,139,74,16,255,17,11,6,221,0,12,9,7,4,136,114,56,13,255,143, +70,16,255,141,75,16,255,20,13,5,170,0,8,9,6,4,85,110,54,13, +255,141,69,16,255,141,72,16,255,17,11,6,221,0,20,9,7,4,136,114, +56,13,255,143,73,16,255,139,74,16,255,19,13,6,170,0,8,8,6,3, +85,110,54,13,255,143,76,16,255,141,69,16,255,18,12,5,252,0,12,11, +9,6,170,131,69,18,255,170,87,19,255,168,86,19,255,28,19,9,170,0, +8,11,8,6,85,145,74,26,255,204,102,27,255,203,105,26,255,52,33,17, +255,6,5,5,57,0,8,17,14,10,227,190,107,25,255,204,113,25,255,174, +86,27,255,18,13,9,170,0,12,28,18,11,198,37,23,14,255,32,21,13, +255,21,15,10,255,20,14,9,255,38,23,11,255,87,44,12,255,137,70,16, +255,141,72,16,255,143,70,16,255,141,72,16,255,18,12,5,170,0,8,9, +6,4,85,110,54,13,255,145,74,16,255,141,69,16,255,94,47,13,255,27, +17,8,227,12,8,5,28,0,8,14,10,7,85,121,62,18,255,172,87,19, +255,139,69,18,255,20,15,9,227,0,36,21,14,8,227,117,61,24,255,199, +100,28,255,205,106,26,255,204,110,27,255,26,18,11,255,0,16,8,7,5, +28,20,15,11,227,135,73,22,255,192,97,21,255,165,83,22,255,33,22,12, +255,10,9,7,85,0,68,11,9,6,170,184,97,27,255,206,112,29,255,204, +110,27,255,28,19,11,255,0,68,14,11,7,170,179,93,24,255,202,103,23, +255,198,97,23,255,22,15,9,255,0,132,9,7,6,170,125,63,18,255,158, +77,17,255,146,75,17,255,17,12,6,255,0,76,8,6,5,76,72,46,23, +255,197,108,28,255,201,107,24,255,164,85,27,255,37,22,14,227,13,9,6, +48,0,68,12,9,7,170,138,67,19,255,170,79,19,255,168,86,19,255,20, +14,9,255,0,40,8,7,5,20,21,15,10,184,26,17,11,255,26,17,11, +215,12,9,7,74,0,24,8,7,5,20,21,15,10,184,26,17,11,255,31, +21,12,207,18,13,9,28,0,8,11,9,8,156,184,93,27,255,208,105,29, +255,205,111,28,255,28,19,11,255,0,40,14,11,7,170,184,92,25,255,203, +104,24,255,200,98,23,255,26,18,11,255,0,255,0,189,8,7,5,57,51, +29,12,255,152,75,19,255,162,86,19,255,19,13,8,246,0,255,0,137,6, +5,3,28,19,13,6,249,92,46,13,255,123,63,14,255,78,39,11,255,21, +15,6,227,9,8,4,28,0,8,9,8,4,85,110,59,13,255,141,69,16, +255,141,75,16,255,21,14,6,170,0,12,16,11,5,170,52,28,9,255,115, +59,14,255,116,60,15,255,43,26,10,255,9,7,6,125,0,16,8,7,5, +28,21,17,10,227,109,59,18,255,160,82,19,255,121,64,18,255,62,34,13, +255,94,53,17,255,149,78,20,255,102,54,19,255,32,22,11,255,72,39,15, +255,121,62,18,255,24,17,9,187,0,40,8,6,3,167,128,66,15,255,161, +85,17,255,159,81,18,255,24,15,7,178,0,4,6,5,3,37,48,28,11, +255,173,92,20,255,181,96,20,255,21,15,8,221,0,4,6,5,3,28,40, +24,9,255,143,74,18,255,158,80,17,255,21,15,6,181,0,8,10,8,5, +54,107,51,14,255,157,83,18,255,164,84,19,255,176,89,19,255,189,92,20, +255,191,98,22,255,190,106,23,255,197,110,26,255,203,108,24,255,203,117,24, +255,205,119,26,255,207,122,30,255,199,118,32,255,32,23,13,170,0,12,7, +6,4,85,22,15,7,232,113,54,14,255,146,75,17,255,158,80,17,255,154, +78,17,255,158,80,17,255,148,76,17,255,139,71,16,255,135,66,16,255,135, +66,16,255,21,14,6,136,0,8,10,8,5,85,128,66,15,255,161,85,17, +255,158,80,17,255,25,16,6,204,0,12,7,6,4,28,25,16,8,227,102, +50,15,255,148,76,17,255,142,73,17,255,84,45,13,255,10,8,5,113,0, +8,9,7,4,82,107,53,14,255,146,75,17,255,84,41,13,255,8,7,5, +198,3,2,2,23,5,4,4,136,38,23,9,255,136,70,17,255,140,72,17, +255,21,15,6,178,0,24,7,6,4,57,45,26,10,255,143,74,18,255,158, +80,17,255,26,17,6,170,0,12,24,16,7,227,115,58,16,255,148,76,17, +255,46,26,9,255,7,6,4,156,0,16,5,4,4,71,19,13,6,255,139, +71,16,255,140,72,17,255,43,26,10,255,9,8,4,85,0,16,14,10,5, +85,109,52,14,255,38,23,9,255,6,5,3,85,0,12,4,4,3,28,15, +12,6,227,115,56,16,255,29,19,8,170,0,32,13,10,6,113,122,64,21, +255,164,85,21,255,138,71,17,255,21,15,6,161,0,156,13,10,6,227,137, +67,16,255,154,75,17,255,84,45,13,255,10,8,5,116,0,8,9,7,4, +85,111,55,14,255,158,87,17,255,158,80,17,255,19,13,6,255,4,4,3, +28,0,4,3,3,2,113,17,12,6,255,139,71,16,255,161,85,17,255,146, +75,17,255,20,14,7,210,0,16,16,13,9,110,184,105,27,255,209,123,30, +255,210,124,31,255,208,123,31,255,207,122,30,255,27,20,12,255,0,24,13, +11,8,147,143,75,20,255,161,85,17,255,158,80,17,255,27,18,8,227,5, +4,2,28,0,8,10,7,5,198,131,65,16,255,161,85,17,255,150,76,17, +255,21,14,6,170,0,8,10,8,5,85,123,61,16,255,163,83,18,255,158, +80,17,255,27,18,8,227,5,4,2,28,0,8,9,7,4,198,130,66,15, +255,163,83,18,255,148,76,17,255,21,14,6,193,0,28,7,6,4,85,22, +15,7,255,131,65,16,255,154,78,17,255,154,78,17,255,154,78,17,255,154, +78,17,255,21,15,6,170,0,8,10,8,5,85,129,64,16,255,163,86,18, +255,180,91,19,255,29,20,10,255,3,3,2,93,0,36,10,8,5,122,121, +60,16,255,161,85,17,255,159,81,18,255,24,15,7,255,4,4,3,34,0, +4,2,2,1,6,17,13,8,181,181,93,22,255,203,108,24,255,205,114,26, +255,32,23,13,210,0,36,5,4,4,161,30,22,13,255,198,116,29,255,206, +106,25,255,191,96,20,255,26,17,7,170,0,8,9,7,4,85,116,60,15, +255,161,85,17,255,158,80,17,255,21,14,6,255,5,4,2,28,0,4,2, +2,1,3,12,9,7,215,190,107,25,255,211,124,30,255,208,134,37,255,32, +22,13,178,0,8,13,11,8,96,187,112,32,255,209,123,30,255,191,96,20, +255,28,19,9,255,4,3,3,74,0,4,3,2,2,28,13,10,8,227,196, +120,31,255,211,124,30,255,199,106,24,255,27,19,10,170,0,8,13,10,6, +57,114,61,19,255,178,91,21,255,182,102,23,255,23,17,10,173,0,8,11, +9,6,91,146,85,25,255,198,113,29,255,196,120,31,255,27,20,12,207,0, +20,5,5,4,28,21,17,12,227,190,118,33,255,209,131,40,255,161,100,34, +255,17,14,10,227,5,5,4,28,0,72,9,8,6,170,91,59,28,255,189, +94,24,255,162,83,19,255,39,25,12,255,7,7,6,85,0,20,13,11,8, +142,183,103,24,255,203,112,24,255,203,112,24,255,42,26,13,249,5,4,4, +62,0,4,3,2,2,25,12,9,7,227,195,115,30,255,212,127,35,255,211, +132,38,255,32,22,13,181,0,8,12,10,7,85,124,65,17,255,161,85,17, +255,159,78,18,255,21,14,6,255,5,4,2,28,0,8,7,6,4,224,133, +68,16,255,159,81,18,255,146,72,17,255,22,14,7,170,0,8,13,11,8, +91,185,111,32,255,210,125,33,255,205,114,26,255,37,26,14,255,4,4,3, +85,0,4,4,4,4,28,13,10,8,227,193,105,26,255,206,111,27,255,202, +118,27,255,32,22,13,170,0,8,11,9,6,127,174,91,23,255,202,102,21, +255,200,105,21,255,36,23,13,255,4,4,3,85,0,4,3,3,2,28,13, +11,8,227,198,118,33,255,212,127,35,255,208,128,33,255,31,22,12,181,0, +8,13,11,8,91,185,114,30,255,211,124,30,255,208,122,29,255,34,24,13, +255,4,4,3,85,0,4,7,6,6,113,32,24,13,255,185,95,22,255,202, +98,21,255,198,97,23,255,33,22,12,170,0,8,10,8,7,156,190,108,27, +255,212,126,33,255,211,127,36,255,40,26,15,255,4,4,3,85,0,4,3, +3,2,28,13,11,8,227,198,118,33,255,214,129,37,255,211,132,38,255,32, +23,13,173,0,8,10,8,7,144,167,87,22,255,185,94,20,255,165,87,18, +255,25,17,8,255,3,3,2,57,0,28,13,11,8,170,195,112,30,255,210, +125,33,255,208,117,29,255,39,26,14,255,4,4,3,85,0,28,12,10,7, +150,184,108,27,255,211,124,30,255,211,127,36,255,40,27,15,255,4,4,3, +85,0,4,3,3,2,28,17,13,8,178,138,71,17,255,161,85,17,255,155, +79,18,255,21,14,6,170,0,8,10,8,5,85,124,61,15,255,169,89,18, +255,180,91,19,255,25,18,10,255,0,12,13,11,8,170,196,113,31,255,211, +124,30,255,205,119,26,255,26,18,11,204,0,8,11,9,6,88,134,70,19, +255,173,87,18,255,168,86,19,255,20,13,7,255,0,40,13,11,8,170,196, +113,31,255,210,125,33,255,207,122,30,255,24,18,11,212,0,8,11,9,6, +119,180,93,23,255,203,108,24,255,202,103,23,255,20,15,9,255,0,8,15, +13,10,195,101,63,26,255,202,117,25,255,206,128,35,255,160,106,35,255,15, +13,10,142,0,8,10,8,5,147,139,70,20,255,191,96,20,255,200,105,21, +255,25,18,10,255,0,32,13,10,8,170,189,99,26,255,206,115,27,255,205, +106,26,255,185,106,28,255,79,52,26,255,10,9,7,122,0,4,7,6,6, +42,36,27,17,244,172,106,35,255,207,128,34,255,211,126,34,255,211,127,36, +255,24,18,11,227,0,8,10,8,5,85,124,64,15,255,159,81,18,255,158, +80,17,255,76,40,13,255,11,8,6,210,0,8,12,9,5,85,129,64,16, +255,161,85,17,255,158,80,17,255,26,16,7,170,0,8,9,7,4,85,115, +56,16,255,161,85,17,255,159,81,18,255,49,27,10,255,7,6,4,170,5, +4,4,85,6,5,3,113,26,19,11,255,185,95,22,255,202,102,21,255,197, +104,22,255,28,20,11,173,0,8,13,10,6,102,167,87,22,255,200,101,21, +255,201,102,22,255,32,21,11,255,4,3,3,65,0,4,2,2,1,17,12, +10,7,221,190,98,23,255,208,116,27,255,204,110,27,255,30,21,11,181,0, +8,13,11,8,91,185,114,30,255,211,124,30,255,209,123,30,255,86,55,25, +255,9,8,6,187,6,6,5,85,7,6,6,130,32,24,15,255,200,122,31, +255,209,123,30,255,206,122,31,255,32,23,13,173,0,8,10,8,7,144,191, +113,30,255,212,127,35,255,210,126,35,255,40,27,15,255,4,4,3,85,0, +4,2,2,1,8,11,9,6,212,157,81,20,255,189,92,20,255,190,97,21, +255,27,19,10,178,0,8,12,10,7,96,183,105,28,255,209,123,30,255,205, +114,26,255,36,24,13,255,4,4,3,85,0,4,4,4,4,28,18,14,9, +187,195,115,30,255,211,124,30,255,210,130,35,255,35,26,14,210,0,20,3, +2,2,28,12,10,7,227,195,115,30,255,211,124,30,255,209,123,30,255,38, +25,15,255,4,4,3,85,0,20,13,11,8,170,194,115,31,255,209,122,28, +255,196,99,21,255,21,15,8,255,0,12,11,9,6,170,153,79,20,255,187, +91,20,255,181,96,20,255,30,20,9,178,0,8,13,10,6,96,151,79,20, +255,187,91,20,255,181,96,20,255,22,16,9,255,0,12,12,9,7,170,146, +76,19,255,167,88,18,255,158,77,17,255,23,15,6,170,0,8,10,8,5, +85,133,66,16,255,167,88,18,255,168,86,19,255,22,16,9,255,0,20,12, +9,7,170,155,80,20,255,185,94,20,255,181,96,20,255,22,16,9,221,0, +8,6,6,5,42,51,29,12,255,150,81,19,255,165,87,18,255,42,26,11, +255,5,5,4,108,0,4,5,5,4,28,18,15,11,255,195,114,28,255,207, +123,32,255,158,94,31,255,17,13,10,142,0,8,6,5,5,57,50,34,19, +255,191,111,32,255,208,117,29,255,113,73,30,255,10,10,9,227,6,6,5, +125,7,7,6,198,42,29,17,255,187,96,22,255,166,87,23,255,42,27,15, +255,8,6,5,110,0,32,5,5,4,184,21,16,8,255,106,54,15,255,154, +78,17,255,151,77,18,255,92,48,15,255,11,9,6,119,0,8,10,8,5, +93,131,69,18,255,189,92,20,255,200,105,21,255,33,22,12,255,5,4,4, +54,0,12,9,8,6,85,76,53,25,255,200,118,31,255,204,114,27,255,65, +43,22,255,6,6,5,113,0,32,4,3,3,17,14,11,9,227,195,111,28, +255,206,115,27,255,204,105,25,255,24,17,11,255,0,12,5,5,4,28,13, +10,6,227,125,66,18,255,165,84,18,255,161,85,17,255,161,85,17,255,155, +79,18,255,28,19,9,255,6,5,3,85,0,64,11,9,8,68,86,56,27, +255,204,126,33,255,210,125,33,255,30,21,13,255,0,68,13,11,8,170,195, +115,30,255,209,123,30,255,207,122,30,255,27,19,12,255,3,3,2,28,0, +128,7,6,4,184,131,65,16,255,161,85,17,255,154,78,17,255,15,11,6, +249,0,76,10,8,7,173,166,87,23,255,198,104,21,255,196,99,21,255,35, +23,12,255,3,3,2,85,0,72,13,11,8,170,194,115,31,255,211,124,30, +255,207,122,30,255,27,19,12,255,3,3,2,28,0,108,13,11,8,170,196, +113,31,255,213,132,36,255,211,127,36,255,30,21,13,255,0,40,11,9,6, +170,155,80,20,255,185,94,20,255,180,91,19,255,21,15,8,255,0,255,0, +189,10,8,7,184,183,100,26,255,208,116,27,255,204,114,27,255,26,18,11, +255,4,4,4,28,0,255,0,133,10,8,5,127,119,60,15,255,160,85,19, +255,91,48,16,255,10,8,5,227,4,4,3,28,0,12,9,7,4,161,131, +67,16,255,159,81,18,255,159,78,18,255,18,13,7,249,0,16,7,6,4, +170,57,34,14,255,176,90,21,255,195,95,22,255,26,19,11,232,0,16,17, +14,10,99,179,106,28,255,207,122,30,255,180,109,33,255,25,20,12,255,7, +6,6,170,20,17,11,255,196,114,27,255,208,117,29,255,203,124,30,255,172, +106,35,255,53,36,20,255,10,9,7,108,0,40,9,8,6,170,159,82,20, +255,202,103,23,255,206,111,27,255,22,17,11,255,0,8,10,9,7,139,115, +74,30,255,213,133,48,255,39,28,16,255,0,8,9,8,4,113,67,39,14, +255,181,92,20,255,24,18,9,255,0,12,28,19,9,227,139,79,26,255,206, +117,31,255,212,123,37,255,214,126,41,255,172,106,35,255,53,34,18,255,122, +78,31,255,211,127,44,255,217,136,50,255,216,135,49,255,190,122,41,255,65, +43,22,255,14,11,7,85,0,8,7,6,4,28,29,21,10,249,153,79,20, +255,174,85,19,255,103,53,16,255,17,12,6,244,19,13,6,170,21,14,6, +170,27,17,6,170,21,14,6,212,21,14,6,255,25,17,6,224,12,9,5, +45,0,12,24,16,7,153,22,15,7,255,26,16,7,210,12,9,5,40,0, +8,8,7,5,28,17,13,8,227,114,61,19,255,174,85,19,255,154,79,19, +255,60,33,13,255,11,9,6,170,0,12,10,8,5,170,146,79,19,255,180, +87,19,255,67,39,14,255,8,6,5,85,0,8,24,17,9,255,143,75,20, +255,162,80,19,255,22,15,7,215,0,28,8,7,5,110,60,33,13,255,166, +78,19,255,22,15,7,227,0,8,7,6,4,85,91,51,16,255,174,88,19, +255,169,78,18,255,25,17,8,255,3,3,2,8,0,20,11,9,6,178,143, +74,18,255,177,89,18,255,138,75,19,255,18,13,7,176,0,16,9,7,4, +28,29,19,8,232,41,25,10,255,17,13,8,255,9,8,6,116,0,4,7, +6,4,59,14,11,7,227,32,21,9,255,40,24,9,255,12,9,5,105,0, +32,14,11,9,170,199,124,36,255,213,119,36,255,202,102,21,255,20,14,7, +246,0,152,8,7,5,142,53,31,12,255,162,86,19,255,121,64,18,255,19, +14,8,252,6,5,3,28,0,8,10,8,5,125,142,74,19,255,180,91,19, +255,183,89,19,255,19,14,8,255,0,4,5,5,4,6,15,13,10,193,69, +42,18,255,171,91,20,255,189,88,20,255,200,101,21,255,31,21,12,255,0, +16,10,8,7,28,30,21,13,227,150,92,35,255,208,121,37,255,211,115,30, +255,208,117,29,255,28,21,13,255,0,24,10,8,7,28,22,15,7,198,26, +17,7,255,24,15,7,221,9,7,4,57,0,12,8,7,5,156,171,89,22, +255,202,107,23,255,202,103,23,255,23,18,10,249,0,12,26,18,9,198,29, +19,8,255,24,16,7,215,10,8,5,51,0,12,10,8,5,85,134,70,19, +255,175,88,18,255,173,87,18,255,20,14,7,255,0,24,10,8,5,85,26, +19,9,255,107,58,18,255,154,83,19,255,168,79,19,255,169,78,18,255,173, +87,18,255,172,80,19,255,26,17,7,170,0,8,11,10,8,136,189,99,26, +255,210,115,31,255,216,129,45,255,143,96,40,255,15,13,10,227,12,12,11, +170,15,13,12,170,13,12,10,170,13,12,10,136,9,8,8,85,0,16,11, +9,6,170,169,91,22,255,202,103,23,255,203,108,24,255,18,15,9,255,0, +12,6,5,5,23,28,19,11,156,31,22,12,255,34,24,13,227,14,11,7, +85,0,36,9,8,8,142,72,54,31,255,215,147,60,255,218,146,61,255,174, +100,35,255,14,11,7,142,0,8,11,8,6,102,142,74,19,255,185,86,20, +255,195,98,20,255,18,14,9,249,0,12,10,8,7,170,202,131,47,255,220, +152,63,255,220,151,61,255,22,19,13,252,0,8,11,9,8,167,203,135,46, +255,217,139,48,255,210,120,33,255,18,14,9,255,0,12,9,8,6,170,198, +117,37,255,211,115,30,255,202,102,21,255,34,22,11,176,0,8,13,11,8, +170,202,122,37,255,218,144,49,255,217,144,50,255,28,21,13,255,0,8,12, +11,9,170,204,122,41,255,217,135,46,255,215,136,42,255,46,33,19,255,0, +16,10,9,7,28,21,19,14,227,153,104,46,255,214,149,55,255,158,103,39, +255,16,14,11,221,7,6,6,28,0,20,20,18,13,142,31,26,18,170,25, +21,16,170,24,20,15,170,24,20,15,170,24,20,15,170,24,21,15,170,31, +26,18,170,25,21,16,170,14,12,9,31,0,20,10,9,7,167,75,51,26, +255,202,117,33,255,186,120,43,255,41,32,20,255,12,11,9,85,0,16,11, +9,8,28,31,22,12,215,49,33,18,255,41,27,16,227,12,10,7,85,0, +12,14,12,9,170,204,137,51,255,220,152,63,255,220,151,61,255,23,19,12, +252,0,8,11,10,6,85,136,70,17,255,175,88,18,255,169,78,18,255,15, +11,6,255,0,8,9,8,6,85,26,19,9,255,153,82,18,255,177,89,18, +255,180,84,19,255,24,17,9,218,0,8,11,9,8,147,196,115,35,255,215, +125,38,255,214,125,39,255,20,16,11,255,0,12,9,8,6,159,165,86,22, +255,197,99,20,255,195,90,20,255,32,21,11,170,0,8,12,10,7,85,145, +76,20,255,189,92,20,255,191,96,20,255,18,14,9,255,0,12,9,8,6, +170,199,126,39,255,217,133,50,255,217,144,50,255,23,18,12,252,0,8,11, +10,8,142,191,105,28,255,206,111,27,255,203,104,24,255,19,15,10,255,0, +12,9,8,6,57,21,15,8,198,28,19,9,255,32,21,11,227,11,9,6, +76,0,8,11,9,8,170,203,125,42,255,220,146,59,255,219,146,60,255,24, +19,13,255,0,12,11,10,8,170,204,136,47,255,220,146,59,255,218,147,55, +255,25,19,12,232,0,8,11,10,8,119,161,87,22,255,195,98,20,255,202, +103,23,255,18,15,9,255,0,32,14,12,9,170,200,125,37,255,214,124,37, +255,205,106,26,255,20,16,9,221,0,32,16,13,9,170,205,130,42,255,219, +144,56,255,219,146,60,255,24,19,13,255,0,12,6,5,3,23,21,14,6, +170,26,16,7,255,26,17,7,224,14,10,5,31,0,8,11,9,6,125,170, +89,23,255,211,115,30,255,214,126,41,255,23,19,12,255,0,12,11,10,8, +170,195,112,30,255,206,106,25,255,200,105,21,255,29,20,10,170,0,8,11, +9,6,85,134,70,19,255,177,85,18,255,172,80,19,255,18,13,7,255,0, +40,14,12,9,170,195,112,30,255,206,111,27,255,202,103,23,255,31,22,10, +170,0,8,13,10,6,85,151,79,20,255,189,92,20,255,183,89,19,255,17, +13,8,255,0,4,8,7,5,59,57,34,16,255,184,97,27,255,198,115,33, +255,114,77,33,255,16,14,11,210,6,5,5,8,0,8,12,10,7,170,195, +113,32,255,215,123,42,255,217,133,50,255,32,24,15,255,0,32,12,11,7, +170,175,90,22,255,198,104,21,255,189,92,20,255,192,97,21,255,189,97,22, +255,45,29,14,255,10,9,7,210,22,17,11,255,183,102,30,255,212,121,41, +255,216,135,49,255,217,137,52,255,214,125,39,255,29,21,12,204,0,8,11, +9,6,85,143,75,20,255,193,97,20,255,195,98,20,255,180,93,23,255,88, +54,23,255,11,10,8,113,0,4,14,12,7,85,170,89,23,255,202,103,23, +255,202,102,21,255,32,22,11,178,0,8,12,10,7,113,176,91,23,255,205, +105,24,255,209,117,28,255,39,28,16,255,5,5,5,28,0,8,15,14,10, +198,206,132,45,255,217,133,50,255,215,133,44,255,25,19,12,232,0,8,11, +10,8,125,198,118,39,255,218,145,51,255,218,146,53,255,20,17,11,255,0, +12,9,8,6,170,198,124,37,255,216,134,45,255,214,139,41,255,22,18,11, +255,0,8,11,10,8,136,191,105,28,255,206,111,27,255,206,106,25,255,36, +26,15,255,5,5,4,28,0,8,15,13,10,198,192,105,27,255,206,106,25, +255,204,105,25,255,23,17,10,232,0,8,12,10,7,125,196,119,37,255,218, +141,51,255,218,139,55,255,20,16,11,255,0,12,9,8,6,170,196,110,33, +255,215,126,40,255,214,125,39,255,23,18,12,252,0,8,11,9,8,167,201, +123,40,255,217,133,50,255,214,136,43,255,20,16,11,255,0,12,6,5,5, +23,29,21,12,153,32,22,13,255,35,25,14,227,15,12,8,85,0,24,12, +10,9,170,198,124,37,255,215,125,38,255,213,124,38,255,23,18,12,255,0, +24,14,12,9,170,204,132,47,255,219,144,56,255,211,127,36,255,28,21,13, +255,0,12,14,12,9,170,198,117,37,255,215,123,42,255,214,125,39,255,25, +20,12,215,0,8,11,10,8,130,198,119,35,255,215,126,40,255,212,123,37, +255,30,22,13,255,0,12,14,12,9,170,196,114,33,255,206,106,25,255,200, +105,21,255,30,21,11,184,0,8,13,11,8,99,184,100,25,255,209,117,28, +255,210,115,31,255,28,21,13,255,0,20,14,12,9,170,198,117,37,255,215, +126,40,255,214,126,41,255,25,19,12,255,0,12,10,9,7,125,61,42,22, +255,190,107,33,255,153,98,38,255,29,23,16,255,13,12,10,255,17,15,10, +255,108,74,37,255,210,144,59,255,153,98,38,255,16,14,11,224,6,6,5, +17,0,12,15,13,8,227,115,67,24,255,197,100,22,255,150,81,25,255,32, +24,13,255,15,13,8,255,19,15,10,255,85,48,18,255,178,95,21,255,115, +65,20,255,15,12,8,255,5,5,4,34,0,32,10,9,7,198,69,46,22, +255,186,103,29,255,195,111,28,255,92,58,25,255,15,12,8,198,0,12,10, +9,7,170,194,112,31,255,215,125,38,255,218,146,53,255,24,19,13,255,0, +20,15,14,10,227,159,103,42,255,212,127,43,255,177,118,48,255,19,17,12, +227,6,6,5,28,0,32,11,10,8,170,182,98,23,255,202,106,21,255,195, +98,20,255,24,17,9,212,0,12,18,14,9,227,102,54,19,255,157,83,18, +255,85,46,14,255,19,13,6,255,47,27,10,255,150,81,19,255,131,67,20, +255,39,26,14,255,12,11,9,85,0,64,10,9,7,170,118,75,33,255,215, +141,54,255,44,33,19,255,0,16,9,9,8,108,19,17,12,170,27,23,16, +170,23,21,16,170,23,21,16,170,24,20,15,170,20,18,13,170,15,14,10, +170,10,9,7,113,7,6,6,28,0,12,12,11,9,170,189,99,26,255,209, +110,30,255,211,118,36,255,141,88,36,255,19,17,12,227,20,18,13,170,24, +20,15,170,21,19,14,170,16,14,11,170,10,9,7,113,6,6,5,28,0, +20,8,7,5,65,11,10,8,142,16,14,11,170,24,21,15,170,25,22,16, +170,23,21,16,170,21,19,14,170,16,14,11,170,11,10,8,113,7,7,6, +28,0,20,8,7,5,62,10,9,5,136,12,10,7,170,14,11,7,170,13, +10,6,170,11,9,6,198,31,21,10,255,153,82,18,255,177,85,18,255,169, +78,18,255,22,15,7,204,0,16,8,7,5,57,11,10,6,142,19,17,12, +170,23,21,16,170,25,22,16,170,23,21,16,170,21,19,14,170,15,14,10, +170,10,10,9,113,7,6,6,28,0,16,12,10,7,153,55,32,14,255,175, +93,20,255,185,94,20,255,183,89,19,255,80,44,17,255,13,11,8,187,7, +6,6,25,0,16,8,7,5,62,11,10,6,142,16,14,11,170,23,19,14, +170,25,22,16,170,23,21,16,170,19,17,12,170,15,14,10,170,17,15,10, +170,19,17,12,142,9,8,8,28,0,8,12,10,9,170,204,137,49,255,220, +146,59,255,218,146,53,255,141,91,38,255,19,17,12,227,19,17,12,170,24, +20,15,170,21,19,14,170,15,14,10,170,10,10,9,113,7,6,6,28,0, +16,12,10,7,57,14,12,7,102,14,11,7,85,0,32,12,10,7,57,13, +11,8,105,15,13,8,85,0,12,12,11,9,170,204,136,47,255,220,146,59, +255,218,153,59,255,24,19,13,255,0,12,8,7,5,82,11,10,6,156,11, +9,6,170,10,9,7,91,0,12,10,8,5,127,144,78,19,255,180,87,19, +255,174,81,19,255,24,15,7,210,0,12,14,11,7,68,12,10,7,170,12, +10,7,170,17,15,10,170,24,20,15,170,19,17,12,170,15,14,10,170,18, +15,11,170,24,21,15,170,21,19,14,170,15,14,10,170,11,10,8,113,7, +7,6,28,0,16,15,13,10,119,17,15,12,170,15,13,10,170,16,14,11, +170,19,17,12,170,21,18,12,170,18,15,11,170,15,13,8,170,11,9,6, +170,10,8,7,88,6,5,5,23,0,20,10,9,7,85,14,12,9,170,19, +17,12,170,21,19,14,170,21,19,14,170,21,19,14,170,19,17,12,170,15, +14,10,170,11,10,8,116,7,7,6,28,0,16,15,14,10,119,18,15,11, +170,15,14,10,170,18,15,11,170,21,19,14,170,25,22,16,170,23,21,16, +170,21,19,14,170,16,14,11,170,11,10,8,113,7,7,6,28,0,20,10, +9,7,85,14,12,9,170,19,17,12,170,20,18,13,170,20,18,13,170,23, +19,14,170,19,17,12,170,15,14,10,170,17,14,10,170,19,17,12,142,10, +9,7,28,0,12,15,13,10,113,18,15,11,170,15,14,10,170,18,15,11, +170,21,19,14,170,25,22,16,170,23,21,16,170,20,18,13,170,16,14,11, +170,11,10,8,113,7,7,6,28,0,20,7,7,6,82,11,10,6,142,16, +13,9,170,19,17,12,170,21,19,14,170,24,21,15,170,25,22,16,170,25, +22,16,170,15,13,10,170,12,11,9,57,0,16,15,13,10,170,97,65,34, +255,209,132,42,255,214,136,43,255,214,127,43,255,159,103,42,255,21,19,14, +227,11,10,8,28,0,12,16,14,11,113,21,19,14,170,18,15,11,153,11, +10,8,28,0,16,15,14,10,125,21,19,14,170,19,17,12,142,10,9,7, +28,0,12,15,14,10,113,21,19,14,170,18,16,11,153,11,10,8,28,0, +16,15,13,10,125,21,19,14,170,19,17,12,142,10,9,7,28,0,12,15, +14,10,113,21,19,14,170,18,16,11,153,11,10,8,28,0,24,15,14,10, +125,21,19,14,170,19,17,12,142,9,9,8,28,0,12,17,14,10,130,27, +24,16,170,21,19,14,142,10,9,7,28,0,16,16,14,11,113,28,24,17, +170,24,21,15,161,12,11,9,28,0,12,16,14,11,113,21,19,14,170,18, +15,11,153,11,10,8,28,0,16,15,13,10,125,21,19,14,170,19,17,12, +142,9,8,6,28,0,12,18,15,11,136,19,16,10,170,16,13,9,170,16, +14,9,170,15,13,8,170,13,11,8,170,12,11,9,170,13,12,8,170,15, +14,10,170,14,13,11,170,11,11,10,113,0,20,13,11,8,170,190,98,23, +255,204,116,31,255,74,52,27,255,9,8,8,113,0,16,13,11,8,170,192, +106,29,255,208,112,27,255,208,117,29,255,27,21,12,255,0,16,5,5,4, +28,27,23,16,255,199,121,44,255,214,139,41,255,31,23,14,255,0,16,13, +11,8,28,32,24,13,227,36,26,15,255,19,16,12,198,8,8,7,51,0, +4,8,8,7,57,29,21,12,218,48,32,17,255,45,30,16,255,20,16,11, +218,10,9,7,105,0,44,14,12,9,170,204,130,51,255,224,153,77,255,225, +169,88,255,33,27,18,255,0,12,21,19,14,215,217,163,86,255,61,46,28, +255,0,12,19,16,12,201,203,121,40,255,51,38,22,255,0,12,4,4,3, +25,16,14,11,227,212,147,71,255,224,160,77,255,223,161,80,255,31,25,16, +255,4,4,4,102,10,10,9,215,206,133,55,255,223,156,70,255,224,164,85, +255,51,39,24,255,5,5,4,82,0,12,15,12,8,110,178,98,27,255,211, +115,30,255,211,121,34,255,36,26,15,255,3,3,2,85,0,60,8,8,5, +28,27,20,10,232,125,73,22,255,190,97,21,255,180,92,21,255,97,56,20, +255,14,11,7,170,0,16,12,10,7,142,165,89,22,255,198,104,21,255,84, +50,19,255,7,6,4,159,0,4,5,5,4,82,32,23,11,255,121,69,22, +255,97,56,20,255,15,13,8,142,0,32,14,12,7,198,172,92,21,255,28, +19,9,207,0,8,11,10,6,85,148,78,21,255,198,104,21,255,192,97,21, +255,21,15,8,255,0,24,10,9,5,170,167,90,22,255,202,93,21,255,202, +103,23,255,21,16,10,255,0,20,4,3,3,133,20,16,9,255,151,80,22, +255,75,42,16,255,10,8,7,255,32,22,11,255,164,86,23,255,60,39,17, +255,5,5,4,252,0,36,12,11,9,198,213,155,80,255,224,166,83,255,211, +121,34,255,20,16,9,255,3,3,2,28,0,144,6,6,5,51,27,20,10, +255,160,84,23,255,198,104,21,255,67,40,16,255,8,7,5,125,0,12,12, +10,9,170,195,112,30,255,215,125,38,255,217,133,50,255,49,35,22,255,5, +5,4,133,13,12,10,210,189,119,50,255,211,127,44,255,212,121,41,255,218, +135,53,255,220,148,63,255,34,27,17,255,0,20,4,4,4,17,13,12,10, +227,196,113,31,255,212,118,35,255,214,123,43,255,33,26,16,255,0,56,12, +11,9,187,208,134,55,255,223,146,70,255,221,152,70,255,34,26,17,255,0, +40,8,7,5,164,165,86,22,255,202,98,21,255,198,96,21,255,22,16,9, +255,0,20,8,8,5,85,32,22,11,255,167,87,22,255,160,84,23,255,93, +54,20,255,120,65,21,255,188,96,21,255,196,99,21,255,200,105,21,255,24, +19,11,207,0,8,15,14,10,110,208,152,71,255,227,174,98,255,228,179,103, +255,225,176,98,255,217,169,94,255,213,166,92,255,215,167,92,255,213,155,80, +255,204,136,55,255,138,89,37,255,25,22,16,227,9,9,8,28,0,8,11, +10,8,170,203,129,50,255,223,149,70,255,222,158,75,255,31,25,16,255,4, +4,4,28,0,60,8,8,7,57,49,40,26,255,206,152,83,255,224,169,91, +255,194,140,71,255,31,27,20,255,9,8,8,28,0,8,12,10,9,161,196, +110,33,255,218,130,51,255,222,158,75,255,31,25,16,255,4,4,4,28,0, +8,11,10,8,198,213,160,84,255,228,180,105,255,227,175,100,255,33,28,18, +207,0,8,12,11,9,130,210,155,77,255,228,169,99,255,226,172,95,255,30, +25,17,255,4,4,4,28,0,8,11,10,8,198,204,129,49,255,214,127,43, +255,213,125,40,255,23,19,12,232,0,8,14,13,9,125,208,152,71,255,223, +159,76,255,218,153,59,255,33,26,16,210,0,8,13,12,10,127,198,118,39, +255,215,127,42,255,213,126,42,255,41,31,18,227,0,12,6,6,5,28,25, +21,16,227,204,150,79,255,223,171,98,255,175,122,60,255,18,15,11,218,5, +4,4,17,0,20,20,18,13,85,177,101,34,255,204,123,37,255,199,117,36, +255,199,117,36,255,202,122,37,255,199,117,36,255,198,114,31,255,198,110,31, +255,202,118,35,255,46,33,21,170,0,24,10,9,7,153,110,78,37,255,213, +162,82,255,218,164,87,255,67,51,30,255,9,8,8,85,0,40,6,5,5, +28,21,19,14,255,217,166,92,255,227,175,100,255,224,169,91,255,31,25,16, +215,0,8,12,10,7,85,154,80,21,255,197,99,20,255,192,97,21,255,28, +20,9,255,4,3,3,110,11,9,6,170,117,63,20,255,184,94,21,255,198, +104,21,255,203,104,24,255,210,122,37,255,21,17,12,252,0,8,10,9,7, +161,203,129,50,255,224,160,77,255,225,169,88,255,30,25,17,255,4,4,4, +28,0,8,8,7,5,190,165,86,22,255,198,104,21,255,196,99,21,255,28, +19,9,170,0,8,13,11,8,85,176,91,23,255,208,112,27,255,210,121,35, +255,27,22,14,255,4,4,4,28,0,8,11,10,8,198,211,149,76,255,224, +168,87,255,224,162,81,255,32,26,17,210,0,8,12,10,7,113,176,91,23, +255,202,107,23,255,202,95,23,255,20,16,9,255,0,40,15,13,10,170,213, +160,84,255,228,180,105,255,227,174,98,255,33,26,18,255,0,12,15,13,10, +170,213,155,80,255,226,172,95,255,224,167,85,255,23,20,14,244,0,8,11, +10,8,127,189,104,28,255,214,127,43,255,221,148,70,255,31,25,16,255,4, +4,4,28,0,28,14,12,9,170,195,113,32,255,209,117,28,255,202,103,23, +255,20,15,9,252,3,3,3,14,0,28,15,14,10,170,213,155,80,255,226, +172,95,255,221,152,70,255,28,24,15,255,0,40,14,12,9,170,208,141,61, +255,225,162,88,255,227,174,98,255,33,26,18,255,4,4,4,28,0,8,10, +8,7,198,182,98,23,255,202,103,23,255,198,104,21,255,28,19,9,170,0, +8,11,10,6,85,154,80,21,255,202,98,21,255,202,103,23,255,25,20,12, +255,0,40,12,10,7,170,186,100,23,255,202,99,23,255,200,105,21,255,30, +21,9,170,0,8,12,9,7,85,154,80,21,255,198,104,21,255,196,99,21, +255,28,20,9,255,4,4,3,113,11,10,6,227,183,100,26,255,212,127,43, +255,167,117,52,255,17,15,12,215,5,5,5,14,0,12,15,13,10,170,211, +149,76,255,224,166,83,255,223,161,80,255,34,26,17,255,0,32,10,9,7, +170,167,87,22,255,198,92,21,255,196,99,21,255,196,95,21,255,198,92,21, +255,195,99,22,255,192,106,29,255,206,127,43,255,217,141,60,255,223,146,70, +255,224,165,81,255,220,148,63,255,212,124,39,255,25,19,12,215,0,8,12, +11,9,116,196,116,37,255,218,141,51,255,218,139,55,255,218,142,61,255,215, +143,58,255,24,19,13,212,0,4,10,9,7,156,203,129,50,255,221,150,66, +255,220,148,63,255,25,21,14,227,0,8,10,10,7,159,204,134,59,255,225, +160,84,255,225,169,88,255,36,29,19,255,0,12,15,14,10,170,204,130,51, +255,220,142,59,255,218,139,55,255,21,18,12,249,0,8,11,10,8,142,206, +145,67,255,226,172,95,255,227,174,98,255,32,26,17,255,4,4,4,28,0, +8,11,10,8,198,198,117,37,255,215,125,38,255,211,122,36,255,28,21,13, +215,0,8,13,11,8,96,174,91,23,255,202,107,23,255,202,103,23,255,22, +17,9,255,0,12,11,10,6,170,176,91,23,255,202,103,23,255,203,108,24, +255,21,15,10,238,0,8,11,10,8,142,206,145,67,255,226,170,91,255,224, +160,85,255,30,24,17,255,4,4,4,28,0,8,11,10,8,198,209,149,70, +255,224,160,77,255,222,158,75,255,31,25,16,212,0,8,12,11,9,127,198, +116,35,255,215,125,38,255,211,122,36,255,28,21,13,255,4,4,4,28,0, +52,13,12,8,170,195,112,30,255,209,110,30,255,207,105,30,255,25,20,12, +255,0,24,15,14,10,170,213,158,80,255,226,172,95,255,224,164,85,255,33, +27,18,255,0,12,15,14,10,170,210,143,65,255,224,168,87,255,224,165,81, +255,25,21,14,232,0,8,10,10,9,153,208,147,67,255,224,166,83,255,222, +158,75,255,34,26,17,255,0,12,15,14,10,170,211,149,76,255,223,149,70, +255,219,146,60,255,25,20,14,235,0,8,10,10,9,150,204,134,59,255,224, +156,83,255,224,165,81,255,33,27,18,255,0,20,15,14,10,170,211,150,70, +255,226,170,91,255,226,172,95,255,33,26,18,255,0,16,9,9,8,150,101, +74,38,255,198,145,77,255,206,157,87,255,202,151,79,255,197,141,74,255,200, +146,75,255,180,126,57,255,21,19,14,227,5,5,4,28,0,16,8,7,5, +113,43,28,14,255,187,96,22,255,181,93,22,255,98,55,21,255,68,42,17, +255,77,46,18,255,129,72,22,255,174,89,21,255,83,47,18,255,11,9,6, +221,0,28,6,6,5,28,16,14,11,195,108,76,35,255,210,141,59,255,218, +162,81,255,167,118,54,255,16,14,11,221,5,5,5,14,0,12,15,13,10, +170,211,149,76,255,224,168,87,255,223,154,80,255,31,25,16,255,0,20,6, +6,5,57,34,27,17,255,203,122,36,255,208,124,41,255,109,76,34,255,13, +12,10,142,0,32,13,11,8,170,176,91,23,255,202,93,21,255,196,99,21, +255,28,19,9,170,0,8,11,9,6,85,132,71,21,255,195,99,22,255,103, +59,20,255,11,10,6,170,3,3,2,25,6,6,5,110,55,35,16,255,198, +113,29,255,212,134,51,255,41,32,20,210,0,68,21,19,14,215,217,163,86, +255,49,38,24,255,0,12,11,10,8,82,54,43,27,255,200,135,59,255,210, +137,59,255,207,131,50,255,205,127,44,255,199,117,36,255,195,111,28,255,187, +101,24,255,93,54,22,255,19,15,10,227,7,6,6,28,0,8,10,9,7, +170,195,109,32,255,218,138,53,255,224,158,81,255,223,173,95,255,219,167,94, +255,217,169,94,255,218,171,97,255,217,166,92,255,208,136,59,255,110,68,27, +255,19,15,10,227,6,6,5,28,0,12,12,11,7,170,61,42,20,255,188, +106,33,255,208,134,55,255,215,163,82,255,217,166,92,255,216,167,88,255,216, +167,89,255,211,150,70,255,146,94,39,255,26,21,15,229,9,8,6,28,0, +12,12,10,7,170,51,32,14,255,151,80,22,255,169,91,22,255,173,86,22, +255,169,88,22,255,173,86,22,255,180,92,21,255,194,98,21,255,196,95,21, +255,192,97,21,255,31,21,10,170,0,12,12,10,7,170,57,37,18,255,189, +107,34,255,212,149,67,255,217,166,92,255,217,166,92,255,218,171,97,255,215, +163,82,255,205,126,48,255,116,72,29,255,20,16,11,227,6,6,5,28,0, +8,11,9,6,68,126,68,21,255,191,98,22,255,194,98,21,255,192,97,21, +255,192,97,21,255,191,98,22,255,177,91,22,255,26,19,9,142,0,12,12, +10,7,170,58,37,17,255,185,107,30,255,208,134,55,255,216,167,88,255,218, +171,97,255,217,166,92,255,213,148,72,255,204,130,51,255,209,141,60,255,211, +159,76,255,30,25,17,170,0,8,10,10,7,167,210,155,77,255,228,178,99, +255,224,165,81,255,221,165,86,255,217,166,92,255,218,169,93,255,217,166,92, +255,214,156,81,255,206,135,51,255,116,72,29,255,20,16,11,227,6,6,5, +28,0,8,13,10,6,57,115,62,20,255,169,91,22,255,165,86,22,255,24, +18,9,167,0,24,12,10,7,88,117,63,20,255,186,100,23,255,191,107,32, +255,35,27,16,144,0,8,10,10,7,170,210,155,77,255,228,178,99,255,221, +152,70,255,24,19,13,255,0,8,12,10,7,170,58,36,15,255,157,79,22, +255,151,80,22,255,58,35,15,255,11,9,6,57,0,8,12,10,7,85,157, +81,20,255,197,99,20,255,192,97,21,255,28,20,9,170,0,8,11,9,6, +57,115,62,20,255,189,94,24,255,198,117,37,255,213,157,76,255,218,171,97, +255,217,169,94,255,214,161,85,255,213,157,76,255,212,149,67,255,208,134,55, +255,205,126,48,255,143,96,40,255,28,26,19,229,8,8,7,28,0,8,13, +12,8,85,141,74,24,255,190,94,23,255,183,95,24,255,183,95,24,255,187, +93,24,255,189,97,22,255,181,93,22,255,177,91,22,255,169,88,22,255,89, +52,20,255,21,18,12,227,9,9,8,28,0,12,18,17,13,181,103,74,40, +255,207,146,74,255,214,156,81,255,210,144,67,255,208,138,55,255,207,129,52, +255,205,133,48,255,205,126,48,255,151,101,42,255,28,26,19,232,9,8,8, +28,0,8,13,12,10,110,186,127,63,255,214,156,81,255,213,158,80,255,213, +155,80,255,214,156,81,255,214,153,75,255,213,148,72,255,213,148,72,255,211, +150,70,255,159,111,54,255,28,25,19,241,9,8,8,31,0,12,18,17,13, +181,103,74,40,255,208,156,81,255,214,156,81,255,208,138,55,255,209,137,60, +255,213,158,80,255,213,155,80,255,213,160,84,255,215,160,88,255,213,163,84, +255,30,24,17,178,0,8,12,11,9,93,178,121,53,255,213,158,80,255,210, +143,65,255,211,146,62,255,213,148,72,255,215,163,82,255,213,158,80,255,212, +149,67,255,209,141,60,255,153,106,49,255,28,25,19,235,9,9,8,31,0, +12,18,15,11,173,66,43,21,255,187,101,32,255,207,132,52,255,210,144,67, +255,213,148,72,255,214,156,81,255,216,167,88,255,214,156,81,255,176,128,65, +255,46,39,27,255,0,12,15,14,10,85,181,111,42,255,215,136,52,255,213, +125,40,255,211,122,36,255,212,123,37,255,210,123,39,255,202,122,37,255,31, +24,14,170,0,8,12,11,9,88,164,89,29,255,203,122,36,255,199,117,36, +255,30,23,15,212,0,12,15,13,10,127,187,133,62,255,213,148,72,255,208, +138,55,255,31,24,16,170,0,8,13,12,10,85,172,104,37,255,209,134,54, +255,206,135,51,255,32,25,17,212,0,12,15,13,10,127,181,116,46,255,211, +143,62,255,210,153,71,255,29,24,16,178,0,8,13,12,10,91,178,121,53, +255,213,154,70,255,208,134,55,255,31,25,16,210,0,20,15,14,10,125,179, +110,42,255,210,135,55,255,208,139,65,255,26,21,15,184,0,8,14,13,9, +85,179,117,44,255,217,165,82,255,213,163,84,255,27,23,16,221,0,12,14, +12,9,136,174,103,39,255,206,127,43,255,199,117,36,255,31,24,14,170,0, +8,12,11,9,88,164,89,29,255,202,118,35,255,196,114,33,255,29,22,14, +210,0,12,14,12,9,125,169,95,30,255,202,119,37,255,199,119,39,255,24, +19,13,190,0,8,14,12,9,85,170,95,29,255,198,113,29,255,199,116,34, +255,204,128,47,255,206,135,51,255,204,129,49,255,204,129,49,255,208,134,55, +255,211,149,76,255,192,140,73,255,95,74,39,255,17,15,12,85,0,16,14, +12,9,198,211,150,70,255,206,152,81,255,31,26,20,255,7,7,6,48,0, +16,15,13,10,170,211,149,76,255,226,170,91,255,226,172,95,255,35,28,18, +255,0,20,15,14,12,218,171,120,60,255,219,154,70,255,41,31,20,255,4, +4,3,28,0,104,17,16,12,170,219,179,116,255,232,193,137,255,232,199,135, +255,40,33,23,255,0,12,10,10,9,76,62,50,31,255,20,18,13,167,0, +12,11,10,8,76,58,46,29,255,20,18,13,167,0,16,13,12,10,170,210, +150,71,255,223,147,72,255,221,150,66,255,26,21,15,210,0,4,11,10,8, +119,211,159,84,255,229,184,114,255,230,186,123,255,30,26,19,255,0,16,12, +11,9,93,137,90,40,255,223,167,94,255,228,180,111,255,167,133,80,255,17, +16,14,227,11,11,10,170,12,11,9,170,12,11,9,170,12,11,9,119,7, +7,6,57,0,36,7,7,6,62,21,18,12,227,157,92,28,255,203,105,26, +255,197,106,26,255,82,48,21,255,14,12,7,173,5,5,4,8,0,16,8, +7,5,28,26,19,11,227,103,68,25,255,158,96,29,255,57,41,22,255,13, +12,10,241,33,26,16,255,146,88,31,255,66,47,23,255,12,10,9,201,6, +5,5,14,0,32,8,7,5,57,30,22,11,255,15,12,8,96,0,8,10, +10,7,130,190,104,27,255,209,118,30,255,211,117,34,255,27,21,14,255,0, +24,13,12,10,170,199,122,39,255,218,130,51,255,223,146,70,255,30,24,17, +255,0,12,23,22,18,139,30,27,21,170,16,15,11,255,89,59,26,255,203, +110,28,255,196,113,31,255,122,81,33,255,186,117,43,255,216,129,51,255,184, +126,57,255,38,34,25,255,24,22,19,221,33,30,24,170,15,15,12,28,0, +12,24,22,19,142,32,31,25,170,21,20,16,198,90,71,45,255,223,179,110, +255,226,172,95,255,221,150,66,255,143,100,44,255,22,21,17,227,28,27,21, +170,29,28,22,170,13,13,12,42,0,36,8,8,8,11,25,24,20,142,39, +35,28,170,30,28,23,170,29,27,22,170,29,27,22,170,29,27,22,170,29, +27,22,170,29,27,20,170,23,21,16,170,14,13,11,34,0,52,13,12,10, +159,142,86,31,255,208,116,35,255,201,119,38,255,32,26,17,255,5,5,4, +28,0,12,14,13,11,170,216,167,97,255,231,184,124,255,231,193,128,255,181, +146,92,255,52,44,33,255,90,71,45,255,201,155,88,255,223,173,102,255,228, +179,115,255,230,183,123,255,230,184,119,255,39,32,22,255,0,24,12,12,11, +170,206,139,61,255,226,164,91,255,228,174,103,255,39,32,22,255,0,48,6, +6,5,28,9,9,8,142,56,46,31,255,222,180,113,255,230,187,119,255,222, +180,113,255,23,21,16,255,0,36,15,14,12,164,79,59,30,255,209,128,42, +255,211,127,44,255,171,117,46,255,18,15,11,170,0,16,9,9,8,116,33, +28,16,255,161,94,28,255,199,107,26,255,65,40,18,255,8,7,5,255,25, +20,12,255,198,113,29,255,210,120,33,255,217,133,50,255,27,23,16,255,0, +8,7,7,6,23,34,28,19,198,46,36,25,255,39,31,22,255,41,33,22, +255,59,46,28,255,51,40,26,255,61,47,28,255,180,133,71,255,227,175,100, +255,226,175,103,255,181,143,88,255,17,16,12,142,0,8,11,11,10,170,214, +166,97,255,229,179,114,255,228,185,111,255,161,121,68,255,23,21,16,227,23, +22,18,170,22,21,17,170,16,15,13,170,11,11,8,147,8,8,7,85,0, +40,14,13,11,170,181,143,88,255,228,185,123,255,218,168,97,255,70,54,35, +255,9,9,8,113,0,12,11,10,8,85,120,87,45,255,223,183,120,255,231, +190,132,255,167,135,80,255,24,22,19,227,19,18,16,170,19,18,16,198,95, +80,46,255,226,193,129,255,228,187,129,255,186,148,87,255,15,14,12,170,0, +8,10,10,9,85,155,113,64,255,229,196,132,255,232,191,133,255,179,142,90, +255,27,25,20,227,18,18,15,170,19,18,16,198,90,71,45,255,222,175,101, +255,227,174,98,255,228,185,111,255,28,25,19,255,0,8,7,7,6,23,34, +28,19,198,49,35,22,255,39,29,18,227,12,11,9,85,0,8,8,7,7, +28,33,26,16,198,52,39,23,255,47,35,22,227,13,12,8,85,0,8,8, +8,7,28,33,30,24,227,201,157,100,255,230,186,123,255,181,137,74,255,16, +15,11,207,6,6,5,23,0,24,11,10,8,28,27,21,12,193,26,19,11, +255,23,18,10,255,23,18,10,255,24,18,11,255,24,18,11,255,26,20,11, +255,35,27,16,255,42,31,19,241,17,14,10,85,0,28,9,9,8,144,91, +67,36,255,217,154,72,255,211,150,70,255,69,55,34,255,15,14,12,85,0, +28,6,6,5,11,11,11,10,142,24,22,19,255,167,135,80,255,225,172,104, +255,224,166,83,255,193,126,54,255,16,14,11,170,0,8,13,12,8,85,185, +97,26,255,207,112,28,255,204,110,27,255,71,46,22,255,8,8,7,255,28, +22,13,255,198,107,27,255,193,111,30,255,126,78,31,255,199,139,62,255,226, +184,111,255,27,24,18,255,0,8,11,10,8,170,214,166,97,255,230,187,119, +255,228,179,103,255,143,102,48,255,17,16,12,227,12,12,9,170,13,12,10, +198,46,33,17,255,199,112,28,255,206,111,27,255,204,110,27,255,32,23,13, +176,0,8,12,11,9,136,204,134,59,255,226,172,95,255,228,181,107,255,162, +125,73,255,24,22,19,227,19,18,16,170,19,18,16,198,95,80,46,255,224, +179,109,255,223,173,95,255,173,117,50,255,15,13,10,156,0,8,12,11,7, +99,185,97,26,255,208,112,27,255,204,110,27,255,22,18,11,255,0,40,16, +15,13,170,219,179,116,255,232,194,133,255,231,193,128,255,40,33,23,255,0, +12,16,15,13,170,219,177,112,255,230,187,119,255,224,159,83,255,24,21,15, +255,0,8,11,10,8,164,211,158,82,255,229,184,114,255,230,191,123,255,166, +127,77,255,22,21,17,227,22,21,17,170,20,19,13,170,14,13,11,28,0, +16,12,11,9,170,195,112,30,255,209,106,30,255,206,111,27,255,101,63,26, +255,16,14,11,227,23,21,16,170,29,27,22,170,13,13,12,42,0,16,16, +15,13,170,216,167,97,255,224,158,87,255,216,125,45,255,24,20,13,255,0, +40,17,16,12,170,219,177,112,255,232,195,137,255,231,189,128,255,162,125,73, +255,22,21,17,227,14,14,11,170,13,12,10,198,50,35,19,255,199,112,28, +255,206,111,27,255,204,110,27,255,32,24,13,170,0,8,13,12,8,93,194, +109,33,255,219,139,54,255,224,158,81,255,39,32,22,255,0,40,11,10,8, +170,190,104,27,255,208,112,27,255,204,110,27,255,32,24,13,170,0,8,13, +12,8,85,184,96,25,255,207,112,28,255,204,102,27,255,129,78,28,255,31, +26,16,255,127,84,34,255,219,147,70,255,173,122,62,255,15,14,12,212,6, +6,5,25,0,16,16,15,13,170,213,155,80,255,221,144,68,255,217,130,52, +255,31,25,16,255,0,32,10,9,7,170,189,99,26,255,208,112,27,255,204, +110,27,255,155,87,26,255,72,46,21,255,179,103,36,255,223,156,76,255,216, +170,97,255,134,96,47,255,174,127,71,255,221,167,90,255,223,147,72,255,222, +158,75,255,23,19,14,252,0,8,11,10,8,170,214,166,97,255,231,187,124, +255,230,191,123,255,228,182,117,255,222,175,101,255,64,50,33,255,7,7,6, +229,26,23,19,255,220,175,105,255,228,183,113,255,228,188,117,255,25,21,16, +255,0,8,11,10,8,170,217,176,112,255,232,197,137,255,232,199,135,255,37, +31,22,255,0,12,13,12,10,170,198,117,37,255,215,127,42,255,217,130,52, +255,21,19,14,255,0,8,11,10,8,167,215,172,104,255,232,191,133,255,231, +190,132,255,166,127,77,255,23,21,16,227,18,17,15,170,17,16,12,198,74, +52,27,255,204,117,33,255,211,111,30,255,173,93,28,255,15,12,8,164,0, +8,13,12,8,88,185,97,26,255,208,112,27,255,204,110,27,255,19,16,10, +255,0,12,10,9,7,170,190,104,27,255,212,118,35,255,216,136,51,255,21, +19,14,252,0,8,11,10,8,167,215,172,104,255,232,194,127,255,231,193,128, +255,166,129,77,255,23,21,16,227,19,18,16,170,19,18,14,198,81,59,34, +255,213,144,62,255,215,140,60,255,165,108,40,255,13,12,10,167,0,8,8, +8,7,85,101,63,26,255,206,114,33,255,212,121,33,255,155,92,36,255,23, +21,16,227,22,21,17,170,28,26,21,170,21,20,18,170,13,13,12,164,10, +10,9,85,6,6,6,6,0,28,12,11,9,170,194,112,31,255,212,119,37, +255,216,134,45,255,35,28,18,255,0,24,16,15,13,170,217,171,106,255,231, +187,124,255,228,181,107,255,39,32,22,255,0,12,16,15,11,170,208,134,55, +255,223,156,70,255,221,148,70,255,23,20,14,238,0,8,11,10,8,170,204, +136,55,255,223,156,70,255,222,158,75,255,34,28,19,255,0,12,14,13,11, +170,217,171,106,255,232,189,127,255,230,186,123,255,25,22,16,255,0,8,10, +10,9,167,210,155,77,255,226,172,95,255,224,165,81,255,31,26,18,255,0, +20,15,13,12,170,217,173,104,255,232,191,133,255,231,195,132,255,40,33,23, +255,0,20,10,9,9,133,73,58,36,255,225,184,120,255,231,193,128,255,228, +180,111,255,147,102,48,255,15,13,10,227,8,7,7,28,0,24,12,11,7, +198,100,59,23,255,169,93,26,255,156,91,27,255,174,96,27,255,180,99,27, +255,168,97,27,255,105,62,24,255,18,15,9,255,7,6,6,48,0,24,7, +7,7,28,15,15,12,227,144,114,67,255,219,177,112,255,223,176,102,255,153, +113,62,255,17,16,12,227,7,7,6,28,0,16,16,15,13,170,213,155,80, +255,223,146,70,255,217,129,50,255,27,22,14,255,0,24,12,10,9,195,161, +94,28,255,207,114,32,255,193,114,36,255,23,20,16,255,0,32,12,11,9, +170,191,105,28,255,207,100,28,255,204,110,27,255,26,20,11,204,0,8,6, +5,5,3,26,19,9,198,24,18,9,246,15,12,8,142,0,12,15,13,10, +91,31,24,16,244,51,39,24,255,21,19,14,91,0,68,10,10,9,76,61, +49,30,255,20,18,13,156,0,16,17,15,12,142,27,22,14,232,30,22,13, +255,25,20,12,255,22,18,11,238,21,16,10,255,99,58,22,255,203,113,26, +255,205,111,28,255,131,80,30,255,12,11,9,142,0,8,11,10,8,170,212, +160,85,255,232,191,127,255,231,195,132,255,196,155,91,255,81,59,34,255,41, +32,20,255,54,43,27,255,180,133,71,255,216,144,59,255,208,115,33,255,129, +78,28,255,12,11,7,142,0,8,8,7,7,57,72,52,29,255,215,155,78, +255,227,174,98,255,207,158,94,255,85,63,34,255,36,29,19,255,57,43,26, +255,189,130,66,255,219,149,66,255,212,121,41,255,172,105,33,255,17,15,10, +147,0,8,7,6,6,54,58,40,21,255,198,113,29,255,206,103,27,255,165, +87,24,255,42,28,13,255,21,16,8,255,27,20,10,255,95,60,22,255,202, +105,27,255,206,100,29,255,204,110,27,255,35,24,12,170,0,8,7,7,6, +54,70,50,27,255,212,145,65,255,227,174,98,255,201,155,88,255,59,44,28, +255,23,20,14,255,34,28,19,255,157,104,48,255,211,126,42,255,208,115,33, +255,132,82,29,255,13,11,8,142,0,12,24,18,9,221,108,61,23,255,201, +112,26,255,207,112,28,255,204,110,27,255,158,91,25,255,46,29,13,249,11, +10,6,57,0,8,8,8,7,57,70,50,27,255,212,142,59,255,226,172,95, +255,207,158,94,255,85,63,34,255,41,32,20,255,57,43,26,255,174,124,59, +255,224,170,93,255,229,184,114,255,231,196,128,255,28,25,19,255,0,8,10, +10,9,167,215,169,102,255,232,191,127,255,231,193,128,255,196,154,87,255,77, +59,34,255,41,31,20,255,54,43,27,255,168,113,49,255,212,121,41,255,206, +114,33,255,132,82,29,255,12,11,9,130,0,8,12,11,7,110,188,98,25, +255,206,111,27,255,206,106,25,255,26,19,11,255,0,24,14,12,9,170,199, +117,36,255,221,148,62,255,227,174,98,255,28,26,19,255,0,8,10,10,9, +167,212,161,89,255,224,166,83,255,217,129,50,255,32,24,15,255,5,5,4, +31,7,7,6,136,65,44,22,255,192,106,29,255,203,108,24,255,114,66,23, +255,17,13,8,221,0,12,10,9,7,139,185,97,26,255,208,112,27,255,208, +117,29,255,32,24,13,170,0,8,15,13,8,91,189,99,26,255,215,123,42, +255,226,172,95,255,198,152,87,255,81,58,34,255,176,133,71,255,224,168,95, +255,197,138,62,255,65,47,26,255,133,81,30,255,208,121,37,255,212,115,37, +255,152,98,35,255,12,11,9,142,0,8,10,9,7,147,190,107,25,255,206, +111,27,255,206,106,25,255,158,91,25,255,42,28,13,255,21,15,8,255,26, +19,9,255,114,66,23,255,204,113,25,255,208,115,33,255,173,122,62,255,16, +15,13,150,0,8,8,8,7,71,110,87,51,255,222,180,113,255,224,166,83, +255,209,137,60,255,133,84,32,255,77,50,24,255,89,59,26,255,181,109,32, +255,210,121,35,255,212,121,41,255,171,116,52,255,15,14,12,142,0,8,14, +13,11,170,219,177,112,255,231,187,124,255,228,180,111,255,205,158,90,255,79, +58,32,255,38,29,19,255,49,35,22,255,167,114,46,255,217,146,62,255,219, +154,70,255,169,117,56,255,15,13,12,156,0,8,8,8,7,71,104,80,45, +255,224,183,119,255,232,191,127,255,210,166,97,255,81,60,32,255,39,30,18, +255,52,40,25,255,175,128,66,255,225,173,98,255,228,180,105,255,226,175,95, +255,29,25,18,255,0,8,12,12,11,170,208,138,55,255,222,145,63,255,220, +139,59,255,193,121,50,255,68,50,29,255,38,28,19,255,48,35,23,255,175, +112,44,255,217,142,54,255,217,144,66,255,191,137,66,255,19,16,12,170,0, +8,9,8,8,74,111,82,40,255,216,155,75,255,226,172,95,255,200,151,81, +255,57,41,26,255,27,23,16,255,35,28,18,255,41,32,20,255,39,30,20, +255,25,22,16,227,15,14,10,142,0,12,10,9,7,28,33,24,14,227,135, +81,28,255,206,117,31,255,210,108,33,255,208,110,31,255,171,92,28,255,49, +33,16,252,13,11,8,68,0,8,11,10,8,170,195,108,30,255,212,118,35, +255,217,137,52,255,42,33,23,255,0,12,20,18,15,170,214,156,81,255,221, +148,62,255,214,127,43,255,23,19,12,238,0,8,10,10,7,159,196,109,31, +255,213,119,36,255,212,123,37,255,31,24,14,255,0,12,15,14,10,170,209, +137,60,255,228,172,99,255,230,189,119,255,28,26,19,255,0,8,12,12,11, +170,208,134,55,255,218,137,51,255,214,127,43,255,35,27,16,255,0,20,16, +14,11,170,199,116,34,255,217,132,48,255,224,166,83,255,32,26,19,255,0, +8,10,10,7,34,81,58,34,255,224,178,105,255,226,172,95,255,129,92,40, +255,9,9,8,170,6,6,6,85,6,6,5,113,35,27,16,255,204,117,33, +255,208,117,29,255,110,69,25,255,14,12,7,108,0,8,10,10,7,170,195, +112,30,255,211,115,30,255,211,115,30,255,30,23,13,255,0,12,14,12,9, +170,196,113,31,255,211,120,32,255,214,126,41,255,33,26,18,255,0,8,9, +8,6,28,44,33,19,212,60,42,23,255,46,35,21,255,74,53,31,255,156, +109,53,255,216,167,97,255,228,179,109,255,229,177,110,255,227,184,108,255,168, +123,69,255,23,21,16,227,9,8,8,28,0,12,17,16,14,170,134,98,51, +255,223,166,92,255,132,100,53,255,9,9,8,133,0,20,16,15,13,170,219, +177,112,255,232,191,133,255,231,195,132,255,40,33,23,255,0,20,6,6,5, +45,39,32,22,255,210,129,49,255,172,106,35,255,20,17,13,227,11,11,8, +28,0,100,17,17,14,170,221,189,132,255,235,205,154,255,234,205,155,255,42, +39,29,255,0,16,9,9,8,25,0,20,9,8,8,25,0,20,14,14,11, +170,208,141,61,255,224,168,87,255,228,174,103,255,31,26,20,221,0,4,13, +12,12,130,218,185,127,255,234,202,147,255,232,198,139,255,40,33,25,255,0, +20,17,17,14,176,140,115,71,255,230,202,147,255,232,202,149,255,218,170,101, +255,200,124,43,255,198,117,37,255,198,117,37,255,196,116,37,255,72,52,27, +255,12,11,9,170,0,28,8,8,7,85,37,31,20,255,174,110,41,255,210, +123,39,255,204,120,37,255,130,87,31,255,15,13,10,190,0,28,5,5,4, +113,28,26,19,255,210,143,65,255,220,163,81,255,217,166,92,255,222,173,97, +255,225,176,98,255,42,37,25,255,4,4,4,74,0,56,13,12,10,170,208, +141,61,255,226,172,95,255,228,183,111,255,40,34,25,255,0,24,17,16,14, +170,219,177,112,255,232,194,133,255,233,202,148,255,27,24,20,255,0,8,16, +15,13,85,199,161,102,255,220,166,89,255,211,143,62,255,217,154,72,255,223, +161,80,255,224,169,91,255,225,185,114,255,229,188,124,255,231,190,132,255,231, +200,143,255,227,195,140,255,227,196,138,255,225,195,136,255,44,37,27,170,0, +8,17,16,14,85,200,165,109,255,227,198,142,255,225,191,132,255,227,195,134, +255,231,199,136,255,231,197,132,255,231,194,124,255,229,191,130,255,225,195,136, +255,225,195,136,255,225,191,132,255,49,42,30,198,0,36,18,17,13,105,193, +135,66,255,221,175,102,255,222,186,123,255,223,190,132,255,224,192,135,255,223, +190,132,255,222,186,123,255,221,178,110,255,218,172,105,255,46,39,27,195,0, +48,6,6,6,28,27,26,20,255,216,170,97,255,225,178,104,255,176,136,83, +255,16,15,13,198,0,16,17,17,14,170,221,188,130,255,235,205,154,255,234, +205,155,255,232,204,149,255,228,199,143,255,171,144,96,255,64,57,41,255,154, +126,81,255,227,189,122,255,230,184,119,255,227,171,98,255,34,30,21,255,0, +24,17,16,14,170,221,186,126,255,234,202,147,255,232,192,135,255,44,39,27, +255,0,44,9,9,8,142,25,24,20,255,114,95,53,255,207,169,102,255,227, +187,118,255,226,188,123,255,178,148,95,255,19,18,16,170,0,32,24,22,19, +85,197,145,84,255,227,187,118,255,231,194,124,255,207,173,114,255,61,55,38, +255,8,8,8,136,0,12,10,10,9,108,45,36,21,255,195,116,38,255,207, +122,38,255,139,90,32,255,13,12,8,170,0,4,10,10,9,198,208,140,59, +255,226,170,91,255,231,193,128,255,40,35,27,255,0,36,4,4,3,28,18, +17,13,227,222,189,131,255,234,201,143,255,229,191,130,255,34,30,23,204,0, +8,11,11,10,170,211,158,82,255,226,170,91,255,224,165,81,255,219,154,70, +255,208,132,51,255,206,128,45,255,204,122,41,255,201,120,40,255,196,116,37, +255,111,74,30,255,20,18,13,227,8,8,7,28,0,28,6,6,6,28,28, +26,21,255,222,186,123,255,229,196,132,255,181,144,92,255,16,15,13,212,0, +16,6,6,6,85,25,24,20,255,180,149,101,255,231,205,154,255,232,204,149, +255,227,198,142,255,223,192,138,255,223,193,136,255,230,199,139,255,232,197,141, +255,211,176,122,255,64,57,41,255,8,8,7,113,0,8,6,6,5,14,33, +31,24,227,186,155,107,255,232,204,149,255,233,205,152,255,227,197,140,255,221, +189,132,255,224,192,135,255,228,198,141,255,232,201,141,255,232,192,135,255,231, +197,132,255,41,35,26,255,0,64,17,16,14,139,211,178,120,255,233,202,148, +255,233,202,148,255,56,48,33,255,4,4,4,85,0,104,11,11,10,255,216, +164,89,255,230,191,123,255,227,195,134,255,40,35,27,227,0,28,16,15,13, +227,126,105,69,255,217,176,112,255,225,175,104,255,223,159,76,255,189,124,49, +255,43,35,20,255,9,8,8,57,0,8,10,10,9,133,194,109,33,255,215, +125,38,255,212,124,39,255,144,93,33,255,29,24,16,255,68,53,29,255,186, +123,49,255,128,95,47,255,25,24,20,255,143,119,78,255,230,201,145,255,33, +30,24,255,0,8,11,11,10,170,217,176,112,255,228,182,109,255,222,158,75, +255,212,134,51,255,204,122,41,255,198,117,37,255,200,118,37,255,208,123,39, +255,212,123,37,255,214,121,39,255,217,133,50,255,24,21,15,244,0,8,11, +11,10,170,218,185,127,255,235,203,148,255,233,202,148,255,230,201,145,255,227, +197,140,255,221,187,128,255,221,184,120,255,224,178,105,255,224,164,85,255,189, +129,58,255,39,32,20,255,7,7,6,85,0,8,11,10,8,125,194,109,33, +255,215,125,38,255,213,125,40,255,29,24,16,255,0,40,17,17,14,170,221, +188,130,255,235,201,152,255,232,201,141,255,42,36,27,255,0,12,17,17,14, +170,219,179,116,255,231,187,124,255,228,183,111,255,24,22,17,255,0,8,11, +11,10,170,218,185,127,255,232,197,137,255,227,179,104,255,219,155,72,255,208, +132,51,255,204,122,41,255,202,120,39,255,38,31,19,170,0,16,12,11,9, +170,196,110,33,255,215,113,38,255,213,122,42,255,215,143,58,255,217,166,92, +255,222,186,123,255,225,195,136,255,52,44,33,198,0,16,17,16,14,170,211, +150,70,255,219,140,56,255,213,126,42,255,25,21,14,255,0,40,17,17,14, +170,221,187,128,255,232,199,141,255,228,180,111,255,219,155,72,255,207,128,44, +255,199,119,39,255,200,118,37,255,208,123,39,255,212,123,37,255,214,125,39, +255,212,124,39,255,34,26,15,181,0,8,11,10,10,161,215,172,104,255,234, +201,143,255,234,206,151,255,42,39,29,255,0,40,12,11,9,170,196,110,33, +255,215,125,38,255,212,124,39,255,36,28,17,170,0,8,15,14,10,85,194, +109,33,255,215,125,38,255,212,124,39,255,210,128,41,255,211,135,54,255,225, +176,98,255,231,197,132,255,56,48,33,255,4,4,4,85,0,20,17,16,14, +170,206,135,51,255,217,133,50,255,213,122,42,255,25,21,14,255,0,32,12, +11,9,170,196,110,33,255,215,125,38,255,213,122,42,255,67,51,28,255,6, +6,5,255,40,34,25,255,226,190,127,255,138,110,69,255,7,7,7,255,25, +24,20,255,221,179,112,255,232,191,127,255,232,201,141,255,26,23,19,255,0, +8,11,11,10,170,214,168,101,255,230,187,119,255,228,188,117,255,212,173,105, +255,150,118,67,255,102,86,47,255,111,90,50,255,185,145,88,255,227,187,118, +255,231,195,132,255,232,201,141,255,26,23,19,255,0,8,11,11,10,170,219, +184,128,255,235,205,154,255,234,206,151,255,42,36,27,255,0,12,15,15,12, +170,213,158,80,255,228,182,109,255,230,191,123,255,27,23,18,255,0,8,11, +11,10,170,219,189,132,255,235,205,154,255,232,197,141,255,225,185,114,255,215, +155,78,255,206,135,51,255,205,126,42,255,209,128,42,255,212,121,41,255,181, +111,36,255,39,30,18,255,8,8,7,57,0,8,10,10,9,136,194,109,33, +255,215,125,38,255,212,124,39,255,24,20,13,255,0,12,15,14,12,170,210, +146,71,255,229,183,110,255,231,197,132,255,26,23,19,255,0,8,11,11,10, +170,218,189,127,255,234,199,143,255,231,197,132,255,225,176,106,255,214,153,75, +255,208,138,55,255,205,133,48,255,210,127,45,255,214,134,49,255,179,119,42, +255,37,30,18,255,7,7,6,85,0,12,23,20,14,227,161,115,50,255,222, +167,89,255,227,186,114,255,225,190,130,255,223,198,136,255,227,198,142,255,224, +196,141,255,221,191,134,255,161,130,86,255,33,30,24,229,10,10,9,42,0, +24,15,15,12,170,211,149,76,255,228,182,109,255,231,189,128,255,44,39,27, +255,0,24,17,17,14,170,216,170,97,255,226,172,95,255,224,165,81,255,31, +26,18,255,0,12,13,12,10,170,201,120,40,255,217,133,50,255,216,125,45, +255,25,21,14,212,0,8,11,10,8,144,203,130,52,255,224,166,83,255,228, +174,103,255,40,34,25,255,0,12,17,16,14,170,221,187,128,255,234,201,143, +255,230,191,123,255,28,25,19,244,0,8,10,10,9,164,203,122,50,255,220, +148,63,255,217,141,52,255,23,20,14,255,0,8,14,13,11,108,10,10,9, +28,0,4,13,13,12,170,221,189,134,255,235,205,154,255,234,206,151,255,42, +37,27,255,0,24,11,11,10,255,222,189,131,255,232,195,131,255,224,162,81, +255,36,29,19,255,4,4,4,54,0,28,7,7,6,28,19,17,12,232,93, +66,30,255,183,112,36,255,209,122,38,255,212,120,39,255,159,102,34,255,22, +19,13,255,7,7,6,85,0,24,6,6,5,28,17,16,14,227,149,122,84, +255,227,195,140,255,227,191,134,255,179,142,90,255,17,16,14,227,5,5,4, +25,0,20,15,14,12,170,204,129,49,255,218,141,51,255,213,126,42,255,25, +21,14,255,0,24,8,7,7,91,68,48,25,255,205,127,44,255,220,153,75, +255,99,78,44,255,8,8,7,113,0,28,12,11,9,170,196,110,33,255,215, +125,38,255,212,124,39,255,24,20,13,255,0,124,9,9,8,25,0,40,2, +2,1,23,9,8,6,255,199,116,34,255,215,125,38,255,212,128,45,255,27, +24,16,207,0,8,11,11,10,170,219,184,128,255,235,205,154,255,234,205,155, +255,58,49,35,255,5,5,4,85,0,4,4,4,3,28,16,15,11,227,204, +122,41,255,215,126,40,255,210,123,39,255,32,25,15,170,0,8,13,13,12, +122,208,168,99,255,234,199,143,255,234,204,151,255,63,54,38,255,5,5,4, +85,0,4,4,4,3,28,18,17,13,215,204,127,45,255,214,125,39,255,212, +121,41,255,34,27,15,170,0,8,13,12,10,85,185,112,34,255,215,125,38, +255,212,123,37,255,35,28,16,255,4,4,3,85,0,4,3,3,2,28,12, +10,9,224,198,117,37,255,215,125,38,255,212,124,39,255,34,27,15,178,0, +8,14,13,11,113,206,162,94,255,232,199,141,255,234,207,155,255,63,53,36, +255,4,4,3,113,0,4,3,3,3,28,10,10,9,255,200,118,37,255,215, +125,38,255,210,123,39,255,27,22,14,227,0,12,3,3,2,6,13,11,8, +221,199,116,34,255,215,125,38,255,212,124,39,255,35,27,16,255,5,4,4, +57,0,12,15,14,12,147,206,154,87,255,232,195,137,255,234,204,151,255,63, +54,38,255,5,5,4,85,0,4,4,4,3,28,18,16,13,227,222,189,131, +255,235,205,152,255,234,205,155,255,27,24,20,255,0,8,11,11,10,170,219, +184,130,255,235,205,152,255,234,205,155,255,58,49,35,255,5,5,4,85,0, +4,4,4,3,28,14,12,9,227,199,117,36,255,215,113,38,255,210,123,39, +255,32,25,15,170,0,8,12,12,9,102,194,109,33,255,215,125,38,255,212, +124,39,255,27,22,14,255,0,24,18,16,13,170,217,176,110,255,234,196,143, +255,234,204,151,255,27,24,20,255,0,8,11,10,10,170,204,134,59,255,219, +136,54,255,213,122,42,255,72,50,27,255,8,8,7,255,25,22,14,255,195, +116,38,255,208,123,39,255,142,91,31,255,16,14,9,193,4,4,3,17,0, +12,11,11,8,170,198,117,37,255,219,133,56,255,221,152,70,255,27,23,16, +221,0,8,13,12,10,99,193,113,34,255,223,156,70,255,231,193,128,255,40, +34,25,255,4,3,3,113,17,16,12,227,208,136,59,255,45,36,21,255,4, +3,3,113,10,9,7,207,196,110,33,255,215,125,38,255,210,128,41,255,32, +25,15,170,0,8,12,11,9,108,194,109,33,255,215,125,38,255,212,124,39, +255,35,27,16,255,4,4,3,85,0,4,3,3,2,28,12,11,9,227,199, +117,36,255,221,150,66,255,229,191,126,255,32,29,23,210,0,8,13,13,12, +122,204,150,79,255,223,159,76,255,217,141,52,255,84,57,29,255,9,8,6, +170,5,5,4,85,6,6,5,113,27,22,14,255,207,128,44,255,223,147,72, +255,227,187,118,255,34,30,23,207,0,8,12,11,11,170,218,180,119,255,229, +184,114,255,224,167,85,255,50,40,25,255,5,5,4,85,0,4,4,4,3, +28,14,12,9,227,203,125,42,255,217,128,48,255,213,128,45,255,35,27,16, +173,0,8,12,12,11,130,209,163,98,255,235,203,148,255,233,202,148,255,63, +54,36,255,5,5,4,85,0,4,4,4,3,28,15,15,12,227,209,137,60, +255,221,151,68,255,219,147,62,255,23,20,14,238,0,8,10,10,9,150,196, +121,41,255,217,128,48,255,215,133,44,255,40,31,19,255,5,5,5,85,0, +4,4,4,3,28,16,14,11,207,201,120,40,255,217,133,50,255,221,161,76, +255,57,44,28,170,0,8,15,14,12,105,211,165,98,255,232,197,137,255,232, +199,141,255,58,49,35,255,4,4,3,113,0,40,3,3,2,17,12,11,9, +227,199,116,34,255,215,125,38,255,212,124,39,255,35,27,16,255,4,4,3, +62,0,12,12,11,9,170,200,120,41,255,223,159,76,255,230,191,123,255,44, +37,27,255,0,12,18,17,15,170,208,140,59,255,217,133,50,255,213,125,40, +255,27,23,14,195,0,8,12,11,9,108,194,109,33,255,215,125,38,255,212, +124,39,255,25,21,14,255,0,12,17,16,14,170,219,179,116,255,235,201,152, +255,234,204,151,255,27,24,20,255,0,8,10,10,9,170,198,122,41,255,215, +127,42,255,213,125,40,255,27,22,14,255,0,20,12,11,9,170,201,120,40, +255,224,156,83,255,231,190,132,255,40,33,25,255,0,12,10,10,9,85,52, +42,29,255,200,142,59,255,183,119,44,255,72,52,27,255,39,30,18,255,49, +37,22,255,150,99,33,255,196,116,37,255,77,50,24,255,10,9,7,144,0, +12,10,10,9,170,196,115,35,255,215,125,38,255,212,124,39,255,25,21,14, +255,0,12,12,11,9,170,196,110,33,255,214,127,43,255,222,158,75,255,41, +34,24,255,0,24,5,5,4,85,11,11,10,255,130,101,59,255,223,176,102, +255,224,176,101,255,177,137,74,255,18,17,13,227,6,5,5,28,0,12,20, +19,15,85,186,120,49,255,217,142,62,255,217,139,56,255,34,29,19,255,4, +4,3,17,0,20,17,17,14,170,221,188,130,255,235,205,152,255,234,205,155, +255,42,39,29,255,0,24,13,13,10,181,199,119,39,255,212,121,41,255,203, +121,40,255,35,29,17,170,0,100,20,18,15,170,222,186,123,255,234,201,143, +255,232,197,135,255,47,40,28,255,0,64,14,13,11,170,213,160,84,255,230, +187,119,255,231,197,132,255,35,30,22,198,0,4,14,13,11,108,217,176,112, +255,232,193,137,255,231,197,132,255,33,28,22,255,0,24,12,12,11,113,31, +29,22,210,40,35,27,255,41,34,24,255,29,24,16,255,32,26,17,255,146, +92,35,255,214,134,49,255,212,128,45,255,123,81,36,255,15,13,10,142,0, +20,7,7,6,85,28,26,19,252,194,140,71,255,212,127,43,255,202,118,35, +255,97,66,30,255,15,14,10,207,6,6,5,25,0,24,6,6,5,8,15, +13,12,227,111,86,50,255,209,168,102,255,176,136,83,255,85,67,44,255,163, +129,80,255,221,186,126,255,83,69,44,255,7,7,6,170,5,5,5,8,0, +4,9,9,8,108,20,18,13,170,13,12,10,51,0,36,16,15,13,170,217, +176,110,255,232,194,133,255,232,198,139,255,36,33,25,255,0,24,15,15,12, +170,219,179,116,255,232,193,137,255,232,199,135,255,31,26,20,255,0,8,11, +11,10,28,56,48,33,227,98,76,45,255,104,80,45,255,195,154,96,255,227, +186,114,255,226,189,125,255,207,173,114,255,222,188,123,255,231,190,132,255,217, +188,124,255,137,109,70,255,99,86,54,255,78,64,43,255,21,20,16,85,0, +8,12,12,11,28,54,48,35,227,86,72,47,255,74,63,43,255,171,137,84, +255,229,191,130,255,230,191,123,255,230,186,123,255,202,164,105,255,97,80,50, +255,75,64,44,255,72,61,39,255,22,21,17,102,0,36,12,11,11,45,55, +45,30,227,90,71,45,255,78,63,41,255,72,61,39,255,74,63,43,255,72, +61,39,255,72,61,39,255,91,74,46,255,78,63,41,255,22,20,17,102,0, +48,12,12,11,176,132,106,61,255,228,188,125,255,210,172,113,255,42,37,29, +255,9,9,8,62,0,16,17,16,14,170,221,186,124,255,234,199,143,255,232, +201,141,255,232,201,141,255,221,189,134,255,52,46,33,255,6,7,6,227,24, +23,17,255,208,132,51,255,215,133,44,255,212,124,39,255,24,20,13,255,0, +24,17,16,12,170,219,177,112,255,231,187,124,255,228,182,109,255,40,33,23, +255,0,36,9,9,8,74,17,15,12,227,67,51,28,255,162,107,43,255,200, +142,67,255,204,157,91,255,177,140,86,255,74,63,43,255,19,17,16,198,9, +9,8,28,0,32,14,14,11,31,56,46,31,227,192,157,103,255,229,194,128, +255,225,188,124,255,146,112,67,255,11,10,8,164,0,8,7,7,6,28,34, +27,17,255,190,107,33,255,210,121,35,255,146,95,35,255,16,14,11,187,0, +8,9,9,8,170,214,164,93,255,232,194,127,255,231,195,132,255,40,34,25, +255,0,40,13,13,10,170,213,157,84,255,224,166,83,255,221,150,66,255,23, +20,14,246,0,8,12,11,9,113,194,109,33,255,212,119,37,255,210,113,35, +255,168,103,33,255,56,42,23,255,27,23,14,255,38,31,19,255,149,92,30, +255,207,118,32,255,207,113,30,255,124,75,27,255,13,11,8,161,0,28,12, +12,11,176,130,99,59,255,229,191,126,255,211,174,116,255,43,37,28,255,9, +9,8,59,0,16,8,8,7,85,68,58,37,255,214,177,119,255,231,196,136, +255,207,171,114,255,97,80,50,255,54,47,35,255,66,59,41,255,178,148,95, +255,228,189,121,255,224,187,123,255,146,112,67,255,12,12,11,170,0,12,10, +10,9,28,16,15,13,147,29,28,22,221,48,42,31,255,70,61,41,255,66, +57,39,255,70,61,41,255,171,140,92,255,224,170,101,255,224,168,87,255,224, +165,81,255,39,32,22,255,0,64,14,13,11,57,100,82,51,255,222,186,123, +255,226,172,95,255,113,82,38,255,9,8,8,127,0,32,11,9,6,102,11, +10,6,170,11,10,8,170,12,11,9,170,15,13,10,170,15,13,10,170,15, +14,10,170,18,15,11,170,18,15,11,156,12,11,9,28,0,28,6,6,5, +65,40,34,25,255,224,183,119,255,229,195,136,255,171,140,92,255,21,20,18, +142,0,24,11,10,8,102,131,92,46,255,213,145,56,255,214,119,43,255,210, +128,41,255,151,94,32,255,23,21,14,255,10,10,9,85,0,12,10,9,7, +170,191,106,30,255,211,115,30,255,208,114,31,255,141,87,30,255,36,31,19, +255,121,90,42,255,217,168,92,255,205,163,102,255,132,102,59,255,213,172,108, +255,231,193,128,255,35,30,22,255,0,8,11,11,10,164,203,129,50,255,215, +127,42,255,211,117,34,255,166,97,29,255,54,40,21,255,29,23,14,255,38, +31,19,255,120,78,29,255,206,118,33,255,214,127,43,255,224,155,81,255,23, +21,16,255,0,8,11,10,10,170,217,183,116,255,234,201,143,255,232,198,139, +255,202,166,109,255,97,78,50,255,52,46,33,255,58,50,33,255,150,96,39, +255,208,121,37,255,195,112,30,255,83,53,24,255,9,8,6,113,0,8,13, +12,8,96,189,104,28,255,210,120,33,255,214,132,45,255,34,29,19,255,0, +40,17,16,12,170,217,172,102,255,228,180,105,255,228,181,107,255,40,33,23, +255,0,12,17,15,12,170,216,171,101,255,232,191,127,255,231,197,132,255,24, +22,17,255,0,8,11,11,10,167,209,146,72,255,221,151,68,255,213,126,42, +255,172,106,35,255,57,41,22,255,42,32,19,255,43,33,20,252,18,15,11, +85,0,16,11,10,8,170,193,111,30,255,215,113,38,255,220,144,63,255,197, +145,84,255,91,71,44,255,75,62,42,255,75,64,44,255,22,21,17,99,0, +16,14,13,11,170,196,110,33,255,210,115,31,255,210,115,31,255,22,19,11, +227,0,8,16,13,9,113,24,21,15,170,17,15,12,170,18,15,13,170,19, +17,12,142,9,8,8,28,0,8,14,13,11,170,210,146,71,255,220,142,59, +255,213,125,40,255,168,103,33,255,54,40,21,255,29,23,14,255,38,31,19, +255,119,78,30,255,204,116,31,255,210,119,31,255,210,115,31,255,26,20,13, +210,0,8,11,11,10,170,217,179,120,255,234,202,147,255,232,201,141,255,40, +35,25,255,0,40,11,10,8,170,193,111,30,255,211,115,30,255,210,115,31, +255,36,25,13,170,0,8,14,12,9,85,190,105,29,255,210,107,31,255,208, +114,31,255,187,124,42,255,143,111,56,255,210,171,109,255,229,187,128,255,131, +99,54,255,8,8,7,156,0,20,13,12,10,170,194,112,31,255,210,107,31, +255,210,115,31,255,22,19,11,255,0,32,11,10,8,170,193,111,30,255,215, +125,38,255,218,141,59,255,39,33,22,255,5,5,5,28,12,12,11,170,156, +126,83,255,27,24,20,227,5,5,5,23,14,13,11,198,219,177,112,255,232, +191,127,255,230,191,123,255,25,22,16,249,0,8,11,10,8,153,200,120,41, +255,214,127,43,255,213,126,42,255,93,66,32,255,11,11,10,255,34,31,23, +255,206,152,81,255,226,179,111,255,231,189,128,255,232,192,135,255,232,201,141, +255,25,22,18,255,0,8,11,10,10,170,215,171,102,255,228,174,105,255,222, +158,75,255,27,24,16,255,0,12,15,15,12,170,219,177,112,255,232,193,137, +255,232,201,141,255,25,22,18,255,0,8,11,10,10,170,215,172,104,255,228, +182,109,255,221,155,70,255,177,114,46,255,55,42,24,255,35,28,18,255,41, +31,18,255,35,28,17,255,27,22,14,255,17,16,12,187,9,9,8,79,0, +12,10,9,7,170,191,106,30,255,211,115,30,255,210,115,31,255,33,25,14, +255,0,12,21,20,16,170,221,180,116,255,232,193,137,255,232,201,141,255,25, +22,18,255,0,8,11,11,10,170,212,160,85,255,224,156,83,255,218,141,59, +255,175,115,44,255,55,42,24,255,31,25,16,255,38,30,19,255,127,82,30, +255,204,116,31,255,195,112,30,255,82,55,25,255,11,10,8,150,0,12,9, +9,8,28,15,14,12,142,28,25,19,221,46,40,29,255,71,60,38,255,66, +57,39,255,70,61,41,255,193,159,106,255,227,184,108,255,221,153,72,255,155, +98,36,255,13,12,10,170,0,24,17,15,12,170,219,180,112,255,232,197,137, +255,232,201,141,255,40,35,25,255,0,24,14,13,11,170,198,117,37,255,213, +124,38,255,210,121,35,255,23,19,12,255,0,12,11,10,8,170,193,111,30, +255,211,115,30,255,208,114,31,255,23,19,12,207,0,8,14,13,11,85,181, +132,68,255,228,185,117,255,231,193,128,255,54,46,31,255,5,5,4,8,0, +8,21,20,16,178,215,160,88,255,223,147,72,255,206,135,51,255,23,20,14, +170,0,8,12,11,9,102,192,111,31,255,210,108,33,255,208,114,31,255,22, +18,11,255,0,4,10,10,9,113,79,61,38,255,17,16,12,198,0,4,16, +15,13,170,219,179,116,255,231,187,124,255,224,169,91,255,33,28,20,255,0, +20,9,8,8,85,39,33,24,255,217,166,92,255,219,140,56,255,210,121,35, +255,66,44,21,255,7,7,6,133,0,32,6,6,5,74,19,18,12,255,183, +102,30,255,207,105,30,255,210,111,31,255,73,51,24,255,8,8,7,116,0, +24,6,6,6,28,15,13,12,227,144,112,61,255,221,180,116,255,224,178,113, +255,152,116,65,255,18,17,13,221,8,8,7,28,0,24,12,10,9,170,193, +111,30,255,210,107,31,255,210,115,31,255,22,19,11,255,0,28,16,15,13, +227,164,122,63,255,225,185,114,255,192,153,97,255,21,19,16,232,7,7,6, +28,0,24,11,10,8,170,193,111,30,255,211,115,30,255,210,115,31,255,23, +19,12,255,0,148,6,6,5,51,11,9,6,85,12,10,7,102,10,8,5, +156,10,8,5,127,8,7,5,184,27,22,12,255,198,105,29,255,211,122,36, +255,220,136,61,255,25,22,16,255,0,8,10,10,9,170,218,181,123,255,234, +202,147,255,232,197,141,255,30,27,21,255,0,12,9,8,6,170,191,106,30, +255,211,115,30,255,210,111,31,255,39,27,14,170,0,8,12,11,11,170,218, +180,119,255,234,196,143,255,232,201,141,255,29,26,20,255,0,12,7,7,6, +28,27,22,14,156,25,22,14,255,32,25,15,210,22,18,11,28,0,8,10, +9,7,150,195,112,30,255,211,115,30,255,210,115,31,255,19,15,10,252,0, +12,9,9,8,170,191,106,30,255,211,111,30,255,208,114,31,255,25,20,12, +204,0,8,12,11,11,170,218,180,119,255,234,202,147,255,232,201,141,255,142, +111,63,255,14,12,9,227,10,9,7,127,8,7,5,181,35,25,14,255,199, +112,28,255,209,118,30,255,209,117,28,255,30,22,13,255,0,16,9,8,6, +167,191,106,30,255,211,115,30,255,210,115,31,255,19,15,10,252,0,16,21, +19,16,170,220,178,113,255,232,197,137,255,232,201,141,255,26,23,19,255,0, +12,11,11,10,170,218,181,123,255,234,201,143,255,231,197,132,255,24,22,17, +255,0,8,11,10,10,170,218,181,123,255,234,201,143,255,231,197,132,255,30, +26,21,255,0,12,9,8,6,167,191,106,30,255,211,115,30,255,210,111,31, +255,39,27,14,170,0,8,13,12,8,85,190,105,29,255,213,119,36,255,214, +132,45,255,32,26,17,255,0,24,17,16,14,170,221,186,124,255,234,202,147, +255,232,199,135,255,25,22,18,252,0,8,11,10,8,127,192,111,31,255,210, +107,31,255,208,114,31,255,161,94,28,255,65,43,20,255,145,85,26,255,207, +117,30,255,122,75,29,255,15,14,10,170,5,5,4,8,0,16,11,10,8, +170,196,115,35,255,223,146,70,255,228,183,111,255,25,22,16,252,0,8,14, +12,9,85,190,105,29,255,215,125,38,255,218,141,59,255,30,24,17,195,0, +4,10,10,7,170,193,111,30,255,20,17,11,252,0,4,11,10,8,85,188, +103,27,255,211,115,30,255,209,106,30,255,39,27,14,170,0,8,13,12,8, +85,190,105,29,255,211,115,30,255,210,115,31,255,19,15,10,255,0,12,9, +8,6,167,192,111,31,255,218,137,51,255,227,175,100,255,27,24,18,255,0, +8,11,10,8,147,196,106,33,255,210,108,33,255,210,115,31,255,30,23,13, +255,4,4,3,14,0,8,15,14,12,195,211,149,76,255,229,184,114,255,232, +199,135,255,28,25,19,255,0,8,11,10,8,167,203,129,50,255,215,127,42, +255,210,121,35,255,20,17,11,232,0,12,9,8,6,139,190,105,29,255,211, +111,30,255,209,114,30,255,30,22,13,198,0,8,13,12,10,170,217,173,104, +255,232,193,137,255,232,194,139,255,25,22,18,255,0,12,9,8,8,156,192, +111,31,255,210,108,33,255,210,115,31,255,32,24,13,173,0,8,13,12,8, +88,190,105,29,255,211,115,30,255,208,114,31,255,19,15,10,255,0,12,7, +7,6,28,27,22,14,198,45,36,21,255,52,43,29,244,14,13,11,85,0, +8,13,13,12,88,177,143,90,255,230,194,131,255,226,172,95,255,137,91,36, +255,10,9,7,227,8,8,5,161,10,9,7,167,10,9,7,136,13,10,6, +85,7,6,6,74,0,24,9,8,6,167,191,106,30,255,211,115,30,255,210, +115,31,255,19,15,10,252,0,16,12,11,9,170,208,141,61,255,230,187,119, +255,232,201,141,255,40,34,25,255,0,12,14,12,9,170,196,109,31,255,210, +107,31,255,210,115,31,255,36,25,13,170,0,8,10,9,7,85,155,91,28, +255,208,114,31,255,209,106,30,255,30,22,13,255,0,12,22,21,17,176,222, +186,123,255,234,199,143,255,226,195,135,255,35,29,22,178,0,8,12,11,9, +105,190,105,29,255,211,115,30,255,208,114,31,255,23,19,12,210,0,8,15, +12,8,59,7,6,4,3,0,4,9,9,8,159,204,134,59,255,230,182,119, +255,232,198,139,255,39,33,24,255,0,16,10,10,9,34,15,14,10,198,52, +40,21,255,165,96,28,255,198,113,29,255,185,102,28,255,80,53,25,255,19, +17,12,227,10,9,7,76,0,16,11,10,8,170,195,112,30,255,211,115,30, +255,210,115,31,255,20,16,11,255,0,12,10,9,7,170,192,111,31,255,215, +125,38,255,224,159,83,255,41,33,24,255,0,24,7,7,6,108,24,20,13, +255,146,88,31,255,195,127,38,255,113,77,34,255,15,14,12,210,7,7,6, +28,0,16,12,12,11,28,37,30,18,227,168,99,31,255,206,114,33,255,51, +34,18,255,6,5,5,71,0,20,17,16,14,170,221,186,124,255,234,202,147, +255,232,201,141,255,40,35,25,255,0,24,17,15,10,227,198,105,29,255,194, +109,33,255,62,44,23,255,16,14,11,85,0,100,19,17,12,142,214,171,97, +255,228,183,113,255,227,186,108,255,50,40,25,227,0,64,12,11,9,198,214, +158,85,255,229,183,110,255,228,181,107,255,21,19,14,249,2,2,1,20,8, +8,7,181,210,156,79,255,226,169,95,255,224,155,81,255,33,26,18,255,4, +4,4,28,0,40,3,3,2,28,11,10,8,255,209,138,62,255,223,154,72, +255,221,164,82,255,27,23,16,249,0,16,7,7,6,79,46,38,25,255,197, +151,84,255,222,161,89,255,209,128,42,255,141,91,32,255,15,13,10,218,5, +5,5,11,0,28,15,13,10,139,191,131,60,255,220,168,93,255,168,123,69, +255,14,13,11,227,5,5,5,85,9,9,8,170,105,78,40,255,162,116,61, +255,88,66,37,255,23,21,16,255,11,11,10,255,78,58,35,255,208,150,75, +255,61,46,28,181,0,36,15,13,10,170,216,170,97,255,230,187,119,255,228, +178,113,255,34,28,19,255,0,24,15,13,10,170,215,167,92,255,229,179,114, +255,228,181,107,255,32,27,19,255,0,16,6,6,6,25,5,5,4,198,52, +42,27,255,220,169,97,255,189,142,76,255,35,31,22,255,134,96,51,255,225, +176,106,255,140,106,53,255,6,6,5,255,6,6,6,51,0,28,5,5,5, +28,15,13,10,227,208,136,59,255,218,138,53,255,213,122,42,255,43,31,18, +255,5,5,4,85,0,136,9,8,8,57,57,47,30,255,212,163,93,255,224, +157,85,255,124,90,45,255,10,10,9,147,0,20,15,13,10,170,216,170,97, +255,228,181,107,255,224,165,81,255,194,136,61,255,58,46,29,255,12,12,11, +85,0,4,10,9,7,156,174,91,23,255,202,103,23,255,202,102,21,255,20, +16,9,255,0,24,15,13,10,170,213,155,80,255,227,175,100,255,227,171,98, +255,35,29,20,255,0,32,7,7,6,85,49,33,18,255,183,108,34,255,209, +128,42,255,209,137,60,255,186,134,67,255,95,74,39,255,22,20,15,229,8, +8,7,105,0,44,5,4,4,28,17,15,12,227,216,167,89,255,228,181,107, +255,223,176,102,255,34,28,19,184,0,8,12,11,9,108,180,106,33,255,214, +125,39,255,217,141,52,255,42,33,21,255,4,4,4,85,0,8,11,10,8, +198,211,149,76,255,224,160,77,255,220,144,63,255,34,27,17,255,0,40,12, +10,7,170,189,99,26,255,206,102,25,255,203,100,24,255,30,21,11,176,0, +8,12,10,7,85,167,87,22,255,202,103,23,255,202,102,21,255,27,20,10, +255,4,4,3,68,0,4,4,4,4,28,12,10,7,215,176,91,23,255,203, +104,24,255,202,105,27,255,28,21,13,249,0,24,9,8,8,57,57,47,30, +255,213,167,94,255,228,184,115,255,126,92,47,255,9,9,8,147,0,20,13, +12,10,167,199,131,58,255,220,148,63,255,219,147,62,255,49,38,24,255,6, +6,6,85,0,4,5,5,5,28,15,14,12,227,217,169,94,255,228,183,111, +255,225,174,102,255,31,25,18,241,0,36,5,5,5,28,15,13,10,227,204, +127,45,255,219,133,56,255,221,150,66,255,35,28,18,255,0,68,10,9,9, +85,45,34,21,255,201,110,30,255,192,100,25,255,57,35,16,255,12,10,7, +85,0,24,13,11,6,79,126,68,21,255,191,100,26,255,198,117,37,255,208, +139,65,255,213,155,80,255,214,161,85,255,215,167,92,255,216,167,89,255,215, +160,88,255,49,38,24,170,0,24,7,7,6,76,45,36,24,249,207,164,90, +255,228,183,111,255,143,111,56,255,13,12,10,170,0,28,13,12,8,142,182, +99,25,255,203,108,24,255,202,102,21,255,112,65,23,255,15,13,8,227,6, +6,5,45,0,16,10,8,7,170,171,89,22,255,202,95,23,255,202,103,23, +255,103,64,26,255,20,18,13,255,79,61,36,255,222,173,97,255,227,179,104, +255,224,172,97,255,226,171,99,255,224,176,93,255,36,29,19,207,0,8,12, +10,7,113,176,91,23,255,202,95,23,255,202,102,21,255,27,20,10,255,4, +4,3,74,0,4,4,4,4,28,11,9,6,215,187,101,24,255,216,134,45, +255,226,172,95,255,23,21,16,241,0,8,10,10,9,161,212,160,85,255,226, +172,95,255,222,158,75,255,51,39,24,255,6,6,6,85,0,4,4,4,3, +28,11,10,6,215,176,91,23,255,202,102,21,255,191,102,22,255,22,17,9, +170,0,8,12,10,7,85,167,87,22,255,204,105,25,255,217,133,50,255,35, +28,18,255,0,40,15,13,10,170,199,116,34,255,212,114,35,255,218,139,55, +255,33,27,18,255,0,12,15,13,10,170,213,160,84,255,227,175,100,255,224, +165,81,255,25,21,14,235,0,8,13,11,8,108,184,96,25,255,203,96,24, +255,202,95,23,255,27,20,10,255,4,4,3,71,0,28,10,9,7,170,187, +101,24,255,216,134,45,255,224,167,85,255,54,42,27,255,6,6,6,85,0, +28,10,9,7,170,171,89,22,255,202,103,23,255,202,102,21,255,29,21,10, +170,0,4,11,9,6,42,137,77,24,255,211,136,56,255,215,167,92,255,216, +166,95,255,213,163,84,255,33,28,18,161,0,8,11,10,8,130,184,100,25, +255,203,100,24,255,202,102,21,255,27,20,10,255,4,4,3,74,0,4,4, +4,4,28,11,9,6,215,176,91,23,255,202,103,23,255,202,95,23,255,28, +21,11,190,0,8,10,10,9,161,212,161,89,255,228,174,105,255,223,161,80, +255,33,28,18,255,0,40,10,9,7,167,171,89,22,255,202,103,23,255,202, +102,21,255,29,21,10,170,0,8,12,10,7,85,167,87,22,255,202,103,23, +255,203,108,24,255,68,47,25,255,6,6,5,255,31,26,20,255,220,168,93, +255,220,177,101,255,110,80,41,255,12,11,9,150,0,16,10,9,7,170,171, +89,22,255,202,103,23,255,202,102,21,255,20,16,9,255,0,32,10,9,7, +170,193,111,30,255,219,136,54,255,224,165,81,255,27,24,16,255,0,4,7, +7,7,28,21,20,16,181,10,10,9,85,0,4,12,11,9,170,204,130,51, +255,218,141,51,255,211,122,36,255,32,23,13,187,0,8,13,11,8,85,167, +87,22,255,203,100,24,255,208,105,29,255,23,19,12,255,4,4,3,28,11, +10,8,181,211,158,82,255,229,183,110,255,228,183,111,255,228,183,113,255,228, +181,107,255,27,23,16,229,0,8,10,10,9,150,192,111,31,255,208,112,27, +255,203,108,24,255,21,17,10,255,0,12,15,13,10,170,216,170,97,255,229, +183,110,255,228,181,107,255,25,21,16,235,0,8,11,10,8,142,194,116,33, +255,209,106,30,255,203,108,24,255,27,20,10,255,4,4,3,74,0,36,10, +8,7,170,171,89,22,255,202,103,23,255,202,102,21,255,42,28,13,255,6, +5,5,48,0,4,6,6,6,28,21,19,14,255,221,175,102,255,229,179,114, +255,228,181,107,255,24,20,15,246,0,8,12,11,9,127,190,104,27,255,206, +106,25,255,202,103,23,255,27,20,10,255,4,4,3,74,0,4,4,4,4, +28,11,10,6,215,176,91,23,255,204,105,25,255,207,122,38,255,28,22,15, +238,0,36,5,5,5,28,15,13,10,227,195,111,28,255,204,105,25,255,197, +100,22,255,22,17,9,224,0,24,15,13,10,170,216,170,97,255,229,184,114, +255,228,181,107,255,34,28,19,255,0,24,10,9,7,170,174,91,23,255,202, +103,23,255,202,102,21,255,20,16,9,252,0,12,10,9,7,170,171,89,22, +255,202,107,23,255,206,111,27,255,22,17,11,252,0,8,8,7,7,45,73, +59,36,255,218,174,105,255,228,178,107,255,89,67,36,255,7,7,6,113,0, +4,5,5,4,28,20,18,13,255,199,110,30,255,202,105,27,255,88,54,23, +255,10,9,7,113,0,8,13,11,6,85,167,87,22,255,202,95,23,255,202, +90,23,255,32,24,13,255,4,4,3,178,19,16,12,238,212,163,93,255,66, +52,31,255,5,5,5,184,14,13,11,255,205,133,48,255,212,114,35,255,208, +117,29,255,29,22,14,255,0,16,12,11,9,85,101,74,38,255,189,121,49, +255,185,104,32,255,180,98,25,255,180,93,23,255,154,82,23,255,75,44,18, +255,11,9,6,144,0,32,10,9,7,170,157,79,22,255,202,102,21,255,202, +102,21,255,22,17,9,255,0,28,14,13,11,224,136,98,53,255,217,165,82, +255,213,145,56,255,150,92,35,255,19,16,12,173,5,5,5,8,0,28,10, +8,7,170,171,89,22,255,202,103,23,255,202,102,21,255,20,16,9,252,0, +28,7,7,6,59,43,35,24,255,221,175,102,255,223,178,106,255,134,98,51, +255,14,13,11,142,0,24,10,9,7,167,171,89,22,255,202,103,23,255,202, +102,21,255,20,16,9,255,0,144,12,10,7,170,46,29,13,255,140,74,21, +255,165,86,22,255,167,87,22,255,165,86,22,255,167,87,22,255,185,95,22, +255,198,97,23,255,206,111,27,255,221,146,66,255,23,19,14,249,0,8,10, +10,9,153,212,161,89,255,229,183,110,255,224,165,81,255,28,23,15,255,0, +12,10,8,7,156,171,89,22,255,202,103,23,255,202,102,21,255,31,21,10, +170,0,8,10,10,9,167,212,160,85,255,228,177,105,255,222,158,75,255,27, +23,16,255,0,40,10,8,7,170,167,87,22,255,202,103,23,255,202,102,21, +255,20,16,9,238,0,12,10,8,7,164,171,89,22,255,202,103,23,255,203, +100,24,255,22,18,11,235,0,8,10,10,9,167,214,164,93,255,228,182,109, +255,223,154,80,255,207,120,36,255,189,94,24,255,167,87,22,255,167,87,22, +255,187,96,22,255,198,93,23,255,202,93,21,255,198,96,21,255,26,19,9, +227,0,16,10,8,7,167,171,89,22,255,202,103,23,255,202,102,21,255,20, +15,9,252,0,16,17,15,12,170,216,170,97,255,229,183,110,255,224,164,85, +255,29,24,16,255,3,3,2,28,0,8,12,11,9,198,211,149,76,255,221, +151,68,255,219,146,60,255,22,19,13,246,0,8,10,10,9,161,210,155,77, +255,223,147,72,255,213,122,42,255,23,18,12,255,0,12,10,8,7,167,171, +89,22,255,202,103,23,255,202,102,21,255,29,21,10,170,0,8,12,10,7, +85,166,87,23,255,209,118,30,255,218,139,55,255,33,27,18,255,0,24,15, +13,10,170,215,159,92,255,226,169,95,255,218,141,59,255,34,26,15,190,0, +8,13,10,6,85,167,87,22,255,202,103,23,255,198,96,21,255,197,96,22, +255,189,97,22,255,198,96,21,255,198,96,21,255,25,19,10,255,4,4,3, +28,0,20,10,9,7,170,178,92,23,255,210,107,31,255,215,128,44,255,33, +24,14,193,0,8,12,10,7,85,167,87,22,255,202,95,23,255,202,103,23, +255,32,22,11,170,0,4,10,8,7,170,171,89,22,255,24,17,9,249,0, +4,12,10,7,85,163,82,22,255,202,103,23,255,202,102,21,255,29,21,10, +170,0,8,12,10,7,85,166,87,23,255,202,103,23,255,202,102,21,255,20, +15,9,255,0,12,10,8,7,167,170,89,23,255,206,106,25,255,208,115,33, +255,28,21,13,207,0,8,13,10,6,85,167,87,22,255,202,95,23,255,202, +102,21,255,20,16,9,255,0,12,15,13,10,170,214,158,85,255,229,183,110, +255,228,185,111,255,24,20,15,249,0,8,12,11,9,108,176,91,23,255,202, +95,23,255,202,102,21,255,18,15,9,255,2,2,1,8,0,8,8,7,5, +184,171,89,22,255,202,95,23,255,202,102,21,255,34,23,11,173,0,8,12, +11,9,136,212,160,85,255,228,180,105,255,225,165,88,255,31,25,18,255,3, +3,2,28,0,8,8,7,5,178,171,89,22,255,202,103,23,255,202,102,21, +255,30,21,11,170,0,8,12,10,7,85,167,87,22,255,202,103,23,255,202, +102,21,255,20,15,9,255,0,40,7,7,6,28,30,27,21,238,167,111,50, +255,206,110,33,255,199,102,24,255,175,90,22,255,165,86,22,255,167,87,22, +255,167,87,22,255,161,87,22,255,84,48,19,255,18,15,9,227,8,7,5, +28,0,16,10,8,7,167,171,89,22,255,202,103,23,255,202,102,21,255,20, +15,9,252,0,16,15,13,10,170,211,159,76,255,229,180,110,255,228,182,109, +255,34,28,19,255,0,12,10,9,7,170,171,89,22,255,202,103,23,255,202, +102,21,255,31,22,10,170,0,8,7,6,6,28,48,31,15,255,189,93,22, +255,202,102,21,255,45,29,14,255,5,5,4,113,0,4,5,5,4,28,22, +20,15,255,220,169,97,255,226,178,103,255,167,118,54,255,15,13,10,133,0, +8,13,11,6,85,167,87,22,255,202,103,23,255,202,102,21,255,19,15,8, +215,0,4,11,9,6,105,121,65,20,255,26,18,9,190,0,4,9,9,8, +167,208,150,75,255,229,183,110,255,228,181,113,255,37,29,20,255,0,24,8, +8,5,218,167,87,22,255,202,93,21,255,198,104,21,255,23,18,10,255,3, +3,2,51,0,20,10,9,7,153,171,89,22,255,202,95,23,255,202,102,21, +255,20,15,9,255,2,2,1,17,0,8,8,7,5,181,184,100,25,255,215, +119,42,255,224,160,85,255,34,28,19,255,0,20,9,8,6,85,31,22,12, +255,166,87,23,255,189,97,22,255,99,60,22,255,15,13,8,170,0,28,4, +3,3,23,13,11,8,227,182,94,23,255,149,87,26,255,19,17,12,227,7, +7,7,23,0,16,15,13,10,170,216,170,97,255,229,179,114,255,228,182,109, +255,34,28,19,255,0,20,9,8,6,130,69,42,18,255,195,95,22,255,35, +24,12,255,5,5,4,76,0,104,10,9,7,28,27,24,16,184,32,27,19, +255,39,29,20,212,13,12,10,85,0,60,13,11,8,170,81,54,28,255,216, +148,67,255,223,161,72,255,220,147,61,255,117,76,32,255,13,11,8,255,44, +33,19,255,207,123,40,255,217,136,50,255,218,142,53,255,156,100,39,255,18, +15,11,227,10,8,7,28,0,12,15,13,8,125,19,14,10,170,14,11,7, +170,10,8,7,170,11,9,6,122,13,10,8,85,8,7,5,153,46,33,21, +255,212,138,51,255,221,151,68,255,191,132,62,255,19,17,12,176,0,12,7, +7,6,76,26,22,15,241,189,129,58,255,219,152,72,255,217,154,72,255,133, +87,38,255,15,13,10,221,6,6,5,28,0,8,15,12,8,113,20,16,11, +170,17,14,10,142,7,6,6,28,0,8,19,16,12,170,200,117,35,255,212, +123,37,255,115,74,30,255,9,8,6,113,0,8,12,11,9,178,104,73,37, +255,206,147,63,255,178,121,53,255,58,46,29,255,46,36,25,255,40,32,21, +252,19,17,12,85,0,36,12,10,9,164,191,131,60,255,223,161,80,255,221, +151,68,255,46,34,21,255,4,4,3,3,0,20,19,16,12,173,208,134,55, +255,223,156,70,255,216,160,81,255,21,19,14,255,0,16,6,5,5,25,17, +14,10,227,67,48,28,255,94,67,35,255,20,17,13,227,6,6,5,113,12, +11,9,198,67,51,30,255,85,62,32,255,25,20,14,255,9,8,6,82,0, +32,10,8,5,170,161,87,22,255,195,90,20,255,187,91,20,255,19,14,8, +255,0,28,15,12,8,119,20,16,11,170,17,14,10,156,10,8,7,28,0, +64,15,12,8,122,18,15,11,170,17,14,10,144,10,8,7,28,0,16,13, +12,10,170,157,96,36,255,211,123,38,255,199,116,34,255,31,24,16,255,6, +6,6,28,0,20,16,13,11,170,197,110,32,255,209,110,30,255,202,103,23, +255,58,36,15,255,8,7,5,113,0,8,10,8,5,85,137,68,18,255,185, +86,20,255,174,88,19,255,18,13,7,255,0,24,12,10,9,170,204,129,49, +255,220,144,63,255,217,133,50,255,26,20,13,255,0,28,7,6,6,76,23, +19,12,244,185,113,36,255,207,129,52,255,173,117,50,255,59,46,28,255,18, +15,13,198,9,9,8,113,6,6,6,11,0,24,15,12,8,133,22,17,11, +170,17,14,10,142,8,7,5,28,0,12,9,8,6,170,202,128,49,255,220, +148,63,255,219,140,56,255,22,19,13,255,0,8,12,10,9,170,200,125,37, +255,218,141,51,255,220,147,61,255,138,86,35,255,13,10,8,227,11,9,6, +170,13,11,8,198,61,41,22,255,202,111,31,255,204,105,25,255,200,105,21, +255,22,17,9,221,0,12,11,9,6,108,14,11,7,170,11,9,6,139,6, +5,3,17,0,12,9,7,6,133,144,75,19,255,185,86,20,255,178,86,19, +255,27,18,8,170,0,8,11,9,6,85,134,70,19,255,181,88,20,255,180, +87,19,255,24,15,7,178,0,12,10,8,5,99,165,86,22,255,206,111,27, +255,213,124,38,255,36,27,17,255,0,24,10,10,9,133,167,112,48,255,222, +166,77,255,223,157,72,255,54,39,23,255,5,5,4,37,0,20,13,11,8, +170,181,93,22,255,206,111,27,255,214,127,43,255,20,16,11,255,0,12,9, +8,8,170,203,129,50,255,222,145,63,255,220,147,61,255,33,26,16,255,0, +12,12,10,7,113,15,12,8,170,13,10,8,122,0,16,10,8,7,170,200, +120,41,255,220,142,59,255,219,146,60,255,27,21,14,255,0,12,13,11,8, +113,18,15,11,170,17,14,10,142,8,7,5,28,0,12,14,12,9,113,20, +15,11,170,17,14,10,153,10,8,7,28,0,16,9,8,6,85,29,21,10, +255,119,62,20,255,153,79,20,255,40,25,11,255,9,8,6,85,0,20,10, +8,7,28,32,24,13,218,68,47,25,255,61,43,24,255,61,46,28,255,61, +47,28,255,61,47,28,255,66,50,29,255,73,55,32,255,66,48,29,255,24, +20,15,85,0,20,7,6,6,79,32,26,17,244,199,132,54,255,208,150,75, +255,122,87,41,255,17,15,10,170,0,32,10,9,7,28,32,23,11,227,53, +33,14,255,34,23,11,255,12,10,7,190,6,5,5,28,0,20,9,7,4, +170,146,76,19,255,197,99,20,255,204,110,27,255,59,41,22,255,6,6,6, +170,10,9,9,113,31,26,18,184,30,25,17,255,29,25,18,255,34,27,19, +255,37,28,18,221,13,11,8,57,0,8,13,10,6,88,144,75,19,255,185, +86,20,255,178,90,19,255,20,14,7,212,0,12,9,7,4,125,157,81,20, +255,212,117,33,255,220,148,63,255,27,21,14,218,0,8,12,10,9,127,192, +111,31,255,208,112,27,255,202,103,23,255,22,16,9,204,0,12,10,8,5, +93,137,68,18,255,185,94,20,255,180,91,19,255,30,20,9,170,0,8,11, +9,6,85,140,67,19,255,202,106,21,255,214,125,39,255,25,20,14,255,0, +12,6,6,5,28,13,11,8,139,20,16,11,170,19,15,10,142,8,7,5, +28,0,8,10,9,5,142,153,79,20,255,195,90,20,255,206,111,27,255,24, +20,13,255,0,12,12,10,9,170,195,113,32,255,211,115,30,255,203,108,24, +255,31,21,10,173,0,8,11,9,6,85,140,70,19,255,185,86,20,255,180, +87,19,255,24,15,7,181,0,32,9,8,6,170,174,91,23,255,215,123,42, +255,221,150,66,255,25,20,14,255,0,32,9,7,4,170,148,77,19,255,181, +92,20,255,180,87,19,255,25,17,8,170,0,8,34,24,13,170,161,102,38, +255,219,154,70,255,220,142,59,255,213,124,38,255,32,24,13,198,0,8,11, +9,6,85,140,70,19,255,185,86,20,255,178,90,19,255,20,14,7,212,0, +12,8,7,5,127,144,78,19,255,185,86,20,255,180,87,19,255,29,19,10, +170,0,8,13,11,8,116,194,116,33,255,209,110,30,255,202,95,23,255,22, +17,9,221,0,12,10,8,5,85,12,9,5,170,10,8,5,130,6,5,3, +8,0,12,10,8,5,110,144,78,19,255,185,86,20,255,178,86,19,255,27, +18,8,170,0,8,11,8,6,85,137,68,18,255,185,86,20,255,200,105,21, +255,29,21,12,255,4,4,4,25,10,9,7,139,154,100,47,255,215,148,70, +255,198,131,45,255,46,34,19,255,11,9,6,88,0,12,10,8,5,119,144, +78,19,255,185,86,20,255,180,87,19,255,21,15,8,210,0,32,13,11,8, +170,199,119,39,255,220,144,63,255,221,155,70,255,27,21,14,255,0,20,10, +9,7,170,171,89,22,255,195,98,20,255,183,89,19,255,29,20,8,170,0, +8,11,9,6,85,139,70,20,255,202,103,23,255,211,118,36,255,28,21,13, +201,0,4,8,8,7,57,118,84,39,255,215,159,86,255,219,149,66,255,216, +129,45,255,211,121,34,255,34,25,13,178,0,8,11,10,6,88,146,76,19, +255,185,94,20,255,178,90,19,255,24,18,9,255,0,12,18,15,11,170,203, +122,42,255,215,126,40,255,209,106,30,255,32,22,13,184,0,8,12,10,7, +85,143,72,20,255,185,94,20,255,178,90,19,255,20,14,7,210,0,40,9, +7,4,170,148,77,19,255,180,87,19,255,178,86,19,255,30,21,9,255,5, +5,4,37,8,7,5,28,20,17,13,227,133,89,38,255,215,142,56,255,216, +129,45,255,209,115,32,255,26,19,11,210,0,8,11,9,6,85,142,74,19, +255,185,86,20,255,178,90,19,255,20,14,7,210,0,12,9,7,4,122,143, +75,20,255,203,108,24,255,216,129,45,255,30,23,15,255,0,12,12,10,7, +110,16,13,9,170,13,10,8,122,0,16,9,8,6,105,142,74,19,255,185, +86,20,255,180,87,19,255,23,16,8,255,0,24,15,13,10,170,203,122,42, +255,215,126,40,255,209,118,30,255,24,17,11,255,0,24,9,8,4,170,148, +77,19,255,181,92,20,255,180,87,19,255,23,16,8,198,0,12,9,7,6, +139,159,82,20,255,203,100,24,255,212,121,33,255,28,21,13,255,0,12,12, +11,9,119,81,59,34,255,216,153,71,255,173,117,50,255,21,18,14,255,10, +10,9,244,11,10,8,255,60,35,15,255,173,85,20,255,84,49,17,255,13, +10,6,170,0,12,10,8,5,130,146,79,19,255,193,89,20,255,203,104,24, +255,120,77,31,255,19,17,12,255,117,80,36,255,219,154,70,255,178,121,53, +255,20,17,13,255,45,33,18,255,184,94,21,255,195,90,20,255,205,106,26, +255,30,22,13,255,0,12,7,7,6,82,35,28,18,255,196,114,33,255,148, +80,25,255,32,22,11,255,20,15,9,255,26,18,9,255,88,49,17,255,149, +78,20,255,40,26,11,255,9,7,4,85,0,28,9,7,4,127,140,70,19, +255,181,88,20,255,180,87,19,255,18,13,7,235,0,24,10,9,7,93,104, +69,35,255,201,131,48,255,194,109,33,255,65,42,20,255,12,10,7,170,0, +36,9,7,4,170,146,79,19,255,181,88,20,255,180,87,19,255,23,16,8, +198,0,32,15,14,10,198,188,133,61,255,219,149,66,255,194,115,37,255,17, +15,10,244,0,24,10,8,5,113,144,78,19,255,185,86,20,255,180,87,19, +255,18,13,7,255,0,140,7,6,4,65,53,31,12,255,162,83,19,255,185, +94,20,255,130,70,21,255,31,22,10,255,25,19,10,198,22,17,9,246,70, +40,15,255,169,87,20,255,200,105,21,255,212,123,37,255,28,21,13,221,0, +8,12,10,9,133,200,127,41,255,210,120,33,255,202,95,23,255,19,14,8, +238,0,12,10,8,5,110,144,78,19,255,185,86,20,255,178,86,19,255,28, +19,9,170,0,8,12,10,9,133,194,112,31,255,209,110,30,255,202,102,21, +255,21,15,8,235,0,16,9,7,4,57,12,10,5,88,10,8,5,85,0, +12,10,8,5,125,146,79,19,255,181,88,20,255,180,87,19,255,25,17,8, +195,0,12,10,8,5,119,144,78,19,255,185,94,20,255,200,105,21,255,23, +18,10,221,0,8,11,9,8,153,200,123,41,255,212,117,33,255,202,103,23, +255,111,63,20,255,27,20,10,255,20,16,9,246,22,17,9,249,28,20,9, +198,30,21,9,170,24,17,9,215,28,20,9,201,10,8,5,85,0,16,9, +7,4,170,146,79,19,255,181,88,20,255,180,87,19,255,18,13,7,255,0, +16,11,10,8,113,152,104,47,255,214,134,49,255,204,105,25,255,98,54,19, +255,18,13,9,227,13,10,8,170,14,12,9,198,60,41,21,255,199,112,28, +255,202,102,21,255,202,103,23,255,26,19,11,204,0,8,12,11,9,116,187, +101,24,255,202,93,21,255,187,91,20,255,18,13,7,255,0,12,9,7,4, +170,146,79,19,255,181,88,20,255,178,90,19,255,27,17,8,170,0,8,11, +9,6,85,139,70,20,255,202,103,23,255,212,123,37,255,32,24,15,255,0, +24,13,12,10,170,196,114,33,255,206,106,25,255,196,99,21,255,28,19,9, +170,0,8,11,8,6,85,137,68,18,255,181,88,20,255,178,86,19,255,164, +85,21,255,138,73,21,255,175,93,20,255,178,86,19,255,46,28,11,255,6, +5,3,108,0,20,9,7,4,170,146,76,19,255,189,88,20,255,189,88,20, +255,28,19,9,170,0,8,11,9,6,85,137,68,18,255,185,86,20,255,178, +90,19,255,27,17,8,170,0,4,9,7,4,167,146,79,19,255,20,14,7, +252,0,4,11,9,6,85,137,68,18,255,185,94,20,255,178,90,19,255,27, +17,8,170,0,8,11,9,6,85,137,68,18,255,185,86,20,255,180,87,19, +255,18,13,7,255,0,12,9,7,4,170,146,79,19,255,185,94,20,255,183, +85,19,255,27,19,8,170,0,8,11,9,6,85,140,73,19,255,181,88,20, +255,178,90,19,255,20,15,7,255,0,12,16,14,11,170,208,143,59,255,223, +156,70,255,216,135,49,255,28,22,13,210,0,8,11,9,6,85,140,70,19, +255,185,94,20,255,178,90,19,255,72,39,13,255,10,8,5,218,8,6,3, +170,9,7,4,193,39,24,10,255,160,82,19,255,185,94,20,255,144,74,23, +255,16,13,9,170,0,8,10,9,7,85,145,101,48,255,218,149,67,255,210, +115,31,255,99,57,19,255,10,8,5,227,8,6,3,170,9,7,4,190,30, +20,9,255,158,81,19,255,185,94,20,255,178,90,19,255,27,17,8,170,0, +8,11,8,6,85,137,68,18,255,185,86,20,255,180,87,19,255,18,13,7, +255,0,44,9,9,8,28,13,12,8,142,27,20,10,170,29,21,10,193,24, +17,9,252,22,17,9,232,22,17,9,255,87,49,18,255,181,88,20,255,178, +90,19,255,100,54,17,255,11,10,6,150,0,16,9,7,4,170,146,79,19, +255,181,88,20,255,180,87,19,255,18,13,7,255,0,16,15,13,10,170,208, +141,55,255,223,156,70,255,217,133,50,255,23,19,12,255,0,12,10,8,5, +122,144,78,19,255,185,86,20,255,180,87,19,255,30,20,9,176,0,12,12, +10,7,85,39,26,12,255,155,80,20,255,99,55,19,255,19,16,12,255,12, +11,9,255,18,15,11,255,119,84,38,255,209,137,60,255,138,86,35,255,18, +15,11,178,0,12,10,8,5,130,144,78,19,255,181,92,20,255,178,90,19, +255,39,24,10,255,6,5,3,210,29,20,8,255,169,87,20,255,97,53,18, +255,8,7,5,255,26,21,15,255,212,142,59,255,221,151,68,255,218,142,53, +255,34,25,15,255,0,20,5,5,4,82,16,12,7,255,160,82,19,255,185, +86,20,255,185,86,20,255,52,29,11,255,7,6,4,170,0,20,8,7,5, +85,83,46,16,255,181,92,20,255,178,86,19,255,87,47,14,255,10,8,5, +224,8,6,3,170,9,7,4,190,29,20,8,255,195,104,24,255,217,136,50, +255,221,155,70,255,30,23,15,255,0,16,8,7,5,85,26,18,9,255,107, +59,20,255,151,80,22,255,60,34,15,255,11,9,6,170,0,36,8,7,5, +170,159,82,20,255,202,118,35,255,66,51,29,255,9,9,8,96,0,16,15, +13,10,170,208,140,59,255,223,156,70,255,215,133,44,255,27,20,12,255,0, +20,14,12,7,244,131,67,20,255,176,89,19,255,17,12,6,255,0,184,17, +14,10,85,171,95,28,255,206,123,33,255,208,123,31,255,207,112,28,255,202, +107,23,255,191,98,22,255,170,91,21,255,195,107,22,255,209,123,30,255,212, +132,37,255,214,134,39,255,211,133,40,255,202,121,35,255,29,21,12,164,0, +8,12,10,7,82,168,98,29,255,202,121,35,255,196,120,31,255,194,115,31, +255,190,115,27,255,185,101,26,255,184,100,25,255,199,107,26,255,208,123,31, +255,168,105,37,255,25,21,14,227,9,8,8,28,0,8,8,8,7,28,39, +30,18,249,183,122,42,255,211,133,40,255,210,133,43,255,161,106,41,255,15, +13,10,221,5,4,4,17,0,8,14,11,7,113,148,83,25,255,193,108,24, +255,180,93,23,255,27,18,10,153,0,8,12,9,7,122,144,78,19,255,180, +91,19,255,83,46,16,255,7,6,4,184,0,8,4,4,3,85,28,21,13, +255,202,121,35,255,209,132,42,255,131,87,36,255,10,9,7,255,5,5,5, +28,0,40,10,9,7,68,86,62,31,255,206,131,43,255,214,130,39,255,76, +50,25,255,7,6,6,113,0,16,5,5,4,28,21,17,12,255,202,121,35, +255,210,135,37,255,157,100,38,255,18,15,11,150,0,16,18,15,9,91,161, +88,24,255,105,64,28,255,11,10,8,170,0,12,8,7,7,85,40,28,17, +255,174,91,23,255,42,27,13,173,0,32,10,8,5,116,133,66,16,255,161, +85,17,255,161,78,17,255,25,16,8,221,0,24,15,12,8,119,170,99,29, +255,203,126,36,255,199,127,34,255,27,20,12,210,0,60,13,11,8,122,170, +99,29,255,204,127,37,255,199,119,34,255,27,20,12,198,0,12,4,4,3, +11,18,13,9,255,154,79,19,255,174,88,19,255,92,51,17,255,12,10,7, +198,0,24,11,9,6,147,142,74,19,255,171,90,18,255,159,81,18,255,17, +12,6,255,0,12,8,7,5,142,133,66,16,255,161,85,17,255,161,85,17, +255,21,14,6,215,0,24,10,9,7,198,190,107,25,255,203,104,24,255,196, +99,21,255,21,15,8,255,2,2,1,14,0,20,9,8,6,37,35,28,18, +255,183,112,36,255,212,132,37,255,178,118,41,255,27,23,16,255,5,5,4, +198,0,32,15,12,8,105,142,79,23,255,189,97,22,255,160,83,21,255,18, +13,7,218,0,12,10,8,7,198,196,114,33,255,214,129,37,255,212,132,37, +255,27,21,12,210,0,8,13,11,8,116,192,114,31,255,210,125,33,255,209, +123,30,255,203,113,26,255,177,91,22,255,159,82,20,255,160,83,21,255,165, +85,20,255,168,89,19,255,163,86,18,255,161,78,17,255,23,15,6,170,0, +8,9,7,4,57,99,48,14,255,142,73,17,255,133,66,16,255,19,13,6, +190,0,12,7,6,4,164,135,66,16,255,161,85,17,255,161,85,17,255,25, +16,6,170,0,8,10,8,5,85,131,65,16,255,161,85,17,255,161,85,17, +255,19,13,6,227,0,12,10,8,5,176,190,107,25,255,212,127,35,255,214, +134,39,255,30,21,13,255,0,24,12,10,7,170,194,109,33,255,213,132,36, +255,208,122,29,255,28,20,11,255,0,24,9,7,4,147,136,70,17,255,202, +98,21,255,211,126,34,255,27,20,12,255,3,3,2,28,0,8,10,8,7, +195,180,93,23,255,202,102,21,255,202,102,21,255,25,17,10,221,0,8,13, +11,8,65,129,70,22,255,172,88,21,255,144,78,19,255,22,15,7,176,0, +12,10,8,7,198,198,124,37,255,215,136,42,255,214,134,39,255,27,21,12, +212,0,8,12,10,7,79,151,88,26,255,198,116,29,255,192,109,27,255,25, +18,10,167,0,8,12,9,7,82,119,62,20,255,174,89,21,255,154,79,19, +255,22,15,7,181,0,20,5,5,4,68,20,14,7,249,142,73,17,255,143, +74,18,255,45,26,10,255,10,8,5,85,0,76,7,6,6,85,39,30,18, +255,196,121,41,255,213,135,42,255,115,72,30,255,10,9,7,170,0,40,5, +5,4,17,6,5,5,85,5,5,4,45,0,28,9,7,4,142,146,79,19, +255,204,108,23,255,212,126,33,255,30,22,13,255,3,3,3,40,0,36,10, +8,5,125,133,66,16,255,161,85,17,255,161,85,17,255,19,13,6,212,0, +12,10,8,5,127,136,70,17,255,193,97,20,255,203,108,24,255,30,21,11, +193,0,8,13,10,6,85,134,70,19,255,171,90,18,255,159,81,18,255,17, +12,6,238,0,12,8,6,5,144,135,66,16,255,161,85,17,255,161,85,17, +255,23,15,6,170,0,8,10,7,5,85,133,66,16,255,185,94,20,255,209, +123,30,255,23,18,12,255,3,3,2,28,0,4,5,5,4,28,18,15,11, +227,134,72,21,255,158,81,19,255,143,74,18,255,22,15,7,142,0,8,10, +8,5,85,131,65,16,255,163,79,18,255,178,90,19,255,22,16,9,255,3, +2,2,20,0,8,9,7,6,176,144,78,19,255,175,88,18,255,163,79,18, +255,26,16,7,170,0,8,10,8,5,85,129,64,16,255,161,85,17,255,161, +78,17,255,19,13,6,229,0,32,8,7,5,156,144,78,19,255,202,102,21, +255,206,111,27,255,27,20,12,255,0,32,10,8,5,133,135,66,16,255,161, +85,17,255,161,85,17,255,19,13,6,227,0,12,8,7,5,255,172,85,21, +255,189,92,20,255,172,87,19,255,24,16,7,170,0,8,10,8,5,85,129, +64,16,255,161,85,17,255,161,85,17,255,19,13,6,212,0,12,10,8,5, +127,135,66,16,255,161,85,17,255,161,85,17,255,26,16,7,170,0,8,11, +9,6,85,134,70,19,255,171,90,18,255,159,78,18,255,23,15,6,170,0, +8,9,7,4,57,98,49,13,255,139,71,16,255,133,66,16,255,19,13,6, +193,0,12,7,6,4,176,133,66,16,255,161,85,17,255,161,85,17,255,23, +15,6,170,0,8,10,8,5,85,129,64,16,255,165,87,18,255,180,91,19, +255,20,15,9,255,0,4,5,5,4,17,26,21,15,227,126,75,25,255,178, +95,21,255,142,74,19,255,46,28,11,255,10,8,5,57,0,8,10,8,5, +85,131,65,16,255,161,85,17,255,161,85,17,255,17,12,6,252,2,1,1, +8,0,28,13,11,8,170,199,119,34,255,215,136,42,255,214,139,41,255,28, +20,13,255,0,20,8,7,5,170,135,66,16,255,161,85,17,255,161,85,17, +255,23,15,6,170,0,8,10,8,5,85,131,67,16,255,202,102,21,255,211, +127,36,255,22,17,11,249,0,8,16,14,11,201,101,67,28,255,191,98,22, +255,185,94,20,255,172,87,19,255,26,17,7,170,0,8,10,8,5,85,129, +64,16,255,161,85,17,255,161,85,17,255,31,20,8,255,5,5,4,102,0, +4,5,4,4,28,16,13,9,255,164,85,21,255,180,91,19,255,165,87,18, +255,26,17,7,170,0,8,10,8,5,85,129,64,16,255,161,85,17,255,161, +85,17,255,19,13,6,212,0,40,10,8,5,133,135,66,16,255,161,85,17, +255,161,85,17,255,26,17,7,255,3,3,2,136,9,7,4,227,131,67,20, +255,197,104,22,255,198,104,21,255,183,93,19,255,172,87,19,255,26,17,7, +170,0,8,10,8,5,85,129,64,16,255,161,85,17,255,161,85,17,255,19, +13,6,212,0,12,10,8,5,127,135,66,16,255,193,97,20,255,209,123,30, +255,19,15,10,252,0,8,13,11,8,65,125,68,22,255,174,86,21,255,146, +76,19,255,22,14,7,178,0,12,8,6,5,144,135,66,16,255,161,85,17, +255,161,85,17,255,19,14,6,238,0,24,13,11,8,170,163,87,20,255,180, +91,19,255,165,87,18,255,17,12,6,255,0,24,9,7,4,139,135,66,16, +255,161,85,17,255,161,85,17,255,15,11,6,246,0,12,9,7,6,184,180, +93,23,255,211,115,30,255,213,133,38,255,28,20,13,255,0,16,12,11,9, +170,152,91,31,255,188,105,31,255,115,66,22,255,91,50,16,255,84,46,15, +255,116,59,17,255,118,62,17,255,15,11,6,221,0,16,10,8,5,116,146, +79,19,255,202,103,23,255,209,128,32,255,200,127,41,255,167,106,40,255,197, +122,42,255,210,130,35,255,186,106,27,255,88,51,19,255,102,55,17,255,157, +83,18,255,189,92,20,255,209,123,30,255,29,21,12,224,0,8,7,6,6, +28,41,31,18,235,160,84,23,255,170,87,19,255,45,26,10,255,5,5,4, +170,4,4,4,8,4,4,3,99,15,12,6,255,140,72,17,255,138,71,17, +255,45,26,10,255,10,8,5,85,0,24,8,7,5,142,133,66,16,255,161, +85,17,255,161,85,17,255,19,13,6,229,0,24,13,11,8,170,160,86,21, +255,185,90,20,255,91,50,16,255,7,6,4,255,0,40,8,7,5,150,133, +66,16,255,161,85,17,255,161,85,17,255,15,11,6,246,0,32,8,8,7, +110,74,52,27,255,191,103,24,255,176,89,19,255,34,22,9,255,6,5,3, +57,0,20,8,6,5,161,133,66,16,255,161,85,17,255,161,78,17,255,15, +11,6,252,0,140,12,10,5,85,123,61,16,255,161,85,17,255,161,85,17, +255,22,15,7,255,2,2,1,85,0,8,7,6,4,244,133,66,16,255,167, +88,18,255,189,92,20,255,27,19,10,195,0,8,12,10,7,110,160,83,21, +255,177,85,18,255,161,78,17,255,15,11,6,252,0,12,7,6,4,161,133, +66,16,255,161,85,17,255,161,85,17,255,23,15,6,170,0,8,11,9,6, +85,134,70,19,255,171,90,18,255,159,78,18,255,15,11,6,249,0,12,10, +8,5,85,98,49,13,255,135,72,16,255,133,66,16,255,19,13,6,139,0, +8,10,8,5,85,131,65,16,255,161,85,17,255,161,85,17,255,15,11,6, +246,0,12,7,6,4,164,133,66,16,255,165,87,18,255,178,90,19,255,24, +17,9,212,0,8,13,11,8,105,165,86,22,255,180,91,19,255,159,81,18, +255,19,14,6,255,2,2,1,79,0,44,8,6,5,167,133,66,16,255,161, +85,17,255,161,85,17,255,15,11,6,252,0,16,7,6,6,28,24,19,13, +227,103,59,20,255,157,83,18,255,154,78,17,255,150,81,19,255,154,79,19, +255,158,81,19,255,162,83,19,255,161,85,17,255,159,81,18,255,163,86,18, +255,27,18,8,170,0,8,11,9,6,85,131,67,16,255,165,87,18,255,161, +85,17,255,15,11,6,252,0,12,8,6,5,167,133,66,16,255,161,85,17, +255,161,85,17,255,23,15,6,170,0,8,10,8,5,85,131,65,16,255,175, +88,18,255,191,96,20,255,25,18,10,255,0,24,11,9,6,170,148,77,19, +255,169,82,18,255,161,85,17,255,23,15,6,170,0,8,10,8,5,85,129, +64,16,255,161,85,17,255,161,85,17,255,87,47,14,255,23,17,8,255,65, +34,12,255,150,76,17,255,132,68,17,255,41,25,10,255,10,8,5,85,0, +16,8,7,5,150,133,66,16,255,161,85,17,255,161,78,17,255,23,15,6, +170,0,8,10,8,5,85,129,64,16,255,161,85,17,255,161,85,17,255,23, +15,6,170,0,4,8,7,5,153,133,66,16,255,19,13,6,238,0,4,10, +8,5,85,129,64,16,255,161,85,17,255,161,85,17,255,23,15,6,170,0, +8,10,8,5,85,129,64,16,255,161,85,17,255,161,85,17,255,15,11,6, +252,0,12,8,6,5,167,133,66,16,255,161,85,17,255,161,85,17,255,23, +15,6,170,0,8,10,8,5,85,129,64,16,255,161,85,17,255,161,85,17, +255,31,20,8,255,5,4,4,85,0,4,5,4,4,40,17,14,10,255,200, +120,35,255,207,112,28,255,195,98,20,255,29,20,8,170,0,8,10,8,5, +85,131,65,16,255,163,86,18,255,159,81,18,255,150,76,17,255,137,70,16, +255,135,72,16,255,135,66,16,255,146,75,17,255,159,81,18,255,131,67,20, +255,42,31,17,255,10,9,7,62,0,8,5,5,4,8,26,21,15,227,137, +79,28,255,174,88,19,255,158,83,17,255,137,70,16,255,135,72,16,255,135, +66,16,255,146,75,17,255,159,81,18,255,161,85,17,255,161,85,17,255,23, +15,6,170,0,8,10,8,5,85,131,67,16,255,163,86,18,255,159,81,18, +255,17,12,6,255,0,68,2,1,1,8,7,6,4,249,137,67,16,255,165, +80,18,255,154,78,17,255,27,18,8,170,0,16,8,6,5,167,133,66,16, +255,161,85,17,255,161,85,17,255,15,11,6,252,0,16,13,11,8,170,199, +124,36,255,211,125,32,255,200,105,21,255,18,13,7,255,0,12,7,6,4, +164,133,66,16,255,161,85,17,255,161,78,17,255,19,13,6,227,0,16,8, +7,5,122,68,38,13,255,150,83,23,255,174,107,35,255,181,112,38,255,190, +117,39,255,193,114,36,255,143,84,26,255,15,12,8,212,4,4,3,6,0, +12,10,8,5,108,135,66,16,255,161,85,17,255,161,85,17,255,125,65,16, +255,90,47,13,255,121,60,16,255,164,84,19,255,189,97,22,255,177,104,32, +255,194,123,39,255,212,134,41,255,210,124,31,255,200,105,21,255,23,17,8, +218,0,16,10,8,5,167,56,31,11,255,110,55,15,255,118,62,17,255,115, +58,16,255,115,58,16,255,120,63,17,255,95,46,14,255,17,13,6,227,7, +6,4,28,0,16,14,12,7,227,87,43,14,255,154,78,17,255,152,77,17, +255,139,71,16,255,135,72,16,255,135,66,16,255,146,75,17,255,200,105,21, +255,211,127,36,255,214,134,39,255,23,18,12,255,0,12,7,6,4,85,26, +16,7,255,131,67,16,255,145,75,18,255,78,43,15,255,7,6,4,255,0, +40,10,8,5,136,157,81,20,255,210,129,33,255,139,89,36,255,10,9,7, +198,0,16,13,11,8,170,196,113,31,255,206,114,25,255,189,92,20,255,18, +13,7,244,0,16,5,4,4,88,27,19,8,255,141,73,18,255,161,85,17, +255,21,14,6,218,0,112,12,9,7,99,11,8,6,170,10,8,5,91,0, +60,11,10,8,28,32,23,13,227,108,57,19,255,153,82,18,255,154,78,17, +255,146,75,17,255,97,47,14,255,36,24,11,255,108,64,25,255,203,111,30, +255,207,118,32,255,207,118,32,255,189,110,32,255,63,41,20,255,15,12,8, +76,0,8,9,8,6,28,38,27,15,218,51,33,18,255,48,32,17,255,131, +74,24,255,182,97,21,255,176,89,19,255,170,87,19,255,134,72,21,255,37, +25,14,255,15,13,8,144,7,7,6,28,0,12,11,9,8,127,171,99,28, +255,208,123,31,255,203,124,30,255,104,63,27,255,15,13,10,212,7,6,6, +28,0,12,14,11,7,170,142,74,19,255,161,85,17,255,159,81,18,255,27, +18,8,184,0,8,6,5,3,28,27,17,8,227,92,46,13,255,111,55,14, +255,31,20,8,255,8,6,3,198,9,7,4,170,10,8,5,227,22,16,9, +255,61,39,18,255,107,64,26,255,108,66,25,255,32,22,11,255,9,7,6, +170,0,44,10,9,7,156,56,36,19,255,191,114,32,255,175,98,30,255,41, +27,16,255,11,9,6,57,0,12,21,15,10,227,100,56,21,255,160,83,21, +255,80,44,17,255,14,12,7,190,7,6,6,28,0,16,13,10,6,28,29, +20,10,212,21,15,10,144,0,20,12,9,7,85,39,24,10,173,16,12,7, +85,0,32,6,5,3,20,19,13,6,173,21,14,6,255,21,15,6,215,10, +8,5,85,0,24,15,12,8,170,190,98,23,255,203,108,24,255,202,111,23, +255,23,17,10,255,0,60,17,13,10,170,195,112,30,255,211,124,30,255,205, +106,26,255,31,21,12,255,0,12,8,6,5,139,44,25,9,255,135,72,16, +255,104,54,13,255,15,11,6,249,7,6,4,28,0,24,7,6,4,57,44, +25,9,255,137,73,16,255,143,70,16,255,49,25,8,255,8,6,3,184,8, +6,3,85,8,6,3,142,23,16,6,255,130,66,15,255,145,77,16,255,87, +44,12,255,10,8,5,142,0,20,11,9,8,164,53,31,14,255,150,74,19, +255,154,78,17,255,148,76,17,255,65,33,10,255,10,8,5,184,6,5,5, +28,0,16,11,9,6,142,175,102,30,255,207,123,32,255,208,114,31,255,196, +114,33,255,89,56,26,255,17,13,10,255,11,8,6,170,9,7,6,170,11, +8,6,170,15,11,8,170,18,13,9,142,8,6,5,28,0,8,10,8,5, +93,102,53,17,255,159,81,18,255,154,78,17,255,72,37,11,255,11,8,6, +227,9,7,6,170,11,8,6,198,61,36,20,255,196,107,27,255,204,114,27, +255,182,102,31,255,19,14,10,170,0,8,6,6,5,20,26,19,11,198,28, +20,11,255,22,16,9,255,23,16,8,255,27,18,8,255,24,16,7,255,24, +16,7,255,74,39,11,255,139,68,16,255,143,70,16,255,143,70,16,255,20, +13,5,170,0,8,7,6,4,74,87,44,12,255,155,79,18,255,151,73,16, +255,67,34,10,255,9,7,4,198,9,7,4,96,8,6,5,159,27,17,8, +255,137,67,16,255,158,80,17,255,112,56,15,255,10,8,5,167,0,8,7, +5,4,85,74,36,11,255,150,83,17,255,145,77,16,255,55,29,10,255,8, +6,3,198,8,6,3,88,7,6,4,153,39,24,12,255,199,112,28,255,210, +115,31,255,184,108,33,255,17,14,10,198,0,24,11,9,6,170,139,69,18, +255,168,86,19,255,154,78,17,255,17,12,6,235,0,24,7,6,4,85,64, +32,11,255,162,80,19,255,198,96,21,255,109,63,26,255,15,11,8,227,10, +8,7,170,8,7,5,195,29,18,8,255,137,67,16,255,154,78,17,255,114, +59,15,255,11,10,6,164,0,8,9,7,6,85,97,50,16,255,159,81,18, +255,152,77,17,255,74,36,11,255,10,8,5,198,7,6,4,125,10,8,5, +198,61,36,20,255,200,105,29,255,209,122,28,255,180,104,29,255,16,12,9, +170,0,8,12,10,7,170,160,83,21,255,183,89,19,255,174,88,19,255,28, +19,9,187,0,8,14,10,7,85,143,75,20,255,195,98,20,255,189,92,20, +255,21,15,8,224,0,24,7,6,4,85,26,16,7,255,111,55,14,255,132, +67,15,255,39,23,8,255,8,6,3,113,0,68,9,7,6,85,32,22,13, +255,188,112,31,255,193,114,30,255,94,57,25,255,17,13,10,170,0,44,9, +7,4,142,10,8,5,255,10,8,5,198,6,5,3,28,0,24,8,7,5, +85,88,48,19,255,204,114,27,255,208,118,31,255,111,62,26,255,11,8,6, +227,8,7,5,150,10,8,5,116,10,8,5,88,9,7,4,85,6,5,3, +74,0,16,10,8,5,99,114,56,13,255,143,70,16,255,143,70,16,255,18, +12,5,215,0,12,8,7,3,130,118,60,13,255,148,76,17,255,150,76,17, +255,24,16,7,170,0,8,9,7,4,85,114,56,13,255,145,74,16,255,143, +70,16,255,52,28,9,255,8,6,3,198,8,6,3,88,8,6,3,144,23, +15,6,255,130,66,15,255,151,80,16,255,111,55,14,255,10,8,5,144,0, +8,6,5,3,59,59,32,10,255,157,83,18,255,185,90,20,255,97,54,22, +255,14,10,7,227,13,10,6,170,13,10,6,255,84,41,13,255,148,76,17, +255,155,82,18,255,135,66,16,255,14,10,5,159,0,8,9,7,4,85,114, +56,13,255,145,77,16,255,145,74,16,255,55,28,10,255,9,7,4,198,8, +6,3,93,8,6,3,147,25,16,6,255,130,64,15,255,151,80,16,255,111, +55,14,255,10,8,5,142,0,8,9,7,4,85,114,56,13,255,145,77,16, +255,143,70,16,255,52,28,9,255,8,6,3,198,8,6,3,102,8,6,3, +139,8,6,3,170,9,8,4,113,0,12,10,8,5,91,114,56,13,255,150, +76,17,255,150,76,17,255,17,12,6,252,0,32,7,6,4,85,64,33,11, +255,145,77,16,255,143,70,16,255,56,29,9,255,8,6,3,198,8,6,3, +85,6,5,3,119,14,11,5,255,128,66,15,255,151,73,16,255,143,76,16, +255,20,13,5,170,0,8,9,7,4,85,114,56,13,255,143,70,16,255,143, +70,16,255,18,12,5,215,0,12,8,7,3,130,114,56,13,255,143,70,16, +255,143,70,16,255,20,13,5,170,0,8,9,7,4,85,114,56,13,255,143, +70,16,255,143,70,16,255,20,13,5,170,0,8,7,6,4,71,87,44,12, +255,158,87,17,255,161,85,17,255,103,53,20,255,15,11,8,227,10,8,7, +170,10,8,7,195,33,20,10,255,137,67,16,255,151,73,16,255,111,55,14, +255,10,8,5,142,0,8,9,7,4,85,114,56,13,255,143,70,16,255,146, +75,17,255,18,13,7,255,0,8,7,6,6,74,24,16,7,255,132,67,15, +255,145,77,16,255,135,72,16,255,14,10,5,170,0,8,9,7,4,85,114, +56,13,255,145,77,16,255,143,70,16,255,58,31,11,255,11,8,6,227,11, +9,6,170,11,8,6,170,10,7,5,170,9,8,4,113,0,12,11,9,6, +161,175,92,24,255,203,108,24,255,198,101,23,255,25,18,10,255,0,20,8, +6,3,147,114,56,13,255,143,70,16,255,143,70,16,255,20,13,5,170,0, +8,9,7,4,85,114,56,13,255,170,87,19,255,199,106,24,255,24,17,11, +255,0,8,6,6,5,28,15,12,6,255,128,66,15,255,145,74,16,255,143, +70,16,255,20,13,5,170,0,8,6,5,3,57,57,31,10,255,145,77,16, +255,143,70,16,255,90,44,13,255,19,13,6,255,10,8,5,255,13,10,6, +255,62,33,11,255,135,72,16,255,151,73,16,255,108,53,13,255,10,8,5, +142,0,8,9,7,4,85,114,56,13,255,143,70,16,255,143,70,16,255,18, +12,5,215,0,40,7,6,4,85,64,33,11,255,145,77,16,255,143,70,16, +255,67,34,10,255,14,10,5,255,49,27,9,255,140,72,17,255,160,85,19, +255,160,85,19,255,110,55,15,255,31,20,8,255,9,7,4,57,0,8,9, +8,4,85,114,56,13,255,143,70,16,255,143,70,16,255,18,12,5,215,0, +12,8,7,3,136,118,60,13,255,154,75,17,255,172,87,19,255,24,17,9, +204,0,8,8,7,5,85,95,49,16,255,161,85,17,255,152,77,17,255,71, +34,10,255,9,7,4,198,8,6,3,88,8,6,3,142,23,15,6,255,130, +66,15,255,151,80,16,255,111,55,14,255,14,10,5,170,0,24,9,7,4, +164,118,56,15,255,145,74,16,255,143,70,16,255,16,12,5,224,0,24,9, +7,4,85,85,43,12,255,151,80,16,255,143,70,16,255,55,29,10,255,8, +6,3,198,8,6,3,93,8,6,5,173,45,27,14,255,199,112,28,255,210, +124,31,255,199,119,34,255,19,15,10,221,0,20,13,11,8,170,46,28,11, +255,131,65,16,255,145,74,16,255,137,67,16,255,70,35,11,255,12,10,5, +224,7,6,4,28,0,16,8,6,5,34,37,25,14,255,181,100,28,255,206, +113,31,255,207,123,32,255,199,119,34,255,107,67,28,255,28,20,11,255,28, +19,9,255,84,41,13,255,141,75,16,255,145,74,16,255,159,82,20,255,88, +53,25,255,13,11,8,99,0,8,13,10,6,85,114,60,17,255,148,76,17, +255,143,70,16,255,21,14,6,255,0,12,10,8,5,170,119,61,14,255,145, +77,16,255,135,72,16,255,19,13,6,170,0,24,8,7,3,142,114,56,13, +255,143,70,16,255,143,70,16,255,16,12,5,218,0,24,11,8,6,170,126, +62,15,255,151,80,16,255,112,57,13,255,19,13,6,255,8,6,3,144,8, +6,3,85,9,7,4,113,8,6,3,167,8,6,3,170,8,6,3,170,9, +8,4,113,0,12,10,8,5,91,114,56,13,255,145,74,16,255,143,70,16, +255,61,32,10,255,9,8,4,170,0,32,12,10,7,207,74,36,11,255,139, +74,16,255,79,40,12,255,10,8,5,210,0,16,9,7,4,85,27,17,6, +255,130,66,15,255,143,70,16,255,143,76,16,255,16,12,5,221,0,140,8, +6,3,85,74,39,11,255,145,77,16,255,143,70,16,255,41,23,8,255,7, +6,4,173,5,5,2,85,6,5,3,113,14,10,5,255,129,65,14,255,145, +74,16,255,145,74,16,255,24,16,7,170,0,8,10,8,5,85,112,57,13, +255,145,77,16,255,143,70,16,255,52,28,9,255,8,6,3,198,8,6,3, +88,8,6,3,144,23,15,6,255,130,66,15,255,151,80,16,255,111,55,14, +255,10,8,5,144,0,8,6,5,3,59,63,34,10,255,145,77,16,255,143, +70,16,255,55,29,10,255,8,6,3,198,8,6,3,85,8,6,3,144,32, +19,7,255,139,74,16,255,155,79,18,255,135,66,16,255,14,10,5,170,0, +8,6,5,3,57,57,31,10,255,145,77,16,255,143,70,16,255,55,29,10, +255,8,6,3,198,8,6,3,88,8,6,3,144,21,15,6,255,130,66,15, +255,143,76,16,255,146,75,17,255,24,15,7,184,0,8,7,6,4,71,66, +33,11,255,148,79,17,255,143,70,16,255,45,25,8,255,7,5,4,176,7, +5,4,85,8,6,3,85,9,7,4,85,8,6,3,82,0,28,8,7,3, +136,114,56,13,255,143,70,16,255,143,70,16,255,16,12,5,221,0,20,7, +6,4,28,10,8,5,130,19,13,6,170,29,19,8,173,24,16,7,212,27, +18,8,193,20,13,7,246,55,29,10,255,139,74,16,255,143,70,16,255,143, +70,16,255,18,13,5,170,0,8,9,7,4,85,115,54,14,255,143,70,16, +255,143,70,16,255,16,12,5,221,0,12,8,7,3,136,114,56,13,255,143, +70,16,255,143,70,16,255,20,13,5,170,0,8,9,7,4,85,114,56,13, +255,145,74,16,255,145,74,16,255,17,11,6,252,0,24,10,8,5,170,119, +61,14,255,145,74,16,255,143,70,16,255,18,13,5,170,0,8,9,7,4, +85,114,56,13,255,143,70,16,255,143,70,16,255,33,20,8,255,5,4,4, +195,8,6,5,198,46,26,9,255,126,62,15,255,132,67,15,255,35,22,8, +255,9,7,4,93,0,12,10,8,5,93,114,56,13,255,143,70,16,255,143, +70,16,255,20,13,5,170,0,8,9,7,4,85,114,56,13,255,143,70,16, +255,143,70,16,255,20,13,5,170,0,4,9,7,4,125,114,56,13,255,21, +13,6,210,0,4,9,7,4,85,114,56,13,255,143,70,16,255,143,70,16, +255,20,13,5,170,0,8,9,7,4,85,114,56,13,255,143,70,16,255,143, +70,16,255,16,12,5,221,0,12,8,7,3,136,114,56,13,255,143,70,16, +255,143,70,16,255,20,13,5,170,0,8,6,5,3,57,57,31,10,255,145, +77,16,255,143,70,16,255,90,44,13,255,17,12,6,255,12,9,5,255,20, +15,9,255,97,51,20,255,169,87,20,255,161,85,17,255,112,54,15,255,10, +8,5,142,0,8,9,7,4,85,121,60,16,255,174,88,19,255,176,89,19, +255,112,59,17,255,37,23,10,255,26,16,7,255,25,18,8,255,24,15,7, +255,23,16,8,255,18,13,9,198,10,9,7,99,0,16,9,8,6,34,12, +10,7,167,20,14,7,210,21,15,6,255,26,17,7,255,24,16,7,255,26, +17,7,255,70,35,11,255,142,73,17,255,148,76,17,255,152,77,17,255,24, +15,7,170,0,8,13,10,6,96,129,65,18,255,170,87,19,255,170,87,19, +255,24,16,9,255,0,48,5,4,2,76,8,6,3,85,8,6,3,85,8, +6,3,85,7,5,4,85,6,5,3,119,16,11,5,255,129,65,14,255,151, +73,16,255,118,61,15,255,14,10,5,170,0,16,8,7,3,136,114,56,13, +255,143,70,16,255,143,70,16,255,16,12,5,221,0,16,10,8,7,113,109, +67,26,255,184,90,21,255,148,76,17,255,52,28,9,255,8,6,3,198,8, +6,3,88,8,6,3,144,21,15,6,255,130,66,15,255,143,76,16,255,143, +76,16,255,16,12,5,227,0,20,9,8,6,170,67,42,20,255,202,124,31, +255,208,128,33,255,205,106,26,255,104,58,21,255,14,11,7,218,6,5,5, +28,0,16,7,6,4,28,27,17,8,229,102,51,13,255,139,68,16,255,143, +73,16,255,145,74,16,255,71,37,12,255,26,18,9,255,80,50,23,255,204, +122,33,255,208,115,33,255,202,104,25,255,149,78,20,255,52,30,11,255,10, +8,5,85,0,12,14,10,5,170,85,43,12,255,137,73,16,255,77,39,12, +255,14,10,5,227,10,8,5,170,10,8,5,198,46,26,9,255,137,73,16, +255,115,59,14,255,25,16,6,232,8,6,3,31,0,12,6,5,3,28,10, +8,5,119,19,13,6,170,29,19,8,173,26,16,7,210,27,18,8,187,17, +12,6,246,58,30,11,255,151,77,18,255,192,97,21,255,192,97,21,255,24, +16,9,207,0,8,4,4,3,3,25,16,6,235,115,59,14,255,143,73,16, +255,145,77,16,255,108,53,13,255,21,14,6,255,7,6,4,164,10,7,5, +85,8,7,5,147,9,7,4,136,8,6,5,76,0,20,8,6,5,57,58, +33,13,255,188,107,27,255,192,111,31,255,85,51,24,255,18,13,9,187,6, +5,5,20,0,8,11,9,6,156,139,69,18,255,158,83,17,255,148,76,17, +255,23,15,6,170,0,12,9,7,4,85,19,13,6,255,102,51,13,255,128, +66,15,255,81,41,12,255,12,9,5,142,0,108,13,10,8,85,115,60,24, +255,162,75,23,255,121,60,20,255,23,15,8,142,0,60,3,3,2,6,10, +8,5,170,93,48,12,255,123,65,14,255,123,60,14,255,14,10,5,227,3, +3,2,85,12,10,7,170,163,83,24,255,199,99,26,255,193,96,24,255,41, +26,14,227,6,6,5,45,0,24,3,3,2,28,11,8,6,170,106,50,13, +255,129,63,14,255,129,63,14,255,29,18,8,227,6,5,5,31,0,20,13, +10,8,136,144,73,21,255,182,89,21,255,99,55,19,255,14,11,7,187,4, +4,3,3,0,16,9,7,4,113,93,46,12,255,131,66,14,255,121,62,14, +255,16,11,5,170,0,12,7,6,4,28,14,10,5,227,100,50,13,255,110, +59,13,255,103,52,14,255,121,59,18,255,134,69,21,255,32,21,11,255,6, +5,5,198,10,8,7,227,46,28,13,255,104,51,15,255,96,46,13,255,14, +10,5,139,0,44,10,8,7,108,63,37,18,255,176,88,23,255,160,80,21, +255,20,14,9,170,0,8,8,6,5,79,85,41,12,255,131,65,16,255,66, +34,11,255,10,8,5,170,0,144,9,7,4,167,115,56,16,255,165,85,20, +255,112,65,23,255,18,13,9,142,0,60,13,10,8,142,132,68,21,255,162, +80,19,255,141,70,18,255,17,12,6,181,0,12,17,12,6,255,103,54,14, +255,130,66,15,255,31,20,8,255,6,5,3,113,0,32,8,6,3,156,35, +22,8,255,114,58,13,255,110,59,13,255,88,45,11,255,88,42,11,255,92, +47,11,255,104,54,13,255,119,58,14,255,61,32,10,255,10,8,5,224,5, +4,4,20,0,16,11,8,6,85,113,58,22,255,180,90,23,255,140,69,17, +255,123,63,14,255,123,60,14,255,119,56,14,255,120,61,17,255,24,15,9, +167,0,16,12,10,7,133,180,88,27,255,203,107,30,255,199,100,28,255,197, +104,28,255,191,93,28,255,167,78,24,255,132,68,21,255,121,62,18,255,117, +60,18,255,118,57,17,255,108,50,15,255,17,12,6,113,0,12,14,10,5, +227,65,33,10,255,115,59,14,255,115,59,14,255,109,52,14,255,116,57,17, +255,121,59,18,255,139,68,20,255,154,73,19,255,115,62,20,255,33,23,12, +255,9,8,6,71,0,36,2,2,1,8,8,6,3,170,93,50,12,255,125, +64,14,255,123,60,14,255,14,10,5,159,0,12,14,10,5,224,65,33,10, +255,115,59,14,255,115,59,14,255,109,52,14,255,119,61,18,255,129,66,20, +255,148,75,21,255,170,84,21,255,129,67,22,255,37,25,14,255,8,7,5, +57,0,8,5,5,4,23,24,17,9,255,103,54,18,255,132,63,17,255,120, +62,15,255,98,49,13,255,90,45,11,255,94,45,13,255,124,60,17,255,172, +81,21,255,150,78,25,255,44,29,17,255,9,8,6,91,0,24,8,7,3, +102,93,46,12,255,125,64,14,255,121,62,14,255,18,12,5,170,0,28,12, +10,5,227,64,33,11,255,132,66,17,255,158,79,21,255,151,70,22,255,130, +67,21,255,110,53,15,255,108,53,13,255,118,60,13,255,85,43,12,255,21, +14,6,255,7,6,4,57,0,12,14,10,5,227,65,33,10,255,131,65,16, +255,149,72,20,255,133,68,20,255,111,54,16,255,110,53,15,255,138,72,19, +255,163,81,20,255,112,58,19,255,28,20,9,255,8,7,5,57,0,8,9, +7,4,91,96,48,13,255,132,70,15,255,123,60,14,255,14,10,5,161,0, +8,13,10,6,85,148,73,23,255,202,101,27,255,129,67,26,255,18,13,9, +142,0,28,6,5,3,48,17,12,6,227,108,55,13,255,112,55,13,255,35, +22,8,255,9,7,4,57,0,64,32,22,13,255,137,68,22,255,154,73,19, +255,45,26,10,255,8,6,5,144,0,44,8,6,3,68,67,34,10,255,115, +56,16,255,109,52,14,255,16,11,5,147,0,24,5,4,4,11,22,17,11, +227,129,76,28,255,195,95,28,255,186,84,23,255,121,59,18,255,107,51,14, +255,96,46,13,255,90,45,11,255,88,45,11,255,41,24,8,255,12,10,5, +176,0,12,8,6,3,76,88,44,11,255,125,66,14,255,123,60,14,255,18, +12,5,170,0,12,9,7,4,85,92,47,11,255,125,64,14,255,123,60,14, +255,16,11,5,150,0,8,8,6,3,62,88,45,11,255,125,64,14,255,123, +60,14,255,114,58,13,255,93,50,12,255,88,44,11,255,92,47,11,255,104, +54,13,255,119,58,14,255,85,43,12,255,21,15,6,255,7,6,4,51,0, +12,12,10,5,221,61,32,10,255,120,62,15,255,123,61,16,255,109,52,14, +255,96,46,13,255,102,51,13,255,115,59,14,255,123,65,14,255,85,43,12, +255,25,16,6,255,7,6,4,51,0,8,8,6,3,74,88,45,11,255,125, +64,14,255,123,60,14,255,114,58,13,255,93,50,12,255,88,45,11,255,92, +47,11,255,104,52,13,255,118,60,13,255,85,43,12,255,21,15,6,255,7, +5,4,40,0,8,8,6,3,74,88,45,11,255,125,64,14,255,123,60,14, +255,114,58,13,255,93,50,12,255,88,45,11,255,92,43,11,255,93,50,12, +255,93,50,12,255,20,13,5,85,0,8,8,6,3,65,88,45,11,255,125, +64,14,255,121,62,14,255,18,13,5,170,0,36,12,10,5,227,59,31,10, +255,115,62,14,255,114,58,13,255,93,50,12,255,88,44,11,255,88,44,11, +255,104,54,13,255,118,60,13,255,123,60,14,255,123,60,14,255,14,10,5, +150,0,8,8,6,3,65,88,45,11,255,125,66,14,255,123,60,14,255,18, +12,5,170,0,12,9,7,4,85,92,47,11,255,125,66,14,255,123,65,14, +255,14,10,5,150,0,8,8,6,3,65,88,45,11,255,125,66,14,255,123, +65,14,255,14,10,5,159,0,12,14,10,5,221,70,35,11,255,155,74,20, +255,193,89,26,255,185,91,28,255,172,85,27,255,165,80,24,255,155,78,22, +255,132,66,17,255,90,44,13,255,21,15,6,255,7,5,4,40,0,8,8, +6,3,74,88,45,11,255,125,64,14,255,121,62,14,255,19,13,6,176,0, +12,9,6,4,133,93,50,12,255,131,66,14,255,123,65,14,255,14,11,5, +150,0,8,8,6,3,62,88,45,11,255,125,64,14,255,123,60,14,255,118, +56,15,255,120,61,17,255,136,67,21,255,118,57,17,255,96,48,13,255,92, +47,11,255,18,12,5,85,0,8,9,7,4,79,104,51,15,255,140,66,17, +255,135,66,16,255,17,12,6,198,0,20,9,7,4,85,92,47,11,255,125, +66,14,255,123,65,14,255,14,10,5,150,0,8,8,6,3,65,88,45,11, +255,135,66,16,255,136,67,17,255,22,14,7,198,0,12,8,6,3,119,88, +45,11,255,125,64,14,255,123,60,14,255,14,10,5,159,0,12,12,10,5, +210,59,31,10,255,115,62,14,255,118,60,13,255,104,54,13,255,100,50,13, +255,100,50,13,255,114,58,13,255,119,63,14,255,85,43,12,255,21,15,6, +255,7,5,4,40,0,8,8,6,3,74,88,45,11,255,125,66,14,255,123, +60,14,255,18,12,5,170,0,44,12,10,5,227,59,31,10,255,115,62,14, +255,114,58,13,255,100,50,13,255,114,56,13,255,133,66,16,255,160,80,21, +255,176,83,21,255,45,27,12,255,6,5,3,170,0,12,8,6,3,82,88, +45,11,255,125,66,14,255,123,60,14,255,18,12,5,170,0,12,9,7,4, +85,92,47,11,255,131,61,14,255,126,62,15,255,17,11,6,170,0,12,14, +10,5,227,65,33,10,255,115,59,14,255,115,62,14,255,93,50,12,255,88, +44,11,255,92,47,11,255,104,54,13,255,119,58,14,255,85,43,12,255,21, +15,6,255,7,6,4,57,0,24,9,7,4,85,92,47,11,255,125,66,14, +255,123,60,14,255,18,12,5,170,0,24,5,5,4,28,19,13,6,255,84, +42,11,255,115,62,14,255,110,59,13,255,93,50,12,255,84,44,11,255,106, +54,15,255,176,84,23,255,199,100,28,255,188,101,31,255,90,54,25,255,13, +10,8,142,0,24,8,6,3,164,72,37,11,255,131,66,14,255,110,54,13, +255,12,9,5,224,3,3,2,17,0,24,7,6,6,85,30,20,13,255,190, +96,27,255,199,98,24,255,121,69,22,255,13,10,6,190,4,3,3,28,5, +4,2,105,27,17,6,255,114,56,13,255,125,64,14,255,45,26,10,255,8, +7,5,153,0,12,10,7,5,85,96,48,13,255,125,64,14,255,123,60,14, +255,16,11,5,195,0,12,8,6,3,110,92,47,11,255,131,66,14,255,123, +65,14,255,18,13,5,170,0,24,9,7,4,85,92,47,11,255,125,66,14, +255,123,60,14,255,18,12,5,170,0,24,8,7,3,99,93,50,12,255,125, +66,14,255,115,59,14,255,104,54,13,255,88,45,11,255,88,44,11,255,92, +43,11,255,92,43,11,255,92,43,11,255,93,50,12,255,93,50,12,255,20, +13,5,85,0,8,8,6,3,65,88,45,11,255,125,64,14,255,123,60,14, +255,115,62,14,255,93,46,12,255,16,11,5,127,0,28,5,4,4,28,12, +10,5,246,104,54,13,255,115,59,14,255,39,23,8,255,8,6,3,82,0, +12,58,31,9,255,114,58,13,255,119,63,14,255,123,60,14,255,123,65,14, +255,18,12,5,170,0,144,14,10,5,227,59,31,10,255,115,62,14,255,110, +59,13,255,88,44,11,255,80,42,11,255,88,44,11,255,104,54,13,255,115, +59,14,255,123,60,14,255,123,60,14,255,16,11,5,150,0,8,8,6,3, +65,88,44,11,255,125,64,14,255,123,60,14,255,114,58,13,255,93,50,12, +255,88,44,11,255,92,47,11,255,104,54,13,255,119,58,14,255,85,43,12, +255,21,15,6,255,7,6,4,51,0,12,12,9,5,224,63,32,10,255,115, +62,14,255,114,56,13,255,93,50,12,255,88,44,11,255,88,45,11,255,110, +59,13,255,119,61,14,255,85,43,12,255,25,16,6,255,7,6,4,57,0, +12,12,10,5,221,59,31,10,255,115,62,14,255,114,56,13,255,93,50,12, +255,88,44,11,255,92,47,11,255,104,54,13,255,115,59,14,255,123,60,14, +255,121,62,14,255,16,11,5,167,0,12,12,10,5,218,59,31,10,255,115, +62,14,255,110,59,13,255,88,44,11,255,80,42,11,255,88,44,11,255,88, +45,11,255,88,44,11,255,16,11,5,105,0,24,9,7,4,85,92,47,11, +255,125,66,14,255,123,60,14,255,18,12,5,170,0,48,7,5,4,198,93, +50,12,255,125,66,14,255,123,60,14,255,12,10,5,170,0,8,8,6,3, +65,88,45,11,255,125,66,14,255,123,65,14,255,18,12,5,170,0,12,9, +7,4,85,92,47,11,255,125,66,14,255,123,65,14,255,14,10,5,150,0, +8,8,6,3,65,88,45,11,255,125,66,14,255,123,60,14,255,18,13,5, +170,0,20,3,3,2,11,9,7,4,227,100,50,13,255,123,60,14,255,123, +60,14,255,12,10,5,170,0,8,8,6,3,62,88,45,11,255,125,66,14, +255,123,60,14,255,14,10,5,198,0,8,8,6,3,170,35,22,8,255,115, +59,14,255,112,55,13,255,33,21,8,255,8,6,3,37,0,8,8,6,3, +74,88,45,11,255,125,66,14,255,123,65,14,255,14,10,5,150,0,8,8, +6,3,65,88,45,11,255,125,66,14,255,123,65,14,255,14,11,5,147,0, +4,9,7,4,85,92,47,11,255,20,13,5,170,0,4,8,6,3,62,88, +45,11,255,125,66,14,255,123,65,14,255,14,10,5,150,0,8,8,6,3, +65,88,45,11,255,125,66,14,255,123,60,14,255,18,12,5,170,0,12,9, +7,4,85,92,47,11,255,125,66,14,255,123,60,14,255,14,10,5,159,0, +12,12,10,5,210,59,31,10,255,115,59,14,255,118,60,13,255,104,54,13, +255,102,51,13,255,112,53,13,255,122,63,15,255,123,58,14,255,85,43,12, +255,21,15,6,255,7,5,4,45,0,8,8,6,3,85,113,55,16,255,196, +92,23,255,195,96,24,255,25,17,10,255,4,3,3,79,0,64,3,2,2, +28,10,8,5,227,138,71,21,255,177,87,20,255,174,86,21,255,24,16,9, +170,0,8,13,10,8,85,142,73,23,255,195,96,24,255,194,91,23,255,24, +17,11,227,0,44,12,9,5,150,35,22,8,255,80,42,11,255,84,44,11, +255,88,44,11,255,80,42,11,255,88,44,11,255,97,50,12,255,118,60,13, +255,85,43,12,255,21,15,6,255,8,6,3,57,0,16,9,7,4,85,92, +47,11,255,125,66,14,255,123,60,14,255,18,12,5,170,0,16,6,5,5, +28,17,13,8,227,68,34,11,255,115,59,14,255,110,59,13,255,93,50,12, +255,88,44,11,255,92,47,11,255,104,54,13,255,115,59,14,255,123,60,14, +255,123,65,14,255,18,12,5,170,0,24,12,9,7,170,131,69,24,255,191, +90,22,255,136,71,19,255,15,11,6,227,4,3,3,17,0,24,7,6,4, +31,16,11,5,227,104,52,13,255,131,66,14,255,98,49,13,255,10,8,5, +193,3,2,2,68,8,7,5,170,121,66,26,255,195,96,24,255,156,74,19, +255,34,21,9,255,9,7,4,85,0,12,8,6,3,51,69,35,10,255,121, +62,14,255,123,60,14,255,16,11,5,227,4,3,3,28,0,8,8,6,3, +170,92,47,11,255,125,64,14,255,108,55,13,255,14,10,5,164,0,40,7, +5,4,198,96,48,13,255,134,65,15,255,133,66,16,255,15,11,6,170,0, +8,7,5,4,85,78,39,11,255,130,64,15,255,130,64,15,255,134,65,15, +255,136,67,17,255,124,62,17,255,114,56,17,255,113,55,16,255,118,60,17, +255,107,55,20,255,48,29,15,255,12,10,7,85,0,20,9,8,6,170,45, +27,12,255,139,70,20,255,131,66,18,255,107,53,14,255,19,13,6,99,0, +8,8,6,5,85,92,46,13,255,131,61,14,255,125,64,14,255,14,10,5, +170,0,12,58,31,9,255,110,59,13,255,115,59,14,255,56,29,9,255,10, +8,5,227,5,4,4,23,0,108,10,8,7,28,28,18,11,212,49,28,16, +255,35,21,12,241,13,10,6,85,0,68,14,10,5,142,20,14,5,170,16, +12,5,164,8,6,3,28,0,8,24,16,9,142,21,15,8,252,23,15,8, +184,11,8,6,34,0,36,14,10,5,142,20,14,5,170,16,11,5,170,10, +8,5,28,0,24,7,6,4,25,20,13,7,147,22,15,7,170,10,8,5, +142,5,4,4,3,0,24,14,10,5,142,20,13,5,170,16,11,5,170,9, +7,4,28,0,16,7,5,4,28,14,10,5,156,14,10,5,229,24,15,9, +255,32,20,11,255,28,18,11,244,12,9,7,108,0,8,10,8,5,142,19, +13,8,235,24,15,7,227,10,8,5,59,0,48,10,8,5,93,23,15,8, +170,28,18,9,173,15,11,6,28,0,12,18,12,5,142,21,14,6,170,9, +7,4,133,0,148,8,6,5,113,89,44,14,255,100,51,21,255,13,10,8, +227,6,5,5,28,0,60,6,5,5,8,17,12,6,142,26,16,7,170,18, +12,5,170,9,7,4,28,0,8,6,5,3,85,54,28,11,255,136,66,19, +255,121,59,18,255,15,10,6,241,0,40,8,6,3,57,12,9,5,170,18, +13,5,178,14,10,5,241,14,10,5,255,14,10,5,252,16,11,5,195,16, +11,5,170,8,6,3,113,0,24,8,6,5,28,24,16,9,204,24,17,9, +255,17,12,6,210,14,10,5,170,16,11,5,170,17,11,6,246,27,17,10, +246,14,10,7,85,0,16,8,6,5,28,21,14,10,195,22,15,11,255,18, +13,9,255,18,13,9,255,22,15,9,255,19,13,8,255,17,12,6,255,17, +11,6,255,15,11,6,255,17,12,6,255,19,13,6,204,12,9,5,28,0, +12,5,4,2,25,8,6,3,122,14,10,5,170,18,13,5,176,14,10,5, +235,15,11,6,255,15,11,6,255,19,12,6,204,19,13,6,170,10,8,5, +170,8,6,5,57,0,48,14,10,5,142,21,13,6,170,16,11,5,170,9, +7,4,28,0,12,5,4,2,25,8,6,3,125,14,10,5,170,14,10,5, +210,23,15,8,255,30,20,11,255,30,20,11,255,23,17,10,255,20,14,9, +244,16,12,9,170,9,8,6,79,0,16,9,7,6,65,15,11,8,170,17, +12,8,232,21,14,8,255,26,16,9,255,23,15,8,255,21,14,8,255,15, +11,6,255,22,15,7,178,11,9,6,170,10,8,7,57,0,32,12,10,5, +142,20,13,5,170,16,11,5,170,9,7,4,28,0,28,5,5,4,28,8, +6,3,133,15,11,6,193,20,15,9,255,28,18,11,255,30,20,11,255,26, +16,9,255,14,10,5,238,16,11,5,170,9,7,4,153,7,5,4,57,0, +16,5,4,2,28,8,6,3,142,18,12,7,207,22,15,9,255,28,18,11, +255,27,18,10,255,18,13,7,255,15,11,6,227,21,13,6,170,10,7,5, +164,7,6,4,57,0,16,14,10,5,142,20,13,5,170,16,12,5,170,9, +7,4,28,0,8,10,8,7,119,149,64,26,255,131,63,26,255,14,11,7, +227,6,5,5,28,0,32,7,5,4,28,14,10,5,156,20,13,5,170,12, +9,5,142,6,5,3,6,0,64,12,10,7,142,24,15,7,170,21,13,6, +170,8,6,3,76,0,48,9,7,6,85,83,43,16,255,176,88,23,255,130, +62,21,255,16,11,7,170,0,28,9,8,6,28,13,10,8,164,23,16,10, +190,16,11,7,252,15,11,6,255,14,10,5,255,14,10,5,255,14,10,5, +255,16,11,5,232,14,10,5,170,8,6,3,85,0,16,14,10,5,142,21, +13,6,170,16,11,5,170,9,7,4,28,0,16,14,10,5,142,20,13,5, +170,16,11,5,170,9,7,4,28,0,12,14,10,5,136,16,12,5,170,16, +11,5,170,18,12,5,170,16,11,5,210,14,10,5,255,14,10,5,249,16, +12,5,193,16,11,5,170,9,7,4,153,7,5,4,57,0,16,5,5,4, +28,8,6,3,125,14,10,5,170,18,12,5,176,14,10,5,238,14,10,5, +246,16,12,5,195,18,13,5,170,16,11,5,170,9,7,4,150,7,5,4, +54,0,16,14,10,5,142,16,12,5,170,16,11,5,170,18,12,5,170,16, +11,5,210,14,10,5,255,14,10,5,249,16,12,5,193,16,11,5,170,9, +7,4,153,7,6,4,57,0,16,14,10,5,142,16,12,5,170,16,11,5, +170,18,12,5,170,16,11,5,210,14,10,5,252,12,9,5,255,16,11,5, +255,20,13,5,201,11,9,4,28,0,12,14,10,5,139,20,13,5,170,16, +11,5,170,9,7,4,28,0,36,5,5,4,28,8,6,3,125,14,10,5, +170,18,13,5,176,14,10,5,238,14,10,5,255,16,11,5,235,18,13,5, +173,16,11,5,170,16,12,5,170,16,11,5,164,9,7,4,28,0,12,12, +9,5,142,21,13,6,170,16,11,5,170,9,7,4,28,0,16,14,10,5, +142,20,13,5,170,16,11,5,170,9,7,4,28,0,12,12,9,5,142,21, +13,6,170,16,11,5,170,9,7,4,28,0,12,6,5,3,28,8,7,5, +139,19,13,8,193,21,15,10,255,31,21,12,255,32,21,13,255,31,20,12, +255,23,17,10,255,18,12,7,212,10,8,5,159,7,6,4,57,0,16,14, +10,5,142,21,13,6,170,16,11,5,170,9,7,4,28,0,16,14,10,5, +142,21,13,6,170,16,12,5,170,9,7,4,28,0,12,14,10,5,136,16, +12,5,170,16,11,5,170,18,12,5,176,17,12,6,252,21,14,8,255,17, +12,6,255,16,11,5,255,20,13,5,204,11,9,4,28,0,12,14,10,5, +142,21,14,6,170,18,12,5,170,9,8,4,28,0,24,14,10,5,142,20, +13,5,170,16,11,5,170,9,7,4,28,0,12,12,9,5,142,21,13,6, +170,16,12,5,170,10,8,5,28,0,16,12,9,5,142,20,13,5,170,16, +11,5,170,9,7,4,28,0,12,5,5,4,28,8,6,3,125,14,10,5, +170,18,12,5,170,20,14,5,173,16,12,5,193,20,13,5,178,20,13,5, +170,16,11,5,170,9,7,4,153,7,6,4,57,0,16,14,10,5,142,21, +13,6,170,16,11,5,170,9,7,4,28,0,44,5,5,4,28,8,6,3, +125,14,10,5,170,18,13,5,170,20,14,5,170,18,12,5,170,13,10,6, +227,72,38,19,255,185,86,32,255,144,64,29,255,20,15,11,232,8,7,7, +28,0,12,14,10,5,142,21,13,6,170,16,11,5,170,9,7,4,28,0, +16,14,10,5,142,20,13,5,170,16,11,5,170,9,7,4,28,0,12,5, +4,2,25,8,6,3,122,14,10,5,170,18,13,5,176,14,10,5,238,14, +10,5,255,14,10,5,249,16,12,5,193,16,11,5,170,9,7,4,153,7, +5,4,57,0,32,14,10,5,142,21,13,6,170,16,11,5,170,9,7,4, +28,0,28,8,6,3,57,9,7,4,164,14,10,5,170,18,13,5,173,14, +10,5,229,14,10,5,255,17,12,6,255,22,15,9,255,20,14,9,252,21, +15,10,176,11,9,6,139,0,32,11,8,4,122,18,12,5,170,14,10,5, +150,7,5,4,28,0,32,8,7,7,57,24,16,11,173,26,18,9,190,13, +10,6,142,5,4,4,11,0,8,8,7,3,68,14,10,5,170,16,11,5, +170,9,7,4,74,0,20,14,10,5,142,20,14,5,170,16,11,5,170,9, +7,4,28,0,16,14,10,5,142,20,14,5,170,16,11,5,170,9,8,4, +28,0,28,14,10,5,142,20,13,5,170,16,11,5,170,9,7,4,28,0, +28,14,10,5,142,18,13,5,170,16,12,5,170,18,13,5,173,14,10,5, +227,14,10,5,255,14,10,5,252,12,9,5,255,12,9,5,255,16,11,5, +255,20,13,5,201,11,9,4,28,0,12,12,10,5,136,16,12,5,170,16, +11,5,170,16,11,5,193,21,15,6,184,14,10,5,31,0,32,8,6,3, +139,54,30,9,255,107,50,12,255,78,39,11,255,9,7,4,161,0,12,20, +13,5,142,18,12,5,210,16,11,5,170,16,11,5,170,16,11,5,170,9, +7,4,28,0,64,13,10,8,57,9,7,6,159,8,6,5,159,10,8,7, +130,10,8,7,119,9,7,6,133,9,7,6,167,10,8,7,170,11,9,8, +113,0,44,5,4,2,28,8,6,3,125,14,10,5,170,18,13,5,176,14, +10,5,238,14,10,5,255,16,11,5,235,18,13,5,173,16,11,5,170,16, +12,5,170,16,11,5,164,9,7,4,28,0,12,14,10,5,136,16,12,5, +170,16,11,5,170,18,12,5,170,16,11,5,210,14,10,5,255,14,10,5, +249,16,12,5,193,16,11,5,170,9,7,4,153,7,5,4,57,0,16,5, +5,4,28,8,6,3,125,14,10,5,170,18,13,5,176,14,10,5,238,14, +10,5,255,14,10,5,249,16,11,5,193,16,11,5,170,9,7,4,150,7, +5,4,57,0,16,5,5,4,28,8,6,3,125,14,10,5,170,18,13,5, +176,14,10,5,238,14,10,5,255,14,10,5,235,18,13,5,173,16,11,5, +170,16,12,5,170,16,11,5,170,9,7,4,28,0,12,5,5,4,28,8, +6,3,125,14,10,5,170,18,13,5,176,14,10,5,235,14,10,5,255,14, +10,5,255,16,11,5,255,20,13,5,207,12,9,5,34,0,28,14,10,5, +142,20,13,5,170,16,11,5,170,9,7,4,28,0,28,6,5,3,85,7, +5,4,85,6,5,3,85,5,4,4,85,5,4,4,105,9,8,4,241,72, +37,11,255,110,54,13,255,67,34,10,255,8,6,3,144,0,12,14,10,5, +142,21,14,6,170,16,12,5,170,9,8,4,28,0,16,14,10,5,142,21, +13,6,170,16,11,5,170,9,7,4,28,0,12,12,9,5,142,21,13,6, +170,16,11,5,170,9,7,4,28,0,12,7,5,2,37,8,6,3,142,8, +6,3,227,25,15,6,255,75,36,10,255,99,51,12,255,66,33,9,255,8, +6,3,130,0,12,14,10,5,139,21,13,6,170,16,11,5,170,9,7,4, +28,0,12,8,6,3,79,14,10,5,170,18,13,5,170,12,9,5,142,0, +16,14,10,5,142,21,13,6,170,16,11,5,170,9,7,4,28,0,12,12, +9,5,142,21,13,6,170,16,11,5,170,9,7,4,28,0,8,20,13,5, +85,11,8,4,28,0,8,12,9,5,142,21,13,6,170,16,11,5,170,9, +7,4,28,0,12,12,9,5,142,21,13,6,170,16,11,5,170,9,7,4, +28,0,16,14,10,5,142,20,13,5,170,16,11,5,170,9,7,4,28,0, +12,5,5,4,28,8,6,3,125,14,10,5,170,18,12,5,170,20,14,5, +173,16,12,5,193,20,13,5,178,20,13,5,170,16,11,5,170,9,7,4, +161,7,6,4,57,0,12,8,6,3,85,84,40,13,255,164,73,23,255,184, +79,27,255,15,11,8,246,0,72,11,10,10,170,176,83,37,255,196,87,33, +255,192,88,31,255,22,15,11,193,0,12,21,15,10,159,26,17,11,255,24, +17,11,221,10,8,7,85,0,44,8,7,3,59,12,9,5,170,16,11,5, +210,14,10,5,255,14,10,5,255,14,10,5,255,14,10,5,246,16,12,5, +193,16,11,5,170,9,7,4,153,6,5,3,57,0,24,14,10,5,142,20, +13,5,170,16,11,5,170,9,7,4,28,0,20,6,5,3,28,8,6,3, +127,14,10,5,170,18,13,5,176,14,10,5,238,14,10,5,255,14,10,5, +235,18,13,5,173,16,11,5,170,16,12,5,170,16,11,5,170,9,7,4, +28,0,28,14,11,7,142,29,19,8,170,17,11,6,159,8,6,3,28,0, +32,7,5,4,28,14,10,5,150,20,13,5,170,12,9,5,142,5,4,2, +14,0,8,15,11,8,142,26,18,9,178,19,13,6,170,8,6,3,68,0, +20,18,12,5,142,16,11,5,238,16,11,5,170,9,7,4,28,0,16,12, +9,5,142,16,11,5,215,18,13,5,187,11,9,4,28,0,16,4,4,3, +6,5,4,2,82,5,4,2,85,5,4,2,85,5,4,2,85,5,4,2, +99,9,7,4,241,72,37,11,255,112,53,13,255,77,39,12,255,10,8,5, +170,0,12,19,13,8,184,20,14,9,255,16,11,7,255,14,11,7,255,17, +12,8,255,22,15,9,255,27,17,10,255,30,19,11,255,28,18,11,255,21, +15,10,255,15,12,8,198,9,7,6,28,0,24,8,6,5,91,15,11,6, +170,14,11,5,238,19,13,6,198,12,9,5,28,0,8,6,5,3,85,54, +29,9,255,100,48,13,255,109,52,14,255,15,11,6,170,0,12,19,13,6, +144,14,10,5,255,16,11,5,178,8,6,3,119,0,255,0,255,0,174,12, +9,7,88,99,44,20,255,26,16,11,232,5,4,4,28,0,92,6,5,3, +57,60,28,11,255,158,67,23,255,88,44,23,255,11,9,6,142,0,255,0, +255,0,150,12,9,7,110,126,51,25,255,25,17,12,232,5,4,4,28,0, +184,6,5,5,28,19,14,10,227,52,29,17,255,30,20,13,255,9,8,6, +82,0,255,0,255,0,255,0,255,0,8,12,10,9,170,172,81,49,255,213, +125,94,255,185,88,58,255,23,16,14,159,0,255,0,255,0,106,5,4,2, +28,16,11,5,244,68,34,9,255,62,33,9,255,9,8,4,139,0,96,10, +8,7,48,71,33,18,255,108,47,23,255,107,48,22,255,113,51,24,255,109, +50,24,255,104,45,21,255,104,45,21,255,113,49,24,255,115,50,24,255,18, +13,9,136,0,255,0,129,9,7,6,34,18,13,9,244,66,31,15,255,84, +37,17,255,83,36,16,255,75,34,14,255,73,35,14,255,91,41,16,255,110, +47,19,255,79,40,16,255,24,16,9,255,8,6,5,57,0,100,22,14,5, +244,40,23,7,255,42,23,7,255,54,28,9,255,60,31,9,255,36,22,7, +255,12,9,5,244,6,5,3,28,0,255,0,29,9,7,6,85,72,34,13, +255,126,56,21,255,148,63,25,255,25,17,14,190,0,72,15,12,12,133,178, +86,57,255,200,89,55,255,194,82,47,255,30,20,17,187,0,255,0,169,9, +7,4,99,17,12,6,255,42,22,9,255,49,25,9,255,54,26,11,255,52, +26,11,255,59,28,12,255,82,37,15,255,111,49,18,255,84,39,17,255,25, +17,10,255,8,7,5,57,0,112,6,5,3,57,38,22,7,255,85,39,12, +255,124,52,21,255,20,13,9,170,0,255,0,255,0,202,8,6,5,28,26, +16,11,170,11,8,6,85,0,100,12,8,5,119,20,14,9,170,12,9,7, +142,0,255,0,255,0,154,9,7,6,28,27,17,12,170,11,9,8,85,0, +192,7,6,6,28,8,7,5,85,8,6,5,57,0,255,0,255,0,255,0, +255,0,16,25,17,16,161,41,27,26,255,40,26,23,235,14,12,11,82,0, +255,0,255,0,110,8,6,3,37,9,7,4,142,9,7,4,136,6,5,3, +6,0,100,23,15,10,153,19,13,10,255,16,11,9,255,16,11,9,255,16, +11,9,255,16,11,9,255,16,11,9,255,18,13,9,255,24,16,11,204,16, +11,9,31,0,255,0,133,10,8,7,142,18,12,9,207,18,13,9,255,16, +11,9,255,15,11,8,255,15,11,8,252,18,13,9,195,18,12,9,170,11, +8,6,167,8,7,5,57,0,104,9,8,4,142,14,10,5,170,13,10,6, +170,13,9,6,170,11,8,6,170,7,6,4,130,6,5,3,28,0,255,0, +37,14,10,7,142,21,14,10,170,19,13,10,170,14,11,9,31,0,72,8, +7,8,14,25,17,16,142,27,18,16,193,26,18,15,170,15,11,10,34,0, +255,0,169,9,7,4,28,11,8,6,170,14,10,7,232,15,10,8,255,15, +10,8,255,15,10,8,255,15,10,8,252,18,12,9,195,18,12,9,170,11, +8,6,167,9,7,6,57,0,120,9,7,4,91,16,11,7,170,20,13,9, +170,13,10,8,28,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0, +255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0, +255,0,255,0,255}}; + /* Created by MiniCompress.. an iOS RLE compressor. + * Compress Rate : 46.36 % + */ diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/gfontrle.h kodi-visualization-goom-2.1.0/lib/goom/src/gfontrle.h --- kodi-visualization-goom-1.1.0/lib/goom/src/gfontrle.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/gfontrle.h 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,7 @@ +extern const struct { + unsigned int width; + unsigned int height; + unsigned int bytes_per_pixel; + unsigned int rle_size; + unsigned char rle_pixel [49725]; +} the_font ; diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/goom_config.h kodi-visualization-goom-2.1.0/lib/goom/src/goom_config.h --- kodi-visualization-goom-1.1.0/lib/goom/src/goom_config.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/goom_config.h 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,28 @@ +#if WORDS_BIGENDIAN +#define COLOR_ARGB +#else +#define COLOR_BGRA +#endif + +#if 1 +/* ndef COLOR_BGRA */ +/** position des composantes **/ + #define BLEU 2 + #define VERT 1 + #define ROUGE 0 + #define ALPHA 3 +#else + #define ROUGE 1 + #define BLEU 3 + #define VERT 2 + #define ALPHA 0 +#endif + +#ifndef guint32 +#define guint8 unsigned char +#define guin16 unsigned short +#define guint32 unsigned int +#define gint8 signed char +#define gint16 signed short int +#define gint32 signed int +#endif diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/goom_config_param.h kodi-visualization-goom-2.1.0/lib/goom/src/goom_config_param.h --- kodi-visualization-goom-1.1.0/lib/goom/src/goom_config_param.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/goom_config_param.h 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,115 @@ +#ifndef _CONFIG_PARAM_H +#define _CONFIG_PARAM_H + +#include + +/** + * File created on 2003-05-24 by Jeko. + * (c)2003, JC Hoelt for iOS-software. + * + * LGPL Licence. + */ + +typedef enum { + PARAM_INTVAL, + PARAM_FLOATVAL, + PARAM_BOOLVAL, + PARAM_STRVAL, + PARAM_LISTVAL, +} ParamType; + +struct IntVal { + int value; + int min; + int max; + int step; +}; +struct FloatVal { + float value; + float min; + float max; + float step; +}; +struct StrVal { + char *value; +}; +struct ListVal { + char *value; + int nbChoices; + char **choices; +}; +struct BoolVal { + int value; +}; + + +typedef struct _PARAM { + char *name; + char *desc; + char rw; + ParamType type; + union { + struct IntVal ival; + struct FloatVal fval; + struct StrVal sval; + struct ListVal slist; + struct BoolVal bval; + } param; + + /* used by the core to inform the GUI of a change */ + void (*change_listener)(struct _PARAM *_this); + + /* used by the GUI to inform the core of a change */ + void (*changed)(struct _PARAM *_this); + + void *user_data; /* can be used by the GUI */ +} PluginParam; + +#define IVAL(p) ((p).param.ival.value) +#define SVAL(p) ((p).param.sval.value) +#define FVAL(p) ((p).param.fval.value) +#define BVAL(p) ((p).param.bval.value) +#define LVAL(p) ((p).param.slist.value) + +#define FMIN(p) ((p).param.fval.min) +#define FMAX(p) ((p).param.fval.max) +#define FSTEP(p) ((p).param.fval.step) + +#define IMIN(p) ((p).param.ival.min) +#define IMAX(p) ((p).param.ival.max) +#define ISTEP(p) ((p).param.ival.step) + +PluginParam goom_secure_param(void); + +PluginParam goom_secure_f_param(char *name); +PluginParam goom_secure_i_param(char *name); +PluginParam goom_secure_b_param(char *name, int value); +PluginParam goom_secure_s_param(char *name); + +PluginParam goom_secure_f_feedback(char *name); +PluginParam goom_secure_i_feedback(char *name); + +void goom_set_str_param_value(PluginParam *p, const char *str); +void goom_set_list_param_value(PluginParam *p, const char *str); + +typedef struct _PARAMETERS { + char *name; + char *desc; + int nbParams; + PluginParam **params; +} PluginParameters; + +PluginParameters goom_plugin_parameters(const char *name, int nb); + +#define secure_param goom_secure_param +#define secure_f_param goom_secure_f_param +#define secure_i_param goom_secure_i_param +#define secure_b_param goom_secure_b_param +#define secure_s_param goom_secure_s_param +#define secure_f_feedback goom_secure_f_feedback +#define secure_i_feedback goom_secure_i_feedback +#define set_list_param_value goom_set_list_param_value +#define set_str_param_value goom_set_str_param_value +#define plugin_parameters goom_plugin_parameters + +#endif diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/goom_core.c kodi-visualization-goom-2.1.0/lib/goom/src/goom_core.c --- kodi-visualization-goom-1.1.0/lib/goom/src/goom_core.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/goom_core.c 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,923 @@ +/** +* file: goom_core.c + * author: Jean-Christophe Hoelt (which is not so proud of it) + * + * Contains the core of goom's work. + * + * (c)2000-2003, by iOS-software. + */ + +#include +#include +#include +#include +#include + +#include "goom.h" +#include "goom_plugin_info.h" +#include "goom_tools.h" +#include "goom_filters.h" +#include "lines.h" +#include "ifs.h" +#include "tentacle3d.h" +#include "gfontlib.h" + +#include "sound_tester.h" +#include "goom_fx.h" +#include "goomsl.h" + +/* #define VERBOSE */ + +#define STOP_SPEED 128 +/* TODO: put that as variable in PluginInfo */ +#define TIME_BTW_CHG 300 + +static void choose_a_goom_line (PluginInfo *goomInfo, float *param1, float *param2, int *couleur, + int *mode, float *amplitude, int far); + +static void update_message (PluginInfo *goomInfo, const char *message); + +static void init_buffers(PluginInfo *goomInfo, int buffsize) +{ + goomInfo->pixel = (guint32 *) malloc (buffsize * sizeof (guint32) + 128); + bzero (goomInfo->pixel, buffsize * sizeof (guint32) + 128); + goomInfo->back = (guint32 *) malloc (buffsize * sizeof (guint32) + 128); + bzero (goomInfo->back, buffsize * sizeof (guint32) + 128); + goomInfo->conv = (Pixel *) malloc (buffsize * sizeof (guint32) + 128); + bzero (goomInfo->conv, buffsize * sizeof (guint32) + 128); + + goomInfo->outputBuf = goomInfo->conv; + + goomInfo->p1 = (Pixel *) ((1 + ((uintptr_t) (goomInfo->pixel)) / 128) * 128); + goomInfo->p2 = (Pixel *) ((1 + ((uintptr_t) (goomInfo->back)) / 128) * 128); +} + +/************************** +* INIT * +**************************/ +PluginInfo *goom_init (guint32 resx, guint32 resy) +{ + PluginInfo *goomInfo = (PluginInfo*)malloc(sizeof(PluginInfo)); + +#ifdef VERBOSE + printf ("GOOM: init (%d, %d);\n", resx, resy); +#endif + + plugin_info_init(goomInfo,4); + + goomInfo->star_fx = flying_star_create(); + goomInfo->star_fx.init(&goomInfo->star_fx, goomInfo); + + goomInfo->zoomFilter_fx = zoomFilterVisualFXWrapper_create (); + goomInfo->zoomFilter_fx.init(&goomInfo->zoomFilter_fx, goomInfo); + + goomInfo->tentacles_fx = tentacle_fx_create(); + goomInfo->tentacles_fx.init(&goomInfo->tentacles_fx, goomInfo); + + goomInfo->convolve_fx = convolve_create(); + goomInfo->convolve_fx.init(&goomInfo->convolve_fx, goomInfo); + + plugin_info_add_visual (goomInfo, 0, &goomInfo->zoomFilter_fx); + plugin_info_add_visual (goomInfo, 1, &goomInfo->tentacles_fx); + plugin_info_add_visual (goomInfo, 2, &goomInfo->star_fx); + plugin_info_add_visual (goomInfo, 3, &goomInfo->convolve_fx); + + goomInfo->screen.width = resx; + goomInfo->screen.height = resy; + goomInfo->screen.size = resx * resy; + + init_buffers(goomInfo, goomInfo->screen.size); + goomInfo->gRandom = goom_random_init((uintptr_t)goomInfo->pixel); + + goomInfo->cycle = 0; + + goomInfo->ifs_fx = ifs_visualfx_create(); + goomInfo->ifs_fx.init(&goomInfo->ifs_fx, goomInfo); + + goomInfo->gmline1 = goom_lines_init (goomInfo, resx, goomInfo->screen.height, + GML_HLINE, goomInfo->screen.height, GML_BLACK, + GML_CIRCLE, 0.4f * (float) goomInfo->screen.height, GML_VERT); + goomInfo->gmline2 = goom_lines_init (goomInfo, resx, goomInfo->screen.height, + GML_HLINE, 0, GML_BLACK, + GML_CIRCLE, 0.2f * (float) goomInfo->screen.height, GML_RED); + + gfont_load (); + + /* goom_set_main_script(goomInfo, goomInfo->main_script_str); */ + + return goomInfo; +} + + + +void goom_set_resolution (PluginInfo *goomInfo, guint32 resx, guint32 resy) +{ + free (goomInfo->pixel); + free (goomInfo->back); + free (goomInfo->conv); + + goomInfo->screen.width = resx; + goomInfo->screen.height = resy; + goomInfo->screen.size = resx * resy; + + init_buffers(goomInfo, goomInfo->screen.size); + + /* init_ifs (goomInfo, resx, goomInfo->screen.height); */ + goomInfo->ifs_fx.free(&goomInfo->ifs_fx); + goomInfo->ifs_fx.init(&goomInfo->ifs_fx, goomInfo); + + goom_lines_set_res (goomInfo->gmline1, resx, goomInfo->screen.height); + goom_lines_set_res (goomInfo->gmline2, resx, goomInfo->screen.height); +} + +int goom_set_screenbuffer(PluginInfo *goomInfo, void *buffer) +{ + goomInfo->outputBuf = (Pixel*)buffer; + return 1; +} + +/******************************************** +* UPDATE * +******************************************** + +* WARNING: this is a 600 lines function ! (21-11-2003) +*/ +guint32 *goom_update (PluginInfo *goomInfo, + const gint16 data[NUM_AUDIO_SAMPLES][AUDIO_SAMPLE_LEN], + int forceMode, float fps, const char *songTitle, const char *message) +{ + Pixel *return_val; + guint32 pointWidth; + guint32 pointHeight; + int i; + float largfactor; /* elargissement de l'intervalle d'évolution des points */ + Pixel *tmp; + + ZoomFilterData *pzfd; + + /* test if the config has changed, update it if so */ + pointWidth = (goomInfo->screen.width * 2) / 5; + pointHeight = ((goomInfo->screen.height) * 2) / 5; + + /* ! etude du signal ... */ + evaluate_sound (data, &(goomInfo->sound)); + + /* goom_execute_main_script(goomInfo); */ + + /* ! calcul du deplacement des petits points ... */ + largfactor = goomInfo->sound.speedvar / 150.0f + goomInfo->sound.volume / 1.5f; + + if (largfactor > 1.5f) + largfactor = 1.5f; + + goomInfo->update.decay_ifs--; + if (goomInfo->update.decay_ifs > 0) + goomInfo->update.ifs_incr += 2; + if (goomInfo->update.decay_ifs == 0) + goomInfo->update.ifs_incr = 0; + + if (goomInfo->update.recay_ifs) { + goomInfo->update.ifs_incr -= 2; + goomInfo->update.recay_ifs--; + if ((goomInfo->update.recay_ifs == 0)&&(goomInfo->update.ifs_incr<=0)) + goomInfo->update.ifs_incr = 1; + } + + if (goomInfo->update.ifs_incr > 0) + goomInfo->ifs_fx.apply(&goomInfo->ifs_fx, goomInfo->p2, goomInfo->p1, goomInfo); + + if (goomInfo->curGState->drawPoints) { + const int speedvarMult80Plus15 = goomInfo->sound.speedvar*80; + const int speedvarMult50Plus1 = goomInfo->sound.speedvar*50 + 1; + + const float pointWidthDiv2 = pointWidth / 2; + const float pointHeightDiv2 = pointHeight / 2; + const float pointWidthDiv3 = pointWidth / 3; + const float pointHeightDiv3 = pointHeight / 3; + const float yellow_t1 = (pointWidth - 6.0f) * largfactor + 5.0f; + const float yellow_t2 = (pointHeight - 6.0f) * largfactor + 5.0f; + const float black_t1 = pointHeightDiv3 * largfactor + 20.0f; + const float black_t2 = black_t1; + const float pointWidthDiv2MultLarge = pointWidthDiv2 * largfactor; + const float pointHeightDiv2MultLarge = pointHeightDiv2 * largfactor; + const float pointWidthDiv3MultLarge = (pointWidthDiv3 + 5.0f) * largfactor; + const float pointHeightDiv3MultLarge = (pointHeightDiv3 + 5.0f) * largfactor; + const float pointWidthMultLarge = pointWidth * largfactor; + const float pointHeightMultLarge = pointHeight * largfactor; + + for (i = 1; i * 15 <= speedvarMult80Plus15; i++) { + goomInfo->update.loopvar += speedvarMult50Plus1; + + const Uint loopvar_div_i = goomInfo->update.loopvar / i; + const float i_mult_10 = 10.0f * i; + + const float yellow_t3 = i * 152.0f; + const float yellow_t4 = 128.0f; + const Uint yellow_cycle = goomInfo->update.loopvar + i * 2032; + const float orange_t1 = pointWidthDiv2MultLarge / i + i_mult_10; + const float orange_t2 = pointHeightDiv2MultLarge / i + i_mult_10; + const float orange_t3 = 96.0f; + const float orange_t4 = i * 80.0f; + const Uint orange_cycle = loopvar_div_i; + const float violet_t1 = pointWidthDiv3MultLarge / i + i_mult_10; + const float violet_t2 = pointHeightDiv3MultLarge / i + i_mult_10; + const float violet_t3 = i + 122.0f; + const float violet_t4 = 134.0f; + const Uint violet_cycle = loopvar_div_i; + const float black_t3 = 58.0f; + const float black_t4 = i * 66.0f; + const Uint black_cycle = loopvar_div_i; + const float white_t1 = (pointWidthMultLarge + i_mult_10) / i; + const float white_t2 = (pointHeightMultLarge + i_mult_10) / i; + const float white_t3 = 66.0f; + const float white_t4 = 74.0f; + const Uint white_cycle = goomInfo->update.loopvar + i * 500; + + pointFilter(goomInfo, goomInfo->p1, YELLOW, yellow_t1, yellow_t2, yellow_t3, yellow_t4, yellow_cycle); + pointFilter(goomInfo, goomInfo->p1, ORANGE, orange_t1, orange_t2, orange_t3, orange_t4, orange_cycle); + pointFilter(goomInfo, goomInfo->p1, VIOLET, violet_t1, violet_t2, violet_t3, violet_t4, violet_cycle); + pointFilter(goomInfo, goomInfo->p1, BLACK, black_t1, black_t2, black_t3, black_t4, black_cycle); + pointFilter(goomInfo, goomInfo->p1, WHITE, white_t1, white_t2, white_t3, white_t4, white_cycle); + } + } + + /* par défaut pas de changement de zoom */ + pzfd = NULL; + + /* + * Test forceMode + */ +#ifdef VERBOSE + if (forceMode != 0) { + printf ("forcemode = %d\n", forceMode); + } +#endif + + + /* diminuer de 1 le temps de lockage */ + /* note pour ceux qui n'ont pas suivis : le lockvar permet d'empecher un */ + /* changement d'etat du plugin juste apres un autre changement d'etat. oki */ + if (--goomInfo->update.lockvar < 0) + goomInfo->update.lockvar = 0; + + /* on verifie qu'il ne se pas un truc interressant avec le son. */ + if ((goomInfo->sound.timeSinceLastGoom == 0) + || (forceMode > 0) + || (goomInfo->update.cyclesSinceLastChange > TIME_BTW_CHG)) { + + /* changement eventuel de mode */ + if (goom_irand(goomInfo->gRandom,16) == 0) + switch (goom_irand(goomInfo->gRandom,34)) { + case 0: + case 10: + goomInfo->update.zoomFilterData.hypercosEffect = goom_irand(goomInfo->gRandom,2); + case 13: + case 20: + case 21: + goomInfo->update.zoomFilterData.mode = WAVE_MODE; + goomInfo->update.zoomFilterData.reverse = 0; + goomInfo->update.zoomFilterData.waveEffect = (goom_irand(goomInfo->gRandom,3) == 0); + if (goom_irand(goomInfo->gRandom,2)) + goomInfo->update.zoomFilterData.vitesse = (goomInfo->update.zoomFilterData.vitesse + 127) >> 1; + break; + case 1: + case 11: + goomInfo->update.zoomFilterData.mode = CRYSTAL_BALL_MODE; + goomInfo->update.zoomFilterData.waveEffect = 0; + goomInfo->update.zoomFilterData.hypercosEffect = 0; + break; + case 2: + case 12: + goomInfo->update.zoomFilterData.mode = AMULETTE_MODE; + goomInfo->update.zoomFilterData.waveEffect = 0; + goomInfo->update.zoomFilterData.hypercosEffect = 0; + break; + case 3: + goomInfo->update.zoomFilterData.mode = WATER_MODE; + goomInfo->update.zoomFilterData.waveEffect = 0; + goomInfo->update.zoomFilterData.hypercosEffect = 0; + break; + case 4: + case 14: + goomInfo->update.zoomFilterData.mode = SCRUNCH_MODE; + goomInfo->update.zoomFilterData.waveEffect = 0; + goomInfo->update.zoomFilterData.hypercosEffect = 0; + break; + case 5: + case 15: + case 22: + goomInfo->update.zoomFilterData.mode = HYPERCOS1_MODE; + goomInfo->update.zoomFilterData.waveEffect = 0; + goomInfo->update.zoomFilterData.hypercosEffect = (goom_irand(goomInfo->gRandom,3) == 0); + break; + case 6: + case 16: + goomInfo->update.zoomFilterData.mode = HYPERCOS2_MODE; + goomInfo->update.zoomFilterData.waveEffect = 0; + goomInfo->update.zoomFilterData.hypercosEffect = 0; + break; + case 7: + case 17: + goomInfo->update.zoomFilterData.mode = CRYSTAL_BALL_MODE; + goomInfo->update.zoomFilterData.waveEffect = (goom_irand(goomInfo->gRandom,4) == 0); + goomInfo->update.zoomFilterData.hypercosEffect = goom_irand(goomInfo->gRandom,2); + break; + case 8: + case 18: + case 19: + goomInfo->update.zoomFilterData.mode = SCRUNCH_MODE; + goomInfo->update.zoomFilterData.waveEffect = 1; + goomInfo->update.zoomFilterData.hypercosEffect = 1; + break; + case 29: + case 30: + goomInfo->update.zoomFilterData.mode = YONLY_MODE; + break; + case 31: + case 32: + case 33: + goomInfo->update.zoomFilterData.mode = SPEEDWAY_MODE; + break; + default: + goomInfo->update.zoomFilterData.mode = NORMAL_MODE; + goomInfo->update.zoomFilterData.waveEffect = 0; + goomInfo->update.zoomFilterData.hypercosEffect = 0; + } + } + + /* tout ceci ne sera fait qu'en cas de non-blocage */ + if (goomInfo->update.lockvar == 0) { + /* reperage de goom (acceleration forte de l'acceleration du volume) */ + /* -> coup de boost de la vitesse si besoin.. */ + if (goomInfo->sound.timeSinceLastGoom == 0) { + + int i; + goomInfo->update.goomvar++; + + /* SELECTION OF THE GOOM STATE */ + if ((!goomInfo->update.stateSelectionBlocker)&&(goom_irand(goomInfo->gRandom,3))) { + goomInfo->update.stateSelectionRnd = goom_irand(goomInfo->gRandom,goomInfo->statesRangeMax); + goomInfo->update.stateSelectionBlocker = 3; + } + else if (goomInfo->update.stateSelectionBlocker) goomInfo->update.stateSelectionBlocker--; + + for (i=0;istatesNumber;i++) + if ((goomInfo->update.stateSelectionRnd >= goomInfo->states[i].rangemin) + && (goomInfo->update.stateSelectionRnd <= goomInfo->states[i].rangemax)) + goomInfo->curGState = &(goomInfo->states[i]); + + if ((goomInfo->curGState->drawIFS) && (goomInfo->update.ifs_incr<=0)) { + goomInfo->update.recay_ifs = 5; + goomInfo->update.ifs_incr = 11; + } + + if ((!goomInfo->curGState->drawIFS) && (goomInfo->update.ifs_incr>0) && (goomInfo->update.decay_ifs<=0)) + goomInfo->update.decay_ifs = 100; + + if (!goomInfo->curGState->drawScope) + goomInfo->update.stop_lines = 0xf000 & 5; + + if (!goomInfo->curGState->drawScope) { + goomInfo->update.stop_lines = 0; + goomInfo->update.lineMode = goomInfo->update.drawLinesDuration; + } + + /* if (goomInfo->update.goomvar % 1 == 0) */ + { + guint32 vtmp; + guint32 newvit; + + goomInfo->update.lockvar = 50; + newvit = STOP_SPEED + 1 - ((float)3.5f * log10(goomInfo->sound.speedvar * 60 + 1)); + /* retablir le zoom avant.. */ + if ((goomInfo->update.zoomFilterData.reverse) && (!(goomInfo->cycle % 13)) && (rand () % 5 == 0)) { + goomInfo->update.zoomFilterData.reverse = 0; + goomInfo->update.zoomFilterData.vitesse = STOP_SPEED - 2; + goomInfo->update.lockvar = 75; + } + if (goom_irand(goomInfo->gRandom,10) == 0) { + goomInfo->update.zoomFilterData.reverse = 1; + goomInfo->update.lockvar = 100; + } + + if (goom_irand(goomInfo->gRandom,10) == 0) + goomInfo->update.zoomFilterData.vitesse = STOP_SPEED - 1; + if (goom_irand(goomInfo->gRandom,12) == 0) + goomInfo->update.zoomFilterData.vitesse = STOP_SPEED + 1; + + /* changement de milieu.. */ + switch (goom_irand(goomInfo->gRandom,25)) { + case 0: + case 3: + case 6: + goomInfo->update.zoomFilterData.middleY = goomInfo->screen.height - 1; + goomInfo->update.zoomFilterData.middleX = goomInfo->screen.width / 2; + break; + case 1: + case 4: + goomInfo->update.zoomFilterData.middleX = goomInfo->screen.width - 1; + break; + case 2: + case 5: + goomInfo->update.zoomFilterData.middleX = 1; + break; + default: + goomInfo->update.zoomFilterData.middleY = goomInfo->screen.height / 2; + goomInfo->update.zoomFilterData.middleX = goomInfo->screen.width / 2; + } + + if ((goomInfo->update.zoomFilterData.mode == WATER_MODE) + || (goomInfo->update.zoomFilterData.mode == YONLY_MODE) + || (goomInfo->update.zoomFilterData.mode == AMULETTE_MODE)) { + goomInfo->update.zoomFilterData.middleX = goomInfo->screen.width / 2; + goomInfo->update.zoomFilterData.middleY = goomInfo->screen.height / 2; + } + + switch (vtmp = (goom_irand(goomInfo->gRandom,15))) { + case 0: + goomInfo->update.zoomFilterData.vPlaneEffect = goom_irand(goomInfo->gRandom,3) + - goom_irand(goomInfo->gRandom,3); + goomInfo->update.zoomFilterData.hPlaneEffect = goom_irand(goomInfo->gRandom,3) + - goom_irand(goomInfo->gRandom,3); + break; + case 3: + goomInfo->update.zoomFilterData.vPlaneEffect = 0; + goomInfo->update.zoomFilterData.hPlaneEffect = goom_irand(goomInfo->gRandom,8) + - goom_irand(goomInfo->gRandom,8); + break; + case 4: + case 5: + case 6: + case 7: + goomInfo->update.zoomFilterData.vPlaneEffect = goom_irand(goomInfo->gRandom,5) + - goom_irand(goomInfo->gRandom,5); + goomInfo->update.zoomFilterData.hPlaneEffect = -goomInfo->update.zoomFilterData.vPlaneEffect; + break; + case 8: + goomInfo->update.zoomFilterData.hPlaneEffect = 5 + goom_irand(goomInfo->gRandom,8); + goomInfo->update.zoomFilterData.vPlaneEffect = -goomInfo->update.zoomFilterData.hPlaneEffect; + break; + case 9: + goomInfo->update.zoomFilterData.vPlaneEffect = 5 + goom_irand(goomInfo->gRandom,8); + goomInfo->update.zoomFilterData.hPlaneEffect = -goomInfo->update.zoomFilterData.hPlaneEffect; + break; + case 13: + goomInfo->update.zoomFilterData.hPlaneEffect = 0; + goomInfo->update.zoomFilterData.vPlaneEffect = goom_irand(goomInfo->gRandom,10) + - goom_irand(goomInfo->gRandom,10); + break; + case 14: + goomInfo->update.zoomFilterData.hPlaneEffect = goom_irand(goomInfo->gRandom,10) + - goom_irand(goomInfo->gRandom,10); + goomInfo->update.zoomFilterData.vPlaneEffect = goom_irand(goomInfo->gRandom,10) + - goom_irand(goomInfo->gRandom,10); + break; + default: + if (vtmp < 10) { + goomInfo->update.zoomFilterData.vPlaneEffect = 0; + goomInfo->update.zoomFilterData.hPlaneEffect = 0; + } + } + + if (goom_irand(goomInfo->gRandom,5) != 0) + goomInfo->update.zoomFilterData.noisify = 0; + else { + goomInfo->update.zoomFilterData.noisify = goom_irand(goomInfo->gRandom,2) + 1; + goomInfo->update.lockvar *= 2; + } + + if (goomInfo->update.zoomFilterData.mode == AMULETTE_MODE) { + goomInfo->update.zoomFilterData.vPlaneEffect = 0; + goomInfo->update.zoomFilterData.hPlaneEffect = 0; + goomInfo->update.zoomFilterData.noisify = 0; + } + + if ((goomInfo->update.zoomFilterData.middleX == 1) || (goomInfo->update.zoomFilterData.middleX == (signed int)goomInfo->screen.width - 1)) { + goomInfo->update.zoomFilterData.vPlaneEffect = 0; + if (goom_irand(goomInfo->gRandom,2)) + goomInfo->update.zoomFilterData.hPlaneEffect = 0; + } + + if ((signed int)newvit < goomInfo->update.zoomFilterData.vitesse) /* on accelere */ + { + pzfd = &goomInfo->update.zoomFilterData; + if (((newvit < STOP_SPEED - 7) && + (goomInfo->update.zoomFilterData.vitesse < STOP_SPEED - 6) && + (goomInfo->cycle % 3 == 0)) || (goom_irand(goomInfo->gRandom,40) == 0)) { + goomInfo->update.zoomFilterData.vitesse = STOP_SPEED - goom_irand(goomInfo->gRandom,2) + + goom_irand(goomInfo->gRandom,2); + goomInfo->update.zoomFilterData.reverse = !goomInfo->update.zoomFilterData.reverse; + } + else { + goomInfo->update.zoomFilterData.vitesse = (newvit + goomInfo->update.zoomFilterData.vitesse * 7) / 8; + } + goomInfo->update.lockvar += 50; + } + } + + if (goomInfo->update.lockvar > 150) { + goomInfo->update.switchIncr = goomInfo->update.switchIncrAmount; + goomInfo->update.switchMult = 1.0f; + } + } + /* mode mega-lent */ + if (goom_irand(goomInfo->gRandom,700) == 0) { + /* + * printf ("coup du sort...\n") ; + */ + pzfd = &goomInfo->update.zoomFilterData; + goomInfo->update.zoomFilterData.vitesse = STOP_SPEED - 1; + goomInfo->update.zoomFilterData.pertedec = 8; + goomInfo->update.zoomFilterData.sqrtperte = 16; + goomInfo->update.goomvar = 1; + goomInfo->update.lockvar += 50; + goomInfo->update.switchIncr = goomInfo->update.switchIncrAmount; + goomInfo->update.switchMult = 1.0f; + } + } + + /* + * gros frein si la musique est calme + */ + if ((goomInfo->sound.speedvar < 0.01f) + && (goomInfo->update.zoomFilterData.vitesse < STOP_SPEED - 4) + && (goomInfo->cycle % 16 == 0)) { + pzfd = &goomInfo->update.zoomFilterData; + goomInfo->update.zoomFilterData.vitesse += 3; + goomInfo->update.zoomFilterData.pertedec = 8; + goomInfo->update.zoomFilterData.sqrtperte = 16; + goomInfo->update.goomvar = 0; + } + + /* + * baisser regulierement la vitesse... + */ + if ((goomInfo->cycle % 73 == 0) && (goomInfo->update.zoomFilterData.vitesse < STOP_SPEED - 5)) { + pzfd = &goomInfo->update.zoomFilterData; + goomInfo->update.zoomFilterData.vitesse++; + } + + /* + * arreter de decrémenter au bout d'un certain temps + */ + if ((goomInfo->cycle % 101 == 0) && (goomInfo->update.zoomFilterData.pertedec == 7)) { + pzfd = &goomInfo->update.zoomFilterData; + goomInfo->update.zoomFilterData.pertedec = 8; + goomInfo->update.zoomFilterData.sqrtperte = 16; + } + + /* + * Permet de forcer un effet. + */ + if ((forceMode > 0) && (forceMode <= NB_FX)) { + pzfd = &goomInfo->update.zoomFilterData; + pzfd->mode = forceMode - 1; + } + + if (forceMode == -1) { + pzfd = NULL; + } + + /* + * Changement d'effet de zoom ! + */ + if (pzfd != NULL) { + int dif; + + goomInfo->update.cyclesSinceLastChange = 0; + + goomInfo->update.switchIncr = goomInfo->update.switchIncrAmount; + + dif = goomInfo->update.zoomFilterData.vitesse - goomInfo->update.previousZoomSpeed; + if (dif < 0) + dif = -dif; + + if (dif > 2) { + goomInfo->update.switchIncr *= (dif + 2) / 2; + } + goomInfo->update.previousZoomSpeed = goomInfo->update.zoomFilterData.vitesse; + goomInfo->update.switchMult = 1.0f; + + if (((goomInfo->sound.timeSinceLastGoom == 0) + && (goomInfo->sound.totalgoom < 2)) || (forceMode > 0)) { + goomInfo->update.switchIncr = 0; + goomInfo->update.switchMult = goomInfo->update.switchMultAmount; + } + } + else { + if (goomInfo->update.cyclesSinceLastChange > TIME_BTW_CHG) { + pzfd = &goomInfo->update.zoomFilterData; + goomInfo->update.cyclesSinceLastChange = 0; + } + else + goomInfo->update.cyclesSinceLastChange++; + } + +#ifdef VERBOSE + if (pzfd) { + printf ("GOOM: pzfd->mode = %d\n", pzfd->mode); + } +#endif + + /* Zoom here ! */ + zoomFilterFastRGB (goomInfo, goomInfo->p1, goomInfo->p2, pzfd, goomInfo->screen.width, goomInfo->screen.height, + goomInfo->update.switchIncr, goomInfo->update.switchMult); + + /* + * Affichage tentacule + */ + + goomInfo->tentacles_fx.apply(&goomInfo->tentacles_fx, goomInfo->p1, goomInfo->p2, goomInfo); + goomInfo->star_fx.apply (&goomInfo->star_fx,goomInfo->p2,goomInfo->p1,goomInfo); + + /* + * Affichage de texte + */ + { + /*char title[1024];*/ + char text[64]; + + /* + * Le message + */ + update_message (goomInfo, message); + + if (fps > 0) { + sprintf (text, "%2.0f fps", fps); + goom_draw_text (goomInfo->p1,goomInfo->screen.width,goomInfo->screen.height, + 10, 24, text, 1, 0); + } + + /* + * Le titre + */ + if (songTitle != NULL) { + strncpy (goomInfo->update.titleText, songTitle, 1023); + goomInfo->update.titleText[1023]=0; + goomInfo->update.timeOfTitleDisplay = 200; + } + + if (goomInfo->update.timeOfTitleDisplay) { + goom_draw_text (goomInfo->p1,goomInfo->screen.width,goomInfo->screen.height, + goomInfo->screen.width / 2, goomInfo->screen.height / 2 + 7, goomInfo->update.titleText, + ((float) (190 - goomInfo->update.timeOfTitleDisplay) / 10.0f), 1); + goomInfo->update.timeOfTitleDisplay--; + if (goomInfo->update.timeOfTitleDisplay < 4) + goom_draw_text (goomInfo->p2,goomInfo->screen.width,goomInfo->screen.height, + goomInfo->screen.width / 2, goomInfo->screen.height / 2 + 7, goomInfo->update.titleText, + ((float) (190 - goomInfo->update.timeOfTitleDisplay) / 10.0f), 1); + } + } + + /* + * Gestion du Scope + */ + + /* + * arret demande + */ + if ((goomInfo->update.stop_lines & 0xf000)||(!goomInfo->curGState->drawScope)) { + float param1, param2, amplitude; + int couleur; + int mode; + + choose_a_goom_line (goomInfo, ¶m1, ¶m2, &couleur, &mode, &litude,1); + couleur = GML_BLACK; + + goom_lines_switch_to (goomInfo->gmline1, mode, param1, amplitude, couleur); + goom_lines_switch_to (goomInfo->gmline2, mode, param2, amplitude, couleur); + goomInfo->update.stop_lines &= 0x0fff; + } + + /* + * arret aleatore.. changement de mode de ligne.. + */ + if (goomInfo->update.lineMode != goomInfo->update.drawLinesDuration) { + goomInfo->update.lineMode--; + if (goomInfo->update.lineMode == -1) + goomInfo->update.lineMode = 0; + } + else + if ((goomInfo->cycle%80==0)&&(goom_irand(goomInfo->gRandom,5)==0)&&goomInfo->update.lineMode) + goomInfo->update.lineMode--; + + if ((goomInfo->cycle % 120 == 0) + && (goom_irand(goomInfo->gRandom,4) == 0) + && (goomInfo->curGState->drawScope)) { + if (goomInfo->update.lineMode == 0) + goomInfo->update.lineMode = goomInfo->update.drawLinesDuration; + else if (goomInfo->update.lineMode == goomInfo->update.drawLinesDuration) { + float param1, param2, amplitude; + int couleur1,couleur2; + int mode; + + goomInfo->update.lineMode--; + choose_a_goom_line (goomInfo, ¶m1, ¶m2, &couleur1, + &mode, &litude,goomInfo->update.stop_lines); + + couleur2 = 5-couleur1; + if (goomInfo->update.stop_lines) { + goomInfo->update.stop_lines--; + if (goom_irand(goomInfo->gRandom,2)) + couleur2=couleur1 = GML_BLACK; + } + + goom_lines_switch_to (goomInfo->gmline1, mode, param1, amplitude, couleur1); + goom_lines_switch_to (goomInfo->gmline2, mode, param2, amplitude, couleur2); + } + } + + /* + * si on est dans un goom : afficher les lignes... + */ + if ((goomInfo->update.lineMode != 0) || (goomInfo->sound.timeSinceLastGoom < 5)) { + goomInfo->gmline2->power = goomInfo->gmline1->power; + + goom_lines_draw (goomInfo, goomInfo->gmline1, data[0], goomInfo->p2); + goom_lines_draw (goomInfo, goomInfo->gmline2, data[1], goomInfo->p2); + + if (((goomInfo->cycle % 121) == 9) && (goom_irand(goomInfo->gRandom,3) == 1) + && ((goomInfo->update.lineMode == 0) || (goomInfo->update.lineMode == goomInfo->update.drawLinesDuration))) { + float param1, param2, amplitude; + int couleur1,couleur2; + int mode; + + choose_a_goom_line (goomInfo, ¶m1, ¶m2, &couleur1, + &mode, &litude, goomInfo->update.stop_lines); + couleur2 = 5-couleur1; + + if (goomInfo->update.stop_lines) { + goomInfo->update.stop_lines--; + if (goom_irand(goomInfo->gRandom,2)) + couleur2=couleur1 = GML_BLACK; + } + goom_lines_switch_to (goomInfo->gmline1, mode, param1, amplitude, couleur1); + goom_lines_switch_to (goomInfo->gmline2, mode, param2, amplitude, couleur2); + } + } + + return_val = goomInfo->p1; + tmp = goomInfo->p1; + goomInfo->p1 = goomInfo->p2; + goomInfo->p2 = tmp; + + /* affichage et swappage des buffers.. */ + goomInfo->cycle++; + + goomInfo->convolve_fx.apply(&goomInfo->convolve_fx,return_val,goomInfo->outputBuf,goomInfo); + + return (guint32*)goomInfo->outputBuf; +} + +/**************************************** +* CLOSE * +****************************************/ +void goom_close (PluginInfo *goomInfo) +{ + if (goomInfo->pixel != NULL) + free (goomInfo->pixel); + if (goomInfo->back != NULL) + free (goomInfo->back); + if (goomInfo->conv != NULL) + free (goomInfo->conv); + + goomInfo->pixel = goomInfo->back = NULL; + goomInfo->conv = NULL; + goom_random_free(goomInfo->gRandom); + goom_lines_free (&goomInfo->gmline1); + goom_lines_free (&goomInfo->gmline2); + + /* release_ifs (); */ + goomInfo->ifs_fx.free(&goomInfo->ifs_fx); + goomInfo->convolve_fx.free(&goomInfo->convolve_fx); + goomInfo->star_fx.free(&goomInfo->star_fx); + goomInfo->tentacles_fx.free(&goomInfo->tentacles_fx); + goomInfo->zoomFilter_fx.free(&goomInfo->zoomFilter_fx); + + // Release info visual + free (goomInfo->params); + free (goomInfo->sound.params.params); + + // Release PluginInfo + free (goomInfo->visuals); + gsl_free (goomInfo->scanner); + gsl_free (goomInfo->main_scanner); + + free(goomInfo); +} + + +/* *** */ +static void +choose_a_goom_line (PluginInfo *goomInfo, float *param1, float *param2, int *couleur, int *mode, + float *amplitude, int far) +{ + *mode = goom_irand(goomInfo->gRandom,3); + *amplitude = 1.0f; + switch (*mode) { + case GML_CIRCLE: + if (far) { + *param1 = *param2 = 0.47f; + *amplitude = 0.8f; + break; + } + if (goom_irand(goomInfo->gRandom,3) == 0) { + *param1 = *param2 = 0; + *amplitude = 3.0f; + } + else if (goom_irand(goomInfo->gRandom,2)) { + *param1 = 0.40f * goomInfo->screen.height; + *param2 = 0.22f * goomInfo->screen.height; + } + else { + *param1 = *param2 = goomInfo->screen.height * 0.35; + } + break; + case GML_HLINE: + if (goom_irand(goomInfo->gRandom,4) || far) { + *param1 = goomInfo->screen.height / 7; + *param2 = 6.0f * goomInfo->screen.height / 7.0f; + } + else { + *param1 = *param2 = goomInfo->screen.height / 2.0f; + *amplitude = 2.0f; + } + break; + case GML_VLINE: + if (goom_irand(goomInfo->gRandom,3) || far) { + *param1 = goomInfo->screen.width / 7.0f; + *param2 = 6.0f * goomInfo->screen.width / 7.0f; + } + else { + *param1 = *param2 = goomInfo->screen.width / 2.0f; + *amplitude = 1.5f; + } + break; + } + + *couleur = goom_irand(goomInfo->gRandom,6); +} + +#define ECART_VARIATION 1.5 +#define POS_VARIATION 3.0 +#define SCROLLING_SPEED 80 + +/* + * Met a jour l'affichage du message defilant + */ +static void update_message (PluginInfo *goomInfo, const char *message) { + + int fin = 0; + + if (message) { + int i=1,j=0; + strcpy (goomInfo->update_message.message, message); + for (j=0;goomInfo->update_message.message[j];j++) + if (goomInfo->update_message.message[j]=='\n') + i++; + goomInfo->update_message.numberOfLinesInMessage = i; + goomInfo->update_message.affiche = goomInfo->screen.height + goomInfo->update_message.numberOfLinesInMessage * 25 + 105; + goomInfo->update_message.longueur = strlen(goomInfo->update_message.message); + } + if (goomInfo->update_message.affiche) { + int i = 0; + char *msg = malloc(goomInfo->update_message.longueur + 1); + char *ptr = msg; + int pos; + float ecart; + message = msg; + strcpy (msg, goomInfo->update_message.message); + + while (!fin) { + while (1) { + if (*ptr == 0) { + fin = 1; + break; + } + if (*ptr == '\n') { + *ptr = 0; + break; + } + ++ptr; + } + pos = goomInfo->update_message.affiche - (goomInfo->update_message.numberOfLinesInMessage - i)*25; + pos += POS_VARIATION * (cos((double)pos / 20.0)); + pos -= SCROLLING_SPEED; + ecart = (ECART_VARIATION * sin((double)pos / 20.0)); + if ((fin) && (2 * pos < (int)goomInfo->screen.height)) + pos = (int)goomInfo->screen.height / 2; + pos += 7; + + goom_draw_text(goomInfo->p1,goomInfo->screen.width,goomInfo->screen.height, + goomInfo->screen.width/2, pos, + message, + ecart, + 1); + message = ++ptr; + i++; + } + goomInfo->update_message.affiche --; + free (msg); + } +} + diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/goom_filters.h kodi-visualization-goom-2.1.0/lib/goom/src/goom_filters.h --- kodi-visualization-goom-1.1.0/lib/goom/src/goom_filters.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/goom_filters.h 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,52 @@ +#ifndef FILTERS_H +#define FILTERS_H + +#include "goom_config.h" +#include "goom_typedefs.h" +#include "goom_visual_fx.h" +#include "goom_graphic.h" + +VisualFX zoomFilterVisualFXWrapper_create(void); + +struct _ZOOM_FILTER_DATA +{ + int vitesse; /* 128 = vitesse nule... * * 256 = en arriere + * hyper vite.. * * 0 = en avant hype vite. */ + unsigned char pertedec; + unsigned char sqrtperte; + int middleX, middleY; /* milieu de l'effet */ + char reverse; /* inverse la vitesse */ + char mode; /* type d'effet appliquer (cf les #define) */ + /** @since June 2001 */ + int hPlaneEffect; /* deviation horitontale */ + int vPlaneEffect; /* deviation verticale */ + /** @since April 2002 */ + int waveEffect; /* applique une "surcouche" de wave effect */ + int hypercosEffect; /* applique une "surcouche de hypercos effect */ + + char noisify; /* ajoute un bruit a la transformation */ +}; + +#define NORMAL_MODE 0 +#define WAVE_MODE 1 +#define CRYSTAL_BALL_MODE 2 +#define SCRUNCH_MODE 3 +#define AMULETTE_MODE 4 +#define WATER_MODE 5 +#define HYPERCOS1_MODE 6 +#define HYPERCOS2_MODE 7 +#define YONLY_MODE 8 +#define SPEEDWAY_MODE 9 + +void pointFilter (PluginInfo *goomInfo, Pixel * pix1, Color c, + float t1, float t2, float t3, float t4, guint32 cycle); + +/* filtre de zoom : + * le contenu de pix1 est copie dans pix2. + * zf : si non NULL, configure l'effet. + * resx,resy : taille des buffers. + */ +void zoomFilterFastRGB (PluginInfo *goomInfo, Pixel * pix1, Pixel * pix2, ZoomFilterData * zf, guint32 resx, + guint32 resy, int switchIncr, float switchMult); + +#endif diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/goom_fx.h kodi-visualization-goom-2.1.0/lib/goom/src/goom_fx.h --- kodi-visualization-goom-1.1.0/lib/goom/src/goom_fx.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/goom_fx.h 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,12 @@ +#ifndef _GOOM_FX_H +#define _GOOM_FX_H + +#include "goom_visual_fx.h" +#include "goom_plugin_info.h" + +VisualFX convolve_create (); +VisualFX flying_star_create (void); + +void zoom_filter_c(int sizeX, int sizeY, Pixel *src, Pixel *dest, int *brutS, int *brutD, int buffratio, int precalCoef[16][16]); + +#endif diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/goom_graphic.h kodi-visualization-goom-2.1.0/lib/goom/src/goom_graphic.h --- kodi-visualization-goom-1.1.0/lib/goom/src/goom_graphic.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/goom_graphic.h 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,74 @@ +#ifndef GRAPHIC_H +#define GRAPHIC_H + +typedef unsigned int Uint; + +typedef struct +{ + unsigned short r, v, b; +} +Color; + +extern const Color BLACK; +extern const Color WHITE; +extern const Color RED; +extern const Color BLUE; +extern const Color GREEN; +extern const Color YELLOW; +extern const Color ORANGE; +extern const Color VIOLET; + + +#ifdef COLOR_BGRA + +#define R_CHANNEL 0xFF000000 +#define G_CHANNEL 0x00FF0000 +#define B_CHANNEL 0x0000FF00 +#define A_CHANNEL 0x000000FF +#define R_OFFSET 24 +#define G_OFFSET 16 +#define B_OFFSET 8 +#define A_OFFSET 0 + +typedef union _PIXEL { + struct { + unsigned char r; + unsigned char g; + unsigned char b; + unsigned char a; + } channels; + unsigned int val; + unsigned char cop[4]; +} Pixel; + +#else + +#define A_CHANNEL 0xFF000000 +#define R_CHANNEL 0x00FF0000 +#define G_CHANNEL 0x0000FF00 +#define B_CHANNEL 0x000000FF +#define A_OFFSET 24 +#define R_OFFSET 16 +#define G_OFFSET 8 +#define B_OFFSET 0 + +typedef union _PIXEL { + struct { + unsigned char a; + unsigned char r; + unsigned char g; + unsigned char b; + } channels; + unsigned int val; + unsigned char cop[4]; +} Pixel; + +#endif /* COLOR_BGRA */ + +/* +inline void setPixelRGB (Pixel * buffer, Uint x, Uint y, Color c); +inline void getPixelRGB (Pixel * buffer, Uint x, Uint y, Color * c); +*/ + + +#endif /* GRAPHIC_H */ diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/goom.h kodi-visualization-goom-2.1.0/lib/goom/src/goom.h --- kodi-visualization-goom-1.1.0/lib/goom/src/goom.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/goom.h 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,34 @@ +#ifndef _GOOM_H +#define _GOOM_H + +#define NUM_AUDIO_SAMPLES 2 +#define AUDIO_SAMPLE_LEN 512 + +#include "goom_config.h" +#include "goom_plugin_info.h" +#include "goomsl.h" + +#define NB_FX 10 + +PluginInfo *goom_init (guint32 resx, guint32 resy); +void goom_set_resolution (PluginInfo *goomInfo, guint32 resx, guint32 resy); + +/* + * forceMode == 0 : do nothing + * forceMode == -1 : lock the FX + * forceMode == 1..NB_FX : force a switch to FX n# forceMode + * + * songTitle = pointer to the title of the song... + * - NULL if it is not the start of the song + * - only have a value at the start of the song + */ +guint32 *goom_update (PluginInfo *goomInfo, + const gint16 data[NUM_AUDIO_SAMPLES][AUDIO_SAMPLE_LEN], + int forceMode, float fps, const char *songTitle, const char *message); + +/* returns 0 if the buffer wasn't accepted */ +int goom_set_screenbuffer(PluginInfo *goomInfo, void *buffer); + +void goom_close (PluginInfo *goomInfo); + +#endif diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/goom_hash.c kodi-visualization-goom-2.1.0/lib/goom/src/goom_hash.c --- kodi-visualization-goom-1.1.0/lib/goom/src/goom_hash.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/goom_hash.c 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,100 @@ +#include "goom_hash.h" +#include +#include + +static GoomHashEntry *entry_new(const char *key, HashValue value) { + + GoomHashEntry *entry = (GoomHashEntry*)malloc(sizeof(GoomHashEntry)); + + entry->key = (char *)malloc(strlen(key)+1); + strcpy(entry->key,key); + entry->value = value; + entry->lower = NULL; + entry->upper = NULL; + + return entry; +} + +static void entry_free(GoomHashEntry *entry) { + if (entry!=NULL) { + entry_free(entry->lower); + entry_free(entry->upper); + free(entry->key); + free(entry); + } +} + +static void entry_put(GoomHashEntry *entry, const char *key, HashValue value) { + int cmp = strcmp(key,entry->key); + if (cmp==0) { + entry->value = value; + } + else if (cmp > 0) { + if (entry->upper == NULL) + entry->upper = entry_new(key,value); + else + entry_put(entry->upper, key, value); + } + else { + if (entry->lower == NULL) + entry->lower = entry_new(key,value); + else + entry_put(entry->lower, key, value); + } +} + +static HashValue *entry_get(GoomHashEntry *entry, const char *key) { + + int cmp; + if (entry==NULL) + return NULL; + cmp = strcmp(key,entry->key); + if (cmp > 0) + return entry_get(entry->upper, key); + else if (cmp < 0) + return entry_get(entry->lower, key); + else + return &(entry->value); +} + +GoomHash *goom_hash_new(void) { + GoomHash *_this = (GoomHash*)malloc(sizeof(GoomHash)); + _this->root = NULL; + return _this; +} + +void goom_hash_free(GoomHash *_this) { + entry_free(_this->root); + free(_this); +} + +void goom_hash_put(GoomHash *_this, const char *key, HashValue value) { + if (_this->root == NULL) + _this->root = entry_new(key,value); + else + entry_put(_this->root,key,value); +} + +HashValue *goom_hash_get(GoomHash *_this, const char *key) { + return entry_get(_this->root,key); +} + +void goom_hash_put_int(GoomHash *_this, const char *key, int i) { + HashValue value; + value.i = i; + goom_hash_put(_this,key,value); +} + +void goom_hash_put_float(GoomHash *_this, const char *key, float f) { + HashValue value; + value.f = f; + goom_hash_put(_this,key,value); +} + +void goom_hash_put_ptr(GoomHash *_this, const char *key, void *ptr) { + HashValue value; + value.ptr = ptr; + goom_hash_put(_this,key,value); +} + + diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/goom_hash.h kodi-visualization-goom-2.1.0/lib/goom/src/goom_hash.h --- kodi-visualization-goom-1.1.0/lib/goom/src/goom_hash.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/goom_hash.h 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,34 @@ +#ifndef _GOOM_HASH_H +#define _GOOM_HASH_H + +typedef struct GOOM_HASH_ENTRY GoomHashEntry; +typedef struct GOOM_HASH GoomHash; + +typedef union { + void *ptr; + int i; + float f; +} HashValue; + +struct GOOM_HASH_ENTRY { + char *key; + HashValue value; + GoomHashEntry *lower; + GoomHashEntry *upper; +}; + +struct GOOM_HASH { + GoomHashEntry *root; +}; + +GoomHash *goom_hash_new(void); +void goom_hash_free(GoomHash *gh); + +void goom_hash_put(GoomHash *gh, const char *key, HashValue value); +HashValue *goom_hash_get(GoomHash *gh, const char *key); + +void goom_hash_put_int(GoomHash *_this, const char *key, int i); +void goom_hash_put_float(GoomHash *_this, const char *key, float f); +void goom_hash_put_ptr(GoomHash *_this, const char *key, void *ptr); + +#endif /* _GOOM_HASH_H */ diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/goom_plugin_info.h kodi-visualization-goom-2.1.0/lib/goom/src/goom_plugin_info.h --- kodi-visualization-goom-1.1.0/lib/goom/src/goom_plugin_info.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/goom_plugin_info.h 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,176 @@ +#ifndef _PLUGIN_INFO_H +#define _PLUGIN_INFO_H + +#include "goom.h" +#include "goom_typedefs.h" +#include "goom_config.h" + +#include "goom_graphic.h" +#include "goom_config_param.h" +#include "goom_visual_fx.h" +#include "goom_filters.h" +#include "goom_tools.h" +#include "goomsl.h" + +typedef struct { + char drawIFS; + char drawPoints; + char drawTentacle; + + char drawScope; + int farScope; + + int rangemin; + int rangemax; +} GoomState; + +#define STATES_MAX_NB 128 + +/** + * Gives informations about the sound. + */ +struct _SOUND_INFO { + + /* nota : a Goom is just a sound event... */ + + int timeSinceLastGoom; /* >= 0 */ + float goomPower; /* power of the last Goom [0..1] */ + + int timeSinceLastBigGoom; /* >= 0 */ + + float volume; /* [0..1] */ + gint16 samples[NUM_AUDIO_SAMPLES][AUDIO_SAMPLE_LEN]; + + /* other "internal" datas for the sound_tester */ + float goom_limit; /* auto-updated limit of goom_detection */ + float bigGoomLimit; + float accelvar; /* acceleration of the sound - [0..1] */ + float speedvar; /* speed of the sound - [0..100] */ + int allTimesMax; + int totalgoom; /* number of goom since last reset + * (a reset every 64 cycles) */ + + float prov_max; /* accel max since last reset */ + + int cycle; + + /* private */ + PluginParam volume_p; + PluginParam speed_p; + PluginParam accel_p; + PluginParam goom_limit_p; + PluginParam goom_power_p; + PluginParam last_goom_p; + PluginParam last_biggoom_p; + PluginParam biggoom_speed_limit_p; + PluginParam biggoom_factor_p; + + PluginParameters params; /* contains the previously defined parameters. */ +}; + + +/** + * Allows FXs to know the current state of the plugin. + */ +struct _PLUGIN_INFO { + + /* public datas */ + + int nbParams; + PluginParameters *params; + + /* private datas */ + + struct _SIZE_TYPE { + int width; + int height; + int size; /* == screen.height * screen.width. */ + } screen; + + SoundInfo sound; + + int nbVisuals; + VisualFX **visuals; /* pointers on all the visual fx */ + + /** The known FX */ + VisualFX convolve_fx; + VisualFX star_fx; + VisualFX zoomFilter_fx; + VisualFX tentacles_fx; + VisualFX ifs_fx; + + /** image buffers */ + guint32 *pixel; + guint32 *back; + Pixel *p1, *p2; + Pixel *conv; + Pixel *outputBuf; + + /** state of goom */ + guint32 cycle; + GoomState states[STATES_MAX_NB]; + int statesNumber; + int statesRangeMax; + + GoomState *curGState; + + /** effet de ligne.. */ + GMLine *gmline1; + GMLine *gmline2; + + /** sinus table */ + int sintable[0x10000]; + + /* INTERNALS */ + + /** goom_update internals. + * I took all static variables from goom_update and put them here.. for the moment. + */ + struct { + int lockvar; /* pour empecher de nouveaux changements */ + int goomvar; /* boucle des gooms */ + int loopvar; /* mouvement des points */ + int stop_lines; + int ifs_incr; /* dessiner l'ifs (0 = non: > = increment) */ + int decay_ifs; /* disparition de l'ifs */ + int recay_ifs; /* dedisparition de l'ifs */ + int cyclesSinceLastChange; /* nombre de Cycle Depuis Dernier Changement */ + int drawLinesDuration; /* duree de la transition entre afficher les lignes ou pas */ + int lineMode; /* l'effet lineaire a dessiner */ + float switchMultAmount; /* SWITCHMULT (29.0f/30.0f) */ + int switchIncrAmount; /* 0x7f */ + float switchMult; /* 1.0f */ + int switchIncr; /* = SWITCHINCR; */ + int stateSelectionRnd; + int stateSelectionBlocker; + int previousZoomSpeed; + int timeOfTitleDisplay; + char titleText[1024]; + ZoomFilterData zoomFilterData; + } update; + + struct { + int numberOfLinesInMessage; + char message[0x800]; + int affiche; + int longueur; + } update_message; + + struct { + void (*draw_line) (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny); + void (*zoom_filter) (int sizeX, int sizeY, Pixel *src, Pixel *dest, int *brutS, int *brutD, int buffratio, int precalCoef[16][16]); + } methods; + + GoomRandom *gRandom; + + GoomSL *scanner; + GoomSL *main_scanner; + const char *main_script_str; +}; + +void plugin_info_init(PluginInfo *p, int nbVisual); + +/* i = [0..p->nbVisual-1] */ +void plugin_info_add_visual(PluginInfo *p, int i, VisualFX *visual); + +#endif diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/goomsl.c kodi-visualization-goom-2.1.0/lib/goom/src/goomsl.c --- kodi-visualization-goom-1.1.0/lib/goom/src/goomsl.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/goomsl.c 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,1514 @@ +#include +#include +#include +#include +#include "goomsl.h" +#include "goomsl_private.h" +#include "goomsl_yacc.h" + +/*#define TRACE_SCRIPT*/ + + /* {{{ definition of the instructions number */ +#define INSTR_SETI_VAR_INTEGER 1 +#define INSTR_SETI_VAR_VAR 2 +#define INSTR_SETF_VAR_FLOAT 3 +#define INSTR_SETF_VAR_VAR 4 +#define INSTR_NOP 5 +/* #define INSTR_JUMP 6 */ +#define INSTR_SETP_VAR_PTR 7 +#define INSTR_SETP_VAR_VAR 8 +#define INSTR_SUBI_VAR_INTEGER 9 +#define INSTR_SUBI_VAR_VAR 10 +#define INSTR_SUBF_VAR_FLOAT 11 +#define INSTR_SUBF_VAR_VAR 12 +#define INSTR_ISLOWERF_VAR_VAR 13 +#define INSTR_ISLOWERF_VAR_FLOAT 14 +#define INSTR_ISLOWERI_VAR_VAR 15 +#define INSTR_ISLOWERI_VAR_INTEGER 16 +#define INSTR_ADDI_VAR_INTEGER 17 +#define INSTR_ADDI_VAR_VAR 18 +#define INSTR_ADDF_VAR_FLOAT 19 +#define INSTR_ADDF_VAR_VAR 20 +#define INSTR_MULI_VAR_INTEGER 21 +#define INSTR_MULI_VAR_VAR 22 +#define INSTR_MULF_VAR_FLOAT 23 +#define INSTR_MULF_VAR_VAR 24 +#define INSTR_DIVI_VAR_INTEGER 25 +#define INSTR_DIVI_VAR_VAR 26 +#define INSTR_DIVF_VAR_FLOAT 27 +#define INSTR_DIVF_VAR_VAR 28 +/* #define INSTR_JZERO 29 */ +#define INSTR_ISEQUALP_VAR_VAR 30 +#define INSTR_ISEQUALP_VAR_PTR 31 +#define INSTR_ISEQUALI_VAR_VAR 32 +#define INSTR_ISEQUALI_VAR_INTEGER 33 +#define INSTR_ISEQUALF_VAR_VAR 34 +#define INSTR_ISEQUALF_VAR_FLOAT 35 +/* #define INSTR_CALL 36 */ +/* #define INSTR_RET 37 */ +/* #define INSTR_EXT_CALL 38 */ +#define INSTR_NOT_VAR 39 +/* #define INSTR_JNZERO 40 */ +#define INSTR_SETS_VAR_VAR 41 +#define INSTR_ISEQUALS_VAR_VAR 42 +#define INSTR_ADDS_VAR_VAR 43 +#define INSTR_SUBS_VAR_VAR 44 +#define INSTR_MULS_VAR_VAR 45 +#define INSTR_DIVS_VAR_VAR 46 + + /* }}} */ +/* {{{ definition of the validation error types */ +static const char *VALIDATE_OK = "ok"; +#define VALIDATE_ERROR "error while validating " +#define VALIDATE_TODO "todo" +#define VALIDATE_SYNTHAX_ERROR "synthax error" +#define VALIDATE_NO_SUCH_INT "no such integer variable" +#define VALIDATE_NO_SUCH_VAR "no such variable" +#define VALIDATE_NO_SUCH_DEST_VAR "no such destination variable" +#define VALIDATE_NO_SUCH_SRC_VAR "no such src variable" +/* }}} */ + + /***********************************/ + /* PROTOTYPE OF INTERNAL FUNCTIONS */ +/***********************************/ + +/* {{{ */ +static void gsl_instr_free(Instruction *_this); +static const char *gsl_instr_validate(Instruction *_this); +static void gsl_instr_display(Instruction *_this); + +static InstructionFlow *iflow_new(void); +static void iflow_add_instr(InstructionFlow *_this, Instruction *instr); +static void iflow_clean(InstructionFlow *_this); +static void iflow_free(InstructionFlow *_this); +static void iflow_execute(FastInstructionFlow *_this, GoomSL *gsl); +/* }}} */ + + /************************************/ + /* DEFINITION OF INTERNAL FUNCTIONS */ +/************************************/ + +void iflow_free(InstructionFlow *_this) +{ /* {{{ */ + free(_this->instr); + goom_hash_free(_this->labels); + free(_this); /*TODO: finir cette fonction */ +} /* }}} */ + +void iflow_clean(InstructionFlow *_this) +{ /* {{{ */ + /* TODO: clean chaque instruction du flot */ + _this->number = 0; + goom_hash_free(_this->labels); + _this->labels = goom_hash_new(); +} /* }}} */ + +InstructionFlow *iflow_new(void) +{ /* {{{ */ + InstructionFlow *_this = (InstructionFlow*)malloc(sizeof(InstructionFlow)); + _this->number = 0; + _this->tabsize = 6; + _this->instr = (Instruction**)malloc(_this->tabsize * sizeof(Instruction*)); + _this->labels = goom_hash_new(); + + return _this; +} /* }}} */ + +void iflow_add_instr(InstructionFlow *_this, Instruction *instr) +{ /* {{{ */ + if (_this->number == _this->tabsize) { + _this->tabsize *= 2; + _this->instr = (Instruction**)realloc(_this->instr, _this->tabsize * sizeof(Instruction*)); + } + _this->instr[_this->number] = instr; + instr->address = _this->number; + _this->number++; +} /* }}} */ + +void gsl_instr_set_namespace(Instruction *_this, GoomHash *ns) +{ /* {{{ */ + if (_this->cur_param <= 0) { + fprintf(stderr, "ERROR: Line %d, No more params to instructions\n", _this->line_number); + exit(1); + } + _this->vnamespace[_this->cur_param-1] = ns; +} /* }}} */ + +void gsl_instr_add_param(Instruction *instr, char *param, int type) +{ /* {{{ */ + int len; + if (instr==NULL) + return; + if (instr->cur_param==0) + return; + --instr->cur_param; + len = strlen(param); + instr->params[instr->cur_param] = (char*)malloc(len+1); + strcpy(instr->params[instr->cur_param], param); + instr->types[instr->cur_param] = type; + if (instr->cur_param == 0) { + + const char *result = gsl_instr_validate(instr); + if (result != VALIDATE_OK) { + printf("ERROR: Line %d: ", instr->parent->num_lines + 1); + gsl_instr_display(instr); + printf("... %s\n", result); + instr->parent->compilationOK = 0; + exit(1); + } + +#if USE_JITC_X86 + iflow_add_instr(instr->parent->iflow, instr); +#else + if (instr->id != INSTR_NOP) + iflow_add_instr(instr->parent->iflow, instr); + else + gsl_instr_free(instr); +#endif + } +} /* }}} */ + +Instruction *gsl_instr_init(GoomSL *parent, const char *name, int id, int nb_param, int line_number) +{ /* {{{ */ + Instruction *instr = (Instruction*)malloc(sizeof(Instruction)); + instr->params = (char**)malloc(nb_param*sizeof(char*)); + instr->vnamespace = (GoomHash**)malloc(nb_param*sizeof(GoomHash*)); + instr->types = (int*)malloc(nb_param*sizeof(int)); + instr->cur_param = instr->nb_param = nb_param; + instr->parent = parent; + instr->id = id; + instr->name = name; + instr->jump_label = NULL; + instr->line_number = line_number; + return instr; +} /* }}} */ + +void gsl_instr_free(Instruction *_this) +{ /* {{{ */ + int i; + free(_this->types); + for (i=_this->cur_param; i<_this->nb_param; ++i) + free(_this->params[i]); + free(_this->params); + free(_this); +} /* }}} */ + +void gsl_instr_display(Instruction *_this) +{ /* {{{ */ + int i=_this->nb_param-1; + printf("%s", _this->name); + while(i>=_this->cur_param) { + printf(" %s", _this->params[i]); + --i; + } +} /* }}} */ + + /****************************************/ + /* VALIDATION OF INSTRUCTION PARAMETERS */ +/****************************************/ + +static const char *validate_v_v(Instruction *_this) +{ /* {{{ */ + HashValue *dest = goom_hash_get(_this->vnamespace[1], _this->params[1]); + HashValue *src = goom_hash_get(_this->vnamespace[0], _this->params[0]); + + if (dest == NULL) { + return VALIDATE_NO_SUCH_DEST_VAR; + } + if (src == NULL) { + return VALIDATE_NO_SUCH_SRC_VAR; + } + _this->data.udest.var = dest->ptr; + _this->data.usrc.var = src->ptr; + return VALIDATE_OK; +} /* }}} */ + +static const char *validate_v_i(Instruction *_this) +{ /* {{{ */ + HashValue *dest = goom_hash_get(_this->vnamespace[1], _this->params[1]); + _this->data.usrc.value_int = strtol(_this->params[0],NULL,0); + + if (dest == NULL) { + return VALIDATE_NO_SUCH_INT; + } + _this->data.udest.var = dest->ptr; + return VALIDATE_OK; +} /* }}} */ + +static const char *validate_v_p(Instruction *_this) +{ /* {{{ */ + HashValue *dest = goom_hash_get(_this->vnamespace[1], _this->params[1]); + _this->data.usrc.value_ptr = strtol(_this->params[0],NULL,0); + + if (dest == NULL) { + return VALIDATE_NO_SUCH_INT; + } + _this->data.udest.var = dest->ptr; + return VALIDATE_OK; +} /* }}} */ + +static const char *validate_v_f(Instruction *_this) +{ /* {{{ */ + HashValue *dest = goom_hash_get(_this->vnamespace[1], _this->params[1]); + _this->data.usrc.value_float = atof(_this->params[0]); + + if (dest == NULL) { + return VALIDATE_NO_SUCH_VAR; + } + _this->data.udest.var = dest->ptr; + return VALIDATE_OK; +} /* }}} */ + +static const char *validate(Instruction *_this, + int vf_f_id, int vf_v_id, + int vi_i_id, int vi_v_id, + int vp_p_id, int vp_v_id, + int vs_v_id) +{ /* {{{ */ + if ((_this->types[1] == TYPE_FVAR) && (_this->types[0] == TYPE_FLOAT)) { + _this->id = vf_f_id; + return validate_v_f(_this); + } + else if ((_this->types[1] == TYPE_FVAR) && (_this->types[0] == TYPE_FVAR)) { + _this->id = vf_v_id; + return validate_v_v(_this); + } + else if ((_this->types[1] == TYPE_IVAR) && (_this->types[0] == TYPE_INTEGER)) { + _this->id = vi_i_id; + return validate_v_i(_this); + } + else if ((_this->types[1] == TYPE_IVAR) && (_this->types[0] == TYPE_IVAR)) { + _this->id = vi_v_id; + return validate_v_v(_this); + } + else if ((_this->types[1] == TYPE_PVAR) && (_this->types[0] == TYPE_PTR)) { + if (vp_p_id == INSTR_NOP) return VALIDATE_ERROR; + _this->id = vp_p_id; + return validate_v_p(_this); + } + else if ((_this->types[1] == TYPE_PVAR) && (_this->types[0] == TYPE_PVAR)) { + _this->id = vp_v_id; + if (vp_v_id == INSTR_NOP) return VALIDATE_ERROR; + return validate_v_v(_this); + } + else if ((_this->types[1] < FIRST_RESERVED) && (_this->types[1] >= 0) && (_this->types[0] == _this->types[1])) { + _this->id = vs_v_id; + if (vs_v_id == INSTR_NOP) return "Impossible operation to perform between two structs"; + return validate_v_v(_this); + } + return VALIDATE_ERROR; +} /* }}} */ + +const char *gsl_instr_validate(Instruction *_this) +{ /* {{{ */ + if (_this->id != INSTR_EXT_CALL) { + int i = _this->nb_param; + while (i>0) + { + i--; + if (_this->types[i] == TYPE_VAR) { + int type = gsl_type_of_var(_this->vnamespace[i], _this->params[i]); + + if (type == INSTR_INT) + _this->types[i] = TYPE_IVAR; + else if (type == INSTR_FLOAT) + _this->types[i] = TYPE_FVAR; + else if (type == INSTR_PTR) + _this->types[i] = TYPE_PVAR; + else if ((type >= 0) && (type < FIRST_RESERVED)) + _this->types[i] = type; + else fprintf(stderr,"WARNING: Line %d, %s has no namespace\n", _this->line_number, _this->params[i]); + } + } + } + + switch (_this->id) { + + /* set */ + case INSTR_SET: + return validate(_this, + INSTR_SETF_VAR_FLOAT, INSTR_SETF_VAR_VAR, + INSTR_SETI_VAR_INTEGER, INSTR_SETI_VAR_VAR, + INSTR_SETP_VAR_PTR, INSTR_SETP_VAR_VAR, + INSTR_SETS_VAR_VAR); + + /* extcall */ + case INSTR_EXT_CALL: + if (_this->types[0] == TYPE_VAR) { + HashValue *fval = goom_hash_get(_this->parent->functions, _this->params[0]); + if (fval) { + _this->data.udest.external_function = (struct _ExternalFunctionStruct*)fval->ptr; + return VALIDATE_OK; + } + } + return VALIDATE_ERROR; + + /* call */ + case INSTR_CALL: + if (_this->types[0] == TYPE_LABEL) { + _this->jump_label = _this->params[0]; + return VALIDATE_OK; + } + return VALIDATE_ERROR; + + /* ret */ + case INSTR_RET: + return VALIDATE_OK; + + /* jump */ + case INSTR_JUMP: + + if (_this->types[0] == TYPE_LABEL) { + _this->jump_label = _this->params[0]; + return VALIDATE_OK; + } + return VALIDATE_ERROR; + + /* jzero / jnzero */ + case INSTR_JZERO: + case INSTR_JNZERO: + + if (_this->types[0] == TYPE_LABEL) { + _this->jump_label = _this->params[0]; + return VALIDATE_OK; + } + return VALIDATE_ERROR; + + /* label */ + case INSTR_LABEL: + + if (_this->types[0] == TYPE_LABEL) { + _this->id = INSTR_NOP; + _this->nop_label = _this->params[0]; + goom_hash_put_int(_this->parent->iflow->labels, _this->params[0], _this->parent->iflow->number); + return VALIDATE_OK; + } + return VALIDATE_ERROR; + + /* isequal */ + case INSTR_ISEQUAL: + return validate(_this, + INSTR_ISEQUALF_VAR_FLOAT, INSTR_ISEQUALF_VAR_VAR, + INSTR_ISEQUALI_VAR_INTEGER, INSTR_ISEQUALI_VAR_VAR, + INSTR_ISEQUALP_VAR_PTR, INSTR_ISEQUALP_VAR_VAR, + INSTR_ISEQUALS_VAR_VAR); + + /* not */ + case INSTR_NOT: + _this->id = INSTR_NOT_VAR; + return VALIDATE_OK; + + /* islower */ + case INSTR_ISLOWER: + return validate(_this, + INSTR_ISLOWERF_VAR_FLOAT, INSTR_ISLOWERF_VAR_VAR, + INSTR_ISLOWERI_VAR_INTEGER, INSTR_ISLOWERI_VAR_VAR, + INSTR_NOP, INSTR_NOP, INSTR_NOP); + + /* add */ + case INSTR_ADD: + return validate(_this, + INSTR_ADDF_VAR_FLOAT, INSTR_ADDF_VAR_VAR, + INSTR_ADDI_VAR_INTEGER, INSTR_ADDI_VAR_VAR, + INSTR_NOP, INSTR_NOP, + INSTR_ADDS_VAR_VAR); + + /* mul */ + case INSTR_MUL: + return validate(_this, + INSTR_MULF_VAR_FLOAT, INSTR_MULF_VAR_VAR, + INSTR_MULI_VAR_INTEGER, INSTR_MULI_VAR_VAR, + INSTR_NOP, INSTR_NOP, + INSTR_MULS_VAR_VAR); + + /* sub */ + case INSTR_SUB: + return validate(_this, + INSTR_SUBF_VAR_FLOAT, INSTR_SUBF_VAR_VAR, + INSTR_SUBI_VAR_INTEGER, INSTR_SUBI_VAR_VAR, + INSTR_NOP, INSTR_NOP, + INSTR_SUBS_VAR_VAR); + + /* div */ + case INSTR_DIV: + return validate(_this, + INSTR_DIVF_VAR_FLOAT, INSTR_DIVF_VAR_VAR, + INSTR_DIVI_VAR_INTEGER, INSTR_DIVI_VAR_VAR, + INSTR_NOP,INSTR_NOP, + INSTR_DIVS_VAR_VAR); + + default: + return VALIDATE_TODO; + } + return VALIDATE_ERROR; +} /* }}} */ + + /*************/ + /* EXECUTION */ +/*************/ +void iflow_execute(FastInstructionFlow *_this, GoomSL *gsl) +{ /* {{{ */ + int flag = 0; + int ip = 0; + FastInstruction *instr = _this->instr; + int stack[0x10000]; + int stack_pointer = 0; + + stack[stack_pointer++] = -1; + + /* Quelques Macro pour rendre le code plus lisible */ +#define pSRC_VAR instr[ip].data.usrc.var +#define SRC_VAR_INT *instr[ip].data.usrc.var_int +#define SRC_VAR_FLOAT *instr[ip].data.usrc.var_float +#define SRC_VAR_PTR *instr[ip].data.usrc.var_ptr + +#define pDEST_VAR instr[ip].data.udest.var +#define DEST_VAR_INT *instr[ip].data.udest.var_int +#define DEST_VAR_FLOAT *instr[ip].data.udest.var_float +#define DEST_VAR_PTR *instr[ip].data.udest.var_ptr + +#define VALUE_INT instr[ip].data.usrc.value_int +#define VALUE_FLOAT instr[ip].data.usrc.value_float +#define VALUE_PTR instr[ip].data.usrc.value_ptr + +#define JUMP_OFFSET instr[ip].data.udest.jump_offset + +#define SRC_STRUCT_ID instr[ip].data.usrc.var_int[-1] +#define DEST_STRUCT_ID instr[ip].data.udest.var_int[-1] +#define SRC_STRUCT_IBLOCK(i) gsl->gsl_struct[SRC_STRUCT_ID]->iBlock[i] +#define SRC_STRUCT_FBLOCK(i) gsl->gsl_struct[SRC_STRUCT_ID]->fBlock[i] +#define DEST_STRUCT_IBLOCK(i) gsl->gsl_struct[DEST_STRUCT_ID]->iBlock[i] +#define DEST_STRUCT_FBLOCK(i) gsl->gsl_struct[DEST_STRUCT_ID]->fBlock[i] +#define DEST_STRUCT_IBLOCK_VAR(i,j) \ + ((int*)((char*)pDEST_VAR + gsl->gsl_struct[DEST_STRUCT_ID]->iBlock[i].data))[j] +#define DEST_STRUCT_FBLOCK_VAR(i,j) \ + ((float*)((char*)pDEST_VAR + gsl->gsl_struct[DEST_STRUCT_ID]->fBlock[i].data))[j] +#define SRC_STRUCT_IBLOCK_VAR(i,j) \ + ((int*)((char*)pSRC_VAR + gsl->gsl_struct[SRC_STRUCT_ID]->iBlock[i].data))[j] +#define SRC_STRUCT_FBLOCK_VAR(i,j) \ + ((float*)((char*)pSRC_VAR + gsl->gsl_struct[SRC_STRUCT_ID]->fBlock[i].data))[j] +#define DEST_STRUCT_SIZE gsl->gsl_struct[DEST_STRUCT_ID]->size + + while (1) + { + int i; +#ifdef TRACE_SCRIPT + printf("execute "); gsl_instr_display(instr[ip].proto); printf("\n"); +#endif + switch (instr[ip].id) { + + /* SET.I */ + case INSTR_SETI_VAR_INTEGER: + DEST_VAR_INT = VALUE_INT; + ++ip; break; + + case INSTR_SETI_VAR_VAR: + DEST_VAR_INT = SRC_VAR_INT; + ++ip; break; + + /* SET.F */ + case INSTR_SETF_VAR_FLOAT: + DEST_VAR_FLOAT = VALUE_FLOAT; + ++ip; break; + + case INSTR_SETF_VAR_VAR: + DEST_VAR_FLOAT = SRC_VAR_FLOAT; + ++ip; break; + + /* SET.P */ + case INSTR_SETP_VAR_VAR: + DEST_VAR_PTR = SRC_VAR_PTR; + ++ip; break; + + case INSTR_SETP_VAR_PTR: + DEST_VAR_PTR = VALUE_PTR; + ++ip; break; + + /* JUMP */ + case INSTR_JUMP: + ip += JUMP_OFFSET; break; + + /* JZERO */ + case INSTR_JZERO: + ip += (flag ? 1 : JUMP_OFFSET); break; + + case INSTR_NOP: + ++ip; break; + + /* ISEQUAL.P */ + case INSTR_ISEQUALP_VAR_VAR: + flag = (DEST_VAR_PTR == SRC_VAR_PTR); + ++ip; break; + + case INSTR_ISEQUALP_VAR_PTR: + flag = (DEST_VAR_PTR == VALUE_PTR); + ++ip; break; + + /* ISEQUAL.I */ + case INSTR_ISEQUALI_VAR_VAR: + flag = (DEST_VAR_INT == SRC_VAR_INT); + ++ip; break; + + case INSTR_ISEQUALI_VAR_INTEGER: + flag = (DEST_VAR_INT == VALUE_INT); + ++ip; break; + + /* ISEQUAL.F */ + case INSTR_ISEQUALF_VAR_VAR: + flag = (DEST_VAR_FLOAT == SRC_VAR_FLOAT); + ++ip; break; + + case INSTR_ISEQUALF_VAR_FLOAT: + flag = (DEST_VAR_FLOAT == VALUE_FLOAT); + ++ip; break; + + /* ISLOWER.I */ + case INSTR_ISLOWERI_VAR_VAR: + flag = (DEST_VAR_INT < SRC_VAR_INT); + ++ip; break; + + case INSTR_ISLOWERI_VAR_INTEGER: + flag = (DEST_VAR_INT < VALUE_INT); + ++ip; break; + + /* ISLOWER.F */ + case INSTR_ISLOWERF_VAR_VAR: + flag = (DEST_VAR_FLOAT < SRC_VAR_FLOAT); + ++ip; break; + + case INSTR_ISLOWERF_VAR_FLOAT: + flag = (DEST_VAR_FLOAT < VALUE_FLOAT); + ++ip; break; + + /* ADD.I */ + case INSTR_ADDI_VAR_VAR: + DEST_VAR_INT += SRC_VAR_INT; + ++ip; break; + + case INSTR_ADDI_VAR_INTEGER: + DEST_VAR_INT += VALUE_INT; + ++ip; break; + + /* ADD.F */ + case INSTR_ADDF_VAR_VAR: + DEST_VAR_FLOAT += SRC_VAR_FLOAT; + ++ip; break; + + case INSTR_ADDF_VAR_FLOAT: + DEST_VAR_FLOAT += VALUE_FLOAT; + ++ip; break; + + /* MUL.I */ + case INSTR_MULI_VAR_VAR: + DEST_VAR_INT *= SRC_VAR_INT; + ++ip; break; + + case INSTR_MULI_VAR_INTEGER: + DEST_VAR_INT *= VALUE_INT; + ++ip; break; + + /* MUL.F */ + case INSTR_MULF_VAR_FLOAT: + DEST_VAR_FLOAT *= VALUE_FLOAT; + ++ip; break; + + case INSTR_MULF_VAR_VAR: + DEST_VAR_FLOAT *= SRC_VAR_FLOAT; + ++ip; break; + + /* DIV.I */ + case INSTR_DIVI_VAR_VAR: + DEST_VAR_INT /= SRC_VAR_INT; + ++ip; break; + + case INSTR_DIVI_VAR_INTEGER: + DEST_VAR_INT /= VALUE_INT; + ++ip; break; + + /* DIV.F */ + case INSTR_DIVF_VAR_FLOAT: + DEST_VAR_FLOAT /= VALUE_FLOAT; + ++ip; break; + + case INSTR_DIVF_VAR_VAR: + DEST_VAR_FLOAT /= SRC_VAR_FLOAT; + ++ip; break; + + /* SUB.I */ + case INSTR_SUBI_VAR_VAR: + DEST_VAR_INT -= SRC_VAR_INT; + ++ip; break; + + case INSTR_SUBI_VAR_INTEGER: + DEST_VAR_INT -= VALUE_INT; + ++ip; break; + + /* SUB.F */ + case INSTR_SUBF_VAR_FLOAT: + DEST_VAR_FLOAT -= VALUE_FLOAT; + ++ip; break; + + case INSTR_SUBF_VAR_VAR: + DEST_VAR_FLOAT -= SRC_VAR_FLOAT; + ++ip; break; + + /* CALL */ + case INSTR_CALL: + stack[stack_pointer++] = ip + 1; + ip += JUMP_OFFSET; break; + + /* RET */ + case INSTR_RET: + ip = stack[--stack_pointer]; + if (ip<0) return; + break; + + /* EXT_CALL */ + case INSTR_EXT_CALL: + instr[ip].data.udest.external_function->function(gsl, gsl->vars, instr[ip].data.udest.external_function->vars); + ++ip; break; + + /* NOT */ + case INSTR_NOT_VAR: + flag = !flag; + ++ip; break; + + /* JNZERO */ + case INSTR_JNZERO: + ip += (flag ? JUMP_OFFSET : 1); break; + + case INSTR_SETS_VAR_VAR: + memcpy(pDEST_VAR, pSRC_VAR, DEST_STRUCT_SIZE); + ++ip; break; + + case INSTR_ISEQUALS_VAR_VAR: + break; + + case INSTR_ADDS_VAR_VAR: + /* process integers */ + i=0; + while (DEST_STRUCT_IBLOCK(i).size > 0) { + int j=DEST_STRUCT_IBLOCK(i).size; + while (j--) { + DEST_STRUCT_IBLOCK_VAR(i,j) += SRC_STRUCT_IBLOCK_VAR(i,j); + } + ++i; + } + /* process floats */ + i=0; + while (DEST_STRUCT_FBLOCK(i).size > 0) { + int j=DEST_STRUCT_FBLOCK(i).size; + while (j--) { + DEST_STRUCT_FBLOCK_VAR(i,j) += SRC_STRUCT_FBLOCK_VAR(i,j); + } + ++i; + } + ++ip; break; + + case INSTR_SUBS_VAR_VAR: + /* process integers */ + i=0; + while (DEST_STRUCT_IBLOCK(i).size > 0) { + int j=DEST_STRUCT_IBLOCK(i).size; + while (j--) { + DEST_STRUCT_IBLOCK_VAR(i,j) -= SRC_STRUCT_IBLOCK_VAR(i,j); + } + ++i; + } + /* process floats */ + i=0; + while (DEST_STRUCT_FBLOCK(i).size > 0) { + int j=DEST_STRUCT_FBLOCK(i).size; + while (j--) { + DEST_STRUCT_FBLOCK_VAR(i,j) -= SRC_STRUCT_FBLOCK_VAR(i,j); + } + ++i; + } + ++ip; break; + + case INSTR_MULS_VAR_VAR: + /* process integers */ + i=0; + while (DEST_STRUCT_IBLOCK(i).size > 0) { + int j=DEST_STRUCT_IBLOCK(i).size; + while (j--) { + DEST_STRUCT_IBLOCK_VAR(i,j) *= SRC_STRUCT_IBLOCK_VAR(i,j); + } + ++i; + } + /* process floats */ + i=0; + while (DEST_STRUCT_FBLOCK(i).size > 0) { + int j=DEST_STRUCT_FBLOCK(i).size; + while (j--) { + DEST_STRUCT_FBLOCK_VAR(i,j) *= SRC_STRUCT_FBLOCK_VAR(i,j); + } + ++i; + } + ++ip; break; + + case INSTR_DIVS_VAR_VAR: + /* process integers */ + i=0; + while (DEST_STRUCT_IBLOCK(i).size > 0) { + int j=DEST_STRUCT_IBLOCK(i).size; + while (j--) { + DEST_STRUCT_IBLOCK_VAR(i,j) /= SRC_STRUCT_IBLOCK_VAR(i,j); + } + ++i; + } + /* process floats */ + i=0; + while (DEST_STRUCT_FBLOCK(i).size > 0) { + int j=DEST_STRUCT_FBLOCK(i).size; + while (j--) { + DEST_STRUCT_FBLOCK_VAR(i,j) /= SRC_STRUCT_FBLOCK_VAR(i,j); + } + ++i; + } + ++ip; break; + + default: + printf("NOT IMPLEMENTED : %d\n", instr[ip].id); + ++ip; + exit(1); + } + } +} /* }}} */ + +int gsl_malloc(GoomSL *_this, int size) +{ /* {{{ */ + if (_this->nbPtr >= _this->ptrArraySize) { + _this->ptrArraySize *= 2; + _this->ptrArray = (void**)realloc(_this->ptrArray, sizeof(void*) * _this->ptrArraySize); + } + _this->ptrArray[_this->nbPtr] = malloc(size); + return _this->nbPtr++; +} /* }}} */ + +void *gsl_get_ptr(GoomSL *_this, int id) +{ /* {{{ */ + if ((id>=0)&&(id<_this->nbPtr)) + return _this->ptrArray[id]; + fprintf(stderr,"INVALID GET PTR 0x%08x\n", id); + return NULL; +} /* }}} */ + +void gsl_free_ptr(GoomSL *_this, int id) +{ /* {{{ */ + if ((id>=0)&&(id<_this->nbPtr)) { + free(_this->ptrArray[id]); + _this->ptrArray[id] = 0; + } +} /* }}} */ + +void gsl_enternamespace(const char *name) +{ /* {{{ */ + HashValue *val = goom_hash_get(currentGoomSL->functions, name); + if (val) { + ExternalFunctionStruct *function = (ExternalFunctionStruct*)val->ptr; + currentGoomSL->currentNS++; + currentGoomSL->namespaces[currentGoomSL->currentNS] = function->vars; + } + else { + fprintf(stderr, "ERROR: Line %d, Could not find namespace: %s\n", currentGoomSL->num_lines, name); + exit(1); + } +} /* }}} */ + +void gsl_reenternamespace(GoomHash *nsinfo) { + currentGoomSL->currentNS++; + currentGoomSL->namespaces[currentGoomSL->currentNS] = nsinfo; +} + +GoomHash *gsl_leavenamespace(void) +{ /* {{{ */ + currentGoomSL->currentNS--; + return currentGoomSL->namespaces[currentGoomSL->currentNS+1]; +} /* }}} */ + +GoomHash *gsl_find_namespace(const char *name) +{ /* {{{ */ + int i; + for (i=currentGoomSL->currentNS;i>=0;--i) { + if (goom_hash_get(currentGoomSL->namespaces[i], name)) + return currentGoomSL->namespaces[i]; + } + return NULL; +} /* }}} */ + +void gsl_declare_task(const char *name) +{ /* {{{ */ + if (goom_hash_get(currentGoomSL->functions, name)) { + return; + } + else { + ExternalFunctionStruct *gef = (ExternalFunctionStruct*)malloc(sizeof(ExternalFunctionStruct)); + gef->function = 0; + gef->vars = goom_hash_new(); + gef->is_extern = 0; + goom_hash_put_ptr(currentGoomSL->functions, name, (void*)gef); + } +} /* }}} */ + +void gsl_declare_external_task(const char *name) +{ /* {{{ */ + if (goom_hash_get(currentGoomSL->functions, name)) { + fprintf(stderr, "ERROR: Line %d, Duplicate declaration of %s\n", currentGoomSL->num_lines, name); + return; + } + else { + ExternalFunctionStruct *gef = (ExternalFunctionStruct*)malloc(sizeof(ExternalFunctionStruct)); + gef->function = 0; + gef->vars = goom_hash_new(); + gef->is_extern = 1; + goom_hash_put_ptr(currentGoomSL->functions, name, (void*)gef); + } +} /* }}} */ + +static void reset_scanner(GoomSL *gss) +{ /* {{{ */ + gss->num_lines = 0; + gss->instr = NULL; + iflow_clean(gss->iflow); + + /* reset variables */ + goom_hash_free(gss->vars); + gss->vars = goom_hash_new(); + gss->currentNS = 0; + gss->namespaces[0] = gss->vars; + + goom_hash_free(gss->structIDS); + gss->structIDS = goom_hash_new(); + + while (gss->nbStructID > 0) { + int i; + gss->nbStructID--; + for(i=0;igsl_struct[gss->nbStructID]->nbFields;++i) + free(gss->gsl_struct[gss->nbStructID]->fields[i]); + free(gss->gsl_struct[gss->nbStructID]); + } + + gss->compilationOK = 1; + + goom_heap_delete(gss->data_heap); + gss->data_heap = goom_heap_new(); +} /* }}} */ + +static void calculate_labels(InstructionFlow *iflow) +{ /* {{{ */ + int i = 0; + while (i < iflow->number) { + Instruction *instr = iflow->instr[i]; + if (instr->jump_label) { + HashValue *label = goom_hash_get(iflow->labels,instr->jump_label); + if (label) { + instr->data.udest.jump_offset = -instr->address + label->i; + } + else { + fprintf(stderr, "ERROR: Line %d, Could not find label %s\n", instr->line_number, instr->jump_label); + instr->id = INSTR_NOP; + instr->nop_label = 0; + exit(1); + } + } + ++i; + } +} /* }}} */ + +static int powerOfTwo(int i) +{ + int b; + for (b=0;b<31;b++) + if (i == (1<iflow->number; + int i; +#ifdef USE_JITC_X86 + + /* pour compatibilite avec les MACROS servant a execution */ + int ip = 0; + GoomSL *gsl = currentGoomSL; + + JitcX86Env *jitc; + + if (currentGoomSL->jitc != NULL) + jitc_x86_delete(currentGoomSL->jitc); + jitc = currentGoomSL->jitc = jitc_x86_env_new(0xffff); + currentGoomSL->jitc_func = jitc_prepare_func(jitc); + +#if 0 +#define SRC_STRUCT_ID instr[ip].data.usrc.var_int[-1] +#define DEST_STRUCT_ID instr[ip].data.udest.var_int[-1] +#define SRC_STRUCT_IBLOCK(i) gsl->gsl_struct[SRC_STRUCT_ID]->iBlock[i] +#define SRC_STRUCT_FBLOCK(i) gsl->gsl_struct[SRC_STRUCT_ID]->fBlock[i] +#define DEST_STRUCT_IBLOCK(i) gsl->gsl_struct[DEST_STRUCT_ID]->iBlock[i] +#define DEST_STRUCT_FBLOCK(i) gsl->gsl_struct[DEST_STRUCT_ID]->fBlock[i] +#define DEST_STRUCT_IBLOCK_VAR(i,j) \ + ((int*)((char*)pDEST_VAR + gsl->gsl_struct[DEST_STRUCT_ID]->iBlock[i].data))[j] +#define DEST_STRUCT_FBLOCK_VAR(i,j) \ + ((float*)((char*)pDEST_VAR + gsl->gsl_struct[DEST_STRUCT_ID]->fBlock[i].data))[j] +#define SRC_STRUCT_IBLOCK_VAR(i,j) \ + ((int*)((char*)pSRC_VAR + gsl->gsl_struct[SRC_STRUCT_ID]->iBlock[i].data))[j] +#define SRC_STRUCT_FBLOCK_VAR(i,j) \ + ((float*)((char*)pSRC_VAR + gsl->gsl_struct[SRC_STRUCT_ID]->fBlock[i].data))[j] +#define DEST_STRUCT_SIZE gsl->gsl_struct[DEST_STRUCT_ID]->size +#endif + + JITC_JUMP_LABEL(jitc, "__very_end__"); + JITC_ADD_LABEL (jitc, "__very_start__"); + + for (i=0;iiflow->instr[i]; + switch (instr->id) { + case INSTR_SETI_VAR_INTEGER : + jitc_add(jitc, "mov [$d], $d", instr->data.udest.var_int, instr->data.usrc.value_int); + break; + case INSTR_SETI_VAR_VAR : + jitc_add(jitc, "mov eax, [$d]", instr->data.usrc.var_int); + jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int); + break; + /* SET.F */ + case INSTR_SETF_VAR_FLOAT : + jitc_add(jitc, "mov [$d], $d", instr->data.udest.var_float, *(int*)(&instr->data.usrc.value_float)); + break; + case INSTR_SETF_VAR_VAR : + jitc_add(jitc, "mov eax, [$d]", instr->data.usrc.var_float); + jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_float); + break; + case INSTR_NOP : + if (instr->nop_label != 0) + JITC_ADD_LABEL(jitc, instr->nop_label); + break; + case INSTR_JUMP : + JITC_JUMP_LABEL(jitc,instr->jump_label); + break; + case INSTR_SETP_VAR_PTR : + jitc_add(jitc, "mov [$d], $d", instr->data.udest.var_ptr, instr->data.usrc.value_ptr); + break; + case INSTR_SETP_VAR_VAR : + jitc_add(jitc, "mov eax, [$d]", instr->data.usrc.var_ptr); + jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_ptr); + break; + case INSTR_SUBI_VAR_INTEGER : + jitc_add(jitc, "add [$d], $d", instr->data.udest.var_int, -instr->data.usrc.value_int); + break; + case INSTR_SUBI_VAR_VAR : + jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int); + jitc_add(jitc, "sub eax, [$d]", instr->data.usrc.var_int); + jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int); + break; + case INSTR_SUBF_VAR_FLOAT : + printf("NOT IMPLEMENTED : %d\n", instr->id); + break; + case INSTR_SUBF_VAR_VAR : + printf("NOT IMPLEMENTED : %d\n", instr->id); + break; + case INSTR_ISLOWERF_VAR_VAR: + printf("NOT IMPLEMENTED : %d\n", instr->id); + break; + case INSTR_ISLOWERF_VAR_FLOAT: + printf("NOT IMPLEMENTED : %d\n", instr->id); + break; + case INSTR_ISLOWERI_VAR_VAR: + jitc_add(jitc,"mov edx, [$d]", instr->data.udest.var_int); + jitc_add(jitc,"sub edx, [$d]", instr->data.usrc.var_int); + jitc_add(jitc,"shr edx, $d", 31); + break; + case INSTR_ISLOWERI_VAR_INTEGER: + jitc_add(jitc,"mov edx, [$d]", instr->data.udest.var_int); + jitc_add(jitc,"sub edx, $d", instr->data.usrc.value_int); + jitc_add(jitc,"shr edx, $d", 31); + break; + case INSTR_ADDI_VAR_INTEGER: + jitc_add(jitc, "add [$d], $d", instr->data.udest.var_int, instr->data.usrc.value_int); + break; + case INSTR_ADDI_VAR_VAR: + jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int); + jitc_add(jitc, "add eax, [$d]", instr->data.usrc.var_int); + jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int); + break; + case INSTR_ADDF_VAR_FLOAT: + printf("NOT IMPLEMENTED : %d\n", instr->id); + break; + case INSTR_ADDF_VAR_VAR: + printf("NOT IMPLEMENTED : %d\n", instr->id); + break; + case INSTR_MULI_VAR_INTEGER: + if (instr->data.usrc.value_int != 1) + { + int po2 = powerOfTwo(instr->data.usrc.value_int); + if (po2) { + /* performs (V / 2^n) by doing V >> n */ + jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int); + jitc_add(jitc, "sal eax, $d", po2); + jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int); + } + else { + jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int); + jitc_add(jitc, "imul eax, $d", instr->data.usrc.value_int); + jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int); + } + } + break; + case INSTR_MULI_VAR_VAR: + jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int); + jitc_add(jitc, "imul eax, [$d]", instr->data.usrc.var_int); + jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int); + break; + case INSTR_MULF_VAR_FLOAT: + printf("NOT IMPLEMENTED : %d\n", instr->id); + break; + case INSTR_MULF_VAR_VAR: + printf("NOT IMPLEMENTED : %d\n", instr->id); + break; + case INSTR_DIVI_VAR_INTEGER: + if ((instr->data.usrc.value_int != 1) && (instr->data.usrc.value_int != 0)) + { + int po2 = powerOfTwo(instr->data.usrc.value_int); + if (po2) { + /* performs (V / 2^n) by doing V >> n */ + jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int); + jitc_add(jitc, "sar eax, $d", po2); + jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int); + } + else { + /* performs (V/n) by doing (V*(32^2/n)) */ + long coef; + double dcoef = (double)4294967296.0 / (double)instr->data.usrc.value_int; + if (dcoef < 0.0) dcoef = -dcoef; + coef = (long)floor(dcoef); + dcoef -= floor(dcoef); + if (dcoef < 0.5) coef += 1; + + jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int); + jitc_add(jitc, "mov edx, $d", coef); + jitc_add(jitc, "imul edx"); + if (instr->data.usrc.value_int < 0) + jitc_add(jitc, "neg edx"); + jitc_add(jitc, "mov [$d], edx", instr->data.udest.var_int); + } + } + break; + case INSTR_DIVI_VAR_VAR : + jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int); + jitc_add(jitc, "cdq"); /* sign extend eax into edx */ + jitc_add(jitc, "idiv [$d]", instr->data.usrc.var_int); + jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int); + break; + case INSTR_DIVF_VAR_FLOAT: + printf("NOT IMPLEMENTED : %d\n", instr->id); + break; + case INSTR_DIVF_VAR_VAR: + printf("NOT IMPLEMENTED : %d\n", instr->id); + break; + case INSTR_JZERO: + jitc_add(jitc, "cmp edx, $d", 0); + jitc_add(jitc, "je $s", instr->jump_label); + break; + case INSTR_ISEQUALP_VAR_VAR : + jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_ptr); + jitc_add(jitc, "mov edx, $d", 0); + jitc_add(jitc, "cmp eax, [$d]", instr->data.usrc.var_ptr); + jitc_add(jitc, "jne $d", 1); + jitc_add(jitc, "inc edx"); + break; + case INSTR_ISEQUALP_VAR_PTR : + jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_ptr); + jitc_add(jitc, "mov edx, $d", 0); + jitc_add(jitc, "cmp eax, $d", instr->data.usrc.value_ptr); + jitc_add(jitc, "jne $d", 1); + jitc_add(jitc, "inc edx"); + break; + case INSTR_ISEQUALI_VAR_VAR : + jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int); + jitc_add(jitc, "mov edx, $d", 0); + jitc_add(jitc, "cmp eax, [$d]", instr->data.usrc.var_int); + jitc_add(jitc, "jne $d", 1); + jitc_add(jitc, "inc edx"); + break; + case INSTR_ISEQUALI_VAR_INTEGER : + jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int); + jitc_add(jitc, "mov edx, $d", 0); + jitc_add(jitc, "cmp eax, $d", instr->data.usrc.value_int); + jitc_add(jitc, "jne $d", 1); + jitc_add(jitc, "inc edx"); + break; + case INSTR_ISEQUALF_VAR_VAR : + printf("NOT IMPLEMENTED : %d\n", instr->id); + break; + case INSTR_ISEQUALF_VAR_FLOAT : + printf("NOT IMPLEMENTED : %d\n", instr->id); + break; + case INSTR_CALL: + jitc_add(jitc, "call $s", instr->jump_label); + break; + case INSTR_RET: + jitc_add(jitc, "ret"); + break; + case INSTR_EXT_CALL: + jitc_add(jitc, "mov eax, [$d]", &(instr->data.udest.external_function->vars)); + jitc_add(jitc, "push eax"); + jitc_add(jitc, "mov edx, [$d]", &(currentGoomSL->vars)); + jitc_add(jitc, "push edx"); + jitc_add(jitc, "mov eax, [$d]", &(currentGoomSL)); + jitc_add(jitc, "push eax"); + + jitc_add(jitc, "mov eax, [$d]", &(instr->data.udest.external_function)); + jitc_add(jitc, "mov eax, [eax]"); + jitc_add(jitc, "call [eax]"); + jitc_add(jitc, "add esp, $d", 12); + break; + case INSTR_NOT_VAR: + jitc_add(jitc, "mov eax, edx"); + jitc_add(jitc, "mov edx, $d", 1); + jitc_add(jitc, "sub edx, eax"); + break; + case INSTR_JNZERO: + jitc_add(jitc, "cmp edx, $d", 0); + jitc_add(jitc, "jne $s", instr->jump_label); + break; + case INSTR_SETS_VAR_VAR: + { + int loop = DEST_STRUCT_SIZE / sizeof(int); + int dst = (int)pDEST_VAR; + int src = (int)pSRC_VAR; + + while (loop--) { + jitc_add(jitc,"mov eax, [$d]", src); + jitc_add(jitc,"mov [$d], eax", dst); + src += 4; + dst += 4; + } + } + break; + case INSTR_ISEQUALS_VAR_VAR: + break; + case INSTR_ADDS_VAR_VAR: + { + /* process integers */ + int i=0; + while (DEST_STRUCT_IBLOCK(i).size > 0) { + int j=DEST_STRUCT_IBLOCK(i).size; + while (j--) { /* TODO interlace 2 */ + jitc_add(jitc, "mov eax, [$d]", &DEST_STRUCT_IBLOCK_VAR(i,j)); + jitc_add(jitc, "add eax, [$d]", &SRC_STRUCT_IBLOCK_VAR(i,j)); + jitc_add(jitc, "mov [$d], eax", &DEST_STRUCT_IBLOCK_VAR(i,j)); + } + ++i; + } + /* process floats */ + i=0; + while (DEST_STRUCT_FBLOCK(i).size > 0) { + int j=DEST_STRUCT_FBLOCK(i).size; + while (j--) { + /* DEST_STRUCT_FBLOCK_VAR(i,j) += SRC_STRUCT_FBLOCK_VAR(i,j); */ + /* TODO */ + } + ++i; + } + break; + } + case INSTR_SUBS_VAR_VAR: + { + /* process integers */ + int i=0; + while (DEST_STRUCT_IBLOCK(i).size > 0) { + int j=DEST_STRUCT_IBLOCK(i).size; + while (j--) { + jitc_add(jitc, "mov eax, [$d]", &DEST_STRUCT_IBLOCK_VAR(i,j)); + jitc_add(jitc, "sub eax, [$d]", &SRC_STRUCT_IBLOCK_VAR(i,j)); + jitc_add(jitc, "mov [$d], eax", &DEST_STRUCT_IBLOCK_VAR(i,j)); + } + ++i; + } + break; + } + case INSTR_MULS_VAR_VAR: + { + /* process integers */ + int i=0; + while (DEST_STRUCT_IBLOCK(i).size > 0) { + int j=DEST_STRUCT_IBLOCK(i).size; + while (j--) { + jitc_add(jitc, "mov eax, [$d]", &DEST_STRUCT_IBLOCK_VAR(i,j)); + jitc_add(jitc, "imul eax, [$d]", &SRC_STRUCT_IBLOCK_VAR(i,j)); + jitc_add(jitc, "mov [$d], eax", &DEST_STRUCT_IBLOCK_VAR(i,j)); + } + ++i; + } + break; + } + case INSTR_DIVS_VAR_VAR: + { + /* process integers */ + int i=0; + while (DEST_STRUCT_IBLOCK(i).size > 0) { + int j=DEST_STRUCT_IBLOCK(i).size; + while (j--) { + jitc_add(jitc, "mov eax, [$d]", &DEST_STRUCT_IBLOCK_VAR(i,j)); + jitc_add(jitc, "cdq"); + jitc_add(jitc, "idiv [$d]", &SRC_STRUCT_IBLOCK_VAR(i,j)); + jitc_add(jitc, "mov [$d], eax", &DEST_STRUCT_IBLOCK_VAR(i,j)); + } + ++i; + } + break; + } + } + } + + JITC_ADD_LABEL (jitc, "__very_end__"); + jitc_add(jitc, "call $s", "__very_start__"); + jitc_add(jitc, "mov eax, $d", 0); + jitc_validate_func(jitc); +#else + InstructionFlow *iflow = currentGoomSL->iflow; + FastInstructionFlow *fastiflow = (FastInstructionFlow*)malloc(sizeof(FastInstructionFlow)); + fastiflow->mallocedInstr = calloc(number*16, sizeof(FastInstruction)); + /* fastiflow->instr = (FastInstruction*)(((int)fastiflow->mallocedInstr) + 16 - (((int)fastiflow->mallocedInstr)%16)); */ + fastiflow->instr = (FastInstruction*)fastiflow->mallocedInstr; + fastiflow->number = number; + for(i=0;iinstr[i].id = iflow->instr[i]->id; + fastiflow->instr[i].data = iflow->instr[i]->data; + fastiflow->instr[i].proto = iflow->instr[i]; + } + currentGoomSL->fastiflow = fastiflow; +#endif +} /* }}} */ + +void yy_scan_string(const char *str); +void yyparse(void); + +GoomHash *gsl_globals(GoomSL *_this) +{ + return _this->vars; +} + + +/** + * Some native external functions + */ +static void ext_charAt(GoomSL *gsl, GoomHash *global, GoomHash *local) +{ + char *string = GSL_LOCAL_PTR(gsl, local, "value"); + int index = GSL_LOCAL_INT(gsl, local, "index"); + GSL_GLOBAL_INT(gsl, "charAt") = 0; + if (string == NULL) { + return; + } + if (index < strlen(string)) + GSL_GLOBAL_INT(gsl, "charAt") = string[index]; +} + +static void ext_i2f(GoomSL *gsl, GoomHash *global, GoomHash *local) +{ + int i = GSL_LOCAL_INT(gsl, local, "value"); + GSL_GLOBAL_FLOAT(gsl, "i2f") = i; +} + +static void ext_f2i(GoomSL *gsl, GoomHash *global, GoomHash *local) +{ + float f = GSL_LOCAL_FLOAT(gsl, local, "value"); + GSL_GLOBAL_INT(gsl, "f2i") = f; +} + +/** + * + */ +void gsl_compile(GoomSL *_currentGoomSL, const char *script) +{ /* {{{ */ + char *script_and_externals; + static const char *sBinds = + "external : int\n" + "external : int\n" + "external : float\n"; + +#ifdef VERBOSE + printf("\n=== Starting Compilation ===\n"); +#endif + + script_and_externals = malloc(strlen(script) + strlen(sBinds) + 2); + strcpy(script_and_externals, sBinds); + strcat(script_and_externals, script); + + /* 0- reset */ + currentGoomSL = _currentGoomSL; + reset_scanner(currentGoomSL); + + /* 1- create the syntaxic tree */ + yy_scan_string(script_and_externals); + yyparse(); + + /* 2- generate code */ + gsl_commit_compilation(); + + /* 3- resolve symbols */ + calculate_labels(currentGoomSL->iflow); + + /* 4- optimize code */ + gsl_create_fast_iflow(); + + /* 5- bind a few internal functions */ + gsl_bind_function(currentGoomSL, "charAt", ext_charAt); + gsl_bind_function(currentGoomSL, "f2i", ext_f2i); + gsl_bind_function(currentGoomSL, "i2f", ext_i2f); + free(script_and_externals); + +#ifdef VERBOSE + printf("=== Compilation done. # of lines: %d. # of instr: %d ===\n", currentGoomSL->num_lines, currentGoomSL->iflow->number); +#endif +} /* }}} */ + +void gsl_execute(GoomSL *scanner) +{ /* {{{ */ + if (scanner->compilationOK) { +#if USE_JITC_X86 + scanner->jitc_func(); +#else + iflow_execute(scanner->fastiflow, scanner); +#endif + } +} /* }}} */ + +GoomSL *gsl_new(void) +{ /* {{{ */ + GoomSL *gss = (GoomSL*)malloc(sizeof(GoomSL)); + + gss->iflow = iflow_new(); + gss->vars = goom_hash_new(); + gss->functions = goom_hash_new(); + gss->nbStructID = 0; + gss->structIDS = goom_hash_new(); + gss->gsl_struct_size = 32; + gss->gsl_struct = (GSL_Struct**)malloc(gss->gsl_struct_size * sizeof(GSL_Struct*)); + gss->currentNS = 0; + gss->namespaces[0] = gss->vars; + gss->data_heap = goom_heap_new(); + + reset_scanner(gss); + + gss->compilationOK = 0; + gss->nbPtr=0; + gss->ptrArraySize=256; + gss->ptrArray = (void**)malloc(gss->ptrArraySize * sizeof(void*)); +#ifdef USE_JITC_X86 + gss->jitc = NULL; +#endif + return gss; +} /* }}} */ + +void gsl_bind_function(GoomSL *gss, const char *fname, GoomSL_ExternalFunction func) +{ /* {{{ */ + HashValue *val = goom_hash_get(gss->functions, fname); + if (val) { + ExternalFunctionStruct *gef = (ExternalFunctionStruct*)val->ptr; + gef->function = func; + } + else fprintf(stderr, "Unable to bind function %s\n", fname); +} /* }}} */ + +int gsl_is_compiled(GoomSL *gss) +{ /* {{{ */ + return gss->compilationOK; +} /* }}} */ + +void gsl_free(GoomSL *gss) +{ /* {{{ */ + iflow_free(gss->iflow); + goom_hash_free(gss->vars); + goom_hash_free(gss->functions); + goom_hash_free(gss->structIDS); + free(gss->gsl_struct); + goom_heap_delete(gss->data_heap); + free(gss->ptrArray); + free(gss); +} /* }}} */ + + +static int gsl_nb_import; +static char gsl_already_imported[256][256]; + +char *gsl_init_buffer(const char *fname) +{ + char *fbuffer; + fbuffer = (char*)malloc(512); + fbuffer[0]=0; + gsl_nb_import = 0; + if (fname) + gsl_append_file_to_buffer(fname,&fbuffer); + return fbuffer; +} + +static char *gsl_read_file(const char *fname) +{ + FILE *f; + char *buffer; + int fsize; + f = fopen(fname,"rt"); + if (!f) { + fprintf(stderr, "ERROR: Could not load file %s\n", fname); + exit(1); + } + fseek(f,0,SEEK_END); + fsize = ftell(f); + rewind(f); + buffer = (char*)malloc(fsize+512); + fread(buffer,1,fsize,f); + fclose(f); + buffer[fsize]=0; + return buffer; +} + +void gsl_append_file_to_buffer(const char *fname, char **buffer) +{ + char *fbuffer; + int size,fsize,i=0; + char reset_msg[256]; + + /* look if the file have not been already imported */ + for (i=0;iptr) +#define GSL_LOCAL_INT(gsl,local,name) (*(int*)goom_hash_get(local,name)->ptr) +#define GSL_LOCAL_FLOAT(gsl,local,name) (*(float*)goom_hash_get(local,name)->ptr) + +#define GSL_GLOBAL_PTR(gsl,name) gsl_get_ptr(gsl, *(int*)goom_hash_get(gsl_globals(gsl),name)->ptr) +#define GSL_GLOBAL_INT(gsl,name) (*(int*)goom_hash_get(gsl_globals(gsl),name)->ptr) +#define GSL_GLOBAL_FLOAT(gsl,name) (*(float*)goom_hash_get(gsl_globals(gsl),name)->ptr) + +#endif diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/goomsl_hash.c kodi-visualization-goom-2.1.0/lib/goom/src/goomsl_hash.c --- kodi-visualization-goom-1.1.0/lib/goom/src/goomsl_hash.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/goomsl_hash.c 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,120 @@ +#include "goomsl_hash.h" +#include +#include + +static GoomHashEntry *entry_new(const char *key, HashValue value) { + + int len = strlen(key); + GoomHashEntry *entry = (GoomHashEntry*)malloc(sizeof(GoomHashEntry)); + + entry->key = (char *)malloc(len+1); + memcpy(entry->key,key,len+1); + entry->value = value; + entry->lower = NULL; + entry->upper = NULL; + + return entry; +} + +static void entry_free(GoomHashEntry *entry) { + if (entry!=NULL) { + entry_free(entry->lower); + entry_free(entry->upper); + free(entry->key); + free(entry); + } +} + +static void entry_put(GoomHashEntry *entry, const char *key, HashValue value) { + int cmp = strcmp(key,entry->key); + if (cmp==0) { + entry->value = value; + } + else if (cmp > 0) { + if (entry->upper == NULL) + entry->upper = entry_new(key,value); + else + entry_put(entry->upper, key, value); + } + else { + if (entry->lower == NULL) + entry->lower = entry_new(key,value); + else + entry_put(entry->lower, key, value); + } +} + +static HashValue *entry_get(GoomHashEntry *entry, const char *key) { + + int cmp; + if (entry==NULL) + return NULL; + cmp = strcmp(key,entry->key); + if (cmp > 0) + return entry_get(entry->upper, key); + else if (cmp < 0) + return entry_get(entry->lower, key); + else + return &(entry->value); +} + +GoomHash *goom_hash_new() { + GoomHash *_this = (GoomHash*)malloc(sizeof(GoomHash)); + _this->root = NULL; + _this->number_of_puts = 0; + return _this; +} + +void goom_hash_free(GoomHash *_this) { + entry_free(_this->root); + free(_this); +} + +void goom_hash_put(GoomHash *_this, const char *key, HashValue value) { + _this->number_of_puts += 1; + if (_this->root == NULL) + _this->root = entry_new(key,value); + else + entry_put(_this->root,key,value); +} + +HashValue *goom_hash_get(GoomHash *_this, const char *key) { + if (_this == NULL) return NULL; + return entry_get(_this->root,key); +} + +void goom_hash_put_int(GoomHash *_this, const char *key, int i) { + HashValue value; + value.i = i; + goom_hash_put(_this,key,value); +} + +void goom_hash_put_float(GoomHash *_this, const char *key, float f) { + HashValue value; + value.f = f; + goom_hash_put(_this,key,value); +} + +void goom_hash_put_ptr(GoomHash *_this, const char *key, void *ptr) { + HashValue value; + value.ptr = ptr; + goom_hash_put(_this,key,value); +} + +/* FOR EACH */ + +static void _goom_hash_for_each(GoomHash *_this, GoomHashEntry *entry, GH_Func func) +{ + if (entry == NULL) return; + func(_this, entry->key, &(entry->value)); + _goom_hash_for_each(_this, entry->lower, func); + _goom_hash_for_each(_this, entry->upper, func); +} + +void goom_hash_for_each(GoomHash *_this, GH_Func func) { + _goom_hash_for_each(_this, _this->root, func); +} + +int goom_hash_number_of_puts(GoomHash *_this) { + return _this->number_of_puts; +} diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/goomsl_hash.h kodi-visualization-goom-2.1.0/lib/goom/src/goomsl_hash.h --- kodi-visualization-goom-1.1.0/lib/goom/src/goomsl_hash.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/goomsl_hash.h 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,40 @@ +#ifndef _GOOMSL_HASH_H +#define _GOOMSL_HASH_H + +typedef struct GOOM_HASH_ENTRY GoomHashEntry; +typedef struct GOOM_HASH GoomHash; + +typedef union { + void *ptr; + int i; + float f; +} HashValue; + +struct GOOM_HASH_ENTRY { + char *key; + HashValue value; + GoomHashEntry *lower; + GoomHashEntry *upper; +}; + +struct GOOM_HASH { + GoomHashEntry *root; + int number_of_puts; +}; + +GoomHash *goom_hash_new(); +void goom_hash_free(GoomHash *gh); + +void goom_hash_put(GoomHash *gh, const char *key, HashValue value); +HashValue *goom_hash_get(GoomHash *gh, const char *key); + +void goom_hash_put_int (GoomHash *_this, const char *key, int i); +void goom_hash_put_float(GoomHash *_this, const char *key, float f); +void goom_hash_put_ptr (GoomHash *_this, const char *key, void *ptr); + +typedef void (*GH_Func)(GoomHash *caller, const char *key, HashValue *value); + +void goom_hash_for_each(GoomHash *_this, GH_Func func); +int goom_hash_number_of_puts(GoomHash *_this); + +#endif /* _GOOM_HASH_H */ diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/goomsl_heap.c kodi-visualization-goom-2.1.0/lib/goom/src/goomsl_heap.c --- kodi-visualization-goom-1.1.0/lib/goom/src/goomsl_heap.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/goomsl_heap.c 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,105 @@ +#include "goomsl_heap.h" +#include + +struct _GOOM_HEAP { + void **arrays; + int number_of_arrays; + int size_of_each_array; + int consumed_in_last_array; +}; + +/* Constructors / Destructor */ +GoomHeap *goom_heap_new(void) +{ + return goom_heap_new_with_granularity(4096); +} + +GoomHeap *goom_heap_new_with_granularity(int granularity) +{ + GoomHeap *_this; + _this = (GoomHeap*)malloc(sizeof(GoomHeap)); + _this->number_of_arrays = 0; + _this->size_of_each_array = granularity; + _this->consumed_in_last_array = 0; + _this->arrays = (void**)malloc(sizeof(void*)); + return _this; +} + +void goom_heap_delete(GoomHeap *_this) +{ + int i; + for (i=0;i<_this->number_of_arrays;++i) { + free(_this->arrays[i]); + } + free(_this->arrays); + free(_this); +} + +static void align_it(GoomHeap *_this, int alignment) +{ + if ((alignment > 1) && (_this->number_of_arrays>0)) { + void *last_array = _this->arrays[_this->number_of_arrays - 1]; + int last_address = (int)last_array + _this->consumed_in_last_array; + int decal = (last_address % alignment); + if (decal != 0) { + _this->consumed_in_last_array += alignment - decal; + } + } +} + +void *goom_heap_malloc_with_alignment_prefixed(GoomHeap *_this, int nb_bytes, + int alignment, int prefix_bytes) +{ + void *retval = NULL; + + /* d'abord on gere les problemes d'alignement */ + _this->consumed_in_last_array += prefix_bytes; + align_it(_this, alignment); + + /* ensuite on verifie que la quantite de memoire demandee tient dans le buffer */ + if ((_this->consumed_in_last_array + nb_bytes >= _this->size_of_each_array) + || (_this->number_of_arrays == 0)) { + + if (prefix_bytes + nb_bytes + alignment >= _this->size_of_each_array) { + + /* Si la zone demandee est plus grosse que la granularitee */ + /* On alloue un buffer plus gros que les autres */ + _this->arrays = (void**)realloc(_this->arrays, sizeof(void*) * (_this->number_of_arrays+2)); + + _this->number_of_arrays += 1; + _this->consumed_in_last_array = prefix_bytes; + + _this->arrays[_this->number_of_arrays - 1] = malloc(prefix_bytes + nb_bytes + alignment); + align_it(_this,alignment); + retval = (void*)((char*)_this->arrays[_this->number_of_arrays - 1] + _this->consumed_in_last_array); + + /* puis on repart sur un nouveau buffer vide */ + _this->number_of_arrays += 1; + _this->consumed_in_last_array = 0; + _this->arrays[_this->number_of_arrays - 1] = malloc(_this->size_of_each_array); + return retval; + } + else { + _this->number_of_arrays += 1; + _this->consumed_in_last_array = prefix_bytes; + _this->arrays = (void**)realloc(_this->arrays, sizeof(void*) * _this->number_of_arrays); + + _this->arrays[_this->number_of_arrays - 1] = malloc(_this->size_of_each_array); + align_it(_this,alignment); + } + } + retval = (void*)((char*)_this->arrays[_this->number_of_arrays - 1] + _this->consumed_in_last_array); + _this->consumed_in_last_array += nb_bytes; + return retval; +} + +void *goom_heap_malloc_with_alignment(GoomHeap *_this, int nb_bytes, int alignment) +{ + return goom_heap_malloc_with_alignment_prefixed(_this, nb_bytes, alignment, 0); +} + +void *goom_heap_malloc(GoomHeap *_this, int nb_bytes) +{ + return goom_heap_malloc_with_alignment(_this,nb_bytes,1); +} + diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/goomsl_heap.h kodi-visualization-goom-2.1.0/lib/goom/src/goomsl_heap.h --- kodi-visualization-goom-1.1.0/lib/goom/src/goomsl_heap.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/goomsl_heap.h 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,29 @@ +#ifndef GOOMSL_HEAP +#define GOOMSL_HEAP + +/** + * Resizable Array that guarranty that resizes don't change address of + * the stored datas. + * + * This is implemented as an array of arrays... granularity is the size + * of each arrays. + */ + +typedef struct _GOOM_HEAP GoomHeap; + +/* Constructors / Destructor */ +GoomHeap *goom_heap_new(void); +GoomHeap *goom_heap_new_with_granularity(int granularity); +void goom_heap_delete(GoomHeap *_this); + +/* This method behaves like malloc. */ +void *goom_heap_malloc(GoomHeap *_this, int nb_bytes); +/* This adds an alignment constraint. */ +void *goom_heap_malloc_with_alignment(GoomHeap *_this, int nb_bytes, int alignment); + +/* Returns a pointeur on the bytes... prefix is before */ +void *goom_heap_malloc_with_alignment_prefixed(GoomHeap *_this, int nb_bytes, + int alignment, int prefix_bytes); + +#endif + diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/goomsl_lex.c kodi-visualization-goom-2.1.0/lib/goom/src/goomsl_lex.c --- kodi-visualization-goom-1.1.0/lib/goom/src/goomsl_lex.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/goomsl_lex.c 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,2110 @@ +#line 2 "goomsl_lex.c" + +#line 4 "goomsl_lex.c" + +#define YY_INT_ALIGNED short int + +/* A lexical scanner generated by flex */ + +#define FLEX_SCANNER +#define YY_FLEX_MAJOR_VERSION 2 +#define YY_FLEX_MINOR_VERSION 5 +#define YY_FLEX_SUBMINOR_VERSION 31 +#if YY_FLEX_SUBMINOR_VERSION > 0 +#define FLEX_BETA +#endif + +/* First, we deal with platform-specific or compiler-specific issues. */ + +/* begin standard C headers. */ +#include +#include +#include +#include + +/* end standard C headers. */ + +/* flex integer type definitions */ + +#ifndef FLEXINT_H +#define FLEXINT_H + +/* C99 systems have . Non-C99 systems may or may not. */ + +#if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L +#include +typedef int8_t flex_int8_t; +typedef uint8_t flex_uint8_t; +typedef int16_t flex_int16_t; +typedef uint16_t flex_uint16_t; +typedef int32_t flex_int32_t; +typedef uint32_t flex_uint32_t; +#else +typedef signed char flex_int8_t; +typedef short int flex_int16_t; +typedef int flex_int32_t; +typedef unsigned char flex_uint8_t; +typedef unsigned short int flex_uint16_t; +typedef unsigned int flex_uint32_t; +#endif /* ! C99 */ + +/* Limits of integral types. */ +#ifndef INT8_MIN +#define INT8_MIN (-128) +#endif +#ifndef INT16_MIN +#define INT16_MIN (-32767-1) +#endif +#ifndef INT32_MIN +#define INT32_MIN (-2147483647-1) +#endif +#ifndef INT8_MAX +#define INT8_MAX (127) +#endif +#ifndef INT16_MAX +#define INT16_MAX (32767) +#endif +#ifndef INT32_MAX +#define INT32_MAX (2147483647) +#endif +#ifndef UINT8_MAX +#define UINT8_MAX (255U) +#endif +#ifndef UINT16_MAX +#define UINT16_MAX (65535U) +#endif +#ifndef UINT32_MAX +#define UINT32_MAX (4294967295U) +#endif + +#endif /* ! FLEXINT_H */ + +#ifdef __cplusplus + +/* The "const" storage-class-modifier is valid. */ +#define YY_USE_CONST + +#else /* ! __cplusplus */ + +#if __STDC__ + +#define YY_USE_CONST + +#endif /* __STDC__ */ +#endif /* ! __cplusplus */ + +#ifdef YY_USE_CONST +#define yyconst const +#else +#define yyconst +#endif + +/* Returned upon end-of-file. */ +#define YY_NULL 0 + +/* Promotes a possibly negative, possibly signed char to an unsigned + * integer for use as an array index. If the signed char is negative, + * we want to instead treat it as an 8-bit unsigned char, hence the + * double cast. + */ +#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) + +/* Enter a start condition. This macro really ought to take a parameter, + * but we do it the disgusting crufty way forced on us by the ()-less + * definition of BEGIN. + */ +#define BEGIN (yy_start) = 1 + 2 * + +/* Translate the current start state into a value that can be later handed + * to BEGIN to return to the state. The YYSTATE alias is for lex + * compatibility. + */ +#define YY_START (((yy_start) - 1) / 2) +#define YYSTATE YY_START + +/* Action number for EOF rule of a given start state. */ +#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) + +/* Special action meaning "start processing a new file". */ +#define YY_NEW_FILE yyrestart(yyin ) + +#define YY_END_OF_BUFFER_CHAR 0 + +/* Size of default input buffer. */ +#ifndef YY_BUF_SIZE +#define YY_BUF_SIZE 16384 +#endif + +#ifndef YY_TYPEDEF_YY_BUFFER_STATE +#define YY_TYPEDEF_YY_BUFFER_STATE +typedef struct yy_buffer_state *YY_BUFFER_STATE; +#endif + +extern int yyleng; + +extern FILE *yyin, *yyout; + +#define EOB_ACT_CONTINUE_SCAN 0 +#define EOB_ACT_END_OF_FILE 1 +#define EOB_ACT_LAST_MATCH 2 + + /* Note: We specifically omit the test for yy_rule_can_match_eol because it requires + * access to the local variable yy_act. Since yyless() is a macro, it would break + * existing scanners that call yyless() from OUTSIDE yylex. + * One obvious solution it to make yy_act a global. I tried that, and saw + * a 5% performance hit in a non-yylineno scanner, because yy_act is + * normally declared as a register variable-- so it is not worth it. + */ + #define YY_LESS_LINENO(n) \ + do { \ + int yyl;\ + for ( yyl = n; yyl < yyleng; ++yyl )\ + if ( yytext[yyl] == '\n' )\ + --yylineno;\ + }while(0) + +/* Return all but the first "n" matched characters back to the input stream. */ +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + int yyless_macro_arg = (n); \ + YY_LESS_LINENO(yyless_macro_arg);\ + *yy_cp = (yy_hold_char); \ + YY_RESTORE_YY_MORE_OFFSET \ + (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ + YY_DO_BEFORE_ACTION; /* set up yytext again */ \ + } \ + while ( 0 ) + +#define unput(c) yyunput( c, (yytext_ptr) ) + +/* The following is because we cannot portably get our hands on size_t + * (without autoconf's help, which isn't available because we want + * flex-generated scanners to compile on their own). + */ + +#ifndef YY_TYPEDEF_YY_SIZE_T +#define YY_TYPEDEF_YY_SIZE_T +typedef unsigned int yy_size_t; +#endif + +#ifndef YY_STRUCT_YY_BUFFER_STATE +#define YY_STRUCT_YY_BUFFER_STATE +struct yy_buffer_state + { + FILE *yy_input_file; + + char *yy_ch_buf; /* input buffer */ + char *yy_buf_pos; /* current position in input buffer */ + + /* Size of input buffer in bytes, not including room for EOB + * characters. + */ + yy_size_t yy_buf_size; + + /* Number of characters read into yy_ch_buf, not including EOB + * characters. + */ + int yy_n_chars; + + /* Whether we "own" the buffer - i.e., we know we created it, + * and can realloc() it to grow it, and should free() it to + * delete it. + */ + int yy_is_our_buffer; + + /* Whether this is an "interactive" input source; if so, and + * if we're using stdio for input, then we want to use getc() + * instead of fread(), to make sure we stop fetching input after + * each newline. + */ + int yy_is_interactive; + + /* Whether we're considered to be at the beginning of a line. + * If so, '^' rules will be active on the next match, otherwise + * not. + */ + int yy_at_bol; + + int yy_bs_lineno; /**< The line count. */ + int yy_bs_column; /**< The column count. */ + + /* Whether to try to fill the input buffer when we reach the + * end of it. + */ + int yy_fill_buffer; + + int yy_buffer_status; + +#define YY_BUFFER_NEW 0 +#define YY_BUFFER_NORMAL 1 + /* When an EOF's been seen but there's still some text to process + * then we mark the buffer as YY_EOF_PENDING, to indicate that we + * shouldn't try reading from the input source any more. We might + * still have a bunch of tokens to match, though, because of + * possible backing-up. + * + * When we actually see the EOF, we change the status to "new" + * (via yyrestart()), so that the user can continue scanning by + * just pointing yyin at a new input file. + */ +#define YY_BUFFER_EOF_PENDING 2 + + }; +#endif /* !YY_STRUCT_YY_BUFFER_STATE */ + +/* Stack of input buffers. */ +static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */ +static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */ +static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */ + +/* We provide macros for accessing buffer states in case in the + * future we want to put the buffer states in a more general + * "scanner state". + * + * Returns the top of the stack, or NULL. + */ +#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ + ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ + : NULL) + +/* Same as previous macro, but useful when we know that the buffer stack is not + * NULL or when we need an lvalue. For internal use only. + */ +#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] + +/* yy_hold_char holds the character lost when yytext is formed. */ +static char yy_hold_char; +static int yy_n_chars; /* number of characters read into yy_ch_buf */ +int yyleng; + +/* Points to current character in buffer. */ +static char *yy_c_buf_p = (char *) 0; +static int yy_init = 1; /* whether we need to initialize */ +static int yy_start = 0; /* start state number */ + +/* Flag which is used to allow yywrap()'s to do buffer switches + * instead of setting up a fresh yyin. A bit of a hack ... + */ +static int yy_did_buffer_switch_on_eof; + +void yyrestart (FILE *input_file ); +void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ); +YY_BUFFER_STATE yy_create_buffer (FILE *file,int size ); +void yy_delete_buffer (YY_BUFFER_STATE b ); +void yy_flush_buffer (YY_BUFFER_STATE b ); +void yypush_buffer_state (YY_BUFFER_STATE new_buffer ); +void yypop_buffer_state (void ); + +static void yyensure_buffer_stack (void ); +static void yy_load_buffer_state (void ); +static void yy_init_buffer (YY_BUFFER_STATE b,FILE *file ); + +#define YY_FLUSH_BUFFER yy_flush_buffer(YY_CURRENT_BUFFER ) + +YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size ); +YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str ); +YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,int len ); + +void *yyalloc (yy_size_t ); +void *yyrealloc (void *,yy_size_t ); +void yyfree (void * ); + +#define yy_new_buffer yy_create_buffer + +#define yy_set_interactive(is_interactive) \ + { \ + if ( ! YY_CURRENT_BUFFER ){ \ + yyensure_buffer_stack (); \ + YY_CURRENT_BUFFER_LVALUE = \ + yy_create_buffer(yyin,YY_BUF_SIZE ); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ + } + +#define yy_set_bol(at_bol) \ + { \ + if ( ! YY_CURRENT_BUFFER ){\ + yyensure_buffer_stack (); \ + YY_CURRENT_BUFFER_LVALUE = \ + yy_create_buffer(yyin,YY_BUF_SIZE ); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ + } + +#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) + +/* Begin user sect3 */ + +typedef unsigned char YY_CHAR; + +FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; + +typedef int yy_state_type; + +#define YY_FLEX_LEX_COMPAT +extern int yylineno; + +int yylineno = 1; + +extern char yytext[]; + +static yy_state_type yy_get_previous_state (void ); +static yy_state_type yy_try_NUL_trans (yy_state_type current_state ); +static int yy_get_next_buffer (void ); +static void yy_fatal_error (yyconst char msg[] ); + +/* Done after the current pattern has been matched and before the + * corresponding action - sets up yytext. + */ +#define YY_DO_BEFORE_ACTION \ + (yytext_ptr) = yy_bp; \ + yyleng = (size_t) (yy_cp - yy_bp); \ + (yy_hold_char) = *yy_cp; \ + *yy_cp = '\0'; \ + if ( yyleng + (yy_more_offset) >= YYLMAX ) \ + YY_FATAL_ERROR( "token too large, exceeds YYLMAX" ); \ + yy_flex_strncpy( &yytext[(yy_more_offset)], (yytext_ptr), yyleng + 1 ); \ + yyleng += (yy_more_offset); \ + (yy_prev_more_offset) = (yy_more_offset); \ + (yy_more_offset) = 0; \ + (yy_c_buf_p) = yy_cp; + +#define YY_NUM_RULES 49 +#define YY_END_OF_BUFFER 50 +/* This struct is not used in this scanner, + but its presence is necessary. */ +struct yy_trans_info + { + flex_int32_t yy_verify; + flex_int32_t yy_nxt; + }; +static yyconst flex_int16_t yy_acclist[214] = + { 0, + 50, 48, 49, 47, 48, 49, 4, 49, 48, 49, + 13, 48, 49, 10, 48, 49, 33, 48, 49, 48, + 49, 48, 49, 48, 49, 48, 49, 48, 49, 34, + 48, 49, 34, 48, 49, 48, 49, 48, 49, 33, + 48, 49, 33, 48, 49, 33, 48, 49, 33, 48, + 49, 33, 48, 49, 33, 48, 49, 33, 48, 49, + 33, 48, 49, 33, 48, 49, 33, 48, 49, 47, + 48, 49, 1, 4, 49, 48, 49, 7, 49, 6, + 49, 7, 49, 7, 49, 1, 6, 49, 7, 49, + 3, 49, 1, 3, 49, 17, 49, 49, 16, 17, + + 49, 17, 49, 47, 45, 10, 10, 10, 33, 40, + 39, 41, 11, 12, 42, 38, 37, 34, 43, 46, + 44, 33, 33, 28, 33, 33, 33, 33, 33, 30, + 33, 33, 33, 33, 33, 33, 47, 1, 12, 5, + 15, 14, 10, 10, 35, 37, 36, 33, 33, 33, + 33, 33, 29, 33, 19, 33, 26, 33, 21, 33, + 33, 33, 33, 2, 10, 10, 33, 33, 33, 33, + 33, 33, 33, 31, 33, 33, 10, 10, 33, 33, + 33, 32, 33, 18, 33, 33, 33, 27, 33, 10, + 10, 33, 33, 33, 22, 33, 25, 33, 10, 9, + + 10, 10, 20, 33, 23, 33, 33, 10, 24, 33, + 10, 8, 10 + } ; + +static yyconst flex_int16_t yy_accept[152] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, + 4, 7, 9, 11, 14, 17, 20, 22, 24, 26, + 28, 30, 33, 36, 38, 40, 43, 46, 49, 52, + 55, 58, 61, 64, 67, 70, 73, 76, 78, 80, + 82, 84, 86, 89, 91, 93, 96, 98, 99, 102, + 104, 105, 106, 107, 108, 109, 110, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 119, 120, 121, + 122, 123, 124, 126, 127, 128, 129, 130, 132, 133, + 134, 135, 136, 137, 138, 139, 139, 140, 141, 141, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + + 151, 152, 153, 155, 157, 159, 161, 162, 163, 164, + 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 176, 177, 178, 179, 180, 181, 182, 184, 186, + 187, 188, 190, 191, 192, 193, 194, 195, 197, 199, + 200, 202, 203, 205, 207, 208, 209, 211, 212, 214, + 214 + } ; + +static yyconst flex_int32_t yy_ec[256] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 4, 5, 6, 7, 1, 8, 9, 10, 1, + 1, 11, 12, 1, 13, 14, 15, 16, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 1, 1, 18, + 19, 20, 1, 9, 21, 21, 21, 21, 22, 23, + 21, 21, 24, 21, 21, 25, 21, 26, 21, 21, + 21, 27, 28, 29, 21, 21, 21, 21, 21, 21, + 1, 30, 1, 1, 31, 1, 32, 33, 34, 35, + + 36, 37, 38, 39, 40, 21, 21, 41, 21, 42, + 43, 44, 21, 45, 46, 47, 48, 21, 49, 50, + 21, 21, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1 + } ; + +static yyconst flex_int32_t yy_meta[51] = + { 0, + 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 3, 1, 4, 4, 1, 1, 1, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, + 3, 4, 4, 4, 4, 4, 4, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 + } ; + +static yyconst flex_int16_t yy_base[159] = + { 0, + 0, 49, 51, 54, 221, 57, 60, 64, 223, 225, + 69, 225, 203, 225, 51, 0, 0, 202, 201, 200, + 64, 68, 72, 72, 199, 174, 57, 166, 55, 173, + 171, 166, 165, 166, 171, 99, 225, 93, 225, 225, + 194, 107, 225, 193, 225, 225, 225, 225, 225, 71, + 93, 225, 0, 183, 178, 0, 195, 225, 225, 225, + 225, 225, 225, 225, 89, 107, 0, 225, 225, 225, + 161, 169, 0, 155, 160, 157, 154, 151, 150, 151, + 150, 146, 153, 123, 225, 177, 188, 225, 126, 187, + 225, 225, 164, 159, 225, 100, 0, 146, 145, 149, + + 138, 151, 0, 0, 0, 0, 59, 146, 140, 177, + 225, 157, 147, 141, 144, 130, 138, 126, 130, 137, + 0, 134, 165, 143, 133, 112, 109, 0, 0, 102, + 92, 0, 130, 112, 93, 98, 101, 0, 0, 125, + 124, 94, 0, 0, 78, 59, 0, 61, 0, 225, + 141, 145, 149, 151, 155, 51, 159, 163 + } ; + +static yyconst flex_int16_t yy_def[159] = + { 0, + 150, 1, 151, 151, 151, 151, 152, 152, 150, 150, + 150, 150, 150, 150, 153, 154, 155, 150, 150, 150, + 150, 150, 150, 150, 150, 154, 154, 154, 154, 154, + 154, 154, 154, 154, 154, 150, 150, 150, 150, 150, + 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, + 150, 150, 153, 153, 153, 154, 150, 150, 150, 150, + 150, 150, 150, 150, 150, 150, 156, 150, 150, 150, + 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, + 154, 154, 154, 150, 150, 150, 157, 150, 150, 157, + 150, 150, 153, 153, 150, 150, 156, 154, 154, 154, + + 154, 154, 154, 154, 154, 154, 154, 154, 154, 157, + 150, 153, 153, 154, 154, 154, 154, 154, 154, 154, + 154, 154, 153, 153, 154, 154, 154, 154, 154, 154, + 154, 154, 158, 153, 154, 154, 154, 154, 154, 158, + 158, 153, 154, 154, 154, 153, 154, 153, 153, 0, + 150, 150, 150, 150, 150, 150, 150, 150 + } ; + +static yyconst flex_int16_t yy_nxt[276] = + { 0, + 10, 11, 12, 11, 13, 14, 15, 10, 16, 17, + 18, 19, 20, 10, 21, 22, 23, 24, 10, 25, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 10, + 16, 16, 26, 16, 27, 28, 29, 16, 16, 30, + 16, 31, 16, 32, 16, 33, 34, 16, 35, 16, + 36, 37, 36, 40, 97, 42, 43, 42, 42, 46, + 42, 41, 48, 38, 41, 49, 48, 149, 44, 49, + 51, 44, 51, 54, 61, 64, 91, 55, 62, 64, + 148, 65, 63, 66, 66, 65, 75, 66, 66, 50, + 68, 69, 72, 50, 51, 76, 51, 77, 119, 73, + + 84, 85, 84, 61, 96, 96, 120, 87, 89, 85, + 89, 63, 92, 86, 64, 96, 96, 67, 147, 146, + 65, 86, 66, 66, 84, 85, 84, 89, 85, 89, + 141, 141, 145, 144, 143, 142, 141, 86, 139, 138, + 86, 39, 39, 39, 39, 47, 47, 47, 47, 53, + 137, 53, 53, 56, 56, 57, 136, 57, 57, 110, + 110, 110, 110, 140, 135, 140, 140, 134, 133, 132, + 131, 130, 129, 128, 127, 126, 125, 124, 123, 111, + 122, 121, 118, 117, 116, 115, 114, 113, 112, 111, + 111, 90, 109, 108, 107, 106, 105, 104, 103, 102, + + 101, 100, 99, 98, 95, 94, 93, 90, 88, 83, + 82, 81, 80, 79, 78, 74, 71, 70, 60, 59, + 58, 52, 150, 45, 9, 150, 150, 150, 150, 150, + 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, + 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, + 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, + 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, + 150, 150, 150, 150, 150 + } ; + +static yyconst flex_int16_t yy_chk[276] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 2, 2, 3, 156, 4, 4, 4, 6, 6, + 6, 3, 7, 2, 4, 7, 8, 148, 4, 8, + 11, 6, 11, 15, 21, 22, 50, 15, 21, 23, + 146, 22, 21, 22, 22, 23, 29, 23, 23, 7, + 24, 24, 27, 8, 51, 29, 51, 29, 107, 27, + + 36, 36, 36, 38, 65, 65, 107, 38, 42, 42, + 42, 38, 50, 36, 66, 96, 96, 22, 145, 142, + 66, 42, 66, 66, 84, 84, 84, 89, 89, 89, + 141, 140, 137, 136, 135, 134, 133, 84, 131, 130, + 89, 151, 151, 151, 151, 152, 152, 152, 152, 153, + 127, 153, 153, 154, 154, 155, 126, 155, 155, 157, + 157, 157, 157, 158, 125, 158, 158, 124, 123, 122, + 120, 119, 118, 117, 116, 115, 114, 113, 112, 110, + 109, 108, 102, 101, 100, 99, 98, 94, 93, 90, + 87, 86, 83, 82, 81, 80, 79, 78, 77, 76, + + 75, 74, 72, 71, 57, 55, 54, 44, 41, 35, + 34, 33, 32, 31, 30, 28, 26, 25, 20, 19, + 18, 13, 9, 5, 150, 150, 150, 150, 150, 150, + 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, + 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, + 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, + 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, + 150, 150, 150, 150, 150 + } ; + +/* Table of booleans, true if rule could match eol. */ +static yyconst flex_int32_t yy_rule_can_match_eol[50] = + { 0, +1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; + +extern int yy_flex_debug; +int yy_flex_debug = 0; + +static yy_state_type *yy_state_buf=0, *yy_state_ptr=0; +static char *yy_full_match; +static int yy_lp; +#define REJECT \ +{ \ +*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */ \ +yy_cp = (yy_full_match); /* restore poss. backed-over text */ \ +++(yy_lp); \ +goto find_rule; \ +} + +static int yy_more_offset = 0; +static int yy_prev_more_offset = 0; +#define yymore() ((yy_more_offset) = yy_flex_strlen( yytext )) +#define YY_NEED_STRLEN +#define YY_MORE_ADJ 0 +#define YY_RESTORE_YY_MORE_OFFSET \ + { \ + (yy_more_offset) = (yy_prev_more_offset); \ + yyleng -= (yy_more_offset); \ + } +#ifndef YYLMAX +#define YYLMAX 8192 +#endif + +char yytext[YYLMAX]; +char *yytext_ptr; +#line 1 "goomsl_lex.l" +#line 2 "goomsl_lex.l" + +#include +#include +#include +#include "goomsl.h" +#include "goomsl_private.h" +#include "goomsl_yacc.h" +void yyerror(char *); +void yyparse(void); + +GoomSL *currentGoomSL; +static int string_size; +static char string[1024]; + + + +#line 639 "goomsl_lex.c" + +#define INITIAL 0 +#define C_COMMENT 1 +#define LINE_COMMENT 2 +#define STRING 3 + +/* Special case for "unistd.h", since it is non-ANSI. We include it way + * down here because we want the user's section 1 to have been scanned first. + * The user has a chance to override it with an option. + */ +#ifndef _WIN32PC +#include +#endif + +#ifndef YY_EXTRA_TYPE +#define YY_EXTRA_TYPE void * +#endif + +/* Macros after this point can all be overridden by user definitions in + * section 1. + */ + +#ifndef YY_SKIP_YYWRAP +#ifdef __cplusplus +extern "C" int yywrap (void ); +#else +extern int yywrap (void ); +#endif +#endif + + static void yyunput (int c,char *buf_ptr ); + +#ifndef yytext_ptr +static void yy_flex_strncpy (char *,yyconst char *,int ); +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen (yyconst char * ); +#endif + +#ifndef YY_NO_INPUT + +#ifdef __cplusplus +static int yyinput (void ); +#else +static int input (void ); +#endif + +#endif + +/* Amount of stuff to slurp up with each read. */ +#ifndef YY_READ_BUF_SIZE +#define YY_READ_BUF_SIZE 8192 +#endif + +/* Copy whatever the last rule matched to the standard output. */ +#ifndef ECHO +/* This used to be an fputs(), but since the string might contain NUL's, + * we now use fwrite(). + */ +#define ECHO (void) fwrite( yytext, yyleng, 1, yyout ) +#endif + +/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, + * is returned in "result". + */ +#ifndef YY_INPUT +#define YY_INPUT(buf,result,max_size) \ + if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ + { \ + int c = '*'; \ + size_t n; \ + for ( n = 0; n < max_size && \ + (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ + buf[n] = (char) c; \ + if ( c == '\n' ) \ + buf[n++] = (char) c; \ + if ( c == EOF && ferror( yyin ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + result = n; \ + } \ + else \ + { \ + errno=0; \ + while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \ + { \ + if( errno != EINTR) \ + { \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + break; \ + } \ + errno=0; \ + clearerr(yyin); \ + } \ + }\ +\ + +#endif + +/* No semi-colon after return; correct usage is to write "yyterminate();" - + * we don't want an extra ';' after the "return" because that will cause + * some compilers to complain about unreachable statements. + */ +#ifndef yyterminate +#define yyterminate() return YY_NULL +#endif + +/* Number of entries by which start-condition stack grows. */ +#ifndef YY_START_STACK_INCR +#define YY_START_STACK_INCR 25 +#endif + +/* Report a fatal error. */ +#ifndef YY_FATAL_ERROR +#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) +#endif + +/* end tables serialization structures and prototypes */ + +/* Default declaration of generated scanner - a define so the user can + * easily add parameters. + */ +#ifndef YY_DECL +#define YY_DECL_IS_OURS 1 + +extern int yylex (void); + +#define YY_DECL int yylex (void) +#endif /* !YY_DECL */ + +/* Code executed at the beginning of each rule, after yytext and yyleng + * have been set up. + */ +#ifndef YY_USER_ACTION +#define YY_USER_ACTION +#endif + +/* Code executed at the end of each rule. */ +#ifndef YY_BREAK +#define YY_BREAK break; +#endif + +#define YY_RULE_SETUP \ + if ( yyleng > 0 ) \ + YY_CURRENT_BUFFER_LVALUE->yy_at_bol = \ + (yytext[yyleng - 1] == '\n'); \ + YY_USER_ACTION + +/** The main scanner function which does all the work. + */ +YY_DECL +{ + register yy_state_type yy_current_state; + register char *yy_cp, *yy_bp; + register int yy_act; + +#line 25 "goomsl_lex.l" + + +#line 797 "goomsl_lex.c" + + if ( (yy_init) ) + { + (yy_init) = 0; + +#ifdef YY_USER_INIT + YY_USER_INIT; +#endif + + if ( ! (yy_state_buf) ) + (yy_state_buf) = (yy_state_type *)yyalloc(YY_BUF_SIZE + 2 ); + + if ( ! (yy_start) ) + (yy_start) = 1; /* first start state */ + + if ( ! yyin ) + yyin = stdin; + + if ( ! yyout ) + yyout = stdout; + + if ( ! YY_CURRENT_BUFFER ) { + yyensure_buffer_stack (); + YY_CURRENT_BUFFER_LVALUE = + yy_create_buffer(yyin,YY_BUF_SIZE ); + } + + yy_load_buffer_state( ); + } + + while ( 1 ) /* loops until end-of-file is reached */ + { + yy_cp = (yy_c_buf_p); + + /* Support of yytext. */ + *yy_cp = (yy_hold_char); + + /* yy_bp points to the position in yy_ch_buf of the start of + * the current run. + */ + yy_bp = yy_cp; + + yy_current_state = (yy_start); + yy_current_state += YY_AT_BOL(); + + (yy_state_ptr) = (yy_state_buf); + *(yy_state_ptr)++ = yy_current_state; + +yy_match: + do + { + register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 151 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + *(yy_state_ptr)++ = yy_current_state; + ++yy_cp; + } + while ( yy_base[yy_current_state] != 225 ); + +yy_find_action: + yy_current_state = *--(yy_state_ptr); + (yy_lp) = yy_accept[yy_current_state]; +find_rule: /* we branch to this label when backing up */ + for ( ; ; ) /* until we find what rule we matched */ + { + if ( (yy_lp) && (yy_lp) < yy_accept[yy_current_state + 1] ) + { + yy_act = yy_acclist[(yy_lp)]; + { + (yy_full_match) = yy_cp; + break; + } + } + --yy_cp; + yy_current_state = *--(yy_state_ptr); + (yy_lp) = yy_accept[yy_current_state]; + } + + YY_DO_BEFORE_ACTION; + + if ( yy_act != YY_END_OF_BUFFER && yy_rule_can_match_eol[yy_act] ) + { + int yyl; + for ( yyl = (yy_prev_more_offset); yyl < yyleng; ++yyl ) + if ( yytext[yyl] == '\n' ) + + yylineno++; +; + } + +do_action: /* This label is used only to access EOF actions. */ + + switch ( yy_act ) + { /* beginning of action switch */ +case 1: +/* rule 1 can match eol */ +YY_RULE_SETUP +#line 27 "goomsl_lex.l" +{ ++currentGoomSL->num_lines; /* Ignore empty lines */ } + YY_BREAK +case 2: +/* rule 2 can match eol */ +YY_RULE_SETUP +#line 28 "goomsl_lex.l" +{ ++currentGoomSL->num_lines; /* Ignore empty lines */ } + YY_BREAK +case 3: +/* rule 3 can match eol */ +YY_RULE_SETUP +#line 30 "goomsl_lex.l" +{ ++currentGoomSL->num_lines; yylval.charValue=*yytext; BEGIN INITIAL; return '\n'; } + YY_BREAK +case 4: +/* rule 4 can match eol */ +YY_RULE_SETUP +#line 31 "goomsl_lex.l" +{ ++currentGoomSL->num_lines; yylval.charValue=*yytext; return '\n'; } + YY_BREAK +case 5: +YY_RULE_SETUP +#line 33 "goomsl_lex.l" +{ BEGIN INITIAL; } + YY_BREAK +case 6: +/* rule 6 can match eol */ +YY_RULE_SETUP +#line 34 "goomsl_lex.l" +{ ++currentGoomSL->num_lines; } + YY_BREAK +case 7: +YY_RULE_SETUP +#line 35 "goomsl_lex.l" +{ /* eat up comment */ } + YY_BREAK +case 8: +YY_RULE_SETUP +#line 37 "goomsl_lex.l" +{ currentGoomSL->num_lines = 0; } + YY_BREAK +case 9: +YY_RULE_SETUP +#line 38 "goomsl_lex.l" +{ currentGoomSL->num_lines = 0; printf("%s\n", yytext); } + YY_BREAK +case 10: +YY_RULE_SETUP +#line 39 "goomsl_lex.l" +{ /* ignore preprocessor lines */ } + YY_BREAK +case 11: +YY_RULE_SETUP +#line 41 "goomsl_lex.l" +{ BEGIN C_COMMENT; } + YY_BREAK +case 12: +YY_RULE_SETUP +#line 42 "goomsl_lex.l" +{ BEGIN LINE_COMMENT; } + YY_BREAK +case 13: +YY_RULE_SETUP +#line 43 "goomsl_lex.l" +{ BEGIN STRING; string_size=0; } + YY_BREAK +case 14: +YY_RULE_SETUP +#line 45 "goomsl_lex.l" +{ string[string_size++] = '\n'; } + YY_BREAK +case 15: +YY_RULE_SETUP +#line 46 "goomsl_lex.l" +{ string[string_size++] = '\"'; } + YY_BREAK +case 16: +YY_RULE_SETUP +#line 47 "goomsl_lex.l" +{ /* fin de la chaine: on cree le pointeur qui va bien */ + unsigned int tmp; + BEGIN INITIAL; + string[string_size]=0; + tmp = gsl_malloc(currentGoomSL, string_size+1); + strcpy((char*)currentGoomSL->ptrArray[tmp],string); + sprintf(yylval.strValue, "0x%08x", tmp); + return LTYPE_PTR; + } + YY_BREAK +case 17: +YY_RULE_SETUP +#line 56 "goomsl_lex.l" +{ string[string_size++] = *yytext; } + YY_BREAK +case 18: +YY_RULE_SETUP +#line 58 "goomsl_lex.l" +{ return FLOAT_TK; } + YY_BREAK +case 19: +YY_RULE_SETUP +#line 59 "goomsl_lex.l" +{ return INT_TK; } + YY_BREAK +case 20: +YY_RULE_SETUP +#line 60 "goomsl_lex.l" +{ return INT_TK; } + YY_BREAK +case 21: +YY_RULE_SETUP +#line 61 "goomsl_lex.l" +{ return PTR_TK; } + YY_BREAK +case 22: +YY_RULE_SETUP +#line 62 "goomsl_lex.l" +{ return PTR_TK; } + YY_BREAK +case 23: +YY_RULE_SETUP +#line 63 "goomsl_lex.l" +{ return DECLARE; } + YY_BREAK +case 24: +YY_RULE_SETUP +#line 64 "goomsl_lex.l" +{ return EXTERNAL; } + YY_BREAK +case 25: +YY_RULE_SETUP +#line 65 "goomsl_lex.l" +{ return STRUCT; } + YY_BREAK +case 26: +YY_RULE_SETUP +#line 66 "goomsl_lex.l" +{ return NOT; } + YY_BREAK +case 27: +YY_RULE_SETUP +#line 67 "goomsl_lex.l" +{ return WHILE; } + YY_BREAK +case 28: +YY_RULE_SETUP +#line 68 "goomsl_lex.l" +{ return DO; } + YY_BREAK +case 29: +YY_RULE_SETUP +#line 69 "goomsl_lex.l" +{ return FOR; } + YY_BREAK +case 30: +YY_RULE_SETUP +#line 70 "goomsl_lex.l" +{ return IN; } + YY_BREAK +case 31: +YY_RULE_SETUP +#line 71 "goomsl_lex.l" +{ strncpy(yylval.strValue, "1", 2047); return LTYPE_INTEGER; } + YY_BREAK +case 32: +YY_RULE_SETUP +#line 72 "goomsl_lex.l" +{ strncpy(yylval.strValue, "0", 2047); return LTYPE_INTEGER; } + YY_BREAK +case 33: +YY_RULE_SETUP +#line 73 "goomsl_lex.l" +{ strncpy(yylval.strValue, yytext, 2047); return LTYPE_VAR; } + YY_BREAK +case 34: +YY_RULE_SETUP +#line 74 "goomsl_lex.l" +{ strncpy(yylval.strValue, yytext, 2047); return LTYPE_INTEGER; } + YY_BREAK +case 35: +YY_RULE_SETUP +#line 75 "goomsl_lex.l" +{ sprintf(yylval.strValue, "%d", (int)yytext[1]); return LTYPE_INTEGER; } + YY_BREAK +case 36: +YY_RULE_SETUP +#line 76 "goomsl_lex.l" +{ strncpy(yylval.strValue, yytext, 2047); return LTYPE_INTEGER; } + YY_BREAK +case 37: +YY_RULE_SETUP +#line 77 "goomsl_lex.l" +{ strncpy(yylval.strValue, yytext, 2047); return LTYPE_FLOAT; } + YY_BREAK +case 38: +YY_RULE_SETUP +#line 78 "goomsl_lex.l" +{ sprintf(yylval.strValue, "%3.2f", atof(yytext)/100.0f); return LTYPE_FLOAT; } + YY_BREAK +case 39: +YY_RULE_SETUP +#line 79 "goomsl_lex.l" +{ return PLUS_EQ; } + YY_BREAK +case 40: +YY_RULE_SETUP +#line 80 "goomsl_lex.l" +{ return MUL_EQ; } + YY_BREAK +case 41: +YY_RULE_SETUP +#line 81 "goomsl_lex.l" +{ return SUB_EQ; } + YY_BREAK +case 42: +YY_RULE_SETUP +#line 82 "goomsl_lex.l" +{ return DIV_EQ; } + YY_BREAK +case 43: +YY_RULE_SETUP +#line 83 "goomsl_lex.l" +{ return LOW_EQ; } + YY_BREAK +case 44: +YY_RULE_SETUP +#line 84 "goomsl_lex.l" +{ return SUP_EQ; } + YY_BREAK +case 45: +YY_RULE_SETUP +#line 85 "goomsl_lex.l" +{ return NOT_EQ; } + YY_BREAK +case 46: +YY_RULE_SETUP +#line 86 "goomsl_lex.l" +{ return NOT_EQ; } + YY_BREAK +case 47: +YY_RULE_SETUP +#line 87 "goomsl_lex.l" +/* eat up whitespace */ + YY_BREAK +case 48: +YY_RULE_SETUP +#line 88 "goomsl_lex.l" +{ yylval.charValue = *yytext; return *yytext; } + YY_BREAK +case 49: +YY_RULE_SETUP +#line 90 "goomsl_lex.l" +ECHO; + YY_BREAK +#line 1155 "goomsl_lex.c" + case YY_STATE_EOF(INITIAL): + case YY_STATE_EOF(C_COMMENT): + case YY_STATE_EOF(LINE_COMMENT): + case YY_STATE_EOF(STRING): + yyterminate(); + + case YY_END_OF_BUFFER: + { + /* Amount of text matched not including the EOB char. */ + int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; + + /* Undo the effects of YY_DO_BEFORE_ACTION. */ + *yy_cp = (yy_hold_char); + YY_RESTORE_YY_MORE_OFFSET + + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) + { + /* We're scanning a new file or input source. It's + * possible that this happened because the user + * just pointed yyin at a new source and called + * yylex(). If so, then we have to assure + * consistency between YY_CURRENT_BUFFER and our + * globals. Here is the right place to do so, because + * this is the first action (other than possibly a + * back-up) that will match for the new input source. + */ + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; + } + + /* Note that here we test for yy_c_buf_p "<=" to the position + * of the first EOB in the buffer, since yy_c_buf_p will + * already have been incremented past the NUL character + * (since all states make transitions on EOB to the + * end-of-buffer state). Contrast this with the test + * in input(). + */ + if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) + { /* This was really a NUL. */ + yy_state_type yy_next_state; + + (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state( ); + + /* Okay, we're now positioned to make the NUL + * transition. We couldn't have + * yy_get_previous_state() go ahead and do it + * for us because it doesn't know how to deal + * with the possibility of jamming (and we don't + * want to build jamming into it because then it + * will run more slowly). + */ + + yy_next_state = yy_try_NUL_trans( yy_current_state ); + + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + + if ( yy_next_state ) + { + /* Consume the NUL. */ + yy_cp = ++(yy_c_buf_p); + yy_current_state = yy_next_state; + goto yy_match; + } + + else + { + yy_cp = (yy_c_buf_p); + goto yy_find_action; + } + } + + else switch ( yy_get_next_buffer( ) ) + { + case EOB_ACT_END_OF_FILE: + { + (yy_did_buffer_switch_on_eof) = 0; + + if ( yywrap( ) ) + { + /* Note: because we've taken care in + * yy_get_next_buffer() to have set up + * yytext, we can now set up + * yy_c_buf_p so that if some total + * hoser (like flex itself) wants to + * call the scanner after we return the + * YY_NULL, it'll still work - another + * YY_NULL will get returned. + */ + (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; + + yy_act = YY_STATE_EOF(YY_START); + goto do_action; + } + + else + { + if ( ! (yy_did_buffer_switch_on_eof) ) + YY_NEW_FILE; + } + break; + } + + case EOB_ACT_CONTINUE_SCAN: + (yy_c_buf_p) = + (yytext_ptr) + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state( ); + + yy_cp = (yy_c_buf_p); + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + goto yy_match; + + case EOB_ACT_LAST_MATCH: + (yy_c_buf_p) = + &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; + + yy_current_state = yy_get_previous_state( ); + + yy_cp = (yy_c_buf_p); + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + goto yy_find_action; + } + break; + } + + default: + YY_FATAL_ERROR( + "fatal flex scanner internal error--no action found" ); + } /* end of action switch */ + } /* end of scanning one token */ +} /* end of yylex */ + +/* yy_get_next_buffer - try to read in a new buffer + * + * Returns a code representing an action: + * EOB_ACT_LAST_MATCH - + * EOB_ACT_CONTINUE_SCAN - continue scanning from current position + * EOB_ACT_END_OF_FILE - end of file + */ +static int yy_get_next_buffer (void) +{ + register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; + register char *source = (yytext_ptr); + register int number_to_move, i; + int ret_val; + + if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) + YY_FATAL_ERROR( + "fatal flex scanner internal error--end of buffer missed" ); + + if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) + { /* Don't try to fill the buffer, so this is an EOF. */ + if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) + { + /* We matched a single character, the EOB, so + * treat this as a final EOF. + */ + return EOB_ACT_END_OF_FILE; + } + + else + { + /* We matched some text prior to the EOB, first + * process it. + */ + return EOB_ACT_LAST_MATCH; + } + } + + /* Try to read more data. */ + + /* First move last chars to start of buffer. */ + number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; + + for ( i = 0; i < number_to_move; ++i ) + *(dest++) = *(source++); + + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) + /* don't do the read, it's not guaranteed to return an EOF, + * just force an EOF + */ + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; + + else + { + size_t num_to_read = + YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; + + while ( num_to_read <= 0 ) + { /* Not enough room in the buffer - grow it. */ + + YY_FATAL_ERROR( +"input buffer overflow, can't enlarge buffer because scanner uses REJECT" ); + + } + + if ( num_to_read > YY_READ_BUF_SIZE ) + num_to_read = YY_READ_BUF_SIZE; + + /* Read in more data. */ + YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), + (yy_n_chars), num_to_read ); + + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + if ( (yy_n_chars) == 0 ) + { + if ( number_to_move == YY_MORE_ADJ ) + { + ret_val = EOB_ACT_END_OF_FILE; + yyrestart(yyin ); + } + + else + { + ret_val = EOB_ACT_LAST_MATCH; + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = + YY_BUFFER_EOF_PENDING; + } + } + + else + ret_val = EOB_ACT_CONTINUE_SCAN; + + (yy_n_chars) += number_to_move; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; + + (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; + + return ret_val; +} + +/* yy_get_previous_state - get the state just before the EOB char was reached */ + + static yy_state_type yy_get_previous_state (void) +{ + register yy_state_type yy_current_state; + register char *yy_cp; + + yy_current_state = (yy_start); + yy_current_state += YY_AT_BOL(); + + (yy_state_ptr) = (yy_state_buf); + *(yy_state_ptr)++ = yy_current_state; + + for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) + { + register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 151 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + *(yy_state_ptr)++ = yy_current_state; + } + + return yy_current_state; +} + +/* yy_try_NUL_trans - try to make a transition on the NUL character + * + * synopsis + * next_state = yy_try_NUL_trans( current_state ); + */ + static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state ) +{ + register int yy_is_jam; + + register YY_CHAR yy_c = 1; + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 151 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + yy_is_jam = (yy_current_state == 150); + if ( ! yy_is_jam ) + *(yy_state_ptr)++ = yy_current_state; + + return yy_is_jam ? 0 : yy_current_state; +} + + static void yyunput (int c, register char * yy_bp ) +{ + register char *yy_cp; + + yy_cp = (yy_c_buf_p); + + /* undo effects of setting up yytext */ + *yy_cp = (yy_hold_char); + + if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) + { /* need to shift things up to make room */ + /* +2 for EOB chars. */ + register int number_to_move = (yy_n_chars) + 2; + register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ + YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; + register char *source = + &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; + + while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) + *--dest = *--source; + + yy_cp += (int) (dest - source); + yy_bp += (int) (dest - source); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size; + + if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) + YY_FATAL_ERROR( "flex scanner push-back overflow" ); + } + + *--yy_cp = (char) c; + + if ( c == '\n' ){ + --yylineno; + } + + (yytext_ptr) = yy_bp; + (yy_hold_char) = *yy_cp; + (yy_c_buf_p) = yy_cp; +} + +#ifndef YY_NO_INPUT +#ifdef __cplusplus + static int yyinput (void) +#else + static int input (void) +#endif + +{ + int c; + + *(yy_c_buf_p) = (yy_hold_char); + + if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) + { + /* yy_c_buf_p now points to the character we want to return. + * If this occurs *before* the EOB characters, then it's a + * valid NUL; if not, then we've hit the end of the buffer. + */ + if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) + /* This was really a NUL. */ + *(yy_c_buf_p) = '\0'; + + else + { /* need more input */ + int offset = (yy_c_buf_p) - (yytext_ptr); + ++(yy_c_buf_p); + + switch ( yy_get_next_buffer( ) ) + { + case EOB_ACT_LAST_MATCH: + /* This happens because yy_g_n_b() + * sees that we've accumulated a + * token and flags that we need to + * try matching the token before + * proceeding. But for input(), + * there's no matching to consider. + * So convert the EOB_ACT_LAST_MATCH + * to EOB_ACT_END_OF_FILE. + */ + + /* Reset buffer status. */ + yyrestart(yyin ); + + /*FALLTHROUGH*/ + + case EOB_ACT_END_OF_FILE: + { + if ( yywrap( ) ) + return EOF; + + if ( ! (yy_did_buffer_switch_on_eof) ) + YY_NEW_FILE; +#ifdef __cplusplus + return yyinput(); +#else + return input(); +#endif + } + + case EOB_ACT_CONTINUE_SCAN: + (yy_c_buf_p) = (yytext_ptr) + offset; + break; + } + } + } + + c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ + *(yy_c_buf_p) = '\0'; /* preserve yytext */ + (yy_hold_char) = *++(yy_c_buf_p); + + YY_CURRENT_BUFFER_LVALUE->yy_at_bol = (c == '\n'); + if ( YY_CURRENT_BUFFER_LVALUE->yy_at_bol ) + + yylineno++; +; + + return c; +} +#endif /* ifndef YY_NO_INPUT */ + +/** Immediately switch to a different input stream. + * @param input_file A readable stream. + * + * @note This function does not reset the start condition to @c INITIAL . + */ + void yyrestart (FILE * input_file ) +{ + + if ( ! YY_CURRENT_BUFFER ){ + yyensure_buffer_stack (); + YY_CURRENT_BUFFER_LVALUE = + yy_create_buffer(yyin,YY_BUF_SIZE ); + } + + yy_init_buffer(YY_CURRENT_BUFFER,input_file ); + yy_load_buffer_state( ); +} + +/** Switch to a different input buffer. + * @param new_buffer The new input buffer. + * + */ + void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ) +{ + + /* TODO. We should be able to replace this entire function body + * with + * yypop_buffer_state(); + * yypush_buffer_state(new_buffer); + */ + yyensure_buffer_stack (); + if ( YY_CURRENT_BUFFER == new_buffer ) + return; + + if ( YY_CURRENT_BUFFER ) + { + /* Flush out information for old buffer. */ + *(yy_c_buf_p) = (yy_hold_char); + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + YY_CURRENT_BUFFER_LVALUE = new_buffer; + yy_load_buffer_state( ); + + /* We don't actually know whether we did this switch during + * EOF (yywrap()) processing, but the only time this flag + * is looked at is after yywrap() is called, so it's safe + * to go ahead and always set it. + */ + (yy_did_buffer_switch_on_eof) = 1; +} + +static void yy_load_buffer_state (void) +{ + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; + yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; + (yy_hold_char) = *(yy_c_buf_p); +} + +/** Allocate and initialize an input buffer state. + * @param file A readable stream. + * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. + * + * @return the allocated buffer state. + */ + YY_BUFFER_STATE yy_create_buffer (FILE * file, int size ) +{ + YY_BUFFER_STATE b; + + b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_buf_size = size; + + /* yy_ch_buf has to be 2 characters longer than the size given because + * we need to put in 2 end-of-buffer characters. + */ + b->yy_ch_buf = (char *) yyalloc(b->yy_buf_size + 2 ); + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_is_our_buffer = 1; + + yy_init_buffer(b,file ); + + return b; +} + +/** Destroy the buffer. + * @param b a buffer created with yy_create_buffer() + * + */ + void yy_delete_buffer (YY_BUFFER_STATE b ) +{ + + if ( ! b ) + return; + + if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ + YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; + + if ( b->yy_is_our_buffer ) + yyfree((void *) b->yy_ch_buf ); + + yyfree((void *) b ); +} + +#ifndef __cplusplus +extern int isatty (int ); +#endif /* __cplusplus */ + +/* Initializes or reinitializes a buffer. + * This function is sometimes called more than once on the same buffer, + * such as during a yyrestart() or at EOF. + */ + static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file ) + +{ + int oerrno = errno; + + yy_flush_buffer(b ); + + b->yy_input_file = file; + b->yy_fill_buffer = 1; + + /* If b is the current buffer, then yy_init_buffer was _probably_ + * called from yyrestart() or through yy_get_next_buffer. + * In that case, we don't want to reset the lineno or column. + */ + if (b != YY_CURRENT_BUFFER){ + b->yy_bs_lineno = 1; + b->yy_bs_column = 0; + } + + b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; + + errno = oerrno; +} + +/** Discard all buffered characters. On the next scan, YY_INPUT will be called. + * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. + * + */ + void yy_flush_buffer (YY_BUFFER_STATE b ) +{ + if ( ! b ) + return; + + b->yy_n_chars = 0; + + /* We always need two end-of-buffer characters. The first causes + * a transition to the end-of-buffer state. The second causes + * a jam in that state. + */ + b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; + b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; + + b->yy_buf_pos = &b->yy_ch_buf[0]; + + b->yy_at_bol = 1; + b->yy_buffer_status = YY_BUFFER_NEW; + + if ( b == YY_CURRENT_BUFFER ) + yy_load_buffer_state( ); +} + +/** Pushes the new state onto the stack. The new state becomes + * the current state. This function will allocate the stack + * if necessary. + * @param new_buffer The new state. + * + */ +void yypush_buffer_state (YY_BUFFER_STATE new_buffer ) +{ + if (new_buffer == NULL) + return; + + yyensure_buffer_stack(); + + /* This block is copied from yy_switch_to_buffer. */ + if ( YY_CURRENT_BUFFER ) + { + /* Flush out information for old buffer. */ + *(yy_c_buf_p) = (yy_hold_char); + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + /* Only push if top exists. Otherwise, replace top. */ + if (YY_CURRENT_BUFFER) + (yy_buffer_stack_top)++; + YY_CURRENT_BUFFER_LVALUE = new_buffer; + + /* copied from yy_switch_to_buffer. */ + yy_load_buffer_state( ); + (yy_did_buffer_switch_on_eof) = 1; +} + +/** Removes and deletes the top of the stack, if present. + * The next element becomes the new top. + * + */ +void yypop_buffer_state (void) +{ + if (!YY_CURRENT_BUFFER) + return; + + yy_delete_buffer(YY_CURRENT_BUFFER ); + YY_CURRENT_BUFFER_LVALUE = NULL; + if ((yy_buffer_stack_top) > 0) + --(yy_buffer_stack_top); + + if (YY_CURRENT_BUFFER) { + yy_load_buffer_state( ); + (yy_did_buffer_switch_on_eof) = 1; + } +} + +/* Allocates the stack if it does not exist. + * Guarantees space for at least one push. + */ +static void yyensure_buffer_stack (void) +{ + int num_to_alloc; + + if (!(yy_buffer_stack)) { + + /* First allocation is just for 2 elements, since we don't know if this + * scanner will even need a stack. We use 2 instead of 1 to avoid an + * immediate realloc on the next call. + */ + num_to_alloc = 1; + (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc + (num_to_alloc * sizeof(struct yy_buffer_state*) + ); + + memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); + + (yy_buffer_stack_max) = num_to_alloc; + (yy_buffer_stack_top) = 0; + return; + } + + if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ + + /* Increase the buffer to prepare for a possible push. */ + int grow_size = 8 /* arbitrary grow size */; + + num_to_alloc = (yy_buffer_stack_max) + grow_size; + (yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc + ((yy_buffer_stack), + num_to_alloc * sizeof(struct yy_buffer_state*) + ); + + /* zero only the new slots.*/ + memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); + (yy_buffer_stack_max) = num_to_alloc; + } +} + +/** Setup the input buffer state to scan directly from a user-specified character buffer. + * @param base the character buffer + * @param size the size in bytes of the character buffer + * + * @return the newly allocated buffer state object. + */ +YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size ) +{ + YY_BUFFER_STATE b; + + if ( size < 2 || + base[size-2] != YY_END_OF_BUFFER_CHAR || + base[size-1] != YY_END_OF_BUFFER_CHAR ) + /* They forgot to leave room for the EOB's. */ + return 0; + + b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); + + b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ + b->yy_buf_pos = b->yy_ch_buf = base; + b->yy_is_our_buffer = 0; + b->yy_input_file = 0; + b->yy_n_chars = b->yy_buf_size; + b->yy_is_interactive = 0; + b->yy_at_bol = 1; + b->yy_fill_buffer = 0; + b->yy_buffer_status = YY_BUFFER_NEW; + + yy_switch_to_buffer(b ); + + return b; +} + +/** Setup the input buffer state to scan a string. The next call to yylex() will + * scan from a @e copy of @a str. + * @param str a NUL-terminated string to scan + * + * @return the newly allocated buffer state object. + * @note If you want to scan bytes that may contain NUL values, then use + * yy_scan_bytes() instead. + */ +YY_BUFFER_STATE yy_scan_string (yyconst char * str ) +{ + + return yy_scan_bytes(str,strlen(str) ); +} + +/** Setup the input buffer state to scan the given bytes. The next call to yylex() will + * scan from a @e copy of @a bytes. + * @param bytes the byte buffer to scan + * @param len the number of bytes in the buffer pointed to by @a bytes. + * + * @return the newly allocated buffer state object. + */ +YY_BUFFER_STATE yy_scan_bytes (yyconst char * bytes, int len ) +{ + YY_BUFFER_STATE b; + char *buf; + yy_size_t n; + int i; + + /* Get memory for full buffer, including space for trailing EOB's. */ + n = len + 2; + buf = (char *) yyalloc(n ); + if ( ! buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); + + for ( i = 0; i < len; ++i ) + buf[i] = bytes[i]; + + buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR; + + b = yy_scan_buffer(buf,n ); + if ( ! b ) + YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); + + /* It's okay to grow etc. this buffer, and we should throw it + * away when we're done. + */ + b->yy_is_our_buffer = 1; + + return b; +} + +#ifndef YY_EXIT_FAILURE +#define YY_EXIT_FAILURE 2 +#endif + +static void yy_fatal_error (yyconst char* msg ) +{ + (void) fprintf( stderr, "%s\n", msg ); + exit( YY_EXIT_FAILURE ); +} + +/* Redefine yyless() so it works in section 3 code. */ + +#undef yyless +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + int yyless_macro_arg = (n); \ + YY_LESS_LINENO(yyless_macro_arg);\ + yytext[yyleng] = (yy_hold_char); \ + (yy_c_buf_p) = yytext + yyless_macro_arg; \ + (yy_hold_char) = *(yy_c_buf_p); \ + *(yy_c_buf_p) = '\0'; \ + yyleng = yyless_macro_arg; \ + } \ + while ( 0 ) + +/* Accessor methods (get/set functions) to struct members. */ + +/** Get the current line number. + * + */ +int yyget_lineno (void) +{ + + return yylineno; +} + +/** Get the input stream. + * + */ +FILE *yyget_in (void) +{ + return yyin; +} + +/** Get the output stream. + * + */ +FILE *yyget_out (void) +{ + return yyout; +} + +/** Get the length of the current token. + * + */ +int yyget_leng (void) +{ + return yyleng; +} + +/** Get the current token. + * + */ + +char *yyget_text (void) +{ + return yytext; +} + +/** Set the current line number. + * @param line_number + * + */ +void yyset_lineno (int line_number ) +{ + + yylineno = line_number; +} + +/** Set the input stream. This does not discard the current + * input buffer. + * @param in_str A readable stream. + * + * @see yy_switch_to_buffer + */ +void yyset_in (FILE * in_str ) +{ + yyin = in_str ; +} + +void yyset_out (FILE * out_str ) +{ + yyout = out_str ; +} + +int yyget_debug (void) +{ + return yy_flex_debug; +} + +void yyset_debug (int bdebug ) +{ + yy_flex_debug = bdebug ; +} + +/* yylex_destroy is for both reentrant and non-reentrant scanners. */ +int yylex_destroy (void) +{ + + /* Pop the buffer stack, destroying each element. */ + while(YY_CURRENT_BUFFER){ + yy_delete_buffer(YY_CURRENT_BUFFER ); + YY_CURRENT_BUFFER_LVALUE = NULL; + yypop_buffer_state(); + } + + /* Destroy the stack itself. */ + yyfree((yy_buffer_stack) ); + (yy_buffer_stack) = NULL; + + yyfree ( (yy_state_buf) ); + + return 0; +} + +/* + * Internal utility routines. + */ + +#ifndef yytext_ptr +static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) +{ + register int i; + for ( i = 0; i < n; ++i ) + s1[i] = s2[i]; +} +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen (yyconst char * s ) +{ + register int n; + for ( n = 0; s[n]; ++n ) + ; + + return n; +} +#endif + +void *yyalloc (yy_size_t size ) +{ + return (void *) malloc( size ); +} + +void *yyrealloc (void * ptr, yy_size_t size ) +{ + /* The cast to (char *) in the following accommodates both + * implementations that use char* generic pointers, and those + * that use void* generic pointers. It works with the latter + * because both ANSI C and C++ allow castless assignment from + * any pointer type to void*, and deal with argument conversions + * as though doing an assignment. + */ + return (void *) realloc( (char *) ptr, size ); +} + +void yyfree (void * ptr ) +{ + free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ +} + +#define YYTABLES_NAME "yytables" + +#undef YY_NEW_FILE +#undef YY_FLUSH_BUFFER +#undef yy_set_bol +#undef yy_new_buffer +#undef yy_set_interactive +#undef YY_DO_BEFORE_ACTION + +#ifdef YY_DECL_IS_OURS +#undef YY_DECL_IS_OURS +#undef YY_DECL +#endif +#line 90 "goomsl_lex.l" + + + + +int yywrap(void) { return 1; yyunput(0,0); } + + diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/goomsl_lex.l kodi-visualization-goom-2.1.0/lib/goom/src/goomsl_lex.l --- kodi-visualization-goom-1.1.0/lib/goom/src/goomsl_lex.l 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/goomsl_lex.l 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,94 @@ +%{ + +#include +#include +#include +#include "goomsl.h" +#include "goomsl_private.h" +#include "goomsl_yacc.h" +void yyerror(char *); +void yyparse(void); + +GoomSL *currentGoomSL; +static int string_size; +static char string[1024]; +%} + +DIGIT [0-9] +XDIGIT [0-9a-f] +ID [a-zA-Z_@&][a-zA-Z0-9_\.]* + +%S C_COMMENT +%S LINE_COMMENT +%S STRING + +%% + +^[ \t]*\n { ++currentGoomSL->num_lines; /* Ignore empty lines */ } +^[ \t]*"//"[^\n]*\n { ++currentGoomSL->num_lines; /* Ignore empty lines */ } + +\n { ++currentGoomSL->num_lines; yylval.charValue=*yytext; BEGIN INITIAL; return '\n'; } +\n { ++currentGoomSL->num_lines; yylval.charValue=*yytext; return '\n'; } + +"*/" { BEGIN INITIAL; } +\n { ++currentGoomSL->num_lines; } +. { /* eat up comment */ } + +"#RST_LINE#" { currentGoomSL->num_lines = 0; } +"#FILE ".*"#" { currentGoomSL->num_lines = 0; printf("%s\n", yytext); } +"#"[^\n]* { /* ignore preprocessor lines */ } + +"/*" { BEGIN C_COMMENT; } +"//" { BEGIN LINE_COMMENT; } +\" { BEGIN STRING; string_size=0; } + +"\\n" { string[string_size++] = '\n'; } +"\\\"" { string[string_size++] = '\"'; } +\" { /* fin de la chaine: on cree le pointeur qui va bien */ + unsigned int tmp; + BEGIN INITIAL; + string[string_size]=0; + tmp = gsl_malloc(currentGoomSL, string_size+1); + strcpy((char*)currentGoomSL->ptrArray[tmp],string); + sprintf(yylval.strValue, "0x%08x", tmp); + return LTYPE_PTR; + } +. { string[string_size++] = *yytext; } + +"float" { return FLOAT_TK; } +"int" { return INT_TK; } +"boolean" { return INT_TK; } +"ptr" { return PTR_TK; } +"string" { return PTR_TK; } +"declare" { return DECLARE; } +"external" { return EXTERNAL; } +"struct" { return STRUCT; } +"not" { return NOT; } +"while" { return WHILE; } +"do" { return DO; } +"for" { return FOR; } +"in" { return IN; } +"true" { strncpy(yylval.strValue, "1", 2047); return LTYPE_INTEGER; } +"false" { strncpy(yylval.strValue, "0", 2047); return LTYPE_INTEGER; } +{ID} { strncpy(yylval.strValue, yytext, 2047); return LTYPE_VAR; } +{DIGIT}+ { strncpy(yylval.strValue, yytext, 2047); return LTYPE_INTEGER; } +\'.\' { sprintf(yylval.strValue, "%d", (int)yytext[1]); return LTYPE_INTEGER; } +"0x"{XDIGIT}+ { strncpy(yylval.strValue, yytext, 2047); return LTYPE_INTEGER; } +{DIGIT}+"."{DIGIT}* { strncpy(yylval.strValue, yytext, 2047); return LTYPE_FLOAT; } +{DIGIT}+"%" { sprintf(yylval.strValue, "%3.2f", atof(yytext)/100.0f); return LTYPE_FLOAT; } +"+=" { return PLUS_EQ; } +"*=" { return MUL_EQ; } +"-=" { return SUB_EQ; } +"/=" { return DIV_EQ; } +"<=" { return LOW_EQ; } +">=" { return SUP_EQ; } +"!=" { return NOT_EQ; } +"<>" { return NOT_EQ; } +[ \t]+ /* eat up whitespace */ +. { yylval.charValue = *yytext; return *yytext; } + +%% + + +int yywrap(void) { return 1; yyunput(0,0); } + diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/goomsl_private.h kodi-visualization-goom-2.1.0/lib/goom/src/goomsl_private.h --- kodi-visualization-goom-1.1.0/lib/goom/src/goomsl_private.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/goomsl_private.h 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,251 @@ +#ifndef _GSL_PRIVATE_H +#define _GSL_PRIVATE_H + +/* -- internal use -- */ + +#include "goomsl.h" + +#ifdef USE_JITC_X86 +#include "jitc_x86.h" +#endif + +#include "goomsl_heap.h" + +/* {{{ type of nodes */ +#define EMPTY_NODE 0 +#define CONST_INT_NODE 1 +#define CONST_FLOAT_NODE 2 +#define CONST_PTR_NODE 3 +#define VAR_NODE 4 +#define PARAM_NODE 5 +#define READ_PARAM_NODE 6 +#define OPR_NODE 7 +/* }}} */ +/* {{{ type of operations */ +#define OPR_SET 1 +#define OPR_IF 2 +#define OPR_WHILE 3 +#define OPR_BLOCK 4 +#define OPR_ADD 5 +#define OPR_MUL 6 +#define OPR_EQU 7 +#define OPR_NOT 8 +#define OPR_LOW 9 +#define OPR_DIV 10 +#define OPR_SUB 11 +#define OPR_FUNC_INTRO 12 +#define OPR_FUNC_OUTRO 13 +#define OPR_CALL 14 +#define OPR_EXT_CALL 15 +#define OPR_PLUS_EQ 16 +#define OPR_SUB_EQ 17 +#define OPR_MUL_EQ 18 +#define OPR_DIV_EQ 19 +#define OPR_CALL_EXPR 20 +#define OPR_AFFECT_LIST 21 +#define OPR_FOREACH 22 +#define OPR_VAR_LIST 23 + +/* }}} */ + +typedef struct _ConstIntNodeType { /* {{{ */ + int val; +} ConstIntNodeType; /* }}} */ +typedef struct _ConstFloatNodeType { /* {{{ */ + float val; +} ConstFloatNodeType; /* }}} */ +typedef struct _ConstPtrNodeType { /* {{{ */ + int id; +} ConstPtrNodeType; /* }}} */ +typedef struct _OprNodeType { /* {{{ */ + int type; + int nbOp; + struct _NODE_TYPE *op[3]; /* maximal number of operand needed */ + struct _NODE_TYPE *next; +} OprNodeType; /* }}} */ +typedef struct _NODE_TYPE { /* {{{ */ + int type; + char *str; + GoomHash *vnamespace; + int line_number; + union { + ConstIntNodeType constInt; + ConstFloatNodeType constFloat; + ConstPtrNodeType constPtr; + OprNodeType opr; + } unode; +} NodeType; /* }}} */ +typedef struct _INSTRUCTION_DATA { /* {{{ */ + + union { + void *var; + int *var_int; + int *var_ptr; + float *var_float; + int jump_offset; + struct _ExternalFunctionStruct *external_function; + } udest; + + union { + void *var; + int *var_int; + int *var_ptr; + float *var_float; + int value_int; + int value_ptr; + float value_float; + } usrc; +} InstructionData; +/* }}} */ +typedef struct _INSTRUCTION { /* {{{ */ + + int id; + InstructionData data; + GoomSL *parent; + const char *name; /* name of the instruction */ + + char **params; /* parametres de l'instruction */ + GoomHash **vnamespace; + int *types; /* type des parametres de l'instruction */ + int cur_param; + int nb_param; + + int address; + char *jump_label; + char *nop_label; + + int line_number; + +} Instruction; +/* }}} */ +typedef struct _INSTRUCTION_FLOW { /* {{{ */ + + Instruction **instr; + int number; + int tabsize; + GoomHash *labels; +} InstructionFlow; +/* }}} */ +typedef struct _FAST_INSTRUCTION { /* {{{ */ + int id; + InstructionData data; + Instruction *proto; +} FastInstruction; +/* }}} */ +typedef struct _FastInstructionFlow { /* {{{ */ + int number; + FastInstruction *instr; + void *mallocedInstr; +} FastInstructionFlow; +/* }}} */ +typedef struct _ExternalFunctionStruct { /* {{{ */ + GoomSL_ExternalFunction function; + GoomHash *vars; + int is_extern; +} ExternalFunctionStruct; +/* }}} */ +typedef struct _Block { + int data; + int size; +} Block; +typedef struct _GSL_StructField { /* {{{ */ + int type; + char name[256]; + int offsetInStruct; /* Where this field is stored... */ +} GSL_StructField; + /* }}} */ +typedef struct _GSL_Struct { /* {{{ */ + int nbFields; + GSL_StructField *fields[64]; + int size; + Block iBlock[64]; + Block fBlock[64]; +} GSL_Struct; + /* }}} */ +struct _GoomSL { /* {{{ */ + int num_lines; + Instruction *instr; /* instruction en cours de construction */ + + InstructionFlow *iflow; /* flow d'instruction 'normal' */ + FastInstructionFlow *fastiflow; /* flow d'instruction optimise */ + + GoomHash *vars; /* table de variables */ + int currentNS; + GoomHash *namespaces[16]; + + GoomHash *functions; /* table des fonctions externes */ + + GoomHeap *data_heap; /* GSL Heap-like memory space */ + + int nbStructID; + GoomHash *structIDS; + GSL_Struct **gsl_struct; + int gsl_struct_size; + + int nbPtr; + int ptrArraySize; + void **ptrArray; + + int compilationOK; +#ifdef USE_JITC_X86 + JitcX86Env *jitc; + JitcFunc jitc_func; +#endif +}; /* }}} */ + +extern GoomSL *currentGoomSL; + +Instruction *gsl_instr_init(GoomSL *parent, const char *name, int id, int nb_param, int line_number); +void gsl_instr_add_param(Instruction *_this, char *param, int type); +void gsl_instr_set_namespace(Instruction *_this, GoomHash *ns); + +void gsl_declare_task(const char *name); +void gsl_declare_external_task(const char *name); + +int gsl_type_of_var(GoomHash *namespace, const char *name); + +void gsl_enternamespace(const char *name); +void gsl_reenternamespace(GoomHash *ns); +GoomHash *gsl_leavenamespace(void); +GoomHash *gsl_find_namespace(const char *name); + +void gsl_commit_compilation(void); + +/* #define TYPE_PARAM 1 */ + +#define FIRST_RESERVED 0x80000 + +#define TYPE_INTEGER 0x90001 +#define TYPE_FLOAT 0x90002 +#define TYPE_VAR 0x90003 +#define TYPE_PTR 0x90004 +#define TYPE_LABEL 0x90005 + +#define TYPE_OP_EQUAL 6 +#define TYPE_IVAR 0xa0001 +#define TYPE_FVAR 0xa0002 +#define TYPE_PVAR 0xa0003 +#define TYPE_SVAR 0xa0004 + +#define INSTR_JUMP 6 +#define INSTR_JZERO 29 +#define INSTR_CALL 36 +#define INSTR_RET 37 +#define INSTR_EXT_CALL 38 +#define INSTR_JNZERO 40 + +#define INSTR_SET 0x80001 +#define INSTR_INT 0x80002 +#define INSTR_FLOAT 0x80003 +#define INSTR_PTR 0x80004 +#define INSTR_LABEL 0x80005 +#define INSTR_ISLOWER 0x80006 +#define INSTR_ADD 0x80007 +#define INSTR_MUL 0x80008 +#define INSTR_DIV 0x80009 +#define INSTR_SUB 0x80010 +#define INSTR_ISEQUAL 0x80011 +#define INSTR_NOT 0x80012 + + +#endif diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/goomsl_yacc.c kodi-visualization-goom-2.1.0/lib/goom/src/goomsl_yacc.c --- kodi-visualization-goom-1.1.0/lib/goom/src/goomsl_yacc.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/goomsl_yacc.c 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,3524 @@ + +/* A Bison parser, made by GNU Bison 2.4.1. */ + +/* Skeleton implementation for Bison's Yacc-like parsers in C + + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 + Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* As a special exception, you may create a larger work that contains + part or all of the Bison parser skeleton and distribute that work + under terms of your choice, so long as that work isn't itself a + parser generator using the skeleton or a modified version thereof + as a parser skeleton. Alternatively, if you modify or redistribute + the parser skeleton itself, you may (at your option) remove this + special exception, which will cause the skeleton and the resulting + Bison output files to be licensed under the GNU General Public + License without this special exception. + + This special exception was added by the Free Software Foundation in + version 2.2 of Bison. */ + +/* C LALR(1) parser skeleton written by Richard Stallman, by + simplifying the original so-called "semantic" parser. */ + +/* All symbols defined below should begin with yy or YY, to avoid + infringing on user name space. This should be done even for local + variables, as they might otherwise be expanded by user macros. + There are some unavoidable exceptions within include files to + define necessary library symbols; they are noted "INFRINGES ON + USER NAME SPACE" below. */ + +/* Identify Bison output. */ +#define YYBISON 1 + +/* Bison version. */ +#define YYBISON_VERSION "2.4.1" + +/* Skeleton name. */ +#define YYSKELETON_NAME "yacc.c" + +/* Pure parsers. */ +#define YYPURE 0 + +/* Push parsers. */ +#define YYPUSH 0 + +/* Pull parsers. */ +#define YYPULL 1 + +/* Using locations. */ +#define YYLSP_NEEDED 0 + + + +/* Copy the first part of user declarations. */ + +/* Line 189 of yacc.c */ +#line 6 "goomsl_yacc.y" + + #include + #include + #include + #include "goomsl.h" + #include "goomsl_private.h" + #include "goomsl_yacc.h" + +#define STRUCT_ALIGNMENT 16 +/* #define VERBOSE */ + + int yylex(void); + void yyerror(char *); + extern GoomSL *currentGoomSL; + + static NodeType *nodeNew(const char *str, int type, int line_number); + static NodeType *nodeClone(NodeType *node); + static void nodeFreeInternals(NodeType *node); + static void nodeFree(NodeType *node); + + static void commit_node(NodeType *node, int releaseIfTemp); + static void precommit_node(NodeType *node); + + static NodeType *new_constInt(const char *str, int line_number); + static NodeType *new_constFloat(const char *str, int line_number); + static NodeType *new_constPtr(const char *str, int line_number); + static NodeType *new_var(const char *str, int line_number); + static NodeType *new_nop(const char *str); + static NodeType *new_op(const char *str, int type, int nbOp); + + static int allocateLabel(); + static int allocateTemp(); + static void releaseTemp(int n); + static void releaseAllTemps(); + + static int is_tmp_expr(NodeType *node) { + if (node->str) { + return (!strncmp(node->str,"_i_tmp_",7)) + || (!strncmp(node->str,"_f_tmp_",7)) + || (!strncmp(node->str,"_p_tmp",7)); + } + return 0; + } + /* pre: is_tmp_expr(node); */ + static int get_tmp_id(NodeType *node) { return atoi((node->str)+5); } + + static int is_commutative_expr(int itype) + { /* {{{ */ + return (itype == INSTR_ADD) + || (itype == INSTR_MUL) + || (itype == INSTR_ISEQUAL); + } /* }}} */ + + static void GSL_PUT_LABEL(char *name, int line_number) + { /* {{{ */ +#ifdef VERBOSE + printf("label %s\n", name); +#endif + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "label", INSTR_LABEL, 1, line_number); + gsl_instr_add_param(currentGoomSL->instr, name, TYPE_LABEL); + } /* }}} */ + static void GSL_PUT_JUMP(char *name, int line_number) + { /* {{{ */ +#ifdef VERBOSE + printf("jump %s\n", name); +#endif + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "jump", INSTR_JUMP, 1, line_number); + gsl_instr_add_param(currentGoomSL->instr, name, TYPE_LABEL); + } /* }}} */ + + static void GSL_PUT_JXXX(char *name, char *iname, int instr_id, int line_number) + { /* {{{ */ +#ifdef VERBOSE + printf("%s %s\n", iname, name); +#endif + currentGoomSL->instr = gsl_instr_init(currentGoomSL, iname, instr_id, 1, line_number); + gsl_instr_add_param(currentGoomSL->instr, name, TYPE_LABEL); + } /* }}} */ + static void GSL_PUT_JZERO(char *name,int line_number) + { /* {{{ */ + GSL_PUT_JXXX(name,"jzero.i",INSTR_JZERO,line_number); + } /* }}} */ + static void GSL_PUT_JNZERO(char *name, int line_number) + { /* {{{ */ + GSL_PUT_JXXX(name,"jnzero.i",INSTR_JNZERO,line_number); + } /* }}} */ + + /* Structures Management */ + +#define ALIGN_ADDR(_addr,_align) {\ + if (_align>1) {\ + int _dec = (_addr%_align);\ + if (_dec != 0) _addr += _align - _dec;\ + }} + + /* */ + void gsl_prepare_struct(GSL_Struct *s, int s_align, int i_align, int f_align) + { + int i; + int consumed = 0; + int iblk=0, fblk=0; + + s->iBlock[0].size = 0; + s->iBlock[0].data = 0; + s->fBlock[0].size = 0; + s->fBlock[0].data = 0; + + /* Prepare sub-struct and calculate space needed for their storage */ + for (i = 0; i < s->nbFields; ++i) + { + if (s->fields[i]->type < FIRST_RESERVED) + { + int j=0; + GSL_Struct *substruct = currentGoomSL->gsl_struct[s->fields[i]->type]; + consumed += sizeof(int); /* stocke le prefix */ + ALIGN_ADDR(consumed, s_align); + s->fields[i]->offsetInStruct = consumed; + gsl_prepare_struct(substruct, s_align, i_align, f_align); + for(j=0;substruct->iBlock[j].size>0;++j) { + s->iBlock[iblk].data = consumed + substruct->iBlock[j].data; + s->iBlock[iblk].size = substruct->iBlock[j].size; + iblk++; + } + for(j=0;substruct->fBlock[j].size>0;++j) { + s->fBlock[fblk].data = consumed + substruct->fBlock[j].data; + s->fBlock[fblk].size = substruct->fBlock[j].size; + fblk++; + } + consumed += substruct->size; + } + } + + /* Then prepare integers */ + ALIGN_ADDR(consumed, i_align); + for (i = 0; i < s->nbFields; ++i) + { + if (s->fields[i]->type == INSTR_INT) + { + if (s->iBlock[iblk].size == 0) { + s->iBlock[iblk].size = 1; + s->iBlock[iblk].data = consumed; + } else { + s->iBlock[iblk].size += 1; + } + s->fields[i]->offsetInStruct = consumed; + consumed += sizeof(int); + } + } + + iblk++; + s->iBlock[iblk].size = 0; + s->iBlock[iblk].data = 0; + + /* Then prepare floats */ + ALIGN_ADDR(consumed, f_align); + for (i = 0; i < s->nbFields; ++i) + { + if (s->fields[i]->type == INSTR_FLOAT) + { + if (s->fBlock[fblk].size == 0) { + s->fBlock[fblk].size = 1; + s->fBlock[fblk].data = consumed; + } else { + s->fBlock[fblk].size += 1; + } + s->fields[i]->offsetInStruct = consumed; + consumed += sizeof(int); + } + } + + fblk++; + s->fBlock[fblk].size = 0; + s->fBlock[fblk].data = 0; + + /* Finally prepare pointers */ + ALIGN_ADDR(consumed, i_align); + for (i = 0; i < s->nbFields; ++i) + { + if (s->fields[i]->type == INSTR_PTR) + { + s->fields[i]->offsetInStruct = consumed; + consumed += sizeof(int); + } + } + s->size = consumed; + } + + /* Returns the ID of a struct from its name */ + int gsl_get_struct_id(const char *name) /* {{{ */ + { + HashValue *ret = goom_hash_get(currentGoomSL->structIDS, name); + if (ret != NULL) return ret->i; + return -1; + } /* }}} */ + + /* Adds the definition of a struct */ + void gsl_add_struct(const char *name, GSL_Struct *gsl_struct) /* {{{ */ + { + /* Prepare the struct: ie calculate internal storage format */ + gsl_prepare_struct(gsl_struct, STRUCT_ALIGNMENT, STRUCT_ALIGNMENT, STRUCT_ALIGNMENT); + + /* If the struct does not already exists */ + if (gsl_get_struct_id(name) < 0) + { + /* adds it */ + int id = currentGoomSL->nbStructID++; + goom_hash_put_int(currentGoomSL->structIDS, name, id); + if (currentGoomSL->gsl_struct_size <= id) { + currentGoomSL->gsl_struct_size *= 2; + currentGoomSL->gsl_struct = (GSL_Struct**)realloc(currentGoomSL->gsl_struct, + sizeof(GSL_Struct*) * currentGoomSL->gsl_struct_size); + } + currentGoomSL->gsl_struct[id] = gsl_struct; + } + } /* }}} */ + + /* Creates a field for a struct */ + GSL_StructField *gsl_new_struct_field(const char *name, int type) + { + GSL_StructField *field = (GSL_StructField*)malloc(sizeof(GSL_StructField)); + strcpy(field->name, name); + field->type = type; + return field; + } + + /* Create as field for a struct which will be a struct itself */ + GSL_StructField *gsl_new_struct_field_struct(const char *name, const char *type) + { + GSL_StructField *field = gsl_new_struct_field(name, gsl_get_struct_id(type)); + if (field->type < 0) { + fprintf(stderr, "ERROR: Line %d, Unknown structure: '%s'\n", + currentGoomSL->num_lines, type); + exit(1); + } + return field; + } + + /* Creates a Struct */ + GSL_Struct *gsl_new_struct(GSL_StructField *field) + { + GSL_Struct *s = (GSL_Struct*)malloc(sizeof(GSL_Struct)); + s->nbFields = 1; + s->fields[0] = field; + return s; + } + + /* Adds a field to a struct */ + void gsl_add_struct_field(GSL_Struct *s, GSL_StructField *field) + { + s->fields[s->nbFields++] = field; + } + + int gsl_type_of_var(GoomHash *ns, const char *name) + { + char type_of[256]; + HashValue *hv; + sprintf(type_of, "__type_of_%s", name); + hv = goom_hash_get(ns, type_of); + if (hv != NULL) + return hv->i; + fprintf(stderr, "ERROR: Unknown variable type: '%s'\n", name); + return -1; + } + + static void gsl_declare_var(GoomHash *ns, const char *name, int type, void *space) + { + char type_of[256]; + if (name[0] == '@') { ns = currentGoomSL->vars; } + + if (space == NULL) { + switch (type) { + case INSTR_INT: + case INSTR_FLOAT: + case INSTR_PTR: + space = goom_heap_malloc_with_alignment(currentGoomSL->data_heap, + sizeof(int), sizeof(int)); + break; + case -1: + fprintf(stderr, "What the fuck!\n"); + exit(1); + default: /* On a un struct_id */ + space = goom_heap_malloc_with_alignment_prefixed(currentGoomSL->data_heap, + currentGoomSL->gsl_struct[type]->size, STRUCT_ALIGNMENT, sizeof(int)); + } + } + goom_hash_put_ptr(ns, name, (void*)space); + sprintf(type_of, "__type_of_%s", name); + goom_hash_put_int(ns, type_of, type); + + /* Ensuite le hack: on ajoute les champs en tant que variables. */ + if (type < FIRST_RESERVED) + { + int i; + GSL_Struct *gsl_struct = currentGoomSL->gsl_struct[type]; + ((int*)space)[-1] = type; /* stockage du type dans le prefixe de structure */ + for (i = 0; i < gsl_struct->nbFields; ++i) + { + char full_name[256]; + char *cspace = (char*)space + gsl_struct->fields[i]->offsetInStruct; + sprintf(full_name, "%s.%s", name, gsl_struct->fields[i]->name); + gsl_declare_var(ns, full_name, gsl_struct->fields[i]->type, cspace); + } + } + } + + /* Declare a variable which will be a struct */ + static void gsl_struct_decl(GoomHash *namespace, const char *struct_name, const char *name) + { + int struct_id = gsl_get_struct_id(struct_name); + gsl_declare_var(namespace, name, struct_id, NULL); + } + + static void gsl_float_decl_global(const char *name) + { + gsl_declare_var(currentGoomSL->vars, name, INSTR_FLOAT, NULL); + } + static void gsl_int_decl_global(const char *name) + { + gsl_declare_var(currentGoomSL->vars, name, INSTR_INT, NULL); + } + static void gsl_ptr_decl_global(const char *name) + { + gsl_declare_var(currentGoomSL->vars, name, INSTR_PTR, NULL); + } + static void gsl_struct_decl_global_from_id(const char *name, int id) + { + gsl_declare_var(currentGoomSL->vars, name, id, NULL); + } + + /* FLOAT */ + static void gsl_float_decl_local(const char *name) + { + gsl_declare_var(currentGoomSL->namespaces[currentGoomSL->currentNS], name, INSTR_FLOAT, NULL); + } + /* INT */ + static void gsl_int_decl_local(const char *name) + { + gsl_declare_var(currentGoomSL->namespaces[currentGoomSL->currentNS], name, INSTR_INT, NULL); + } + /* PTR */ + static void gsl_ptr_decl_local(const char *name) + { + gsl_declare_var(currentGoomSL->namespaces[currentGoomSL->currentNS], name, INSTR_PTR, NULL); + } + /* STRUCT */ + static void gsl_struct_decl_local(const char *struct_name, const char *name) + { + gsl_struct_decl(currentGoomSL->namespaces[currentGoomSL->currentNS],struct_name,name); + } + + + static void commit_test2(NodeType *set,const char *type, int instr); + static NodeType *new_call(const char *name, NodeType *affect_list); + + /* SETTER */ + static NodeType *new_set(NodeType *lvalue, NodeType *expression) + { /* {{{ */ + NodeType *set = new_op("set", OPR_SET, 2); + set->unode.opr.op[0] = lvalue; + set->unode.opr.op[1] = expression; + return set; + } /* }}} */ + static void commit_set(NodeType *set) + { /* {{{ */ + commit_test2(set,"set",INSTR_SET); + } /* }}} */ + + /* PLUS_EQ */ + static NodeType *new_plus_eq(NodeType *lvalue, NodeType *expression) /* {{{ */ + { + NodeType *set = new_op("plus_eq", OPR_PLUS_EQ, 2); + set->unode.opr.op[0] = lvalue; + set->unode.opr.op[1] = expression; + return set; + } + static void commit_plus_eq(NodeType *set) + { + precommit_node(set->unode.opr.op[1]); +#ifdef VERBOSE + printf("add %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str); +#endif + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "add", INSTR_ADD, 2, set->line_number); + commit_node(set->unode.opr.op[0],0); + commit_node(set->unode.opr.op[1],1); + } /* }}} */ + + /* SUB_EQ */ + static NodeType *new_sub_eq(NodeType *lvalue, NodeType *expression) /* {{{ */ + { + NodeType *set = new_op("sub_eq", OPR_SUB_EQ, 2); + set->unode.opr.op[0] = lvalue; + set->unode.opr.op[1] = expression; + return set; + } + static void commit_sub_eq(NodeType *set) + { + precommit_node(set->unode.opr.op[1]); +#ifdef VERBOSE + printf("sub %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str); +#endif + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "sub", INSTR_SUB, 2, set->line_number); + commit_node(set->unode.opr.op[0],0); + commit_node(set->unode.opr.op[1],1); + } /* }}} */ + + /* MUL_EQ */ + static NodeType *new_mul_eq(NodeType *lvalue, NodeType *expression) /* {{{ */ + { + NodeType *set = new_op("mul_eq", OPR_MUL_EQ, 2); + set->unode.opr.op[0] = lvalue; + set->unode.opr.op[1] = expression; + return set; + } + static void commit_mul_eq(NodeType *set) + { + precommit_node(set->unode.opr.op[1]); +#ifdef VERBOSE + printf("mul %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str); +#endif + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "mul", INSTR_MUL, 2, set->line_number); + commit_node(set->unode.opr.op[0],0); + commit_node(set->unode.opr.op[1],1); + } /* }}} */ + + /* DIV_EQ */ + static NodeType *new_div_eq(NodeType *lvalue, NodeType *expression) /* {{{ */ + { + NodeType *set = new_op("div_eq", OPR_DIV_EQ, 2); + set->unode.opr.op[0] = lvalue; + set->unode.opr.op[1] = expression; + return set; + } + static void commit_div_eq(NodeType *set) + { + precommit_node(set->unode.opr.op[1]); +#ifdef VERBOSE + printf("div %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str); +#endif + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "div", INSTR_DIV, 2, set->line_number); + commit_node(set->unode.opr.op[0],0); + commit_node(set->unode.opr.op[1],1); + } /* }}} */ + + /* commodity method for add, mult, ... */ + + static void precommit_expr(NodeType *expr, const char *type, int instr_id) + { /* {{{ */ + NodeType *tmp, *tmpcpy; + int toAdd; + + /* compute "left" and "right" */ + switch (expr->unode.opr.nbOp) { + case 2: + precommit_node(expr->unode.opr.op[1]); + case 1: + precommit_node(expr->unode.opr.op[0]); + } + + if (is_tmp_expr(expr->unode.opr.op[0])) { + tmp = expr->unode.opr.op[0]; + toAdd = 1; + } + else if (is_commutative_expr(instr_id) && (expr->unode.opr.nbOp==2) && is_tmp_expr(expr->unode.opr.op[1])) { + tmp = expr->unode.opr.op[1]; + toAdd = 0; + } + else { + char stmp[256]; + /* declare a temporary variable to store the result */ + if (expr->unode.opr.op[0]->type == CONST_INT_NODE) { + sprintf(stmp,"_i_tmp_%i",allocateTemp()); + gsl_int_decl_global(stmp); + } + else if (expr->unode.opr.op[0]->type == CONST_FLOAT_NODE) { + sprintf(stmp,"_f_tmp%i",allocateTemp()); + gsl_float_decl_global(stmp); + } + else if (expr->unode.opr.op[0]->type == CONST_PTR_NODE) { + sprintf(stmp,"_p_tmp%i",allocateTemp()); + gsl_ptr_decl_global(stmp); + } + else { + int type = gsl_type_of_var(expr->unode.opr.op[0]->vnamespace, expr->unode.opr.op[0]->str); + if (type == INSTR_FLOAT) { + sprintf(stmp,"_f_tmp_%i",allocateTemp()); + gsl_float_decl_global(stmp); + } + else if (type == INSTR_PTR) { + sprintf(stmp,"_p_tmp_%i",allocateTemp()); + gsl_ptr_decl_global(stmp); + } + else if (type == INSTR_INT) { + sprintf(stmp,"_i_tmp_%i",allocateTemp()); + gsl_int_decl_global(stmp); + } + else if (type == -1) { + fprintf(stderr, "ERROR: Line %d, Could not find variable '%s'\n", + expr->line_number, expr->unode.opr.op[0]->str); + exit(1); + } + else { /* type is a struct_id */ + sprintf(stmp,"_s_tmp_%i",allocateTemp()); + gsl_struct_decl_global_from_id(stmp,type); + } + } + tmp = new_var(stmp,expr->line_number); + + /* set the tmp to the value of "op1" */ + tmpcpy = nodeClone(tmp); + commit_node(new_set(tmp,expr->unode.opr.op[0]),0); + toAdd = 1; + + tmp = tmpcpy; + } + + /* add op2 to tmp */ +#ifdef VERBOSE + if (expr->unode.opr.nbOp == 2) + printf("%s %s %s\n", type, tmp->str, expr->unode.opr.op[toAdd]->str); + else + printf("%s %s\n", type, tmp->str); +#endif + currentGoomSL->instr = gsl_instr_init(currentGoomSL, type, instr_id, expr->unode.opr.nbOp, expr->line_number); + tmpcpy = nodeClone(tmp); + commit_node(tmp,0); + if (expr->unode.opr.nbOp == 2) { + commit_node(expr->unode.opr.op[toAdd],1); + } + + /* redefine the ADD node now as the computed variable */ + nodeFreeInternals(expr); + *expr = *tmpcpy; + free(tmpcpy); + } /* }}} */ + + static NodeType *new_expr1(const char *name, int id, NodeType *expr1) + { /* {{{ */ + NodeType *add = new_op(name, id, 1); + add->unode.opr.op[0] = expr1; + return add; + } /* }}} */ + + static NodeType *new_expr2(const char *name, int id, NodeType *expr1, NodeType *expr2) + { /* {{{ */ + NodeType *add = new_op(name, id, 2); + add->unode.opr.op[0] = expr1; + add->unode.opr.op[1] = expr2; + return add; + } /* }}} */ + + /* ADD */ + static NodeType *new_add(NodeType *expr1, NodeType *expr2) { /* {{{ */ + return new_expr2("add", OPR_ADD, expr1, expr2); + } + static void precommit_add(NodeType *add) { + precommit_expr(add,"add",INSTR_ADD); + } /* }}} */ + + /* SUB */ + static NodeType *new_sub(NodeType *expr1, NodeType *expr2) { /* {{{ */ + return new_expr2("sub", OPR_SUB, expr1, expr2); + } + static void precommit_sub(NodeType *sub) { + precommit_expr(sub,"sub",INSTR_SUB); + } /* }}} */ + + /* NEG */ + static NodeType *new_neg(NodeType *expr) { /* {{{ */ + NodeType *zeroConst = NULL; + if (expr->type == CONST_INT_NODE) + zeroConst = new_constInt("0", currentGoomSL->num_lines); + else if (expr->type == CONST_FLOAT_NODE) + zeroConst = new_constFloat("0.0", currentGoomSL->num_lines); + else if (expr->type == CONST_PTR_NODE) { + fprintf(stderr, "ERROR: Line %d, Could not negate const pointer.\n", + currentGoomSL->num_lines); + exit(1); + } + else { + int type = gsl_type_of_var(expr->vnamespace, expr->str); + if (type == INSTR_FLOAT) + zeroConst = new_constFloat("0.0", currentGoomSL->num_lines); + else if (type == INSTR_PTR) { + fprintf(stderr, "ERROR: Line %d, Could not negate pointer.\n", + currentGoomSL->num_lines); + exit(1); + } + else if (type == INSTR_INT) + zeroConst = new_constInt("0", currentGoomSL->num_lines); + else if (type == -1) { + fprintf(stderr, "ERROR: Line %d, Could not find variable '%s'\n", + expr->line_number, expr->unode.opr.op[0]->str); + exit(1); + } + else { /* type is a struct_id */ + fprintf(stderr, "ERROR: Line %d, Could not negate struct '%s'\n", + expr->line_number, expr->str); + exit(1); + } + } + return new_expr2("sub", OPR_SUB, zeroConst, expr); + } + /* }}} */ + + /* MUL */ + static NodeType *new_mul(NodeType *expr1, NodeType *expr2) { /* {{{ */ + return new_expr2("mul", OPR_MUL, expr1, expr2); + } + static void precommit_mul(NodeType *mul) { + precommit_expr(mul,"mul",INSTR_MUL); + } /* }}} */ + + /* DIV */ + static NodeType *new_div(NodeType *expr1, NodeType *expr2) { /* {{{ */ + return new_expr2("div", OPR_DIV, expr1, expr2); + } + static void precommit_div(NodeType *mul) { + precommit_expr(mul,"div",INSTR_DIV); + } /* }}} */ + + /* CALL EXPRESSION */ + static NodeType *new_call_expr(const char *name, NodeType *affect_list) { /* {{{ */ + NodeType *call = new_call(name,affect_list); + NodeType *node = new_expr1(name, OPR_CALL_EXPR, call); + node->vnamespace = gsl_find_namespace(name); + if (node->vnamespace == NULL) + fprintf(stderr, "ERROR: Line %d, No return type for: '%s'\n", currentGoomSL->num_lines, name); + return node; + } + static void precommit_call_expr(NodeType *call) { + char stmp[256]; + NodeType *tmp,*tmpcpy; + int type = gsl_type_of_var(call->vnamespace, call->str); + if (type == INSTR_FLOAT) { + sprintf(stmp,"_f_tmp_%i",allocateTemp()); + gsl_float_decl_global(stmp); + } + else if (type == INSTR_PTR) { + sprintf(stmp,"_p_tmp_%i",allocateTemp()); + gsl_ptr_decl_global(stmp); + } + else if (type == INSTR_INT) { + sprintf(stmp,"_i_tmp_%i",allocateTemp()); + gsl_int_decl_global(stmp); + } + else if (type == -1) { + fprintf(stderr, "ERROR: Line %d, Could not find variable '%s'\n", + call->line_number, call->str); + exit(1); + } + else { /* type is a struct_id */ + sprintf(stmp,"_s_tmp_%i",allocateTemp()); + gsl_struct_decl_global_from_id(stmp,type); + } + tmp = new_var(stmp,call->line_number); + commit_node(call->unode.opr.op[0],0); + tmpcpy = nodeClone(tmp); + commit_node(new_set(tmp,new_var(call->str,call->line_number)),0); + + nodeFreeInternals(call); + *call = *tmpcpy; + free(tmpcpy); + } /* }}} */ + + static void commit_test2(NodeType *set,const char *type, int instr) + { /* {{{ */ + NodeType *tmp; + char stmp[256]; + precommit_node(set->unode.opr.op[0]); + precommit_node(set->unode.opr.op[1]); + tmp = set->unode.opr.op[0]; + + stmp[0] = 0; + if (set->unode.opr.op[0]->type == CONST_INT_NODE) { + sprintf(stmp,"_i_tmp_%i",allocateTemp()); + gsl_int_decl_global(stmp); + } + else if (set->unode.opr.op[0]->type == CONST_FLOAT_NODE) { + sprintf(stmp,"_f_tmp%i",allocateTemp()); + gsl_float_decl_global(stmp); + } + else if (set->unode.opr.op[0]->type == CONST_PTR_NODE) { + sprintf(stmp,"_p_tmp%i",allocateTemp()); + gsl_ptr_decl_global(stmp); + } + if (stmp[0]) { + NodeType *tmpcpy; + tmp = new_var(stmp, set->line_number); + tmpcpy = nodeClone(tmp); + commit_node(new_set(tmp,set->unode.opr.op[0]),0); + tmp = tmpcpy; + } + +#ifdef VERBOSE + printf("%s %s %s\n", type, tmp->str, set->unode.opr.op[1]->str); +#endif + currentGoomSL->instr = gsl_instr_init(currentGoomSL, type, instr, 2, set->line_number); + commit_node(tmp,instr!=INSTR_SET); + commit_node(set->unode.opr.op[1],1); + } /* }}} */ + + /* NOT */ + static NodeType *new_not(NodeType *expr1) { /* {{{ */ + return new_expr1("not", OPR_NOT, expr1); + } + static void commit_not(NodeType *set) + { + commit_node(set->unode.opr.op[0],0); +#ifdef VERBOSE + printf("not\n"); +#endif + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "not", INSTR_NOT, 1, set->line_number); + gsl_instr_add_param(currentGoomSL->instr, "|dummy|", TYPE_LABEL); + } /* }}} */ + + /* EQU */ + static NodeType *new_equ(NodeType *expr1, NodeType *expr2) { /* {{{ */ + return new_expr2("isequal", OPR_EQU, expr1, expr2); + } + static void commit_equ(NodeType *mul) { + commit_test2(mul,"isequal",INSTR_ISEQUAL); + } /* }}} */ + + /* INF */ + static NodeType *new_low(NodeType *expr1, NodeType *expr2) { /* {{{ */ + return new_expr2("islower", OPR_LOW, expr1, expr2); + } + static void commit_low(NodeType *mul) { + commit_test2(mul,"islower",INSTR_ISLOWER); + } /* }}} */ + + /* WHILE */ + static NodeType *new_while(NodeType *expression, NodeType *instr) { /* {{{ */ + NodeType *node = new_op("while", OPR_WHILE, 2); + node->unode.opr.op[0] = expression; + node->unode.opr.op[1] = instr; + return node; + } + + static void commit_while(NodeType *node) + { + int lbl = allocateLabel(); + char start_while[1024], test_while[1024]; + sprintf(start_while, "|start_while_%d|", lbl); + sprintf(test_while, "|test_while_%d|", lbl); + + GSL_PUT_JUMP(test_while,node->line_number); + GSL_PUT_LABEL(start_while,node->line_number); + + /* code */ + commit_node(node->unode.opr.op[1],0); + + GSL_PUT_LABEL(test_while,node->line_number); + commit_node(node->unode.opr.op[0],0); + GSL_PUT_JNZERO(start_while,node->line_number); + } /* }}} */ + + /* FOR EACH */ + static NodeType *new_static_foreach(NodeType *var, NodeType *var_list, NodeType *instr) { /* {{{ */ + NodeType *node = new_op("for", OPR_FOREACH, 3); + node->unode.opr.op[0] = var; + node->unode.opr.op[1] = var_list; + node->unode.opr.op[2] = instr; + node->line_number = currentGoomSL->num_lines; + return node; + } + static void commit_foreach(NodeType *node) + { + NodeType *cur = node->unode.opr.op[1]; + char tmp_func[256], tmp_loop[256]; + int lbl = allocateLabel(); + sprintf(tmp_func, "|foreach_func_%d|", lbl); + sprintf(tmp_loop, "|foreach_loop_%d|", lbl); + + GSL_PUT_JUMP(tmp_loop, node->line_number); + GSL_PUT_LABEL(tmp_func, node->line_number); + + precommit_node(node->unode.opr.op[2]); + commit_node(node->unode.opr.op[2], 0); + + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "ret", INSTR_RET, 1, node->line_number); + gsl_instr_add_param(currentGoomSL->instr, "|dummy|", TYPE_LABEL); +#ifdef VERBOSE + printf("ret\n"); +#endif + + GSL_PUT_LABEL(tmp_loop, node->line_number); + + while (cur != NULL) + { + NodeType *x, *var; + + /* 1: x=var */ + x = nodeClone(node->unode.opr.op[0]); + var = nodeClone(cur->unode.opr.op[0]); + commit_node(new_set(x, var),0); + + /* 2: instr */ + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "call", INSTR_CALL, 1, node->line_number); + gsl_instr_add_param(currentGoomSL->instr, tmp_func, TYPE_LABEL); +#ifdef VERBOSE + printf("call %s\n", tmp_func); +#endif + + /* 3: var=x */ + x = nodeClone(node->unode.opr.op[0]); + var = cur->unode.opr.op[0]; + commit_node(new_set(var, x),0); + cur = cur->unode.opr.op[1]; + } + nodeFree(node->unode.opr.op[0]); + } /* }}} */ + + /* IF */ + static NodeType *new_if(NodeType *expression, NodeType *instr) { /* {{{ */ + NodeType *node = new_op("if", OPR_IF, 2); + node->unode.opr.op[0] = expression; + node->unode.opr.op[1] = instr; + return node; + } + static void commit_if(NodeType *node) { + + char slab[1024]; + sprintf(slab, "|eif%d|", allocateLabel()); + commit_node(node->unode.opr.op[0],0); + GSL_PUT_JZERO(slab,node->line_number); + /* code */ + commit_node(node->unode.opr.op[1],0); + GSL_PUT_LABEL(slab,node->line_number); + } /* }}} */ + + /* BLOCK */ + static NodeType *new_block(NodeType *lastNode) { /* {{{ */ + NodeType *blk = new_op("block", OPR_BLOCK, 2); + blk->unode.opr.op[0] = new_nop("start_of_block"); + blk->unode.opr.op[1] = lastNode; + return blk; + } + static void commit_block(NodeType *node) { + commit_node(node->unode.opr.op[0]->unode.opr.next,0); + } /* }}} */ + + /* FUNCTION INTRO */ + static NodeType *new_function_intro(const char *name) { /* {{{ */ + char stmp[256]; + if (strlen(name) < 200) { + sprintf(stmp, "|__func_%s|", name); + } + return new_op(stmp, OPR_FUNC_INTRO, 0); + } + static void commit_function_intro(NodeType *node) { + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "label", INSTR_LABEL, 1, node->line_number); + gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_LABEL); +#ifdef VERBOSE + printf("label %s\n", node->str); +#endif + } /* }}} */ + + /* FUNCTION OUTRO */ + static NodeType *new_function_outro() { /* {{{ */ + return new_op("ret", OPR_FUNC_OUTRO, 0); + } + static void commit_function_outro(NodeType *node) { + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "ret", INSTR_RET, 1, node->line_number); + gsl_instr_add_param(currentGoomSL->instr, "|dummy|", TYPE_LABEL); + releaseAllTemps(); +#ifdef VERBOSE + printf("ret\n"); +#endif + } /* }}} */ + + /* AFFECTATION LIST */ + static NodeType *new_affec_list(NodeType *set, NodeType *next) /* {{{ */ + { + NodeType *node = new_op("affect_list", OPR_AFFECT_LIST, 2); + node->unode.opr.op[0] = set; + node->unode.opr.op[1] = next; + return node; + } + static NodeType *new_affect_list_after(NodeType *affect_list) + { + NodeType *ret = NULL; + NodeType *cur = affect_list; + while(cur != NULL) { + NodeType *set = cur->unode.opr.op[0]; + NodeType *next = cur->unode.opr.op[1]; + NodeType *lvalue = set->unode.opr.op[0]; + NodeType *expression = set->unode.opr.op[1]; + if ((lvalue->str[0] == '&') && (expression->type == VAR_NODE)) { + NodeType *nset = new_set(nodeClone(expression), nodeClone(lvalue)); + ret = new_affec_list(nset, ret); + } + cur = next; + } + return ret; + } + static void commit_affect_list(NodeType *node) + { + NodeType *cur = node; + while(cur != NULL) { + NodeType *set = cur->unode.opr.op[0]; + precommit_node(set->unode.opr.op[0]); + precommit_node(set->unode.opr.op[1]); + cur = cur->unode.opr.op[1]; + } + cur = node; + while(cur != NULL) { + NodeType *set = cur->unode.opr.op[0]; + commit_node(set,0); + cur = cur->unode.opr.op[1]; + } + } /* }}} */ + + /* VAR LIST */ + static NodeType *new_var_list(NodeType *var, NodeType *next) /* {{{ */ + { + NodeType *node = new_op("var_list", OPR_VAR_LIST, 2); + node->unode.opr.op[0] = var; + node->unode.opr.op[1] = next; + return node; + } + static void commit_var_list(NodeType *node) + { + } /* }}} */ + + /* FUNCTION CALL */ + static NodeType *new_call(const char *name, NodeType *affect_list) { /* {{{ */ + HashValue *fval; + fval = goom_hash_get(currentGoomSL->functions, name); + if (!fval) { + gsl_declare_task(name); + fval = goom_hash_get(currentGoomSL->functions, name); + } + if (!fval) { + fprintf(stderr, "ERROR: Line %d, Could not find function %s\n", currentGoomSL->num_lines, name); + exit(1); + return NULL; + } + else { + ExternalFunctionStruct *gef = (ExternalFunctionStruct*)fval->ptr; + if (gef->is_extern) { + NodeType *node = new_op(name, OPR_EXT_CALL, 1); + node->unode.opr.op[0] = affect_list; + return node; + } + else { + NodeType *node; + char stmp[256]; + if (strlen(name) < 200) { + sprintf(stmp, "|__func_%s|", name); + } + node = new_op(stmp, OPR_CALL, 1); + node->unode.opr.op[0] = affect_list; + return node; + } + } + } + static void commit_ext_call(NodeType *node) { + NodeType *alafter = new_affect_list_after(node->unode.opr.op[0]); + commit_node(node->unode.opr.op[0],0); + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "extcall", INSTR_EXT_CALL, 1, node->line_number); + gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_VAR); +#ifdef VERBOSE + printf("extcall %s\n", node->str); +#endif + commit_node(alafter,0); + } + static void commit_call(NodeType *node) { + NodeType *alafter = new_affect_list_after(node->unode.opr.op[0]); + commit_node(node->unode.opr.op[0],0); + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "call", INSTR_CALL, 1, node->line_number); + gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_LABEL); +#ifdef VERBOSE + printf("call %s\n", node->str); +#endif + commit_node(alafter,0); + } /* }}} */ + + /** **/ + + static NodeType *rootNode = 0; /* TODO: reinitialiser a chaque compilation. */ + static NodeType *lastNode = 0; + static NodeType *gsl_append(NodeType *curNode) { + if (curNode == 0) return 0; /* {{{ */ + if (lastNode) + lastNode->unode.opr.next = curNode; + lastNode = curNode; + while(lastNode->unode.opr.next) lastNode = lastNode->unode.opr.next; + if (rootNode == 0) + rootNode = curNode; + return curNode; + } /* }}} */ + +#if 1 + int allocateTemp() { + return allocateLabel(); + } + void releaseAllTemps() {} + void releaseTemp(int n) {} +#else + static int nbTemp = 0; + static int *tempArray = 0; + static int tempArraySize = 0; + int allocateTemp() { /* TODO: allocateITemp, allocateFTemp */ + int i = 0; /* {{{ */ + if (tempArray == 0) { + tempArraySize = 256; + tempArray = (int*)malloc(tempArraySize * sizeof(int)); + } + while (1) { + int j; + for (j=0;jtype == OPR_NODE) + switch(node->unode.opr.type) { + case OPR_ADD: precommit_add(node); break; + case OPR_SUB: precommit_sub(node); break; + case OPR_MUL: precommit_mul(node); break; + case OPR_DIV: precommit_div(node); break; + case OPR_CALL_EXPR: precommit_call_expr(node); break; + } + } /* }}} */ + + void commit_node(NodeType *node, int releaseIfTmp) + { /* {{{ */ + if (node == 0) return; + + switch(node->type) { + case OPR_NODE: + switch(node->unode.opr.type) { + case OPR_SET: commit_set(node); break; + case OPR_PLUS_EQ: commit_plus_eq(node); break; + case OPR_SUB_EQ: commit_sub_eq(node); break; + case OPR_MUL_EQ: commit_mul_eq(node); break; + case OPR_DIV_EQ: commit_div_eq(node); break; + case OPR_IF: commit_if(node); break; + case OPR_WHILE: commit_while(node); break; + case OPR_BLOCK: commit_block(node); break; + case OPR_FUNC_INTRO: commit_function_intro(node); break; + case OPR_FUNC_OUTRO: commit_function_outro(node); break; + case OPR_CALL: commit_call(node); break; + case OPR_EXT_CALL: commit_ext_call(node); break; + case OPR_EQU: commit_equ(node); break; + case OPR_LOW: commit_low(node); break; + case OPR_NOT: commit_not(node); break; + case OPR_AFFECT_LIST: commit_affect_list(node); break; + case OPR_FOREACH: commit_foreach(node); break; + case OPR_VAR_LIST: commit_var_list(node); break; +#ifdef VERBOSE + case EMPTY_NODE: printf("NOP\n"); break; +#endif + } + + commit_node(node->unode.opr.next,0); /* recursive for the moment, maybe better to do something iterative? */ + break; + + case VAR_NODE: gsl_instr_set_namespace(currentGoomSL->instr, node->vnamespace); + gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_VAR); break; + case CONST_INT_NODE: gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_INTEGER); break; + case CONST_FLOAT_NODE: gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_FLOAT); break; + case CONST_PTR_NODE: gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_PTR); break; + } + if (releaseIfTmp && is_tmp_expr(node)) + releaseTemp(get_tmp_id(node)); + + nodeFree(node); + } /* }}} */ + + NodeType *nodeNew(const char *str, int type, int line_number) { + NodeType *node = (NodeType*)malloc(sizeof(NodeType)); /* {{{ */ + node->type = type; + node->str = (char*)malloc(strlen(str)+1); + node->vnamespace = NULL; + node->line_number = line_number; + strcpy(node->str, str); + return node; + } /* }}} */ + static NodeType *nodeClone(NodeType *node) { + NodeType *ret = nodeNew(node->str, node->type, node->line_number); /* {{{ */ + ret->vnamespace = node->vnamespace; + ret->unode = node->unode; + return ret; + } /* }}} */ + + void nodeFreeInternals(NodeType *node) { + free(node->str); /* {{{ */ + } /* }}} */ + + void nodeFree(NodeType *node) { + nodeFreeInternals(node); /* {{{ */ + free(node); + } /* }}} */ + + NodeType *new_constInt(const char *str, int line_number) { + NodeType *node = nodeNew(str, CONST_INT_NODE, line_number); /* {{{ */ + node->unode.constInt.val = atoi(str); + return node; + } /* }}} */ + + NodeType *new_constPtr(const char *str, int line_number) { + NodeType *node = nodeNew(str, CONST_PTR_NODE, line_number); /* {{{ */ + node->unode.constPtr.id = strtol(str,NULL,0); + return node; + } /* }}} */ + + NodeType *new_constFloat(const char *str, int line_number) { + NodeType *node = nodeNew(str, CONST_FLOAT_NODE, line_number); /* {{{ */ + node->unode.constFloat.val = atof(str); + return node; + } /* }}} */ + + NodeType *new_var(const char *str, int line_number) { + NodeType *node = nodeNew(str, VAR_NODE, line_number); /* {{{ */ + node->vnamespace = gsl_find_namespace(str); + if (node->vnamespace == 0) { + fprintf(stderr, "ERROR: Line %d, Variable not found: '%s'\n", line_number, str); + exit(1); + } + return node; + } /* }}} */ + + NodeType *new_nop(const char *str) { + NodeType *node = new_op(str, EMPTY_NODE, 0); /* {{{ */ + return node; + } /* }}} */ + + NodeType *new_op(const char *str, int type, int nbOp) { + int i; /* {{{ */ + NodeType *node = nodeNew(str, OPR_NODE, currentGoomSL->num_lines); + node->unode.opr.next = 0; + node->unode.opr.type = type; + node->unode.opr.nbOp = nbOp; + for (i=0;iunode.opr.op[i] = 0; + return node; + } /* }}} */ + + + void gsl_declare_global_variable(int type, char *name) { + switch(type){ + case -1: break; + case FLOAT_TK:gsl_float_decl_global(name);break; + case INT_TK: gsl_int_decl_global(name);break; + case PTR_TK: gsl_ptr_decl_global(name);break; + default: + { + int id = type - 1000; + gsl_struct_decl_global_from_id(name,id); + } + } + } + + + +/* Line 189 of yacc.c */ +#line 1268 "goomsl_yacc.c" + +/* Enabling traces. */ +#ifndef YYDEBUG +# define YYDEBUG 0 +#endif + +/* Enabling verbose error messages. */ +#ifdef YYERROR_VERBOSE +# undef YYERROR_VERBOSE +# define YYERROR_VERBOSE 1 +#else +# define YYERROR_VERBOSE 0 +#endif + +/* Enabling the token table. */ +#ifndef YYTOKEN_TABLE +# define YYTOKEN_TABLE 0 +#endif + + +/* Tokens. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + LTYPE_INTEGER = 258, + LTYPE_FLOAT = 259, + LTYPE_VAR = 260, + LTYPE_PTR = 261, + PTR_TK = 262, + INT_TK = 263, + FLOAT_TK = 264, + DECLARE = 265, + EXTERNAL = 266, + WHILE = 267, + DO = 268, + NOT = 269, + PLUS_EQ = 270, + SUB_EQ = 271, + DIV_EQ = 272, + MUL_EQ = 273, + SUP_EQ = 274, + LOW_EQ = 275, + NOT_EQ = 276, + STRUCT = 277, + FOR = 278, + IN = 279 + }; +#endif +/* Tokens. */ +#define LTYPE_INTEGER 258 +#define LTYPE_FLOAT 259 +#define LTYPE_VAR 260 +#define LTYPE_PTR 261 +#define PTR_TK 262 +#define INT_TK 263 +#define FLOAT_TK 264 +#define DECLARE 265 +#define EXTERNAL 266 +#define WHILE 267 +#define DO 268 +#define NOT 269 +#define PLUS_EQ 270 +#define SUB_EQ 271 +#define DIV_EQ 272 +#define MUL_EQ 273 +#define SUP_EQ 274 +#define LOW_EQ 275 +#define NOT_EQ 276 +#define STRUCT 277 +#define FOR 278 +#define IN 279 + + + + +#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED +typedef union YYSTYPE +{ + +/* Line 214 of yacc.c */ +#line 1200 "goomsl_yacc.y" + + int intValue; + float floatValue; + char charValue; + char strValue[2048]; + NodeType *nPtr; + GoomHash *namespace; + GSL_Struct *gsl_struct; + GSL_StructField *gsl_struct_field; + + + +/* Line 214 of yacc.c */ +#line 1365 "goomsl_yacc.c" +} YYSTYPE; +# define YYSTYPE_IS_TRIVIAL 1 +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +#endif + + +/* Copy the second part of user declarations. */ + + +/* Line 264 of yacc.c */ +#line 1377 "goomsl_yacc.c" + +#ifdef short +# undef short +#endif + +#ifdef YYTYPE_UINT8 +typedef YYTYPE_UINT8 yytype_uint8; +#else +typedef unsigned char yytype_uint8; +#endif + +#ifdef YYTYPE_INT8 +typedef YYTYPE_INT8 yytype_int8; +#elif (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +typedef signed char yytype_int8; +#else +typedef short int yytype_int8; +#endif + +#ifdef YYTYPE_UINT16 +typedef YYTYPE_UINT16 yytype_uint16; +#else +typedef unsigned short int yytype_uint16; +#endif + +#ifdef YYTYPE_INT16 +typedef YYTYPE_INT16 yytype_int16; +#else +typedef short int yytype_int16; +#endif + +#ifndef YYSIZE_T +# ifdef __SIZE_TYPE__ +# define YYSIZE_T __SIZE_TYPE__ +# elif defined size_t +# define YYSIZE_T size_t +# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +# include /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +# else +# define YYSIZE_T unsigned int +# endif +#endif + +#define YYSIZE_MAXIMUM ((YYSIZE_T) -1) + +#ifndef YY_ +# if YYENABLE_NLS +# if ENABLE_NLS +# include /* INFRINGES ON USER NAME SPACE */ +# define YY_(msgid) dgettext ("bison-runtime", msgid) +# endif +# endif +# ifndef YY_ +# define YY_(msgid) msgid +# endif +#endif + +/* Suppress unused-variable warnings by "using" E. */ +#if ! defined lint || defined __GNUC__ +# define YYUSE(e) ((void) (e)) +#else +# define YYUSE(e) /* empty */ +#endif + +/* Identity function, used to suppress warnings about constant conditions. */ +#ifndef lint +# define YYID(n) (n) +#else +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static int +YYID (int yyi) +#else +static int +YYID (yyi) + int yyi; +#endif +{ + return yyi; +} +#endif + +#if ! defined yyoverflow || YYERROR_VERBOSE + +/* The parser invokes alloca or malloc; define the necessary symbols. */ + +# ifdef YYSTACK_USE_ALLOCA +# if YYSTACK_USE_ALLOCA +# ifdef __GNUC__ +# define YYSTACK_ALLOC __builtin_alloca +# elif defined __BUILTIN_VA_ARG_INCR +# include /* INFRINGES ON USER NAME SPACE */ +# elif defined _AIX +# define YYSTACK_ALLOC __alloca +# elif defined _MSC_VER +# include /* INFRINGES ON USER NAME SPACE */ +# define alloca _alloca +# else +# define YYSTACK_ALLOC alloca +# if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +# include /* INFRINGES ON USER NAME SPACE */ +# ifndef _STDLIB_H +# define _STDLIB_H 1 +# endif +# endif +# endif +# endif +# endif + +# ifdef YYSTACK_ALLOC + /* Pacify GCC's `empty if-body' warning. */ +# define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) +# ifndef YYSTACK_ALLOC_MAXIMUM + /* The OS might guarantee only one guard page at the bottom of the stack, + and a page size can be as small as 4096 bytes. So we cannot safely + invoke alloca (N) if N exceeds 4096. Use a slightly smaller number + to allow for a few compiler-allocated temporary stack slots. */ +# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ +# endif +# else +# define YYSTACK_ALLOC YYMALLOC +# define YYSTACK_FREE YYFREE +# ifndef YYSTACK_ALLOC_MAXIMUM +# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM +# endif +# if (defined __cplusplus && ! defined _STDLIB_H \ + && ! ((defined YYMALLOC || defined malloc) \ + && (defined YYFREE || defined free))) +# include /* INFRINGES ON USER NAME SPACE */ +# ifndef _STDLIB_H +# define _STDLIB_H 1 +# endif +# endif +# ifndef YYMALLOC +# define YYMALLOC malloc +# if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# ifndef YYFREE +# define YYFREE free +# if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +void free (void *); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# endif +#endif /* ! defined yyoverflow || YYERROR_VERBOSE */ + + +#if (! defined yyoverflow \ + && (! defined __cplusplus \ + || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) + +/* A type that is properly aligned for any stack member. */ +union yyalloc +{ + yytype_int16 yyss_alloc; + YYSTYPE yyvs_alloc; +}; + +/* The size of the maximum gap between one aligned stack and the next. */ +# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) + +/* The size of an array large to enough to hold all stacks, each with + N elements. */ +# define YYSTACK_BYTES(N) \ + ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ + + YYSTACK_GAP_MAXIMUM) + +/* Copy COUNT objects from FROM to TO. The source and destination do + not overlap. */ +# ifndef YYCOPY +# if defined __GNUC__ && 1 < __GNUC__ +# define YYCOPY(To, From, Count) \ + __builtin_memcpy (To, From, (Count) * sizeof (*(From))) +# else +# define YYCOPY(To, From, Count) \ + do \ + { \ + YYSIZE_T yyi; \ + for (yyi = 0; yyi < (Count); yyi++) \ + (To)[yyi] = (From)[yyi]; \ + } \ + while (YYID (0)) +# endif +# endif + +/* Relocate STACK from its old location to the new one. The + local variables YYSIZE and YYSTACKSIZE give the old and new number of + elements in the stack, and YYPTR gives the new location of the + stack. Advance YYPTR to a properly aligned location for the next + stack. */ +# define YYSTACK_RELOCATE(Stack_alloc, Stack) \ + do \ + { \ + YYSIZE_T yynewbytes; \ + YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ + Stack = &yyptr->Stack_alloc; \ + yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ + yyptr += yynewbytes / sizeof (*yyptr); \ + } \ + while (YYID (0)) + +#endif + +/* YYFINAL -- State number of the termination state. */ +#define YYFINAL 3 +/* YYLAST -- Last index in YYTABLE. */ +#define YYLAST 229 + +/* YYNTOKENS -- Number of terminals. */ +#define YYNTOKENS 42 +/* YYNNTS -- Number of nonterminals. */ +#define YYNNTS 30 +/* YYNRULES -- Number of rules. */ +#define YYNRULES 89 +/* YYNRULES -- Number of states. */ +#define YYNSTATES 217 + +/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ +#define YYUNDEFTOK 2 +#define YYMAXUTOK 279 + +#define YYTRANSLATE(YYX) \ + ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) + +/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ +static const yytype_uint8 yytranslate[] = +{ + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 25, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 35, 36, 32, 29, 34, 30, 2, 31, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 33, 2, + 27, 26, 28, 37, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 40, 2, 41, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 38, 2, 39, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, + 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24 +}; + +#if YYDEBUG +/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in + YYRHS. */ +static const yytype_uint16 yyprhs[] = +{ + 0, 0, 3, 7, 10, 19, 30, 39, 50, 53, + 56, 57, 65, 68, 73, 76, 79, 82, 85, 87, + 89, 90, 93, 96, 99, 102, 104, 108, 111, 112, + 116, 122, 130, 131, 132, 137, 142, 147, 152, 154, + 157, 160, 163, 166, 169, 172, 179, 186, 193, 195, + 199, 203, 207, 211, 218, 222, 224, 227, 231, 232, + 234, 236, 240, 244, 248, 252, 255, 259, 261, 265, + 269, 273, 277, 281, 285, 288, 290, 292, 294, 298, + 304, 310, 318, 323, 330, 333, 335, 340, 344, 346 +}; + +/* YYRHS -- A `-1'-separated list of the rules' RHS. */ +static const yytype_int8 yyrhs[] = +{ + 43, 0, -1, 44, 55, 52, -1, 44, 59, -1, + 44, 11, 27, 48, 28, 50, 25, 56, -1, 44, + 11, 27, 48, 33, 51, 28, 50, 25, 56, -1, + 44, 10, 27, 49, 28, 50, 25, 56, -1, 44, + 10, 27, 49, 33, 51, 28, 50, 25, 56, -1, + 44, 45, -1, 44, 25, -1, -1, 22, 27, 5, + 33, 46, 28, 25, -1, 71, 47, -1, 46, 34, + 71, 47, -1, 8, 5, -1, 9, 5, -1, 7, + 5, -1, 5, 5, -1, 5, -1, 5, -1, -1, + 33, 8, -1, 33, 9, -1, 33, 7, -1, 33, + 5, -1, 58, -1, 58, 34, 51, -1, 52, 53, + -1, -1, 54, 44, 55, -1, 27, 49, 28, 50, + 25, -1, 27, 49, 33, 51, 28, 50, 25, -1, + -1, -1, 9, 5, 26, 64, -1, 8, 5, 26, + 64, -1, 7, 5, 26, 64, -1, 5, 5, 26, + 64, -1, 58, -1, 9, 5, -1, 8, 5, -1, + 7, 5, -1, 5, 5, -1, 62, 25, -1, 57, + 25, -1, 35, 65, 36, 37, 71, 59, -1, 12, + 65, 71, 13, 71, 59, -1, 38, 25, 63, 44, + 39, 25, -1, 67, -1, 5, 15, 64, -1, 5, + 16, 64, -1, 5, 18, 64, -1, 5, 17, 64, + -1, 23, 5, 24, 60, 13, 59, -1, 35, 61, + 36, -1, 5, -1, 5, 61, -1, 5, 26, 64, + -1, -1, 5, -1, 66, -1, 64, 32, 64, -1, + 64, 31, 64, -1, 64, 29, 64, -1, 64, 30, + 64, -1, 30, 64, -1, 35, 64, 36, -1, 68, + -1, 64, 26, 64, -1, 64, 27, 64, -1, 64, + 28, 64, -1, 64, 19, 64, -1, 64, 20, 64, + -1, 64, 21, 64, -1, 14, 65, -1, 4, -1, + 3, -1, 6, -1, 49, 25, 56, -1, 49, 33, + 69, 25, 56, -1, 40, 49, 41, 25, 56, -1, + 40, 49, 33, 69, 41, 25, 56, -1, 40, 49, + 56, 41, -1, 40, 49, 33, 69, 41, 56, -1, + 70, 69, -1, 70, -1, 5, 26, 56, 64, -1, + 33, 56, 64, -1, 25, -1, -1 +}; + +/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ +static const yytype_uint16 yyrline[] = +{ + 0, 1237, 1237, 1239, 1240, 1241, 1242, 1243, 1244, 1245, + 1246, 1251, 1254, 1255, 1258, 1259, 1260, 1261, 1266, 1268, + 1271, 1272, 1273, 1274, 1275, 1278, 1279, 1284, 1285, 1288, + 1290, 1292, 1295, 1297, 1301, 1302, 1303, 1304, 1305, 1308, + 1309, 1310, 1311, 1316, 1317, 1318, 1319, 1320, 1321, 1322, + 1323, 1324, 1325, 1326, 1329, 1331, 1332, 1335, 1337, 1340, + 1341, 1342, 1343, 1344, 1345, 1346, 1347, 1348, 1351, 1352, + 1353, 1354, 1355, 1356, 1357, 1360, 1361, 1362, 1367, 1368, + 1369, 1370, 1374, 1375, 1378, 1379, 1381, 1385, 1394, 1394 +}; +#endif + +#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE +/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. + First, the terminals, then, starting at YYNTOKENS, nonterminals. */ +static const char *const yytname[] = +{ + "$end", "error", "$undefined", "LTYPE_INTEGER", "LTYPE_FLOAT", + "LTYPE_VAR", "LTYPE_PTR", "PTR_TK", "INT_TK", "FLOAT_TK", "DECLARE", + "EXTERNAL", "WHILE", "DO", "NOT", "PLUS_EQ", "SUB_EQ", "DIV_EQ", + "MUL_EQ", "SUP_EQ", "LOW_EQ", "NOT_EQ", "STRUCT", "FOR", "IN", "'\\n'", + "'='", "'<'", "'>'", "'+'", "'-'", "'/'", "'*'", "':'", "','", "'('", + "')'", "'?'", "'{'", "'}'", "'['", "']'", "$accept", "gsl", "gsl_code", + "struct_declaration", "struct_members", "struct_member", "ext_task_name", + "task_name", "return_type", "arglist", "gsl_def_functions", "function", + "function_intro", "function_outro", "leave_namespace", "declaration", + "empty_declaration", "instruction", "var_list", "var_list_content", + "affectation", "start_block", "expression", "test", "constValue", + "func_call", "func_call_expression", "affectation_list", + "affectation_in_list", "opt_nl", 0 +}; +#endif + +# ifdef YYPRINT +/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to + token YYLEX-NUM. */ +static const yytype_uint16 yytoknum[] = +{ + 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 10, 61, 60, 62, 43, + 45, 47, 42, 58, 44, 40, 41, 63, 123, 125, + 91, 93 +}; +# endif + +/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ +static const yytype_uint8 yyr1[] = +{ + 0, 42, 43, 44, 44, 44, 44, 44, 44, 44, + 44, 45, 46, 46, 47, 47, 47, 47, 48, 49, + 50, 50, 50, 50, 50, 51, 51, 52, 52, 53, + 54, 54, 55, 56, 57, 57, 57, 57, 57, 58, + 58, 58, 58, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 60, 61, 61, 62, 63, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 65, 65, + 65, 65, 65, 65, 65, 66, 66, 66, 67, 67, + 67, 67, 68, 68, 69, 69, 70, 70, 71, 71 +}; + +/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ +static const yytype_uint8 yyr2[] = +{ + 0, 2, 3, 2, 8, 10, 8, 10, 2, 2, + 0, 7, 2, 4, 2, 2, 2, 2, 1, 1, + 0, 2, 2, 2, 2, 1, 3, 2, 0, 3, + 5, 7, 0, 0, 4, 4, 4, 4, 1, 2, + 2, 2, 2, 2, 2, 6, 6, 6, 1, 3, + 3, 3, 3, 6, 3, 1, 2, 3, 0, 1, + 1, 3, 3, 3, 3, 2, 3, 1, 3, 3, + 3, 3, 3, 3, 2, 1, 1, 1, 3, 5, + 5, 7, 4, 6, 2, 1, 4, 3, 1, 0 +}; + +/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state + STATE-NUM when YYTABLE doesn't specify something else to do. Zero + means the default is an error. */ +static const yytype_uint8 yydefact[] = +{ + 10, 0, 32, 1, 19, 0, 0, 0, 0, 0, + 0, 0, 0, 9, 0, 0, 0, 8, 0, 28, + 0, 38, 3, 0, 48, 42, 0, 0, 0, 0, + 0, 41, 40, 39, 0, 0, 76, 75, 59, 77, + 0, 0, 0, 0, 0, 89, 60, 67, 0, 0, + 0, 58, 19, 0, 33, 0, 2, 44, 43, 0, + 49, 50, 52, 51, 57, 0, 0, 0, 0, 18, + 0, 74, 65, 0, 33, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 88, 0, 0, 0, 0, + 10, 0, 0, 78, 0, 33, 0, 85, 0, 27, + 10, 37, 36, 35, 34, 20, 0, 20, 0, 66, + 0, 0, 71, 72, 73, 68, 69, 70, 63, 64, + 62, 61, 89, 89, 0, 0, 89, 0, 0, 33, + 33, 0, 33, 84, 0, 32, 0, 0, 0, 0, + 0, 0, 0, 25, 0, 0, 0, 82, 0, 0, + 0, 55, 0, 0, 0, 0, 0, 80, 0, 87, + 79, 20, 0, 29, 24, 23, 21, 22, 33, 42, + 41, 40, 39, 20, 0, 33, 20, 33, 46, 0, + 89, 0, 0, 0, 0, 12, 56, 54, 53, 45, + 47, 33, 86, 0, 0, 6, 0, 26, 4, 0, + 83, 11, 0, 17, 16, 14, 15, 81, 30, 20, + 33, 33, 13, 0, 7, 5, 31 +}; + +/* YYDEFGOTO[NTERM-NUM]. */ +static const yytype_int16 yydefgoto[] = +{ + -1, 1, 2, 17, 149, 185, 70, 18, 137, 142, + 56, 99, 100, 19, 93, 20, 21, 22, 125, 152, + 23, 90, 44, 45, 46, 24, 47, 96, 97, 86 +}; + +/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + STATE-NUM. */ +#define YYPACT_NINF -116 +static const yytype_int16 yypact[] = +{ + -116, 40, 136, -116, 103, 39, 66, 68, 61, 65, + 1, 77, 101, -116, 1, 84, 109, -116, 12, -116, + 91, -116, -116, 97, -116, 98, 72, 72, 72, 72, + 72, 99, 104, 113, 109, 130, -116, -116, -116, -116, + 1, 72, 72, 109, 166, 115, -116, -116, 145, 131, + 118, -116, -116, -24, -116, -3, 138, -116, -116, 72, + 159, 159, 159, 159, 159, 72, 72, 72, 14, -116, + 51, -116, 22, 102, 124, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, -116, 160, 139, 140, 141, + -116, -3, 152, -116, 154, -116, 156, -3, 109, -116, + -116, 159, 159, 159, 159, 150, 82, 150, 82, -116, + -3, 158, 159, 159, 159, 159, 159, 159, 22, 22, + -116, -116, 115, 115, 195, 188, 115, 88, 162, -116, + -116, 72, -116, -116, 52, 136, 155, 177, 199, 200, + 201, 202, 180, 175, 185, 183, 171, -116, 144, 18, + 161, 195, 178, 144, 144, 190, 191, -116, 72, 159, + -116, 150, 82, -116, -116, -116, -116, -116, -116, -116, + -116, -116, -116, 150, 82, -116, 150, -116, -116, 192, + 115, 208, 213, 214, 215, -116, -116, -116, -116, -116, + -116, -116, 159, 196, 194, -116, 198, -116, -116, 203, + -116, -116, 161, -116, -116, -116, -116, -116, -116, 150, + -116, -116, -116, 204, -116, -116, -116 +}; + +/* YYPGOTO[NTERM-NUM]. */ +static const yytype_int8 yypgoto[] = +{ + -116, -116, -68, -116, -116, 23, -116, -15, -104, -92, + -116, -116, -116, 89, -74, -116, -88, -115, -116, 75, + -116, -116, -16, -6, -116, -116, -116, -62, -116, -99 +}; + +/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If + positive, shift that token. If negative, reduce the rule which + number is the opposite. If zero, do what YYDEFACT says. + If YYTABLE_NINF, syntax error. */ +#define YYTABLE_NINF -1 +static const yytype_uint8 yytable[] = +{ + 111, 53, 94, 144, 36, 37, 38, 39, 50, 91, + 60, 61, 62, 63, 64, 40, 145, 92, 143, 68, + 143, 131, 127, 148, 150, 72, 73, 154, 74, 128, + 95, 41, 135, 178, 71, 133, 42, 54, 188, 189, + 3, 43, 105, 101, 31, 55, 179, 106, 146, 102, + 103, 104, 180, 83, 84, 157, 158, 193, 160, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 196, + 194, 32, 199, 33, 143, 36, 37, 38, 39, 107, + 161, 202, 197, 134, 108, 162, 143, 138, 34, 139, + 140, 141, 35, 4, 195, 5, 6, 7, 8, 9, + 10, 198, 41, 200, 48, 213, 49, 42, 25, 51, + 11, 12, 43, 13, 52, 159, 57, 207, 26, 27, + 28, 29, 58, 14, 59, 65, 15, 155, 16, 30, + 66, 81, 82, 83, 84, 69, 214, 215, 109, 67, + 85, 4, 192, 5, 6, 7, 8, 9, 10, 4, + 87, 5, 6, 7, 89, 88, 10, 110, 11, 12, + 164, 13, 165, 166, 167, 98, 181, 12, 182, 183, + 184, 14, 123, 122, 15, 124, 16, 129, 126, 14, + 130, 132, 15, 136, 16, 75, 76, 77, 81, 82, + 83, 84, 78, 79, 80, 81, 82, 83, 84, 147, + 151, 153, 168, 156, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 203, 187, 190, 191, 201, 204, 205, + 206, 208, 209, 210, 163, 212, 186, 0, 211, 216 +}; + +static const yytype_int16 yycheck[] = +{ + 74, 16, 5, 107, 3, 4, 5, 6, 14, 33, + 26, 27, 28, 29, 30, 14, 108, 41, 106, 34, + 108, 95, 90, 122, 123, 41, 42, 126, 43, 91, + 33, 30, 100, 148, 40, 97, 35, 25, 153, 154, + 0, 40, 28, 59, 5, 33, 28, 33, 110, 65, + 66, 67, 34, 31, 32, 129, 130, 161, 132, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 173, + 162, 5, 176, 5, 162, 3, 4, 5, 6, 28, + 28, 180, 174, 98, 33, 33, 174, 5, 27, 7, + 8, 9, 27, 5, 168, 7, 8, 9, 10, 11, + 12, 175, 30, 177, 27, 209, 5, 35, 5, 25, + 22, 23, 40, 25, 5, 131, 25, 191, 15, 16, + 17, 18, 25, 35, 26, 26, 38, 39, 40, 26, + 26, 29, 30, 31, 32, 5, 210, 211, 36, 26, + 25, 5, 158, 7, 8, 9, 10, 11, 12, 5, + 5, 7, 8, 9, 36, 24, 12, 33, 22, 23, + 5, 25, 7, 8, 9, 27, 5, 23, 7, 8, + 9, 35, 33, 13, 38, 35, 40, 25, 37, 35, + 26, 25, 38, 33, 40, 19, 20, 21, 29, 30, + 31, 32, 26, 27, 28, 29, 30, 31, 32, 41, + 5, 13, 25, 41, 5, 5, 5, 5, 28, 34, + 25, 28, 41, 5, 36, 25, 25, 25, 5, 5, + 5, 25, 28, 25, 135, 202, 151, -1, 25, 25 +}; + +/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing + symbol of state STATE-NUM. */ +static const yytype_uint8 yystos[] = +{ + 0, 43, 44, 0, 5, 7, 8, 9, 10, 11, + 12, 22, 23, 25, 35, 38, 40, 45, 49, 55, + 57, 58, 59, 62, 67, 5, 15, 16, 17, 18, + 26, 5, 5, 5, 27, 27, 3, 4, 5, 6, + 14, 30, 35, 40, 64, 65, 66, 68, 27, 5, + 65, 25, 5, 49, 25, 33, 52, 25, 25, 26, + 64, 64, 64, 64, 64, 26, 26, 26, 49, 5, + 48, 65, 64, 64, 49, 19, 20, 21, 26, 27, + 28, 29, 30, 31, 32, 25, 71, 5, 24, 36, + 63, 33, 41, 56, 5, 33, 69, 70, 27, 53, + 54, 64, 64, 64, 64, 28, 33, 28, 33, 36, + 33, 56, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 13, 33, 35, 60, 37, 44, 69, 25, + 26, 56, 25, 69, 49, 44, 33, 50, 5, 7, + 8, 9, 51, 58, 50, 51, 69, 41, 71, 46, + 71, 5, 61, 13, 71, 39, 41, 56, 56, 64, + 56, 28, 33, 55, 5, 7, 8, 9, 25, 5, + 5, 5, 5, 28, 34, 25, 28, 41, 59, 28, + 34, 5, 7, 8, 9, 47, 61, 36, 59, 59, + 25, 25, 64, 50, 51, 56, 50, 51, 56, 50, + 56, 25, 71, 5, 5, 5, 5, 56, 25, 28, + 25, 25, 47, 50, 56, 56, 25 +}; + +#define yyerrok (yyerrstatus = 0) +#define yyclearin (yychar = YYEMPTY) +#define YYEMPTY (-2) +#define YYEOF 0 + +#define YYACCEPT goto yyacceptlab +#define YYABORT goto yyabortlab +#define YYERROR goto yyerrorlab + + +/* Like YYERROR except do call yyerror. This remains here temporarily + to ease the transition to the new meaning of YYERROR, for GCC. + Once GCC version 2 has supplanted version 1, this can go. */ + +#define YYFAIL goto yyerrlab + +#define YYRECOVERING() (!!yyerrstatus) + +#define YYBACKUP(Token, Value) \ +do \ + if (yychar == YYEMPTY && yylen == 1) \ + { \ + yychar = (Token); \ + yylval = (Value); \ + yytoken = YYTRANSLATE (yychar); \ + YYPOPSTACK (1); \ + goto yybackup; \ + } \ + else \ + { \ + yyerror (YY_("syntax error: cannot back up")); \ + YYERROR; \ + } \ +while (YYID (0)) + + +#define YYTERROR 1 +#define YYERRCODE 256 + + +/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. + If N is 0, then set CURRENT to the empty location which ends + the previous symbol: RHS[0] (always defined). */ + +#define YYRHSLOC(Rhs, K) ((Rhs)[K]) +#ifndef YYLLOC_DEFAULT +# define YYLLOC_DEFAULT(Current, Rhs, N) \ + do \ + if (YYID (N)) \ + { \ + (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ + (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ + (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ + (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ + } \ + else \ + { \ + (Current).first_line = (Current).last_line = \ + YYRHSLOC (Rhs, 0).last_line; \ + (Current).first_column = (Current).last_column = \ + YYRHSLOC (Rhs, 0).last_column; \ + } \ + while (YYID (0)) +#endif + + +/* YY_LOCATION_PRINT -- Print the location on the stream. + This macro was not mandated originally: define only if we know + we won't break user code: when these are the locations we know. */ + +#ifndef YY_LOCATION_PRINT +# if YYLTYPE_IS_TRIVIAL +# define YY_LOCATION_PRINT(File, Loc) \ + fprintf (File, "%d.%d-%d.%d", \ + (Loc).first_line, (Loc).first_column, \ + (Loc).last_line, (Loc).last_column) +# else +# define YY_LOCATION_PRINT(File, Loc) ((void) 0) +# endif +#endif + + +/* YYLEX -- calling `yylex' with the right arguments. */ + +#ifdef YYLEX_PARAM +# define YYLEX yylex (YYLEX_PARAM) +#else +# define YYLEX yylex () +#endif + +/* Enable debugging if requested. */ +#if YYDEBUG + +# ifndef YYFPRINTF +# include /* INFRINGES ON USER NAME SPACE */ +# define YYFPRINTF fprintf +# endif + +# define YYDPRINTF(Args) \ +do { \ + if (yydebug) \ + YYFPRINTF Args; \ +} while (YYID (0)) + +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ +do { \ + if (yydebug) \ + { \ + YYFPRINTF (stderr, "%s ", Title); \ + yy_symbol_print (stderr, \ + Type, Value); \ + YYFPRINTF (stderr, "\n"); \ + } \ +} while (YYID (0)) + + +/*--------------------------------. +| Print this symbol on YYOUTPUT. | +`--------------------------------*/ + +/*ARGSUSED*/ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) +#else +static void +yy_symbol_value_print (yyoutput, yytype, yyvaluep) + FILE *yyoutput; + int yytype; + YYSTYPE const * const yyvaluep; +#endif +{ + if (!yyvaluep) + return; +# ifdef YYPRINT + if (yytype < YYNTOKENS) + YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); +# else + YYUSE (yyoutput); +# endif + switch (yytype) + { + default: + break; + } +} + + +/*--------------------------------. +| Print this symbol on YYOUTPUT. | +`--------------------------------*/ + +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) +#else +static void +yy_symbol_print (yyoutput, yytype, yyvaluep) + FILE *yyoutput; + int yytype; + YYSTYPE const * const yyvaluep; +#endif +{ + if (yytype < YYNTOKENS) + YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); + else + YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); + + yy_symbol_value_print (yyoutput, yytype, yyvaluep); + YYFPRINTF (yyoutput, ")"); +} + +/*------------------------------------------------------------------. +| yy_stack_print -- Print the state stack from its BOTTOM up to its | +| TOP (included). | +`------------------------------------------------------------------*/ + +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop) +#else +static void +yy_stack_print (yybottom, yytop) + yytype_int16 *yybottom; + yytype_int16 *yytop; +#endif +{ + YYFPRINTF (stderr, "Stack now"); + for (; yybottom <= yytop; yybottom++) + { + int yybot = *yybottom; + YYFPRINTF (stderr, " %d", yybot); + } + YYFPRINTF (stderr, "\n"); +} + +# define YY_STACK_PRINT(Bottom, Top) \ +do { \ + if (yydebug) \ + yy_stack_print ((Bottom), (Top)); \ +} while (YYID (0)) + + +/*------------------------------------------------. +| Report that the YYRULE is going to be reduced. | +`------------------------------------------------*/ + +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yy_reduce_print (YYSTYPE *yyvsp, int yyrule) +#else +static void +yy_reduce_print (yyvsp, yyrule) + YYSTYPE *yyvsp; + int yyrule; +#endif +{ + int yynrhs = yyr2[yyrule]; + int yyi; + unsigned long int yylno = yyrline[yyrule]; + YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", + yyrule - 1, yylno); + /* The symbols being reduced. */ + for (yyi = 0; yyi < yynrhs; yyi++) + { + YYFPRINTF (stderr, " $%d = ", yyi + 1); + yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], + &(yyvsp[(yyi + 1) - (yynrhs)]) + ); + YYFPRINTF (stderr, "\n"); + } +} + +# define YY_REDUCE_PRINT(Rule) \ +do { \ + if (yydebug) \ + yy_reduce_print (yyvsp, Rule); \ +} while (YYID (0)) + +/* Nonzero means print parse trace. It is left uninitialized so that + multiple parsers can coexist. */ +int yydebug; +#else /* !YYDEBUG */ +# define YYDPRINTF(Args) +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) +# define YY_STACK_PRINT(Bottom, Top) +# define YY_REDUCE_PRINT(Rule) +#endif /* !YYDEBUG */ + + +/* YYINITDEPTH -- initial size of the parser's stacks. */ +#ifndef YYINITDEPTH +# define YYINITDEPTH 200 +#endif + +/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only + if the built-in stack extension method is used). + + Do not make this value too large; the results are undefined if + YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) + evaluated with infinite-precision integer arithmetic. */ + +#ifndef YYMAXDEPTH +# define YYMAXDEPTH 10000 +#endif + + + +#if YYERROR_VERBOSE + +# ifndef yystrlen +# if defined __GLIBC__ && defined _STRING_H +# define yystrlen strlen +# else +/* Return the length of YYSTR. */ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static YYSIZE_T +yystrlen (const char *yystr) +#else +static YYSIZE_T +yystrlen (yystr) + const char *yystr; +#endif +{ + YYSIZE_T yylen; + for (yylen = 0; yystr[yylen]; yylen++) + continue; + return yylen; +} +# endif +# endif + +# ifndef yystpcpy +# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE +# define yystpcpy stpcpy +# else +/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in + YYDEST. */ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static char * +yystpcpy (char *yydest, const char *yysrc) +#else +static char * +yystpcpy (yydest, yysrc) + char *yydest; + const char *yysrc; +#endif +{ + char *yyd = yydest; + const char *yys = yysrc; + + while ((*yyd++ = *yys++) != '\0') + continue; + + return yyd - 1; +} +# endif +# endif + +# ifndef yytnamerr +/* Copy to YYRES the contents of YYSTR after stripping away unnecessary + quotes and backslashes, so that it's suitable for yyerror. The + heuristic is that double-quoting is unnecessary unless the string + contains an apostrophe, a comma, or backslash (other than + backslash-backslash). YYSTR is taken from yytname. If YYRES is + null, do not copy; instead, return the length of what the result + would have been. */ +static YYSIZE_T +yytnamerr (char *yyres, const char *yystr) +{ + if (*yystr == '"') + { + YYSIZE_T yyn = 0; + char const *yyp = yystr; + + for (;;) + switch (*++yyp) + { + case '\'': + case ',': + goto do_not_strip_quotes; + + case '\\': + if (*++yyp != '\\') + goto do_not_strip_quotes; + /* Fall through. */ + default: + if (yyres) + yyres[yyn] = *yyp; + yyn++; + break; + + case '"': + if (yyres) + yyres[yyn] = '\0'; + return yyn; + } + do_not_strip_quotes: ; + } + + if (! yyres) + return yystrlen (yystr); + + return yystpcpy (yyres, yystr) - yyres; +} +# endif + +/* Copy into YYRESULT an error message about the unexpected token + YYCHAR while in state YYSTATE. Return the number of bytes copied, + including the terminating null byte. If YYRESULT is null, do not + copy anything; just return the number of bytes that would be + copied. As a special case, return 0 if an ordinary "syntax error" + message will do. Return YYSIZE_MAXIMUM if overflow occurs during + size calculation. */ +static YYSIZE_T +yysyntax_error (char *yyresult, int yystate, int yychar) +{ + int yyn = yypact[yystate]; + + if (! (YYPACT_NINF < yyn && yyn <= YYLAST)) + return 0; + else + { + int yytype = YYTRANSLATE (yychar); + YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); + YYSIZE_T yysize = yysize0; + YYSIZE_T yysize1; + int yysize_overflow = 0; + enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; + char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; + int yyx; + +# if 0 + /* This is so xgettext sees the translatable formats that are + constructed on the fly. */ + YY_("syntax error, unexpected %s"); + YY_("syntax error, unexpected %s, expecting %s"); + YY_("syntax error, unexpected %s, expecting %s or %s"); + YY_("syntax error, unexpected %s, expecting %s or %s or %s"); + YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); +# endif + char *yyfmt; + char const *yyf; + static char const yyunexpected[] = "syntax error, unexpected %s"; + static char const yyexpecting[] = ", expecting %s"; + static char const yyor[] = " or %s"; + char yyformat[sizeof yyunexpected + + sizeof yyexpecting - 1 + + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) + * (sizeof yyor - 1))]; + char const *yyprefix = yyexpecting; + + /* Start YYX at -YYN if negative to avoid negative indexes in + YYCHECK. */ + int yyxbegin = yyn < 0 ? -yyn : 0; + + /* Stay within bounds of both yycheck and yytname. */ + int yychecklim = YYLAST - yyn + 1; + int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; + int yycount = 1; + + yyarg[0] = yytname[yytype]; + yyfmt = yystpcpy (yyformat, yyunexpected); + + for (yyx = yyxbegin; yyx < yyxend; ++yyx) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) + { + if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) + { + yycount = 1; + yysize = yysize0; + yyformat[sizeof yyunexpected - 1] = '\0'; + break; + } + yyarg[yycount++] = yytname[yyx]; + yysize1 = yysize + yytnamerr (0, yytname[yyx]); + yysize_overflow |= (yysize1 < yysize); + yysize = yysize1; + yyfmt = yystpcpy (yyfmt, yyprefix); + yyprefix = yyor; + } + + yyf = YY_(yyformat); + yysize1 = yysize + yystrlen (yyf); + yysize_overflow |= (yysize1 < yysize); + yysize = yysize1; + + if (yysize_overflow) + return YYSIZE_MAXIMUM; + + if (yyresult) + { + /* Avoid sprintf, as that infringes on the user's name space. + Don't have undefined behavior even if the translation + produced a string with the wrong number of "%s"s. */ + char *yyp = yyresult; + int yyi = 0; + while ((*yyp = *yyf) != '\0') + { + if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) + { + yyp += yytnamerr (yyp, yyarg[yyi++]); + yyf += 2; + } + else + { + yyp++; + yyf++; + } + } + } + return yysize; + } +} +#endif /* YYERROR_VERBOSE */ + + +/*-----------------------------------------------. +| Release the memory associated to this symbol. | +`-----------------------------------------------*/ + +/*ARGSUSED*/ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep) +#else +static void +yydestruct (yymsg, yytype, yyvaluep) + const char *yymsg; + int yytype; + YYSTYPE *yyvaluep; +#endif +{ + YYUSE (yyvaluep); + + if (!yymsg) + yymsg = "Deleting"; + YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); + + switch (yytype) + { + + default: + break; + } +} + +/* Prevent warnings from -Wmissing-prototypes. */ +#ifdef YYPARSE_PARAM +#if defined __STDC__ || defined __cplusplus +int yyparse (void *YYPARSE_PARAM); +#else +int yyparse (); +#endif +#else /* ! YYPARSE_PARAM */ +#if defined __STDC__ || defined __cplusplus +int yyparse (void); +#else +int yyparse (); +#endif +#endif /* ! YYPARSE_PARAM */ + + +/* The lookahead symbol. */ +int yychar; + +/* The semantic value of the lookahead symbol. */ +YYSTYPE yylval; + +/* Number of syntax errors so far. */ +int yynerrs; + + + +/*-------------------------. +| yyparse or yypush_parse. | +`-------------------------*/ + +#ifdef YYPARSE_PARAM +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +int +yyparse (void *YYPARSE_PARAM) +#else +int +yyparse (YYPARSE_PARAM) + void *YYPARSE_PARAM; +#endif +#else /* ! YYPARSE_PARAM */ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +int +yyparse (void) +#else +int +yyparse () + +#endif +#endif +{ + + + int yystate; + /* Number of tokens to shift before error messages enabled. */ + int yyerrstatus; + + /* The stacks and their tools: + `yyss': related to states. + `yyvs': related to semantic values. + + Refer to the stacks thru separate pointers, to allow yyoverflow + to reallocate them elsewhere. */ + + /* The state stack. */ + yytype_int16 yyssa[YYINITDEPTH]; + yytype_int16 *yyss; + yytype_int16 *yyssp; + + /* The semantic value stack. */ + YYSTYPE yyvsa[YYINITDEPTH]; + YYSTYPE *yyvs; + YYSTYPE *yyvsp; + + YYSIZE_T yystacksize; + + int yyn; + int yyresult; + /* Lookahead token as an internal (translated) token number. */ + int yytoken; + /* The variables used to return semantic value and location from the + action routines. */ + YYSTYPE yyval; + +#if YYERROR_VERBOSE + /* Buffer for error messages, and its allocated size. */ + char yymsgbuf[128]; + char *yymsg = yymsgbuf; + YYSIZE_T yymsg_alloc = sizeof yymsgbuf; +#endif + +#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) + + /* The number of symbols on the RHS of the reduced rule. + Keep to zero when no symbol should be popped. */ + int yylen = 0; + + yytoken = 0; + yyss = yyssa; + yyvs = yyvsa; + yystacksize = YYINITDEPTH; + + YYDPRINTF ((stderr, "Starting parse\n")); + + yystate = 0; + yyerrstatus = 0; + yynerrs = 0; + yychar = YYEMPTY; /* Cause a token to be read. */ + + /* Initialize stack pointers. + Waste one element of value and location stack + so that they stay on the same level as the state stack. + The wasted elements are never initialized. */ + yyssp = yyss; + yyvsp = yyvs; + + goto yysetstate; + +/*------------------------------------------------------------. +| yynewstate -- Push a new state, which is found in yystate. | +`------------------------------------------------------------*/ + yynewstate: + /* In all cases, when you get here, the value and location stacks + have just been pushed. So pushing a state here evens the stacks. */ + yyssp++; + + yysetstate: + *yyssp = yystate; + + if (yyss + yystacksize - 1 <= yyssp) + { + /* Get the current used size of the three stacks, in elements. */ + YYSIZE_T yysize = yyssp - yyss + 1; + +#ifdef yyoverflow + { + /* Give user a chance to reallocate the stack. Use copies of + these so that the &'s don't force the real ones into + memory. */ + YYSTYPE *yyvs1 = yyvs; + yytype_int16 *yyss1 = yyss; + + /* Each stack pointer address is followed by the size of the + data in use in that stack, in bytes. This used to be a + conditional around just the two extra args, but that might + be undefined if yyoverflow is a macro. */ + yyoverflow (YY_("memory exhausted"), + &yyss1, yysize * sizeof (*yyssp), + &yyvs1, yysize * sizeof (*yyvsp), + &yystacksize); + + yyss = yyss1; + yyvs = yyvs1; + } +#else /* no yyoverflow */ +# ifndef YYSTACK_RELOCATE + goto yyexhaustedlab; +# else + /* Extend the stack our own way. */ + if (YYMAXDEPTH <= yystacksize) + goto yyexhaustedlab; + yystacksize *= 2; + if (YYMAXDEPTH < yystacksize) + yystacksize = YYMAXDEPTH; + + { + yytype_int16 *yyss1 = yyss; + union yyalloc *yyptr = + (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); + if (! yyptr) + goto yyexhaustedlab; + YYSTACK_RELOCATE (yyss_alloc, yyss); + YYSTACK_RELOCATE (yyvs_alloc, yyvs); +# undef YYSTACK_RELOCATE + if (yyss1 != yyssa) + YYSTACK_FREE (yyss1); + } +# endif +#endif /* no yyoverflow */ + + yyssp = yyss + yysize - 1; + yyvsp = yyvs + yysize - 1; + + YYDPRINTF ((stderr, "Stack size increased to %lu\n", + (unsigned long int) yystacksize)); + + if (yyss + yystacksize - 1 <= yyssp) + YYABORT; + } + + YYDPRINTF ((stderr, "Entering state %d\n", yystate)); + + if (yystate == YYFINAL) + YYACCEPT; + + goto yybackup; + +/*-----------. +| yybackup. | +`-----------*/ +yybackup: + + /* Do appropriate processing given the current state. Read a + lookahead token if we need one and don't already have one. */ + + /* First try to decide what to do without reference to lookahead token. */ + yyn = yypact[yystate]; + if (yyn == YYPACT_NINF) + goto yydefault; + + /* Not known => get a lookahead token if don't already have one. */ + + /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */ + if (yychar == YYEMPTY) + { + YYDPRINTF ((stderr, "Reading a token: ")); + yychar = YYLEX; + } + + if (yychar <= YYEOF) + { + yychar = yytoken = YYEOF; + YYDPRINTF ((stderr, "Now at end of input.\n")); + } + else + { + yytoken = YYTRANSLATE (yychar); + YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); + } + + /* If the proper action on seeing token YYTOKEN is to reduce or to + detect an error, take that action. */ + yyn += yytoken; + if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) + goto yydefault; + yyn = yytable[yyn]; + if (yyn <= 0) + { + if (yyn == 0 || yyn == YYTABLE_NINF) + goto yyerrlab; + yyn = -yyn; + goto yyreduce; + } + + /* Count tokens shifted since error; after three, turn off error + status. */ + if (yyerrstatus) + yyerrstatus--; + + /* Shift the lookahead token. */ + YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); + + /* Discard the shifted token. */ + yychar = YYEMPTY; + + yystate = yyn; + *++yyvsp = yylval; + + goto yynewstate; + + +/*-----------------------------------------------------------. +| yydefault -- do the default action for the current state. | +`-----------------------------------------------------------*/ +yydefault: + yyn = yydefact[yystate]; + if (yyn == 0) + goto yyerrlab; + goto yyreduce; + + +/*-----------------------------. +| yyreduce -- Do a reduction. | +`-----------------------------*/ +yyreduce: + /* yyn is the number of a rule to reduce with. */ + yylen = yyr2[yyn]; + + /* If YYLEN is nonzero, implement the default value of the action: + `$$ = $1'. + + Otherwise, the following line sets YYVAL to garbage. + This behavior is undocumented and Bison + users should not rely upon it. Assigning to YYVAL + unconditionally makes the parser a bit smaller, and it avoids a + GCC warning that YYVAL may be used uninitialized. */ + yyval = yyvsp[1-yylen]; + + + YY_REDUCE_PRINT (yyn); + switch (yyn) + { + case 3: + +/* Line 1455 of yacc.c */ +#line 1239 "goomsl_yacc.y" + { gsl_append((yyvsp[(2) - (2)].nPtr)); } + break; + + case 4: + +/* Line 1455 of yacc.c */ +#line 1240 "goomsl_yacc.y" + { gsl_declare_global_variable((yyvsp[(6) - (8)].intValue),(yyvsp[(4) - (8)].strValue)); } + break; + + case 5: + +/* Line 1455 of yacc.c */ +#line 1241 "goomsl_yacc.y" + { gsl_declare_global_variable((yyvsp[(8) - (10)].intValue),(yyvsp[(4) - (10)].strValue)); } + break; + + case 6: + +/* Line 1455 of yacc.c */ +#line 1242 "goomsl_yacc.y" + { gsl_declare_global_variable((yyvsp[(6) - (8)].intValue),(yyvsp[(4) - (8)].strValue)); } + break; + + case 7: + +/* Line 1455 of yacc.c */ +#line 1243 "goomsl_yacc.y" + { gsl_declare_global_variable((yyvsp[(8) - (10)].intValue),(yyvsp[(4) - (10)].strValue)); } + break; + + case 11: + +/* Line 1455 of yacc.c */ +#line 1251 "goomsl_yacc.y" + { gsl_add_struct((yyvsp[(3) - (7)].strValue), (yyvsp[(5) - (7)].gsl_struct)); } + break; + + case 12: + +/* Line 1455 of yacc.c */ +#line 1254 "goomsl_yacc.y" + { (yyval.gsl_struct) = gsl_new_struct((yyvsp[(2) - (2)].gsl_struct_field)); } + break; + + case 13: + +/* Line 1455 of yacc.c */ +#line 1255 "goomsl_yacc.y" + { (yyval.gsl_struct) = (yyvsp[(1) - (4)].gsl_struct); gsl_add_struct_field((yyvsp[(1) - (4)].gsl_struct), (yyvsp[(4) - (4)].gsl_struct_field)); } + break; + + case 14: + +/* Line 1455 of yacc.c */ +#line 1258 "goomsl_yacc.y" + { (yyval.gsl_struct_field) = gsl_new_struct_field((yyvsp[(2) - (2)].strValue), INSTR_INT); } + break; + + case 15: + +/* Line 1455 of yacc.c */ +#line 1259 "goomsl_yacc.y" + { (yyval.gsl_struct_field) = gsl_new_struct_field((yyvsp[(2) - (2)].strValue), INSTR_FLOAT); } + break; + + case 16: + +/* Line 1455 of yacc.c */ +#line 1260 "goomsl_yacc.y" + { (yyval.gsl_struct_field) = gsl_new_struct_field((yyvsp[(2) - (2)].strValue), INSTR_PTR); } + break; + + case 17: + +/* Line 1455 of yacc.c */ +#line 1261 "goomsl_yacc.y" + { (yyval.gsl_struct_field) = gsl_new_struct_field_struct((yyvsp[(2) - (2)].strValue), (yyvsp[(1) - (2)].strValue)); } + break; + + case 18: + +/* Line 1455 of yacc.c */ +#line 1266 "goomsl_yacc.y" + { gsl_declare_external_task((yyvsp[(1) - (1)].strValue)); gsl_enternamespace((yyvsp[(1) - (1)].strValue)); strcpy((yyval.strValue),(yyvsp[(1) - (1)].strValue)); } + break; + + case 19: + +/* Line 1455 of yacc.c */ +#line 1268 "goomsl_yacc.y" + { gsl_declare_task((yyvsp[(1) - (1)].strValue)); gsl_enternamespace((yyvsp[(1) - (1)].strValue)); strcpy((yyval.strValue),(yyvsp[(1) - (1)].strValue)); strcpy((yyval.strValue),(yyvsp[(1) - (1)].strValue)); } + break; + + case 20: + +/* Line 1455 of yacc.c */ +#line 1271 "goomsl_yacc.y" + { (yyval.intValue)=-1; } + break; + + case 21: + +/* Line 1455 of yacc.c */ +#line 1272 "goomsl_yacc.y" + { (yyval.intValue)=INT_TK; } + break; + + case 22: + +/* Line 1455 of yacc.c */ +#line 1273 "goomsl_yacc.y" + { (yyval.intValue)=FLOAT_TK; } + break; + + case 23: + +/* Line 1455 of yacc.c */ +#line 1274 "goomsl_yacc.y" + { (yyval.intValue)=PTR_TK; } + break; + + case 24: + +/* Line 1455 of yacc.c */ +#line 1275 "goomsl_yacc.y" + { (yyval.intValue)= 1000 + gsl_get_struct_id((yyvsp[(2) - (2)].strValue)); } + break; + + case 29: + +/* Line 1455 of yacc.c */ +#line 1288 "goomsl_yacc.y" + { gsl_leavenamespace(); } + break; + + case 30: + +/* Line 1455 of yacc.c */ +#line 1290 "goomsl_yacc.y" + { gsl_append(new_function_intro((yyvsp[(2) - (5)].strValue))); + gsl_declare_global_variable((yyvsp[(4) - (5)].intValue),(yyvsp[(2) - (5)].strValue)); } + break; + + case 31: + +/* Line 1455 of yacc.c */ +#line 1292 "goomsl_yacc.y" + { gsl_append(new_function_intro((yyvsp[(2) - (7)].strValue))); + gsl_declare_global_variable((yyvsp[(6) - (7)].intValue),(yyvsp[(2) - (7)].strValue)); } + break; + + case 32: + +/* Line 1455 of yacc.c */ +#line 1295 "goomsl_yacc.y" + { gsl_append(new_function_outro()); } + break; + + case 33: + +/* Line 1455 of yacc.c */ +#line 1297 "goomsl_yacc.y" + { (yyval.namespace) = gsl_leavenamespace(); } + break; + + case 34: + +/* Line 1455 of yacc.c */ +#line 1301 "goomsl_yacc.y" + { gsl_float_decl_local((yyvsp[(2) - (4)].strValue)); (yyval.nPtr) = new_set(new_var((yyvsp[(2) - (4)].strValue),currentGoomSL->num_lines), (yyvsp[(4) - (4)].nPtr)); } + break; + + case 35: + +/* Line 1455 of yacc.c */ +#line 1302 "goomsl_yacc.y" + { gsl_int_decl_local((yyvsp[(2) - (4)].strValue)); (yyval.nPtr) = new_set(new_var((yyvsp[(2) - (4)].strValue),currentGoomSL->num_lines), (yyvsp[(4) - (4)].nPtr)); } + break; + + case 36: + +/* Line 1455 of yacc.c */ +#line 1303 "goomsl_yacc.y" + { gsl_ptr_decl_local((yyvsp[(2) - (4)].strValue)); (yyval.nPtr) = new_set(new_var((yyvsp[(2) - (4)].strValue),currentGoomSL->num_lines), (yyvsp[(4) - (4)].nPtr)); } + break; + + case 37: + +/* Line 1455 of yacc.c */ +#line 1304 "goomsl_yacc.y" + { gsl_struct_decl_local((yyvsp[(1) - (4)].strValue),(yyvsp[(2) - (4)].strValue)); (yyval.nPtr) = new_set(new_var((yyvsp[(2) - (4)].strValue),currentGoomSL->num_lines), (yyvsp[(4) - (4)].nPtr)); } + break; + + case 38: + +/* Line 1455 of yacc.c */ +#line 1305 "goomsl_yacc.y" + { (yyval.nPtr) = 0; } + break; + + case 39: + +/* Line 1455 of yacc.c */ +#line 1308 "goomsl_yacc.y" + { gsl_float_decl_local((yyvsp[(2) - (2)].strValue)); } + break; + + case 40: + +/* Line 1455 of yacc.c */ +#line 1309 "goomsl_yacc.y" + { gsl_int_decl_local((yyvsp[(2) - (2)].strValue)); } + break; + + case 41: + +/* Line 1455 of yacc.c */ +#line 1310 "goomsl_yacc.y" + { gsl_ptr_decl_local((yyvsp[(2) - (2)].strValue)); } + break; + + case 42: + +/* Line 1455 of yacc.c */ +#line 1311 "goomsl_yacc.y" + { gsl_struct_decl_local((yyvsp[(1) - (2)].strValue),(yyvsp[(2) - (2)].strValue)); } + break; + + case 43: + +/* Line 1455 of yacc.c */ +#line 1316 "goomsl_yacc.y" + { (yyval.nPtr) = (yyvsp[(1) - (2)].nPtr); } + break; + + case 44: + +/* Line 1455 of yacc.c */ +#line 1317 "goomsl_yacc.y" + { (yyval.nPtr) = (yyvsp[(1) - (2)].nPtr); } + break; + + case 45: + +/* Line 1455 of yacc.c */ +#line 1318 "goomsl_yacc.y" + { (yyval.nPtr) = new_if((yyvsp[(2) - (6)].nPtr),(yyvsp[(6) - (6)].nPtr)); } + break; + + case 46: + +/* Line 1455 of yacc.c */ +#line 1319 "goomsl_yacc.y" + { (yyval.nPtr) = new_while((yyvsp[(2) - (6)].nPtr),(yyvsp[(6) - (6)].nPtr)); } + break; + + case 47: + +/* Line 1455 of yacc.c */ +#line 1320 "goomsl_yacc.y" + { lastNode = (yyvsp[(3) - (6)].nPtr)->unode.opr.op[1]; (yyval.nPtr)=(yyvsp[(3) - (6)].nPtr); } + break; + + case 48: + +/* Line 1455 of yacc.c */ +#line 1321 "goomsl_yacc.y" + { (yyval.nPtr) = (yyvsp[(1) - (1)].nPtr); } + break; + + case 49: + +/* Line 1455 of yacc.c */ +#line 1322 "goomsl_yacc.y" + { (yyval.nPtr) = new_plus_eq(new_var((yyvsp[(1) - (3)].strValue),currentGoomSL->num_lines),(yyvsp[(3) - (3)].nPtr)); } + break; + + case 50: + +/* Line 1455 of yacc.c */ +#line 1323 "goomsl_yacc.y" + { (yyval.nPtr) = new_sub_eq(new_var((yyvsp[(1) - (3)].strValue),currentGoomSL->num_lines),(yyvsp[(3) - (3)].nPtr)); } + break; + + case 51: + +/* Line 1455 of yacc.c */ +#line 1324 "goomsl_yacc.y" + { (yyval.nPtr) = new_mul_eq(new_var((yyvsp[(1) - (3)].strValue),currentGoomSL->num_lines),(yyvsp[(3) - (3)].nPtr)); } + break; + + case 52: + +/* Line 1455 of yacc.c */ +#line 1325 "goomsl_yacc.y" + { (yyval.nPtr) = new_div_eq(new_var((yyvsp[(1) - (3)].strValue),currentGoomSL->num_lines),(yyvsp[(3) - (3)].nPtr)); } + break; + + case 53: + +/* Line 1455 of yacc.c */ +#line 1326 "goomsl_yacc.y" + { (yyval.nPtr) = new_static_foreach(new_var((yyvsp[(2) - (6)].strValue), currentGoomSL->num_lines), (yyvsp[(4) - (6)].nPtr), (yyvsp[(6) - (6)].nPtr)); } + break; + + case 54: + +/* Line 1455 of yacc.c */ +#line 1329 "goomsl_yacc.y" + { (yyval.nPtr) = (yyvsp[(2) - (3)].nPtr); } + break; + + case 55: + +/* Line 1455 of yacc.c */ +#line 1331 "goomsl_yacc.y" + { (yyval.nPtr) = new_var_list(new_var((yyvsp[(1) - (1)].strValue),currentGoomSL->num_lines), NULL); } + break; + + case 56: + +/* Line 1455 of yacc.c */ +#line 1332 "goomsl_yacc.y" + { (yyval.nPtr) = new_var_list(new_var((yyvsp[(1) - (2)].strValue),currentGoomSL->num_lines), (yyvsp[(2) - (2)].nPtr)); } + break; + + case 57: + +/* Line 1455 of yacc.c */ +#line 1335 "goomsl_yacc.y" + { (yyval.nPtr) = new_set(new_var((yyvsp[(1) - (3)].strValue),currentGoomSL->num_lines),(yyvsp[(3) - (3)].nPtr)); } + break; + + case 58: + +/* Line 1455 of yacc.c */ +#line 1337 "goomsl_yacc.y" + { (yyval.nPtr) = new_block(lastNode); lastNode = (yyval.nPtr)->unode.opr.op[0]; } + break; + + case 59: + +/* Line 1455 of yacc.c */ +#line 1340 "goomsl_yacc.y" + { (yyval.nPtr) = new_var((yyvsp[(1) - (1)].strValue),currentGoomSL->num_lines); } + break; + + case 60: + +/* Line 1455 of yacc.c */ +#line 1341 "goomsl_yacc.y" + { (yyval.nPtr) = (yyvsp[(1) - (1)].nPtr); } + break; + + case 61: + +/* Line 1455 of yacc.c */ +#line 1342 "goomsl_yacc.y" + { (yyval.nPtr) = new_mul((yyvsp[(1) - (3)].nPtr),(yyvsp[(3) - (3)].nPtr)); } + break; + + case 62: + +/* Line 1455 of yacc.c */ +#line 1343 "goomsl_yacc.y" + { (yyval.nPtr) = new_div((yyvsp[(1) - (3)].nPtr),(yyvsp[(3) - (3)].nPtr)); } + break; + + case 63: + +/* Line 1455 of yacc.c */ +#line 1344 "goomsl_yacc.y" + { (yyval.nPtr) = new_add((yyvsp[(1) - (3)].nPtr),(yyvsp[(3) - (3)].nPtr)); } + break; + + case 64: + +/* Line 1455 of yacc.c */ +#line 1345 "goomsl_yacc.y" + { (yyval.nPtr) = new_sub((yyvsp[(1) - (3)].nPtr),(yyvsp[(3) - (3)].nPtr)); } + break; + + case 65: + +/* Line 1455 of yacc.c */ +#line 1346 "goomsl_yacc.y" + { (yyval.nPtr) = new_neg((yyvsp[(2) - (2)].nPtr)); } + break; + + case 66: + +/* Line 1455 of yacc.c */ +#line 1347 "goomsl_yacc.y" + { (yyval.nPtr) = (yyvsp[(2) - (3)].nPtr); } + break; + + case 67: + +/* Line 1455 of yacc.c */ +#line 1348 "goomsl_yacc.y" + { (yyval.nPtr) = (yyvsp[(1) - (1)].nPtr); } + break; + + case 68: + +/* Line 1455 of yacc.c */ +#line 1351 "goomsl_yacc.y" + { (yyval.nPtr) = new_equ((yyvsp[(1) - (3)].nPtr),(yyvsp[(3) - (3)].nPtr)); } + break; + + case 69: + +/* Line 1455 of yacc.c */ +#line 1352 "goomsl_yacc.y" + { (yyval.nPtr) = new_low((yyvsp[(1) - (3)].nPtr),(yyvsp[(3) - (3)].nPtr)); } + break; + + case 70: + +/* Line 1455 of yacc.c */ +#line 1353 "goomsl_yacc.y" + { (yyval.nPtr) = new_low((yyvsp[(3) - (3)].nPtr),(yyvsp[(1) - (3)].nPtr)); } + break; + + case 71: + +/* Line 1455 of yacc.c */ +#line 1354 "goomsl_yacc.y" + { (yyval.nPtr) = new_not(new_low((yyvsp[(1) - (3)].nPtr),(yyvsp[(3) - (3)].nPtr))); } + break; + + case 72: + +/* Line 1455 of yacc.c */ +#line 1355 "goomsl_yacc.y" + { (yyval.nPtr) = new_not(new_low((yyvsp[(3) - (3)].nPtr),(yyvsp[(1) - (3)].nPtr))); } + break; + + case 73: + +/* Line 1455 of yacc.c */ +#line 1356 "goomsl_yacc.y" + { (yyval.nPtr) = new_not(new_equ((yyvsp[(1) - (3)].nPtr),(yyvsp[(3) - (3)].nPtr))); } + break; + + case 74: + +/* Line 1455 of yacc.c */ +#line 1357 "goomsl_yacc.y" + { (yyval.nPtr) = new_not((yyvsp[(2) - (2)].nPtr)); } + break; + + case 75: + +/* Line 1455 of yacc.c */ +#line 1360 "goomsl_yacc.y" + { (yyval.nPtr) = new_constFloat((yyvsp[(1) - (1)].strValue),currentGoomSL->num_lines); } + break; + + case 76: + +/* Line 1455 of yacc.c */ +#line 1361 "goomsl_yacc.y" + { (yyval.nPtr) = new_constInt((yyvsp[(1) - (1)].strValue),currentGoomSL->num_lines); } + break; + + case 77: + +/* Line 1455 of yacc.c */ +#line 1362 "goomsl_yacc.y" + { (yyval.nPtr) = new_constPtr((yyvsp[(1) - (1)].strValue),currentGoomSL->num_lines); } + break; + + case 78: + +/* Line 1455 of yacc.c */ +#line 1367 "goomsl_yacc.y" + { (yyval.nPtr) = new_call((yyvsp[(1) - (3)].strValue),NULL); } + break; + + case 79: + +/* Line 1455 of yacc.c */ +#line 1368 "goomsl_yacc.y" + { (yyval.nPtr) = new_call((yyvsp[(1) - (5)].strValue),(yyvsp[(3) - (5)].nPtr)); } + break; + + case 80: + +/* Line 1455 of yacc.c */ +#line 1369 "goomsl_yacc.y" + { (yyval.nPtr) = new_call((yyvsp[(2) - (5)].strValue),NULL); } + break; + + case 81: + +/* Line 1455 of yacc.c */ +#line 1370 "goomsl_yacc.y" + { (yyval.nPtr) = new_call((yyvsp[(2) - (7)].strValue),(yyvsp[(4) - (7)].nPtr)); } + break; + + case 82: + +/* Line 1455 of yacc.c */ +#line 1374 "goomsl_yacc.y" + { (yyval.nPtr) = new_call_expr((yyvsp[(2) - (4)].strValue),NULL); } + break; + + case 83: + +/* Line 1455 of yacc.c */ +#line 1375 "goomsl_yacc.y" + { (yyval.nPtr) = new_call_expr((yyvsp[(2) - (6)].strValue),(yyvsp[(4) - (6)].nPtr)); } + break; + + case 84: + +/* Line 1455 of yacc.c */ +#line 1378 "goomsl_yacc.y" + { (yyval.nPtr) = new_affec_list((yyvsp[(1) - (2)].nPtr),(yyvsp[(2) - (2)].nPtr)); } + break; + + case 85: + +/* Line 1455 of yacc.c */ +#line 1379 "goomsl_yacc.y" + { (yyval.nPtr) = new_affec_list((yyvsp[(1) - (1)].nPtr),NULL); } + break; + + case 86: + +/* Line 1455 of yacc.c */ +#line 1381 "goomsl_yacc.y" + { + gsl_reenternamespace((yyvsp[(3) - (4)].namespace)); + (yyval.nPtr) = new_set(new_var((yyvsp[(1) - (4)].strValue),currentGoomSL->num_lines),(yyvsp[(4) - (4)].nPtr)); + } + break; + + case 87: + +/* Line 1455 of yacc.c */ +#line 1385 "goomsl_yacc.y" + { + gsl_reenternamespace((yyvsp[(2) - (3)].namespace)); + (yyval.nPtr) = new_set(new_var("&this", currentGoomSL->num_lines),(yyvsp[(3) - (3)].nPtr)); + } + break; + + + +/* Line 1455 of yacc.c */ +#line 3302 "goomsl_yacc.c" + default: break; + } + YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); + + YYPOPSTACK (yylen); + yylen = 0; + YY_STACK_PRINT (yyss, yyssp); + + *++yyvsp = yyval; + + /* Now `shift' the result of the reduction. Determine what state + that goes to, based on the state we popped back to and the rule + number reduced by. */ + + yyn = yyr1[yyn]; + + yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; + if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) + yystate = yytable[yystate]; + else + yystate = yydefgoto[yyn - YYNTOKENS]; + + goto yynewstate; + + +/*------------------------------------. +| yyerrlab -- here on detecting error | +`------------------------------------*/ +yyerrlab: + /* If not already recovering from an error, report this error. */ + if (!yyerrstatus) + { + ++yynerrs; +#if ! YYERROR_VERBOSE + yyerror (YY_("syntax error")); +#else + { + YYSIZE_T yysize = yysyntax_error (0, yystate, yychar); + if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM) + { + YYSIZE_T yyalloc = 2 * yysize; + if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM)) + yyalloc = YYSTACK_ALLOC_MAXIMUM; + if (yymsg != yymsgbuf) + YYSTACK_FREE (yymsg); + yymsg = (char *) YYSTACK_ALLOC (yyalloc); + if (yymsg) + yymsg_alloc = yyalloc; + else + { + yymsg = yymsgbuf; + yymsg_alloc = sizeof yymsgbuf; + } + } + + if (0 < yysize && yysize <= yymsg_alloc) + { + (void) yysyntax_error (yymsg, yystate, yychar); + yyerror (yymsg); + } + else + { + yyerror (YY_("syntax error")); + if (yysize != 0) + goto yyexhaustedlab; + } + } +#endif + } + + + + if (yyerrstatus == 3) + { + /* If just tried and failed to reuse lookahead token after an + error, discard it. */ + + if (yychar <= YYEOF) + { + /* Return failure if at end of input. */ + if (yychar == YYEOF) + YYABORT; + } + else + { + yydestruct ("Error: discarding", + yytoken, &yylval); + yychar = YYEMPTY; + } + } + + /* Else will try to reuse lookahead token after shifting the error + token. */ + goto yyerrlab1; + + +/*---------------------------------------------------. +| yyerrorlab -- error raised explicitly by YYERROR. | +`---------------------------------------------------*/ +yyerrorlab: + + /* Pacify compilers like GCC when the user code never invokes + YYERROR and the label yyerrorlab therefore never appears in user + code. */ + if (/*CONSTCOND*/ 0) + goto yyerrorlab; + + /* Do not reclaim the symbols of the rule which action triggered + this YYERROR. */ + YYPOPSTACK (yylen); + yylen = 0; + YY_STACK_PRINT (yyss, yyssp); + yystate = *yyssp; + goto yyerrlab1; + + +/*-------------------------------------------------------------. +| yyerrlab1 -- common code for both syntax error and YYERROR. | +`-------------------------------------------------------------*/ +yyerrlab1: + yyerrstatus = 3; /* Each real token shifted decrements this. */ + + for (;;) + { + yyn = yypact[yystate]; + if (yyn != YYPACT_NINF) + { + yyn += YYTERROR; + if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) + { + yyn = yytable[yyn]; + if (0 < yyn) + break; + } + } + + /* Pop the current state because it cannot handle the error token. */ + if (yyssp == yyss) + YYABORT; + + + yydestruct ("Error: popping", + yystos[yystate], yyvsp); + YYPOPSTACK (1); + yystate = *yyssp; + YY_STACK_PRINT (yyss, yyssp); + } + + *++yyvsp = yylval; + + + /* Shift the error token. */ + YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); + + yystate = yyn; + goto yynewstate; + + +/*-------------------------------------. +| yyacceptlab -- YYACCEPT comes here. | +`-------------------------------------*/ +yyacceptlab: + yyresult = 0; + goto yyreturn; + +/*-----------------------------------. +| yyabortlab -- YYABORT comes here. | +`-----------------------------------*/ +yyabortlab: + yyresult = 1; + goto yyreturn; + +#if !defined(yyoverflow) || YYERROR_VERBOSE +/*-------------------------------------------------. +| yyexhaustedlab -- memory exhaustion comes here. | +`-------------------------------------------------*/ +yyexhaustedlab: + yyerror (YY_("memory exhausted")); + yyresult = 2; + /* Fall through. */ +#endif + +yyreturn: + if (yychar != YYEMPTY) + yydestruct ("Cleanup: discarding lookahead", + yytoken, &yylval); + /* Do not reclaim the symbols of the rule which action triggered + this YYABORT or YYACCEPT. */ + YYPOPSTACK (yylen); + YY_STACK_PRINT (yyss, yyssp); + while (yyssp != yyss) + { + yydestruct ("Cleanup: popping", + yystos[*yyssp], yyvsp); + YYPOPSTACK (1); + } +#ifndef yyoverflow + if (yyss != yyssa) + YYSTACK_FREE (yyss); +#endif +#if YYERROR_VERBOSE + if (yymsg != yymsgbuf) + YYSTACK_FREE (yymsg); +#endif + /* Make sure YYID is used. */ + return YYID (yyresult); +} + + + +/* Line 1675 of yacc.c */ +#line 1397 "goomsl_yacc.y" + + + +void yyerror(char *str) +{ /* {{{ */ + fprintf(stderr, "ERROR: Line %d, %s\n", currentGoomSL->num_lines, str); + currentGoomSL->compilationOK = 0; + exit(1); +} /* }}} */ + + diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/goomsl_yacc.h kodi-visualization-goom-2.1.0/lib/goom/src/goomsl_yacc.h --- kodi-visualization-goom-1.1.0/lib/goom/src/goomsl_yacc.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/goomsl_yacc.h 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,121 @@ + +/* A Bison parser, made by GNU Bison 2.4.1. */ + +/* Skeleton interface for Bison's Yacc-like parsers in C + + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 + Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* As a special exception, you may create a larger work that contains + part or all of the Bison parser skeleton and distribute that work + under terms of your choice, so long as that work isn't itself a + parser generator using the skeleton or a modified version thereof + as a parser skeleton. Alternatively, if you modify or redistribute + the parser skeleton itself, you may (at your option) remove this + special exception, which will cause the skeleton and the resulting + Bison output files to be licensed under the GNU General Public + License without this special exception. + + This special exception was added by the Free Software Foundation in + version 2.2 of Bison. */ + + +/* Tokens. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + LTYPE_INTEGER = 258, + LTYPE_FLOAT = 259, + LTYPE_VAR = 260, + LTYPE_PTR = 261, + PTR_TK = 262, + INT_TK = 263, + FLOAT_TK = 264, + DECLARE = 265, + EXTERNAL = 266, + WHILE = 267, + DO = 268, + NOT = 269, + PLUS_EQ = 270, + SUB_EQ = 271, + DIV_EQ = 272, + MUL_EQ = 273, + SUP_EQ = 274, + LOW_EQ = 275, + NOT_EQ = 276, + STRUCT = 277, + FOR = 278, + IN = 279 + }; +#endif +/* Tokens. */ +#define LTYPE_INTEGER 258 +#define LTYPE_FLOAT 259 +#define LTYPE_VAR 260 +#define LTYPE_PTR 261 +#define PTR_TK 262 +#define INT_TK 263 +#define FLOAT_TK 264 +#define DECLARE 265 +#define EXTERNAL 266 +#define WHILE 267 +#define DO 268 +#define NOT 269 +#define PLUS_EQ 270 +#define SUB_EQ 271 +#define DIV_EQ 272 +#define MUL_EQ 273 +#define SUP_EQ 274 +#define LOW_EQ 275 +#define NOT_EQ 276 +#define STRUCT 277 +#define FOR 278 +#define IN 279 + + + + +#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED +typedef union YYSTYPE +{ + +/* Line 1676 of yacc.c */ +#line 1200 "goomsl_yacc.y" + + int intValue; + float floatValue; + char charValue; + char strValue[2048]; + NodeType *nPtr; + GoomHash *namespace; + GSL_Struct *gsl_struct; + GSL_StructField *gsl_struct_field; + + + +/* Line 1676 of yacc.c */ +#line 113 "goomsl_yacc.h" +} YYSTYPE; +# define YYSTYPE_IS_TRIVIAL 1 +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +#endif + +extern YYSTYPE yylval; + + diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/goomsl_yacc.y kodi-visualization-goom-2.1.0/lib/goom/src/goomsl_yacc.y --- kodi-visualization-goom-1.1.0/lib/goom/src/goomsl_yacc.y 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/goomsl_yacc.y 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,1406 @@ +/** + * copyright 2004, Jean-Christophe Hoelt + * + * This program is released under the terms of the GNU Lesser General Public Licence. + */ +%{ + #include + #include + #include + #include "goomsl.h" + #include "goomsl_private.h" + #include "goomsl_yacc.h" + +#define STRUCT_ALIGNMENT 16 +/* #define VERBOSE */ + + int yylex(void); + void yyerror(char *); + extern GoomSL *currentGoomSL; + + static NodeType *nodeNew(const char *str, int type, int line_number); + static NodeType *nodeClone(NodeType *node); + static void nodeFreeInternals(NodeType *node); + static void nodeFree(NodeType *node); + + static void commit_node(NodeType *node, int releaseIfTemp); + static void precommit_node(NodeType *node); + + static NodeType *new_constInt(const char *str, int line_number); + static NodeType *new_constFloat(const char *str, int line_number); + static NodeType *new_constPtr(const char *str, int line_number); + static NodeType *new_var(const char *str, int line_number); + static NodeType *new_nop(const char *str); + static NodeType *new_op(const char *str, int type, int nbOp); + + static int allocateLabel(); + static int allocateTemp(); + static void releaseTemp(int n); + static void releaseAllTemps(); + + static int is_tmp_expr(NodeType *node) { + if (node->str) { + return (!strncmp(node->str,"_i_tmp_",7)) + || (!strncmp(node->str,"_f_tmp_",7)) + || (!strncmp(node->str,"_p_tmp",7)); + } + return 0; + } + /* pre: is_tmp_expr(node); */ + static int get_tmp_id(NodeType *node) { return atoi((node->str)+5); } + + static int is_commutative_expr(int itype) + { /* {{{ */ + return (itype == INSTR_ADD) + || (itype == INSTR_MUL) + || (itype == INSTR_ISEQUAL); + } /* }}} */ + + static void GSL_PUT_LABEL(char *name, int line_number) + { /* {{{ */ +#ifdef VERBOSE + printf("label %s\n", name); +#endif + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "label", INSTR_LABEL, 1, line_number); + gsl_instr_add_param(currentGoomSL->instr, name, TYPE_LABEL); + } /* }}} */ + static void GSL_PUT_JUMP(char *name, int line_number) + { /* {{{ */ +#ifdef VERBOSE + printf("jump %s\n", name); +#endif + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "jump", INSTR_JUMP, 1, line_number); + gsl_instr_add_param(currentGoomSL->instr, name, TYPE_LABEL); + } /* }}} */ + + static void GSL_PUT_JXXX(char *name, char *iname, int instr_id, int line_number) + { /* {{{ */ +#ifdef VERBOSE + printf("%s %s\n", iname, name); +#endif + currentGoomSL->instr = gsl_instr_init(currentGoomSL, iname, instr_id, 1, line_number); + gsl_instr_add_param(currentGoomSL->instr, name, TYPE_LABEL); + } /* }}} */ + static void GSL_PUT_JZERO(char *name,int line_number) + { /* {{{ */ + GSL_PUT_JXXX(name,"jzero.i",INSTR_JZERO,line_number); + } /* }}} */ + static void GSL_PUT_JNZERO(char *name, int line_number) + { /* {{{ */ + GSL_PUT_JXXX(name,"jnzero.i",INSTR_JNZERO,line_number); + } /* }}} */ + + /* Structures Management */ + +#define ALIGN_ADDR(_addr,_align) {\ + if (_align>1) {\ + int _dec = (_addr%_align);\ + if (_dec != 0) _addr += _align - _dec;\ + }} + + /* */ + void gsl_prepare_struct(GSL_Struct *s, int s_align, int i_align, int f_align) + { + int i; + int consumed = 0; + int iblk=0, fblk=0; + + s->iBlock[0].size = 0; + s->iBlock[0].data = 0; + s->fBlock[0].size = 0; + s->fBlock[0].data = 0; + + /* Prepare sub-struct and calculate space needed for their storage */ + for (i = 0; i < s->nbFields; ++i) + { + if (s->fields[i]->type < FIRST_RESERVED) + { + int j=0; + GSL_Struct *substruct = currentGoomSL->gsl_struct[s->fields[i]->type]; + consumed += sizeof(int); /* stocke le prefix */ + ALIGN_ADDR(consumed, s_align); + s->fields[i]->offsetInStruct = consumed; + gsl_prepare_struct(substruct, s_align, i_align, f_align); + for(j=0;substruct->iBlock[j].size>0;++j) { + s->iBlock[iblk].data = consumed + substruct->iBlock[j].data; + s->iBlock[iblk].size = substruct->iBlock[j].size; + iblk++; + } + for(j=0;substruct->fBlock[j].size>0;++j) { + s->fBlock[fblk].data = consumed + substruct->fBlock[j].data; + s->fBlock[fblk].size = substruct->fBlock[j].size; + fblk++; + } + consumed += substruct->size; + } + } + + /* Then prepare integers */ + ALIGN_ADDR(consumed, i_align); + for (i = 0; i < s->nbFields; ++i) + { + if (s->fields[i]->type == INSTR_INT) + { + if (s->iBlock[iblk].size == 0) { + s->iBlock[iblk].size = 1; + s->iBlock[iblk].data = consumed; + } else { + s->iBlock[iblk].size += 1; + } + s->fields[i]->offsetInStruct = consumed; + consumed += sizeof(int); + } + } + + iblk++; + s->iBlock[iblk].size = 0; + s->iBlock[iblk].data = 0; + + /* Then prepare floats */ + ALIGN_ADDR(consumed, f_align); + for (i = 0; i < s->nbFields; ++i) + { + if (s->fields[i]->type == INSTR_FLOAT) + { + if (s->fBlock[fblk].size == 0) { + s->fBlock[fblk].size = 1; + s->fBlock[fblk].data = consumed; + } else { + s->fBlock[fblk].size += 1; + } + s->fields[i]->offsetInStruct = consumed; + consumed += sizeof(int); + } + } + + fblk++; + s->fBlock[fblk].size = 0; + s->fBlock[fblk].data = 0; + + /* Finally prepare pointers */ + ALIGN_ADDR(consumed, i_align); + for (i = 0; i < s->nbFields; ++i) + { + if (s->fields[i]->type == INSTR_PTR) + { + s->fields[i]->offsetInStruct = consumed; + consumed += sizeof(int); + } + } + s->size = consumed; + } + + /* Returns the ID of a struct from its name */ + int gsl_get_struct_id(const char *name) /* {{{ */ + { + HashValue *ret = goom_hash_get(currentGoomSL->structIDS, name); + if (ret != NULL) return ret->i; + return -1; + } /* }}} */ + + /* Adds the definition of a struct */ + void gsl_add_struct(const char *name, GSL_Struct *gsl_struct) /* {{{ */ + { + /* Prepare the struct: ie calculate internal storage format */ + gsl_prepare_struct(gsl_struct, STRUCT_ALIGNMENT, STRUCT_ALIGNMENT, STRUCT_ALIGNMENT); + + /* If the struct does not already exists */ + if (gsl_get_struct_id(name) < 0) + { + /* adds it */ + int id = currentGoomSL->nbStructID++; + goom_hash_put_int(currentGoomSL->structIDS, name, id); + if (currentGoomSL->gsl_struct_size <= id) { + currentGoomSL->gsl_struct_size *= 2; + currentGoomSL->gsl_struct = (GSL_Struct**)realloc(currentGoomSL->gsl_struct, + sizeof(GSL_Struct*) * currentGoomSL->gsl_struct_size); + } + currentGoomSL->gsl_struct[id] = gsl_struct; + } + } /* }}} */ + + /* Creates a field for a struct */ + GSL_StructField *gsl_new_struct_field(const char *name, int type) + { + GSL_StructField *field = (GSL_StructField*)malloc(sizeof(GSL_StructField)); + strcpy(field->name, name); + field->type = type; + return field; + } + + /* Create as field for a struct which will be a struct itself */ + GSL_StructField *gsl_new_struct_field_struct(const char *name, const char *type) + { + GSL_StructField *field = gsl_new_struct_field(name, gsl_get_struct_id(type)); + if (field->type < 0) { + fprintf(stderr, "ERROR: Line %d, Unknown structure: '%s'\n", + currentGoomSL->num_lines, type); + exit(1); + } + return field; + } + + /* Creates a Struct */ + GSL_Struct *gsl_new_struct(GSL_StructField *field) + { + GSL_Struct *s = (GSL_Struct*)malloc(sizeof(GSL_Struct)); + s->nbFields = 1; + s->fields[0] = field; + return s; + } + + /* Adds a field to a struct */ + void gsl_add_struct_field(GSL_Struct *s, GSL_StructField *field) + { + s->fields[s->nbFields++] = field; + } + + int gsl_type_of_var(GoomHash *ns, const char *name) + { + char type_of[256]; + HashValue *hv; + sprintf(type_of, "__type_of_%s", name); + hv = goom_hash_get(ns, type_of); + if (hv != NULL) + return hv->i; + fprintf(stderr, "ERROR: Unknown variable type: '%s'\n", name); + return -1; + } + + static void gsl_declare_var(GoomHash *ns, const char *name, int type, void *space) + { + char type_of[256]; + if (name[0] == '@') { ns = currentGoomSL->vars; } + + if (space == NULL) { + switch (type) { + case INSTR_INT: + case INSTR_FLOAT: + case INSTR_PTR: + space = goom_heap_malloc_with_alignment(currentGoomSL->data_heap, + sizeof(int), sizeof(int)); + break; + case -1: + fprintf(stderr, "What the fuck!\n"); + exit(1); + default: /* On a un struct_id */ + space = goom_heap_malloc_with_alignment_prefixed(currentGoomSL->data_heap, + currentGoomSL->gsl_struct[type]->size, STRUCT_ALIGNMENT, sizeof(int)); + } + } + goom_hash_put_ptr(ns, name, (void*)space); + sprintf(type_of, "__type_of_%s", name); + goom_hash_put_int(ns, type_of, type); + + /* Ensuite le hack: on ajoute les champs en tant que variables. */ + if (type < FIRST_RESERVED) + { + int i; + GSL_Struct *gsl_struct = currentGoomSL->gsl_struct[type]; + ((int*)space)[-1] = type; /* stockage du type dans le prefixe de structure */ + for (i = 0; i < gsl_struct->nbFields; ++i) + { + char full_name[256]; + char *cspace = (char*)space + gsl_struct->fields[i]->offsetInStruct; + sprintf(full_name, "%s.%s", name, gsl_struct->fields[i]->name); + gsl_declare_var(ns, full_name, gsl_struct->fields[i]->type, cspace); + } + } + } + + /* Declare a variable which will be a struct */ + static void gsl_struct_decl(GoomHash *namespace, const char *struct_name, const char *name) + { + int struct_id = gsl_get_struct_id(struct_name); + gsl_declare_var(namespace, name, struct_id, NULL); + } + + static void gsl_float_decl_global(const char *name) + { + gsl_declare_var(currentGoomSL->vars, name, INSTR_FLOAT, NULL); + } + static void gsl_int_decl_global(const char *name) + { + gsl_declare_var(currentGoomSL->vars, name, INSTR_INT, NULL); + } + static void gsl_ptr_decl_global(const char *name) + { + gsl_declare_var(currentGoomSL->vars, name, INSTR_PTR, NULL); + } + static void gsl_struct_decl_global_from_id(const char *name, int id) + { + gsl_declare_var(currentGoomSL->vars, name, id, NULL); + } + + /* FLOAT */ + static void gsl_float_decl_local(const char *name) + { + gsl_declare_var(currentGoomSL->namespaces[currentGoomSL->currentNS], name, INSTR_FLOAT, NULL); + } + /* INT */ + static void gsl_int_decl_local(const char *name) + { + gsl_declare_var(currentGoomSL->namespaces[currentGoomSL->currentNS], name, INSTR_INT, NULL); + } + /* PTR */ + static void gsl_ptr_decl_local(const char *name) + { + gsl_declare_var(currentGoomSL->namespaces[currentGoomSL->currentNS], name, INSTR_PTR, NULL); + } + /* STRUCT */ + static void gsl_struct_decl_local(const char *struct_name, const char *name) + { + gsl_struct_decl(currentGoomSL->namespaces[currentGoomSL->currentNS],struct_name,name); + } + + + static void commit_test2(NodeType *set,const char *type, int instr); + static NodeType *new_call(const char *name, NodeType *affect_list); + + /* SETTER */ + static NodeType *new_set(NodeType *lvalue, NodeType *expression) + { /* {{{ */ + NodeType *set = new_op("set", OPR_SET, 2); + set->unode.opr.op[0] = lvalue; + set->unode.opr.op[1] = expression; + return set; + } /* }}} */ + static void commit_set(NodeType *set) + { /* {{{ */ + commit_test2(set,"set",INSTR_SET); + } /* }}} */ + + /* PLUS_EQ */ + static NodeType *new_plus_eq(NodeType *lvalue, NodeType *expression) /* {{{ */ + { + NodeType *set = new_op("plus_eq", OPR_PLUS_EQ, 2); + set->unode.opr.op[0] = lvalue; + set->unode.opr.op[1] = expression; + return set; + } + static void commit_plus_eq(NodeType *set) + { + precommit_node(set->unode.opr.op[1]); +#ifdef VERBOSE + printf("add %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str); +#endif + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "add", INSTR_ADD, 2, set->line_number); + commit_node(set->unode.opr.op[0],0); + commit_node(set->unode.opr.op[1],1); + } /* }}} */ + + /* SUB_EQ */ + static NodeType *new_sub_eq(NodeType *lvalue, NodeType *expression) /* {{{ */ + { + NodeType *set = new_op("sub_eq", OPR_SUB_EQ, 2); + set->unode.opr.op[0] = lvalue; + set->unode.opr.op[1] = expression; + return set; + } + static void commit_sub_eq(NodeType *set) + { + precommit_node(set->unode.opr.op[1]); +#ifdef VERBOSE + printf("sub %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str); +#endif + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "sub", INSTR_SUB, 2, set->line_number); + commit_node(set->unode.opr.op[0],0); + commit_node(set->unode.opr.op[1],1); + } /* }}} */ + + /* MUL_EQ */ + static NodeType *new_mul_eq(NodeType *lvalue, NodeType *expression) /* {{{ */ + { + NodeType *set = new_op("mul_eq", OPR_MUL_EQ, 2); + set->unode.opr.op[0] = lvalue; + set->unode.opr.op[1] = expression; + return set; + } + static void commit_mul_eq(NodeType *set) + { + precommit_node(set->unode.opr.op[1]); +#ifdef VERBOSE + printf("mul %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str); +#endif + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "mul", INSTR_MUL, 2, set->line_number); + commit_node(set->unode.opr.op[0],0); + commit_node(set->unode.opr.op[1],1); + } /* }}} */ + + /* DIV_EQ */ + static NodeType *new_div_eq(NodeType *lvalue, NodeType *expression) /* {{{ */ + { + NodeType *set = new_op("div_eq", OPR_DIV_EQ, 2); + set->unode.opr.op[0] = lvalue; + set->unode.opr.op[1] = expression; + return set; + } + static void commit_div_eq(NodeType *set) + { + precommit_node(set->unode.opr.op[1]); +#ifdef VERBOSE + printf("div %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str); +#endif + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "div", INSTR_DIV, 2, set->line_number); + commit_node(set->unode.opr.op[0],0); + commit_node(set->unode.opr.op[1],1); + } /* }}} */ + + /* commodity method for add, mult, ... */ + + static void precommit_expr(NodeType *expr, const char *type, int instr_id) + { /* {{{ */ + NodeType *tmp, *tmpcpy; + int toAdd; + + /* compute "left" and "right" */ + switch (expr->unode.opr.nbOp) { + case 2: + precommit_node(expr->unode.opr.op[1]); + case 1: + precommit_node(expr->unode.opr.op[0]); + } + + if (is_tmp_expr(expr->unode.opr.op[0])) { + tmp = expr->unode.opr.op[0]; + toAdd = 1; + } + else if (is_commutative_expr(instr_id) && (expr->unode.opr.nbOp==2) && is_tmp_expr(expr->unode.opr.op[1])) { + tmp = expr->unode.opr.op[1]; + toAdd = 0; + } + else { + char stmp[256]; + /* declare a temporary variable to store the result */ + if (expr->unode.opr.op[0]->type == CONST_INT_NODE) { + sprintf(stmp,"_i_tmp_%i",allocateTemp()); + gsl_int_decl_global(stmp); + } + else if (expr->unode.opr.op[0]->type == CONST_FLOAT_NODE) { + sprintf(stmp,"_f_tmp%i",allocateTemp()); + gsl_float_decl_global(stmp); + } + else if (expr->unode.opr.op[0]->type == CONST_PTR_NODE) { + sprintf(stmp,"_p_tmp%i",allocateTemp()); + gsl_ptr_decl_global(stmp); + } + else { + int type = gsl_type_of_var(expr->unode.opr.op[0]->vnamespace, expr->unode.opr.op[0]->str); + if (type == INSTR_FLOAT) { + sprintf(stmp,"_f_tmp_%i",allocateTemp()); + gsl_float_decl_global(stmp); + } + else if (type == INSTR_PTR) { + sprintf(stmp,"_p_tmp_%i",allocateTemp()); + gsl_ptr_decl_global(stmp); + } + else if (type == INSTR_INT) { + sprintf(stmp,"_i_tmp_%i",allocateTemp()); + gsl_int_decl_global(stmp); + } + else if (type == -1) { + fprintf(stderr, "ERROR: Line %d, Could not find variable '%s'\n", + expr->line_number, expr->unode.opr.op[0]->str); + exit(1); + } + else { /* type is a struct_id */ + sprintf(stmp,"_s_tmp_%i",allocateTemp()); + gsl_struct_decl_global_from_id(stmp,type); + } + } + tmp = new_var(stmp,expr->line_number); + + /* set the tmp to the value of "op1" */ + tmpcpy = nodeClone(tmp); + commit_node(new_set(tmp,expr->unode.opr.op[0]),0); + toAdd = 1; + + tmp = tmpcpy; + } + + /* add op2 to tmp */ +#ifdef VERBOSE + if (expr->unode.opr.nbOp == 2) + printf("%s %s %s\n", type, tmp->str, expr->unode.opr.op[toAdd]->str); + else + printf("%s %s\n", type, tmp->str); +#endif + currentGoomSL->instr = gsl_instr_init(currentGoomSL, type, instr_id, expr->unode.opr.nbOp, expr->line_number); + tmpcpy = nodeClone(tmp); + commit_node(tmp,0); + if (expr->unode.opr.nbOp == 2) { + commit_node(expr->unode.opr.op[toAdd],1); + } + + /* redefine the ADD node now as the computed variable */ + nodeFreeInternals(expr); + *expr = *tmpcpy; + free(tmpcpy); + } /* }}} */ + + static NodeType *new_expr1(const char *name, int id, NodeType *expr1) + { /* {{{ */ + NodeType *add = new_op(name, id, 1); + add->unode.opr.op[0] = expr1; + return add; + } /* }}} */ + + static NodeType *new_expr2(const char *name, int id, NodeType *expr1, NodeType *expr2) + { /* {{{ */ + NodeType *add = new_op(name, id, 2); + add->unode.opr.op[0] = expr1; + add->unode.opr.op[1] = expr2; + return add; + } /* }}} */ + + /* ADD */ + static NodeType *new_add(NodeType *expr1, NodeType *expr2) { /* {{{ */ + return new_expr2("add", OPR_ADD, expr1, expr2); + } + static void precommit_add(NodeType *add) { + precommit_expr(add,"add",INSTR_ADD); + } /* }}} */ + + /* SUB */ + static NodeType *new_sub(NodeType *expr1, NodeType *expr2) { /* {{{ */ + return new_expr2("sub", OPR_SUB, expr1, expr2); + } + static void precommit_sub(NodeType *sub) { + precommit_expr(sub,"sub",INSTR_SUB); + } /* }}} */ + + /* NEG */ + static NodeType *new_neg(NodeType *expr) { /* {{{ */ + NodeType *zeroConst = NULL; + if (expr->type == CONST_INT_NODE) + zeroConst = new_constInt("0", currentGoomSL->num_lines); + else if (expr->type == CONST_FLOAT_NODE) + zeroConst = new_constFloat("0.0", currentGoomSL->num_lines); + else if (expr->type == CONST_PTR_NODE) { + fprintf(stderr, "ERROR: Line %d, Could not negate const pointer.\n", + currentGoomSL->num_lines); + exit(1); + } + else { + int type = gsl_type_of_var(expr->vnamespace, expr->str); + if (type == INSTR_FLOAT) + zeroConst = new_constFloat("0.0", currentGoomSL->num_lines); + else if (type == INSTR_PTR) { + fprintf(stderr, "ERROR: Line %d, Could not negate pointer.\n", + currentGoomSL->num_lines); + exit(1); + } + else if (type == INSTR_INT) + zeroConst = new_constInt("0", currentGoomSL->num_lines); + else if (type == -1) { + fprintf(stderr, "ERROR: Line %d, Could not find variable '%s'\n", + expr->line_number, expr->unode.opr.op[0]->str); + exit(1); + } + else { /* type is a struct_id */ + fprintf(stderr, "ERROR: Line %d, Could not negate struct '%s'\n", + expr->line_number, expr->str); + exit(1); + } + } + return new_expr2("sub", OPR_SUB, zeroConst, expr); + } + /* }}} */ + + /* MUL */ + static NodeType *new_mul(NodeType *expr1, NodeType *expr2) { /* {{{ */ + return new_expr2("mul", OPR_MUL, expr1, expr2); + } + static void precommit_mul(NodeType *mul) { + precommit_expr(mul,"mul",INSTR_MUL); + } /* }}} */ + + /* DIV */ + static NodeType *new_div(NodeType *expr1, NodeType *expr2) { /* {{{ */ + return new_expr2("div", OPR_DIV, expr1, expr2); + } + static void precommit_div(NodeType *mul) { + precommit_expr(mul,"div",INSTR_DIV); + } /* }}} */ + + /* CALL EXPRESSION */ + static NodeType *new_call_expr(const char *name, NodeType *affect_list) { /* {{{ */ + NodeType *call = new_call(name,affect_list); + NodeType *node = new_expr1(name, OPR_CALL_EXPR, call); + node->vnamespace = gsl_find_namespace(name); + if (node->vnamespace == NULL) + fprintf(stderr, "ERROR: Line %d, No return type for: '%s'\n", currentGoomSL->num_lines, name); + return node; + } + static void precommit_call_expr(NodeType *call) { + char stmp[256]; + NodeType *tmp,*tmpcpy; + int type = gsl_type_of_var(call->vnamespace, call->str); + if (type == INSTR_FLOAT) { + sprintf(stmp,"_f_tmp_%i",allocateTemp()); + gsl_float_decl_global(stmp); + } + else if (type == INSTR_PTR) { + sprintf(stmp,"_p_tmp_%i",allocateTemp()); + gsl_ptr_decl_global(stmp); + } + else if (type == INSTR_INT) { + sprintf(stmp,"_i_tmp_%i",allocateTemp()); + gsl_int_decl_global(stmp); + } + else if (type == -1) { + fprintf(stderr, "ERROR: Line %d, Could not find variable '%s'\n", + call->line_number, call->str); + exit(1); + } + else { /* type is a struct_id */ + sprintf(stmp,"_s_tmp_%i",allocateTemp()); + gsl_struct_decl_global_from_id(stmp,type); + } + tmp = new_var(stmp,call->line_number); + commit_node(call->unode.opr.op[0],0); + tmpcpy = nodeClone(tmp); + commit_node(new_set(tmp,new_var(call->str,call->line_number)),0); + + nodeFreeInternals(call); + *call = *tmpcpy; + free(tmpcpy); + } /* }}} */ + + static void commit_test2(NodeType *set,const char *type, int instr) + { /* {{{ */ + NodeType *tmp; + char stmp[256]; + precommit_node(set->unode.opr.op[0]); + precommit_node(set->unode.opr.op[1]); + tmp = set->unode.opr.op[0]; + + stmp[0] = 0; + if (set->unode.opr.op[0]->type == CONST_INT_NODE) { + sprintf(stmp,"_i_tmp_%i",allocateTemp()); + gsl_int_decl_global(stmp); + } + else if (set->unode.opr.op[0]->type == CONST_FLOAT_NODE) { + sprintf(stmp,"_f_tmp%i",allocateTemp()); + gsl_float_decl_global(stmp); + } + else if (set->unode.opr.op[0]->type == CONST_PTR_NODE) { + sprintf(stmp,"_p_tmp%i",allocateTemp()); + gsl_ptr_decl_global(stmp); + } + if (stmp[0]) { + NodeType *tmpcpy; + tmp = new_var(stmp, set->line_number); + tmpcpy = nodeClone(tmp); + commit_node(new_set(tmp,set->unode.opr.op[0]),0); + tmp = tmpcpy; + } + +#ifdef VERBOSE + printf("%s %s %s\n", type, tmp->str, set->unode.opr.op[1]->str); +#endif + currentGoomSL->instr = gsl_instr_init(currentGoomSL, type, instr, 2, set->line_number); + commit_node(tmp,instr!=INSTR_SET); + commit_node(set->unode.opr.op[1],1); + } /* }}} */ + + /* NOT */ + static NodeType *new_not(NodeType *expr1) { /* {{{ */ + return new_expr1("not", OPR_NOT, expr1); + } + static void commit_not(NodeType *set) + { + commit_node(set->unode.opr.op[0],0); +#ifdef VERBOSE + printf("not\n"); +#endif + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "not", INSTR_NOT, 1, set->line_number); + gsl_instr_add_param(currentGoomSL->instr, "|dummy|", TYPE_LABEL); + } /* }}} */ + + /* EQU */ + static NodeType *new_equ(NodeType *expr1, NodeType *expr2) { /* {{{ */ + return new_expr2("isequal", OPR_EQU, expr1, expr2); + } + static void commit_equ(NodeType *mul) { + commit_test2(mul,"isequal",INSTR_ISEQUAL); + } /* }}} */ + + /* INF */ + static NodeType *new_low(NodeType *expr1, NodeType *expr2) { /* {{{ */ + return new_expr2("islower", OPR_LOW, expr1, expr2); + } + static void commit_low(NodeType *mul) { + commit_test2(mul,"islower",INSTR_ISLOWER); + } /* }}} */ + + /* WHILE */ + static NodeType *new_while(NodeType *expression, NodeType *instr) { /* {{{ */ + NodeType *node = new_op("while", OPR_WHILE, 2); + node->unode.opr.op[0] = expression; + node->unode.opr.op[1] = instr; + return node; + } + + static void commit_while(NodeType *node) + { + int lbl = allocateLabel(); + char start_while[1024], test_while[1024]; + sprintf(start_while, "|start_while_%d|", lbl); + sprintf(test_while, "|test_while_%d|", lbl); + + GSL_PUT_JUMP(test_while,node->line_number); + GSL_PUT_LABEL(start_while,node->line_number); + + /* code */ + commit_node(node->unode.opr.op[1],0); + + GSL_PUT_LABEL(test_while,node->line_number); + commit_node(node->unode.opr.op[0],0); + GSL_PUT_JNZERO(start_while,node->line_number); + } /* }}} */ + + /* FOR EACH */ + static NodeType *new_static_foreach(NodeType *var, NodeType *var_list, NodeType *instr) { /* {{{ */ + NodeType *node = new_op("for", OPR_FOREACH, 3); + node->unode.opr.op[0] = var; + node->unode.opr.op[1] = var_list; + node->unode.opr.op[2] = instr; + node->line_number = currentGoomSL->num_lines; + return node; + } + static void commit_foreach(NodeType *node) + { + NodeType *cur = node->unode.opr.op[1]; + char tmp_func[256], tmp_loop[256]; + int lbl = allocateLabel(); + sprintf(tmp_func, "|foreach_func_%d|", lbl); + sprintf(tmp_loop, "|foreach_loop_%d|", lbl); + + GSL_PUT_JUMP(tmp_loop, node->line_number); + GSL_PUT_LABEL(tmp_func, node->line_number); + + precommit_node(node->unode.opr.op[2]); + commit_node(node->unode.opr.op[2], 0); + + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "ret", INSTR_RET, 1, node->line_number); + gsl_instr_add_param(currentGoomSL->instr, "|dummy|", TYPE_LABEL); +#ifdef VERBOSE + printf("ret\n"); +#endif + + GSL_PUT_LABEL(tmp_loop, node->line_number); + + while (cur != NULL) + { + NodeType *x, *var; + + /* 1: x=var */ + x = nodeClone(node->unode.opr.op[0]); + var = nodeClone(cur->unode.opr.op[0]); + commit_node(new_set(x, var),0); + + /* 2: instr */ + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "call", INSTR_CALL, 1, node->line_number); + gsl_instr_add_param(currentGoomSL->instr, tmp_func, TYPE_LABEL); +#ifdef VERBOSE + printf("call %s\n", tmp_func); +#endif + + /* 3: var=x */ + x = nodeClone(node->unode.opr.op[0]); + var = cur->unode.opr.op[0]; + commit_node(new_set(var, x),0); + cur = cur->unode.opr.op[1]; + } + nodeFree(node->unode.opr.op[0]); + } /* }}} */ + + /* IF */ + static NodeType *new_if(NodeType *expression, NodeType *instr) { /* {{{ */ + NodeType *node = new_op("if", OPR_IF, 2); + node->unode.opr.op[0] = expression; + node->unode.opr.op[1] = instr; + return node; + } + static void commit_if(NodeType *node) { + + char slab[1024]; + sprintf(slab, "|eif%d|", allocateLabel()); + commit_node(node->unode.opr.op[0],0); + GSL_PUT_JZERO(slab,node->line_number); + /* code */ + commit_node(node->unode.opr.op[1],0); + GSL_PUT_LABEL(slab,node->line_number); + } /* }}} */ + + /* BLOCK */ + static NodeType *new_block(NodeType *lastNode) { /* {{{ */ + NodeType *blk = new_op("block", OPR_BLOCK, 2); + blk->unode.opr.op[0] = new_nop("start_of_block"); + blk->unode.opr.op[1] = lastNode; + return blk; + } + static void commit_block(NodeType *node) { + commit_node(node->unode.opr.op[0]->unode.opr.next,0); + } /* }}} */ + + /* FUNCTION INTRO */ + static NodeType *new_function_intro(const char *name) { /* {{{ */ + char stmp[256]; + if (strlen(name) < 200) { + sprintf(stmp, "|__func_%s|", name); + } + return new_op(stmp, OPR_FUNC_INTRO, 0); + } + static void commit_function_intro(NodeType *node) { + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "label", INSTR_LABEL, 1, node->line_number); + gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_LABEL); +#ifdef VERBOSE + printf("label %s\n", node->str); +#endif + } /* }}} */ + + /* FUNCTION OUTRO */ + static NodeType *new_function_outro() { /* {{{ */ + return new_op("ret", OPR_FUNC_OUTRO, 0); + } + static void commit_function_outro(NodeType *node) { + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "ret", INSTR_RET, 1, node->line_number); + gsl_instr_add_param(currentGoomSL->instr, "|dummy|", TYPE_LABEL); + releaseAllTemps(); +#ifdef VERBOSE + printf("ret\n"); +#endif + } /* }}} */ + + /* AFFECTATION LIST */ + static NodeType *new_affec_list(NodeType *set, NodeType *next) /* {{{ */ + { + NodeType *node = new_op("affect_list", OPR_AFFECT_LIST, 2); + node->unode.opr.op[0] = set; + node->unode.opr.op[1] = next; + return node; + } + static NodeType *new_affect_list_after(NodeType *affect_list) + { + NodeType *ret = NULL; + NodeType *cur = affect_list; + while(cur != NULL) { + NodeType *set = cur->unode.opr.op[0]; + NodeType *next = cur->unode.opr.op[1]; + NodeType *lvalue = set->unode.opr.op[0]; + NodeType *expression = set->unode.opr.op[1]; + if ((lvalue->str[0] == '&') && (expression->type == VAR_NODE)) { + NodeType *nset = new_set(nodeClone(expression), nodeClone(lvalue)); + ret = new_affec_list(nset, ret); + } + cur = next; + } + return ret; + } + static void commit_affect_list(NodeType *node) + { + NodeType *cur = node; + while(cur != NULL) { + NodeType *set = cur->unode.opr.op[0]; + precommit_node(set->unode.opr.op[0]); + precommit_node(set->unode.opr.op[1]); + cur = cur->unode.opr.op[1]; + } + cur = node; + while(cur != NULL) { + NodeType *set = cur->unode.opr.op[0]; + commit_node(set,0); + cur = cur->unode.opr.op[1]; + } + } /* }}} */ + + /* VAR LIST */ + static NodeType *new_var_list(NodeType *var, NodeType *next) /* {{{ */ + { + NodeType *node = new_op("var_list", OPR_VAR_LIST, 2); + node->unode.opr.op[0] = var; + node->unode.opr.op[1] = next; + return node; + } + static void commit_var_list(NodeType *node) + { + } /* }}} */ + + /* FUNCTION CALL */ + static NodeType *new_call(const char *name, NodeType *affect_list) { /* {{{ */ + HashValue *fval; + fval = goom_hash_get(currentGoomSL->functions, name); + if (!fval) { + gsl_declare_task(name); + fval = goom_hash_get(currentGoomSL->functions, name); + } + if (!fval) { + fprintf(stderr, "ERROR: Line %d, Could not find function %s\n", currentGoomSL->num_lines, name); + exit(1); + return NULL; + } + else { + ExternalFunctionStruct *gef = (ExternalFunctionStruct*)fval->ptr; + if (gef->is_extern) { + NodeType *node = new_op(name, OPR_EXT_CALL, 1); + node->unode.opr.op[0] = affect_list; + return node; + } + else { + NodeType *node; + char stmp[256]; + if (strlen(name) < 200) { + sprintf(stmp, "|__func_%s|", name); + } + node = new_op(stmp, OPR_CALL, 1); + node->unode.opr.op[0] = affect_list; + return node; + } + } + } + static void commit_ext_call(NodeType *node) { + NodeType *alafter = new_affect_list_after(node->unode.opr.op[0]); + commit_node(node->unode.opr.op[0],0); + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "extcall", INSTR_EXT_CALL, 1, node->line_number); + gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_VAR); +#ifdef VERBOSE + printf("extcall %s\n", node->str); +#endif + commit_node(alafter,0); + } + static void commit_call(NodeType *node) { + NodeType *alafter = new_affect_list_after(node->unode.opr.op[0]); + commit_node(node->unode.opr.op[0],0); + currentGoomSL->instr = gsl_instr_init(currentGoomSL, "call", INSTR_CALL, 1, node->line_number); + gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_LABEL); +#ifdef VERBOSE + printf("call %s\n", node->str); +#endif + commit_node(alafter,0); + } /* }}} */ + + /** **/ + + static NodeType *rootNode = 0; /* TODO: reinitialiser a chaque compilation. */ + static NodeType *lastNode = 0; + static NodeType *gsl_append(NodeType *curNode) { + if (curNode == 0) return 0; /* {{{ */ + if (lastNode) + lastNode->unode.opr.next = curNode; + lastNode = curNode; + while(lastNode->unode.opr.next) lastNode = lastNode->unode.opr.next; + if (rootNode == 0) + rootNode = curNode; + return curNode; + } /* }}} */ + +#if 1 + int allocateTemp() { + return allocateLabel(); + } + void releaseAllTemps() {} + void releaseTemp(int n) {} +#else + static int nbTemp = 0; + static int *tempArray = 0; + static int tempArraySize = 0; + int allocateTemp() { /* TODO: allocateITemp, allocateFTemp */ + int i = 0; /* {{{ */ + if (tempArray == 0) { + tempArraySize = 256; + tempArray = (int*)malloc(tempArraySize * sizeof(int)); + } + while (1) { + int j; + for (j=0;jtype == OPR_NODE) + switch(node->unode.opr.type) { + case OPR_ADD: precommit_add(node); break; + case OPR_SUB: precommit_sub(node); break; + case OPR_MUL: precommit_mul(node); break; + case OPR_DIV: precommit_div(node); break; + case OPR_CALL_EXPR: precommit_call_expr(node); break; + } + } /* }}} */ + + void commit_node(NodeType *node, int releaseIfTmp) + { /* {{{ */ + if (node == 0) return; + + switch(node->type) { + case OPR_NODE: + switch(node->unode.opr.type) { + case OPR_SET: commit_set(node); break; + case OPR_PLUS_EQ: commit_plus_eq(node); break; + case OPR_SUB_EQ: commit_sub_eq(node); break; + case OPR_MUL_EQ: commit_mul_eq(node); break; + case OPR_DIV_EQ: commit_div_eq(node); break; + case OPR_IF: commit_if(node); break; + case OPR_WHILE: commit_while(node); break; + case OPR_BLOCK: commit_block(node); break; + case OPR_FUNC_INTRO: commit_function_intro(node); break; + case OPR_FUNC_OUTRO: commit_function_outro(node); break; + case OPR_CALL: commit_call(node); break; + case OPR_EXT_CALL: commit_ext_call(node); break; + case OPR_EQU: commit_equ(node); break; + case OPR_LOW: commit_low(node); break; + case OPR_NOT: commit_not(node); break; + case OPR_AFFECT_LIST: commit_affect_list(node); break; + case OPR_FOREACH: commit_foreach(node); break; + case OPR_VAR_LIST: commit_var_list(node); break; +#ifdef VERBOSE + case EMPTY_NODE: printf("NOP\n"); break; +#endif + } + + commit_node(node->unode.opr.next,0); /* recursive for the moment, maybe better to do something iterative? */ + break; + + case VAR_NODE: gsl_instr_set_namespace(currentGoomSL->instr, node->vnamespace); + gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_VAR); break; + case CONST_INT_NODE: gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_INTEGER); break; + case CONST_FLOAT_NODE: gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_FLOAT); break; + case CONST_PTR_NODE: gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_PTR); break; + } + if (releaseIfTmp && is_tmp_expr(node)) + releaseTemp(get_tmp_id(node)); + + nodeFree(node); + } /* }}} */ + + NodeType *nodeNew(const char *str, int type, int line_number) { + NodeType *node = (NodeType*)malloc(sizeof(NodeType)); /* {{{ */ + node->type = type; + node->str = (char*)malloc(strlen(str)+1); + node->vnamespace = NULL; + node->line_number = line_number; + strcpy(node->str, str); + return node; + } /* }}} */ + static NodeType *nodeClone(NodeType *node) { + NodeType *ret = nodeNew(node->str, node->type, node->line_number); /* {{{ */ + ret->vnamespace = node->vnamespace; + ret->unode = node->unode; + return ret; + } /* }}} */ + + void nodeFreeInternals(NodeType *node) { + free(node->str); /* {{{ */ + } /* }}} */ + + void nodeFree(NodeType *node) { + nodeFreeInternals(node); /* {{{ */ + free(node); + } /* }}} */ + + NodeType *new_constInt(const char *str, int line_number) { + NodeType *node = nodeNew(str, CONST_INT_NODE, line_number); /* {{{ */ + node->unode.constInt.val = atoi(str); + return node; + } /* }}} */ + + NodeType *new_constPtr(const char *str, int line_number) { + NodeType *node = nodeNew(str, CONST_PTR_NODE, line_number); /* {{{ */ + node->unode.constPtr.id = strtol(str,NULL,0); + return node; + } /* }}} */ + + NodeType *new_constFloat(const char *str, int line_number) { + NodeType *node = nodeNew(str, CONST_FLOAT_NODE, line_number); /* {{{ */ + node->unode.constFloat.val = atof(str); + return node; + } /* }}} */ + + NodeType *new_var(const char *str, int line_number) { + NodeType *node = nodeNew(str, VAR_NODE, line_number); /* {{{ */ + node->vnamespace = gsl_find_namespace(str); + if (node->vnamespace == 0) { + fprintf(stderr, "ERROR: Line %d, Variable not found: '%s'\n", line_number, str); + exit(1); + } + return node; + } /* }}} */ + + NodeType *new_nop(const char *str) { + NodeType *node = new_op(str, EMPTY_NODE, 0); /* {{{ */ + return node; + } /* }}} */ + + NodeType *new_op(const char *str, int type, int nbOp) { + int i; /* {{{ */ + NodeType *node = nodeNew(str, OPR_NODE, currentGoomSL->num_lines); + node->unode.opr.next = 0; + node->unode.opr.type = type; + node->unode.opr.nbOp = nbOp; + for (i=0;iunode.opr.op[i] = 0; + return node; + } /* }}} */ + + + void gsl_declare_global_variable(int type, char *name) { + switch(type){ + case -1: break; + case FLOAT_TK:gsl_float_decl_global(name);break; + case INT_TK: gsl_int_decl_global(name);break; + case PTR_TK: gsl_ptr_decl_global(name);break; + default: + { + int id = type - 1000; + gsl_struct_decl_global_from_id(name,id); + } + } + } + +%} + +%union { + int intValue; + float floatValue; + char charValue; + char strValue[2048]; + NodeType *nPtr; + GoomHash *namespace; + GSL_Struct *gsl_struct; + GSL_StructField *gsl_struct_field; + }; + +%token LTYPE_INTEGER +%token LTYPE_FLOAT +%token LTYPE_VAR +%token LTYPE_PTR + +%token PTR_TK INT_TK FLOAT_TK DECLARE EXTERNAL WHILE DO NOT PLUS_EQ SUB_EQ DIV_EQ MUL_EQ SUP_EQ LOW_EQ NOT_EQ STRUCT FOR IN + +%type return_type +%type expression constValue instruction test func_call func_call_expression +%type start_block affectation_list affectation_in_list affectation declaration +%type var_list_content var_list +%type task_name ext_task_name +%type leave_namespace +%type struct_members +%type struct_member +%left '\n' +%left PLUS_EQ SUB_EQ MUL_EQ DIV_EQ +%left NOT +%left '=' '<' '>' +%left '+' '-' +%left '/' '*' + +%% + +/* -------------- Global architechture of a GSL program ------------*/ + +gsl: gsl_code function_outro gsl_def_functions ; + +gsl_code: gsl_code instruction { gsl_append($2); } + | gsl_code EXTERNAL '<' ext_task_name '>' return_type '\n' leave_namespace { gsl_declare_global_variable($6,$4); } + | gsl_code EXTERNAL '<' ext_task_name ':' arglist '>' return_type '\n' leave_namespace { gsl_declare_global_variable($8,$4); } + | gsl_code DECLARE '<' task_name '>' return_type '\n' leave_namespace { gsl_declare_global_variable($6,$4); } + | gsl_code DECLARE '<' task_name ':' arglist '>' return_type '\n' leave_namespace { gsl_declare_global_variable($8,$4); } + | gsl_code struct_declaration + | gsl_code '\n' + | + ; + +/* ------------- Declaration of a structure ------------ */ + +struct_declaration: STRUCT '<' LTYPE_VAR ':' struct_members '>' '\n' { gsl_add_struct($3, $5); } + ; + +struct_members: opt_nl struct_member { $$ = gsl_new_struct($2); } + | struct_members ',' opt_nl struct_member { $$ = $1; gsl_add_struct_field($1, $4); } + ; + +struct_member: INT_TK LTYPE_VAR { $$ = gsl_new_struct_field($2, INSTR_INT); } + | FLOAT_TK LTYPE_VAR { $$ = gsl_new_struct_field($2, INSTR_FLOAT); } + | PTR_TK LTYPE_VAR { $$ = gsl_new_struct_field($2, INSTR_PTR); } + | LTYPE_VAR LTYPE_VAR { $$ = gsl_new_struct_field_struct($2, $1); } + ; + +/* ------------- Fonction declarations -------------- */ + +ext_task_name: LTYPE_VAR { gsl_declare_external_task($1); gsl_enternamespace($1); strcpy($$,$1); } + ; +task_name: LTYPE_VAR { gsl_declare_task($1); gsl_enternamespace($1); strcpy($$,$1); strcpy($$,$1); } + ; + +return_type: { $$=-1; } + | ':' INT_TK { $$=INT_TK; } + | ':' FLOAT_TK { $$=FLOAT_TK; } + | ':' PTR_TK { $$=PTR_TK; } + | ':' LTYPE_VAR { $$= 1000 + gsl_get_struct_id($2); } + ; + +arglist: empty_declaration + | empty_declaration ',' arglist + ; + +/* ------------- Fonction definition -------------- */ + +gsl_def_functions: gsl_def_functions function + | + ; + +function: function_intro gsl_code function_outro { gsl_leavenamespace(); } + +function_intro: '<' task_name '>' return_type '\n' { gsl_append(new_function_intro($2)); + gsl_declare_global_variable($4,$2); } + | '<' task_name ':' arglist '>' return_type '\n' { gsl_append(new_function_intro($2)); + gsl_declare_global_variable($6,$2); } + ; +function_outro: { gsl_append(new_function_outro()); } ; + +leave_namespace: { $$ = gsl_leavenamespace(); }; + +/* ------------ Variable declaration ---------------- */ + +declaration: FLOAT_TK LTYPE_VAR '=' expression { gsl_float_decl_local($2); $$ = new_set(new_var($2,currentGoomSL->num_lines), $4); } + | INT_TK LTYPE_VAR '=' expression { gsl_int_decl_local($2); $$ = new_set(new_var($2,currentGoomSL->num_lines), $4); } + | PTR_TK LTYPE_VAR '=' expression { gsl_ptr_decl_local($2); $$ = new_set(new_var($2,currentGoomSL->num_lines), $4); } + | LTYPE_VAR LTYPE_VAR '=' expression { gsl_struct_decl_local($1,$2); $$ = new_set(new_var($2,currentGoomSL->num_lines), $4); } + | empty_declaration { $$ = 0; } + ; + +empty_declaration: FLOAT_TK LTYPE_VAR { gsl_float_decl_local($2); } + | INT_TK LTYPE_VAR { gsl_int_decl_local($2); } + | PTR_TK LTYPE_VAR { gsl_ptr_decl_local($2); } + | LTYPE_VAR LTYPE_VAR { gsl_struct_decl_local($1,$2); } + ; + +/* -------------- Instructions and Expressions ------------------ */ + +instruction: affectation '\n' { $$ = $1; } + | declaration '\n' { $$ = $1; } + | '(' test ')' '?' opt_nl instruction { $$ = new_if($2,$6); } + | WHILE test opt_nl DO opt_nl instruction { $$ = new_while($2,$6); } + | '{' '\n' start_block gsl_code '}' '\n' { lastNode = $3->unode.opr.op[1]; $$=$3; } + | func_call { $$ = $1; } + | LTYPE_VAR PLUS_EQ expression { $$ = new_plus_eq(new_var($1,currentGoomSL->num_lines),$3); } + | LTYPE_VAR SUB_EQ expression { $$ = new_sub_eq(new_var($1,currentGoomSL->num_lines),$3); } + | LTYPE_VAR MUL_EQ expression { $$ = new_mul_eq(new_var($1,currentGoomSL->num_lines),$3); } + | LTYPE_VAR DIV_EQ expression { $$ = new_div_eq(new_var($1,currentGoomSL->num_lines),$3); } + | FOR LTYPE_VAR IN var_list DO instruction { $$ = new_static_foreach(new_var($2, currentGoomSL->num_lines), $4, $6); } + ; + +var_list: '(' var_list_content ')' { $$ = $2; } + ; +var_list_content: LTYPE_VAR { $$ = new_var_list(new_var($1,currentGoomSL->num_lines), NULL); } + | LTYPE_VAR var_list_content { $$ = new_var_list(new_var($1,currentGoomSL->num_lines), $2); } + ; + +affectation: LTYPE_VAR '=' expression { $$ = new_set(new_var($1,currentGoomSL->num_lines),$3); } ; + +start_block: { $$ = new_block(lastNode); lastNode = $$->unode.opr.op[0]; } + ; + +expression: LTYPE_VAR { $$ = new_var($1,currentGoomSL->num_lines); } + | constValue { $$ = $1; } + | expression '*' expression { $$ = new_mul($1,$3); } + | expression '/' expression { $$ = new_div($1,$3); } + | expression '+' expression { $$ = new_add($1,$3); } + | expression '-' expression { $$ = new_sub($1,$3); } + | '-' expression { $$ = new_neg($2); } + | '(' expression ')' { $$ = $2; } + | func_call_expression { $$ = $1; } + ; + +test: expression '=' expression { $$ = new_equ($1,$3); } + | expression '<' expression { $$ = new_low($1,$3); } + | expression '>' expression { $$ = new_low($3,$1); } + | expression SUP_EQ expression { $$ = new_not(new_low($1,$3)); } + | expression LOW_EQ expression { $$ = new_not(new_low($3,$1)); } + | expression NOT_EQ expression { $$ = new_not(new_equ($1,$3)); } + | NOT test { $$ = new_not($2); } + ; + +constValue: LTYPE_FLOAT { $$ = new_constFloat($1,currentGoomSL->num_lines); } + | LTYPE_INTEGER { $$ = new_constInt($1,currentGoomSL->num_lines); } + | LTYPE_PTR { $$ = new_constPtr($1,currentGoomSL->num_lines); } + ; + +/* ---------------- Function Calls ------------------ */ + +func_call: task_name '\n' leave_namespace { $$ = new_call($1,NULL); } + | task_name ':' affectation_list '\n' leave_namespace { $$ = new_call($1,$3); } + | '[' task_name ']' '\n' leave_namespace { $$ = new_call($2,NULL); } + | '[' task_name ':' affectation_list ']' '\n' leave_namespace { $$ = new_call($2,$4); } + ; + +func_call_expression: + '[' task_name leave_namespace ']' { $$ = new_call_expr($2,NULL); } + | '[' task_name ':' affectation_list ']' leave_namespace { $$ = new_call_expr($2,$4); } + ; + +affectation_list: affectation_in_list affectation_list { $$ = new_affec_list($1,$2); } + | affectation_in_list { $$ = new_affec_list($1,NULL); } + +affectation_in_list: LTYPE_VAR '=' leave_namespace expression { + gsl_reenternamespace($3); + $$ = new_set(new_var($1,currentGoomSL->num_lines),$4); + } + | ':' leave_namespace expression { + gsl_reenternamespace($2); + $$ = new_set(new_var("&this", currentGoomSL->num_lines),$3); + } + ; + + +/* ------------ Misc ---------- */ + +opt_nl: '\n' | ; + + +%% + + +void yyerror(char *str) +{ /* {{{ */ + fprintf(stderr, "ERROR: Line %d, %s\n", currentGoomSL->num_lines, str); + currentGoomSL->compilationOK = 0; + exit(1); +} /* }}} */ + diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/goom_tools.c kodi-visualization-goom-2.1.0/lib/goom/src/goom_tools.c --- kodi-visualization-goom-1.1.0/lib/goom/src/goom_tools.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/goom_tools.c 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,25 @@ +#include "goom_tools.h" +#include + +GoomRandom *goom_random_init(int i) { + GoomRandom *grandom = (GoomRandom*)malloc(sizeof(GoomRandom)); + srand (i); + grandom->pos = 1; + goom_random_update_array(grandom, GOOM_NB_RAND); + return grandom; +} + +void goom_random_free(GoomRandom *grandom) { + free(grandom); +} + +void goom_random_update_array(GoomRandom *grandom, int numberOfValuesToChange) { + while (numberOfValuesToChange > 0) { +#if RAND_MAX < 0x10000 + grandom->array[grandom->pos++] = ((rand()<<16)+rand()) / 127; +#else + grandom->array[grandom->pos++] = rand() / 127; +#endif + numberOfValuesToChange--; + } +} diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/goom_tools.h kodi-visualization-goom-2.1.0/lib/goom/src/goom_tools.h --- kodi-visualization-goom-1.1.0/lib/goom/src/goom_tools.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/goom_tools.h 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,42 @@ +#ifndef _GOOMTOOLS_H +#define _GOOMTOOLS_H + +/** + * Random number generator wrapper for faster random number. + */ + +#ifdef _WIN32PC +#define inline __inline +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif +#define random rand +#define bzero(x,y) memset(x,0,y) +#endif + +#define GOOM_NB_RAND 0x10000 + +typedef struct _GOOM_RANDOM { + int array[GOOM_NB_RAND]; + unsigned short pos; +} GoomRandom; + +GoomRandom *goom_random_init(int i); +void goom_random_free(GoomRandom *grandom); + +inline static int goom_random(GoomRandom *grandom) { + + grandom->pos++; /* works because pos is an unsigned short */ + return grandom->array[grandom->pos]; +} + +inline static int goom_irand(GoomRandom *grandom, int i) { + + grandom->pos++; + return grandom->array[grandom->pos] % i; +} + +/* called to change the specified number of value in the array, so that the array does not remain the same*/ +void goom_random_update_array(GoomRandom *grandom, int numberOfValuesToChange); + +#endif diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/goom_typedefs.h kodi-visualization-goom-2.1.0/lib/goom/src/goom_typedefs.h --- kodi-visualization-goom-1.1.0/lib/goom/src/goom_typedefs.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/goom_typedefs.h 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,11 @@ +#ifndef _GOOM_TYPEDEFS_H +#define _GOOM_TYPEDEFS_H + +typedef struct _PLUGIN_INFO PluginInfo; +typedef struct _SOUND_INFO SoundInfo; +typedef struct _GMLINE GMLine; +typedef struct _GMUNITPOINTER GMUnitPointer; +typedef struct _ZOOM_FILTER_DATA ZoomFilterData; +typedef struct _VISUAL_FX VisualFX; + +#endif diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/goom_visual_fx.h kodi-visualization-goom-2.1.0/lib/goom/src/goom_visual_fx.h --- kodi-visualization-goom-1.1.0/lib/goom/src/goom_visual_fx.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/goom_visual_fx.h 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,26 @@ +#ifndef _VISUAL_FX_H +#define _VISUAL_FX_H + +/** + * File created on 2003-05-21 by Jeko. + * (c)2003, JC Hoelt for iOS-software. + * + * LGPL Licence. + * If you use this file on a visual program, + * please make my name being visible on it. + */ + +#include "goom_config_param.h" +#include "goom_graphic.h" +#include "goom_typedefs.h" + +struct _VISUAL_FX { + void (*init) (struct _VISUAL_FX *_this, PluginInfo *info); + void (*free) (struct _VISUAL_FX *_this); + void (*apply) (struct _VISUAL_FX *_this, Pixel *src, Pixel *dest, PluginInfo *info); + void *fx_data; + + PluginParameters *params; +}; + +#endif diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/graphic.c kodi-visualization-goom-2.1.0/lib/goom/src/graphic.c --- kodi-visualization-goom-1.1.0/lib/goom/src/graphic.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/graphic.c 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,10 @@ +#include "goom_graphic.h" + +const Color BLACK = { 0, 0, 0 }; +const Color WHITE = { 0xff, 0xff, 0xff }; +const Color RED = { 0xff, 0x05, 0x05 }; +const Color GREEN = { 0x05, 0xff, 0x05 }; +const Color BLUE = { 0x05, 0x05, 0xff }; +const Color YELLOW = { 0xff, 0xff, 0x33 }; +const Color ORANGE = { 0xff, 0xcc, 0x05 }; +const Color VIOLET = { 0x55, 0x05, 0xff }; diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/ifs.c kodi-visualization-goom-2.1.0/lib/goom/src/ifs.c --- kodi-visualization-goom-1.1.0/lib/goom/src/ifs.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/ifs.c 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,786 @@ +/* + * ifs.c --- modified iterated functions system for goom. + */ + +/*- + * Copyright (c) 1997 by Massimino Pascal + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, + * provided that the above copyright notice appear in all copies and that + * both that copyright notice and this permission notice appear in + * supporting documentation. + * + * This file is provided AS IS with no warranties of any kind. The author + * shall have no liability with respect to the infringement of copyrights, + * trade secrets or any patents by this file or any part thereof. In no + * event will the author be liable for any lost revenue or profits or + * other special, indirect and consequential damages. + * + * If this mode is weird and you have an old MetroX server, it is buggy. + * There is a free SuSE-enhanced MetroX X server that is fine. + * + * When shown ifs, Diana Rose (4 years old) said, "It looks like dancing." + * + * Revision History: + * 13-Dec-2003: Added some goom specific stuffs (to make ifs a VisualFX). + * 11-Apr-2002: jeko@ios-software.com: Make ifs.c system-indendant. (ifs.h added) + * 01-Nov-2000: Allocation checks + * 10-May-1997: jwz@jwz.org: turned into a standalone program. + * Made it render into an offscreen bitmap and then copy + * that onto the screen, to reduce flicker. + */ + +/* #ifdef STANDALONE */ + +#include +#include +#include + +#include "goom.h" +#include "goom_config.h" + +#ifdef HAVE_MMX +#include "mmx.h" +#endif + +#include "goom_graphic.h" +#include "ifs.h" +#include "goom_tools.h" + +typedef struct _ifsPoint +{ + gint32 x, y; +} +IFSPoint; + + +#define MODE_ifs + +#define PROGCLASS "IFS" + +#define HACK_INIT init_ifs +#define HACK_DRAW draw_ifs + +#define ifs_opts xlockmore_opts + +#define DEFAULTS "*delay: 20000 \n" \ +"*ncolors: 100 \n" + +#define SMOOTH_COLORS + +#define LRAND() ((long) (goom_random(goomInfo->gRandom) & 0x7fffffff)) +#define NRAND(n) ((int) (LRAND() % (n))) + +#if RAND_MAX < 0x10000 +#define MAXRAND (((float)(RAND_MAX<16)+((float)RAND_MAX)+1.0f)/127.0f) +#else +#define MAXRAND (2147483648.0/127.0) /* unsigned 1<<31 / 127.0 (cf goom_tools) as a float */ +#endif + +/*****************************************************/ + +typedef float DBL; +typedef int F_PT; + +/* typedef float F_PT; */ + +/*****************************************************/ + +#define FIX 12 +#define UNIT ( 1<dr_mean*r_1_minus_exp_neg_S; + const DBL r2_AS_factor = F->dr2_mean*r2_1_minus_exp_neg_S; + + while (i--) { + Cur->c_x = Gauss_Rand (goomInfo, 0.0, 4.0, c_AS_factor); + Cur->c_y = Gauss_Rand (goomInfo, 0.0, 4.0, c_AS_factor); + Cur->r = Gauss_Rand (goomInfo, F->r_mean, 3.0, r_AS_factor); + Cur->r2 = Half_Gauss_Rand (goomInfo, 0.0, 2.0, r2_AS_factor); + Cur->A = Gauss_Rand (goomInfo, 0.0, 4.0, A_AS_factor) * (M_PI / 180.0); + Cur->A2 = Gauss_Rand (goomInfo, 0.0, 4.0, A2_AS_factor) * (M_PI / 180.0); + Cur++; + } +} + +static void +free_ifs_buffers (FRACTAL * Fractal) +{ + if (Fractal->Buffer1 != NULL) { + (void) free ((void *) Fractal->Buffer1); + Fractal->Buffer1 = (IFSPoint *) NULL; + } + if (Fractal->Buffer2 != NULL) { + (void) free ((void *) Fractal->Buffer2); + Fractal->Buffer2 = (IFSPoint *) NULL; + } +} + + +static void +free_ifs (FRACTAL * Fractal) +{ + free_ifs_buffers (Fractal); +} + +/***************************************************************/ + +static void +init_ifs (PluginInfo *goomInfo, IfsData *data) +{ + int i; + FRACTAL *Fractal; + int width = goomInfo->screen.width; + int height = goomInfo->screen.height; + + if (data->Root == NULL) { + data->Root = (FRACTAL *) malloc (sizeof (FRACTAL)); + if (data->Root == NULL) + return; + data->Root->Buffer1 = (IFSPoint *) NULL; + data->Root->Buffer2 = (IFSPoint *) NULL; + } + Fractal = data->Root; + + free_ifs_buffers (Fractal); + + i = (NRAND (4)) + 2; /* Number of centers */ + switch (i) { + case 3: + Fractal->Depth = MAX_DEPTH_3; + Fractal->r_mean = .6; + Fractal->dr_mean = .4; + Fractal->dr2_mean = .3; + break; + + case 4: + Fractal->Depth = MAX_DEPTH_4; + Fractal->r_mean = .5; + Fractal->dr_mean = .4; + Fractal->dr2_mean = .3; + break; + + case 5: + Fractal->Depth = MAX_DEPTH_5; + Fractal->r_mean = .5; + Fractal->dr_mean = .4; + Fractal->dr2_mean = .3; + break; + + default: + case 2: + Fractal->Depth = MAX_DEPTH_2; + Fractal->r_mean = .7; + Fractal->dr_mean = .3; + Fractal->dr2_mean = .4; + break; + } + Fractal->Nb_Simi = i; + Fractal->Max_Pt = Fractal->Nb_Simi - 1; + for (i = 0; i <= Fractal->Depth + 2; ++i) + Fractal->Max_Pt *= Fractal->Nb_Simi; + + if ((Fractal->Buffer1 = (IFSPoint *) calloc (Fractal->Max_Pt, + sizeof (IFSPoint))) == NULL) { + free_ifs (Fractal); + return; + } + if ((Fractal->Buffer2 = (IFSPoint *) calloc (Fractal->Max_Pt, + sizeof (IFSPoint))) == NULL) { + free_ifs (Fractal); + return; + } + + Fractal->Speed = 6; + Fractal->Width = width; /* modif by JeKo */ + Fractal->Height = height; /* modif by JeKo */ + Fractal->Cur_Pt = 0; + Fractal->Count = 0; + Fractal->Lx = (Fractal->Width - 1) / 2; + Fractal->Ly = (Fractal->Height - 1) / 2; + Fractal->Col = rand () % (width * height); /* modif by JeKo */ + + Random_Simis (goomInfo, Fractal, Fractal->Components, 5 * MAX_SIMI); +} + + +/***************************************************************/ + +static inline void +Transform (SIMI * Simi, F_PT xo, F_PT yo, F_PT * x, F_PT * y) +{ + F_PT xx, yy; + + xo = xo - Simi->Cx; + xo = (xo * Simi->R) >> FIX; /* / UNIT; */ + yo = yo - Simi->Cy; + yo = (yo * Simi->R) >> FIX; /* / UNIT; */ + + xx = xo - Simi->Cx; + xx = (xx * Simi->R2) >> FIX; /* / UNIT; */ + yy = -yo - Simi->Cy; + yy = (yy * Simi->R2) >> FIX; /* / UNIT; */ + + *x = + ((xo * Simi->Ct - yo * Simi->St + xx * Simi->Ct2 - yy * Simi->St2) + >> FIX /* / UNIT */ ) + Simi->Cx; + *y = + ((xo * Simi->St + yo * Simi->Ct + xx * Simi->St2 + yy * Simi->Ct2) + >> FIX /* / UNIT */ ) + Simi->Cy; +} + +/***************************************************************/ + +static void +Trace (FRACTAL * F, F_PT xo, F_PT yo, IfsData *data) +{ + F_PT x, y, i; + SIMI *Cur; + + Cur = data->Cur_F->Components; + for (i = data->Cur_F->Nb_Simi; i; --i, Cur++) { + Transform (Cur, xo, yo, &x, &y); + + data->Buf->x = F->Lx + ((x * F->Lx) >> (FIX+1) /* /(UNIT*2) */ ); + data->Buf->y = F->Ly - ((y * F->Ly) >> (FIX+1) /* /(UNIT*2) */ ); + data->Buf++; + + data->Cur_Pt++; + + if (F->Depth && ((x - xo) >> 4) && ((y - yo) >> 4)) { + F->Depth--; + Trace (F, x, y, data); + F->Depth++; + } + } +} + +static void +Draw_Fractal (IfsData *data) +{ + FRACTAL *F = data->Root; + int i, j; + F_PT x, y, xo, yo; + SIMI *Cur, *Simi; + + for (Cur = F->Components, i = F->Nb_Simi; i; --i, Cur++) { + Cur->Cx = DBL_To_F_PT (Cur->c_x); + Cur->Cy = DBL_To_F_PT (Cur->c_y); + + Cur->Ct = DBL_To_F_PT (cos (Cur->A)); + Cur->St = DBL_To_F_PT (sin (Cur->A)); + Cur->Ct2 = DBL_To_F_PT (cos (Cur->A2)); + Cur->St2 = DBL_To_F_PT (sin (Cur->A2)); + + Cur->R = DBL_To_F_PT (Cur->r); + Cur->R2 = DBL_To_F_PT (Cur->r2); + } + + + data->Cur_Pt = 0; + data->Cur_F = F; + data->Buf = F->Buffer2; + for (Cur = F->Components, i = F->Nb_Simi; i; --i, Cur++) { + xo = Cur->Cx; + yo = Cur->Cy; + for (Simi = F->Components, j = F->Nb_Simi; j; --j, Simi++) { + if (Simi == Cur) + continue; + Transform (Simi, xo, yo, &x, &y); + Trace (F, x, y, data); + } + } + + /* Erase previous */ + + F->Cur_Pt = data->Cur_Pt; + data->Buf = F->Buffer1; + F->Buffer1 = F->Buffer2; + F->Buffer2 = data->Buf; +} + + +static IFSPoint * +draw_ifs (PluginInfo *goomInfo, int *nbpt, IfsData *data) +{ + int i; + DBL u, uu, v, vv, u0, u1, u2, u3; + SIMI *S, *S1, *S2, *S3, *S4; + FRACTAL *F; + + if (data->Root == NULL) + return NULL; + F = data->Root; + if (F->Buffer1 == NULL) + return NULL; + + u = (DBL) (F->Count) * (DBL) (F->Speed) / 1000.0; + uu = u * u; + v = 1.0 - u; + vv = v * v; + u0 = vv * v; + u1 = 3.0 * vv * u; + u2 = 3.0 * v * uu; + u3 = u * uu; + + S = F->Components; + S1 = S + F->Nb_Simi; + S2 = S1 + F->Nb_Simi; + S3 = S2 + F->Nb_Simi; + S4 = S3 + F->Nb_Simi; + + for (i = F->Nb_Simi; i; --i, S++, S1++, S2++, S3++, S4++) { + S->c_x = u0 * S1->c_x + u1 * S2->c_x + u2 * S3->c_x + u3 * S4->c_x; + S->c_y = u0 * S1->c_y + u1 * S2->c_y + u2 * S3->c_y + u3 * S4->c_y; + S->r = u0 * S1->r + u1 * S2->r + u2 * S3->r + u3 * S4->r; + S->r2 = u0 * S1->r2 + u1 * S2->r2 + u2 * S3->r2 + u3 * S4->r2; + S->A = u0 * S1->A + u1 * S2->A + u2 * S3->A + u3 * S4->A; + S->A2 = u0 * S1->A2 + u1 * S2->A2 + u2 * S3->A2 + u3 * S4->A2; + } + + Draw_Fractal (data); + + if (F->Count >= 1000 / F->Speed) { + S = F->Components; + S1 = S + F->Nb_Simi; + S2 = S1 + F->Nb_Simi; + S3 = S2 + F->Nb_Simi; + S4 = S3 + F->Nb_Simi; + + for (i = F->Nb_Simi; i; --i, S++, S1++, S2++, S3++, S4++) { + S2->c_x = 2.0 * S4->c_x - S3->c_x; + S2->c_y = 2.0 * S4->c_y - S3->c_y; + S2->r = 2.0 * S4->r - S3->r; + S2->r2 = 2.0 * S4->r2 - S3->r2; + S2->A = 2.0 * S4->A - S3->A; + S2->A2 = 2.0 * S4->A2 - S3->A2; + + *S1 = *S4; + } + Random_Simis (goomInfo, F, F->Components + 3 * F->Nb_Simi, F->Nb_Simi); + + Random_Simis (goomInfo, F, F->Components + 4 * F->Nb_Simi, F->Nb_Simi); + + F->Count = 0; + } + else + F->Count++; + + F->Col++; + + (*nbpt) = data->Cur_Pt; + return F->Buffer2; +} + + +/***************************************************************/ + +static void release_ifs (IfsData *data) +{ + if (data->Root != NULL) { + free_ifs (data->Root); + (void) free ((void *) data->Root); + data->Root = (FRACTAL *) NULL; + } +} + +#define RAND() goom_random(goomInfo->gRandom) + +static void ifs_update (PluginInfo *goomInfo, Pixel * data, Pixel * back, int increment, IfsData *fx_data) +{ + static int couleur = 0xc0c0c0c0; + static int v[4] = { 2, 4, 3, 2 }; + static int col[4] = { 2, 4, 3, 2 }; + +#define MOD_MER 0 +#define MOD_FEU 1 +#define MOD_MERVER 2 + static int mode = MOD_MERVER; + static int justChanged = 0; + static int cycle = 0; + int cycle10; + + int nbpt; + IFSPoint *points; + int i; + + int couleursl = couleur; + int width = goomInfo->screen.width; + int height = goomInfo->screen.height; + + cycle++; + if (cycle >= 80) + cycle = 0; + + if (cycle < 40) + cycle10 = cycle / 10; + else + cycle10 = 7 - cycle / 10; + + { + unsigned char *tmp = (unsigned char *) &couleursl; + + for (i = 0; i < 4; i++) { + *tmp = (*tmp) >> cycle10; + tmp++; + } + } + + points = draw_ifs (goomInfo, &nbpt, fx_data); + nbpt--; + +#ifdef HAVE_MMX + movd_m2r (couleursl, mm1); + punpckldq_r2r (mm1, mm1); + for (i = 0; i < nbpt; i += increment) { + int x = points[i].x; + int y = points[i].y; + + if ((x < width) && (y < height) && (x > 0) && (y > 0)) { + int pos = x + (y * width); + movd_m2r (back[pos], mm0); + paddusb_r2r (mm1, mm0); + movd_r2m (mm0, data[pos]); + } + } + emms();/*__asm__ __volatile__ ("emms");*/ +#else + for (i = 0; i < nbpt; i += increment) { + int x = (int) points[i].x & 0x7fffffff; + int y = (int) points[i].y & 0x7fffffff; + + if ((x < width) && (y < height)) { + int pos = x + (int) (y * width); + int tra = 0, i = 0; + unsigned char *bra = (unsigned char *) &back[pos]; + unsigned char *dra = (unsigned char *) &data[pos]; + unsigned char *cra = (unsigned char *) &couleursl; + + for (; i < 4; i++) { + tra = *cra; + tra += *bra; + if (tra > 255) + tra = 255; + *dra = tra; + ++dra; + ++cra; + ++bra; + } + } + } +#endif /*MMX*/ + justChanged--; + + col[ALPHA] = couleur >> (ALPHA * 8) & 0xff; + col[BLEU] = couleur >> (BLEU * 8) & 0xff; + col[VERT] = couleur >> (VERT * 8) & 0xff; + col[ROUGE] = couleur >> (ROUGE * 8) & 0xff; + + if (mode == MOD_MER) { + col[BLEU] += v[BLEU]; + if (col[BLEU] > 255) { + col[BLEU] = 255; + v[BLEU] = -(RAND() % 4) - 1; + } + if (col[BLEU] < 32) { + col[BLEU] = 32; + v[BLEU] = (RAND() % 4) + 1; + } + + col[VERT] += v[VERT]; + if (col[VERT] > 200) { + col[VERT] = 200; + v[VERT] = -(RAND() % 3) - 2; + } + if (col[VERT] > col[BLEU]) { + col[VERT] = col[BLEU]; + v[VERT] = v[BLEU]; + } + if (col[VERT] < 32) { + col[VERT] = 32; + v[VERT] = (RAND() % 3) + 2; + } + + col[ROUGE] += v[ROUGE]; + if (col[ROUGE] > 64) { + col[ROUGE] = 64; + v[ROUGE] = -(RAND () % 4) - 1; + } + if (col[ROUGE] < 0) { + col[ROUGE] = 0; + v[ROUGE] = (RAND () % 4) + 1; + } + + col[ALPHA] += v[ALPHA]; + if (col[ALPHA] > 0) { + col[ALPHA] = 0; + v[ALPHA] = -(RAND () % 4) - 1; + } + if (col[ALPHA] < 0) { + col[ALPHA] = 0; + v[ALPHA] = (RAND () % 4) + 1; + } + + if (((col[VERT] > 32) && (col[ROUGE] < col[VERT] + 40) + && (col[VERT] < col[ROUGE] + 20) && (col[BLEU] < 64) + && (RAND () % 20 == 0)) && (justChanged < 0)) { + mode = RAND () % 3 ? MOD_FEU : MOD_MERVER; + justChanged = 250; + } + } + else if (mode == MOD_MERVER) { + col[BLEU] += v[BLEU]; + if (col[BLEU] > 128) { + col[BLEU] = 128; + v[BLEU] = -(RAND () % 4) - 1; + } + if (col[BLEU] < 16) { + col[BLEU] = 16; + v[BLEU] = (RAND () % 4) + 1; + } + + col[VERT] += v[VERT]; + if (col[VERT] > 200) { + col[VERT] = 200; + v[VERT] = -(RAND () % 3) - 2; + } + if (col[VERT] > col[ALPHA]) { + col[VERT] = col[ALPHA]; + v[VERT] = v[ALPHA]; + } + if (col[VERT] < 32) { + col[VERT] = 32; + v[VERT] = (RAND () % 3) + 2; + } + + col[ROUGE] += v[ROUGE]; + if (col[ROUGE] > 128) { + col[ROUGE] = 128; + v[ROUGE] = -(RAND () % 4) - 1; + } + if (col[ROUGE] < 0) { + col[ROUGE] = 0; + v[ROUGE] = (RAND () % 4) + 1; + } + + col[ALPHA] += v[ALPHA]; + if (col[ALPHA] > 255) { + col[ALPHA] = 255; + v[ALPHA] = -(RAND () % 4) - 1; + } + if (col[ALPHA] < 0) { + col[ALPHA] = 0; + v[ALPHA] = (RAND () % 4) + 1; + } + + if (((col[VERT] > 32) && (col[ROUGE] < col[VERT] + 40) + && (col[VERT] < col[ROUGE] + 20) && (col[BLEU] < 64) + && (RAND () % 20 == 0)) && (justChanged < 0)) { + mode = RAND () % 3 ? MOD_FEU : MOD_MER; + justChanged = 250; + } + } + else if (mode == MOD_FEU) { + + col[BLEU] += v[BLEU]; + if (col[BLEU] > 64) { + col[BLEU] = 64; + v[BLEU] = -(RAND () % 4) - 1; + } + if (col[BLEU] < 0) { + col[BLEU] = 0; + v[BLEU] = (RAND () % 4) + 1; + } + + col[VERT] += v[VERT]; + if (col[VERT] > 200) { + col[VERT] = 200; + v[VERT] = -(RAND () % 3) - 2; + } + if (col[VERT] > col[ROUGE] + 20) { + col[VERT] = col[ROUGE] + 20; + v[VERT] = -(RAND () % 3) - 2; + v[ROUGE] = (RAND () % 4) + 1; + v[BLEU] = (RAND () % 4) + 1; + } + if (col[VERT] < 0) { + col[VERT] = 0; + v[VERT] = (RAND () % 3) + 2; + } + + col[ROUGE] += v[ROUGE]; + if (col[ROUGE] > 255) { + col[ROUGE] = 255; + v[ROUGE] = -(RAND () % 4) - 1; + } + if (col[ROUGE] > col[VERT] + 40) { + col[ROUGE] = col[VERT] + 40; + v[ROUGE] = -(RAND () % 4) - 1; + } + if (col[ROUGE] < 0) { + col[ROUGE] = 0; + v[ROUGE] = (RAND () % 4) + 1; + } + + col[ALPHA] += v[ALPHA]; + if (col[ALPHA] > 0) { + col[ALPHA] = 0; + v[ALPHA] = -(RAND () % 4) - 1; + } + if (col[ALPHA] < 0) { + col[ALPHA] = 0; + v[ALPHA] = (RAND () % 4) + 1; + } + + if (((col[ROUGE] < 64) && (col[VERT] > 32) && (col[VERT] < col[BLEU]) + && (col[BLEU] > 32) + && (RAND () % 20 == 0)) && (justChanged < 0)) { + mode = RAND () % 2 ? MOD_MER : MOD_MERVER; + justChanged = 250; + } + } + + couleur = (col[ALPHA] << (ALPHA * 8)) + | (col[BLEU] << (BLEU * 8)) + | (col[VERT] << (VERT * 8)) + | (col[ROUGE] << (ROUGE * 8)); +} + +/** VISUAL_FX WRAPPER FOR IFS */ + +static void ifs_vfx_apply(VisualFX *_this, Pixel *src, Pixel *dest, PluginInfo *goomInfo) { + + IfsData *data = (IfsData*)_this->fx_data; + if (!data->initalized) { + data->initalized = 1; + init_ifs(goomInfo, data); + } + ifs_update (goomInfo, dest, src, goomInfo->update.ifs_incr, data); + /*TODO: trouver meilleur soluce pour increment (mettre le code de gestion de l'ifs dans ce fichier: ifs_vfx_apply) */ +} + +static void ifs_vfx_init(VisualFX *_this, PluginInfo *info) { + + IfsData *data = (IfsData*)malloc(sizeof(IfsData)); + data->Root = (FRACTAL*)NULL; + data->initalized = 0; + _this->fx_data = data; +} + +static void ifs_vfx_free(VisualFX *_this) { + IfsData *data = (IfsData*)_this->fx_data; + release_ifs(data); + free(data); +} + +VisualFX ifs_visualfx_create(void) { + VisualFX vfx; + vfx.init = ifs_vfx_init; + vfx.free = ifs_vfx_free; + vfx.apply = ifs_vfx_apply; + return vfx; +} diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/ifs.h kodi-visualization-goom-2.1.0/lib/goom/src/ifs.h --- kodi-visualization-goom-1.1.0/lib/goom/src/ifs.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/ifs.h 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,27 @@ +/* + * File created 11 april 2002 by JeKo + */ + +#ifndef IFS_H +#define IFS_H + +#include "goom_config.h" +#include "goom_graphic.h" +#include "goom_plugin_info.h" +#include "goom_visual_fx.h" + +VisualFX ifs_visualfx_create(void); + +/* init ifs for a (width)x(height) output. * / +void init_ifs (PluginInfo *goomInfo, int width, int height); + +/ * draw an ifs on the buffer (which size is width * height) + increment means that we draw 1/increment of the ifs's points * / +void ifs_update (PluginInfo *goomInfo, Pixel * buffer, Pixel * back, int width, int height, int increment); + +/ * free all ifs's data. * / +void release_ifs (void); +*/ + + +#endif diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/jitc_test.c kodi-visualization-goom-2.1.0/lib/goom/src/jitc_test.c --- kodi-visualization-goom-1.1.0/lib/goom/src/jitc_test.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/jitc_test.c 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,38 @@ +#include "jitc_x86.h" +#include + +int main(int c, char **v) +{ + int i; + int j; + JitcX86Env *jitc = jitc_x86_env_new(0xffff); + JitcFunc func = jitc_prepare_func(jitc); + + jitc_add(jitc, "mov edx, $d", 0xffffffff); + jitc_add(jitc, "mov eax, $d", 40); + jitc_add(jitc, "mov ebx, $d", 2); + jitc_add(jitc, "idiv ebx"); + jitc_add(jitc, "mov eax, [$d]", 0xdeadbeaf); + + jitc_add(jitc, "sal edx, $d", 7); + jitc_add(jitc, "imul ecx"); + jitc_add(jitc, "idiv ecx"); + jitc_add(jitc, "imul $d[ecx]", 2); + jitc_add(jitc, "imul ecx, [ecx]"); + jitc_add(jitc, "mov ecx, $d", (char*)(&i)-12); + jitc_add(jitc, "dec $d[ecx]", 2); + jitc_add(jitc, "add ecx, $d", 12); + jitc_add(jitc, "dec [ecx]"); + jitc_add(jitc, "dec ecx"); + + JITC_FLD_pIMM32(jitc,&i); + JITC_FSTP_pIMM32(jitc,&j); + + jitc_validate_func(jitc); + func(); + + printf("i = 0x%08x\n", i); + + jitc_x86_delete(jitc); + return 0; +} diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/jitc_x86.c kodi-visualization-goom-2.1.0/lib/goom/src/jitc_x86.c --- kodi-visualization-goom-1.1.0/lib/goom/src/jitc_x86.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/jitc_x86.c 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,530 @@ +#include "jitc_x86.h" + +#include +#include +#include + +#define PARAM_INT 1 +#define PARAM_FLOAT 2 +#define PARAM_REG 3 +#define PARAM_dispREG 4 +#define PARAM_DISP32 5 +#define PARAM_LABEL 6 +#define PARAM_NONE 666 + +typedef struct { + int id; + int i; + double f; + int reg; + int disp; + char label[256]; +} IParam; + +struct { + char *name; + int reg; +} RegsName[] = { + {"eax",EAX}, {"ebx",EBX}, {"ecx",ECX}, {"edx",EDX}, + {"edi",EDI}, {"esi",ESI}, {"ebp",EBP}, {"esp",ESP}, + {"st0",0}, {"st1",1}, {"st2",2}, {"st3",3}, + {"st4",4}, {"st5",5}, {"st6",6}, {"st7",7}, + {"mm0",0}, {"mm1",1}, {"mm2",2}, {"mm3",3}, + {"mm4",4}, {"mm5",5}, {"mm6",6}, {"mm7",7}, {NULL,0} +}; + +void modrm(JitcX86Env *jitc, int opcode, IParam *iparam) +{ + int dest = 0; + int src = 1; + int direction = 0x0; + unsigned int byte = 666; + unsigned int int32 = 0; + unsigned int need32 = 0; + + if ((iparam[0].id == PARAM_REG) && (iparam[1].id != PARAM_REG)) { + dest = 1; + src = 0; + direction = 0x02; + } + + if (iparam[src].id != PARAM_REG) { + fprintf(stderr, "JITC_x86: Invalid Instruction Parameters: %d %d.\n", iparam[0].id, iparam[1].id); + exit(1); + } + + if (iparam[dest].id == PARAM_REG) { + byte = ((int)JITC_MOD_REG_REG << 6) | (iparam[src].reg << 3) | (iparam[0].reg); + } + + else if (iparam[dest].id == PARAM_dispREG) + { + if (iparam[dest].disp == 0) + byte = ((int)JITC_MOD_pREG_REG << 6) | (iparam[src].reg << 3) | (iparam[dest].reg); + } + + else if (iparam[dest].id == PARAM_DISP32) + { + byte = ((int)JITC_MOD_pREG_REG << 6) | (iparam[src].reg << 3) | JITC_RM_DISP32; + need32 = 1; + int32 = iparam[dest].disp; + } + + if (byte == 666) { + fprintf(stderr, "JITC_x86: Invalid Instruction Parameters: %d %d.\n", iparam[0].id, iparam[1].id); + exit(1); + } + else { + if (opcode < 0x100) + JITC_ADD_UCHAR(jitc, opcode + direction); + else { + JITC_ADD_UCHAR(jitc, (opcode>>8)&0xff); + JITC_ADD_UCHAR(jitc, (opcode&0xff)/* + direction*/); + } + JITC_ADD_UCHAR(jitc, byte); + if (need32) + JITC_ADD_UINT(jitc, int32); + } +} + +static void imul_like_modrm_1param(JitcX86Env *jitc, int opcode, int digit, IParam *iparam) +{ + if (iparam[0].id == PARAM_REG) + { + JITC_ADD_UCHAR(jitc, opcode); + JITC_MODRM(jitc, 0x03, digit, iparam[0].reg); + return; + } + if (iparam[0].id == PARAM_dispREG) { + JITC_ADD_UCHAR(jitc, opcode); + if (iparam[0].disp == 0) + { + JITC_MODRM(jitc, 0x00, digit, iparam[0].reg); + } + else if ((iparam[0].disp & 0xff) == iparam[0].disp) + { + JITC_MODRM(jitc, 0x01, digit, iparam[0].reg); + JITC_ADD_UCHAR(jitc, iparam[0].disp); + } + else + { + JITC_MODRM(jitc, 0x02, digit, iparam[0].reg); + JITC_ADD_UINT(jitc, iparam[0].disp); + } + return; + } + if (iparam[0].id == PARAM_DISP32) { + JITC_ADD_UCHAR(jitc, opcode); + JITC_MODRM(jitc, JITC_MOD_pREG_REG, digit, JITC_RM_DISP32); + JITC_ADD_UINT(jitc, iparam[0].disp); + return; + } +} + +/* 1 byte encoded opcode including register... imm32 parameter */ +#define INSTR_1bReg_IMM32(opcode,dest,src) { \ + JITC_ADD_UCHAR(jitc, opcode + iparam[dest].reg); \ + JITC_ADD_UINT (jitc, (int)iparam[src].i); } + +typedef struct { + char *name; + int opcode; + int opcode_reg_int; + int digit_reg_int; + int opcode_eax_int; +} AddLikeInstr; + +static AddLikeInstr addLike[] = { + { "add", 0x01, 0x81, 0x00, 0x05 }, + { "and", 0x21, 0x81, 0x04, 0x25 }, + { "or", 0x0B, 0x81, 0x01, 0x0D }, + { "cmp", 0x39, 0x81, 0x07, 0x3D }, + { "imul", 0x0FAF, 0x69, 0x00, 0x10000 }, + { "sub", 0x29, 0x81, 0x05, 0X2D }, + { NULL, -1, -1, -1, -1 } +}; + +int checkAddLike(JitcX86Env *jitc, char *op, IParam *iparam, int nbParams) +{ + int i; + for (i=0;addLike[i].name;++i) + { + if (strcmp(op,addLike[i].name) == 0) + { + if ((iparam[0].id == PARAM_REG) && (iparam[1].id == PARAM_INT)) { + if ((iparam[0].reg == EAX) && (addLike[i].opcode_eax_int != 0x10000)) { + JITC_ADD_UCHAR(jitc, addLike[i].opcode_eax_int); + JITC_ADD_UINT(jitc, iparam[1].i); + return 1; + } + else { + JITC_ADD_UCHAR(jitc, addLike[i].opcode_reg_int); + JITC_MODRM(jitc, 0x03, addLike[i].digit_reg_int, iparam[0].reg); + JITC_ADD_UINT(jitc, iparam[1].i); + return 1; + } + } + else if ((iparam[0].id == PARAM_dispREG) && (iparam[1].id == PARAM_INT)) { + JITC_ADD_UCHAR(jitc, addLike[i].opcode_reg_int); + if ((iparam[0].disp & 0xff) == iparam[0].disp) + { + JITC_MODRM(jitc, 0x01, addLike[i].digit_reg_int, iparam[0].reg); + JITC_ADD_UCHAR(jitc, iparam[0].disp); + } + else + { + JITC_MODRM(jitc, 0x00, addLike[i].digit_reg_int, iparam[0].reg); + JITC_ADD_UINT(jitc, iparam[0].disp); + } + JITC_ADD_UINT(jitc, iparam[1].i); + return 1; + } + else if ((iparam[0].id == PARAM_DISP32) && (iparam[1].id == PARAM_INT)) { + JITC_ADD_UCHAR(jitc, addLike[i].opcode_reg_int); + JITC_MODRM(jitc, 0x00, addLike[i].digit_reg_int, 0x05); + JITC_ADD_UINT(jitc, iparam[0].disp); + JITC_ADD_UINT(jitc, iparam[1].i); + return 1; + } + else { + modrm(jitc, addLike[i].opcode, iparam); + return 1; + } + } + } + return 0; +} + +/** + * Check all kind of known instruction... perform special optimisations.. + */ +static void jitc_add_op(JitcX86Env *jitc, char *op, IParam *iparam, int nbParams) +{ + /* MOV */ + if (strcmp(op,"mov") == 0) + { + if ((iparam[0].id == PARAM_REG) && (iparam[1].id == PARAM_INT)) { + INSTR_1bReg_IMM32(0xb8,0,1); + } + else if ((iparam[0].id == PARAM_DISP32) && (iparam[1].id == PARAM_INT)) { + JITC_ADD_UCHAR(jitc, 0xc7); + JITC_MODRM(jitc, 0x00, 0x00, 0x05); + JITC_ADD_UINT(jitc, iparam[0].disp); + JITC_ADD_UINT(jitc, iparam[1].i); + } + else + modrm(jitc, 0x89, iparam); + return; + } + +#define IMUL_LIKE(_OP,_opcode,_digit)\ + if (strcmp(op, _OP) == 0) { \ + if (nbParams == 1) { \ + imul_like_modrm_1param(jitc, _opcode, _digit, iparam); \ + return; }} + +#define SHIFT_LIKE(_name,_op1,_op2,_digit) \ + if (strcmp(op, _name) == 0) { \ + if (iparam[1].id == PARAM_INT) { \ + if (iparam[1].i == 1) \ + imul_like_modrm_1param(jitc, _op1, _digit, iparam); \ + else { \ + imul_like_modrm_1param(jitc, _op2, _digit, iparam); \ + JITC_ADD_UCHAR(jitc, iparam[1].i); \ + } \ + return; \ + } \ + } + +#define POP_LIKE(_OP,_opcode) \ + if (strcmp(op, _OP) == 0) { \ + if (iparam[0].id == PARAM_REG) { \ + JITC_ADD_UCHAR(jitc, _opcode + iparam[0].reg); \ + return; } } + + IMUL_LIKE("neg", 0xf7, 0x03); + IMUL_LIKE("imul", 0xf7, 0x05); + IMUL_LIKE("idiv", 0xf7, 0x07); + + POP_LIKE("pop", 0x58); + POP_LIKE("push", 0x50); + + SHIFT_LIKE("sal", 0xd1, 0xc1, 0x04); + SHIFT_LIKE("sar", 0xd1, 0xc1, 0x07); + SHIFT_LIKE("shl", 0xd1, 0xc1, 0x04); + SHIFT_LIKE("shr", 0xd1, 0xc1, 0x05); + + /* INC */ + if (strcmp(op, "inc") == 0) { + if (iparam[0].id == PARAM_REG) { + JITC_ADD_UCHAR(jitc, 0x40 + iparam[0].reg); + return; + } + imul_like_modrm_1param(jitc, 0xff, 0x00, iparam); + return; + } + + /* DEC */ + if (strcmp(op, "dec") == 0) { + if (iparam[0].id == PARAM_REG) { + JITC_ADD_UCHAR(jitc, 0x48 + iparam[0].reg); + return; + } + imul_like_modrm_1param(jitc, 0xff, 0x01, iparam); + return; + } + + if (strcmp(op, "call") == 0) + { + if (iparam[0].id == PARAM_LABEL) { + jitc_add_used_label(jitc,iparam[0].label,jitc->used+1); + JITC_CALL(jitc,0); + return; + } + if (iparam[0].id == PARAM_INT) { + JITC_CALL(jitc,iparam[0].i); + return; + } + if (iparam[0].id == PARAM_dispREG) { + JITC_ADD_UCHAR(jitc,0xff); + JITC_ADD_UCHAR(jitc,0xd0+iparam[0].reg); + return; + } + } + +#define MONOBYTE_INSTR(_OP,_opcode) \ + if (strcmp(op, _OP) == 0) { \ + JITC_ADD_UCHAR(jitc, _opcode); \ + return; } + + MONOBYTE_INSTR("ret", 0xc3); + MONOBYTE_INSTR("leave", 0xc9); + MONOBYTE_INSTR("cdq", 0x99); + + /* JNE */ + if (strcmp(op, "jne") == 0) { + if (iparam[0].id == PARAM_LABEL) { + JITC_JUMP_COND_LABEL(jitc,COND_NOT_EQUAL,iparam[0].label); + return; + } + if (iparam[0].id == PARAM_INT) { + JITC_JUMP_COND(jitc,COND_NOT_EQUAL,iparam[0].i); + return; + } + } + + /* JE */ + if (strcmp(op, "je") == 0) { + if (iparam[0].id == PARAM_LABEL) { + JITC_JUMP_COND_LABEL(jitc,COND_EQUAL,iparam[0].label); + return; + } + if (iparam[0].id == PARAM_INT) { + JITC_JUMP_COND(jitc,COND_EQUAL,iparam[0].i); + return; + } + } + + /* ADD LIKE */ + if (checkAddLike(jitc, op, iparam, nbParams)) return; + + /* BSWAP : 0F C8+rd */ + + fprintf(stderr, "JITC_x86: Invalid Operation '%s'\n", op); + exit(1); +} + +/** + * Adds a new instruction to the just in time compiled function + */ +void jitc_add(JitcX86Env *jitc, const char *_instr, ...) +{ + char instr[256]; + char *op; + char *sparam[16]; int nbParam=0; int i; + IParam iparam[16]; + va_list ap; + strcpy(instr,_instr); + +#ifdef DISPLAY_GENCODE + printf("|"); +#endif + + op = strtok(instr, " ,"); + if (!op) return; + + /* decoupage en tokens */ + while ((sparam[nbParam] = strtok(NULL, " ,")) != NULL) if (strlen(sparam[nbParam])>0) nbParam++; + + /* Reconnaissance des parametres */ + va_start(ap, _instr); + for (i=0;i 0) { + if (strcmp(regname, RegsName[r].name) == 0) { + iparam[i].id = PARAM_dispREG; + iparam[i].reg = RegsName[r].reg; + iparam[i].disp = va_arg(ap, int); + } + } + if (sscanf(sparam[i], "[%3s]", regname) > 0) { + if (strcmp(regname, RegsName[r].name) == 0) { + iparam[i].id = PARAM_dispREG; + iparam[i].reg = RegsName[r].reg; + iparam[i].disp = 0; + } + } + } + } + if (iparam[i].id == PARAM_NONE) { + fprintf(stderr, "JITC_x86: Unrecognized parameter '%s'\n", sparam[i]); + exit(1); + } + } + va_end(ap); + + jitc_add_op(jitc, op, &(iparam[0]), nbParam); +#ifdef DISPLAY_GENCODE + printf(" ;;; %s", op); + for (i=0;i_memory = (unsigned char*)malloc(memory_size); + jitc->used = 0; + jitc->memory = (unsigned char*)((int)jitc->_memory + (32-((int)jitc->_memory)%32)%32); + + jitc->nbUsedLabel = 0; + jitc->nbKnownLabel = 0; + + jitc->usedLabel = (LabelAddr*)malloc(sizeof(LabelAddr) * JITC_MAXLABEL); + jitc->knownLabel = (LabelAddr*)malloc(sizeof(LabelAddr) * JITC_MAXLABEL); + + return jitc; +} + +void jitc_x86_delete(JitcX86Env *jitc) { + + free(jitc->usedLabel); + free(jitc->knownLabel); + free(jitc->_memory); + free(jitc); +} + +JitcFunc jitc_prepare_func(JitcX86Env *jitc) { + + JitcFunc ptr = 0; + jitc->used = (32 - jitc->used%32)%32; + ptr = (JitcFunc)&(jitc->memory[jitc->used]); + +#ifdef DISPLAY_GENCODE + printf("\n------------------------------------------\n"); + printf("-- Function Intro --\n"); + printf("------------------------------------------\n"); +#endif + + /* save the state */ + jitc_add(jitc,"push ebp"); + jitc_add(jitc,"mov ebp, esp"); + jitc_add(jitc,"sub esp, $d", 8); + JITC_PUSH_ALL(jitc); +#ifdef DISPLAY_GENCODE + printf("\n------------------------------------------\n"); +#endif + return ptr; +} + +void jitc_validate_func(JitcX86Env *jitc) { + +#ifdef DISPLAY_GENCODE + printf("\n------------------------------------------\n"); + printf("-- Function Outro --\n"); + printf("------------------------------------------\n"); +#endif + /* restore the state */ + JITC_POP_ALL(jitc); + jitc_add(jitc, "leave"); + jitc_add(jitc, "ret"); + jitc_resolve_labels(jitc); +#ifdef DISPLAY_GENCODE + printf("\n------------------------------------------\n"); +#endif +} + +void jitc_add_used_label(JitcX86Env *jitc, char *label, int where) { + + strncpy(jitc->usedLabel[jitc->nbUsedLabel].label, label, JITC_LABEL_SIZE); + jitc->usedLabel[jitc->nbUsedLabel].address = where; + jitc->nbUsedLabel++; +} + +void jitc_add_known_label(JitcX86Env *jitc, char *label, int where) { + +#ifdef DISPLAY_GENCODE + printf("%s:\n", label); +#endif + strncpy(jitc->knownLabel[jitc->nbKnownLabel].label, label, JITC_LABEL_SIZE); + jitc->knownLabel[jitc->nbKnownLabel].address = where; + jitc->nbKnownLabel++; +} + +void jitc_resolve_labels(JitcX86Env *jitc) { + + int i,j; + for (i=jitc->nbUsedLabel;i-->0;) { + + LabelAddr used = jitc->usedLabel[i]; + for (j=jitc->nbKnownLabel;j-->0;) { + + LabelAddr known = jitc->knownLabel[j]; + if (strcmp(known.label, used.label) == 0) { + int *offset = (int*)&(jitc->memory[used.address]); + *offset = known.address - used.address - 4; /* always using long offset */ + break; + } + } + } + jitc->nbUsedLabel = jitc->nbKnownLabel = 0; +} diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/jitc_x86.h kodi-visualization-goom-2.1.0/lib/goom/src/jitc_x86.h --- kodi-visualization-goom-1.1.0/lib/goom/src/jitc_x86.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/jitc_x86.h 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,214 @@ +/** + * Copyright (c)2004 Jean-Christophe Hoelt + */ + +#include +#include + +#define JITC_MAXLABEL 1024 +#define JITC_LABEL_SIZE 64 + +/** + * low level macros + */ + + /* {{{ Registres Generaux */ +#define EAX 0 +#define ECX 1 +#define EDX 2 +#define EBX 3 +#define ESP 4 +#define EBP 5 +#define ESI 6 +#define EDI 7 + /* }}} */ + /* {{{ Registres MMX */ +#define MM0 0 +#define MM1 1 +#define MM2 2 +#define MM3 3 +#define MM4 4 +#define MM5 5 +#define MM6 6 +#define MM7 7 + /* }}} */ + /* {{{ Registres SSE*/ +#define XMM0 0 +#define XMM1 1 +#define XMM2 2 +#define XMM3 3 +#define XMM4 4 +#define XMM5 5 +#define XMM6 6 +#define XMM7 7 + /* }}} */ + /* {{{ Alias aux registres */ +#define R0 0 +#define R1 1 +#define R2 2 +#define R3 3 +#define R4 4 +#define R5 5 +#define R6 6 +#define R7 7 + /* }}} */ + + /* {{{ Conditions */ +#define COND_OVERFLOW 0 +#define COND_NO_OVERFLOW 1 +#define COND_BELOW 2 +#define COND_NOT_BELOW 3 +#define COND_EQUAL 4 +#define COND_ZERO 4 +#define COND_NOT_EQUAL 5 +#define COND_NOT_ZERO 5 +#define COND_NOT_ABOVE 6 +#define COND_ABOVE 7 +#define COND_SIGN 8 +#define COND_NOT_SIGN 9 +#define COND_EVEN 10 +#define COND_ODD 11 +#define COND_LESS_THAN 12 +#define COND_GREATER_EQUAL 13 +#define COND_LESS_EQUAL 14 +#define COND_GREATER_THAN 15 + /* }}} */ + +typedef int (*JitcFunc)(void); + +typedef struct _LABEL_ADDR { + char label[JITC_LABEL_SIZE]; + int address; +} LabelAddr; + +typedef struct _JITC_X86_ENV { + unsigned char *_memory; + unsigned char *memory; + unsigned int used; + + int nbUsedLabel; + int nbKnownLabel; + LabelAddr *usedLabel; + LabelAddr *knownLabel; +} JitcX86Env; + +#define DISPLAY_GENCODE +/*#define DISPLAY_GENCODE_HEXA*/ + +#ifdef DISPLAY_GENCODE_HEXA + #define JITC_ADD_UCHAR(jitc,op) printf(" 0x%02x", op) && (jitc->memory[jitc->used++]=op) +#else + #define JITC_ADD_UCHAR(jitc,op) (jitc->memory[jitc->used++]=op) +#endif + +#define JITC_ADD_USHORT(jitc,i) { JITC_ADD_UCHAR(jitc,i&0xff); JITC_ADD_UCHAR(jitc,(i>>8)&0xff); } +#define JITC_ADD_UINT(jitc,i) { \ + JITC_ADD_UCHAR(jitc,i&0xff); \ + JITC_ADD_UCHAR(jitc,(i>>8)&0xff); \ + JITC_ADD_UCHAR(jitc,(i>>16)&0xff); \ + JITC_ADD_UCHAR(jitc,(i>>24)&0xff); \ +} +#define JITC_ADD_2UCHAR(jitc,op1,op2) {JITC_ADD_UCHAR(jitc,op1); JITC_ADD_UCHAR(jitc,op2);} + +#define JITC_MODRM(jitc,mod,reg,rm) { JITC_ADD_UCHAR(jitc,((int)mod<<6)|((int)reg<<3)|((int)rm)); } + +/* special values for R/M */ +#define JITC_RM_DISP32 0x05 + +#define JITC_MOD_pREG_REG 0x00 +#define JITC_MOD_disp8REG_REG 0x01 +#define JITC_MOD_disp32REG_REG 0x02 +#define JITC_MOD_REG_REG 0x03 +/* cf 24319101 p.27 */ + +#define JITC_OP_REG_REG(jitc,op,dest,src) { JITC_ADD_UCHAR(jitc,op); JITC_ADD_UCHAR(jitc,0xc0+(src<<3)+dest); } +#define JITC_OP_REG_pREG(jitc,op,dest,src) { JITC_ADD_UCHAR(jitc,op); JITC_ADD_UCHAR(jitc,(dest<<3)+src); } +#define JITC_OP_pREG_REG(jitc,op,dest,src) { JITC_ADD_UCHAR(jitc,op); JITC_ADD_UCHAR(jitc,(src<<3)+dest); } + +/** + * "high" level macro + */ + +#define JITC_LOAD_REG_IMM32(jitc,reg,imm32) { JITC_ADD_UCHAR (jitc,0xb8+reg); JITC_ADD_UINT(jitc,(int)(imm32)); } +#define JITC_LOAD_REG_REG(jitc,dest,src) { JITC_OP_REG_REG (jitc,0x89,dest,src); } + +#define JITC_LOAD_REG_pREG(jitc,dest,src) { JITC_OP_REG_pREG(jitc,0x8b,dest,src); } +#define JITC_LOAD_pREG_REG(jitc,dest,src) { JITC_OP_pREG_REG(jitc,0x89,dest,src); } + +#define JITC_DEC_REG(jitc,reg) { JITC_ADD_UCHAR (jitc,0x48+reg); } +#define JITC_INC_REG(jitc,reg) { JITC_ADD_UCHAR (jitc,0x40+reg); } + +#define JITC_ADD_REG_REG(jitc,dest,src) { JITC_OP_REG_REG (jitc,0x01,dest,src); } +#define JITC_ADD_REG_IMM32(jitc,reg,imm32) { JITC_ADD_UCHAR (jitc,0x81);\ + JITC_ADD_UCHAR (jitc,0xc0+reg);\ + JITC_ADD_UINT (jitc,(int)imm32); } + +#define JITC_AND_REG_REG(jitc,dest,src) { JITC_OP_REG_REG (jitc,0x21,dest,src); } +#define JITC_CMP_REG_REG(jitc,dest,src) { JITC_OP_REG_REG (jitc,0x39,dest,src); } +#define JITC_CMP_REG_IMM32(jitc,reg,imm32) { JITC_ADD_2UCHAR (jitc,0x81,0xf8+reg); \ + JITC_ADD_UINT (jitc,(int)imm32); } + +#define JITC_IDIV_EAX_REG(jitc,reg) { JITC_ADD_2UCHAR(jitc, 0xf7, 0xf8+reg); } +#define JITC_IMUL_EAX_REG(jitc,reg) { JITC_ADD_2UCHAR(jitc, 0xf7, 0xe8+reg); } + +/*#define JITC_SUB_REG_REG(jitc,dest,src) { JITC_OP_REG_REG (jitc,0x29,dest,src); } +#define JITC_SUB_EAX_IMM32(jitc,imm32) { JITC_ADD_UCHAR (jitc,0x2d); JITC_ADD_UINT(jitc,(int)imm32); } +#define JITC_SUB_REG_IMM32(jitc,reg,imm32) { JITC_ADD_2UCHAR (jitc,0x81, 0xe8+reg);\ + JITC_ADD_UINT (jitc,(int)imm32); }*/ +#define JITC_SUB_REG_IMM8(jitc,reg,imm8) { JITC_ADD_2UCHAR (jitc,0x83, 0xe8+reg);\ + JITC_ADD_UCHAR(jitc,imm8); } + +/* Floating points */ + +#define JITC_FLD_pIMM32(jitc,address) { JITC_ADD_UCHAR (jitc, 0xD9); \ + JITC_MODRM (jitc, 0x00, 0x00,JITC_RM_DISP32); \ + JITC_ADD_UINT(jitc,(int)(address)); } +#define JITC_FLD_STi(jict,reg) { JITC_ADD_2UCHAR (jitc, 0xD9, 0xC0+reg); } + +#define JITC_FST_pIMM32(jitc,address) { JITC_ADD_UCHAR (jitc, 0xD9); \ + JITC_MODRM (jitc, 0x00, 0x02,JITC_RM_DISP32); \ + JITC_ADD_UINT(jitc,(int)(ADDRess)); } +#define JITC_FST_STi(jict,reg) { JITC_ADD_2UCHAR (jitc, 0xDD, 0xD0+reg); } + +#define JITC_FSTP_pIMM32(jitc,address) { JITC_ADD_UCHAR (jitc, 0xD9); \ + JITC_MODRM (jitc, 0x00, 0x03, JITC_RM_DISP32); \ + JITC_ADD_UINT(jitc,(int)(address)); } +#define JITC_FSTP_STi(jict,reg) { JITC_ADD_2UCHAR (jitc, 0xDD, 0xD8+reg); } + +#define JITC_FADD + +/* Jumps */ + +#define JITC_ADD_LABEL(jitc,label) { jitc_add_known_label(jitc,label,jitc->used); } + +#define JITC_JUMP(jitc,offset) { JITC_ADD_UCHAR(jitc,0xe9); JITC_ADD_UINT(jitc,offset); } +#define JITC_JUMP_LABEL(jitc,label) { jitc_add_used_label(jitc,label,jitc->used+1); JITC_JUMP(jitc,0); } +#define JITC_JUMP_COND(jitc,cond,offset) { JITC_ADD_UCHAR(jitc,0x0f);\ + JITC_ADD_UCHAR(jitc,0x80+cond);\ + JITC_ADD_UINT(jitc,offset); } +#define JITC_JUMP_COND_LABEL(jitc,cond,label) { jitc_add_used_label(jitc,label,jitc->used+2); JITC_JUMP_COND(jitc,cond,0); } +#define JITC_CALL(jitc,function) { int __offset__ = (int)function - (int)(&jitc->memory[jitc->used+5]);\ + JITC_ADD_UCHAR(jitc,0xe8); JITC_ADD_UINT(jitc,__offset__); } +/*#define JITC_CALL_pREG(jitc,reg) { JITC_ADD_UCHAR(jitc,0xff); JITC_ADD_UCHAR(jitc,0xd0+reg); } +#define JITC_CALL_LABEL(jitc,label) { jitc_add_used_label(jitc,label,jitc->used+1); JITC_CALL(jitc,0); }*/ + +/* save all registers (except EAX,ESP,EBP) */ +#define JITC_PUSH_ALL(jitc) { jitc_add(jitc,"push ecx"); jitc_add(jitc,"push edx"); jitc_add(jitc,"push ebx"); \ + jitc_add(jitc,"push esi"); jitc_add(jitc,"push edi"); } + +/* restore all registers (except EAX,ESP,EBP) */ +#define JITC_POP_ALL(jitc) { jitc_add(jitc,"pop edi"); jitc_add(jitc,"pop esi"); jitc_add(jitc,"pop ebx"); \ + jitc_add(jitc,"pop edx"); jitc_add(jitc,"pop ecx"); } + +/* public methods */ +JitcX86Env *jitc_x86_env_new(int memory_size); +JitcFunc jitc_prepare_func(JitcX86Env *jitc); +void jitc_add(JitcX86Env *jitc, const char *instr, ...); +void jitc_validate_func(JitcX86Env *jitc); +void jitc_x86_delete(JitcX86Env *jitc); + + +/* private methods */ +void jitc_add_used_label(JitcX86Env *jitc, char *label, int where); +void jitc_add_known_label(JitcX86Env *jitc, char *label, int where); +void jitc_resolve_labels(JitcX86Env *jitc); diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/lines.c kodi-visualization-goom-2.1.0/lib/goom/src/lines.c --- kodi-visualization-goom-1.1.0/lib/goom/src/lines.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/lines.c 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,249 @@ +/* + * lines.c + */ + +#include "lines.h" +#include +#include +#include +#include "goom.h" +#include "goom_tools.h" +#include "goom_plugin_info.h" +#include "drawmethods.h" + +static inline unsigned char lighten (unsigned char value, float power) +{ + int val = value; + float t = (float) val * log10(power) / 2.0; + + if (t > 0) { + val = (int) t; /* (32.0f * log (t)); */ + if (val > 255) + val = 255; + if (val < 0) + val = 0; + return val; + } + else { + return 0; + } +} + +static void lightencolor (guint32 *col, float power) +{ + unsigned char *color; + + color = (unsigned char *) col; + *color = lighten (*color, power); + color++; + *color = lighten (*color, power); + color++; + *color = lighten (*color, power); + color++; + *color = lighten (*color, power); +} + + + +static void +genline (int id, float param, GMUnitPointer * l, int rx, int ry) +{ + int i; + + switch (id) { + case GML_HLINE: + for (i = 0; i < AUDIO_SAMPLE_LEN; i++) { + l[i].x = ((float) i * rx) / (float)AUDIO_SAMPLE_LEN; + l[i].y = param; + l[i].angle = M_PI / 2.0f; + } + return; + case GML_VLINE: + for (i = 0; i < AUDIO_SAMPLE_LEN; i++) { + l[i].y = ((float) i * ry) / (float)AUDIO_SAMPLE_LEN; + l[i].x = param; + l[i].angle = 0.0f; + } + return; + case GML_CIRCLE: + for (i = 0; i < AUDIO_SAMPLE_LEN; i++) { + float cosa, sina; + + l[i].angle = 2.0f * M_PI * (float) i / (float)AUDIO_SAMPLE_LEN; + cosa = param * cos (l[i].angle); + sina = param * sin (l[i].angle); + l[i].x = ((float) rx / 2.0f) + cosa; + l[i].y = (float) ry / 2.0f + sina; + } + return; + } +} + +static guint32 getcouleur (int mode) +{ + switch (mode) { + case GML_RED: + return (230 << (ROUGE * 8)) | (120 << (VERT * 8)) | (18 << (BLEU * 8)); + case GML_ORANGE_J: + return (120 << (VERT * 8)) | (252 << (ROUGE * 8)) | (18 << (BLEU * 8)); + case GML_ORANGE_V: + return (160 << (VERT * 8)) | (236 << (ROUGE * 8)) | (40 << (BLEU * 8)); + case GML_BLEUBLANC: + return (40 << (BLEU * 8)) | (220 << (ROUGE * 8)) | (140 << (VERT * 8)); + case GML_VERT: + return (200 << (VERT * 8)) | (80 << (ROUGE * 8)) | (18 << (BLEU * 8)); + case GML_BLEU: + return (250 << (BLEU * 8)) | (30 << (VERT * 8)) | (80 << (ROUGE * 8)); + case GML_BLACK: + return (16 << (BLEU * 8)) | (16 << (VERT * 8)) | (16 << (ROUGE * 8)); + } + return 0; +} + +void +goom_lines_set_res (GMLine * gml, int rx, int ry) +{ + if (gml != NULL) { + gml->screenX = rx; + gml->screenY = ry; + + genline (gml->IDdest, gml->param, gml->points2, rx, ry); + } +} + + +static void +goom_lines_move (GMLine * l) +{ + int i; + unsigned char *c1, *c2; + + for (i = 0; i < AUDIO_SAMPLE_LEN; i++) { + l->points[i].x = (l->points2[i].x + 39.0f * l->points[i].x) / 40.0f; + l->points[i].y = (l->points2[i].y + 39.0f * l->points[i].y) / 40.0f; + l->points[i].angle = + (l->points2[i].angle + 39.0f * l->points[i].angle) / 40.0f; + } + + c1 = (unsigned char *) &l->color; + c2 = (unsigned char *) &l->color2; + for (i = 0; i < 4; i++) { + int cc1, cc2; + + cc1 = *c1; + cc2 = *c2; + *c1 = (unsigned char) ((cc1 * 63 + cc2) >> 6); + ++c1; + ++c2; + } + + l->power += l->powinc; + if (l->power < 1.1f) { + l->power = 1.1f; + l->powinc = (float) (goom_irand(l->goomInfo->gRandom,20) + 10) / 300.0f; + } + if (l->power > 17.5f) { + l->power = 17.5f; + l->powinc = -(float) (goom_irand(l->goomInfo->gRandom,20) + 10) / 300.0f; + } + + l->amplitude = (99.0f * l->amplitude + l->amplitudeF) / 100.0f; +} + +void +goom_lines_switch_to (GMLine * gml, int IDdest, + float param, float amplitude, int col) +{ + genline (IDdest, param, gml->points2, gml->screenX, gml->screenY); + gml->IDdest = IDdest; + gml->param = param; + gml->amplitudeF = amplitude; + gml->color2 = getcouleur (col); +} + +GMLine * +goom_lines_init (PluginInfo *goomInfo, int rx, int ry, + int IDsrc, float paramS, int coulS, + int IDdest, float paramD, int coulD) +{ + GMLine *l = (GMLine *) malloc (sizeof (GMLine)); + + l->goomInfo = goomInfo; + + l->points = (GMUnitPointer *) malloc (AUDIO_SAMPLE_LEN * sizeof (GMUnitPointer)); + l->points2 = (GMUnitPointer *) malloc (AUDIO_SAMPLE_LEN * sizeof (GMUnitPointer)); + l->nbPoints = AUDIO_SAMPLE_LEN; + + l->IDdest = IDdest; + l->param = paramD; + + l->amplitude = l->amplitudeF = 1.0f; + + genline (IDsrc, paramS, l->points, rx, ry); + genline (IDdest, paramD, l->points2, rx, ry); + + l->color = getcouleur (coulS); + l->color2 = getcouleur (coulD); + + l->screenX = rx; + l->screenY = ry; + + l->power = 0.0f; + l->powinc = 0.01f; + + goom_lines_switch_to (l, IDdest, paramD, 1.0f, coulD); + + return l; +} + +void +goom_lines_free (GMLine ** l) +{ + free ((*l)->points); + free ((*l)->points2); + free (*l); + l = NULL; +} + + +#define MAX_NORMALIZED_PEAK 2000.0 + +static inline float getNormalizedData(PluginInfo *goomInfo, short data) +{ + return data; // Hack, without are the lines not flushing +// return MAX_NORMALIZED_PEAK * (float)data / goomInfo->sound.allTimesMax; +} + +void goom_lines_draw (PluginInfo *goomInfo, GMLine *line, const gint16 data[AUDIO_SAMPLE_LEN], Pixel *p) +{ + if (line != NULL) { + guint32 color = line->color; + const GMUnitPointer *pt = &(line->points[0]); + + const float cosa = cos (pt->angle) / 1000.0f; + const float sina = sin (pt->angle) / 1000.0f; + + lightencolor (&color, line->power); + + const float fdata = getNormalizedData(goomInfo, data[0]); + int x1 = (int) (pt->x + cosa * line->amplitude * fdata); + int y1 = (int) (pt->y + sina * line->amplitude * fdata); + + for (int i = 1; i < AUDIO_SAMPLE_LEN; i++) { + const GMUnitPointer *pt = &(line->points[i]); + + const float cosa = cos (pt->angle) / 1000.0f; + const float sina = sin (pt->angle) / 1000.0f; + + const float fdata = getNormalizedData(goomInfo, data[i]); + const int x2 = (int) (pt->x + cosa * line->amplitude * fdata); + const int y2 = (int) (pt->y + sina * line->amplitude * fdata); + + goomInfo->methods.draw_line (p, x1, y1, x2, y2, color, line->screenX, line->screenY); + + x1 = x2; + y1 = y2; + } + goom_lines_move (line); + } +} diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/lines.h kodi-visualization-goom-2.1.0/lib/goom/src/lines.h --- kodi-visualization-goom-1.1.0/lib/goom/src/lines.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/lines.h 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,80 @@ +#ifndef _LINES_H +#define _LINES_H + +/* + * lines.h + * Goom + * Copyright (c) 2000-2003 iOS-software. All rights reserved. + */ + +#include "goom.h" +#include "goom_typedefs.h" +#include "goom_graphic.h" +#include "goom_config.h" + +struct _GMUNITPOINTER +{ + float x; + float y; + float angle; +}; + +/* tableau de points */ +struct _GMLINE +{ + + GMUnitPointer *points; + GMUnitPointer *points2; + int IDdest; + float param; + float amplitudeF; + float amplitude; + + int nbPoints; + guint32 color; /* pour l'instant je stocke la couleur a terme, on stockera le mode couleur et l'on animera */ + guint32 color2; + + int screenX; + int screenY; + + float power; + float powinc; + + PluginInfo *goomInfo; +}; + +/* les ID possibles */ + +#define GML_CIRCLE 0 +/* (param = radius) */ + +#define GML_HLINE 1 +/* (param = y) */ + +#define GML_VLINE 2 +/* (param = x) */ + +/* les modes couleur possible (si tu mets un autre c'est noir) */ + +#define GML_BLEUBLANC 0 +#define GML_RED 1 +#define GML_ORANGE_V 2 +#define GML_ORANGE_J 3 +#define GML_VERT 4 +#define GML_BLEU 5 +#define GML_BLACK 6 + +/* construit un effet de line (une ligne horitontale pour commencer) */ +GMLine *goom_lines_init (PluginInfo *goomInfo, int rx, int ry, + int IDsrc, float paramS, int modeCoulSrc, + int IDdest, float paramD, int modeCoulDest); + +void goom_lines_switch_to (GMLine * gml, int IDdest, float param, float amplitude, int modeCoul); + +void goom_lines_set_res (GMLine * gml, int rx, int ry); + +void goom_lines_free (GMLine ** gml); + +void goom_lines_draw (PluginInfo *goomInfo, GMLine *line, const gint16 data[AUDIO_SAMPLE_LEN], Pixel *p); + +#endif /* _LINES_H */ diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/Makefile.am kodi-visualization-goom-2.1.0/lib/goom/src/Makefile.am --- kodi-visualization-goom-1.1.0/lib/goom/src/Makefile.am 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/Makefile.am 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,34 @@ +# libgoom2 + +if HAVE_MMX +MMX_FILES=mmx.c xmmx.c +else +MMX_FILES= +endif + +if HAVE_PPC +PPC_FILES=ppc_zoom_ultimate.s ppc_drawings.s +else +PPC_FILES= +endif + +goom2_lib_LTLIBRARIES = libgoom2.la +goom2_libdir = $(libdir) + +goom2_library_includedir=$(includedir)/goom +goom2_library_include_HEADERS = goom.h goom_plugin_info.h goom_typedefs.h goom_graphic.h goom_config_param.h goom_visual_fx.h goom_filters.h goom_tools.h goomsl.h goomsl_hash.h goomsl_heap.h goom_tools.h goom_config.h +libgoom2_la_LDFLAGS = -export-dynamic -export-symbols-regex "goom.*" +libgoom2_la_SOURCES = \ + goomsl_yacc.y goomsl_lex.l goomsl.c goomsl_hash.c goomsl_heap.c \ + goom_tools.c $(MMX_FILES) $(PPC_FILES) \ + config_param.c convolve_fx.c filters.c \ + flying_stars_fx.c gfontlib.c gfontrle.c \ + goom_core.c graphic.c ifs.c lines.c \ + mathtools.c sound_tester.c surf3d.c \ + tentacle3d.c plugin_info.c \ + v3d.c drawmethods.c \ + cpu_info.c + +AM_YFLAGS=-d + +noinst_HEADERS = mmx.h diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/mathtools.c kodi-visualization-goom-2.1.0/lib/goom/src/mathtools.c --- kodi-visualization-goom-1.1.0/lib/goom/src/mathtools.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/mathtools.c 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,84 @@ +/*---------------------------------------------------------------------------*/ +/* +** mathtools.c +** Goom Project +** +** Created by Jeko on Sun Jul 20 2003 + ** Copyright (c) 2003 iOS. All rights reserved. +*/ +/*---------------------------------------------------------------------------*/ + +#include "mathtools.h" + +float sin256[256] = { + 0,0.0245412,0.0490677,0.0735646,0.0980171,0.122411,0.14673,0.170962 + ,0.19509,0.219101,0.24298,0.266713,0.290285,0.313682,0.33689,0.359895 + ,0.382683,0.405241,0.427555,0.449611,0.471397,0.492898,0.514103,0.534998 + ,0.55557,0.575808,0.595699,0.615232,0.634393,0.653173,0.671559,0.689541 + ,0.707107,0.724247,0.740951,0.757209,0.77301,0.788346,0.803208,0.817585 + ,0.83147,0.844854,0.857729,0.870087,0.881921,0.893224,0.903989,0.91421 + ,0.92388,0.932993,0.941544,0.949528,0.95694,0.963776,0.970031,0.975702 + ,0.980785,0.985278,0.989177,0.99248,0.995185,0.99729,0.998795,0.999699 + ,1,0.999699,0.998795,0.99729,0.995185,0.99248,0.989177,0.985278 + ,0.980785,0.975702,0.970031,0.963776,0.95694,0.949528,0.941544,0.932993 + ,0.92388,0.91421,0.903989,0.893224,0.881921,0.870087,0.857729,0.844854 + ,0.83147,0.817585,0.803208,0.788346,0.77301,0.757209,0.740951,0.724247 + ,0.707107,0.689541,0.671559,0.653173,0.634393,0.615232,0.595699,0.575808 + ,0.55557,0.534998,0.514103,0.492898,0.471397,0.449611,0.427555,0.405241 + ,0.382683,0.359895,0.33689,0.313682,0.290285,0.266713,0.24298,0.219101 + ,0.19509,0.170962,0.14673,0.122411,0.0980171,0.0735646,0.0490677,0.0245412 + ,1.22465e-16,-0.0245412,-0.0490677,-0.0735646,-0.0980171,-0.122411,-0.14673,-0.170962 + ,-0.19509,-0.219101,-0.24298,-0.266713,-0.290285,-0.313682,-0.33689,-0.359895 + ,-0.382683,-0.405241,-0.427555,-0.449611,-0.471397,-0.492898,-0.514103,-0.534998 + ,-0.55557,-0.575808,-0.595699,-0.615232,-0.634393,-0.653173,-0.671559,-0.689541 + ,-0.707107,-0.724247,-0.740951,-0.757209,-0.77301,-0.788346,-0.803208,-0.817585 + ,-0.83147,-0.844854,-0.857729,-0.870087,-0.881921,-0.893224,-0.903989,-0.91421 + ,-0.92388,-0.932993,-0.941544,-0.949528,-0.95694,-0.963776,-0.970031,-0.975702 + ,-0.980785,-0.985278,-0.989177,-0.99248,-0.995185,-0.99729,-0.998795,-0.999699 + ,-1,-0.999699,-0.998795,-0.99729,-0.995185,-0.99248,-0.989177,-0.985278 + ,-0.980785,-0.975702,-0.970031,-0.963776,-0.95694,-0.949528,-0.941544,-0.932993 + ,-0.92388,-0.91421,-0.903989,-0.893224,-0.881921,-0.870087,-0.857729,-0.844854 + ,-0.83147,-0.817585,-0.803208,-0.788346,-0.77301,-0.757209,-0.740951,-0.724247 + ,-0.707107,-0.689541,-0.671559,-0.653173,-0.634393,-0.615232,-0.595699,-0.575808 + ,-0.55557,-0.534998,-0.514103,-0.492898,-0.471397,-0.449611,-0.427555,-0.405241 + ,-0.382683,-0.359895,-0.33689,-0.313682,-0.290285,-0.266713,-0.24298,-0.219101 + ,-0.19509,-0.170962,-0.14673,-0.122411,-0.0980171,-0.0735646,-0.0490677,-0.0245412 + +}; + +float cos256[256] = { + 0,0.999699,0.998795,0.99729,0.995185,0.99248,0.989177,0.985278 + ,0.980785,0.975702,0.970031,0.963776,0.95694,0.949528,0.941544,0.932993 + ,0.92388,0.91421,0.903989,0.893224,0.881921,0.870087,0.857729,0.844854 + ,0.83147,0.817585,0.803208,0.788346,0.77301,0.757209,0.740951,0.724247 + ,0.707107,0.689541,0.671559,0.653173,0.634393,0.615232,0.595699,0.575808 + ,0.55557,0.534998,0.514103,0.492898,0.471397,0.449611,0.427555,0.405241 + ,0.382683,0.359895,0.33689,0.313682,0.290285,0.266713,0.24298,0.219101 + ,0.19509,0.170962,0.14673,0.122411,0.0980171,0.0735646,0.0490677,0.0245412 + ,6.12323e-17,-0.0245412,-0.0490677,-0.0735646,-0.0980171,-0.122411,-0.14673,-0.170962 + ,-0.19509,-0.219101,-0.24298,-0.266713,-0.290285,-0.313682,-0.33689,-0.359895 + ,-0.382683,-0.405241,-0.427555,-0.449611,-0.471397,-0.492898,-0.514103,-0.534998 + ,-0.55557,-0.575808,-0.595699,-0.615232,-0.634393,-0.653173,-0.671559,-0.689541 + ,-0.707107,-0.724247,-0.740951,-0.757209,-0.77301,-0.788346,-0.803208,-0.817585 + ,-0.83147,-0.844854,-0.857729,-0.870087,-0.881921,-0.893224,-0.903989,-0.91421 + ,-0.92388,-0.932993,-0.941544,-0.949528,-0.95694,-0.963776,-0.970031,-0.975702 + ,-0.980785,-0.985278,-0.989177,-0.99248,-0.995185,-0.99729,-0.998795,-0.999699 + ,-1,-0.999699,-0.998795,-0.99729,-0.995185,-0.99248,-0.989177,-0.985278 + ,-0.980785,-0.975702,-0.970031,-0.963776,-0.95694,-0.949528,-0.941544,-0.932993 + ,-0.92388,-0.91421,-0.903989,-0.893224,-0.881921,-0.870087,-0.857729,-0.844854 + ,-0.83147,-0.817585,-0.803208,-0.788346,-0.77301,-0.757209,-0.740951,-0.724247 + ,-0.707107,-0.689541,-0.671559,-0.653173,-0.634393,-0.615232,-0.595699,-0.575808 + ,-0.55557,-0.534998,-0.514103,-0.492898,-0.471397,-0.449611,-0.427555,-0.405241 + ,-0.382683,-0.359895,-0.33689,-0.313682,-0.290285,-0.266713,-0.24298,-0.219101 + ,-0.19509,-0.170962,-0.14673,-0.122411,-0.0980171,-0.0735646,-0.0490677,-0.0245412 + ,-1.83697e-16,0.0245412,0.0490677,0.0735646,0.0980171,0.122411,0.14673,0.170962 + ,0.19509,0.219101,0.24298,0.266713,0.290285,0.313682,0.33689,0.359895 + ,0.382683,0.405241,0.427555,0.449611,0.471397,0.492898,0.514103,0.534998 + ,0.55557,0.575808,0.595699,0.615232,0.634393,0.653173,0.671559,0.689541 + ,0.707107,0.724247,0.740951,0.757209,0.77301,0.788346,0.803208,0.817585 + ,0.83147,0.844854,0.857729,0.870087,0.881921,0.893224,0.903989,0.91421 + ,0.92388,0.932993,0.941544,0.949528,0.95694,0.963776,0.970031,0.975702 + ,0.980785,0.985278,0.989177,0.99248,0.995185,0.99729,0.998795,0.999699 + +}; + diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/mathtools.h kodi-visualization-goom-2.1.0/lib/goom/src/mathtools.h --- kodi-visualization-goom-1.1.0/lib/goom/src/mathtools.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/mathtools.h 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,36 @@ +#ifndef MATHTOOLS_H +#define MATHTOOLS_H + + +#define _double2fixmagic (68719476736.0*1.5) +/* 2^36 * 1.5, (52-_shiftamt=36) uses limited precisicion to floor */ +#define _shiftamt 16 +/* 16.16 fixed point representation */ + +#if BigEndian_ +#define iexp_ 0 +#define iman_ 1 +#else +#define iexp_ 1 +#define iman_ 0 +#endif /* BigEndian_ */ + +/* TODO: this optimization is very efficient: put it again when all works +#ifdef HAVE_MMX +#define F2I(dbl,i) {double d = dbl + _double2fixmagic; i = ((int*)&d)[iman_] >> _shiftamt;} +#else*/ +#define F2I(dbl,i) i=(int)dbl; +/*#endif*/ + +#if 0 +#define SINCOS(f,s,c) \ + __asm__ __volatile__ ("fsincos" : "=t" (c), "=u" (s) : "0" (f)) +#else +#define SINCOS(f,s,c) {s=sin(f);c=cos(f);} +#endif + +extern float sin256[256]; +extern float cos256[256]; + +#endif + diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/mmx.c kodi-visualization-goom-2.1.0/lib/goom/src/mmx.c --- kodi-visualization-goom-1.1.0/lib/goom/src/mmx.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/mmx.c 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,275 @@ +#ifdef HAVE_MMX + +#define BUFFPOINTNB 16 +#define BUFFPOINTMASK 0xffff +#define BUFFINCR 0xff + +#include "mmx.h" +#include "goom_graphic.h" + +#define sqrtperte 16 +// faire : a % sqrtperte <=> a & pertemask +#define PERTEMASK 0xf +// faire : a / sqrtperte <=> a >> PERTEDEC +#define PERTEDEC 4 + +int mmx_supported (void) { + return (mm_support()&0x1); +} + +void zoom_filter_mmx (int prevX, int prevY, + Pixel *expix1, Pixel *expix2, + int *brutS, int *brutD, int buffratio, + int precalCoef[16][16]) +{ + unsigned int ax = (prevX-1)<> BUFFPOINTNB); + brutSmypos = brutS[myPos2]; + py = brutSmypos + (((brutD[myPos2] - brutSmypos)*buffratio) >> BUFFPOINTNB); + + if ((py>=ay) || (px>=ax)) { + pos=coeffs=0; + } + else { + pos = ((px >> PERTEDEC) + prevX * (py >> PERTEDEC)); + // coef en modulo 15 + coeffs = precalCoef [px & PERTEMASK][py & PERTEMASK]; + } + + __asm__ __volatile__ ( + "movd %2, %%mm6 \n\t" + + /* recuperation des deux premiers pixels dans mm0 et mm1 */ + "movq (%3,%1,4), %%mm0 \n\t" /* b1-v1-r1-a1-b2-v2-r2-a2 */ + "movq %%mm0, %%mm1 \n\t" /* b1-v1-r1-a1-b2-v2-r2-a2 */ + + /* depackage du premier pixel */ + "punpcklbw %%mm7, %%mm0 \n\t" /* 00-b2-00-v2-00-r2-00-a2 */ + + "movq %%mm6, %%mm5 \n\t" /* ??-??-??-??-c4-c3-c2-c1 */ + /* depackage du 2ieme pixel */ + "punpckhbw %%mm7, %%mm1 \n\t" /* 00-b1-00-v1-00-r1-00-a1 */ + + /* extraction des coefficients... */ + "punpcklbw %%mm5, %%mm6 \n\t" /* c4-c4-c3-c3-c2-c2-c1-c1 */ + "movq %%mm6, %%mm4 \n\t" /* c4-c4-c3-c3-c2-c2-c1-c1 */ + "movq %%mm6, %%mm5 \n\t" /* c4-c4-c3-c3-c2-c2-c1-c1 */ + + "punpcklbw %%mm5, %%mm6 \n\t" /* c2-c2-c2-c2-c1-c1-c1-c1 */ + "punpckhbw %%mm5, %%mm4 \n\t" /* c4-c4-c4-c4-c3-c3-c3-c3 */ + + "movq %%mm6, %%mm3 \n\t" /* c2-c2-c2-c2-c1-c1-c1-c1 */ + + "punpcklbw %%mm7, %%mm6 \n\t" /* 00-c1-00-c1-00-c1-00-c1 */ + "punpckhbw %%mm7, %%mm3 \n\t" /* 00-c2-00-c2-00-c2-00-c2 */ + + /* multiplication des pixels par les coefficients */ + "pmullw %%mm6, %%mm0 \n\t" /* c1*b2-c1*v2-c1*r2-c1*a2 */ + "pmullw %%mm3, %%mm1 \n\t" /* c2*b1-c2*v1-c2*r1-c2*a1 */ + "paddw %%mm1, %%mm0 \n\t" + + /* ...extraction des 2 derniers coefficients */ + "movq %%mm4, %%mm5 \n\t" /* c4-c4-c4-c4-c3-c3-c3-c3 */ + "punpcklbw %%mm7, %%mm4 \n\t" /* 00-c3-00-c3-00-c3-00-c3 */ + "punpckhbw %%mm7, %%mm5 \n\t" /* 00-c4-00-c4-00-c4-00-c4 */ + + /* ajouter la longueur de ligne a esi */ + "addl 8(%%ebp),%1 \n\t" + + /* recuperation des 2 derniers pixels */ + "movq (%3,%1,4), %%mm1 \n\t" + "movq %%mm1, %%mm2 \n\t" + + /* depackage des pixels */ + "punpcklbw %%mm7, %%mm1 \n\t" + "punpckhbw %%mm7, %%mm2 \n\t" + + /* multiplication pas les coeffs */ + "pmullw %%mm4, %%mm1 \n\t" + "pmullw %%mm5, %%mm2 \n\t" + + /* ajout des valeurs obtenues la valeur finale */ + "paddw %%mm1, %%mm0 \n\t" + "paddw %%mm2, %%mm0 \n\t" + + /* division par 256 = 16+16+16+16, puis repackage du pixel final */ + "psrlw $8, %%mm0 \n\t" + "packuswb %%mm7, %%mm0 \n\t" + + "movd %%mm0,%0 \n\t" + :"=g"(expix2[loop]) + :"r"(pos),"r"(coeffs),"r"(expix1) + + ); + + emms(); + } +} + +#define DRAWMETHOD_PLUS_MMX(_out,_backbuf,_col) \ +{ \ + movd_m2r(_backbuf, mm0); \ + paddusb_m2r(_col, mm0); \ + movd_r2m(mm0, _out); \ +} + +#define DRAWMETHOD DRAWMETHOD_PLUS_MMX(*p,*p,col) + +void draw_line_mmx (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny) +{ + int x, y, dx, dy, yy, xx; + Pixel *p; + + if ((y1 < 0) || (y2 < 0) || (x1 < 0) || (x2 < 0) || (y1 >= screeny) || (y2 >= screeny) || (x1 >= screenx) || (x2 >= screenx)) + goto end_of_line; + + dx = x2 - x1; + dy = y2 - y1; + if (x1 >= x2) { + int tmp; + + tmp = x1; + x1 = x2; + x2 = tmp; + tmp = y1; + y1 = y2; + y2 = tmp; + dx = x2 - x1; + dy = y2 - y1; + } + + /* vertical line */ + if (dx == 0) { + if (y1 < y2) { + p = &(data[(screenx * y1) + x1]); + for (y = y1; y <= y2; y++) { + DRAWMETHOD; + p += screenx; + } + } + else { + p = &(data[(screenx * y2) + x1]); + for (y = y2; y <= y1; y++) { + DRAWMETHOD; + p += screenx; + } + } + goto end_of_line; + } + /* horizontal line */ + if (dy == 0) { + if (x1 < x2) { + p = &(data[(screenx * y1) + x1]); + for (x = x1; x <= x2; x++) { + DRAWMETHOD; + p++; + } + goto end_of_line; + } + else { + p = &(data[(screenx * y1) + x2]); + for (x = x2; x <= x1; x++) { + DRAWMETHOD; + p++; + } + goto end_of_line; + } + } + /* 1 */ + /* \ */ + /* \ */ + /* 2 */ + if (y2 > y1) { + /* steep */ + if (dy > dx) { + dx = ((dx << 16) / dy); + x = x1 << 16; + for (y = y1; y <= y2; y++) { + xx = x >> 16; + p = &(data[(screenx * y) + xx]); + DRAWMETHOD; + if (xx < (screenx - 1)) { + p++; + /* DRAWMETHOD; */ + } + x += dx; + } + goto end_of_line; + } + /* shallow */ + else { + dy = ((dy << 16) / dx); + y = y1 << 16; + for (x = x1; x <= x2; x++) { + yy = y >> 16; + p = &(data[(screenx * yy) + x]); + DRAWMETHOD; + if (yy < (screeny - 1)) { + p += screeny; + /* DRAWMETHOD; */ + } + y += dy; + } + } + } + /* 2 */ + /* / */ + /* / */ + /* 1 */ + else { + /* steep */ + if (-dy > dx) { + dx = ((dx << 16) / -dy); + x = (x1 + 1) << 16; + for (y = y1; y >= y2; y--) { + xx = x >> 16; + p = &(data[(screenx * y) + xx]); + DRAWMETHOD; + if (xx < (screenx - 1)) { + p--; + /* DRAWMETHOD; */ + } + x += dx; + } + goto end_of_line; + } + /* shallow */ + else { + dy = ((dy << 16) / dx); + y = y1 << 16; + for (x = x1; x <= x2; x++) { + yy = y >> 16; + p = &(data[(screenx * yy) + x]); + DRAWMETHOD; + if (yy < (screeny - 1)) { + p += screeny; + /* DRAWMETHOD; */ + } + y += dy; + } + goto end_of_line; + } + } +end_of_line: + emms(); + /* __asm__ __volatile__ ("emms"); */ +} + +#endif diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/mmx.h kodi-visualization-goom-2.1.0/lib/goom/src/mmx.h --- kodi-visualization-goom-1.1.0/lib/goom/src/mmx.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/mmx.h 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,741 @@ +/* mmx.h + + MultiMedia eXtensions GCC interface library for IA32. + + To use this library, simply include this header file + and compile with GCC. You MUST have inlining enabled + in order for mmx_ok() to work; this can be done by + simply using -O on the GCC command line. + + Compiling with -DMMX_TRACE will cause detailed trace + output to be sent to stderr for each mmx operation. + This adds lots of code, and obviously slows execution to + a crawl, but can be very useful for debugging. + + THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT + LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS FOR ANY PARTICULAR PURPOSE. + + 1997-99 by H. Dietz and R. Fisher + + Notes: + It appears that the latest gas has the pand problem fixed, therefore + I'll undefine BROKEN_PAND by default. +*/ + +#ifndef _MMX_H +#define _MMX_H + +#include "goom_graphic.h" + +/* Warning: at this writing, the version of GAS packaged + with most Linux distributions does not handle the + parallel AND operation mnemonic correctly. If the + symbol BROKEN_PAND is defined, a slower alternative + coding will be used. If execution of mmxtest results + in an illegal instruction fault, define this symbol. +*/ +#undef BROKEN_PAND + + +/* The type of an value that fits in an MMX register + (note that long long constant values MUST be suffixed + by LL and unsigned long long values by ULL, lest + they be truncated by the compiler) +*/ +typedef union { + long long q; /* Quadword (64-bit) value */ + unsigned long long uq; /* Unsigned Quadword */ + int d[2]; /* 2 Doubleword (32-bit) values */ + unsigned int ud[2]; /* 2 Unsigned Doubleword */ + short w[4]; /* 4 Word (16-bit) values */ + unsigned short uw[4]; /* 4 Unsigned Word */ + char b[8]; /* 8 Byte (8-bit) values */ + unsigned char ub[8]; /* 8 Unsigned Byte */ + float s[2]; /* Single-precision (32-bit) value */ +} __attribute__ ((aligned (8))) mmx_t; /* On an 8-byte (64-bit) boundary */ + + + +/* Function to test if multimedia instructions are supported... +*/ +static int +mm_support(void) +{ + /* Returns 1 if MMX instructions are supported, + 3 if Cyrix MMX and Extended MMX instructions are supported + 5 if AMD MMX and 3DNow! instructions are supported + 13 if AMD Extended MMX, &3dNow supported + 0 if hardware does not support any of these + */ + register int rval = 0; + + __asm__ __volatile__ ( + /* See if CPUID instruction is supported ... */ + /* ... Get copies of EFLAGS into eax and ecx */ + "pushl %%ebx\n\t" + "pushf\n\t" + "popl %%eax\n\t" + "movl %%eax, %%ecx\n\t" + + /* ... Toggle the ID bit in one copy and store */ + /* to the EFLAGS reg */ + "xorl $0x200000, %%eax\n\t" + "push %%eax\n\t" + "popf\n\t" + + /* ... Get the (hopefully modified) EFLAGS */ + "pushf\n\t" + "popl %%eax\n\t" + + /* ... Compare and test result */ + "xorl %%eax, %%ecx\n\t" + "testl $0x200000, %%ecx\n\t" + "jz NotSupported1\n\t" /* CPUID not supported */ + + + /* Get standard CPUID information, and + go to a specific vendor section */ + "movl $0, %%eax\n\t" + "cpuid\n\t" + + /* Check for Intel */ + "cmpl $0x756e6547, %%ebx\n\t" + "jne TryAMD\n\t" + "cmpl $0x49656e69, %%edx\n\t" + "jne TryAMD\n\t" + "cmpl $0x6c65746e, %%ecx\n" + "jne TryAMD\n\t" + "jmp Intel\n\t" + + /* Check for AMD */ + "\nTryAMD:\n\t" + "cmpl $0x68747541, %%ebx\n\t" + "jne TryCyrix\n\t" + "cmpl $0x69746e65, %%edx\n\t" + "jne TryCyrix\n\t" + "cmpl $0x444d4163, %%ecx\n" + "jne TryCyrix\n\t" + "jmp AMD\n\t" + + /* Check for Cyrix */ + "\nTryCyrix:\n\t" + "cmpl $0x69727943, %%ebx\n\t" + "jne NotSupported2\n\t" + "cmpl $0x736e4978, %%edx\n\t" + "jne NotSupported3\n\t" + "cmpl $0x64616574, %%ecx\n\t" + "jne NotSupported4\n\t" + /* Drop through to Cyrix... */ + + + /* Cyrix Section */ + /* See if extended CPUID level 80000001 is supported */ + /* The value of CPUID/80000001 for the 6x86MX is undefined + according to the Cyrix CPU Detection Guide (Preliminary + Rev. 1.01 table 1), so we'll check the value of eax for + CPUID/0 to see if standard CPUID level 2 is supported. + According to the table, the only CPU which supports level + 2 is also the only one which supports extended CPUID levels. + */ + "cmpl $0x2, %%eax\n\t" + "jne MMXtest\n\t" /* Use standard CPUID instead */ + + /* Extended CPUID supported (in theory), so get extended + features */ + "movl $0x80000001, %%eax\n\t" + "cpuid\n\t" + "testl $0x00800000, %%eax\n\t" /* Test for MMX */ + "jz NotSupported5\n\t" /* MMX not supported */ + "testl $0x01000000, %%eax\n\t" /* Test for Ext'd MMX */ + "jnz EMMXSupported\n\t" + "movl $1, %0\n\n\t" /* MMX Supported */ + "jmp Return\n\n" + "EMMXSupported:\n\t" + "movl $3, %0\n\n\t" /* EMMX and MMX Supported */ + "jmp Return\n\t" + + + /* AMD Section */ + "AMD:\n\t" + + /* See if extended CPUID is supported */ + "movl $0x80000000, %%eax\n\t" + "cpuid\n\t" + "cmpl $0x80000000, %%eax\n\t" + "jl MMXtest\n\t" /* Use standard CPUID instead */ + + /* Extended CPUID supported, so get extended features */ + "movl $0x80000001, %%eax\n\t" + "cpuid\n\t" + "testl $0x00800000, %%edx\n\t" /* Test for MMX */ + "jz NotSupported6\n\t" /* MMX not supported */ + "testl $0x80000000, %%edx\n\t" /* Test for 3DNow! */ + "jnz ThreeDNowSupported\n\t" + "movl $1, %0\n\n\t" /* MMX Supported */ + "jmp Return\n\n" + "ThreeDNowSupported:\n\t" + "testl $0x40000000, %%edx\n\t" /* Test AMD Extended MMX */ + "jnz AMDXMMXSupported\n\t" + "movl $5, %0\n\n\t" /* 3DNow! and MMX Supported */ + "jmp Return\n\t" + "AMDXMMXSupported:\n\t" + "movl $13, %0\n\n\t" /* XMMX, 3DNow! and MMX Supported */ + "jmp Return\n\t" + + + /* Intel Section */ + "Intel:\n\t" + + /* Check for MMX */ + "MMXtest:\n\t" + "movl $1, %%eax\n\t" + "cpuid\n\t" + "testl $0x00800000, %%edx\n\t" /* Test for MMX */ + "jz NotSupported7\n\t" /* MMX Not supported */ + "movl $1, %0\n\n\t" /* MMX Supported */ + "jmp Return\n\t" + + /* Nothing supported */ + "\nNotSupported1:\n\t" + "#movl $101, %0\n\n\t" + "\nNotSupported2:\n\t" + "#movl $102, %0\n\n\t" + "\nNotSupported3:\n\t" + "#movl $103, %0\n\n\t" + "\nNotSupported4:\n\t" + "#movl $104, %0\n\n\t" + "\nNotSupported5:\n\t" + "#movl $105, %0\n\n\t" + "\nNotSupported6:\n\t" + "#movl $106, %0\n\n\t" + "\nNotSupported7:\n\t" + "#movl $107, %0\n\n\t" + "movl $0, %0\n\n\t" + + "Return:\n\t" + "popl %%ebx\n\t" + : "=X" (rval) + : /* no input */ + : "eax", "ecx", "edx" + ); + + /* Return */ + return(rval); +} + +/* Function to test if mmx instructions are supported... +*/ +static inline int +mmx_ok(void) +{ + /* Returns 1 if MMX instructions are supported, 0 otherwise */ + return ( mm_support() & 0x1 ); +} + +int mmx_supported (void); +int xmmx_supported (void); + + +/* MMX optimized implementations */ +void draw_line_mmx (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny); +void draw_line_xmmx (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny); +void zoom_filter_mmx (int prevX, int prevY, Pixel *expix1, Pixel *expix2, + int *brutS, int *brutD, int buffratio, int precalCoef[16][16]); +void zoom_filter_xmmx (int prevX, int prevY, Pixel *expix1, Pixel *expix2, + int *lbruS, int *lbruD, int buffratio, int precalCoef[16][16]); + + +/* Helper functions for the instruction macros that follow... + (note that memory-to-register, m2r, instructions are nearly + as efficient as register-to-register, r2r, instructions; + however, memory-to-memory instructions are really simulated + as a convenience, and are only 1/3 as efficient) +*/ +#ifdef MMX_TRACE + +/* Include the stuff for printing a trace to stderr... +*/ + +#include + +#define mmx_i2r(op, imm, reg) \ + { \ + mmx_t mmx_trace; \ + mmx_trace.uq = (imm); \ + printf(#op "_i2r(" #imm "=0x%08x%08x, ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ ("movq %%" #reg ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + printf(#reg "=0x%08x%08x) => ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ (#op " %0, %%" #reg \ + : /* nothing */ \ + : "X" (imm)); \ + __asm__ __volatile__ ("movq %%" #reg ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + printf(#reg "=0x%08x%08x\n", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + } + +#define mmx_m2r(op, mem, reg) \ + { \ + mmx_t mmx_trace; \ + mmx_trace = (mem); \ + printf(#op "_m2r(" #mem "=0x%08x%08x, ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ ("movq %%" #reg ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + printf(#reg "=0x%08x%08x) => ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ (#op " %0, %%" #reg \ + : /* nothing */ \ + : "m" (mem)); \ + __asm__ __volatile__ ("movq %%" #reg ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + printf(#reg "=0x%08x%08x\n", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + } + +#define mmx_r2m(op, reg, mem) \ + { \ + mmx_t mmx_trace; \ + __asm__ __volatile__ ("movq %%" #reg ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + printf(#op "_r2m(" #reg "=0x%08x%08x, ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + mmx_trace = (mem); \ + printf(#mem "=0x%08x%08x) => ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ (#op " %%" #reg ", %0" \ + : "=m" (mem) \ + : /* nothing */ ); \ + mmx_trace = (mem); \ + printf(#mem "=0x%08x%08x\n", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + } + +#define mmx_r2r(op, regs, regd) \ + { \ + mmx_t mmx_trace; \ + __asm__ __volatile__ ("movq %%" #regs ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + printf(#op "_r2r(" #regs "=0x%08x%08x, ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ ("movq %%" #regd ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + printf(#regd "=0x%08x%08x) => ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ (#op " %" #regs ", %" #regd); \ + __asm__ __volatile__ ("movq %%" #regd ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + printf(#regd "=0x%08x%08x\n", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + } + +#define mmx_m2m(op, mems, memd) \ + { \ + mmx_t mmx_trace; \ + mmx_trace = (mems); \ + printf(#op "_m2m(" #mems "=0x%08x%08x, ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + mmx_trace = (memd); \ + printf(#memd "=0x%08x%08x) => ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ ("movq %0, %%mm0\n\t" \ + #op " %1, %%mm0\n\t" \ + "movq %%mm0, %0" \ + : "=m" (memd) \ + : "m" (mems)); \ + mmx_trace = (memd); \ + printf(#memd "=0x%08x%08x\n", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + } + +#else + +/* These macros are a lot simpler without the tracing... +*/ + +#define mmx_i2r(op, imm, reg) \ + __asm__ __volatile__ (#op " %0, %%" #reg \ + : /* nothing */ \ + : "X" (imm) ) + +#define mmx_m2r(op, mem, reg) \ + __asm__ __volatile__ (#op " %0, %%" #reg \ + : /* nothing */ \ + : "m" (mem)) + +#define mmx_r2m(op, reg, mem) \ + __asm__ __volatile__ (#op " %%" #reg ", %0" \ + : "=m" (mem) \ + : /* nothing */ ) + +#define mmx_r2r(op, regs, regd) \ + __asm__ __volatile__ (#op " %" #regs ", %" #regd) + +#define mmx_m2m(op, mems, memd) \ + __asm__ __volatile__ ("movq %0, %%mm0\n\t" \ + #op " %1, %%mm0\n\t" \ + "movq %%mm0, %0" \ + : "=m" (memd) \ + : "m" (mems)) + +#endif + + +/* 1x64 MOVe Quadword + (this is both a load and a store... + in fact, it is the only way to store) +*/ +#define movq_m2r(var, reg) mmx_m2r(movq, var, reg) +#define movq_r2m(reg, var) mmx_r2m(movq, reg, var) +#define movq_r2r(regs, regd) mmx_r2r(movq, regs, regd) +#define movq(vars, vard) \ + __asm__ __volatile__ ("movq %1, %%mm0\n\t" \ + "movq %%mm0, %0" \ + : "=X" (vard) \ + : "X" (vars)) + + +/* 1x32 MOVe Doubleword + (like movq, this is both load and store... + but is most useful for moving things between + mmx registers and ordinary registers) +*/ +#define movd_m2r(var, reg) mmx_m2r(movd, var, reg) +#define movd_r2m(reg, var) mmx_r2m(movd, reg, var) +#define movd_r2r(regs, regd) mmx_r2r(movd, regs, regd) +#define movd(vars, vard) \ + __asm__ __volatile__ ("movd %1, %%mm0\n\t" \ + "movd %%mm0, %0" \ + : "=X" (vard) \ + : "X" (vars)) + + +/* 2x32, 4x16, and 8x8 Parallel ADDs +*/ +#define paddd_m2r(var, reg) mmx_m2r(paddd, var, reg) +#define paddd_r2r(regs, regd) mmx_r2r(paddd, regs, regd) +#define paddd(vars, vard) mmx_m2m(paddd, vars, vard) + +#define paddw_m2r(var, reg) mmx_m2r(paddw, var, reg) +#define paddw_r2r(regs, regd) mmx_r2r(paddw, regs, regd) +#define paddw(vars, vard) mmx_m2m(paddw, vars, vard) + +#define paddb_m2r(var, reg) mmx_m2r(paddb, var, reg) +#define paddb_r2r(regs, regd) mmx_r2r(paddb, regs, regd) +#define paddb(vars, vard) mmx_m2m(paddb, vars, vard) + + +/* 4x16 and 8x8 Parallel ADDs using Saturation arithmetic +*/ +#define paddsw_m2r(var, reg) mmx_m2r(paddsw, var, reg) +#define paddsw_r2r(regs, regd) mmx_r2r(paddsw, regs, regd) +#define paddsw(vars, vard) mmx_m2m(paddsw, vars, vard) + +#define paddsb_m2r(var, reg) mmx_m2r(paddsb, var, reg) +#define paddsb_r2r(regs, regd) mmx_r2r(paddsb, regs, regd) +#define paddsb(vars, vard) mmx_m2m(paddsb, vars, vard) + + +/* 4x16 and 8x8 Parallel ADDs using Unsigned Saturation arithmetic +*/ +#define paddusw_m2r(var, reg) mmx_m2r(paddusw, var, reg) +#define paddusw_r2r(regs, regd) mmx_r2r(paddusw, regs, regd) +#define paddusw(vars, vard) mmx_m2m(paddusw, vars, vard) + +#define paddusb_m2r(var, reg) mmx_m2r(paddusb, var, reg) +#define paddusb_r2r(regs, regd) mmx_r2r(paddusb, regs, regd) +#define paddusb(vars, vard) mmx_m2m(paddusb, vars, vard) + + +/* 2x32, 4x16, and 8x8 Parallel SUBs +*/ +#define psubd_m2r(var, reg) mmx_m2r(psubd, var, reg) +#define psubd_r2r(regs, regd) mmx_r2r(psubd, regs, regd) +#define psubd(vars, vard) mmx_m2m(psubd, vars, vard) + +#define psubw_m2r(var, reg) mmx_m2r(psubw, var, reg) +#define psubw_r2r(regs, regd) mmx_r2r(psubw, regs, regd) +#define psubw(vars, vard) mmx_m2m(psubw, vars, vard) + +#define psubb_m2r(var, reg) mmx_m2r(psubb, var, reg) +#define psubb_r2r(regs, regd) mmx_r2r(psubb, regs, regd) +#define psubb(vars, vard) mmx_m2m(psubb, vars, vard) + + +/* 4x16 and 8x8 Parallel SUBs using Saturation arithmetic +*/ +#define psubsw_m2r(var, reg) mmx_m2r(psubsw, var, reg) +#define psubsw_r2r(regs, regd) mmx_r2r(psubsw, regs, regd) +#define psubsw(vars, vard) mmx_m2m(psubsw, vars, vard) + +#define psubsb_m2r(var, reg) mmx_m2r(psubsb, var, reg) +#define psubsb_r2r(regs, regd) mmx_r2r(psubsb, regs, regd) +#define psubsb(vars, vard) mmx_m2m(psubsb, vars, vard) + + +/* 4x16 and 8x8 Parallel SUBs using Unsigned Saturation arithmetic +*/ +#define psubusw_m2r(var, reg) mmx_m2r(psubusw, var, reg) +#define psubusw_r2r(regs, regd) mmx_r2r(psubusw, regs, regd) +#define psubusw(vars, vard) mmx_m2m(psubusw, vars, vard) + +#define psubusb_m2r(var, reg) mmx_m2r(psubusb, var, reg) +#define psubusb_r2r(regs, regd) mmx_r2r(psubusb, regs, regd) +#define psubusb(vars, vard) mmx_m2m(psubusb, vars, vard) + + +/* 4x16 Parallel MULs giving Low 4x16 portions of results +*/ +#define pmullw_m2r(var, reg) mmx_m2r(pmullw, var, reg) +#define pmullw_r2r(regs, regd) mmx_r2r(pmullw, regs, regd) +#define pmullw(vars, vard) mmx_m2m(pmullw, vars, vard) + + +/* 4x16 Parallel MULs giving High 4x16 portions of results +*/ +#define pmulhw_m2r(var, reg) mmx_m2r(pmulhw, var, reg) +#define pmulhw_r2r(regs, regd) mmx_r2r(pmulhw, regs, regd) +#define pmulhw(vars, vard) mmx_m2m(pmulhw, vars, vard) + + +/* 4x16->2x32 Parallel Mul-ADD + (muls like pmullw, then adds adjacent 16-bit fields + in the multiply result to make the final 2x32 result) +*/ +#define pmaddwd_m2r(var, reg) mmx_m2r(pmaddwd, var, reg) +#define pmaddwd_r2r(regs, regd) mmx_r2r(pmaddwd, regs, regd) +#define pmaddwd(vars, vard) mmx_m2m(pmaddwd, vars, vard) + + +/* 1x64 bitwise AND +*/ +#ifdef BROKEN_PAND +#define pand_m2r(var, reg) \ + { \ + mmx_m2r(pandn, (mmx_t) -1LL, reg); \ + mmx_m2r(pandn, var, reg); \ + } +#define pand_r2r(regs, regd) \ + { \ + mmx_m2r(pandn, (mmx_t) -1LL, regd); \ + mmx_r2r(pandn, regs, regd) \ + } +#define pand(vars, vard) \ + { \ + movq_m2r(vard, mm0); \ + mmx_m2r(pandn, (mmx_t) -1LL, mm0); \ + mmx_m2r(pandn, vars, mm0); \ + movq_r2m(mm0, vard); \ + } +#else +#define pand_m2r(var, reg) mmx_m2r(pand, var, reg) +#define pand_r2r(regs, regd) mmx_r2r(pand, regs, regd) +#define pand(vars, vard) mmx_m2m(pand, vars, vard) +#endif + + +/* 1x64 bitwise AND with Not the destination +*/ +#define pandn_m2r(var, reg) mmx_m2r(pandn, var, reg) +#define pandn_r2r(regs, regd) mmx_r2r(pandn, regs, regd) +#define pandn(vars, vard) mmx_m2m(pandn, vars, vard) + + +/* 1x64 bitwise OR +*/ +#define por_m2r(var, reg) mmx_m2r(por, var, reg) +#define por_r2r(regs, regd) mmx_r2r(por, regs, regd) +#define por(vars, vard) mmx_m2m(por, vars, vard) + + +/* 1x64 bitwise eXclusive OR +*/ +#define pxor_m2r(var, reg) mmx_m2r(pxor, var, reg) +#define pxor_r2r(regs, regd) mmx_r2r(pxor, regs, regd) +#define pxor(vars, vard) mmx_m2m(pxor, vars, vard) + + +/* 2x32, 4x16, and 8x8 Parallel CoMPare for EQuality + (resulting fields are either 0 or -1) +*/ +#define pcmpeqd_m2r(var, reg) mmx_m2r(pcmpeqd, var, reg) +#define pcmpeqd_r2r(regs, regd) mmx_r2r(pcmpeqd, regs, regd) +#define pcmpeqd(vars, vard) mmx_m2m(pcmpeqd, vars, vard) + +#define pcmpeqw_m2r(var, reg) mmx_m2r(pcmpeqw, var, reg) +#define pcmpeqw_r2r(regs, regd) mmx_r2r(pcmpeqw, regs, regd) +#define pcmpeqw(vars, vard) mmx_m2m(pcmpeqw, vars, vard) + +#define pcmpeqb_m2r(var, reg) mmx_m2r(pcmpeqb, var, reg) +#define pcmpeqb_r2r(regs, regd) mmx_r2r(pcmpeqb, regs, regd) +#define pcmpeqb(vars, vard) mmx_m2m(pcmpeqb, vars, vard) + + +/* 2x32, 4x16, and 8x8 Parallel CoMPare for Greater Than + (resulting fields are either 0 or -1) +*/ +#define pcmpgtd_m2r(var, reg) mmx_m2r(pcmpgtd, var, reg) +#define pcmpgtd_r2r(regs, regd) mmx_r2r(pcmpgtd, regs, regd) +#define pcmpgtd(vars, vard) mmx_m2m(pcmpgtd, vars, vard) + +#define pcmpgtw_m2r(var, reg) mmx_m2r(pcmpgtw, var, reg) +#define pcmpgtw_r2r(regs, regd) mmx_r2r(pcmpgtw, regs, regd) +#define pcmpgtw(vars, vard) mmx_m2m(pcmpgtw, vars, vard) + +#define pcmpgtb_m2r(var, reg) mmx_m2r(pcmpgtb, var, reg) +#define pcmpgtb_r2r(regs, regd) mmx_r2r(pcmpgtb, regs, regd) +#define pcmpgtb(vars, vard) mmx_m2m(pcmpgtb, vars, vard) + + +/* 1x64, 2x32, and 4x16 Parallel Shift Left Logical +*/ +#define psllq_i2r(imm, reg) mmx_i2r(psllq, imm, reg) +#define psllq_m2r(var, reg) mmx_m2r(psllq, var, reg) +#define psllq_r2r(regs, regd) mmx_r2r(psllq, regs, regd) +#define psllq(vars, vard) mmx_m2m(psllq, vars, vard) + +#define pslld_i2r(imm, reg) mmx_i2r(pslld, imm, reg) +#define pslld_m2r(var, reg) mmx_m2r(pslld, var, reg) +#define pslld_r2r(regs, regd) mmx_r2r(pslld, regs, regd) +#define pslld(vars, vard) mmx_m2m(pslld, vars, vard) + +#define psllw_i2r(imm, reg) mmx_i2r(psllw, imm, reg) +#define psllw_m2r(var, reg) mmx_m2r(psllw, var, reg) +#define psllw_r2r(regs, regd) mmx_r2r(psllw, regs, regd) +#define psllw(vars, vard) mmx_m2m(psllw, vars, vard) + + +/* 1x64, 2x32, and 4x16 Parallel Shift Right Logical +*/ +#define psrlq_i2r(imm, reg) mmx_i2r(psrlq, imm, reg) +#define psrlq_m2r(var, reg) mmx_m2r(psrlq, var, reg) +#define psrlq_r2r(regs, regd) mmx_r2r(psrlq, regs, regd) +#define psrlq(vars, vard) mmx_m2m(psrlq, vars, vard) + +#define psrld_i2r(imm, reg) mmx_i2r(psrld, imm, reg) +#define psrld_m2r(var, reg) mmx_m2r(psrld, var, reg) +#define psrld_r2r(regs, regd) mmx_r2r(psrld, regs, regd) +#define psrld(vars, vard) mmx_m2m(psrld, vars, vard) + +#define psrlw_i2r(imm, reg) mmx_i2r(psrlw, imm, reg) +#define psrlw_m2r(var, reg) mmx_m2r(psrlw, var, reg) +#define psrlw_r2r(regs, regd) mmx_r2r(psrlw, regs, regd) +#define psrlw(vars, vard) mmx_m2m(psrlw, vars, vard) + + +/* 2x32 and 4x16 Parallel Shift Right Arithmetic +*/ +#define psrad_i2r(imm, reg) mmx_i2r(psrad, imm, reg) +#define psrad_m2r(var, reg) mmx_m2r(psrad, var, reg) +#define psrad_r2r(regs, regd) mmx_r2r(psrad, regs, regd) +#define psrad(vars, vard) mmx_m2m(psrad, vars, vard) + +#define psraw_i2r(imm, reg) mmx_i2r(psraw, imm, reg) +#define psraw_m2r(var, reg) mmx_m2r(psraw, var, reg) +#define psraw_r2r(regs, regd) mmx_r2r(psraw, regs, regd) +#define psraw(vars, vard) mmx_m2m(psraw, vars, vard) + + +/* 2x32->4x16 and 4x16->8x8 PACK and Signed Saturate + (packs source and dest fields into dest in that order) +*/ +#define packssdw_m2r(var, reg) mmx_m2r(packssdw, var, reg) +#define packssdw_r2r(regs, regd) mmx_r2r(packssdw, regs, regd) +#define packssdw(vars, vard) mmx_m2m(packssdw, vars, vard) + +#define packsswb_m2r(var, reg) mmx_m2r(packsswb, var, reg) +#define packsswb_r2r(regs, regd) mmx_r2r(packsswb, regs, regd) +#define packsswb(vars, vard) mmx_m2m(packsswb, vars, vard) + + +/* 4x16->8x8 PACK and Unsigned Saturate + (packs source and dest fields into dest in that order) +*/ +#define packuswb_m2r(var, reg) mmx_m2r(packuswb, var, reg) +#define packuswb_r2r(regs, regd) mmx_r2r(packuswb, regs, regd) +#define packuswb(vars, vard) mmx_m2m(packuswb, vars, vard) + + +/* 2x32->1x64, 4x16->2x32, and 8x8->4x16 UNPaCK Low + (interleaves low half of dest with low half of source + as padding in each result field) +*/ +#define punpckldq_m2r(var, reg) mmx_m2r(punpckldq, var, reg) +#define punpckldq_r2r(regs, regd) mmx_r2r(punpckldq, regs, regd) +#define punpckldq(vars, vard) mmx_m2m(punpckldq, vars, vard) + +#define punpcklwd_m2r(var, reg) mmx_m2r(punpcklwd, var, reg) +#define punpcklwd_r2r(regs, regd) mmx_r2r(punpcklwd, regs, regd) +#define punpcklwd(vars, vard) mmx_m2m(punpcklwd, vars, vard) + +#define punpcklbw_m2r(var, reg) mmx_m2r(punpcklbw, var, reg) +#define punpcklbw_r2r(regs, regd) mmx_r2r(punpcklbw, regs, regd) +#define punpcklbw(vars, vard) mmx_m2m(punpcklbw, vars, vard) + + +/* 2x32->1x64, 4x16->2x32, and 8x8->4x16 UNPaCK High + (interleaves high half of dest with high half of source + as padding in each result field) +*/ +#define punpckhdq_m2r(var, reg) mmx_m2r(punpckhdq, var, reg) +#define punpckhdq_r2r(regs, regd) mmx_r2r(punpckhdq, regs, regd) +#define punpckhdq(vars, vard) mmx_m2m(punpckhdq, vars, vard) + +#define punpckhwd_m2r(var, reg) mmx_m2r(punpckhwd, var, reg) +#define punpckhwd_r2r(regs, regd) mmx_r2r(punpckhwd, regs, regd) +#define punpckhwd(vars, vard) mmx_m2m(punpckhwd, vars, vard) + +#define punpckhbw_m2r(var, reg) mmx_m2r(punpckhbw, var, reg) +#define punpckhbw_r2r(regs, regd) mmx_r2r(punpckhbw, regs, regd) +#define punpckhbw(vars, vard) mmx_m2m(punpckhbw, vars, vard) + + +/* Empty MMx State + (used to clean-up when going from mmx to float use + of the registers that are shared by both; note that + there is no float-to-mmx operation needed, because + only the float tag word info is corruptible) +*/ +#ifdef MMX_TRACE + +#ifdef __clang__ +#define emms() \ + { \ + printf("emms()\n"); \ + __asm__ __volatile__ ("emms"); \ + } +#else +#define emms() \ + { \ + printf("emms()\n"); \ + __asm__ __volatile__ ("emms" \ + "st(1)","st(2)","st(3)","st(4)","st(5)","st(6)","st(7)"); \ + } +#endif + +#else + +#ifdef __clang__ +#define emms() __asm__ __volatile__ ("emms") +#else +#define emms() __asm__ __volatile__ ("emms"::: \ + "st(1)","st(2)","st(3)","st(4)","st(5)","st(6)","st(7)") +#endif + +#endif + +#endif + diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/motif_blank.h kodi-visualization-goom-2.1.0/lib/goom/src/motif_blank.h --- kodi-visualization-goom-1.1.0/lib/goom/src/motif_blank.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/motif_blank.h 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,1026 @@ +static Motif CONV_MOTIF_BLANK = { + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,12,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,14, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,13, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,14, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15 + }; diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/motif_goom1.h kodi-visualization-goom-2.1.0/lib/goom/src/motif_goom1.h --- kodi-visualization-goom-1.1.0/lib/goom/src/motif_goom1.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/motif_goom1.h 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,1026 @@ +static Motif CONV_MOTIF1 = { + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,14,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,13,9,9,7,2,2,9,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,11, + 11,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,12,7,4,0,0,0,2,0,0,3,14,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,12,10,9,9,4,1,0, + 1,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,10,3,0,0,0,1,1,3,5,0,0,1,14,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,14,6,3,1,1,4,9,1, + 1,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 10,3,0,0,2,7,13,14,14,14,7,0,0,2,14,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,12,1,9,15,15,15,15,3, + 0,13,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,12,4, + 0,0,2,10,15,15,15,15,15,15,1,0,0,10,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,9,0,2,14,15,15,15,7, + 0,9,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,14,6,0,0, + 2,9,15,15,15,15,15,15,15,13,0,0,3,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,11,0,0,10,15,15,15,9, + 0,9,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,13,3,0,1,5, + 5,4,4,4,6,12,15,15,15,13,0,0,7,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,14,0,0,5,15,15,15,10, + 0,7,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,11,1,0,3,3,1, + 0,0,0,0,0,0,5,13,15,12,0,0,13,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,13,14,15, + 15,15,15,15,15,15,15,15,14,0,0,1,15,15,15,12, + 0,3,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,10,1,2,4,0,0,1, + 9,12,12,12,9,3,0,2,14,5,0,7,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,14,7,4,4,1,1,12, + 15,15,15,15,15,15,15,15,14,1,0,0,12,15,15,15, + 1,0,12,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,10,0,3,2,0,0,3,12, + 15,15,15,15,15,14,2,1,13,2,0,12,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,14,3,0,0,0,0,0,2, + 13,15,15,15,15,15,15,15,14,1,0,0,8,15,15,15, + 1,0,9,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,12,2,1,0,0,0,9,14,15, + 15,15,15,15,15,14,1,1,11,0,3,14,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,7,4,11,12,10,1,0, + 3,12,15,15,15,15,15,15,13,1,1,0,4,15,15,15, + 2,0,10,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,14,2,1,0,0,3,12,15,15,15, + 15,15,15,15,15,11,0,5,9,1,12,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,5,1,13,15,15,12,1, + 0,1,9,15,15,15,15,15,14,2,5,0,1,14,15,15, + 2,0,7,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,14,3,0,0,0,7,14,15,15,15,15, + 15,15,15,15,15,9,0,8,7,4,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,7,0,7,8,11,15,13, + 2,0,0,3,10,15,15,15,15,5,11,0,0,11,15,15, + 6,0,2,14,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,6,0,0,0,8,15,15,15,15,15,15, + 15,15,15,15,15,6,0,4,0,6,15,15,15,15,15,15, + 14,9,14,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,11,0,3,3,0,8,15, + 14,5,0,0,0,4,12,15,15,5,13,2,0,6,15,15, + 12,0,0,11,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,10,0,0,0,8,15,15,15,15,15,15,15, + 15,15,15,15,10,1,7,6,4,13,15,15,15,15,13,11, + 6,0,8,11,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,1,1,11,2,0,5, + 14,15,8,0,0,0,0,7,15,5,14,6,0,2,15,15, + 15,3,0,5,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,13,1,0,0,7,15,15,15,15,15,15,15,15, + 15,15,15,15,7,9,15,15,15,15,15,15,12,6,2,1, + 1,1,8,6,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,4,0,6,12,1,0, + 3,13,15,11,2,0,0,0,8,4,14,10,0,0,13,15, + 15,7,0,1,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,5,0,0,5,15,15,15,15,15,15,15,15,15, + 15,15,15,15,13,15,15,15,15,14,8,3,1,2,7,11, + 5,4,5,6,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,8,0,1,14,11,0, + 0,1,9,15,14,5,0,0,2,4,14,13,0,0,10,15, + 15,12,0,0,12,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,10,0,0,1,14,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,14,13,7,2,0,5,9,15,15,15, + 5,3,6,9,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,13,0,0,9,15,12, + 2,0,0,4,13,14,4,0,3,2,12,15,1,0,5,15, + 15,14,1,0,8,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,2,0,0,9,15,15,15,15,15,15,15,15,15,15, + 15,15,15,12,11,6,1,0,2,3,10,15,15,15,15,7, + 1,2,4,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,5,0,3,14,15, + 9,2,0,0,1,6,12,13,13,1,9,12,0,0,2,14, + 15,15,4,0,4,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,10,0,0,2,14,15,15,15,15,15,15,15,15,15,15, + 13,9,6,0,1,2,9,10,15,15,15,15,14,7,1,0, + 6,2,4,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,11,0,0,9,15, + 4,4,11,6,1,0,0,1,1,0,10,4,0,0,0,12, + 15,15,9,0,1,14,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,3,0,0,8,15,15,15,15,15,15,15,13,12,4,4, + 1,1,3,10,12,15,15,15,15,15,9,2,1,0,1,6, + 6,0,10,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,4,0,3,14, + 4,3,15,15,14,9,7,9,1,0,0,0,0,1,0,7, + 15,15,13,0,0,9,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 13,0,0,1,14,15,15,15,15,15,12,9,1,0,1,4, + 7,15,15,15,15,15,15,14,8,2,0,0,0,2,13,9, + 0,4,14,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,11,0,0,9, + 3,0,8,14,15,15,15,15,10,5,4,4,7,4,0,3, + 15,15,15,4,0,3,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 5,0,0,5,15,15,15,15,14,8,7,8,10,12,14,15, + 15,15,15,15,15,15,11,1,0,0,0,5,11,15,13,1, + 1,13,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,3,0,4, + 4,0,0,2,6,10,15,15,15,15,15,15,15,10,0,0, + 12,15,15,9,0,0,12,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 1,0,0,10,15,15,15,15,15,13,14,15,15,15,15,15, + 15,15,15,15,14,7,1,0,0,3,12,15,15,15,6,0, + 7,15,15,15,12,10,9,10,12,14,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,9,0,0, + 8,3,1,4,1,0,1,12,15,15,15,15,15,14,2,0, + 6,15,15,15,2,0,6,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 0,0,1,14,15,15,15,15,14,5,15,15,15,15,15,15, + 15,15,15,7,2,0,0,1,8,15,15,15,15,12,0,2, + 14,15,12,4,0,0,0,0,0,1,5,10,14,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,14,0,0, + 5,4,1,14,15,10,7,13,15,15,15,15,15,15,8,0, + 1,14,15,15,7,0,1,14,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,13, + 0,0,4,15,15,15,15,15,13,2,13,15,15,15,15,15, + 12,7,0,0,0,0,5,12,15,15,15,15,14,3,0,9, + 11,1,0,0,1,1,0,1,0,0,0,0,2,12,15,15, + 15,15,15,15,15,15,15,14,15,15,15,15,15,15,2,0, + 5,2,1,14,15,14,13,15,15,15,15,15,15,15,12,0, + 0,10,15,15,13,0,0,9,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,12, + 0,0,4,15,15,15,15,15,12,0,12,15,15,15,12,6, + 0,0,0,0,6,14,15,15,15,15,15,15,7,0,0,12, + 1,0,0,2,2,1,1,7,12,8,3,0,0,1,13,15, + 15,15,15,15,15,8,4,8,12,15,15,15,15,15,8,0, + 4,2,0,14,15,11,9,15,15,15,15,15,15,15,15,3, + 0,5,15,15,15,5,0,3,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,12, + 0,0,4,15,15,15,15,15,12,0,12,15,13,3,1,0, + 0,0,5,12,15,15,15,15,15,15,15,12,0,0,7,7, + 0,0,0,0,0,0,0,1,12,15,15,12,3,0,5,15, + 15,15,15,14,5,0,0,0,0,2,2,3,7,14,9,8, + 14,2,1,14,15,2,12,13,15,15,15,15,15,15,15,9, + 0,0,13,15,15,10,0,0,12,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,13, + 0,0,5,15,15,15,15,15,12,0,11,10,1,0,0,1, + 5,14,15,15,15,15,15,15,15,15,15,6,0,2,7,0, + 0,0,0,1,2,7,4,0,3,14,15,15,14,2,0,12, + 15,15,15,9,0,1,2,1,0,0,0,0,0,1,3,7, + 15,3,0,14,15,4,12,15,15,15,15,15,15,15,15,14, + 1,0,8,15,15,14,1,0,8,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,13, + 0,0,4,15,15,15,15,15,12,0,2,0,0,1,10,15, + 15,15,15,15,15,15,15,15,15,15,12,0,0,6,0,0, + 0,1,10,14,15,15,11,1,0,9,15,15,15,8,0,9, + 15,15,12,4,8,14,15,8,1,0,0,0,0,0,1,9, + 15,2,0,13,15,1,9,15,15,15,15,15,15,15,15,15, + 6,0,1,14,15,14,1,0,3,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,14, + 1,0,1,14,15,15,15,15,12,1,3,7,9,13,15,15, + 15,15,15,15,15,15,15,15,15,15,3,0,2,3,0,4, + 0,8,15,15,15,15,15,13,1,2,14,15,15,10,0,6, + 15,14,2,6,15,15,15,1,3,7,3,0,0,0,0,1, + 11,1,0,11,12,0,12,15,15,15,15,15,15,15,15,15, + 11,0,0,9,15,15,4,0,0,12,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 6,0,0,9,15,15,15,15,15,12,14,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,11,0,0,3,0,8,14, + 2,5,15,15,15,15,15,15,5,0,8,15,15,12,0,4, + 15,5,2,14,15,15,10,0,13,15,13,2,4,5,5,0, + 9,1,0,10,9,1,14,15,15,15,15,15,15,15,15,15, + 13,0,0,3,15,15,9,0,0,8,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 12,0,0,3,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,3,0,1,1,5,14,15, + 11,0,12,15,15,15,15,15,14,1,1,14,15,12,0,4, + 10,0,9,15,15,11,1,8,15,15,8,1,14,15,14,2, + 5,0,0,10,6,2,15,15,15,15,15,15,15,15,15,15, + 15,3,0,0,12,15,13,0,0,2,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,3,0,0,10,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,10,0,0,1,0,11,15,15, + 15,2,6,15,15,15,15,15,15,6,0,9,15,13,0,6, + 3,0,13,15,14,2,6,15,15,13,1,8,15,15,15,4, + 3,1,0,10,7,2,15,15,15,15,15,15,15,15,15,15, + 15,9,0,0,6,15,15,3,0,0,13,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,9,0,0,2,14,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,11,10,2,0,3,0,3,15,15,15, + 15,8,1,14,15,15,15,15,15,13,0,2,15,9,1,10, + 0,3,15,15,6,2,14,15,14,3,1,14,15,15,15,2, + 4,0,0,12,5,3,15,15,15,15,15,15,15,15,15,15, + 15,14,1,0,1,14,15,5,0,0,12,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,4,0,0,6,15,15,15,15,15,15,15,15,14,12, + 12,9,5,4,4,3,0,0,0,0,4,0,8,15,15,15, + 15,13,1,10,15,15,15,15,15,15,2,0,11,3,5,10, + 0,7,15,9,1,11,15,15,8,0,6,15,15,15,10,0, + 3,0,0,13,3,6,15,15,15,15,15,15,15,15,15,15, + 15,15,6,0,0,12,15,5,0,0,7,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,13,1,0,0,8,14,15,15,13,6,4,4,1,0, + 0,0,0,0,0,0,2,0,0,4,3,0,12,15,15,15, + 15,15,5,3,15,15,15,15,14,8,0,0,1,1,12,9, + 0,9,10,0,6,15,15,15,2,2,14,15,15,13,2,0, + 4,0,1,13,0,10,15,15,15,15,15,15,15,15,15,15, + 15,15,13,1,0,10,15,10,0,0,5,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,9,0,0,0,3,2,2,1,0,0,0,1,4, + 4,5,10,12,12,12,11,0,0,11,4,0,12,15,15,15, + 15,15,12,0,7,13,15,15,5,0,0,0,1,6,15,9, + 0,3,0,0,1,6,14,10,0,12,15,15,11,2,0,2, + 3,0,3,12,1,11,15,15,15,15,15,15,15,15,15,15, + 15,15,15,3,0,6,8,7,0,0,5,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,9,1,0,0,0,2,6,10,12,12,14,15, + 15,15,15,15,11,5,4,0,2,14,4,0,12,15,15,15, + 15,15,15,4,0,3,13,6,0,0,0,1,2,14,15,12, + 0,0,0,0,0,0,2,2,6,15,14,8,0,0,0,7, + 4,0,4,12,0,12,15,15,15,15,15,15,15,15,15,15, + 15,15,15,12,0,0,0,0,0,0,1,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,12,2,0,0,0,1,6,11,15,15,15, + 15,15,15,15,2,1,0,0,9,15,6,0,7,15,15,15, + 15,15,15,13,2,0,0,0,0,0,0,1,12,15,15,15, + 4,0,0,0,0,0,0,6,13,6,1,0,0,4,13,15, + 6,0,6,12,0,12,15,15,15,15,15,15,15,15,15,15, + 15,15,15,14,5,0,0,0,0,0,5,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,14,5,0,0,0,0,0,2,4,5, + 7,3,6,3,0,2,0,2,15,15,11,0,0,9,15,15, + 15,15,15,15,11,0,0,0,0,0,2,11,15,15,15,15, + 12,1,0,0,1,4,6,10,2,0,0,0,7,14,15,15, + 9,0,9,9,0,12,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,13,9,8,9,7,13,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,12,6,1,0,0,0,0,0, + 0,0,0,2,8,0,0,9,15,15,14,4,0,0,3,10, + 14,15,15,15,15,13,3,0,0,4,14,15,15,15,15,15, + 15,11,2,0,0,1,1,0,0,0,1,11,15,15,15,15, + 9,0,10,5,3,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,14,12,10,5,4,6, + 2,4,10,14,8,0,1,14,15,15,15,14,5,0,0,0, + 1,2,4,4,4,3,1,2,9,14,15,15,15,15,15,15, + 15,15,15,11,11,13,10,9,9,11,15,15,15,15,15,15, + 10,0,8,2,4,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 2,7,15,14,1,0,6,15,15,15,15,15,15,10,6,4, + 2,2,4,4,4,3,9,14,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 11,0,3,1,4,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,11, + 1,10,15,9,0,0,13,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 11,0,11,11,11,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,2, + 5,15,14,2,0,5,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 14,1,13,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,10,1, + 13,15,11,0,0,12,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,5,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,8,1, + 15,15,5,0,3,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,10,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,12,2,3, + 15,14,1,0,7,15,15,15,15,15,13,15,15,15,15,14, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,13,12,12,11,9,4,7,14,15, + 14,13,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,12,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,14,3,0,10, + 15,9,0,0,8,7,4,2,2,1,0,3,4,3,4,9, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,14,13,11,7,4,2,0,0,0,0,0,0,1,12,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,14,13,11,7,4,2,2,13,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,12,0,3,11, + 7,1,0,0,0,0,0,1,4,9,11,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,14,12,11,9,7,4, + 3,1,0,0,0,0,0,0,0,0,0,2,11,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,13,11,8, + 4,3,1,0,0,0,0,3,8,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,14,11,3,0,0,0, + 0,0,0,2,6,9,12,14,15,15,15,15,15,15,15,15, + 15,15,15,15,15,13,9,6,3,1,0,0,0,0,0,0, + 0,0,0,0,1,4,7,11,12,12,12,14,15,15,15,15, + 15,15,15,15,15,15,15,14,12,11,7,4,2,0,0,0, + 0,0,0,1,5,10,13,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,14,12,7,3,1,0,0,0,2,5, + 2,0,2,14,15,15,15,15,15,15,15,15,15,14,13,12, + 11,9,6,4,2,0,0,0,0,0,0,0,0,1,2,4, + 5,9,11,13,15,15,15,15,15,15,15,15,15,15,15,15, + 15,14,12,11,7,4,3,1,0,0,0,0,0,0,0,1, + 4,5,10,14,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,13,10,5,1,0,0,0,1,0,0,2,13,14, + 1,0,8,15,15,14,12,11,9,8,4,3,2,1,0,0, + 0,0,0,0,1,3,2,3,5,9,10,12,13,14,15,15, + 15,15,15,15,15,15,15,15,15,15,15,13,11,10,6,4, + 3,1,0,0,0,0,0,0,0,0,1,4,7,11,13,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,11,4,0,0,0,1,4,9,13,13,1,0,0,1,7, + 0,0,7,8,5,2,0,0,0,0,0,0,1,2,3,4, + 5,9,10,12,14,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,14,11,8,4,3,1,0,0,0,0,0, + 0,0,0,0,1,4,5,9,12,13,15,15,15,15,15,15, + 15,15,14,12,9,8,8,7,4,2,5,4,5,5,12,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,14,10,5, + 1,0,1,3,6,11,14,15,15,15,15,13,12,8,3,2, + 0,0,1,1,3,3,4,5,8,10,12,13,14,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,13, + 11,9,6,4,2,1,0,0,0,0,0,0,0,1,2,4, + 6,10,11,13,15,15,15,15,15,15,15,15,13,11,9,7, + 4,2,1,0,0,0,0,2,4,7,12,14,14,14,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,10,5,1,1,3, + 8,12,14,15,15,15,15,15,15,15,15,15,15,15,15,9, + 3,11,14,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,8,6,9,9,9,9,9,8,5,4,4,3,1,0, + 0,0,0,0,1,2,3,2,4,5,9,11,12,14,15,15, + 15,15,15,15,15,15,15,14,12,9,5,2,0,0,0,0, + 0,1,2,4,7,10,14,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,14,9,4,1,3,9,13,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,13, + 11,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,13,3,1,1,1,1,1,1,1,0,0,0,0,2,3, + 5,8,10,12,14,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,12,5,2,0,0,0,1,3,4,7,10, + 12,13,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,13,11,13,13,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,14,12,12,12,13,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,8,1,0,1,4,7,11,13,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,13,7,8,11,14,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15 + }; diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/motif_goom2.h kodi-visualization-goom-2.1.0/lib/goom/src/motif_goom2.h --- kodi-visualization-goom-1.1.0/lib/goom/src/motif_goom2.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/motif_goom2.h 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,1026 @@ +static Motif CONV_MOTIF2 = { + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,12,5,14, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,12,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,10,1,14, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,10,0,12,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,6,0,12, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,7,0,8,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,13,2,0,10, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,6,0,2,14,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,5,0,0,10, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,9,0,0,12,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,14,9,0,0,1,14, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,8,0,0,8,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,14,8,3,0,0,0,9,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,11,0,0,2,14,15,15,15,15,15,15,15,15,15,15, + 15,15,15,13,9,5,3,4,1,0,0,0,0,7,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,14,4,0,0,4,11,13,13,15,15,14,12,10,8,5, + 6,4,1,0,0,0,0,0,0,0,0,0,0,14,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,12,1,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,9,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 13,9,10,13,14,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,12,3,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,2,5,6,0,0,0,0,12,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 5,0,0,0,3,10,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,14,9,2,1,0,0,0,1,4,6,6,1, + 0,0,0,8,13,15,15,15,12,1,0,2,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,14, + 2,0,0,0,0,0,4,12,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,3,0,0,10,15,15,15,10, + 0,0,4,15,15,15,15,15,15,2,0,6,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,5, + 3,11,5,0,0,0,0,0,4,11,14,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,7,0,0,13,15,15,15,11, + 0,0,7,15,15,15,15,15,15,1,0,9,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,9,0, + 13,15,15,12,5,0,0,0,0,0,1,8,14,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,7,0,1,14,15,15,15,11, + 0,0,7,15,15,15,15,15,14,0,0,9,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,11,1,10, + 15,15,15,15,15,11,5,0,0,0,0,0,1,6,13,15, + 15,15,15,15,14,8,11,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,6,0,2,15,15,15,15,11, + 0,0,6,15,15,15,15,15,13,0,0,11,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,11,1,6,15, + 15,15,15,15,15,15,15,14,5,0,0,0,0,0,0,6, + 14,15,15,15,6,0,4,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,7,0,5,15,15,15,15,11, + 0,0,5,15,15,15,15,15,12,0,0,12,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,13,2,1,13,15, + 15,15,15,15,15,15,15,15,15,12,2,0,0,0,0,0, + 1,6,11,7,0,0,4,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,7,0,7,15,15,15,15,11, + 0,0,6,15,15,15,15,15,12,0,0,12,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,5,0,7,15,15, + 15,15,15,15,15,15,15,15,15,15,15,11,5,0,0,0, + 0,0,0,0,0,1,11,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,7,0,10,15,15,15,15,11, + 0,0,6,15,15,15,15,15,12,0,0,12,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,10,0,4,14,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,13,7,0, + 0,0,0,0,0,1,6,12,14,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,7,0,10,15,15,15,15,11, + 0,0,7,15,15,15,15,15,12,0,0,12,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,13,1,1,12,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,13, + 5,0,0,0,0,0,0,0,3,10,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,7,0,10,15,15,15,15,11, + 0,0,7,15,15,15,15,15,11,0,0,13,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,14,4,0,8,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 13,0,0,0,1,0,0,0,0,1,13,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,7,0,10,15,15,15,15,11, + 0,0,8,15,15,15,15,15,8,0,2,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,9,0,4,14,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,14, + 4,0,0,5,13,12,6,2,0,2,13,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,7,0,10,15,15,15,15,11, + 0,0,7,15,15,15,15,15,4,0,4,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,13,1,1,13,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,11, + 0,0,1,13,15,15,15,14,9,13,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,5,0,6,15,15,15,15,11, + 0,0,8,15,15,15,15,15,2,0,8,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,5,0,9,15,15,15,15,15,15, + 15,15,15,15,15,15,14,11,15,15,15,15,15,15,15,9, + 0,0,10,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,4,0,4,15,15,15,15,11, + 0,0,7,15,15,15,15,13,0,0,11,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,10,0,3,14,15,15,15,15,15,15, + 15,15,15,15,15,14,3,0,13,15,15,15,15,15,15,14, + 9,11,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,4,0,4,15,15,15,15,11, + 0,0,8,15,15,15,15,12,0,0,12,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,14,2,1,12,15,15,15,15,15,15,15, + 15,15,15,15,14,3,0,0,9,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,6,0,3,15,15,15,15,13, + 1,0,8,15,15,15,15,12,0,0,12,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,9,0,5,15,15,15,15,15,15,15,15, + 15,15,15,14,4,0,0,0,10,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,8,0,2,15,15,15,15,15, + 3,0,13,15,15,15,15,12,0,0,12,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,13,2,1,12,15,15,15,15,15,15,15,15, + 15,15,15,7,0,0,0,0,8,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,10,0,1,14,15,15,15,15, + 11,5,15,15,15,15,15,12,0,0,11,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,6,0,7,15,15,15,15,15,15,15,15,15, + 15,15,8,0,0,0,0,0,0,9,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,12,0,0,12,15,15,15,15, + 15,14,15,15,15,15,15,10,0,0,12,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,13,1,2,14,15,15,15,15,15,15,15,15,15, + 15,10,0,0,0,6,6,0,0,0,5,12,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,12,12, + 15,15,15,15,15,15,15,15,13,0,0,11,15,15,15,15, + 15,15,15,15,15,15,15,9,0,1,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,7,0,8,15,15,15,15,15,15,15,15,15,15, + 15,9,0,0,4,15,15,8,0,0,0,1,5,13,15,15, + 15,15,15,15,15,15,15,15,15,15,12,8,7,6,5,3, + 3,3,4,12,15,15,15,15,15,15,15,15,15,7,0,6, + 15,15,15,15,15,15,15,15,14,1,0,10,15,15,15,15, + 15,15,15,15,15,15,15,6,0,3,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,13,1,0,13,15,15,15,15,15,15,15,15,15,15, + 15,14,7,8,13,15,15,15,11,2,0,0,0,0,5,11, + 15,15,15,15,15,15,15,15,13,3,0,0,0,0,0,0, + 0,0,0,5,15,15,15,15,15,15,15,15,12,1,0,0, + 3,11,15,15,15,15,15,15,13,1,0,10,15,15,15,15, + 15,15,15,15,15,15,15,3,0,5,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,9,0,5,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,14,8,1,0,0,0,0, + 4,12,15,15,15,15,15,15,4,0,0,0,0,0,0,0, + 0,0,0,2,15,15,15,15,15,15,15,14,4,0,0,0, + 0,0,9,15,15,15,15,15,14,1,0,10,15,15,15,15, + 15,15,15,15,15,15,15,2,0,9,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,14,4,0,11,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,14,8,2,0,0, + 0,0,4,10,14,15,15,15,4,0,0,0,0,0,0,0, + 0,0,0,3,15,15,15,15,15,15,15,6,0,0,0,2, + 3,0,0,8,15,15,15,15,14,1,0,10,15,15,15,15, + 15,15,15,15,15,15,15,1,0,9,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 14,5,0,4,14,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,14,9,3, + 0,0,0,0,2,5,10,15,5,0,1,11,11,12,13,15, + 11,0,0,7,15,15,15,15,15,15,8,0,0,0,1,12, + 14,6,0,0,7,14,15,15,14,1,0,9,15,15,15,15, + 15,15,15,15,15,15,15,2,0,10,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 9,0,1,13,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,14, + 10,2,0,0,0,0,1,14,4,0,1,14,15,15,15,15, + 9,0,0,9,15,15,15,15,15,9,0,0,0,0,9,15, + 15,15,7,0,0,6,14,15,15,3,0,6,15,15,15,15, + 15,15,15,15,15,15,15,1,0,9,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,9, + 0,0,1,10,14,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,13,1,0,0,0,1,14,3,0,0,14,15,15,15,15, + 5,0,0,11,15,15,15,15,13,1,0,0,0,6,15,15, + 15,15,15,8,0,0,2,10,15,6,0,3,15,15,15,15, + 15,15,15,15,15,15,15,2,0,10,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,13,1, + 0,0,0,0,3,9,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,6,1,0,0,0,8,15,1,0,0,14,15,15,15,15, + 4,0,0,13,15,15,15,14,4,0,0,0,3,14,15,15, + 15,15,15,15,5,0,0,1,14,9,0,1,14,15,15,15, + 15,15,15,15,15,15,15,1,0,9,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,13,1, + 0,0,0,0,0,0,4,12,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 9,0,0,0,0,7,15,15,1,0,0,14,15,15,15,14, + 2,0,1,14,15,15,15,12,0,0,0,3,13,15,15,15, + 15,15,15,9,0,0,0,1,14,12,0,0,12,15,15,15, + 15,15,15,15,15,15,14,1,0,10,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,12, + 3,0,0,0,0,0,0,1,8,14,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,9, + 0,0,0,0,7,15,15,15,1,0,0,14,15,15,15,13, + 0,0,1,15,15,15,15,12,0,0,0,6,14,15,15,15, + 15,15,12,0,0,0,0,3,14,12,0,0,12,15,15,15, + 15,15,15,15,15,15,12,0,0,12,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,13,3,0,0,0,0,0,0,1,6,13,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,12,0, + 0,0,0,3,15,15,15,12,0,0,0,14,15,15,15,11, + 0,0,3,15,15,15,15,15,12,7,0,0,4,14,15,15, + 15,11,1,0,0,0,4,13,15,12,0,0,12,15,15,15, + 15,15,15,15,15,15,10,0,1,14,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,12,7,0,0,0,0,0,0,0,3,8,12,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,4,0, + 0,0,1,13,15,15,15,6,0,0,0,14,15,15,15,8, + 0,0,7,15,15,15,15,15,15,15,8,1,0,2,13,15, + 14,2,0,0,0,4,14,15,15,13,1,0,10,15,15,15, + 15,15,15,15,15,15,9,0,2,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,11,6,2,0,0,0,0,0,0,0,1, + 10,15,15,15,15,15,15,15,15,15,15,15,15,8,0,0, + 0,0,10,15,15,15,15,4,0,0,1,15,15,15,15,4, + 0,0,8,15,15,15,15,15,15,15,15,10,1,0,1,8, + 2,0,0,0,5,15,15,15,15,15,2,0,6,15,15,15, + 15,15,15,15,15,15,9,0,1,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,9,1,0,0,0,0,0,0, + 0,1,7,13,14,15,15,15,15,15,15,15,9,0,0,0, + 0,6,15,15,15,15,15,4,0,0,4,15,15,15,14,1, + 0,0,9,15,15,15,15,15,15,15,15,15,12,2,0,0, + 0,0,0,4,14,15,15,15,15,15,4,0,4,15,15,15, + 15,15,15,15,15,15,7,0,0,14,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,14,11,6,2,0,0,0, + 0,0,0,0,1,9,12,15,15,15,15,14,3,0,0,0, + 4,15,15,15,15,15,15,4,0,0,3,6,4,4,2,0, + 0,0,13,15,15,15,15,15,15,15,15,15,15,12,1,0, + 0,0,3,14,15,15,15,15,15,15,4,0,4,15,15,15, + 15,15,15,15,15,15,5,0,0,12,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,8,2,0, + 0,0,0,0,0,0,0,1,9,15,15,5,0,0,0,0, + 12,15,15,15,15,15,15,4,0,0,0,0,0,0,0,0, + 0,3,15,15,15,15,15,15,15,15,15,15,15,14,4,0, + 0,1,12,15,15,15,15,15,15,15,6,0,1,14,15,15, + 15,15,15,15,15,15,5,0,0,13,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,12, + 7,1,0,0,0,0,0,0,0,5,7,0,0,0,0,10, + 15,15,15,15,15,15,15,7,0,0,0,0,0,0,0,0, + 1,10,15,15,15,15,15,15,15,15,15,15,15,14,3,0, + 3,12,15,15,15,15,15,15,15,15,12,0,0,12,15,15, + 15,15,15,15,15,15,5,0,0,1,1,4,11,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,11,6,1,0,0,0,0,0,0,0,0,0,7,15, + 15,15,15,15,15,15,15,14,7,4,4,4,5,9,12,13, + 14,15,15,15,15,15,15,15,15,15,15,15,15,15,11,9, + 14,15,15,14,12,11,11,11,10,9,7,0,0,5,13,15, + 15,15,15,15,15,12,1,0,0,0,0,0,0,10,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,14,7,1,0,0,0,0,0,3,14,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,13,2,0,0,0,0,0,0,0,0,0,0,0,8, + 15,15,15,15,15,11,0,0,0,0,0,0,0,9,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,13,5,0,0,0,0,12,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,8,0,0,0,0,0,0,0,0,0,0,0,0,5, + 15,15,15,15,15,15,10,5,6,7,7,7,9,14,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,8,3,2,2,2,2,5,14,15, + 15,15,15,15,15,15,15,15,15,10,3,0,6,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,13,3,1,0,1,0,1,1,2,4,4,3,9,14, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,12,4,0,1,6,7,7,4,1,3,13, + 15,15,15,15,15,15,15,15,15,15,14,10,13,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,11,11,15,15,15,15, + 15,15,15,14,14,14,14,14,14,14,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,14,2,0,4,13,15,15,15,15,10,0,12, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,14,13,14,12,12,12,12,12,12,12, + 12,14,15,15,15,15,15,15,15,15,4,14,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,7,1,5,14,15,15,15,15,15,12,1,11, + 15,15,15,13,12,13,15,15,14,11,13,15,15,15,15,15, + 15,15,15,11,6,3,1,1,1,0,0,0,0,0,0,0, + 0,1,4,7,11,14,15,15,15,14,4,15,13,10,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,14,7,4,5, + 12,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,13,1,1,14,15,15,14,10,12,15,11,1,12, + 15,15,11,1,0,4,15,15,6,0,2,14,15,15,15,15, + 15,15,14,8,6,3,3,2,2,1,0,0,0,0,0,0, + 0,0,0,0,0,3,11,15,15,11,8,15,12,6,15,9, + 8,15,15,15,15,15,15,15,15,15,15,15,10,4,4,1, + 4,15,15,15,15,11,6,2,8,14,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,12,0,4,15,15,15,11,2,10,15,9,1,13, + 15,13,1,7,6,2,14,14,1,2,1,14,15,15,15,15, + 15,15,15,15,15,15,15,15,15,13,12,12,12,12,12,12, + 11,11,11,10,9,10,12,15,15,6,7,15,9,4,15,4, + 1,14,15,15,15,15,15,15,15,15,15,15,2,11,15,4, + 4,15,15,15,15,3,9,4,0,9,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,12,0,4,15,15,15,5,0,6,6,1,9,15, + 15,4,1,13,10,1,13,9,2,7,1,14,14,14,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,3,5,15,3,5,14,1, + 0,12,13,9,14,15,15,15,15,15,15,15,2,2,4,1, + 6,15,15,15,14,1,5,6,0,9,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,12,0,4,15,15,15,12,4,2,2,10,15,15, + 11,0,6,15,12,0,10,7,9,10,1,14,7,14,15,15, + 15,15,15,15,15,15,13,12,11,11,10,9,9,10,11,13, + 15,15,15,15,15,15,15,15,15,1,9,15,2,7,14,1, + 0,10,7,0,8,15,15,15,15,15,15,15,11,4,4,4, + 13,15,15,15,15,10,2,2,4,14,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,12,0,4,15,15,15,15,15,15,15,15,15,15, + 4,2,14,15,15,1,9,5,14,9,1,14,8,14,15,15, + 15,15,15,15,15,10,3,0,1,0,0,0,0,0,0,5, + 15,15,15,15,15,15,15,15,15,1,9,14,1,8,14,1, + 0,11,13,6,11,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,14,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,12,0,4,15,15,15,15,15,15,15,15,15,11, + 0,6,15,15,15,1,5,3,13,10,0,6,8,15,15,15, + 15,15,15,15,15,15,13,12,12,11,10,9,9,10,11,13, + 15,15,15,15,15,15,15,15,15,1,9,12,1,11,15,4, + 1,14,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 14,10,4,2,12,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,12,1,3,14,15,15,15,15,15,15,15,15,4, + 3,14,15,15,15,5,1,8,15,14,5,2,9,15,15,15, + 15,15,15,15,15,15,15,15,15,11,9,13,15,15,15,15, + 15,15,15,15,15,15,15,15,15,1,9,12,1,12,15,13, + 11,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 10,2,9,2,3,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,14,4,0,5,14,15,15,15,15,15,15,11,0, + 6,15,15,15,15,15,14,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,8,1,0,3,15,15,15,15, + 15,15,15,15,15,15,15,15,15,1,9,15,11,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 7,1,12,6,1,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,11,1,0,3,8,9,9,10,11,9,5,4, + 13,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,12,9,13,15,15,15,15, + 15,15,15,15,15,15,15,15,15,5,11,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 10,3,4,1,5,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,12,2,0,0,0,0,0,0,1,8,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,14,12,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,13,8,8,10,9,10,11,14,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15 + }; diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/plugin_info.c kodi-visualization-goom-2.1.0/lib/goom/src/plugin_info.c --- kodi-visualization-goom-1.1.0/lib/goom/src/plugin_info.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/plugin_info.c 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,203 @@ +#include "goom.h" +#include "goom_plugin_info.h" +#include "goom_fx.h" +#include "cpu_info.h" +#include "default_scripts.h" +#include "drawmethods.h" +#include +#include + + +#ifdef CPU_POWERPC +#include +#include +#include "ppc_zoom_ultimate.h" +#include "ppc_drawings.h" +#endif /* CPU_POWERPC */ + + +#ifdef CPU_X86 +#include "mmx.h" +#endif /* CPU_X86 */ + + + +static void setOptimizedMethods(PluginInfo *p) { + + unsigned int cpuFlavour = cpu_flavour(); + + /* set default methods */ + p->methods.draw_line = draw_line; + p->methods.zoom_filter = zoom_filter_c; +/* p->methods.create_output_with_brightness = create_output_with_brightness;*/ + +#ifdef CPU_X86 + if (cpuFlavour & CPU_OPTION_XMMX) { +#ifdef VERBOSE + printf ("Extented MMX detected. Using the fastest methods !\n"); +#endif + p->methods.draw_line = draw_line_mmx; + p->methods.zoom_filter = zoom_filter_xmmx; + } + else if (cpuFlavour & CPU_OPTION_MMX) { +#ifdef VERBOSE + printf ("MMX detected. Using fast methods !\n"); +#endif + p->methods.draw_line = draw_line_mmx; + p->methods.zoom_filter = zoom_filter_mmx; + } +#ifdef VERBOSE + else + printf ("Too bad ! No SIMD optimization available for your CPU.\n"); +#endif +#endif /* CPU_X86 */ + +#ifdef CPU_POWERPC + + if ((cpuFlavour & CPU_OPTION_64_BITS) != 0) { +/* p->methods.create_output_with_brightness = ppc_brightness_G5; */ + p->methods.zoom_filter = ppc_zoom_generic; + } + else if ((cpuFlavour & CPU_OPTION_ALTIVEC) != 0) { +/* p->methods.create_output_with_brightness = ppc_brightness_G4; */ + p->methods.zoom_filter = ppc_zoom_G4; + } + else + { +/* p->methods.create_output_with_brightness = ppc_brightness_generic;*/ + p->methods.zoom_filter = ppc_zoom_generic; + } +#endif /* CPU_POWERPC */ + +} + +void plugin_info_init(PluginInfo *pp, int nbVisuals) { + + PluginInfo p; + int i; + + p.sound.speedvar = p.sound.accelvar = p.sound.totalgoom = 0; + p.sound.prov_max = 0; + p.sound.goom_limit = 1; + p.sound.allTimesMax = 1; + + p.sound.volume_p = secure_f_feedback("Sound Volume"); + p.sound.accel_p = secure_f_feedback("Sound Acceleration"); + p.sound.speed_p = secure_f_feedback("Sound Speed"); + p.sound.goom_limit_p = secure_f_feedback("Goom Limit"); + p.sound.last_goom_p = secure_f_feedback("Goom Detection"); + p.sound.last_biggoom_p = secure_f_feedback("Big Goom Detection"); + p.sound.goom_power_p = secure_f_feedback("Goom Power"); + + p.sound.biggoom_speed_limit_p = secure_i_param("Big Goom Speed Limit"); + IVAL(p.sound.biggoom_speed_limit_p) = 10; + IMIN(p.sound.biggoom_speed_limit_p) = 0; + IMAX(p.sound.biggoom_speed_limit_p) = 100; + ISTEP(p.sound.biggoom_speed_limit_p) = 1; + + p.sound.biggoom_factor_p = secure_i_param("Big Goom Factor"); + IVAL(p.sound.biggoom_factor_p) = 10; + IMIN(p.sound.biggoom_factor_p) = 0; + IMAX(p.sound.biggoom_factor_p) = 100; + ISTEP(p.sound.biggoom_factor_p) = 1; + + p.sound.params = plugin_parameters ("Sound", 11); + + p.nbParams = 0; + p.nbVisuals = nbVisuals; + p.visuals = (VisualFX**)malloc(sizeof(VisualFX*)*nbVisuals); + + *pp = p; + pp->sound.params.params[0] = &pp->sound.biggoom_speed_limit_p; + pp->sound.params.params[1] = &pp->sound.biggoom_factor_p; + pp->sound.params.params[2] = 0; + pp->sound.params.params[3] = &pp->sound.volume_p; + pp->sound.params.params[4] = &pp->sound.accel_p; + pp->sound.params.params[5] = &pp->sound.speed_p; + pp->sound.params.params[6] = 0; + pp->sound.params.params[7] = &pp->sound.goom_limit_p; + pp->sound.params.params[8] = &pp->sound.goom_power_p; + pp->sound.params.params[9] = &pp->sound.last_goom_p; + pp->sound.params.params[10] = &pp->sound.last_biggoom_p; + + pp->statesNumber = 8; + pp->statesRangeMax = 510; + { + GoomState states[8] = { + {1,0,0,1,4, 0, 100}, + {1,0,0,0,1, 101, 140}, + {1,0,0,1,2, 141, 200}, + {0,1,0,1,2, 201, 260}, + {0,1,0,1,0, 261, 330}, + {0,1,1,1,4, 331, 400}, + {0,0,1,0,5, 401, 450}, + {0,0,1,1,1, 451, 510}}; + for (i=0;i<8;++i) + pp->states[i] = states[i]; + } + pp->curGState = &(pp->states[6]); + + /* datas for the update loop */ + pp->update.lockvar = 0; + pp->update.goomvar = 0; + pp->update.loopvar = 0; + pp->update.stop_lines = 0; + pp->update.ifs_incr = 1; /* dessiner l'ifs (0 = non: > = increment) */ + pp->update.decay_ifs = 0; /* disparition de l'ifs */ + pp->update.recay_ifs = 0; /* dedisparition de l'ifs */ + pp->update.cyclesSinceLastChange = 0; + pp->update.drawLinesDuration = 80; + pp->update.lineMode= pp->update.drawLinesDuration; + + pp->update.switchMultAmount = (29.0f/30.0f); + pp->update.switchIncrAmount = 0x7f; + pp->update.switchMult = 1.0f; + pp->update.switchIncr = pp->update.switchIncrAmount; + + pp->update.stateSelectionRnd = 0; + pp->update.stateSelectionBlocker = 0; + pp->update.previousZoomSpeed = 128; + pp->update.timeOfTitleDisplay = 0; + + pp->update_message.affiche = 0; + + { + ZoomFilterData zfd = { + 127, 8, 16, + 1, 1, 0, NORMAL_MODE, + 0, 0, 0, 0, 0 + }; + pp->update.zoomFilterData = zfd; + } + + setOptimizedMethods(pp); + + pp->scanner = gsl_new(); + pp->main_scanner = gsl_new(); + pp->main_script_str = GOOM_MAIN_SCRIPT; + + for (i = 0; i < 0xffff; i++) { + pp->sintable[i] = (int) (1024 * sin ((double) i * 360 / (sizeof (pp->sintable) / sizeof (pp->sintable[0]) - 1) * 3.141592 / 180) + .5); + /* sintable [us] = (int)(1024.0f * sin (us*2*3.31415f/0xffff)) ; */ + } +} + +void plugin_info_add_visual(PluginInfo *p, int i, VisualFX *visual) { + p->visuals[i] = visual; + if (i == p->nbVisuals-1) { + ++i; + p->nbParams = 1; + while (i--) { + if (p->visuals[i]->params) + p->nbParams++; + } + p->params = (PluginParameters *)malloc(sizeof(PluginParameters)*p->nbParams); + i = p->nbVisuals; + p->nbParams = 1; + p->params[0] = p->sound.params; + while (i--) { + if (p->visuals[i]->params) + p->params[p->nbParams++] = *(p->visuals[i]->params); + } + } +} diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/pngload.c kodi-visualization-goom-2.1.0/lib/goom/src/pngload.c --- kodi-visualization-goom-1.1.0/lib/goom/src/pngload.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/pngload.c 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,141 @@ +#include + +int +loadpng (char *file_name, int *w, int *h, unsigned int ***buf) +{ + FILE *fp; + png_uint_32 width, height; + int bit_depth, + + color_type, interlace_type, compression_type, filter_type; + int rowbytes; + + png_structp png_ptr; + png_infop info_ptr; + png_infop end_info; + + int x, y; + unsigned int **row_pointers; + + /* OUVERTURE DU FICHIER */ + + fp = fopen (file_name, "rb"); + + if (!fp) { + // fprintf (stderr, "Couldn't open file\n"); + return 1; + } + + /* CREATION DES STRUCTURES */ + png_ptr = png_create_read_struct + (PNG_LIBPNG_VER_STRING, (png_voidp) NULL, NULL, NULL); + if (!png_ptr) { + fprintf (stderr, "Memory error\n"); + return 1; + } + + info_ptr = png_create_info_struct (png_ptr); + if (!info_ptr) { + png_destroy_read_struct (&png_ptr, (png_infopp) NULL, (png_infopp) NULL); + fprintf (stderr, "Read error 1\n"); + return 1; + } + + end_info = png_create_info_struct (png_ptr); + if (!end_info) { + png_destroy_read_struct (&png_ptr, &info_ptr, (png_infopp) NULL); + fprintf (stderr, "Read error 2\n"); + return 1; + } + + /* CHARGEMENT DE L'IMAGE */ + if (setjmp (png_ptr->jmpbuf)) { + png_destroy_read_struct (&png_ptr, &info_ptr, &end_info); + fclose (fp); + fprintf (stderr, "Erreur de chargement\n"); + return 1; + } + + png_init_io (png_ptr, fp); + png_set_read_status_fn (png_ptr, NULL); + + png_read_info (png_ptr, info_ptr); + + png_get_IHDR (png_ptr, info_ptr, &width, &height, + &bit_depth, &color_type, &interlace_type, + &compression_type, &filter_type); +/* + printf ("taille : %dx%d\n",width,height); + printf ("depth : %d\n",bit_depth); + printf ("color type : "); + switch (color_type) { + case PNG_COLOR_TYPE_GRAY: + printf ("PNG_COLOR_TYPE_GRAY (bit depths 1, 2, 4, 8, 16)\n"); + break; + case PNG_COLOR_TYPE_GRAY_ALPHA: + printf ("PNG_COLOR_TYPE_GRAY_ALPHA (bit depths 8, 16)\n"); + break; + case PNG_COLOR_TYPE_PALETTE: + printf ("PNG_COLOR_TYPE_PALETTE (bit depths 1, 2, 4, 8)\n"); + break; + case PNG_COLOR_TYPE_RGB: + printf ("PNG_COLOR_TYPE_RGB (bit_depths 8, 16)\n"); + break; + case PNG_COLOR_TYPE_RGB_ALPHA: + printf ("PNG_COLOR_TYPE_RGB_ALPHA (bit_depths 8, 16)\n"); + break; + } + */ + // printf ("PNG_COLOR_MASK_ALPHA : %x\n", PNG_COLOR_MASK_ALPHA); + // printf ("PNG_COLOR_MASK_COLOR : %x\n", PNG_COLOR_MASK_COLOR); + // printf ("PNG_COLOR_MASK_PALETTE : %x\n", PNG_COLOR_MASK_PALETTE); + + if (color_type == PNG_COLOR_TYPE_PALETTE && bit_depth <= 8) + png_set_palette_to_rgb (png_ptr); + + if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8) + png_set_expand_gray_1_2_4_to_8 (png_ptr); + else if (color_type == PNG_COLOR_TYPE_GRAY || + color_type == PNG_COLOR_TYPE_GRAY_ALPHA) + png_set_gray_to_rgb (png_ptr); + + if (png_get_valid (png_ptr, info_ptr, PNG_INFO_tRNS)) + png_set_tRNS_to_alpha (png_ptr); + + png_read_update_info (png_ptr, info_ptr); + +// printf ("channels : %d\n", png_get_channels (png_ptr, info_ptr)); + rowbytes = png_get_rowbytes (png_ptr, info_ptr); +// printf ("rowbytes : %d\n", rowbytes); + + row_pointers = (unsigned int **) malloc (height * sizeof (unsigned int *)); + + for (y = 0; y < height; y++) + row_pointers[y] = (unsigned int *) malloc (4 * width); + png_read_image (png_ptr, (png_bytepp) row_pointers); + + // for (y=0;y unsigned int * frompixmap +; r4 <=> unsigned int * topixmap +; r5 <=> unsigned int sizeX (in pixels) +; r6 <=> unsigned int sizeY (in pixels) +; r7 <=> unsigned int * brutS +; r8 <=> unsigned int * brutD +; r9 <=> unsigned int buffratio +; r10 <=> int [16][16] precalccoeffs + +; globals after init +; r3 <=> frompixmap - 1 byte needed for preincremental fetch (replaces r3) +; r4 <=> topixmap - 1 byte needed for preincremental fetch (replaces r4) +; r5 <=> ax = x max in 16th of pixels (replaces old r5) +; r6 <=> ay = y max in 16th of pixels (replaces old r6) +; r20 <=> row size in bytes +; r12 <=> 0xFF00FF (mask for parallel 32 bits pixs computing) +; r30 <=> brutS - 1 byte needed for preincremental fetch (replaces r7) +; r31 <=> brutD - 1 byte needed for preincremental fetch (replaces r8) + +; ABI notes : +; r1 is the Stack Pointer (SP) => Do not use +; r13..r31 are non-volatiles => Do not use + +_ppc_zoom_generic: + +; Saves the used non volatile registers in the Mach-O stack s Red-Zone +stmw r18,-56(r1) + +; init +li r18,0 ; Default value if out of range : 0 (Black) +mr r11,r10 +lis r12,0xFF +mullw r2,r5,r6 ; Number of pixels to compute +subi r30,r8,0 +slwi r20,r5,2 +srawi r19,r20,2 +ori r12,r12,0xFF +subi r5,r5,1 +subi r6,r6,1 +mtspr ctr,r2 ; Init the loop count (one loop per pixel computed) +subi r31,r7,0 +subi r4,r4,4 +slwi r5,r5,4 +slwi r6,r6,4 + +;pre init for loop +lwz r2,0(r31) ; px +lwz r29,4(r31) ; py +lwz r8,0(r30) ; px2 +lwz r10,4(r30) ; py2 + +L1: + +; computes dynamically the position to fetch +sub r8,r8,r2 +sub r10,r10,r29 +mullw r8,r8,r9 +addi r31,r31,8 +mullw r10,r10,r9 +addi r30,r30,8 + +srawi r8,r8,16 +srawi r10,r10,16 +add r2,r2,r8 +add r29,r29,r10 + +; if px>ax or py>ay goto outofrange +; computes the attenuation coeffs and the original point address +rlwinm r10,r2,6,28-6,31-6 ; r10 <- (r2 << 2) & 0x000002D0 (r10=(r2%16)*4*16) +cmpl cr6,0,r2,r5 +rlwimi r10, r29, 2, 28-2, 31-2 ; r10 <- ((r29 << 2) & 0x0000002D) | (r10 & !0x0000002D) (r10=(r10%16)*4 | r10) +cmpl cr7,0,r29,r6 +srawi r29,r29,4 ; pos computing +bge- cr6,L4 +srawi r2,r2,4 ; pos computing +mullw r29, r29,r19 ; pos computing +bge- cr7,L4 + +; Channels notation : 00112233 (AARRVVBB) + +add r2,r2,r29 ; pos computing +lwzx r10,r11,r10 ; Loads coefs +slwi r2,r2,2 ; pos computing +add r2,r2,r3 ; pos computing +rlwinm r21,r10,0,24,31 ; Isolates coef1 (??????11 -> 00000011) +lwz r25,0(r2) ; Loads col1 -> r25 +lwz r26,4(r2) ; Loads col2 -> r26 +rlwinm r22,r10,24,24,31 ; Isolates coef2 (????22?? -> 00000022) +rlwinm r23,r10,16,24,31 ; Isolates coef3 (??33???? -> 00000033) +add r2,r2,r20 ; Adds one line for future load of col3 and col4 +and r8, r25,r12 ; Masks col1 channels 1 & 3 : 0x00XX00XX +rlwinm r24,r10,8,24,31 ; Isolates coef4 (44?????? -> 00000044) +andi. r25,r25,0xFF00 ; Masks col1 channel 2 : 0x0000XX00 +mullw r8, r8, r21 ; Applies coef1 on col1 channels 1 & 3 + + +; computes final pixel color +and r10,r26,r12 ; Masks col2 channels 1 & 3 : 0x00XX00XX +lwz r27,0(r2) ; Loads col3 -> r27 +mullw r10,r10,r22 ; Applies coef2 on col2 channels 1 & 3 +mullw r25,r25,r21 ; Applies coef1 on col1 channel 2 +andi. r29,r26,0xFF00 ; Masks col2 channel 2 : 0x0000XX00 +mullw r29,r29,r22 ; Applies coef2 on col2 channel 2 +lwz r28,4(r2) ; Loads col4 -> r28 +add r8 ,r8 ,r10 ; Adds col1 & col2 channels 1 & 3 +and r10,r27,r12 ; Masks col3 channels 1 & 3 : 0x00XX00XX +add r25,r25,r29 ; Adds col1 & col2 channel 2 +mullw r10,r10,r23 ; Applies coef3 on col3 channels 1 & 3 +andi. r29,r27,0xFF00 ; Masks col3 channel 2 : 0x0000XX00 +mullw r29,r29,r23 ; Applies coef3 on col3 channel 2 +lwz r2,0(r31) ; px +add r7 ,r8 ,r10 ; Adds col3 to (col1 + col2) channels 1 & 3 +and r10,r28,r12 ; Masks col4 channels 1 & 3 : 0x00XX00XX +mullw r10,r10,r24 ; Applies coef4 on col4 channels 1 & 3 +add r25,r25,r29 ; Adds col 3 to (col1 + col2) channel 2 +lwz r8,0(r30) ; px2 +andi. r28,r28,0xFF00 ; Masks col4 channel 2 : 0x0000XX00 +add r7 ,r7 ,r10 ; Adds col4 to (col1 + col2 + col3) channels 1 & 3 +lwz r10,4(r30) ; py2 +mullw r28,r28,r24 ; Applies coef4 on col4 channel 2 +srawi r7, r7, 8 ; (sum of channels 1 & 3) >> 8 +lwz r29,4(r31) ; py +add r25,r25,r28 ; Adds col 4 to (col1 + col2 + col3) channel 2 +rlwimi r7, r25, 24, 16, 23 ; (((sum of channels 2) >> 8 ) & 0x0000FF00) | ((sum of channels 1 and 3) & 0xFFFF00FF) +stwu r7,4(r4) ; Stores the computed pixel +bdnz L1 ; Iterate again if needed +b L3 ;goto end ; If not, returns from the function + + +; if out of range +L4: +stwu r18,4(r4) +lwz r8,0(r30) ; px2 +lwz r10,4(r30) ; py2 +lwz r2,0(r31) ; px +lwz r29,4(r31) ; py +bdnz L1 + + +L3: + +; Restore saved registers and return +lmw r18,-56(r1) +blr + + + + + + + + +_ppc_zoom_G4: + +; Saves the used non volatile registers in the Mach-O stack s Red-Zone +stmw r17,-60(r1) + +; init +li r18,0 ; Default value if out of range : 0 (Black) +mr r11,r10 +lis r12,0xFF +mullw r2,r5,r6 ; Number of pixels to compute +subi r30,r8,0 +slwi r20,r5,2 +srawi r19,r20,2 +ori r12,r12,0xFF +subi r5,r5,1 +subi r6,r6,1 +mtspr ctr,r2 ; Init the loop count (one loop per pixel computed) +subi r31,r7,0 +subi r4,r4,4 +slwi r5,r5,4 +slwi r6,r6,4 + +;pre init for loop +lwz r2,0(r31) ; px +lwz r29,4(r31) ; py +lwz r8,0(r30) ; px2 +lwz r10,4(r30) ; py2 + +;********************* +lis r17,0x0F01 + +L100: + +; computes dynamically the position to fetch +;mullw r8,r8,r29 +;mullw r2,r2,r29 +;add r2,r8,r2 +;srawi r2,r2,17 + +sub r8,r8,r2 +sub r10,r10,r29 +mullw r8,r8,r9 +addi r31,r31,8 +mullw r10,r10,r9 +addi r30,r30,8 + +dst r30,r17,0 + +srawi r8,r8,16 +srawi r10,r10,16 +add r2,r2,r8 +add r29,r29,r10 + +dst r31,r17,1 + +; if px>ax or py>ay goto outofrange +; computes the attenuation coeffs and the original point address +rlwinm r10,r2,6,28-6,31-6 ; r10 <- (r2 << 2) & 0x000002D0 (r10=(r2%16)*4*16) +cmpl cr6,0,r2,r5 +rlwimi r10, r29, 2, 28-2, 31-2 ; r10 <- ((r29 << 2) & 0x0000002D) | (r10 & !0x0000002D) (r10=(r29%16)*4 | r10) +cmpl cr7,0,r29,r6 +srawi r29,r29,4 ; pos computing +bge- cr6,L400 +srawi r2,r2,4 ; pos computing +mullw r29, r29,r19 ; pos computing +bge- cr7,L400 + +; Channels notation : 00112233 (AARRVVBB) + +add r2,r2,r29 ; pos computing +lwzx r10,r11,r10 ; Loads coefs +slwi r2,r2,2 ; pos computing +add r2,r2,r3 ; pos computing +rlwinm r21,r10,0,24,31 ; Isolates coef1 (??????11 -> 00000011) +lwz r25,0(r2) ; Loads col1 -> r25 +lwz r26,4(r2) ; Loads col2 -> r26 +rlwinm r22,r10,24,24,31 ; Isolates coef2 (????22?? -> 00000022) +rlwinm r23,r10,16,24,31 ; Isolates coef3 (??33???? -> 00000033) +add r2,r2,r20 ; Adds one line for future load of col3 and col4 +and r8, r25,r12 ; Masks col1 channels 1 & 3 : 0x00XX00XX +rlwinm r24,r10,8,24,31 ; Isolates coef4 (44?????? -> 00000044) +dst r2,r17,2 +andi. r25,r25,0xFF00 ; Masks col1 channel 2 : 0x0000XX00 +mullw r8, r8, r21 ; Applies coef1 on col1 channels 1 & 3 + + +; computes final pixel color +and r10,r26,r12 ; Masks col2 channels 1 & 3 : 0x00XX00XX +lwz r27,0(r2) ; Loads col3 -> r27 +mullw r10,r10,r22 ; Applies coef2 on col2 channels 1 & 3 +mullw r25,r25,r21 ; Applies coef1 on col1 channel 2 +andi. r29,r26,0xFF00 ; Masks col2 channel 2 : 0x0000XX00 +mullw r29,r29,r22 ; Applies coef2 on col2 channel 2 +lwz r28,4(r2) ; Loads col4 -> r28 +add r8 ,r8 ,r10 ; Adds col1 & col2 channels 1 & 3 +and r10,r27,r12 ; Masks col3 channels 1 & 3 : 0x00XX00XX +add r25,r25,r29 ; Adds col1 & col2 channel 2 +mullw r10,r10,r23 ; Applies coef3 on col3 channels 1 & 3 +andi. r29,r27,0xFF00 ; Masks col3 channel 2 : 0x0000XX00 +mullw r29,r29,r23 ; Applies coef3 on col3 channel 2 +lwz r2,0(r31) ; px +add r7 ,r8 ,r10 ; Adds col3 to (col1 + col2) channels 1 & 3 +and r10,r28,r12 ; Masks col4 channels 1 & 3 : 0x00XX00XX +mullw r10,r10,r24 ; Applies coef4 on col4 channels 1 & 3 +add r25,r25,r29 ; Adds col 3 to (col1 + col2) channel 2 +lwz r8,0(r30) ; px2 +andi. r28,r28,0xFF00 ; Masks col4 channel 2 : 0x0000XX00 +add r7 ,r7 ,r10 ; Adds col4 to (col1 + col2 + col3) channels 1 & 3 +lwz r10,4(r30) ; py2 +mullw r28,r28,r24 ; Applies coef4 on col4 channel 2 +srawi r7, r7, 8 ; (sum of channels 1 & 3) >> 8 +lwz r29,4(r31) ; py +add r25,r25,r28 ; Adds col 4 to (col1 + col2 + col3) channel 2 +rlwimi r7, r25, 24, 16, 23 ; (((sum of channels 2) >> 8 ) & 0x0000FF00) | ((sum of channels 1 and 3) & 0xFFFF00FF) +stwu r7,4(r4) ; Stores the computed pixel +bdnz L100 ; Iterate again if needed +b L300 ;goto end ; If not, returns from the function + + +; if out of range +L400: +stwu r18,4(r4) +lwz r8,0(r30) ; px2 +lwz r10,4(r30) ; py2 +lwz r2,0(r31) ; px +lwz r29,4(r31) ; py +bdnz L100 + + +L300: + +; Restore saved registers and return +lmw r17,-60(r1) +blr diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/powerpc/ppc_doubling.s kodi-visualization-goom-2.1.0/lib/goom/src/powerpc/ppc_doubling.s --- kodi-visualization-goom-1.1.0/lib/goom/src/powerpc/ppc_doubling.s 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/powerpc/ppc_doubling.s 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,50 @@ +.section regular,__TEXT +.globl _ppc_doubling ; name of the function to call by C program + +; width (src width)->r3 +; myx (src) ->r4 +; myX (dest) ->r5 +; myX2 (dest + 1 complete line)->r6 +; heigth (src height)->r7 +; inc (increment for next line in dest) ->r8 + +_ppc_doubling: + +mtspr ctr,r3 + +addi r4,r4,-4 +addi r5,r5,-4 +addi r6,r6,-4 + +1:;boucle: + +lwzu r10,4(r4) +stwu r10,4(r5) +stwu r10,4(r5) +stwu r10,4(r6) +stwu r10,4(r6) + +bdnz 1boucle + +subi r7,r7,1 +add r5,r5,r8 +cmpwi cr1,r7,0 +add r6,r6,r8 +mtspr ctr,r3 +bgt cr1,1boucle + +blr + +;backup + +lwzu r10,4(r4) +stwu r10,4(r5) +stwu r10,4(r6) +stwu r10,4(r5) +stwu r10,4(r6) + +lwzu r10,4(r4) +stwu r10,4(r5) +stwu r10,4(r6) +stwu r10,4(r5) +stwu r10,4(r6) diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/ppc_drawings.h kodi-visualization-goom-2.1.0/lib/goom/src/ppc_drawings.h --- kodi-visualization-goom-1.1.0/lib/goom/src/ppc_drawings.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/ppc_drawings.h 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,18 @@ +/* + * ppc_drawings.h + * Goom + * + * Created by Guillaume Borios on Sun Dec 28 2003. + * Copyright (c) 2003 iOS. All rights reserved. + * + */ + +/* Generic PowerPC Code */ +void ppc_brightness_generic(Pixel *src, Pixel *dest, int size, int coeff); + +/* G4 Specific PowerPC Code (Possible use of Altivec and Data Streams) */ +void ppc_brightness_G4(Pixel *src, Pixel *dest, int size, int coeff); + +/* G5 Specific PowerPC Code (Possible use of Altivec) */ +void ppc_brightness_G5(Pixel *src, Pixel *dest, int size, int coeff); + diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/ppc_drawings.s kodi-visualization-goom-2.1.0/lib/goom/src/ppc_drawings.s --- kodi-visualization-goom-1.1.0/lib/goom/src/ppc_drawings.s 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/ppc_drawings.s 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,381 @@ +; PowerPC optimized drawing methods for Goom +; © 2003 Guillaume Borios +; This Source Code is released under the terms of the General Public License + +; Change log : +; 30 May 2003 : File creation + +; Section definition : We use a read only code section for the whole file +.section __TEXT,__text,regular,pure_instructions + + +; -------------------------------------------------------------------------------------- +; Single 32b pixel drawing macros +; Usage : +; DRAWMETHOD_XXXX_MACRO *pixelIN, *pixelOUT, COLOR, WR1, WR2, WR3, WR4 +; Only the work registers (WR) can be touched by the macros +; +; Available methods : +; DRAWMETHOD_DFLT_MACRO : Default drawing method (Actually OVRW) +; DRAWMETHOD_PLUS_MACRO : RVB Saturated per channel addition (SLOWEST) +; DRAWMETHOD_HALF_MACRO : 50% Transparency color drawing +; DRAWMETHOD_OVRW_MACRO : Direct COLOR drawing (FASTEST) +; DRAWMETHOD_B_OR_MACRO : Bitwise OR +; DRAWMETHOD_BAND_MACRO : Bitwise AND +; DRAWMETHOD_BXOR_MACRO : Bitwise XOR +; DRAWMETHOD_BNOT_MACRO : Bitwise NOT +; -------------------------------------------------------------------------------------- + +.macro DRAWMETHOD_OVRW_MACRO + stw $2,0($1) ;; *$1 <- $2 +.endmacro + +.macro DRAWMETHOD_B_OR_MACRO + lwz $3,0($0) ;; $3 <- *$0 + or $3,$3,$2 ;; $3 <- $3 | $2 + stw $3,0($1) ;; *$1 <- $3 +.endmacro + +.macro DRAWMETHOD_BAND_MACRO + lwz $3,0($0) ;; $3 <- *$0 + and $3,$3,$2 ;; $3 <- $3 & $2 + stw $3,0($1) ;; *$1 <- $3 +.endmacro + +.macro DRAWMETHOD_BXOR_MACRO + lwz $3,0($0) ;; $3 <- *$0 + xor $3,$3,$2 ;; $3 <- $3 ^ $2 + stw $3,0($1) ;; *$1 <- $3 +.endmacro + +.macro DRAWMETHOD_BNOT_MACRO + lwz $3,0($0) ;; $3 <- *$0 + nand $3,$3,$3 ;; $3 <- ~$3 + stw $3,0($1) ;; *$1 <- $3 +.endmacro + +.macro DRAWMETHOD_PLUS_MACRO + lwz $4,0($0) ;; $4 <- *$0 + andi. $3,$4,0xFF00 ;; $3 <- $4 & 0x0000FF00 + andi. $5,$2,0xFF00 ;; $5 <- $2 & 0x0000FF00 + add $3,$3,$5 ;; $3 <- $3 + $5 + rlwinm $5,$3,15,0,0 ;; $5 <- 0 | ($3[15] << 15) + srawi $5,$5,23 ;; $5 <- $5 >> 23 (algebraic for sign extension) + or $3,$3,$5 ;; $3 <- $3 | $5 + lis $5,0xFF ;; $5 <- 0x00FF00FF + addi $5,$5,0xFF + and $4,$4,$5 ;; $4 <- $4 & $5 + and $6,$2,$5 ;; $6 <- $2 & $5 + add $4,$4,$6 ;; $4 <- $4 + $6 + rlwinm $6,$4,7,0,0 ;; $6 <- 0 | ($4[7] << 7) + srawi $6,$6,15 ;; $6 <- $6 >> 15 (algebraic for sign extension) + rlwinm $5,$4,23,0,0 ;; $5 <- 0 | ($4[23] << 23) + srawi $5,$5,31 ;; $5 <- $5 >> 31 (algebraic for sign extension) + rlwimi $6,$5,0,24,31 ;; $6[24..31] <- $5[24..31] + or $4,$4,$6 ;; $4 <- $4 | $6 + rlwimi $4,$3,0,16,23 ;; $4[16..23] <- $3[16..23] + stw $4,0($1) ;; *$1 <- $4 +.endmacro + +.macro DRAWMETHOD_HALF_MACRO + lwz $4,0($0) ;; $4 <- *$0 + andi. $3,$4,0xFF00 ;; $3 <- $4 & 0x0000FF00 + andi. $5,$2,0xFF00 ;; $5 <- $2 & 0x0000FF00 + add $3,$3,$5 ;; $3 <- $3 + $5 + lis $5,0xFF ;; $5 <- 0x00FF00FF + addi $5,$5,0xFF + and $4,$4,$5 ;; $4 <- $4 & $5 + and $5,$2,$5 ;; $5 <- $2 & $5 + add $4,$4,$5 ;; $4 <- $4 + $5 + srwi $4,$4,1 ;; $4 <- $4 >> 1 + rlwimi $4,$3,31,16,23 ;; $4[16..23] <- $3[15..22] + stw $4,0($1) ;; *$1 <- $4 +.endmacro + +.macro DRAWMETHOD_DFLT_MACRO + DRAWMETHOD_PLUS_MACRO +.endmacro + +; -------------------------------------------------------------------------------------- + + + +; ************************************************************************************** +; void DRAWMETHOD_PLUS_PPC(unsigned int * buf, unsigned int _col); +; void DRAWMETHOD_PLUS_2_PPC(unsigned * in, unsigned int * out, unsigned int _col); +; ************************************************************************************** +.globl _DRAWMETHOD_PLUS_2_PPC +.align 3 +_DRAWMETHOD_PLUS_2_PPC: + DRAWMETHOD_PLUS_MACRO r3,r4,r5,r6,r7,r8,r9 + blr ;; return + +.globl _DRAWMETHOD_PLUS_PPC +.align 3 +_DRAWMETHOD_PLUS_PPC: + DRAWMETHOD_PLUS_MACRO r3,r3,r4,r5,r6,r7,r9 + blr ;; return + + +; ************************************************************************************** +; void DRAWMETHOD_HALF_PPC(unsigned int * buf, unsigned int _col); +; void DRAWMETHOD_HALF_2_PPC(unsigned * in, unsigned int * out, unsigned int _col); +; ************************************************************************************** +.globl _DRAWMETHOD_HALF_2_PPC +.align 3 +_DRAWMETHOD_HALF_2_PPC: + DRAWMETHOD_HALF_MACRO r3,r4,r5,r6,r7,r8 + blr ;; return + +.globl _DRAWMETHOD_HALF_PPC +.align 3 +_DRAWMETHOD_HALF_PPC: + DRAWMETHOD_HALF_MACRO r3,r3,r4,r5,r6,r7 + blr ;; return + + +; ************************************************************************************** +; void DRAW_LINE_PPC(unsigned int *data, int x1, int y1, int x2, int y2, unsigned int col, +; unsigned int screenx, unsigned int screeny) +; ************************************************************************************** +.globl _DRAW_LINE_PPC +.align 3 +_DRAW_LINE_PPC: + ;; NOT IMPLEMENTED YET + blr ;; return + + +; ************************************************************************************** +; void _ppc_brightness(Pixel * src, Pixel * dest, unsigned int size, unsigned int coeff) +; ************************************************************************************** + + +.const +.align 4 +vectorZERO: + .long 0,0,0,0 + .long 0x10101000, 0x10101001, 0x10101002, 0x10101003 + .long 0x10101004, 0x10101005, 0x10101006, 0x10101007 + .long 0x10101008, 0x10101009, 0x1010100A, 0x1010100B + .long 0x1010100C, 0x1010100D, 0x1010100E, 0x1010100F + + +.section __TEXT,__text,regular,pure_instructions + +.globl _ppc_brightness_G4 +.align 3 +_ppc_brightness_G4: + + +;; PowerPC Altivec code + srwi r5,r5,2 + mtctr r5 + +;;vrsave + mfspr r11,256 + lis r12,0xCFFC + mtspr 256,r12 + + mflr r0 + bcl 20,31,"L00000000001$pb" +"L00000000001$pb": + mflr r10 + mtlr r0 + + addis r9,r10,ha16(vectorZERO-"L00000000001$pb") + addi r9,r9,lo16(vectorZERO-"L00000000001$pb") + + vxor v0,v0,v0 ;; V0 = NULL vector + + addi r9,r9,16 + lvx v10,0,r9 + addi r9,r9,16 + lvx v11,0,r9 + addi r9,r9,16 + lvx v12,0,r9 + addi r9,r9,16 + lvx v13,0,r9 + + addis r9,r10,ha16(vectortmpwork-"L00000000001$pb") + addi r9,r9,lo16(vectortmpwork-"L00000000001$pb") + stw r6,0(r9) + li r6,8 + stw r6,4(r9) + lvx v9,0,r9 + li r9,128 + vspltw v8,v9,0 + vspltw v9,v9,1 + +;; elt counter + li r9,0 + lis r7,0x0F01 + b L7 +.align 4 +L7: + lvx v1,r9,r3 + + vperm v4,v1,v0,v10 + ;********************* + add r10,r9,r3 + ;********************* + vperm v5,v1,v0,v11 + vperm v6,v1,v0,v12 + vperm v7,v1,v0,v13 + + vmulouh v4,v4,v8 + ;********************* + dst r10,r7,3 + ;********************* + vmulouh v5,v5,v8 + vmulouh v6,v6,v8 + vmulouh v7,v7,v8 + vsrw v4,v4,v9 + vsrw v5,v5,v9 + vsrw v6,v6,v9 + vsrw v7,v7,v9 + + vpkuwus v4,v4,v5 + vpkuwus v6,v6,v7 + vpkuhus v1,v4,v6 + + stvx v1,r9,r4 + addi r9,r9,16 + + bdnz L7 + + mtspr 256,r11 + blr + + +.globl _ppc_brightness_G5 +.align 3 +_ppc_brightness_G5: + +;; PowerPC Altivec G5 code + srwi r5,r5,2 + mtctr r5 + +;;vrsave + mfspr r11,256 + lis r12,0xCFFC + mtspr 256,r12 + + mflr r0 + bcl 20,31,"L00000000002$pb" +"L00000000002$pb": + mflr r10 + mtlr r0 + + addis r9,r10,ha16(vectorZERO-"L00000000002$pb") + addi r9,r9,lo16(vectorZERO-"L00000000002$pb") + + vxor v0,v0,v0 ;; V0 = NULL vector + + addi r9,r9,16 + lvx v10,0,r9 + addi r9,r9,16 + lvx v11,0,r9 + addi r9,r9,16 + lvx v12,0,r9 + addi r9,r9,16 + lvx v13,0,r9 + + addis r9,r10,ha16(vectortmpwork-"L00000000002$pb") + addi r9,r9,lo16(vectortmpwork-"L00000000002$pb") + stw r6,0(r9) + li r6,8 + stw r6,4(r9) + lvx v9,0,r9 + li r9,128 + vspltw v8,v9,0 + vspltw v9,v9,1 + +;; elt counter + li r9,0 + lis r7,0x0F01 + b L6 +.align 4 +L6: + lvx v1,r9,r3 + + vperm v4,v1,v0,v10 + ;********************* + add r10,r9,r3 + ;********************* + vperm v5,v1,v0,v11 + vperm v6,v1,v0,v12 + vperm v7,v1,v0,v13 + + vmulouh v4,v4,v8 + vmulouh v5,v5,v8 + vmulouh v6,v6,v8 + vmulouh v7,v7,v8 + vsrw v4,v4,v9 + vsrw v5,v5,v9 + vsrw v6,v6,v9 + vsrw v7,v7,v9 + + vpkuwus v4,v4,v5 + vpkuwus v6,v6,v7 + vpkuhus v1,v4,v6 + + stvx v1,r9,r4 + addi r9,r9,16 + + bdnz L6 + + mtspr 256,r11 + blr + + +.globl _ppc_brightness_generic +.align 3 +_ppc_brightness_generic: + lis r12,0x00FF + ori r12,r12,0x00FF + subi r3,r3,4 + subi r4,r4,4 + mtctr r5 + b L1 +.align 4 +L1: + lwzu r7,4(r3) + + rlwinm r8,r7,16,24,31 + rlwinm r9,r7,24,24,31 + mullw r8,r8,r6 + rlwinm r10,r7,0,24,31 + mullw r9,r9,r6 + srwi r8,r8,8 + mullw r10,r10,r6 + srwi r9,r9,8 + + rlwinm. r11,r8,0,0,23 + beq L2 + li r8,0xFF +L2: + srwi r10,r10,8 + rlwinm. r11,r9,0,0,23 + beq L3 + li r9,0xFF +L3: + rlwinm r7,r8,16,8,15 + rlwinm. r11,r10,0,0,23 + beq L4 + li r10,0xFF +L4: + rlwimi r7,r9,8,16,23 + rlwimi r7,r10,0,24,31 + + stwu r7,4(r4) + bdnz L1 + + blr + + + +.static_data +.align 4 +vectortmpwork: + .long 0,0,0,0 + diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/ppc_zoom_ultimate.h kodi-visualization-goom-2.1.0/lib/goom/src/ppc_zoom_ultimate.h --- kodi-visualization-goom-1.1.0/lib/goom/src/ppc_zoom_ultimate.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/ppc_zoom_ultimate.h 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,14 @@ +/* + * ppc_zoom_ultimate.h + * Goom + * + * Created by Guillaume Borios on Sun Dec 28 2003. + * Copyright (c) 2003 iOS. All rights reserved. + * + */ + +/* Generic PowerPC Code */ +void ppc_zoom_generic (int sizeX, int sizeY, Pixel *src, Pixel *dest, int *brutS, int *brutD, int buffratio, int precalCoef[16][16]); + +/* G4 Specific PowerPC Code (Possible use of Altivec and Data Streams) */ +void ppc_zoom_G4 (int sizeX, int sizeY, Pixel *src, Pixel *dest, int *brutS, int *brutD, int buffratio, int precalCoef[16][16]); \ No newline at end of file diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/ppc_zoom_ultimate.s kodi-visualization-goom-2.1.0/lib/goom/src/ppc_zoom_ultimate.s --- kodi-visualization-goom-1.1.0/lib/goom/src/ppc_zoom_ultimate.s 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/ppc_zoom_ultimate.s 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,323 @@ +; PowerPC optimized zoom for Goom +; © 2001-2003 Guillaume Borios +; This Source Code is released under the terms of the General Public License + +; Change log : +; 21 Dec 2003 : Use of altivec is now determined with a parameter + +; Section definition : We use a read only section +.text + +; name of the function to call by C program : ppc_zoom +; We declare this label as a global to extend its scope outside this file +.globl _ppc_zoom_generic +.globl _ppc_zoom_G4 + +; Description : +; This routine dynamically computes and applies a zoom filter + +; parameters : +; r3 <=> unsigned int sizeX (in pixels) +; r4 <=> unsigned int sizeY (in pixels) +; r5 <=> unsigned int * frompixmap +; r6 <=> unsigned int * topixmap +; r7 <=> unsigned int * brutS +; r8 <=> unsigned int * brutD +; r9 <=> unsigned int buffratio +; r10 <=> int [16][16] precalccoeffs + +; globals after init +; r5 <=> frompixmap - 1 byte needed for preincremental fetch (replaces r5) +; r6 <=> topixmap - 1 byte needed for preincremental fetch (replaces r6) +; r3 <=> ax = x max in 16th of pixels (replaces old r3) +; r4 <=> ay = y max in 16th of pixels (replaces old r4) +; r20 <=> row size in bytes +; r12 <=> 0xFF00FF (mask for parallel 32 bits pixs computing) +; r30 <=> brutS - 1 byte needed for preincremental fetch (replaces r7) +; r31 <=> brutD - 1 byte needed for preincremental fetch (replaces r8) + +; ABI notes : +; r1 is the Stack Pointer (SP) => Do not use +; r13..r31 are non-volatiles => Do not use + +_ppc_zoom_generic: + +; Saves the used non volatile registers in the Mach-O stack s Red-Zone +stmw r18,-56(r1) + +; init +li r18,0 ; Default value if out of range : 0 (Black) +mr r11,r10 +lis r12,0xFF +mullw r2,r3,r4 ; Number of pixels to compute +subi r30,r8,0 +slwi r20,r3,2 +srawi r19,r20,2 +ori r12,r12,0xFF +subi r3,r3,1 +subi r4,r4,1 +mtspr ctr,r2 ; Init the loop count (one loop per pixel computed) +subi r31,r7,0 +subi r6,r6,4 +slwi r3,r3,4 +slwi r4,r4,4 + +;pre init for loop +lwz r2,0(r31) ; px +lwz r29,4(r31) ; py +lwz r8,0(r30) ; px2 +lwz r10,4(r30) ; py2 + +b L1 +.align 5 +L1: + +; computes dynamically the position to fetch +sub r8,r8,r2 +sub r10,r10,r29 +mullw r8,r8,r9 +addi r31,r31,8 +mullw r10,r10,r9 +addi r30,r30,8 + +srawi r8,r8,16 +srawi r10,r10,16 +add r2,r2,r8 +add r29,r29,r10 + +; if px>ax or py>ay goto outofrange +; computes the attenuation coeffs and the original point address +rlwinm r10,r2,6,28-6,31-6 ; r10 <- (r2 << 2) & 0x000002D0 (r10=(r2%16)*4*16) +cmpl cr4,0,r2,r3 +rlwimi r10, r29, 2, 28-2, 31-2 ; r10 <- ((r29 << 2) & 0x0000002D) | (r10 & !0x0000002D) (r10=(r10%16)*4 | r10) +cmpl cr7,0,r29,r4 +srawi r29,r29,4 ; pos computing +bge- cr4,L4 +srawi r2,r2,4 ; pos computing +mullw r29, r29,r19 ; pos computing +bge- cr7,L4 + +; Channels notation : 00112233 (AARRVVBB) + +add r2,r2,r29 ; pos computing +lwzx r10,r11,r10 ; Loads coefs +slwi r2,r2,2 ; pos computing +add r2,r2,r5 ; pos computing +rlwinm r21,r10,0,24,31 ; Isolates coef1 (??????11 -> 00000011) +lwz r25,0(r2) ; Loads col1 -> r25 +lwz r26,4(r2) ; Loads col2 -> r26 +rlwinm r22,r10,24,24,31 ; Isolates coef2 (????22?? -> 00000022) +rlwinm r23,r10,16,24,31 ; Isolates coef3 (??33???? -> 00000033) +add r2,r2,r20 ; Adds one line for future load of col3 and col4 +and r8, r25,r12 ; Masks col1 channels 1 & 3 : 0x00XX00XX +rlwinm r24,r10,8,24,31 ; Isolates coef4 (44?????? -> 00000044) +andi. r25,r25,0xFF00 ; Masks col1 channel 2 : 0x0000XX00 +mullw r8, r8, r21 ; Applies coef1 on col1 channels 1 & 3 + + +; computes final pixel color +and r10,r26,r12 ; Masks col2 channels 1 & 3 : 0x00XX00XX +lwz r27,0(r2) ; Loads col3 -> r27 +mullw r10,r10,r22 ; Applies coef2 on col2 channels 1 & 3 +mullw r25,r25,r21 ; Applies coef1 on col1 channel 2 +andi. r29,r26,0xFF00 ; Masks col2 channel 2 : 0x0000XX00 +mullw r29,r29,r22 ; Applies coef2 on col2 channel 2 +lwz r28,4(r2) ; Loads col4 -> r28 +add r8 ,r8 ,r10 ; Adds col1 & col2 channels 1 & 3 +and r10,r27,r12 ; Masks col3 channels 1 & 3 : 0x00XX00XX +add r25,r25,r29 ; Adds col1 & col2 channel 2 +mullw r10,r10,r23 ; Applies coef3 on col3 channels 1 & 3 +andi. r29,r27,0xFF00 ; Masks col3 channel 2 : 0x0000XX00 +mullw r29,r29,r23 ; Applies coef3 on col3 channel 2 +lwz r2,0(r31) ; px +add r7 ,r8 ,r10 ; Adds col3 to (col1 + col2) channels 1 & 3 +and r10,r28,r12 ; Masks col4 channels 1 & 3 : 0x00XX00XX +mullw r10,r10,r24 ; Applies coef4 on col4 channels 1 & 3 +add r25,r25,r29 ; Adds col 3 to (col1 + col2) channel 2 +lwz r8,0(r30) ; px2 +andi. r28,r28,0xFF00 ; Masks col4 channel 2 : 0x0000XX00 +add r7 ,r7 ,r10 ; Adds col4 to (col1 + col2 + col3) channels 1 & 3 +lwz r10,4(r30) ; py2 +mullw r28,r28,r24 ; Applies coef4 on col4 channel 2 +srawi r7, r7, 8 ; (sum of channels 1 & 3) >> 8 +lwz r29,4(r31) ; py +add r25,r25,r28 ; Adds col 4 to (col1 + col2 + col3) channel 2 +rlwimi r7, r25, 24, 16, 23 ; (((sum of channels 2) >> 8 ) & 0x0000FF00) | ((sum of channels 1 and 3) & 0xFFFF00FF) +stwu r7,4(r6) ; Stores the computed pixel +bdnz L1 ; Iterate again if needed +b L3 ;goto end ; If not, returns from the function + + +; if out of range +L4: +stwu r18,4(r6) +lwz r8,0(r30) ; px2 +lwz r10,4(r30) ; py2 +lwz r2,0(r31) ; px +lwz r29,4(r31) ; py +bdnz L1 + + +L3: + +; Restore saved registers and return +lmw r18,-56(r1) +blr + + + + + + + + +_ppc_zoom_G4: + +; Saves the used non volatile registers in the Mach-O stack s Red-Zone +stmw r17,-60(r1) + +; init +li r18,0 ; Default value if out of range : 0 (Black) +mr r11,r10 +lis r12,0xFF +mullw r2,r3,r4 ; Number of pixels to compute +subi r30,r8,0 +slwi r20,r3,2 +srawi r19,r20,2 +ori r12,r12,0xFF +subi r3,r3,1 +subi r4,r4,1 +mtspr ctr,r2 ; Init the loop count (one loop per pixel computed) +subi r31,r7,0 +subi r6,r6,4 +slwi r3,r3,4 +slwi r4,r4,4 + +;pre init for loop +lwz r2,0(r31) ; px +lwz r29,4(r31) ; py +lwz r8,0(r30) ; px2 +lwz r10,4(r30) ; py2 + +;********************* +lis r17,0x0F01 + +b L100 +.align 5 +L100: + +addi r6,r6,4 + +; Optimization to ensure the destination buffer +; won't be loaded into the data cache +rlwinm. r0,r6,0,27,31 +bne+ L500 +dcbz 0,r6 +;dcba 0,r6 +L500: + +; computes dynamically the position to fetch +;mullw r8,r8,r29 +;mullw r2,r2,r29 +;add r2,r8,r2 +;srawi r2,r2,17 + +sub r8,r8,r2 +sub r10,r10,r29 +mullw r8,r8,r9 +addi r31,r31,8 +mullw r10,r10,r9 +addi r30,r30,8 + +dst r30,r17,0 + +srawi r8,r8,16 +srawi r10,r10,16 +add r2,r2,r8 +add r29,r29,r10 + +dst r31,r17,1 + +; if px>ax or py>ay goto outofrange +; computes the attenuation coeffs and the original point address +rlwinm r10,r2,6,28-6,31-6 ; r10 <- (r2 << 2) & 0x000002D0 (r10=(r2%16)*4*16) +cmpl cr4,0,r2,r3 +rlwimi r10, r29, 2, 28-2, 31-2 ; r10 <- ((r29 << 2) & 0x0000002D) | (r10 & !0x0000002D) (r10=(r29%16)*4 | r10) +cmpl cr7,0,r29,r4 +srawi r29,r29,4 ; pos computing +bge- cr4,L400 +srawi r2,r2,4 ; pos computing +mullw r29, r29,r19 ; pos computing +bge- cr7,L400 + +; Channels notation : 00112233 (AARRVVBB) + +add r2,r2,r29 ; pos computing +lwzx r10,r11,r10 ; Loads coefs +slwi r2,r2,2 ; pos computing +add r2,r2,r5 ; pos computing +rlwinm r21,r10,0,24,31 ; Isolates coef1 (??????11 -> 00000011) +lwz r25,0(r2) ; Loads col1 -> r25 +lwz r26,4(r2) ; Loads col2 -> r26 +rlwinm r22,r10,24,24,31 ; Isolates coef2 (????22?? -> 00000022) +rlwinm r23,r10,16,24,31 ; Isolates coef3 (??33???? -> 00000033) +add r2,r2,r20 ; Adds one line for future load of col3 and col4 +and r8, r25,r12 ; Masks col1 channels 1 & 3 : 0x00XX00XX +rlwinm r24,r10,8,24,31 ; Isolates coef4 (44?????? -> 00000044) +dst r2,r17,2 +rlwinm r25,r25,0,16,23 ; Masks col1 channel 2 : 0x0000XX00 +;andi. r25,r25,0xFF00 ; Masks col1 channel 2 : 0x0000XX00 +mullw r8, r8, r21 ; Applies coef1 on col1 channels 1 & 3 + + +; computes final pixel color +and r10,r26,r12 ; Masks col2 channels 1 & 3 : 0x00XX00XX +lwz r27,0(r2) ; Loads col3 -> r27 +mullw r10,r10,r22 ; Applies coef2 on col2 channels 1 & 3 +mullw r25,r25,r21 ; Applies coef1 on col1 channel 2 +rlwinm r29,r26,0,16,23 ; Masks col2 channel 2 : 0x0000XX00 +;andi. r29,r26,0xFF00 ; Masks col2 channel 2 : 0x0000XX00 +mullw r29,r29,r22 ; Applies coef2 on col2 channel 2 +lwz r28,4(r2) ; Loads col4 -> r28 +add r8 ,r8 ,r10 ; Adds col1 & col2 channels 1 & 3 +and r10,r27,r12 ; Masks col3 channels 1 & 3 : 0x00XX00XX +add r25,r25,r29 ; Adds col1 & col2 channel 2 +mullw r10,r10,r23 ; Applies coef3 on col3 channels 1 & 3 +rlwinm r29,r27,0,16,23 ; Masks col3 channel 2 : 0x0000XX00 +;andi. r29,r27,0xFF00 ; Masks col3 channel 2 : 0x0000XX00 +mullw r29,r29,r23 ; Applies coef3 on col3 channel 2 +lwz r2,0(r31) ; px +add r7 ,r8 ,r10 ; Adds col3 to (col1 + col2) channels 1 & 3 +and r10,r28,r12 ; Masks col4 channels 1 & 3 : 0x00XX00XX +mullw r10,r10,r24 ; Applies coef4 on col4 channels 1 & 3 +add r25,r25,r29 ; Adds col 3 to (col1 + col2) channel 2 +lwz r8,0(r30) ; px2 +rlwinm r28,r28,0,16,23 ; Masks col4 channel 2 : 0x0000XX00 +;andi. r28,r28,0xFF00 ; Masks col4 channel 2 : 0x0000XX00 +add r7 ,r7 ,r10 ; Adds col4 to (col1 + col2 + col3) channels 1 & 3 +lwz r10,4(r30) ; py2 +mullw r28,r28,r24 ; Applies coef4 on col4 channel 2 +srawi r7, r7, 8 ; (sum of channels 1 & 3) >> 8 +lwz r29,4(r31) ; py +add r25,r25,r28 ; Adds col 4 to (col1 + col2 + col3) channel 2 +rlwimi r7, r25, 24, 16, 23 ; (((sum of channels 2) >> 8 ) & 0x0000FF00) | ((sum of channels 1 and 3) & 0xFFFF00FF) +stw r7,0(r6) ; Stores the computed pixel +bdnz L100 ; Iterate again if needed +b L300 ;goto end ; If not, returns from the function + + +; if out of range +L400: +stw r18,0(r6) +lwz r8,0(r30) ; px2 +lwz r10,4(r30) ; py2 +lwz r2,0(r31) ; px +lwz r29,4(r31) ; py +bdnz L100 + + +L300: + +; Restore saved registers and return +lmw r17,-60(r1) +blr diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/sound_tester.c kodi-visualization-goom-2.1.0/lib/goom/src/sound_tester.c --- kodi-visualization-goom-1.1.0/lib/goom/src/sound_tester.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/sound_tester.c 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,139 @@ +#include "goom.h" +#include "sound_tester.h" + +#include +#include + +/* some constants */ +#define BIG_GOOM_DURATION 100 +#define BIG_GOOM_SPEED_LIMIT 0.1f + +#define ACCEL_MULT 0.95f +#define SPEED_MULT 0.99f + + +void evaluate_sound(const gint16 data[NUM_AUDIO_SAMPLES][AUDIO_SAMPLE_LEN], SoundInfo *info) { + + int i; + float difaccel; + float prevspeed; + + /* find the max */ + int incvar = 0; + for (i = 0; i < AUDIO_SAMPLE_LEN; i++) { + if (incvar < data[0][i]) + incvar = data[0][i]; + } + + if (incvar > info->allTimesMax) + info->allTimesMax = incvar; + + /* volume sonore */ + info->volume = (float)incvar / (float)info->allTimesMax; + memcpy(info->samples[0], data[0], AUDIO_SAMPLE_LEN*sizeof(short)); + memcpy(info->samples[1], data[1], AUDIO_SAMPLE_LEN*sizeof(short)); + + difaccel = info->accelvar; + info->accelvar = info->volume; /* accel entre 0 et 1 */ + + /* transformations sur la vitesse du son */ + if (info->speedvar > 1.0f) + info->speedvar = 1.0f; + + if (info->speedvar < 0.1f) + info->accelvar *= (1.0f - (float)info->speedvar); + else if (info->speedvar < 0.3f) + info->accelvar *= (0.9f - (float)(info->speedvar-0.1f)/2.0f); + else + info->accelvar *= (0.8f - (float)(info->speedvar-0.3f)/4.0f); + + /* adoucissement de l'acceleration */ + info->accelvar *= ACCEL_MULT; + if (info->accelvar < 0) + info->accelvar = 0; + + difaccel = info->accelvar - difaccel; + if (difaccel < 0) + difaccel = - difaccel; + + /* mise a jour de la vitesse */ + prevspeed = info->speedvar; + info->speedvar = (info->speedvar + difaccel * 0.5f) / 2; + info->speedvar *= SPEED_MULT; + info->speedvar = (info->speedvar + 3.0f * prevspeed) / 4.0f; + if (info->speedvar < 0) + info->speedvar = 0; + if (info->speedvar > 1) + info->speedvar = 1; + + /* temps du goom */ + info->timeSinceLastGoom++; + info->timeSinceLastBigGoom++; + info->cycle++; + + /* detection des nouveaux gooms */ + if ((info->speedvar > (float)IVAL(info->biggoom_speed_limit_p)/100.0f) + && (info->accelvar > info->bigGoomLimit) + && (info->timeSinceLastBigGoom > BIG_GOOM_DURATION)) { + info->timeSinceLastBigGoom = 0; + } + + if (info->accelvar > info->goom_limit) { + /* TODO: tester && (info->timeSinceLastGoom > 20)) { */ + info->totalgoom ++; + info->timeSinceLastGoom = 0; + info->goomPower = info->accelvar - info->goom_limit; + } + + if (info->accelvar > info->prov_max) + info->prov_max = info->accelvar; + + if (info->goom_limit>1) + info->goom_limit=1; + + /* toute les 2 secondes : vérifier si le taux de goom est correct + * et le modifier sinon.. */ + if (info->cycle % 64 == 0) { + if (info->speedvar<0.01f) + info->goom_limit *= 0.91; + if (info->totalgoom > 4) { + info->goom_limit+=0.02; + } + if (info->totalgoom > 7) { + info->goom_limit*=1.03f; + info->goom_limit+=0.03; + } + if (info->totalgoom > 16) { + info->goom_limit*=1.05f; + info->goom_limit+=0.04; + } + if (info->totalgoom == 0) { + info->goom_limit = info->prov_max - 0.02; + } + if ((info->totalgoom == 1) && (info->goom_limit > 0.02)) + info->goom_limit-=0.01; + info->totalgoom = 0; + info->bigGoomLimit = info->goom_limit * (1.0f + (float)IVAL(info->biggoom_factor_p)/500.0f); + info->prov_max = 0; + } + + /* mise a jour des parametres pour la GUI */ + FVAL(info->volume_p) = info->volume; + info->volume_p.change_listener(&info->volume_p); + FVAL(info->speed_p) = info->speedvar * 4; + info->speed_p.change_listener(&info->speed_p); + FVAL(info->accel_p) = info->accelvar; + info->accel_p.change_listener(&info->accel_p); + + FVAL(info->goom_limit_p) = info->goom_limit; + info->goom_limit_p.change_listener(&info->goom_limit_p); + FVAL(info->goom_power_p) = info->goomPower; + info->goom_power_p.change_listener(&info->goom_power_p); + FVAL(info->last_goom_p) = 1.0-((float)info->timeSinceLastGoom/20.0f); + info->last_goom_p.change_listener(&info->last_goom_p); + FVAL(info->last_biggoom_p) = 1.0-((float)info->timeSinceLastBigGoom/40.0f); + info->last_biggoom_p.change_listener(&info->last_biggoom_p); + + /* bigGoomLimit ==goomLimit*9/8+7 ? */ + } + diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/sound_tester.h kodi-visualization-goom-2.1.0/lib/goom/src/sound_tester.h --- kodi-visualization-goom-1.1.0/lib/goom/src/sound_tester.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/sound_tester.h 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,12 @@ +#ifndef _SOUND_TESTER_H +#define _SOUND_TESTER_H + +#include "goom.h" +#include "goom_plugin_info.h" +#include "goom_config.h" + +/** change les donnees du SoundInfo */ +void evaluate_sound(const gint16 data[NUM_AUDIO_SAMPLES][AUDIO_SAMPLE_LEN], SoundInfo *sndInfo); + +#endif + diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/surf3d.c kodi-visualization-goom-2.1.0/lib/goom/src/surf3d.c --- kodi-visualization-goom-1.1.0/lib/goom/src/surf3d.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/surf3d.c 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,107 @@ +#include "surf3d.h" +#include "goom_plugin_info.h" +#include +#include +#include + +grid3d *grid3d_new (int sizex, int defx, int sizez, int defz, v3d center) { + int x = defx; + int y = defz; + grid3d *g = malloc (sizeof(grid3d)); + surf3d *s = &(g->surf); + s->nbvertex = x*y; + s->vertex = malloc (x*y*sizeof(v3d)); + s->svertex = malloc (x*y*sizeof(v3d)); + s->center = center; + + g->defx=defx; + g->sizex=sizex; + g->defz=defz; + g->sizez=sizez; + g->mode=0; + + while (y) { + --y; + x = defx; + while (x) { + --x; + s->vertex[x+defx*y].x = (float)(x-defx/2)*sizex/defx; + s->vertex[x+defx*y].y = 0; + s->vertex[x+defx*y].z = (float)(y-defz/2)*sizez/defz; + } + } + return g; +} + +void grid3d_draw (PluginInfo *plug, grid3d *g, int color, int colorlow, + int dist, Pixel *buf, Pixel *back, int W,int H) { + + int x; + v2d v2,v2x; + + v2d *v2_array = malloc(g->surf.nbvertex * sizeof(v2d)); + v3d_to_v2d(g->surf.svertex, g->surf.nbvertex, W, H, dist, v2_array); + + for (x=0;xdefx;x++) { + int z; + v2x = v2_array[x]; + + for (z=1;zdefz;z++) { + v2 = v2_array[z*g->defx + x]; + if (((v2.x != -666) || (v2.y!=-666)) + && ((v2x.x != -666) || (v2x.y!=-666))) { + plug->methods.draw_line (buf,v2x.x,v2x.y,v2.x,v2.y, colorlow, W, H); + plug->methods.draw_line (back,v2x.x,v2x.y,v2.x,v2.y, color, W, H); + } + v2x = v2; + } + } + + free(v2_array); +} + +void surf3d_rotate (surf3d *s, float angle) { + int i; + float cosa; + float sina; + SINCOS(angle,sina,cosa); + for (i=0;inbvertex;i++) { + Y_ROTATE_V3D(s->vertex[i],s->svertex[i],cosa,sina); + } +} + +void surf3d_translate (surf3d *s) { + int i; + for (i=0;inbvertex;i++) { + TRANSLATE_V3D(s->center,s->svertex[i]); + } +} + +void grid3d_update (grid3d *g, float angle, float *vals, float dist) { + int i; + float cosa; + float sina; + surf3d *s = &(g->surf); + v3d cam = s->center; + cam.z += dist; + + SINCOS((angle/4.3f),sina,cosa); + cam.y += sina*2.0f; + SINCOS(angle,sina,cosa); + + if (g->mode==0) { + if (vals) + for (i=0;idefx;i++) + s->vertex[i].y = s->vertex[i].y*0.2 + vals[i]*0.8; + + for (i=g->defx;inbvertex;i++) { + s->vertex[i].y *= 0.255f; + s->vertex[i].y += (s->vertex[i-g->defx].y * 0.777f); + } + } + + for (i=0;inbvertex;i++) { + Y_ROTATE_V3D(s->vertex[i],s->svertex[i],cosa,sina); + TRANSLATE_V3D(cam,s->svertex[i]); + } +} diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/surf3d.h kodi-visualization-goom-2.1.0/lib/goom/src/surf3d.h --- kodi-visualization-goom-1.1.0/lib/goom/src/surf3d.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/surf3d.h 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,38 @@ +#ifndef _SURF3D_H +#define _SURF3D_H + +#include "v3d.h" +#include "goom_graphic.h" +#include "goom_typedefs.h" + +typedef struct { + v3d *vertex; + v3d *svertex; + int nbvertex; + + v3d center; +} surf3d; + +typedef struct { + surf3d surf; + + int defx; + int sizex; + int defz; + int sizez; + int mode; +} grid3d; + +/* hi-level */ + +/* works on grid3d */ +grid3d *grid3d_new (int sizex, int defx, int sizez, int defz, v3d center); +void grid3d_update (grid3d *s, float angle, float *vals, float dist); + +/* low level */ +void surf3d_draw (surf3d *s, int color, int dist, int *buf, int *back, int W,int H); +void grid3d_draw (PluginInfo *plug, grid3d *g, int color, int colorlow, int dist, Pixel *buf, Pixel *back, int W,int H); +void surf3d_rotate (surf3d *s, float angle); +void surf3d_translate (surf3d *s); + +#endif diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/surf3d.s kodi-visualization-goom-2.1.0/lib/goom/src/surf3d.s --- kodi-visualization-goom-1.1.0/lib/goom/src/surf3d.s 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/surf3d.s 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,484 @@ + .file "surf3d.c" + .version "01.01" +gcc2_compiled.: +.text + .align 4 +.globl grid3d_new + .type grid3d_new,@function +grid3d_new: + pushl %ebp + movl %esp,%ebp + subl $44,%esp + pushl %edi + pushl %esi + pushl %ebx + movl 20(%ebp),%eax + movl 12(%ebp),%esi + movl %eax,-8(%ebp) + addl $-12,%esp + pushl $44 + call malloc + movl %esi,%edx + imull -8(%ebp),%edx + movl %eax,%edi + movl %edx,-12(%ebp) + leal (%edx,%edx,2),%ebx + movl %edx,8(%edi) + addl $-12,%esp + sall $2,%ebx + pushl %ebx + call malloc + addl $32,%esp + movl %eax,(%edi) + addl $-12,%esp + pushl %ebx + call malloc + movl %eax,4(%edi) + movl 24(%ebp),%eax + movl %eax,12(%edi) + movl 28(%ebp),%eax + movl %eax,16(%edi) + movl 32(%ebp),%eax + movl %eax,20(%edi) + movl 8(%ebp),%eax + movl %eax,28(%edi) + movl %esi,24(%edi) + movl -8(%ebp),%edx + movl 16(%ebp),%eax + movl %edx,32(%edi) + movl %eax,36(%edi) + movl $0,40(%edi) + testl %edx,%edx + je .L480 + movl %esi,%eax + movl %esi,-28(%ebp) + shrl $31,%eax + addl %eax,%esi + movl -8(%ebp),%eax + shrl $31,%eax + addl -8(%ebp),%eax + movl -12(%ebp),%edx + sarl $1,%eax + movl %edx,-24(%ebp) + negl -28(%ebp) + movl %esi,-16(%ebp) + movl %eax,-20(%ebp) + .p2align 4,,7 +.L481: + movl -28(%ebp),%eax + addl %eax,-24(%ebp) + decl -8(%ebp) + movl 12(%ebp),%esi + testl %esi,%esi + je .L479 + movl -8(%ebp),%eax + subl -20(%ebp),%eax + movl %eax,-4(%ebp) + fildl -4(%ebp) + movl %esi,-4(%ebp) + movl -24(%ebp),%edx + leal (%edx,%esi),%eax + movl -16(%ebp),%ebx + fildl 16(%ebp) + leal (%eax,%eax,2),%eax + sarl $1,%ebx + leal 0(,%eax,4),%ecx + fmulp %st,%st(1) + fildl 20(%ebp) + fdivrp %st,%st(1) + fildl 8(%ebp) + fildl -4(%ebp) + jmp .L484 +.L487: + fxch %st(2) + .p2align 4,,7 +.L484: + decl %esi + movl %esi,%eax + movl (%edi),%edx + subl %ebx,%eax + movl %eax,-4(%ebp) + fildl -4(%ebp) + addl $-12,%ecx + fmul %st(2),%st + fdiv %st(1),%st + fstps (%edx,%ecx) + fxch %st(2) + movl (%edi),%eax + movl $0,4(%eax,%ecx) + movl (%edi),%eax + fsts 8(%eax,%ecx) + testl %esi,%esi + jne .L487 + fstp %st(0) + fstp %st(0) + fstp %st(0) +.L479: + cmpl $0,-8(%ebp) + jne .L481 +.L480: + leal -56(%ebp),%esp + popl %ebx + movl %edi,%eax + popl %esi + popl %edi + leave + ret +.Lfe1: + .size grid3d_new,.Lfe1-grid3d_new +.section .rodata + .align 8 +.LC48: + .long 0x0,0x3fe00000 + .align 4 +.LC49: + .long 0x3f19999a + .align 4 +.LC50: + .long 0x3ee3d70a +.text + .align 4 +.globl grid3d_update + .type grid3d_update,@function +grid3d_update: + pushl %ebp + movl %esp,%ebp + subl $32,%esp + pushl %esi + pushl %ebx + flds 12(%ebp) + movl 8(%ebp),%ebx + movl 16(%ebp),%ecx + fld %st(0) +#APP + fsin +#NO_APP + fstps -4(%ebp) + flds -4(%ebp) + fxch %st(1) +#APP + fcos +#NO_APP + fstps -4(%ebp) + flds -4(%ebp) + cmpl $0,40(%ebx) + jne .L519 + testl %ecx,%ecx + je .L520 + xorl %esi,%esi + cmpl 24(%ebx),%esi + jge .L520 + fldl .LC48 + xorl %edx,%edx + .p2align 4,,7 +.L524: + movl (%ebx),%eax + fld %st(0) + fld %st(1) + fxch %st(1) + fmuls 4(%eax,%edx) + fxch %st(1) + fmuls (%ecx,%esi,4) + faddp %st,%st(1) + incl %esi + fstps 4(%eax,%edx) + addl $12,%edx + cmpl 24(%ebx),%esi + jl .L524 + fstp %st(0) +.L520: + movl 24(%ebx),%esi + cmpl 8(%ebx),%esi + jge .L519 + leal (%esi,%esi,2),%eax + flds .LC49 + flds .LC50 + leal 0(,%eax,4),%ecx + .p2align 4,,7 +.L529: + movl (%ebx),%eax + flds 4(%eax,%ecx) + fmul %st(2),%st + fstps 4(%eax,%ecx) + movl %esi,%eax + subl 24(%ebx),%eax + movl (%ebx),%edx + leal (%eax,%eax,2),%eax + flds 4(%edx,%eax,4) + fmul %st(1),%st + fadds 4(%edx,%ecx) + incl %esi + fstps 4(%edx,%ecx) + addl $12,%ecx + cmpl 8(%ebx),%esi + jl .L529 + fstp %st(0) + fstp %st(0) +.L519: + xorl %esi,%esi + cmpl 8(%ebx),%esi + jge .L536 + xorl %ecx,%ecx + .p2align 4,,7 +.L534: + movl (%ebx),%eax + flds (%eax,%ecx) + flds 8(%eax,%ecx) + fmul %st(2),%st + fxch %st(1) + fmul %st(3),%st + fsubp %st,%st(1) + movl 4(%ebx),%edx + incl %esi + fstps (%edx,%ecx) + movl (%ebx),%eax + flds (%eax,%ecx) + flds 8(%eax,%ecx) + fxch %st(1) + fmul %st(2),%st + fxch %st(1) + fmul %st(3),%st + faddp %st,%st(1) + movl 4(%ebx),%edx + fstps 8(%edx,%ecx) + movl (%ebx),%eax + flds 4(%eax,%ecx) + movl 4(%ebx),%edx + fstps 4(%edx,%ecx) + movl 4(%ebx),%eax + flds (%eax,%ecx) + fadds 12(%ebx) + fstps (%eax,%ecx) + movl 4(%ebx),%eax + flds 4(%eax,%ecx) + fadds 16(%ebx) + fstps 4(%eax,%ecx) + movl 4(%ebx),%eax + flds 8(%eax,%ecx) + fadds 20(%ebx) + fstps 8(%eax,%ecx) + addl $12,%ecx + cmpl 8(%ebx),%esi + jl .L534 +.L536: + fstp %st(0) + fstp %st(0) + popl %ebx + popl %esi + leave + ret +.Lfe2: + .size grid3d_update,.Lfe2-grid3d_update +.section .rodata + .align 4 +.LC51: + .long 0x40000000 + .align 8 +.LC52: + .long 0x0,0x42380000 +.text + .align 4 +.globl surf3d_draw + .type surf3d_draw,@function +surf3d_draw: + pushl %ebp + movl %esp,%ebp + subl $60,%esp + pushl %edi + pushl %esi + pushl %ebx + movl $0,-20(%ebp) + movl -20(%ebp),%edx + movl 8(%ebp),%eax + cmpl 8(%eax),%edx + jge .L493 + fldl .LC52 + flds .LC51 + xorl %edi,%edi + .p2align 4,,7 +.L495: + movl 8(%ebp),%eax + movl 4(%eax),%eax + movl %eax,-36(%ebp) + fcoms 8(%eax,%edi) + fnstsw %ax + andb $69,%ah + cmpb $1,%ah + jne .L496 + fildl 16(%ebp) + movl -36(%ebp),%edx + fld %st(0) + fmuls (%edx,%edi) + fdivs 8(%edx,%edi) + fld %st(3) + faddp %st,%st(1) + fstpl -32(%ebp) + movl -32(%ebp),%eax + movl -28(%ebp),%edx + movl %eax,-40(%ebp) + sarl $16,-40(%ebp) + movl -36(%ebp),%edx + fmuls 4(%edx,%edi) + fdivs 8(%edx,%edi) + movl -40(%ebp),%ecx + fld %st(2) + faddp %st,%st(1) + fstpl -32(%ebp) + movl -32(%ebp),%eax + movl -28(%ebp),%edx + movl %eax,-44(%ebp) + movl 28(%ebp),%eax + sarl $1,%eax + addl %eax,%ecx + movl 32(%ebp),%eax + sarl $16,-44(%ebp) + sarl $1,%eax + movl %ecx,%ebx + subl -44(%ebp),%eax + movl %eax,%esi + cmpl 28(%ebp),%ebx + jge .L496 + testl %ecx,%ecx + jl .L496 + cmpl 32(%ebp),%esi + jge .L496 + testl %eax,%eax + jge .L499 +.L496: + xorl %esi,%esi + xorl %ebx,%ebx +.L499: + movl 20(%ebp),%eax + movl %ebx,%edx + leal (%eax,%edx,4),%edx + movl 28(%ebp),%eax + imull %esi,%eax + leal (%edx,%eax,4),%eax + testl %ebx,%ebx + je .L494 + testl %esi,%esi + je .L494 +#APP + movd (%eax), %mm0 + paddusb 12(%ebp), %mm0 + movd %mm0, (%eax) +#NO_APP +.L494: + incl -20(%ebp) + addl $12,%edi + movl -20(%ebp),%eax + movl 8(%ebp),%edx + cmpl 8(%edx),%eax + jl .L495 + fstp %st(0) + fstp %st(0) +.L493: + popl %ebx + popl %esi + popl %edi + leave + ret +.Lfe3: + .size surf3d_draw,.Lfe3-surf3d_draw + .align 4 +.globl surf3d_rotate + .type surf3d_rotate,@function +surf3d_rotate: + pushl %ebp + movl %esp,%ebp + subl $32,%esp + pushl %esi + pushl %ebx + flds 12(%ebp) + movl 8(%ebp),%ebx + fld %st(0) +#APP + fsin +#NO_APP + fstps -4(%ebp) + flds -4(%ebp) + fxch %st(1) +#APP + fcos +#NO_APP + fstps -4(%ebp) + xorl %esi,%esi + flds -4(%ebp) + cmpl 8(%ebx),%esi + jge .L537 + xorl %ecx,%ecx + .p2align 4,,7 +.L508: + movl (%ebx),%eax + flds (%eax,%ecx) + flds 8(%eax,%ecx) + fmul %st(2),%st + fxch %st(1) + fmul %st(3),%st + fsubp %st,%st(1) + movl 4(%ebx),%edx + incl %esi + fstps (%edx,%ecx) + movl (%ebx),%eax + flds (%eax,%ecx) + flds 8(%eax,%ecx) + fxch %st(1) + fmul %st(2),%st + fxch %st(1) + fmul %st(3),%st + faddp %st,%st(1) + movl 4(%ebx),%edx + fstps 8(%edx,%ecx) + movl (%ebx),%eax + flds 4(%eax,%ecx) + movl 4(%ebx),%edx + fstps 4(%edx,%ecx) + addl $12,%ecx + cmpl 8(%ebx),%esi + jl .L508 +.L537: + fstp %st(0) + fstp %st(0) + popl %ebx + popl %esi + leave + ret +.Lfe4: + .size surf3d_rotate,.Lfe4-surf3d_rotate + .align 4 +.globl surf3d_translate + .type surf3d_translate,@function +surf3d_translate: + pushl %ebp + movl %esp,%ebp + pushl %ebx + movl 8(%ebp),%ecx + xorl %ebx,%ebx + cmpl 8(%ecx),%ebx + jge .L512 + xorl %edx,%edx + .p2align 4,,7 +.L514: + movl 4(%ecx),%eax + flds (%eax,%edx) + fadds 12(%ecx) + incl %ebx + fstps (%eax,%edx) + movl 4(%ecx),%eax + flds 4(%eax,%edx) + fadds 16(%ecx) + fstps 4(%eax,%edx) + movl 4(%ecx),%eax + flds 8(%eax,%edx) + fadds 20(%ecx) + fstps 8(%eax,%edx) + addl $12,%edx + cmpl 8(%ecx),%ebx + jl .L514 +.L512: + popl %ebx + leave + ret +.Lfe5: + .size surf3d_translate,.Lfe5-surf3d_translate + .ident "GCC: (GNU) 2.95.3 19991030 (prerelease)" diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/tentacle3d.c kodi-visualization-goom-2.1.0/lib/goom/src/tentacle3d.c --- kodi-visualization-goom-1.1.0/lib/goom/src/tentacle3d.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/tentacle3d.c 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,330 @@ +#include +#include + +#include "v3d.h" +#include "surf3d.h" +#include "goom.h" +#include "goom_tools.h" +#include "goom_config.h" +#include "goom_plugin_info.h" +#include "tentacle3d.h" + +#define D 256.0f + +#define nbgrid 6 +#define num_x 10 +#define num_z 10 +#define num_x_mod 3 +#define num_z_mod 3 +#define x_increment 100 +#define y_increment 100 +#define z_increment 100 +#define y_inc_mod 10 +#define x_width num_x * x_increment +#define z_width num_z * z_increment +#define x_width_mod 10 +#define z_width_mod 10 + +typedef struct _TENTACLE_FX_DATA { + PluginParam enabled_bp; + PluginParameters params; + + float cycle; + grid3d *grille[nbgrid]; + float *vals; + +#define NB_TENTACLE_COLORS 5 + int colors[NB_TENTACLE_COLORS]; + + int col; + int dstcol; + float lig; + float ligs; + + /* statics from pretty_move */ + float distt; + float distt2; + float rot; /* entre 0 et 2 * M_PI */ + int happens; + int rotation; + int lock; +} TentacleFXData; + +static void tentacle_new (TentacleFXData *data); +static void tentacle_update(PluginInfo *goomInfo, Pixel *buf, Pixel *back, int W, int H, + gint16 data[NUM_AUDIO_SAMPLES][AUDIO_SAMPLE_LEN], float, int drawit, TentacleFXData *fx_data); +static void tentacle_free (TentacleFXData *data); + +/* + * VisualFX wrapper for the tentacles + */ + +static void tentacle_fx_init(VisualFX *_this, PluginInfo *info) { + + TentacleFXData *data = (TentacleFXData*)malloc(sizeof(TentacleFXData)); + + data->enabled_bp = secure_b_param("Enabled", 1); + data->params = plugin_parameters ("3D Tentacles", 1); + data->params.params[0] = &data->enabled_bp; + + data->cycle = 0.0f; + data->col = (0x28<<(ROUGE*8))|(0x2c<<(VERT*8))|(0x5f<<(BLEU*8)); + data->dstcol = 0; + data->lig = 1.15f; + data->ligs = 0.1f; + + data->distt = 10.0f; + data->distt2 = 0.0f; + data->rot = 0.0f; /* entre 0 et 2 * M_PI */ + data->happens = 0; + + data->rotation = 0; + data->lock = 0; + data->colors[0] = (0x18<<(ROUGE*8))|(0x4c<<(VERT*8))|(0x2f<<(BLEU*8)); + data->colors[1] = (0x48<<(ROUGE*8))|(0x2c<<(VERT*8))|(0x6f<<(BLEU*8)); + data->colors[2] = (0x58<<(ROUGE*8))|(0x3c<<(VERT*8))|(0x0f<<(BLEU*8)); + data->colors[3] = (0x87<<(ROUGE*8))|(0x55<<(VERT*8))|(0x74<<(BLEU*8)); + data->colors[4] = (0x97<<(ROUGE*8))|(0x75<<(VERT*8))|(0x94<<(BLEU*8)); + tentacle_new(data); + + _this->params = &data->params; + _this->fx_data = (void*)data; +} + +static void tentacle_fx_apply(VisualFX *_this, Pixel *src, Pixel *dest, PluginInfo *goomInfo) +{ + TentacleFXData *data = (TentacleFXData*)_this->fx_data; + if (BVAL(data->enabled_bp)) { + tentacle_update(goomInfo, dest, src, goomInfo->screen.width, + goomInfo->screen.height, goomInfo->sound.samples, + (float)goomInfo->sound.accelvar, + goomInfo->curGState->drawTentacle, data); + } +} + +static void tentacle_fx_free(VisualFX *_this) { + TentacleFXData *data = (TentacleFXData*)_this->fx_data; + free(data->params.params); + tentacle_free(data); + free(_this->fx_data); +} + +VisualFX tentacle_fx_create(void) { + VisualFX fx; + fx.init = tentacle_fx_init; + fx.apply = tentacle_fx_apply; + fx.free = tentacle_fx_free; + return fx; +} + +/* ----- */ + +static void tentacle_free (TentacleFXData *data) { + /* TODO : un vrai FREE GRID!! */ + int tmp; + for (tmp=0;tmpgrille[tmp]; + free (g->surf.vertex); + free (g->surf.svertex); + free (g); + } + free (data->vals); +} + +static inline int get_rand_in_range(int n1, int n2) +{ + const int len = n2 - n1; + return n1 + rand() % (len + 1); +} + +static void tentacle_new (TentacleFXData *data) { + v3d center = {0, 0, 0}; + data->vals = (float*)malloc ((num_x+20)*sizeof(float)); + + /* Start at bottom of grid, going up by 'y_increment' */ + float y = -0.5*(nbgrid * y_increment); + for (int tmp=0;tmpgrille[tmp] = grid3d_new(x_size, x_def, z_size, z_def, center); + + y += y_increment; + } +} + +static inline unsigned char lighten (unsigned char value, float power) +{ + int val = value; + float t = (float) val * log10(power) / 2.0; + + if (t > 0) { + val = (int) t; /* (32.0f * log (t)); */ + if (val > 255) + val = 255; + if (val < 0) + val = 0; + return val; + } + else { + return 0; + } +} + +static void lightencolor (uint32_t *col, float power) +{ + uint8_t *color; + + color = (uint8_t *) col; + *color = lighten (*color, power); + color++; + *color = lighten (*color, power); + color++; + *color = lighten (*color, power); + color++; + *color = lighten (*color, power); +} + +/* retourne x>>s , en testant le signe de x */ +#define ShiftRight(_x,_s) ((_x<0) ? -(-_x>>_s) : (_x>>_s)) + +static int evolutecolor (unsigned int src,unsigned int dest, + unsigned int mask, unsigned int incr) { + + int color = src & (~mask); + src &= mask; + dest &= mask; + + if ((src!=mask) + &&(srcdest) + src -= incr; + return (src&mask)|color; +} + +static void pretty_move (PluginInfo *goomInfo, float cycle, float *dist, float *dist2, float *rotangle, TentacleFXData *fx_data) { + + float tmp; + + /* many magic numbers here... I don't really like that. */ + if (fx_data->happens) + fx_data->happens -= 1; + else if (fx_data->lock == 0) { + fx_data->happens = goom_irand(goomInfo->gRandom,200)?0:100+goom_irand(goomInfo->gRandom,60); + fx_data->lock = fx_data->happens * 3 / 2; + } + else fx_data->lock --; + + tmp = fx_data->happens?8.0f:0; + *dist2 = fx_data->distt2 = (tmp + 15.0f*fx_data->distt2)/16.0f; + + tmp = 30+D-90.0f*(1.0f+sin(cycle*19/20)); + if (fx_data->happens) + tmp *= 0.6f; + + *dist = fx_data->distt = (tmp + 3.0f*fx_data->distt)/4.0f; + + if (!fx_data->happens){ + tmp = M_PI*sin(cycle)/32+3*M_PI/2; + } + else { + fx_data->rotation = goom_irand(goomInfo->gRandom,500)?fx_data->rotation:goom_irand(goomInfo->gRandom,2); + if (fx_data->rotation) + cycle *= 2.0f*M_PI; + else + cycle *= -1.0f*M_PI; + tmp = cycle - (M_PI*2.0) * floor(cycle/(M_PI*2.0)); + } + + if (abs(tmp-fx_data->rot) > abs(tmp-(fx_data->rot+2.0*M_PI))) { + fx_data->rot = (tmp + 15.0f*(fx_data->rot+2*M_PI)) / 16.0f; + if (fx_data->rot>2.0*M_PI) + fx_data->rot -= 2.0*M_PI; + *rotangle = fx_data->rot; + } + else if (abs(tmp-fx_data->rot) > abs(tmp-(fx_data->rot-2.0*M_PI))) { + fx_data->rot = (tmp + 15.0f*(fx_data->rot-2.0*M_PI)) / 16.0f; + if (fx_data->rot<0.0f) + fx_data->rot += 2.0*M_PI; + *rotangle = fx_data->rot; + } + else + *rotangle = fx_data->rot = (tmp + 15.0f*fx_data->rot) / 16.0f; +} + +static void tentacle_update(PluginInfo *goomInfo, Pixel *buf, Pixel *back, int W, int H, + gint16 data[NUM_AUDIO_SAMPLES][AUDIO_SAMPLE_LEN], float rapport, int drawit, TentacleFXData *fx_data) { + + int tmp; + int tmp2; + + uint32_t color; + uint32_t colorlow; + + float dist,dist2,rotangle; + + if ((!drawit) && (fx_data->ligs>0.0f)) + fx_data->ligs = -fx_data->ligs; + + fx_data->lig += fx_data->ligs; + + if (fx_data->lig > 1.01f) { + if ((fx_data->lig>10.0f) || (fx_data->lig<1.1f)) fx_data->ligs = -fx_data->ligs; + + if ((fx_data->lig<6.3f)&&(goom_irand(goomInfo->gRandom,30)==0)) + fx_data->dstcol=goom_irand(goomInfo->gRandom,NB_TENTACLE_COLORS); + + fx_data->col = evolutecolor(fx_data->col,fx_data->colors[fx_data->dstcol],0xff,0x01); + fx_data->col = evolutecolor(fx_data->col,fx_data->colors[fx_data->dstcol],0xff00,0x0100); + fx_data->col = evolutecolor(fx_data->col,fx_data->colors[fx_data->dstcol],0xff0000,0x010000); + fx_data->col = evolutecolor(fx_data->col,fx_data->colors[fx_data->dstcol],0xff000000,0x01000000); + fx_data->col = evolutecolor(fx_data->col,fx_data->colors[fx_data->dstcol],0xf0000000,0x11000000); + + color = fx_data->col; + colorlow = fx_data->col; + + lightencolor(&color,fx_data->lig * 2.0f + 2.0f); + lightencolor(&colorlow,(fx_data->lig/3.0f)+0.67f); + + rapport = 1.0f + 2.0f * (rapport - 1.0f); + rapport *= 1.2f; + if (rapport > 1.12f) + rapport = 1.12f; + + pretty_move (goomInfo, fx_data->cycle, &dist, &dist2, &rotangle, fx_data); + + for (tmp=0;tmpgRandom,AUDIO_SAMPLE_LEN-1)],10)) * rapport; + fx_data->vals[tmp2] = val; + } + + grid3d_update (fx_data->grille[tmp], rotangle, fx_data->vals, dist2); + } + fx_data->cycle+=0.01f; + int color_num = 0; + for (tmp=0;tmpcolors[color_num] * color; + color_num++; + if (color_num > NB_TENTACLE_COLORS) color_num = 0; + grid3d_draw (goomInfo, fx_data->grille[tmp],my_col,colorlow,dist,buf,back,W,H); + } + } + else { + fx_data->lig = 1.05f; + if (fx_data->ligs < 0.0f) + fx_data->ligs = -fx_data->ligs; + pretty_move (goomInfo, fx_data->cycle, &dist, &dist2, &rotangle, fx_data); + fx_data->cycle+=0.1f; + if (fx_data->cycle > 1000) + fx_data->cycle = 0; + } +} diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/tentacle3d.h kodi-visualization-goom-2.1.0/lib/goom/src/tentacle3d.h --- kodi-visualization-goom-1.1.0/lib/goom/src/tentacle3d.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/tentacle3d.h 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,8 @@ +#ifndef _TENTACLE3D_H +#define _TENTACLE3D_H + +#include "goom_visual_fx.h" + +VisualFX tentacle_fx_create(void); + +#endif diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/TODO kodi-visualization-goom-2.1.0/lib/goom/src/TODO --- kodi-visualization-goom-1.1.0/lib/goom/src/TODO 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/TODO 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,32 @@ +Idees: + +- Flash lights (Phosphor) + --> --> --> + <-- <-- <-- + +- Re-remplir RAND regulierement (1/tour) + +- Un effect qui affecte la displacement map: + +- Enregistrer l'etat de la config, s'en servir pour definir un etat de goom. + +- PluginParam de type Button, avec juste un listener en donnee. + +- PluginParam de type TextField. + +- Liste des modes possibles pour l'effet de BG. + +- Goom lui-meme : liste des effets actifs. + mode automatique / manuel (plus de changement aleatoires) + +- Possibilite d'envoyer des commandes format text au Core. exemples : +" BRIGHT_FLASH.SCREEN_BRIGHTNESS=200.0 + if SOUND.GOOM_DETECTION > 0 + 3D_TENTACLES.ENABLED = 1 + endif + CORE.MAIN_SCRIPT="..." +" + void goom_execute_script(const char *cmds); + void goom_set_main_script(const char *script); /// peut retourner un message d'erreur ? + char *goom_create_state_script(); /* retourne un script permettant de remettre goom dans l'etat actuel */ + diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/v3d.c kodi-visualization-goom-2.1.0/lib/goom/src/v3d.c --- kodi-visualization-goom-1.1.0/lib/goom/src/v3d.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/v3d.c 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,15 @@ +#include "v3d.h" + +void v3d_to_v2d(v3d *v3, int nbvertex, int width, int height, float distance, v2d *v2) { + int i; + for (i=0;i 2) { + int Xp, Yp; + F2I((distance * v3[i].x / v3[i].z),Xp); + F2I((distance * v3[i].y / v3[i].z),Yp); + v2[i].x = Xp + (width>>1); + v2[i].y = -Yp + (height>>1); + } + else v2[i].x=v2[i].y=-666; + } +} diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/v3d.h kodi-visualization-goom-2.1.0/lib/goom/src/v3d.h --- kodi-visualization-goom-1.1.0/lib/goom/src/v3d.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/v3d.h 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,65 @@ +#ifndef _V3D_H +#define _V3D_H + +#include +#include +#include + +#include "mathtools.h" + +typedef struct { + float x,y,z; +} v3d; + +typedef struct { + int x,y; +} v2d; + +typedef struct { + double x,y; +} v2g; + +/* + * projete le vertex 3D sur le plan d'affichage + * retourne (0,0) si le point ne doit pas etre affiche. + * + * bonne valeur pour distance : 256 + */ +#define V3D_TO_V2D(v3,v2,width,height,distance) \ +{ \ + int Xp, Yp; \ + if (v3.z > 2) { \ + F2I((distance * v3.x / v3.z),Xp) ; \ + F2I((distance * v3.y / v3.z),Yp) ; \ + v2.x = Xp + (width>>1); \ + v2.y = -Yp + (height>>1); \ + } \ + else v2.x=v2.y=-666; \ +} + +void v3d_to_v2d(v3d *src, int nbvertex, int width, int height, float distance, v2d *v2_array); + +/* + * rotation selon Y du v3d vi d'angle a (cosa=cos(a), sina=sin(a)) + * centerz = centre de rotation en z + */ +#define Y_ROTATE_V3D(vi,vf,sina,cosa)\ +{\ + vf.x = vi.x * cosa - vi.z * sina;\ + vf.z = vi.x * sina + vi.z * cosa;\ + vf.y = vi.y;\ +} + +/* + * translation + */ +#define TRANSLATE_V3D(vsrc,vdest)\ +{\ + vdest.x += vsrc.x;\ + vdest.y += vsrc.y;\ + vdest.z += vsrc.z;\ +} + +#define MUL_V3D(lf,v) {v.x*=lf;v.y*=lf;v.z*=lf;} + +#endif diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/xmmx.c kodi-visualization-goom-2.1.0/lib/goom/src/xmmx.c --- kodi-visualization-goom-1.1.0/lib/goom/src/xmmx.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/xmmx.c 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,390 @@ + +#ifdef HAVE_MMX + +/* a definir pour avoir exactement le meme resultat que la fonction C + * (un chouillat plus lent).. mais la difference est assez peu notable. + */ +// #define STRICT_COMPAT + +#define BUFFPOINTNB 16 +#define BUFFPOINTMASK 0xffff +#define BUFFINCR 0xff + +#define sqrtperte 16 +/* faire : a % sqrtperte <=> a & pertemask*/ +#define PERTEMASK 0xf +/* faire : a / sqrtperte <=> a >> PERTEDEC*/ +#define PERTEDEC 4 + + +/*#define MMX_TRACE*/ +#include "mmx.h" +/*#include "xmmx.h"*/ +#include "goom_graphic.h" + +int xmmx_supported (void) { + return (mm_support()&0x8)>>3; +} + +void zoom_filter_xmmx (int prevX, int prevY, + Pixel *expix1, Pixel *expix2, + int *lbruS, int *lbruD, int buffratio, + int precalCoef[16][16]) +{ + int bufsize = prevX * prevY; /* taille du buffer */ + volatile int loop; /* variable de boucle */ + + mmx_t *brutS = (mmx_t*)lbruS; /* buffer de transformation source */ + mmx_t *brutD = (mmx_t*)lbruD; /* buffer de transformation dest */ + + volatile mmx_t prevXY; + volatile mmx_t ratiox; + /* volatile mmx_t interpix; */ + + expix1[0].val=expix1[prevX-1].val=expix1[prevX*prevY-1].val=expix1[prevX*prevY-prevX].val=0; + + prevXY.ud[0] = (prevX-1)<> 16 */ + + "#1 \n\t paddd %%mm1, %%mm0" /* mm0 = S + mm1 */ + "#1 \n\t psrld $16, %%mm0" + : + :[brutS] "r" (&brutS[loop]) ,[brutD] "r" (&brutD[loop]) + ); /* mm0 = S */ + + /* + * pre : mm0 : position vector on screen + * prevXY : coordinate of the lower-right point on screen + * post : clipped mm0 + * modified : mm0,mm1,mm2 + */ + asm volatile + ("#1 \n\t movq %[prevXY], %%mm1" + "#1 \n\t pcmpgtd %%mm0, %%mm1" + /* mm0 en X contient (idem pour Y) : + * 1111 si prevXY > px + * 0000 si prevXY <= px */ +#ifdef STRICT_COMPAT + "#1 \n\t movq %%mm1, %%mm2" + "#1 \n\t punpckhdq %%mm2, %%mm2" + "#1 \n\t punpckldq %%mm1, %%mm1" + "#1 \n\t pand %%mm2, %%mm0" +#endif + + "#1 \n\t pand %%mm1, %%mm0" /* on met a zero la partie qui deborde */ + ::[prevXY]"m"(prevXY)); + + /* Thread #2 + * pre : mm0 : clipped position on screen + * + * post : mm3 : coefs for this position + * mm1 : X vector [0|X] + * + * modif : eax,esi + */ + __asm__ __volatile__ ( + "#2 \n\t movd %%mm0,%%esi" + "#2 \n\t movq %%mm0,%%mm1" + + "#2 \n\t andl $15,%%esi" + "#2 \n\t psrlq $32,%%mm1" + + "#2 \n\t shll $6,%%esi" + "#2 \n\t movd %%mm1,%%eax" + + "#2 \n\t addl %[precalCoef],%%esi" + "#2 \n\t andl $15,%%eax" + + "#2 \n\t movd (%%esi,%%eax,4),%%mm3" + ::[precalCoef]"g"(precalCoef):"eax","esi"); + + /* + * extraction des coefficients... (Thread #3) + * + * pre : coef dans mm3 + * + * post : coef extraits dans mm3 (c1 & c2) + * et mm4 (c3 & c4) + * + * modif : mm5 + */ + + /* (Thread #4) + * pre : mm0 : Y pos [*|Y] + * mm1 : X pos [*|X] + * + * post : mm0 : expix1[position] + * mm2 : expix1[position+largeur] + * + * modif : eax, esi + */ + __asm__ __volatile__ ( + "#2 \n\t psrld $4, %%mm0" + "#2 \n\t psrld $4, %%mm1" /* PERTEDEC = $4 */ + + "#4 \n\t movd %%mm1,%%eax" + "#3 \n\t movq %%mm3,%%mm5" + + "#4 \n\t mull %[prevX]" + "#4 \n\t movd %%mm0,%%esi" + + "#3 \n\t punpcklbw %%mm5, %%mm3" + "#4 \n\t addl %%esi, %%eax" + + "#3 \n\t movq %%mm3, %%mm4" + "#3 \n\t movq %%mm3, %%mm5" + + "#4 \n\t movl %[expix1], %%esi" + "#3 \n\t punpcklbw %%mm5, %%mm3" + + "#4 \n\t movq (%%esi,%%eax,4),%%mm0" + "#3 \n\t punpckhbw %%mm5, %%mm4" + + "#4 \n\t addl %[prevX],%%eax" + "#4 \n\t movq (%%esi,%%eax,4),%%mm2" + + : + : [expix1] "g"(expix1) + , [prevX] "g"(prevX) + :"eax","esi" + ); + + /* + * pre : mm0 : expix1[position] + * mm2 : expix1[position+largeur] + * mm3 & mm4 : coefs + */ + + /* recopie des deux premiers pixels dans mm0 et mm1 */ + movq_r2r (mm0, mm1); /* b1-v1-r1-a1-b2-v2-r2-a2 */ + + /* depackage du premier pixel */ + punpcklbw_r2r (mm7, mm0); /* 00-b2-00-v2-00-r2-00-a2 */ + + /* extraction des coefficients... */ + + movq_r2r (mm3, mm5); /* c2-c2-c2-c2-c1-c1-c1-c1 */ + + /*^en parrallele^*/ /* depackage du 2ieme pixel */ + /*^*/ punpckhbw_r2r (mm7, mm1); /* 00-b1-00-v1-00-r1-00-a1 */ + + punpcklbw_r2r (mm7, mm5); /* 00-c1-00-c1-00-c1-00-c1 */ + punpckhbw_r2r (mm7, mm3); /* 00-c2-00-c2-00-c2-00-c2 */ + + /* multiplication des pixels par les coefficients */ + pmullw_r2r (mm5, mm0); /* c1*b2-c1*v2-c1*r2-c1*a2 */ + pmullw_r2r (mm3, mm1); /* c2*b1-c2*v1-c2*r1-c2*a1 */ + paddw_r2r (mm1, mm0); + + /* ...extraction des 2 derniers coefficients */ + movq_r2r (mm4, mm5); /* c4-c4-c4-c4-c3-c3-c3-c3 */ + punpcklbw_r2r (mm7, mm4); /* 00-c3-00-c3-00-c3-00-c3 */ + punpckhbw_r2r (mm7, mm5); /* 00-c4-00-c4-00-c4-00-c4 */ + + /* recuperation des 2 derniers pixels */ + movq_r2r (mm2, mm1); + + /* depackage des pixels */ + punpcklbw_r2r (mm7, mm1); + punpckhbw_r2r (mm7, mm2); + + /* multiplication pas les coeffs */ + pmullw_r2r (mm4, mm1); + pmullw_r2r (mm5, mm2); + + /* ajout des valeurs obtenues la valeur finale */ + paddw_r2r (mm1, mm0); + paddw_r2r (mm2, mm0); + + /* division par 256 = 16+16+16+16, puis repackage du pixel final */ + psrlw_i2r (8, mm0); + packuswb_r2r (mm7, mm0); + + movd_r2m (mm0,expix2[loop]); + + ++loop; + } + __asm__ __volatile__ ("emms\n"); +} + +#define DRAWMETHOD_PLUS_XMMX(_out,_backbuf,_col) \ +{ \ + movd_m2r(_backbuf, mm0); \ + paddusb_m2r(_col, mm0); \ + movd_r2m(mm0, _out); \ +} + +#define DRAWMETHOD DRAWMETHOD_PLUS_XMMX(*p,*p,col) + +void draw_line_xmmx (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny) +{ + int x, y, dx, dy, yy, xx; + Pixel *p; + + if ((y1 < 0) || (y2 < 0) || (x1 < 0) || (x2 < 0) || (y1 >= screeny) || (y2 >= screeny) || (x1 >= screenx) || (x2 >= screenx)) + goto end_of_line; + + dx = x2 - x1; + dy = y2 - y1; + if (x1 >= x2) { + int tmp; + + tmp = x1; + x1 = x2; + x2 = tmp; + tmp = y1; + y1 = y2; + y2 = tmp; + dx = x2 - x1; + dy = y2 - y1; + } + + /* vertical line */ + if (dx == 0) { + if (y1 < y2) { + p = &(data[(screenx * y1) + x1]); + for (y = y1; y <= y2; y++) { + DRAWMETHOD; + p += screenx; + } + } + else { + p = &(data[(screenx * y2) + x1]); + for (y = y2; y <= y1; y++) { + DRAWMETHOD; + p += screenx; + } + } + goto end_of_line; + } + /* horizontal line */ + if (dy == 0) { + if (x1 < x2) { + p = &(data[(screenx * y1) + x1]); + for (x = x1; x <= x2; x++) { + DRAWMETHOD; + p++; + } + goto end_of_line; + } + else { + p = &(data[(screenx * y1) + x2]); + for (x = x2; x <= x1; x++) { + DRAWMETHOD; + p++; + } + goto end_of_line; + } + } + /* 1 */ + /* \ */ + /* \ */ + /* 2 */ + if (y2 > y1) { + /* steep */ + if (dy > dx) { + dx = ((dx << 16) / dy); + x = x1 << 16; + for (y = y1; y <= y2; y++) { + xx = x >> 16; + p = &(data[(screenx * y) + xx]); + DRAWMETHOD; + if (xx < (screenx - 1)) { + p++; + /* DRAWMETHOD; */ + } + x += dx; + } + goto end_of_line; + } + /* shallow */ + else { + dy = ((dy << 16) / dx); + y = y1 << 16; + for (x = x1; x <= x2; x++) { + yy = y >> 16; + p = &(data[(screenx * yy) + x]); + DRAWMETHOD; + if (yy < (screeny - 1)) { + p += screeny; + /* DRAWMETHOD; */ + } + y += dy; + } + } + } + /* 2 */ + /* / */ + /* / */ + /* 1 */ + else { + /* steep */ + if (-dy > dx) { + dx = ((dx << 16) / -dy); + x = (x1 + 1) << 16; + for (y = y1; y >= y2; y--) { + xx = x >> 16; + p = &(data[(screenx * y) + xx]); + DRAWMETHOD; + if (xx < (screenx - 1)) { + p--; + /* DRAWMETHOD; */ + } + x += dx; + } + goto end_of_line; + } + /* shallow */ + else { + dy = ((dy << 16) / dx); + y = y1 << 16; + for (x = x1; x <= x2; x++) { + yy = y >> 16; + p = &(data[(screenx * yy) + x]); + DRAWMETHOD; + if (yy < (screeny - 1)) { + p += screeny; + /* DRAWMETHOD; */ + } + y += dy; + } + goto end_of_line; + } + } +end_of_line: + __asm__ __volatile__ ("emms\n"); +} + +#endif diff -Nru kodi-visualization-goom-1.1.0/lib/goom/src/xmmx.h kodi-visualization-goom-2.1.0/lib/goom/src/xmmx.h --- kodi-visualization-goom-1.1.0/lib/goom/src/xmmx.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/src/xmmx.h 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,537 @@ +/* xmmx.h + + eXtended MultiMedia eXtensions GCC interface library for IA32. + + To use this library, simply include this header file + and compile with GCC. You MUST have inlining enabled + in order for xmmx_ok() to work; this can be done by + simply using -O on the GCC command line. + + Compiling with -DXMMX_TRACE will cause detailed trace + output to be sent to stderr for each mmx operation. + This adds lots of code, and obviously slows execution to + a crawl, but can be very useful for debugging. + + THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT + LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS FOR ANY PARTICULAR PURPOSE. + + 1999 by R. Fisher + Based on libmmx, 1997-99 by H. Dietz and R. Fisher + + Notes: + It appears that the latest gas has the pand problem fixed, therefore + I'll undefine BROKEN_PAND by default. +*/ + +#ifndef _XMMX_H +#define _XMMX_H + + +/* Warning: at this writing, the version of GAS packaged + with most Linux distributions does not handle the + parallel AND operation mnemonic correctly. If the + symbol BROKEN_PAND is defined, a slower alternative + coding will be used. If execution of mmxtest results + in an illegal instruction fault, define this symbol. +*/ +#undef BROKEN_PAND + + +/* The type of an value that fits in an (Extended) MMX register + (note that long long constant values MUST be suffixed + by LL and unsigned long long values by ULL, lest + they be truncated by the compiler) +*/ +#ifndef _MMX_H +typedef union { + long long q; /* Quadword (64-bit) value */ + unsigned long long uq; /* Unsigned Quadword */ + int d[2]; /* 2 Doubleword (32-bit) values */ + unsigned int ud[2]; /* 2 Unsigned Doubleword */ + short w[4]; /* 4 Word (16-bit) values */ + unsigned short uw[4]; /* 4 Unsigned Word */ + char b[8]; /* 8 Byte (8-bit) values */ + unsigned char ub[8]; /* 8 Unsigned Byte */ + float s[2]; /* Single-precision (32-bit) value */ +} __attribute__ ((aligned (8))) mmx_t; /* On an 8-byte (64-bit) boundary */ +#endif + + + +/* Function to test if multimedia instructions are supported... +*/ +static int +mm_support(void) +{ + /* Returns 1 if MMX instructions are supported, + 3 if Cyrix MMX and Extended MMX instructions are supported + 5 if AMD MMX and 3DNow! instructions are supported + 0 if hardware does not support any of these + */ + register int rval = 0; + + __asm__ __volatile__ ( + /* See if CPUID instruction is supported ... */ + /* ... Get copies of EFLAGS into eax and ecx */ + "pushf\n\t" + "popl %%eax\n\t" + "movl %%eax, %%ecx\n\t" + + /* ... Toggle the ID bit in one copy and store */ + /* to the EFLAGS reg */ + "xorl $0x200000, %%eax\n\t" + "push %%eax\n\t" + "popf\n\t" + + /* ... Get the (hopefully modified) EFLAGS */ + "pushf\n\t" + "popl %%eax\n\t" + + /* ... Compare and test result */ + "xorl %%eax, %%ecx\n\t" + "testl $0x200000, %%ecx\n\t" + "jz NotSupported1\n\t" /* CPUID not supported */ + + + /* Get standard CPUID information, and + go to a specific vendor section */ + "movl $0, %%eax\n\t" + "cpuid\n\t" + + /* Check for Intel */ + "cmpl $0x756e6547, %%ebx\n\t" + "jne TryAMD\n\t" + "cmpl $0x49656e69, %%edx\n\t" + "jne TryAMD\n\t" + "cmpl $0x6c65746e, %%ecx\n" + "jne TryAMD\n\t" + "jmp Intel\n\t" + + /* Check for AMD */ + "\nTryAMD:\n\t" + "cmpl $0x68747541, %%ebx\n\t" + "jne TryCyrix\n\t" + "cmpl $0x69746e65, %%edx\n\t" + "jne TryCyrix\n\t" + "cmpl $0x444d4163, %%ecx\n" + "jne TryCyrix\n\t" + "jmp AMD\n\t" + + /* Check for Cyrix */ + "\nTryCyrix:\n\t" + "cmpl $0x69727943, %%ebx\n\t" + "jne NotSupported2\n\t" + "cmpl $0x736e4978, %%edx\n\t" + "jne NotSupported3\n\t" + "cmpl $0x64616574, %%ecx\n\t" + "jne NotSupported4\n\t" + /* Drop through to Cyrix... */ + + + /* Cyrix Section */ + /* See if extended CPUID level 80000001 is supported */ + /* The value of CPUID/80000001 for the 6x86MX is undefined + according to the Cyrix CPU Detection Guide (Preliminary + Rev. 1.01 table 1), so we'll check the value of eax for + CPUID/0 to see if standard CPUID level 2 is supported. + According to the table, the only CPU which supports level + 2 is also the only one which supports extended CPUID levels. + */ + "cmpl $0x2, %%eax\n\t" + "jne MMXtest\n\t" /* Use standard CPUID instead */ + + /* Extended CPUID supported (in theory), so get extended + features */ + "movl $0x80000001, %%eax\n\t" + "cpuid\n\t" + "testl $0x00800000, %%eax\n\t" /* Test for MMX */ + "jz NotSupported5\n\t" /* MMX not supported */ + "testl $0x01000000, %%eax\n\t" /* Test for Ext'd MMX */ + "jnz EMMXSupported\n\t" + "movl $1, %0:\n\n\t" /* MMX Supported */ + "jmp Return\n\n" + "EMMXSupported:\n\t" + "movl $3, %0:\n\n\t" /* EMMX and MMX Supported */ + "jmp Return\n\t" + + + /* AMD Section */ + "AMD:\n\t" + + /* See if extended CPUID is supported */ + "movl $0x80000000, %%eax\n\t" + "cpuid\n\t" + "cmpl $0x80000000, %%eax\n\t" + "jl MMXtest\n\t" /* Use standard CPUID instead */ + + /* Extended CPUID supported, so get extended features */ + "movl $0x80000001, %%eax\n\t" + "cpuid\n\t" + "testl $0x00800000, %%edx\n\t" /* Test for MMX */ + "jz NotSupported6\n\t" /* MMX not supported */ + "testl $0x80000000, %%edx\n\t" /* Test for 3DNow! */ + "jnz ThreeDNowSupported\n\t" + "movl $1, %0:\n\n\t" /* MMX Supported */ + "jmp Return\n\n" + "ThreeDNowSupported:\n\t" + "movl $5, %0:\n\n\t" /* 3DNow! and MMX Supported */ + "jmp Return\n\t" + + + /* Intel Section */ + "Intel:\n\t" + + /* Check for MMX */ + "MMXtest:\n\t" + "movl $1, %%eax\n\t" + "cpuid\n\t" + "testl $0x00800000, %%edx\n\t" /* Test for MMX */ + "jz NotSupported7\n\t" /* MMX Not supported */ + "movl $1, %0:\n\n\t" /* MMX Supported */ + "jmp Return\n\t" + + /* Nothing supported */ + "\nNotSupported1:\n\t" + "#movl $101, %0:\n\n\t" + "\nNotSupported2:\n\t" + "#movl $102, %0:\n\n\t" + "\nNotSupported3:\n\t" + "#movl $103, %0:\n\n\t" + "\nNotSupported4:\n\t" + "#movl $104, %0:\n\n\t" + "\nNotSupported5:\n\t" + "#movl $105, %0:\n\n\t" + "\nNotSupported6:\n\t" + "#movl $106, %0:\n\n\t" + "\nNotSupported7:\n\t" + "#movl $107, %0:\n\n\t" + "movl $0, %0:\n\n\t" + + "Return:\n\t" + : "=a" (rval) + : /* no input */ + : "eax", "ebx", "ecx", "edx" + ); + + /* Return */ + return(rval); +} + +/* Function to test if mmx instructions are supported... +*/ +#ifndef _XMMX_H +inline extern int +mmx_ok(void) +{ + /* Returns 1 if MMX instructions are supported, 0 otherwise */ + return ( mm_support() & 0x1 ); +} +#endif + +/* Function to test if xmmx instructions are supported... +*/ +inline extern int +xmmx_ok(void) +{ + /* Returns 1 if Extended MMX instructions are supported, 0 otherwise */ + return ( (mm_support() & 0x2) >> 1 ); +} + + +/* Helper functions for the instruction macros that follow... + (note that memory-to-register, m2r, instructions are nearly + as efficient as register-to-register, r2r, instructions; + however, memory-to-memory instructions are really simulated + as a convenience, and are only 1/3 as efficient) +*/ +#ifdef XMMX_TRACE + +/* Include the stuff for printing a trace to stderr... +*/ + +#include + +#define mmx_i2r(op, imm, reg) \ + { \ + mmx_t mmx_trace; \ + mmx_trace.uq = (imm); \ + fprintf(stderr, #op "_i2r(" #imm "=0x%08x%08x, ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ ("movq %%" #reg ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + fprintf(stderr, #reg "=0x%08x%08x) => ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ (#op " %0, %%" #reg \ + : /* nothing */ \ + : "X" (imm)); \ + __asm__ __volatile__ ("movq %%" #reg ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + fprintf(stderr, #reg "=0x%08x%08x\n", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + } + +#define mmx_m2r(op, mem, reg) \ + { \ + mmx_t mmx_trace; \ + mmx_trace = (mem); \ + fprintf(stderr, #op "_m2r(" #mem "=0x%08x%08x, ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ ("movq %%" #reg ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + fprintf(stderr, #reg "=0x%08x%08x) => ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ (#op " %0, %%" #reg \ + : /* nothing */ \ + : "X" (mem)); \ + __asm__ __volatile__ ("movq %%" #reg ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + fprintf(stderr, #reg "=0x%08x%08x\n", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + } + +#define mmx_r2m(op, reg, mem) \ + { \ + mmx_t mmx_trace; \ + __asm__ __volatile__ ("movq %%" #reg ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + fprintf(stderr, #op "_r2m(" #reg "=0x%08x%08x, ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + mmx_trace = (mem); \ + fprintf(stderr, #mem "=0x%08x%08x) => ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ (#op " %%" #reg ", %0" \ + : "=X" (mem) \ + : /* nothing */ ); \ + mmx_trace = (mem); \ + fprintf(stderr, #mem "=0x%08x%08x\n", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + } + +#define mmx_r2r(op, regs, regd) \ + { \ + mmx_t mmx_trace; \ + __asm__ __volatile__ ("movq %%" #regs ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + fprintf(stderr, #op "_r2r(" #regs "=0x%08x%08x, ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ ("movq %%" #regd ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + fprintf(stderr, #regd "=0x%08x%08x) => ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ (#op " %" #regs ", %" #regd); \ + __asm__ __volatile__ ("movq %%" #regd ", %0" \ + : "=X" (mmx_trace) \ + : /* nothing */ ); \ + fprintf(stderr, #regd "=0x%08x%08x\n", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + } + +#define mmx_m2m(op, mems, memd) \ + { \ + mmx_t mmx_trace; \ + mmx_trace = (mems); \ + fprintf(stderr, #op "_m2m(" #mems "=0x%08x%08x, ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + mmx_trace = (memd); \ + fprintf(stderr, #memd "=0x%08x%08x) => ", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + __asm__ __volatile__ ("movq %0, %%mm0\n\t" \ + #op " %1, %%mm0\n\t" \ + "movq %%mm0, %0" \ + : "=X" (memd) \ + : "X" (mems)); \ + mmx_trace = (memd); \ + fprintf(stderr, #memd "=0x%08x%08x\n", \ + mmx_trace.d[1], mmx_trace.d[0]); \ + } + +#else + +/* These macros are a lot simpler without the tracing... +*/ + +#define mmx_i2r(op, imm, reg) \ + __asm__ __volatile__ (#op " %0, %%" #reg \ + : /* nothing */ \ + : "X" (imm) ) + +#define mmx_m2r(op, mem, reg) \ + __asm__ __volatile__ (#op " %0, %%" #reg \ + : /* nothing */ \ + : "X" (mem)) + +#define mmx_m2ir(op, mem, rs) \ + __asm__ __volatile__ (#op " %0, %%" #rs \ + : /* nothing */ \ + : "X" (mem) ) + +#define mmx_r2m(op, reg, mem) \ + __asm__ __volatile__ (#op " %%" #reg ", %0" \ + : "=X" (mem) \ + : /* nothing */ ) + +#define mmx_r2r(op, regs, regd) \ + __asm__ __volatile__ (#op " %" #regs ", %" #regd) + +#define mmx_r2ir(op, rs1, rs2) \ + __asm__ __volatile__ (#op " %%" #rs1 ", %%" #rs2 \ + : /* nothing */ \ + : /* nothing */ ) + +#define mmx_m2m(op, mems, memd) \ + __asm__ __volatile__ ("movq %0, %%mm0\n\t" \ + #op " %1, %%mm0\n\t" \ + "movq %%mm0, %0" \ + : "=X" (memd) \ + : "X" (mems)) + +#endif + + + +/* 1x64 MOVe Quadword + (this is both a load and a store... + in fact, it is the only way to store) +*/ +#define movq_m2r(var, reg) mmx_m2r(movq, var, reg) +#define movq_r2m(reg, var) mmx_r2m(movq, reg, var) +#define movq_r2r(regs, regd) mmx_r2r(movq, regs, regd) +#define movq(vars, vard) \ + __asm__ __volatile__ ("movq %1, %%mm0\n\t" \ + "movq %%mm0, %0" \ + : "=X" (vard) \ + : "X" (vars)) + + +/* 1x32 MOVe Doubleword + (like movq, this is both load and store... + but is most useful for moving things between + mmx registers and ordinary registers) +*/ +#define movd_m2r(var, reg) mmx_m2r(movd, var, reg) +#define movd_r2m(reg, var) mmx_r2m(movd, reg, var) +#define movd_r2r(regs, regd) mmx_r2r(movd, regs, regd) +#define movd(vars, vard) \ + __asm__ __volatile__ ("movd %1, %%mm0\n\t" \ + "movd %%mm0, %0" \ + : "=X" (vard) \ + : "X" (vars)) + + + +/* 4x16 Parallel MAGnitude +*/ +#define pmagw_m2r(var, reg) mmx_m2r(pmagw, var, reg) +#define pmagw_r2r(regs, regd) mmx_r2r(pmagw, regs, regd) +#define pmagw(vars, vard) mmx_m2m(pmagw, vars, vard) + + +/* 4x16 Parallel ADDs using Saturation arithmetic + and Implied destination +*/ +#define paddsiw_m2ir(var, rs) mmx_m2ir(paddsiw, var, rs) +#define paddsiw_r2ir(rs1, rs2) mmx_r2ir(paddsiw, rs1, rs2) +#define paddsiw(vars, vard) mmx_m2m(paddsiw, vars, vard) + + +/* 4x16 Parallel SUBs using Saturation arithmetic + and Implied destination +*/ +#define psubsiw_m2ir(var, rs) mmx_m2ir(psubsiw, var, rs) +#define psubsiw_r2ir(rs1, rs2) mmx_r2ir(psubsiw, rs1, rs2) +#define psubsiw(vars, vard) mmx_m2m(psubsiw, vars, vard) + + +/* 4x16 Parallel MULs giving High 4x16 portions of results + Rounded with 1/2 bit 15. +*/ +#define pmulhrw_m2r(var, reg) mmx_m2r(pmulhrw, var, reg) +#define pmulhrw_r2r(regs, regd) mmx_r2r(pmulhrw, regs, regd) +#define pmulhrw(vars, vard) mmx_m2m(pmulhrw, vars, vard) + + +/* 4x16 Parallel MULs giving High 4x16 portions of results + Rounded with 1/2 bit 15, storing to Implied register +*/ +#define pmulhriw_m2ir(var, rs) mmx_m2ir(pmulhriw, var, rs) +#define pmulhriw_r2ir(rs1, rs2) mmx_r2ir(pmulhriw, rs1, rs2) +#define pmulhriw(vars, vard) mmx_m2m(pmulhriw, vars, vard) + + +/* 4x16 Parallel Muls (and ACcumulate) giving High 4x16 portions + of results Rounded with 1/2 bit 15, accumulating with Implied register +*/ +#define pmachriw_m2ir(var, rs) mmx_m2ir(pmachriw, var, rs) +#define pmachriw_r2ir(rs1, rs2) mmx_r2ir(pmachriw, rs1, rs2) +#define pmachriw(vars, vard) mmx_m2m(pmachriw, vars, vard) + + +/* 8x8u Parallel AVErage +*/ +#define paveb_m2r(var, reg) mmx_m2r(paveb, var, reg) +#define paveb_r2r(regs, regd) mmx_r2r(paveb, regs, regd) +#define paveb(vars, vard) mmx_m2m(paveb, vars, vard) + + +/* 8x8u Parallel DISTance and accumulate with + unsigned saturation to Implied register +*/ +#define pdistib_m2ir(var, rs) mmx_m2ir(pdistib, var, rs) +#define pdistib(vars, vard) mmx_m2m(pdistib, vars, vard) + + +/* 8x8 Parallel conditional MoVe + if implied register field is Zero +*/ +#define pmvzb_m2ir(var, rs) mmx_m2ir(pmvzb, var, rs) + + +/* 8x8 Parallel conditional MoVe + if implied register field is Not Zero +*/ +#define pmvnzb_m2ir(var, rs) mmx_m2ir(pmvnzb, var, rs) + + +/* 8x8 Parallel conditional MoVe + if implied register field is Less than Zero +*/ +#define pmvlzb_m2ir(var, rs) mmx_m2ir(pmvlzb, var, rs) + + +/* 8x8 Parallel conditional MoVe + if implied register field is Greater than or Equal to Zero +*/ +#define pmvgezb_m2ir(var, rs) mmx_m2ir(pmvgezb, var, rs) + + +/* Fast Empty MMx State + (used to clean-up when going from mmx to float use + of the registers that are shared by both; note that + there is no float-to-xmmx operation needed, because + only the float tag word info is corruptible) +*/ +#ifdef XMMX_TRACE + +#define femms() \ + { \ + fprintf(stderr, "femms()\n"); \ + __asm__ __volatile__ ("femms"); \ + } + +#else + +#define femms() __asm__ __volatile__ ("femms") + +#endif + +#endif + diff -Nru kodi-visualization-goom-1.1.0/lib/goom/test/testapp.c kodi-visualization-goom-2.1.0/lib/goom/test/testapp.c --- kodi-visualization-goom-1.1.0/lib/goom/test/testapp.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/test/testapp.c 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,17 @@ +#include +#include + +gint16 data[2][512]; + +int main() +{ + int i; + PluginInfo *goom; + goom = goom_init (640, 480); + for (i = 0; i<100; i++) + { + fprintf(stderr,"*"); + goom_update (goom, data, 0, -1, 0, 0); + } + return 0; +} diff -Nru kodi-visualization-goom-1.1.0/lib/goom/tools/gfont.c kodi-visualization-goom-2.1.0/lib/goom/tools/gfont.c --- kodi-visualization-goom-1.1.0/lib/goom/tools/gfont.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/tools/gfont.c 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,3483 @@ +/* GIMP RGBA C-Source image dump (gfont.c) */ + +static const struct { + unsigned int width; + unsigned int height; + unsigned int bytes_per_pixel; /* 3:RGB, 4:RGBA */ + char *comment; + unsigned char pixel_data[1277 * 21 * 4]; +} the_font = { + 1277, 21, 4, + "Created with The GIMP", + "y\21\244\377y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0y\21\244" + "\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377" + "y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244" + "\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21" + "\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377" + "y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21" + "\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21" + "\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21" + "\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244" + "\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244" + "\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377" + "y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0" + "\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21" + "\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21" + "\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21" + "\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21" + "\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244" + "\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244" + "\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244" + "\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244" + "\377\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377" + "\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21" + "\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244" + "\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21" + "\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21" + "\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21" + "\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21" + "\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21" + "\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244" + "\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0" + "\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21" + "\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244" + "\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21" + "\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21" + "\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244" + "\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244" + "\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244" + "\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21" + "\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244" + "\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21" + "\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244" + "\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0" + "\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244" + "\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244" + "\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244" + "\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21" + "\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21" + "\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21" + "\244\377\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21" + "\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21" + "\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244" + "\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21" + "\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21" + "\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244" + "\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244" + "\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244" + "\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21" + "\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21" + "\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21" + "\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21" + "\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244" + "\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0" + "y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377y\21\244" + "\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244" + "\377y\21\244\377\15\4\21\0\15\4\21\0\15\4\21\0\20\5\26\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26" + "\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4" + "\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23" + "\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23" + "\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20" + "\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23" + "\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4" + "\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26" + "\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26" + "\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0" + "\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16" + "\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26" + "\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20" + "\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0" + "\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0" + "\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26" + "\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0" + "\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0" + "\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26" + "\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16" + "\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0" + "\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0" + "\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\20\5\26\0\16\4\23\0\15\4\21\0\15\4\21\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\10\6\3""9\12\10\5U\11\7\4L\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""6\11\10\4`\11" + "\7\4U\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""9\11\10\4`\11\7\4U\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""9\13\10\4U\11\7\4O\0\0\0\0\0\0\0" + "\0\0\0\0\0\10\6\3""3\12\10\5U\10\6\3U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""9\13\10\4U\10\6\3U\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""9" + "\12\10\5U\11\7\4U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\5\4\2\16\10\6\3U\11\7\4U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\10\6\3J\11\7\4q\10\6\3\247\10\6\3\213\11\7\4U\5\4\2\16\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""9\11\10\4" + "n\11\7\4U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\4\2\24\11\7\4" + "U\11\10\4U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\10\4""9\11\10\4U\6\5\3""0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\4\2\21\10" + "\6\3U\11\7\4R\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\4\2\3\10\6\3U\11" + "\7\4]\10\6\3\231\10\6\3\241\10\6\3n\11\10\4U\10\6\3U\6\5\3\37\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\4\2\3\10\6\3U\12\10" + "\5U\12\7\5U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\5\4\2""9\10\6\3U\11\7\4[\10\6\3\231\10\6\3\252\10\6\3\244\10\6" + "\3l\10\6\3U\6\5\3G\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\4\2" + "*\10\6\3U\11\7\4[\10\6\3\231\10\6\3\252\10\6\3\244\10\6\3l\10\6\3U\6\5\3" + "G\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\5\4\2\3\10\6\3U\11\10\4U\11\7\4J\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\10\6\3*\11\7\4U\10\6\3U\11\7\4U\10\6\3}\10\6\3\252\7\6\4" + "\252\11\7\4\252\14\11\7\252\23\16\12\252\23\15\12\216\10\6\5\34\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\5\4\2""3\10\6\3U\11\7\4[\10\6\3\231\10\6\3\252\10" + "\6\3\244\10\6\3l\10\6\3U\6\5\3G\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12" + "\10\5""9\11\7\4\252\10\6\3\252\10\6\3\252\10\6\3\241\10\6\3\216\11\7\4`\11" + "\7\4U\10\6\3U\11\7\4U\11\7\4J\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\4" + "\2*\10\6\3U\11\7\4[\10\6\3\231\10\6\3\252\10\6\3\244\10\6\3l\10\6\3U\6\5" + "\3L\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5R\12\10\7\205\14" + "\11\7\252\17\13\10\252\17\13\10\252\17\13\10\252\15\12\10\252\12\10\7\241" + "\12\10\7U\6\5\5\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3" + "J\11\10\4U\10\6\3""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\7\6\4\34\11\7\4U\11\7\4U\5\4\2\21\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\4\2*\10\6\3U\11" + "\7\4[\10\6\3\231\10\6\3\252\10\6\3\244\10\6\3l\10\6\3U\6\5\3U\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5U\12\10\7\205\14\11\7\252\17\12" + "\10\252\17\13\10\252\17\13\10\252\15\12\10\252\12\10\7\226\10\6\5>\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5R\12\10\7\205\14\11\7\252" + "\17\12\10\252\16\12\7\252\11\7\4\252\10\6\5\223\12\10\5U\7\6\4U\5\4\4\3\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\11\7""9\13\10\6\241\11\7\6\252\12\10\7" + "\252\15\12\10\252\16\12\7\252\15\12\10\252\14\11\7\252\12\10\7\234\12\10" + "\7U\6\5\5\31\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\5\3""9\10\7\5U\11" + "\7\4n\11\7\4\252\12\10\5\252\12\10\5\252\13\10\6\252\12\10\7\226\12\10\7" + "U\6\5\5\31\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\13\10""9\13\10\6\252\11\7\6" + "\252\12\10\7\252\15\12\10\252\17\13\10\252\17\13\10\252\15\12\10\252\12\10" + "\7\237\12\10\7U\6\5\5\31\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\13\10;\13\11" + "\6\252\11\7\4}\12\10\5U\10\6\3\205\10\6\3\247\10\6\3\252\10\6\3\252\11\10" + "\4q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3*\12\10\5U\12\7\5U\11\7\4}\12\10" + "\5\252\14\12\7\252\16\13\7\252\23\16\12\252\23\16\12\216\10\6\5\34\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5R\12\10\7\205\14\11\7\252\17\13\10\252\17" + "\13\10\252\17\13\10\252\15\12\10\252\12\10\7\241\12\10\7U\6\5\5\31\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\14\12\7J\16\12\7\252\14\11\7\213\7\6\4\34\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7n\16\12\7\252\15\12\10}\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\15\12\10G\17\13\10\252\15\12\10\202\5\5\4\10\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\13\10\6U\11\7\4\252\12\10\5]\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\11" + "\7""9\12\10\5\247\13\10\6n\6\5\3\10\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\10" + "\6""9\12\7\5\237\13\10\6f\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""3\12\10" + "\5U\11\7\4U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\12\7\5""9\13\11\6U\7\6\4""9\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\5\4\34\12\10\5U\13\10\6U\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\10\6\3""0\12\10\5U\10\6\3U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\10\6\3""9\13\10\4U\11\7\4O\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\5\4\2-\10\6\3U\11\7\4U\11\7\4X\11\7\4l\11\10\4]\11\7\4U\10\6\3U\6\5" + "\3J\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3-\11\7\4U\10\6\3U\11\7" + "\4U\10\6\3}\10\6\3\252\10\6\3\244\10\6\3l\10\6\3U\6\5\3J\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\5\3""9\10\7\5U\12\10\5U\11\7\4w\10\6\3" + "\216\11\7\4\202\12\10\5[\12\7\5U\6\5\3U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\11\7\4""9\12\10\5U\12\7\5U\12\10\5U\10\6\3\220\10\6\3\252\10\6\3\244" + "\10\6\3l\10\6\3U\6\5\3G\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5" + "\4\2-\10\6\3U\11\7\4[\10\6\3\231\10\6\3\252\10\6\3\244\11\7\4i\10\6\3U\6" + "\5\3J\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\10\4;\11\7\4\252\10\6\3" + "\244\11\7\4[\10\6\3U\10\6\3U\10\6\3U\11\7\4U\10\6\3\216\11\6\4\252\11\10" + "\4t\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""0\12\10\5U\11\7\4U\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""9\13\10\4U\11\7\4L\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\10\6\3""0\12\10\5U\11\7\4U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\10\6\3""9\13\10\4U\11\7\4L\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10" + "\6\3""0\12\10\5U\11\7\4U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\10\6\3""9\13\10\4U\11\7\4L\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6" + "\3""6\11\10\4`\11\7\4U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""9" + "\11\10\4`\11\7\4U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5""9\12\7\5\231\12" + "\10\5]\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7]\16\13\7\252\15\12" + "\10\210\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\10\6[\13\10\6\252\11\7\4\252\11" + "\7\4\252\10\6\5\252\10\6\3w\11\7\4U\10\6\3U\10\6\3U\11\7\4U\11\7\4L\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3*\11\7\4U\10\6\3U\10\6\3z\11\10\4f\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""3\11\7\4U\6\5\3-\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\10\5""9\10" + "\6\3\234\12\7\5]\13\10\6U\13\10\6U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\6\5\5\16\15\12\10U\10\7\5-\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5""9\12" + "\7\5\234\12\10\5`\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4""9\12\10\5]\12\10\5U\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7n\15\12\10\252\14\11" + "\7\205\5\5\4\6\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5O\12\10\7\177\15\12\10\252\20" + "\14\11\216\10\7\5\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\10\6\3""9\12\10\5U\11\6\4U\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17" + "\13\10q\31\22\14\252\24\17\13\216\10\7\5\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\17\13\10\202\26\20\13\252\24\17\13\216\7\6\6\27" + "\0\0\0\0\0\0\0\0\0\0\0\0\15\12\10D\14\11\7\252\13\10\6t\6\5\3\10\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\14\11\7R\17\12\10\252\15\12\10\202\5\5\4\10\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\6\5\3""9\10\6\3U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\4\2\6\10\6\3U\10\6" + "\3\234\11\10\4q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""0\11\10\4[\11\7\4" + "L\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5""9\11\6\4\252\10\6\3c\5\4\2\"\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10" + "\6\3G\11\10\4]\11\10\4`\10\6\3U\6\5\3-\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3L\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\10\6\3""9:\37\11\377]2\14\377X-\13\377\14\12\5q\0\0\0\0\7" + "\6\4\34""6\35\11\377].\14\377X-\13\377\14\11\5z\0\0\0\0\7\5\4%6\35\11\377" + "].\14\377X-\13\377\16\12\5\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3U:\37" + "\11\377]2\14\377X,\13\377\11\7\4\252\0\0\0\0\5\4\2U4\34\11\377]0\14\377X" + ",\13\377\14\12\5\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\7\6\4U:\37\11\377]2\14\377X-\13\377\14\11\5\252\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""9:\37\11\377]2\14\377X-\13\377" + "\16\12\5\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\5\3\34\23\14\6\343" + "L%\13\377X-\13\377\16\12\5\213\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\10\4\252" + "E#\12\377\\/\13\377\\/\13\377X-\13\377X-\13\377\20\13\5\343\7\5\4\34\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""9:\37\11\377" + "].\14\377X-\13\377\16\12\5\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\5\3\34\23" + "\14\6\343R'\13\377\\/\13\377\16\12\5i\0\0\0\0\0\0\0\0\7\5\4\24""6\35\11\377" + "d2\15\377\36\23\7\377\10\6\3U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\6\5\3\34\23\14\6\343L%\13\377X-\13\377\16\12\5\202\0\0\0\0\0\0\0\0\0" + "\0\0\0\7\6\4A\21\13\6\343G%\12\377X-\13\377\\/\13\377\\/\13\377X-\13\377" + "X,\13\377X,\13\377\31\20\6\377\10\6\3\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\7\5\4U\21\14\6\345M'\14\377k3\16\377q7\20\377\24\16\11\262" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\13\7\252\35\22" + "\10\377J'\13\377X-\13\377X-\13\377\\/\13\377\\/\13\377X-\13\377X,\13\377" + ")\27\10\377\14\11\5\343\5\5\4\27\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4\252\32\21" + "\6\377J'\13\377X-\13\377X-\13\377\\/\13\377\\/\13\377X-\13\377X,\13\377)" + "\30\10\377\14\11\5\343\6\5\3\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\5\3U\20\13\5\343G%\12\377X-\13\377X,\13" + "\377\14\12\5q\0\0\0\0\0\0\0\0\10\6\3\34""6\35\11\377\\/\13\377X,\13\377X" + "-\13\377\\.\15\377d4\15\377m5\20\377y?\24\377\236J\27\377\264X\33\377\267" + "Z\34\377\32\21\13\216\0\0\0\0\0\0\0\0\0\0\0\0\12\7\5\252\32\21\6\377J'\13" + "\377X-\13\377\\/\13\377\\/\13\377\\/\13\377X-\13\377X-\13\377)\30\10\377" + "\14\11\5\343\6\5\3\34\0\0\0\0\0\0\0\0\7\6\4\10=\40\12\377f3\15\377\\.\15" + "\377\\.\15\377\\.\15\377\\.\15\377\\.\15\377Z-\13\377T,\13\377X-\13\377X" + ",\13\377\16\12\5w\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4\231\32\21\6\377J'\13\377" + "X-\13\377\\/\13\377\\/\13\377\\/\13\377X-\13\377X,\13\377-\31\10\377\15\12" + "\6\343\7\6\4\34\0\0\0\0\0\0\0\0\0\0\0\0\21\15\12\252@'\25\377\233N\32\377" + "\251S\32\377\245P\30\377\241O\30\377\221G\26\377\210F\25\377\206E\25\377" + "X2\27\377\26\21\13\350\11\10\6\37\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\4\4\3\27\14\11\5" + "\255G\"\12\377\\+\15\377!\24\10\377\12\10\5""9\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\24\16\7\343S*\14\377\\.\15\377\23\15\6\343" + "\6\5\3\"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\12\10\5\252\32\21\6\377L%\13\377Z.\13\377\\.\15\377\\.\15\377Z-\13\377Z" + "-\13\377X,\13\377.\32\11\377\22\15\11\343\10\7\5\34\0\0\0\0\0\0\0\0\0\0\0" + "\0\17\14\10\252:#\23\377\206I\27\377\231L\30\377\216E\25\377\203@\24\377" + "y;\22\377y;\22\377y>\22\377+\33\14\377\13\11\6\252\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\21\15\12\252@'\25\377\244U\33\377\261V\32\377\232K\27\377y>\22" + "\377s8\20\377w=\22\377{=\24\377P-\23\377\26\20\13\343\10\7\5\34\0\0\0\0\0" + "\0\0\0\15\12\10""9`0\23\377\245P\30\377\237N\30\377\237N\30\377\245P\30\377" + "\245P\30\377\245P\30\377\237N\30\377\244Q\31\377[4\30\377\26\21\13\343\10" + "\7\5\34\0\0\0\0\0\0\0\0\0\0\0\0\15\12\10\252&\30\13\377c/\20\377t;\21\377" + "~A\25\377\216E\25\377\231L\30\377\235J\30\377\233L\30\377[4\30\377\27\22" + "\14\343\10\7\5\34\0\0\0\0\0\0\0\0\15\12\10""9h4\25\377\253T\32\377\233L\30" + "\377\244Q\31\377\255Q\32\377\264X\33\377\264X\33\377\261V\32\377\251P\32" + "\377\\7\31\377\26\21\13\343\10\7\5\34\0\0\0\0\0\0\0\0\15\12\10""9r?\31\377" + "\261V\32\377r8\21\377\\.\15\377\\/\13\377].\14\377\\.\15\377`0\15\377\\." + "\15\377\22\14\5[\0\0\0\0\0\0\0\0\10\6\3(7\35\12\377l2\17\377r8\21\377\202" + "C\25\377\231L\30\377\241R\30\377\253T\32\377\263T\32\377\263T\32\377\31\21" + "\12\216\0\0\0\0\0\0\0\0\0\0\0\0\17\14\10\252@'\25\377\242T\33\377\263X\34" + "\377\267Z\34\377\265Y\34\377\265Y\34\377\254X\33\377\234M\31\377X2\27\377" + "\26\21\13\343\10\7\5\34\0\0\0\0\0\0\0\0\15\11\6""9`0\23\377\231G\26\377\206" + "E\25\377\24\16\11\301\0\0\0\0\0\0\0\0\0\0\0\0\13\10\6q|>\31\377\271[\34\377" + "\251P\32\377\26\17\11\216\0\0\0\0\0\0\0\0\13\10\6""9o=\30\377\270Z\33\377" + "\261V\32\377\27\20\12\255\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\10\6qr;\27\377\220I\25\377~?\25\377\24" + "\16\11\216\0\0\0\0\0\0\0\0\13\11\6""9a3\24\377\230G\27\377\206E\25\377\24" + "\16\11\273\0\0\0\0\0\0\0\0\0\0\0\0\14\11\7`a0\22\377\214G\25\377\212G\25" + "\377\24\17\11\216\0\0\0\0\0\0\0\0\10\6\3(4\34\11\377]2\14\377X-\13\377\16" + "\12\5\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\15\12\10R[0\20\377\204G\25\377?$\22\377\12\10\7\210\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\7\6\6>\37\25\14\364|B\27\377\206E\25\377\24\17\11\216" + "\0\0\0\0\0\0\0\0\10\6\3\34""6\35\11\377].\14\377P'\13\377\16\12\5\216\0\0" + "\0\0\0\0\0\0\0\0\0\0\10\6\3""9:\37\11\377]2\14\377X,\13\377\16\12\5t\0\0" + "\0\0\0\0\0\0\0\0\0\0\11\7\4\231\32\21\6\377J'\13\377X-\13\377X-\13\377X-" + "\13\377X-\13\377X,\13\377X,\13\377)\27\10\377\14\11\5\343\5\4\4\21\0\0\0" + "\0\0\0\0\0\10\6\3\"6\35\11\377\\+\13\377X,\13\377X-\13\377\\+\13\377\\/\13" + "\377\\/\13\377X-\13\377X,\13\377-\31\10\377\14\12\5\343\6\5\3\34\0\0\0\0" + "\0\0\0\0\0\0\0\0\15\12\6\252(\30\13\377a0\20\377q7\20\377s8\20\377t9\21\377" + "t9\21\377q7\20\377q7\20\377\25\377\270^\25\377u>\26\377\21\14\10\343" + "\7\5\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\10\6" + "\252C#\20\377\244U\25\377s:\20\377\24\16\7\374\10\6\5U\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4RB%\15\377\221K\22\377\232N\21\377s" + ":\20\377\35\22\10\377\16\12\7\377\20\13\7\377A\"\14\377\226J\23\377\275a" + "\26\377\212O\33\377\16\14\11\216\0\0\0\0\0\0\0\0\7\6\6""97!\20\377\236Q\23" + "\377\242P\23\377f5\21\377\30\17\7\377\23\14\6\252\16\12\5\314.\32\11\377" + "\211C\20\377\213G\20\3771\33\12\377\7\6\4i\0\0\0\0\0\0\0\0\7\6\6>H.\27\377" + "\307s\40\377\315o\34\377\233T\32\377)\30\16\377\22\15\11\377\31\20\12\377" + "n=\31\377\307d\34\377\315p\36\377\222W\35\377\15\13\10\216\0\0\0\0\0\0\0" + "\0\12\10\7\223\264W\31\377\316o\33\377\313i\32\377\244U\33\377(\30\17\377" + "\24\16\11\377\32\21\13\377y@\32\377\311e\34\377\315p\36\377\222W\35\377\16" + "\13\7\216\0\0\0\0\0\0\0\0\10\6\5""9G,\26\377\300l\31\377\306e\27\377\226" + "N\31\377)\30\16\377\40\25\15\377J)\25\377\270i\33\377\312h\31\377\312v\33" + "\377\256f\37\377\21\16\12\216\0\0\0\0\0\0\0\0\13\11\6\210\266\\\31\377\316" + "p\35\377\315o\34\377\246O\33\377+\31\20\377\25\17\12\377\35\23\14\377tC\33" + "\377\312k\37\377\316q\37\377\222W\35\377\14\12\7\216\0\0\0\0\0\0\0\0\13\10" + "\6\220\271]\32\377\312g\27\377\235M\22\377S*\14\377\23\15\6\377\15\12\6\377" + "\24\15\7\377\33\21\10\377\34\22\11\343\12\10\5-\0\0\0\0\0\0\0\0\13\11\6\216" + "\213I\24\377\306`\25\377\307j\30\377\233N\32\377)\31\16\377\25\17\12\377" + "\34\22\13\377&\30\17\377(\30\17\343\16\12\7>\0\0\0\0\0\0\0\0\10\7\5""9A)" + "\24\377\305l\34\377\315o\34\377\252X\33\377+\33\20\377\23\16\12\377\35\23" + "\14\377{B\30\377\265T\24\377\252W\23\377r<\21\377\13\12\6\216\0\0\0\0\0\0" + "\0\0\13\11\6Uw<\17\377\232K\21\377\232N\21\377\22\15\7\377\0\0\0\0\0\0\0" + "\0\0\0\0\0\15\12\10\252\277f\36\377\321v\36\377\317q\36\377\34\23\13\311" + "\0\0\0\0\0\0\0\0\15\12\10i\246W\27\377\306e\27\377\306a\27\377\32\22\13\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\15\12\10\252\275d\34\377\316o\33\377\314f\33\377\34\24\13\311\0" + "\0\0\0\0\0\0\0\14\12\7t\270]\33\377\316k\33\377\313q\32\377\27\21\12\377" + "\0\0\0\0\0\0\0\0\6\5\5\34\31\22\14\364\300i\33\377\316p\35\377\317u\36\377" + "\40\26\15\252\0\0\0\0\0\0\0\0\13\11\6Xp9\15\377\217F\20\377\215E\20\377\21" + "\14\6\343\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\16\13\11\252\270\\\31\377\316o\33\377\300o\37\3771!\22\377\12\10\7z\0\0" + "\0\0\0\0\0\0\0\0\0\0\7\7\6;\26\20\13\350\247d\34\377\315p\36\377\315t\36" + "\377\32\22\13\322\0\0\0\0\0\0\0\0\10\7\3Un6\15\377\215E\20\377\215K\20\377" + "\31\20\6\377\5\4\4(\0\0\0\0\0\0\0\0\12\10\5Up7\15\377\215K\20\377\215K\20" + "\377\24\15\5\252\0\0\0\0\0\0\0\0\5\4\2\34!\24\10\377\202B\17\377\215H\20" + "\377p7\15\377-\31\10\377\32\21\6\377!\24\10\377^/\15\377\215E\20\377\220" + "G\21\377P(\15\377\11\7\4}\0\0\0\0\0\0\0\0\12\10\5Up9\15\377\224O\21\377\215" + "K\20\377W*\14\377\23\15\6\377\16\12\5\327\17\12\6\377<\37\13\377\217G\22" + "\377\240R\23\377`6\21\377\14\11\7\216\0\0\0\0\0\0\0\0\10\6\5""9G,\26\377" + "\300d\31\377\307j\30\377\271]\32\377[2\26\377:!\21\377H)\23\377\236Q\31\377" + "\307j\30\377\307j\30\377\212O\33\377\15\13\10\216\0\0\0\0\0\0\0\0\12\10\7" + "\223\246W\27\377\313l\30\377\312l\31\377\231M\32\377&\26\15\377\17\13\6\377" + "\16\12\5\3774\34\11\377\204F\17\377\215K\20\377P)\15\377\12\10\5\213\0\0" + "\0\0\0\0\0\0\7\6\6""90\35\15\377\232O\23\377\240U\23\377l8\21\377\36\22\11" + "\377\20\13\7\377\30\17\11\377`3\21\377\247V\24\377\265X\24\377\214K\27\377" + "\22\16\11\220\0\0\0\0\0\0\0\0\0\0\0\0\26\16\7\301\26\15\7\377\24\15\7\377" + "N(\17\377\245Q\24\377\261Z\24\377\261Z\24\377s:\24\377\40\24\13\377\30\17" + "\11\377\36\23\11\343\13\10\6""6\0\0\0\0\0\0\0\0\13\11\6\216\213D\24\377\246" + "N\23\377\220G\21\377\23\14\6\327\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4\210r8\15" + "\377\217F\20\377\213D\20\377\23\15\6\252\0\0\0\0\0\0\0\0\12\7\5Up7\15\377" + "\217F\20\377\213J\20\377\21\13\6\335\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4\210r" + "8\15\377\217F\20\377\215K\20\377\24\15\5\252\0\0\0\0\0\0\0\0\11\6\4Un6\15" + "\377\215E\20\377\215H\20\377\21\13\6\335\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\11\7\4\210r8\15\377\217I\20\377\213J\20\377\23\15\6\252\0\0\0\0" + "\0\0\0\0\10\6\3Un6\15\377\217L\20\377\215E\20\377\22\14\5\374\0\0\0\0\0\0" + "\0\0\0\0\0\0\13\11\6\252\203E\22\377\252W\23\377\250V\23\377\34\23\11\252" + "\0\0\0\0\0\0\0\0\13\10\6U\221J\32\377\314f\33\377\313i\32\3774!\21\377\6" + "\5\5""9\0\0\0\0\0\0\0\0\21\16\12\343\276k\31\377\314q\31\377\256V\33\377" + "\22\15\11\252\0\0\0\0\0\0\0\0\0\0\0\0\34\22\13\306%\27\16\377\40\25\15\377" + "\25\17\12\377\24\16\11\377&\27\13\377W,\14\377\211F\20\377\215H\20\377\217" + "F\20\377\215H\20\377\22\14\5\252\0\0\0\0\0\0\0\0\11\6\4Un6\15\377\221J\20" + "\377\215E\20\377^/\15\377\33\21\10\343\14\10\5\34\0\0\0\0\0\0\0\0\16\12\7" + "Uy>\22\377\254W\23\377\213E\22\377\24\17\11\343\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\25\16\10\343u=\30\377\307" + "d\34\377\315j\32\377\314n\33\377\32\22\13\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\10\7\5\34\24\17\13\343\207I\26\377\300a\25\377\245S\26\377!\26\14\377" + "\12\11\7U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\13\11\6\252\270a\33\377\316p\35\377\314n\33\377\34\23\13\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\13\7\252\263]\30" + "\377\312g\27\377\306a\27\377\26\17\11\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\11\7\6\252}?\22\377\236M\21\377\222K\21\377\21\14\6\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\10\6\5LH.\27\377\305l\34\377\311k\30\377\244U\33\377%\26\16\343" + "\15\11\6""0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\14\11\7\252\212C\23\377\252O\23\377\250V\23\377\24\16\11\377\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10" + "\7\5\24\25\17\12\270\32\21\13\377\32\21\13\327\14\11\7J\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5\24\25\17\12\270\32\21\13\377\37\25" + "\14\317\22\15\11\34\0\0\0\0\0\0\0\0\13\11\10\234\270]\33\377\320i\35\377" + "\315o\34\377\34\23\13\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\13\7\252\270\\\31\377\313h\30\377\310" + "b\27\377\32\22\13\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5""93\35\14\377\230K\23" + "\377\242V\23\377\23\15\10\366\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\6\5\3\34\23\15\6\371\\.\15\377{?\16\377N'\13\377\25" + "\17\6\343\11\10\4\34\0\0\0\0\0\0\0\0\11\10\4Un;\15\377\215E\20\377\215K\20" + "\377\25\16\6\252\0\0\0\0\0\0\0\0\0\0\0\0\20\13\5\2524\34\11\377s;\16\377" + "t<\17\377+\32\12\377\11\7\6}\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5\34\25" + "\21\12\343m;\22\377\240R\23\377y@\22\377>\"\15\377^5\21\377\225N\24\377f" + "6\23\377\40\26\13\377H'\17\377y>\22\377\30\21\11\273\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3\247\200" + "B\17\377\241U\21\377\237Q\22\377\30\17\7\262\0\0\0\0\6\5\3%0\34\13\377\255" + "\\\24\377\265`\24\377\25\17\10\335\0\0\0\0\6\5\3\34(\30\11\377\217J\22\377" + "\236P\21\377\25\17\6\265\0\0\0\0\0\0\0\0\12\10\5""6k3\16\377\235S\22\377" + "\244T\23\377\260Y\23\377\275\\\24\377\277b\26\377\276j\27\377\305n\32\377" + "\313l\30\377\313u\30\377\315w\32\377\317z\36\377\307v\40\377\40\27\15\252" + "\0\0\0\0\0\0\0\0\0\0\0\0\7\6\4U\26\17\7\350q6\16\377\222K\21\377\236P\21" + "\377\232N\21\377\236P\21\377\224L\21\377\213G\20\377\207B\20\377\207B\20" + "\377\25\16\6\210\0\0\0\0\0\0\0\0\12\10\5U\200B\17\377\241U\21\377\236P\21" + "\377\31\20\6\314\0\0\0\0\0\0\0\0\0\0\0\0\7\6\4\34\31\20\10\343f2\17\377\224" + "L\21\377\216I\21\377T-\15\377\12\10\5q\0\0\0\0\0\0\0\0\11\7\4Rk5\16\377\222" + "K\21\377T)\15\377\10\7\5\306\3\2\2\27\5\4\4\210&\27\11\377\210F\21\377\214" + "H\21\377\25\17\6\262\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\6" + "\4""9-\32\12\377\217J\22\377\236P\21\377\32\21\6\252\0\0\0\0\0\0\0\0\0\0" + "\0\0\30\20\7\343s:\20\377\224L\21\377.\32\11\377\7\6\4\234\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\5\4\4G\23\15\6\377\213G\20\377\214H\21\377+\32\12\377" + "\11\10\4U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5Um4\16\377&\27\11\377\6" + "\5\3U\0\0\0\0\0\0\0\0\0\0\0\0\4\4\3\34\17\14\6\343s8\20\377\35\23\10\252" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\12\6" + "qz@\25\377\244U\25\377\212G\21\377\25\17\6\241\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15" + "\12\6\343\211C\20\377\232K\21\377T-\15\377\12\10\5t\0\0\0\0\0\0\0\0\11\7" + "\4Uo7\16\377\236W\21\377\236P\21\377\23\15\6\377\4\4\3\34\0\0\0\0\3\3\2q" + "\21\14\6\377\213G\20\377\241U\21\377\222K\21\377\24\16\7\322\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\20\15\11n\270i\33\377\321{\36\377\322|\37\377\320{\37" + "\377\317z\36\377\33\24\14\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\15\13\10\223\217K\24\377\241U\21\377\236P\21\377\33\22\10\343\5\4\2" + "\34\0\0\0\0\0\0\0\0\12\7\5\306\203A\20\377\241U\21\377\226L\21\377\25\16" + "\6\252\0\0\0\0\0\0\0\0\12\10\5U{=\20\377\243S\22\377\236P\21\377\33\22\10" + "\343\5\4\2\34\0\0\0\0\0\0\0\0\11\7\4\306\202B\17\377\243S\22\377\224L\21" + "\377\25\16\6\301\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\7\6\4U\26\17\7\377\203A\20\377\232N\21\377\232N\21\377\232N\21\377\232N" + "\21\377\25\17\6\252\0\0\0\0\0\0\0\0\12\10\5U\201@\20\377\243V\22\377\264" + "[\23\377\35\24\12\377\3\3\2]\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5zy<\20\377\241U\21\377\237Q\22\377\30" + "\17\7\377\4\4\3\"\0\0\0\0\2\2\1\6\21\15\10\265\265]\26\377\313l\30\377\315" + "r\32\377\40\27\15\322\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\5\4\4\241\36\26\15\377\306t\35\377\316j\31\377\277`" + "\24\377\32\21\7\252\0\0\0\0\0\0\0\0\11\7\4Ut<\17\377\241U\21\377\236P\21" + "\377\25\16\6\377\5\4\2\34\0\0\0\0\2\2\1\3\14\11\7\327\276k\31\377\323|\36" + "\377\320\206%\377\40\26\15\262\0\0\0\0\0\0\0\0\15\13\10`\273p\40\377\321" + "{\36\377\277`\24\377\34\23\11\377\4\3\3J\0\0\0\0\3\2\2\34\15\12\10\343\304" + "x\37\377\323|\36\377\307j\30\377\33\23\12\252\0\0\0\0\0\0\0\0\15\12\6""9" + "r=\23\377\262[\25\377\266f\27\377\27\21\12\255\0\0\0\0\0\0\0\0\13\11\6[\222" + "U\31\377\306q\35\377\304x\37\377\33\24\14\317\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\5\5\4\34\25\21\14\343\276v!\377\321\203(\377\241d\"\377\21\16" + "\12\343\5\5\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\11\10\6\252[;\34\377\275^\30\377\242S\23\377'\31\14\377" + "\7\7\6U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\216\267g\30\377" + "\313p\30\377\313p\30\377*\32\15\371\5\4\4>\0\0\0\0\3\2\2\31\14\11\7\343\303" + "s\36\377\324\177#\377\323\204&\377\40\26\15\265\0\0\0\0\0\0\0\0\14\12\7U" + "|A\21\377\241U\21\377\237N\22\377\25\16\6\377\5\4\2\34\0\0\0\0\0\0\0\0\7" + "\6\4\340\205D\20\377\237Q\22\377\222H\21\377\26\16\7\252\0\0\0\0\0\0\0\0" + "\15\13\10[\271o\40\377\322}!\377\315r\32\377%\32\16\377\4\4\3U\0\0\0\0\4" + "\4\4\34\15\12\10\343\301i\32\377\316o\33\377\312v\33\377\40\26\15\252\0\0" + "\0\0\0\0\0\0\13\11\6\177\256[\27\377\312f\25\377\310i\25\377$\27\15\377\4" + "\4\3U\0\0\0\0\3\3\2\34\15\13\10\343\306v!\377\324\177#\377\320\200!\377\37" + "\26\14\265\0\0\0\0\0\0\0\0\15\13\10[\271r\36\377\323|\36\377\320z\35\377" + "\"\30\15\377\4\4\3U\0\0\0\0\7\6\6q\40\30\15\377\271_\26\377\312b\25\377\306" + "a\27\377!\26\14\252\0\0\0\0\0\0\0\0\12\10\7\234\276l\33\377\324~!\377\323" + "\177$\377(\32\17\377\4\4\3U\0\0\0\0\3\3\2\34\15\13\10\343\306v!\377\326\201" + "%\377\323\204&\377\40\27\15\255\0\0\0\0\0\0\0\0\12\10\7\220\247W\26\377\271" + "^\24\377\245W\22\377\31\21\10\377\3\3\2""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\252\303p\36\377\322}!\377\320u\35\377" + "'\32\16\377\4\4\3U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\14\12\7\226\270l\33\377\323|\36\377\323\177$\377(\33\17\377\4\4\3U\0\0" + "\0\0\3\3\2\34\21\15\10\262\212G\21\377\241U\21\377\233O\22\377\25\16\6\252" + "\0\0\0\0\0\0\0\0\12\10\5U|=\17\377\251Y\22\377\264[\23\377\31\22\12\377\0" + "\0\0\0\0\0\0\0\0\0\0\0\15\13\10\252\304q\37\377\323|\36\377\315w\32\377\32" + "\22\13\314\0\0\0\0\0\0\0\0\13\11\6X\206F\23\377\255W\22\377\250V\23\377\24" + "\15\7\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\15\13\10\252\304q\37\377\322}!\377\317z\36\377\30\22\13" + "\324\0\0\0\0\0\0\0\0\13\11\6w\264]\27\377\313l\30\377\312g\27\377\24\17\11" + "\377\0\0\0\0\0\0\0\0\17\15\12\303e?\32\377\312u\31\377\316\200#\377\240j" + "#\377\17\15\12\216\0\0\0\0\0\0\0\0\12\10\5\223\213F\24\377\277`\24\377\310" + "i\25\377\31\22\12\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\15\12\10\252\275c\32\377\316s\33\377\315j\32\377\271j\34\377" + "O4\32\377\12\11\7z\0\0\0\0\7\6\6*$\33\21\364\254j#\377\317\200\"\377\323" + "~\"\377\323\177$\377\30\22\13\343\0\0\0\0\0\0\0\0\12\10\5U|@\17\377\237Q" + "\22\377\236P\21\377L(\15\377\13\10\6\322\0\0\0\0\0\0\0\0\14\11\5U\201@\20" + "\377\241U\21\377\236P\21\377\32\20\7\252\0\0\0\0\0\0\0\0\11\7\4Us8\20\377" + "\241U\21\377\237Q\22\3771\33\12\377\7\6\4\252\5\4\4U\6\5\3q\32\23\13\377" + "\271_\26\377\312f\25\377\305h\26\377\34\24\13\255\0\0\0\0\0\0\0\0\15\12\6" + "f\247W\26\377\310e\25\377\311f\26\377\40\25\13\377\4\3\3A\0\0\0\0\2\2\1\21" + "\14\12\7\335\276b\27\377\320t\33\377\314n\33\377\36\25\13\265\0\0\0\0\0\0" + "\0\0\15\13\10[\271r\36\377\323|\36\377\321{\36\377V7\31\377\11\10\6\273\6" + "\6\5U\7\6\6\202\40\30\17\377\310z\37\377\321{\36\377\316z\37\377\40\27\15" + "\255\0\0\0\0\0\0\0\0\12\10\7\220\277q\36\377\324\177#\377\322~#\377(\33\17" + "\377\4\4\3U\0\0\0\0\2\2\1\10\13\11\6\324\235Q\24\377\275\\\24\377\276a\25" + "\377\33\23\12\262\0\0\0\0\0\0\0\0\14\12\7`\267i\34\377\321{\36\377\315r\32" + "\377$\30\15\377\4\4\3U\0\0\0\0\4\4\4\34\22\16\11\273\303s\36\377\323|\36" + "\377\322\202#\377#\32\16\322\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\2" + "\2\34\14\12\7\343\303s\36\377\323|\36\377\321{\36\377&\31\17\377\4\4\3U\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\252\302s\37\377\321z\34\377" + "\304c\25\377\25\17\10\377\0\0\0\0\0\0\0\0\0\0\0\0\13\11\6\252\231O\24\377" + "\273[\24\377\265`\24\377\36\24\11\262\0\0\0\0\0\0\0\0\15\12\6`\227O\24\377" + "\273[\24\377\265`\24\377\26\20\11\377\0\0\0\0\0\0\0\0\0\0\0\0\14\11\7\252" + "\222L\23\377\247X\22\377\236M\21\377\27\17\6\252\0\0\0\0\0\0\0\0\12\10\5" + "U\205B\20\377\247X\22\377\250V\23\377\26\20\11\377\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\14\11\7\252\233P\24\377\271^\24\377\265`\24\377\26\20" + "\11\335\0\0\0\0\0\0\0\0\6\6\5*3\35\14\377\226Q\23\377\245W\22\377*\32\13" + "\377\5\5\4l\0\0\0\0\5\5\4\34\22\17\13\377\303r\34\377\317{\40\377\236^\37" + "\377\21\15\12\216\0\0\0\0\0\0\0\0\6\5\5""92\"\23\377\277o\40\377\320u\35" + "\377qI\36\377\12\12\11\343\6\6\5}\7\7\6\306*\35\21\377\273`\26\377\246W\27" + "\377*\33\17\377\10\6\5n\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\5\5\4\270\25\20\10\377j6\17\377\232N\21\377\227M\22\377\\" + "0\17\377\13\11\6w\0\0\0\0\0\0\0\0\12\10\5]\203E\22\377\275\\\24\377\310i" + "\25\377!\26\14\377\5\4\4""6\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6UL5\31\377\310" + "v\37\377\314r\33\377A+\26\377\6\6\5q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\4\3\3\21\16\13\11\343\303o\34\377\316s\33\377" + "\314i\31\377\30\21\13\377\0\0\0\0\0\0\0\0\0\0\0\0\5\5\4\34\15\12\6\343}B" + "\22\377\245T\22\377\241U\21\377\241U\21\377\233O\22\377\34\23\11\377\6\5" + "\3U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\11\10DV8\33" + "\377\314~!\377\322}!\377\36\25\15\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\252\303s\36\377\321{\36\377\317z\36" + "\377\33\23\14\377\3\3\2\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\6\4" + "\270\203A\20\377\241U\21\377\232N\21\377\17\13\6\371\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7\255" + "\246W\27\377\306h\25\377\304c\25\377#\27\14\377\3\3\2U\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\252\302s" + "\37\377\323|\36\377\317z\36\377\33\23\14\377\3\3\2\34\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\252\304q\37" + "\377\325\204$\377\323\177$\377\36\25\15\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\11\6\252\233P\24\377" + "\271^\24\377\264[\23\377\25\17\10\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7\270" + "\267d\32\377\320t\33\377\314r\33\377\32\22\13\377\4\4\4\34\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5\177w<\17\377\240U\23\377" + "[0\20\377\12\10\5\343\4\4\3\34\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4\241\203C\20" + "\377\237Q\22\377\237N\22\377\22\15\7\371\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\7\6\4\2529\"\16\377\260Z\25\377\303_\26\377\32\23\13\350\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\21\16\12c\263j\34\377\317z\36\377\264m!\377\31\24\14\377" + "\7\6\6\252\24\21\13\377\304r\33\377\320u\35\377\313|\36\377\254j#\3775$\24" + "\377\12\11\7l\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\11\10\6\252\237R\24\377\312g\27\377\316o\33\377\26\21" + "\13\377\0\0\0\0\0\0\0\0\12\11\7\213sJ\36\377\325\2050\377'\34\20\377\0\0" + "\0\0\0\0\0\0\11\10\4qC'\16\377\265\\\24\377\30\22\11\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\34\23\11\343\213O\32\377\316u\37\377\324{%\377\326~)\377\254j#\377" + "5\"\22\377zN\37\377\323\177,\377\331\2102\377\330\2071\377\276z)\377A+\26" + "\377\16\13\7U\0\0\0\0\0\0\0\0\7\6\4\34\35\25\12\371\231O\24\377\256U\23\377" + "g5\20\377\21\14\6\364\23\15\6\252\25\16\6\252\33\21\6\252\25\16\6\324\25" + "\16\6\377\31\21\6\340\14\11\5-\0\0\0\0\0\0\0\0\0\0\0\0\30\20\7\231\26\17" + "\7\377\32\20\7\322\14\11\5(\0\0\0\0\0\0\0\0\10\7\5\34\21\15\10\343r=\23\377" + "\256U\23\377\232O\23\377\12\11\5\210\14\12\7\252\16\13\7\252" + "\15\12\6\252\13\11\6\306\37\25\12\377\231R\22\377\261U\22\377\251N\22\377" + "\26\17\7\314\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5""9\13\12\6\216\23\21" + "\14\252\27\25\20\252\31\26\20\252\27\25\20\252\25\23\16\252\17\16\12\252" + "\12\12\11q\7\6\6\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\12\7\2317\40\16\377" + "\257]\24\377\271^\24\377\267Y\23\377P,\21\377\15\13\10\273\7\6\6\31\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5>\13\12\6\216\20\16\13\252\27\23\16\252" + "\31\26\20\252\27\25\20\252\23\21\14\252\17\16\12\252\21\17\12\252\23\21\14" + "\216\11\10\10\34\0\0\0\0\0\0\0\0\14\12\11\252\314\2111\377\334\222;\377\332" + "\2225\377\215[&\377\23\21\14\343\23\21\14\252\30\24\17\252\25\23\16\252\17" + "\16\12\252\12\12\11q\7\6\6\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\12\7""9" + "\16\14\7f\16\13\7U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\14\12\7""9\15\13\10i\17\15\10U\0\0\0\0\0\0\0\0\0\0\0\0\14\13\11" + "\252\314\210/\377\334\222;\377\332\231;\377\30\23\15\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\10\7\5R\13\12\6\234\13\11\6\252\12\11\7[\0\0\0\0\0\0\0\0\0\0\0\0" + "\12\10\5\177\220N\23\377\264W\23\377\256Q\23\377\30\17\7\322\0\0\0\0\0\0" + "\0\0\0\0\0\0\16\13\7D\14\12\7\252\14\12\7\252\21\17\12\252\30\24\17\252\23" + "\21\14\252\17\16\12\252\22\17\13\252\30\25\17\252\25\23\16\252\17\16\12\252" + "\13\12\10q\7\7\6\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12w\21\17\14\252" + "\17\15\12\252\20\16\13\252\23\21\14\252\25\22\14\252\22\17\13\252\17\15\10" + "\252\13\11\6\252\12\10\7X\6\5\5\27\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\12\11\7U\16\14\11\252\23\21\14\252\25\23\16\252\25\23\16\252\25\23\16" + "\252\23\21\14\252\17\16\12\252\13\12\10t\7\7\6\34\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\17\16\12w\22\17\13\252\17\16\12\252\22\17\13\252\25\23\16\252\31" + "\26\20\252\27\25\20\252\25\23\16\252\20\16\13\252\13\12\10q\7\7\6\34\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7U\16\14\11\252\23\21\14\252\24" + "\22\15\252\24\22\15\252\27\23\16\252\23\21\14\252\17\16\12\252\21\16\12\252" + "\23\21\14\216\12\11\7\34\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12q\22\17\13\252\17" + "\16\12\252\22\17\13\252\25\23\16\252\31\26\20\252\27\25\20\252\24\22\15\252" + "\20\16\13\252\13\12\10q\7\7\6\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\7\7\6R\13\12\6\216\20\15\11\252\23\21\14\252\25\23\16\252\30\25\17\252\31" + "\26\20\252\31\26\20\252\17\15\12\252\14\13\11""9\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\17\15\12\252aA\"\377\321\204*\377\326\210+\377\326\177+\377\237" + "g*\377\25\23\16\343\13\12\10\34\0\0\0\0\0\0\0\0\0\0\0\0\20\16\13q\25\23\16" + "\252\22\17\13\231\13\12\10\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\16\12}\25" + "\23\16\252\23\21\14\216\12\11\7\34\0\0\0\0\0\0\0\0\0\0\0\0\17\16\12q\25\23" + "\16\252\22\20\13\231\13\12\10\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12" + "}\25\23\16\252\23\21\14\216\12\11\7\34\0\0\0\0\0\0\0\0\0\0\0\0\17\16\12q" + "\25\23\16\252\22\20\13\231\13\12\10\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\17\16\12}\25\23\16\252\23\21\14\216\11\11\10\34\0\0\0\0\0" + "\0\0\0\0\0\0\0\21\16\12\202\33\30\20\252\25\23\16\216\12\11\7\34\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\20\16\13q\34\30\21\252\30\25\17\241\14\13\11\34" + "\0\0\0\0\0\0\0\0\0\0\0\0\20\16\13q\25\23\16\252\22\17\13\231\13\12\10\34" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12}\25\23\16\252\23\21\14\216\11\10" + "\6\34\0\0\0\0\0\0\0\0\0\0\0\0\22\17\13\210\23\20\12\252\20\15\11\252\20\16" + "\11\252\17\15\10\252\15\13\10\252\14\13\11\252\15\14\10\252\17\16\12\252" + "\16\15\13\252\13\13\12q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10" + "\252\276b\27\377\314t\37\377J4\33\377\11\10\10q\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\15\13\10\252\300j\35\377\320p\33\377\320u\35\377\33\25\14\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\5\4\34\33\27\20\377\307y,\377\326\213)\377" + "\37\27\16\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\34\40\30\15\343$\32" + "\17\377\23\20\14\306\10\10\7""3\0\0\0\0\10\10\7""9\35\25\14\3320\40\21\377" + "-\36\20\377\24\20\13\332\12\11\7i\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\14\11\252\314\2023\377" + "\340\231M\377\341\251X\377!\33\22\377\0\0\0\0\0\0\0\0\0\0\0\0\25\23\16\327" + "\331\243V\377=.\34\377\0\0\0\0\0\0\0\0\0\0\0\0\23\20\14\311\313y(\3773&\26" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\4\4\3\31\20\16\13\343\324\223G\377\340\240M" + "\377\337\241P\377\37\31\20\377\4\4\4f\12\12\11\327\316\2057\377\337\234F" + "\377\340\244U\3773'\30\377\5\5\4R\0\0\0\0\0\0\0\0\0\0\0\0\17\14\10n\262b" + "\33\377\323s\36\377\323y\"\377$\32\17\377\3\3\2U\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\10\10\5\34\33\24\12\350}I\26\377\276a\25\377\264" + "\\\25\377a8\24\377\16\13\7\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\12\7\216" + "\245Y\26\377\306h\25\377T2\23\377\7\6\4\237\0\0\0\0\5\5\4R\40\27\13\377y" + "E\26\377a8\24\377\17\15\10\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\16\14\7\306\254\\\25\377\34\23\11\317\0\0\0\0\0\0" + "\0\0\13\12\6U\224N\25\377\306h\25\377\300a\25\377\25\17\10\377\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\5\252\247Z\26\377\312]\25\377" + "\312g\27\377\25\20\12\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\4\3\3\205" + "\24\20\11\377\227P\26\377K*\20\377\12\10\7\377\40\26\13\377\244V\27\377<" + "'\21\377\5\5\4\374\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\14\13\11\306\325\233P\377\340\246S\377\323y\"\377\24\20" + "\11\377\3\3\2\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\6\6\5""3\33\24\12\377\240T\27\377\306h\25\377C(\20\377\10" + "\7\5}\0\0\0\0\0\0\0\0\0\0\0\0\14\12\11\252\303p\36\377\327}&\377\331\205" + "2\3771#\26\377\5\5\4\205\15\14\12\322\275w2\377\323\177,\377\324y)\377\332" + "\2075\377\334\224?\377\"\33\21\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\4\4\4\21\15\14\12\343\304q\37\377\324v#\377\326{+\377!\32\20\377\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\13\11\273\320\2067\377\337\222F\377" + "\335\230F\377\"\32\21\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5\244\245V\26\377\312b\25\377\306`" + "\25\377\26\20\11\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\10\5U\40" + "\26\13\377\247W\26\377\240T\27\377]6\24\377xA\25\377\274`\25\377\304c\25" + "\377\310i\25\377\30\23\13\317\0\0\0\0\0\0\0\0\17\16\12n\320\230G\377\343" + "\256b\377\344\263g\377\341\260b\377\331\251^\377\325\246\\\377\327\247\\" + "\377\325\233P\377\314\2107\377\212Y%\377\31\26\20\343\11\11\10\34\0\0\0\0" + "\0\0\0\0\13\12\10\252\313\2012\377\337\225F\377\336\236K\377\37\31\20\377" + "\4\4\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\10\7""91(\32" + "\377\316\230S\377\340\251[\377\302\214G\377\37\33\24\377\11\10\10\34\0\0" + "\0\0\0\0\0\0\14\12\11\241\304n!\377\332\2023\377\336\236K\377\37\31\20\377" + "\4\4\4\34\0\0\0\0\0\0\0\0\13\12\10\306\325\240T\377\344\264i\377\343\257" + "d\377!\34\22\317\0\0\0\0\0\0\0\0\14\13\11\202\322\233M\377\344\251c\377\342" + "\254_\377\36\31\21\377\4\4\4\34\0\0\0\0\0\0\0\0\13\12\10\306\314\2011\377" + "\326\177+\377\325}(\377\27\23\14\350\0\0\0\0\0\0\0\0\16\15\11}\320\230G\377" + "\337\237L\377\332\231;\377!\32\20\322\0\0\0\0\0\0\0\0\15\14\12\177\306v'" + "\377\327\177*\377\325~*\377)\37\22\343\0\0\0\0\0\0\0\0\0\0\0\0\6\6\5\34\31" + "\25\20\343\314\226O\377\337\253b\377\257z<\377\22\17\13\332\5\4\4\21\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\24\22\15U\261e\"\377\314{%\377\307u" + "$\377\307u$\377\312z%\377\307u$\377\306r\37\377\306n\37\377\312v#\377.!\25" + "\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\231nN%\377\325" + "\242R\377\332\244W\377C3\36\377\11\10\10U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\5\5\34\25\23\16\377\331" + "\246\\\377\343\257d\377\340\251[\377\37\31\20\327\0\0\0\0\0\0\0\0\14\12\7" + "U\232P\25\377\305c\24\377\300a\25\377\34\24\11\377\4\3\3n\13\11\6\252u?\24" + "\377\270^\25\377\306h\25\377\313h\30\377\322z%\377\25\21\14\374\0\0\0\0\0" + "\0\0\0\12\11\7\241\313\2012\377\340\240M\377\341\251X\377\36\31\21\377\4" + "\4\4\34\0\0\0\0\0\0\0\0\10\7\5\276\245V\26\377\306h\25\377\304c\25\377\34" + "\23\11\252\0\0\0\0\0\0\0\0\15\13\10U\260[\27\377\320p\33\377\322y#\377\33" + "\26\16\377\4\4\4\34\0\0\0\0\0\0\0\0\13\12\10\306\323\225L\377\340\250W\377" + "\340\242Q\377\40\32\21\322\0\0\0\0\0\0\0\0\14\12\7q\260[\27\377\312k\27\377" + "\312_\27\377\24\20\11\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12\252\325\240T\377\344\264i\377\343" + "\256b\377!\32\22\377\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12\252\325\233P\377\342" + "\254_\377\340\247U\377\27\24\16\364\0\0\0\0\0\0\0\0\13\12\10\177\275h\34" + "\377\326\177+\377\335\224F\377\37\31\20\377\4\4\4\34\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\14\11\252\303q\40\377\321u\34\377" + "\312g\27\377\24\17\11\374\3\3\3\16\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\17\16\12\252\325\233P\377\342\254_\377\335\230F\377\34" + "\30\17\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\16\14\11\252\320\215=\377\341\242X\377\343\256b\377!\32" + "\22\377\4\4\4\34\0\0\0\0\0\0\0\0\12\10\7\306\266b\27\377\312g\27\377\306" + "h\25\377\34\23\11\252\0\0\0\0\0\0\0\0\13\12\6U\232P\25\377\312b\25\377\312" + "g\27\377\31\24\14\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\12\7\252\272d\27\377\312c\27\377\310i\25" + "\377\36\25\11\252\0\0\0\0\0\0\0\0\14\11\7U\232P\25\377\306h\25\377\304c\25" + "\377\34\24\11\377\4\4\3q\13\12\6\343\267d\32\377\324\177+\377\247u4\377\21" + "\17\14\327\5\5\5\16\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12\252\323\225L\377\340" + "\246S\377\337\241P\377\"\32\21\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\252\247W\26\377\306\\\25\377\304c\25\377" + "\304_\25\377\306\\\25\377\303c\26\377\300j\35\377\316\177+\377\331\215<\377" + "\337\222F\377\340\245Q\377\334\224?\377\324|'\377\31\23\14\327\0\0\0\0\0" + "\0\0\0\14\13\11t\304t%\377\332\2153\377\332\2137\377\332\216=\377\327\217" + ":\377\30\23\15\324\0\0\0\0\12\11\7\234\313\2012\377\335\226B\377\334\224" + "?\377\31\25\16\343\0\0\0\0\0\0\0\0\12\12\7\237\314\206;\377\341\240T\377" + "\341\251X\377$\35\23\377\0\0\0\0\0\0\0\0\0\0\0\0\17\16\12\252\314\2023\377" + "\334\216;\377\332\2137\377\25\22\14\371\0\0\0\0\0\0\0\0\13\12\10\216\316" + "\221C\377\342\254_\377\343\256b\377\40\32\21\377\4\4\4\34\0\0\0\0\0\0\0\0" + "\13\12\10\306\306u%\377\327}&\377\323z$\377\34\25\15\327\0\0\0\0\0\0\0\0" + "\15\13\10`\256[\27\377\312k\27\377\312g\27\377\26\21\11\377\0\0\0\0\0\0\0" + "\0\0\0\0\0\13\12\6\252\260[\27\377\312g\27\377\313l\30\377\25\17\12\356\0" + "\0\0\0\0\0\0\0\13\12\10\216\316\221C\377\342\252[\377\340\240U\377\36\30" + "\21\377\4\4\4\34\0\0\0\0\0\0\0\0\13\12\10\306\321\225F\377\340\240M\377\336" + "\236K\377\37\31\20\324\0\0\0\0\0\0\0\0\14\13\11\177\306t#\377\327}&\377\323" + "z$\377\34\25\15\377\4\4\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\14\10\252" + "\303p\36\377\321n\36\377\317i\36\377\31\24\14\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\17\16\12\252\325\236P\377\342\254_\377\340\244U" + "\377!\33\22\377\0\0\0\0\0\0\0\0\0\0\0\0\17\16\12\252\322\217A\377\340\250" + "W\377\340\245Q\377\31\25\16\350\0\0\0\0\0\0\0\0\12\12\11\231\320\223C\377" + "\340\246S\377\336\236K\377\"\32\21\377\0\0\0\0\0\0\0\0\0\0\0\0\17\16\12\252" + "\323\225L\377\337\225F\377\333\222<\377\31\24\16\353\0\0\0\0\0\0\0\0\12\12" + "\11\226\314\206;\377\340\234S\377\340\245Q\377!\33\22\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\17\16\12\252\323\226F\377\342\252[\377\342\254_" + "\377!\32\22\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\11\10\226eJ&\377\306\221" + "M\377\316\235W\377\312\227O\377\305\215J\377\310\222K\377\264~9\377\25\23" + "\16\343\5\5\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5q+\34\16\377\273`" + "\26\377\265]\26\377b7\25\377D*\21\377M.\22\377\201H\26\377\256Y\25\377S/" + "\22\377\13\11\6\335\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\6\6\5\34\20\16\13\303lL#\377\322\215;\377\332\242Q\377\247v6\377\20\16" + "\13\335\5\5\5\16\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12\252\323\225L\377\340\250" + "W\377\337\232P\377\37\31\20\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6" + "\6\5""9\"\33\21\377\313z$\377\320|)\377mL\"\377\15\14\12\216\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\252\260[\27" + "\377\312]\25\377\304c\25\377\34\23\11\252\0\0\0\0\0\0\0\0\13\11\6U\204G\25" + "\377\303c\26\377g;\24\377\13\12\6\252\3\3\2\31\6\6\5n7#\20\377\306q\35\377" + "\324\2063\377)\40\24\322\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\25\23\16\327\331\243V\3771&\30\377\0\0\0\0\0\0\0\0\0\0\0" + "\0\13\12\10R6+\33\377\310\207;\377\322\211;\377\317\2032\377\315\177,\377" + "\307u$\377\303o\34\377\273e\30\377]6\26\377\23\17\12\343\7\6\6\34\0\0\0\0" + "\0\0\0\0\12\11\7\252\303m\40\377\332\2125\377\340\236Q\377\337\255_\377\333" + "\247^\377\331\251^\377\332\253a\377\331\246\\\377\320\210;\377nD\33\377\23" + "\17\12\343\6\6\5\34\0\0\0\0\0\0\0\0\0\0\0\0\14\13\7\252=*\24\377\274j!\377" + "\320\2067\377\327\243R\377\331\246\\\377\330\247X\377\330\247Y\377\323\226" + "F\377\222^'\377\32\25\17\345\11\10\6\34\0\0\0\0\0\0\0\0\0\0\0\0\14\12\7\252" + "3\40\16\377\227P\26\377\251[\26\377\255V\26\377\251X\26\377\255V\26\377\264" + "\\\25\377\302b\25\377\304_\25\377\300a\25\377\37\25\12\252\0\0\0\0\0\0\0" + "\0\0\0\0\0\14\12\7\2529%\22\377\275k\"\377\324\225C\377\331\246\\\377\331" + "\246\\\377\332\253a\377\327\243R\377\315~0\377tH\35\377\24\20\13\343\6\6" + "\5\34\0\0\0\0\0\0\0\0\13\11\6D~D\25\377\277b\26\377\302b\25\377\300a\25\377" + "\300a\25\377\277b\26\377\261[\26\377\32\23\11\216\0\0\0\0\0\0\0\0\0\0\0\0" + "\14\12\7\252:%\21\377\271k\36\377\320\2067\377\330\247X\377\332\253a\377" + "\331\246\\\377\325\224H\377\314\2023\377\321\215<\377\323\237L\377\36\31" + "\21\252\0\0\0\0\0\0\0\0\12\12\7\247\322\233M\377\344\262c\377\340\245Q\377" + "\335\245V\377\331\246\\\377\332\251]\377\331\246\\\377\326\234Q\377\316\207" + "3\377tH\35\377\24\20\13\343\6\6\5\34\0\0\0\0\0\0\0\0\15\12\6""9s>\24\377" + "\251[\26\377\245V\26\377\30\22\11\247\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\14\12\7Xu?\24\377\272d\27\377\277k\40\377#\33\20\220\0\0\0\0" + "\0\0\0\0\12\12\7\252\322\233M\377\344\262c\377\335\230F\377\30\23\15\377" + "\0\0\0\0\0\0\0\0\14\12\7\252:$\17\377\235O\26\377\227P\26\377:#\17\377\13" + "\11\6""9\0\0\0\0\0\0\0\0\14\12\7U\235Q\24\377\305c\24\377\300a\25\377\34" + "\24\11\252\0\0\0\0\0\0\0\0\13\11\6""9s>\24\377\275^\30\377\306u%\377\325" + "\235L\377\332\253a\377\331\251^\377\326\241U\377\325\235L\377\324\225C\377" + "\320\2067\377\315~0\377\217`(\377\34\32\23\345\10\10\7\34\0\0\0\0\0\0\0\0" + "\15\14\10U\215J\30\377\276^\27\377\267_\30\377\267_\30\377\273]\30\377\275" + "a\26\377\265]\26\377\261[\26\377\251X\26\377Y4\24\377\25\22\14\343\11\11" + "\10\34\0\0\0\0\0\0\0\0\0\0\0\0\22\21\15\265gJ(\377\317\222J\377\326\234Q" + "\377\322\220C\377\320\2127\377\317\2014\377\315\2050\377\315~0\377\227e*" + "\377\34\32\23\350\11\10\10\34\0\0\0\0\0\0\0\0\15\14\12n\272\177?\377\326" + "\234Q\377\325\236P\377\325\233P\377\326\234Q\377\326\231K\377\325\224H\377" + "\325\224H\377\323\226F\377\237o6\377\34\31\23\361\11\10\10\37\0\0\0\0\0\0" + "\0\0\0\0\0\0\22\21\15\265gJ(\377\320\234Q\377\326\234Q\377\320\2127\377\321" + "\211<\377\325\236P\377\325\233P\377\325\240T\377\327\240X\377\325\243T\377" + "\36\30\21\262\0\0\0\0\0\0\0\0\14\13\11]\262y5\377\325\236P\377\322\217A\377" + "\323\222>\377\325\224H\377\327\243R\377\325\236P\377\324\225C\377\321\215" + "<\377\231j1\377\34\31\23\353\11\11\10\37\0\0\0\0\0\0\0\0\0\0\0\0\22\17\13" + "\255B+\25\377\273e\40\377\317\2044\377\322\220C\377\325\224H\377\326\234" + "Q\377\330\247X\377\326\234Q\377\260\200A\377.'\33\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\17\16\12U\265o*\377\327\2104\377\325}(\377\323z$\377\324{%\377\322{" + "'\377\312z%\377\37\30\16\252\0\0\0\0\0\0\0\0\14\13\11X\244Y\35\377\313z$" + "\377\307u$\377\36\27\17\324\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12\177\273\205" + ">\377\325\224H\377\320\2127\377\37\30\20\252\0\0\0\0\0\0\0\0\15\14\12U\254" + "h%\377\321\2066\377\316\2073\377\40\31\21\324\0\0\0\0\0\0\0\0\0\0\0\0\17" + "\15\12\177\265t.\377\323\217>\377\322\231G\377\35\30\20\262\0\0\0\0\0\0\0" + "\0\15\14\12[\262y5\377\325\232F\377\320\2067\377\37\31\20\322\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\16\12}\263n*\377\322\2077\377\320\213A\377" + "\32\25\17\270\0\0\0\0\0\0\0\0\16\15\11U\263u,\377\331\245R\377\325\243T\377" + "\33\27\20\335\0\0\0\0\0\0\0\0\0\0\0\0\16\14\11\210\256g'\377\316\177+\377" + "\307u$\377\37\30\16\252\0\0\0\0\0\0\0\0\14\13\11X\244Y\35\377\312v#\377\304" + "r!\377\35\26\16\322\0\0\0\0\0\0\0\0\0\0\0\0\16\14\11}\251_\36\377\312w%\377" + "\307w'\377\30\23\15\276\0\0\0\0\0\0\0\0\16\14\11U\252_\35\377\306q\35\377" + "\307t\"\377\314\200/\377\316\2073\377\314\2011\377\314\2011\377\320\2067" + "\377\323\225L\377\300\214I\377_J'\377\21\17\14U\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\16\14\11\306\323\226F\377\316\230Q\377\37\32\24\377\7\7\6""0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12\252\323\225L\377\342\252[\377\342\254" + "_\377#\34\22\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\16\14\332\253" + "x<\377\333\232F\377)\37\24\377\4\4\3\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\21\20\14\252\333\263t\377\350\301\211\377" + "\350\307\207\377(!\27\377\0\0\0\0\0\0\0\0\0\0\0\0\12\12\11L>2\37\377\24\22" + "\15\247\0\0\0\0\0\0\0\0\0\0\0\0\13\12\10L:.\35\377\24\22\15\247\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\15\14\12\252\322\226G\377\337\223H\377\335\226B\377" + "\32\25\17\322\0\0\0\0\13\12\10w\323\237T\377\345\270r\377\346\272{\377\36" + "\32\23\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\13\11]\211Z(\377\337\247^\377" + "\344\264o\377\247\205P\377\21\20\16\343\13\13\12\252\14\13\11\252\14\13\11" + "\252\14\13\11w\7\7\6""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\7\7\6>\25\22\14\343\235\\\34\377\313i\32\377\305j" + "\32\377R0\25\377\16\14\7\255\5\5\4\10\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10" + "\7\5\34\32\23\13\343gD\31\377\236`\35\3779)\26\377\15\14\12\361!\32\20\377" + "\222X\37\377B/\27\377\14\12\11\311\6\5\5\16\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5""9\36\26\13\377\17\14\10`\0\0\0" + "\0\0\0\0\0\12\12\7\202\276h\33\377\321v\36\377\323u\"\377\33\25\16\377\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\14\12\252\307z'\377\332" + "\2023\377\337\222F\377\36\30\21\377\0\0\0\0\0\0\0\0\0\0\0\0\27\26\22\213" + "\36\33\25\252\20\17\13\377Y;\32\377\313n\34\377\304q\37\377zQ!\377\272u+" + "\377\330\2013\377\270~9\377&\"\31\377\30\26\23\335!\36\30\252\17\17\14\34" + "\0\0\0\0\0\0\0\0\0\0\0\0\30\26\23\216\40\37\31\252\25\24\20\306ZG-\377\337" + "\263n\377\342\254_\377\335\226B\377\217d,\377\26\25\21\343\34\33\25\252\35" + "\34\26\252\15\15\14*\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\10\10\10\13\31\30\24\216'#\34\252\36\34\27\252\35\33" + "\26\252\35\33\26\252\35\33\26\252\35\33\26\252\35\33\24\252\27\25\20\252" + "\16\15\13\"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\14\12\237\216V\37\377\320t" + "#\377\311w&\377\40\32\21\377\5\5\4\34\0\0\0\0\0\0\0\0\0\0\0\0\16\15\13\252" + "\330\247a\377\347\270|\377\347\301\200\377\265\222\\\3774,!\377ZG-\377\311" + "\233X\377\337\255f\377\344\263s\377\346\267{\377\346\270w\377'\40\26\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\14\13\252\316\213=\377" + "\342\244[\377\344\256g\377'\40\26\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\6\5\34\11" + "\11\10\2168.\37\377\336\264q\377\346\273w\377\336\264q\377\27\25\20\377\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17" + "\16\14\244O;\36\377\321\200*\377\323\177,\377\253u.\377\22\17\13\252\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\11\10t!\34\20\377\241^\34\377\307k\32\377" + "A(\22\377\10\7\5\377\31\24\14\377\306q\35\377\322x!\377\331\2052\377\33\27" + "\20\377\0\0\0\0\0\0\0\0\7\7\6\27\"\34\23\306.$\31\377'\37\26\377)!\26\377" + ";.\34\3773(\32\377=/\34\377\264\205G\377\343\257d\377\342\257g\377\265\217" + "X\377\21\20\14\216\0\0\0\0\0\0\0\0\13\13\12\252\326\246a\377\345\263r\377" + "\344\271o\377\241yD\377\27\25\20\343\27\26\22\252\26\25\21\252\20\17\15\252" + "\13\13\10\223\10\10\7U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\15\13\252\265\217X\377\344\271{\377\332" + "\250a\377F6#\377\11\11\10q\0\0\0\0\0\0\0\0\0\0\0\0\13\12\10UxW-\377\337\267" + "x\377\347\276\204\377\247\207P\377\30\26\23\343\23\22\20\252\23\22\20\306" + "_P.\377\342\301\201\377\344\273\201\377\272\224W\377\17\16\14\252\0\0\0\0" + "\0\0\0\0\12\12\11U\233q@\377\345\304\204\377\350\277\205\377\263\216Z\377" + "\33\31\24\343\22\22\17\252\23\22\20\306ZG-\377\336\257e\377\343\256b\377" + "\344\271o\377\34\31\23\377\0\0\0\0\0\0\0\0\7\7\6\27\"\34\23\3061#\26\377" + "'\35\22\343\14\13\11U\0\0\0\0\0\0\0\0\10\7\7\34!\32\20\3064'\27\377/#\26" + "\343\15\14\10U\0\0\0\0\0\0\0\0\10\10\7\34!\36\30\343\311\235d\377\346\272" + "{\377\265\211J\377\20\17\13\317\6\6\5\27\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\13\12\10\34\33\25\14\301\32\23\13\377\27\22\12\377\27\22" + "\12\377\30\22\13\377\30\22\13\377\32\24\13\377#\33\20\377*\37\23\361\21\16" + "\12U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\11\10\220" + "[C$\377\331\232H\377\323\226F\377E7\"\377\17\16\14U\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\6\5\13\13\13\12\216\30\26\23\377\247" + "\207P\377\341\254h\377\340\246S\377\301~6\377\20\16\13\252\0\0\0\0\0\0\0" + "\0\15\14\10U\271a\32\377\317p\34\377\314n\33\377G.\26\377\10\10\7\377\34" + "\26\15\377\306k\33\377\301o\36\377~N\37\377\307\213>\377\342\270o\377\33" + "\30\22\377\0\0\0\0\0\0\0\0\13\12\10\252\326\246a\377\346\273w\377\344\263" + "g\377\217f0\377\21\20\14\343\14\14\11\252\15\14\12\306.!\21\377\307p\34\377" + "\316o\33\377\314n\33\377\40\27\15\260\0\0\0\0\0\0\0\0\14\13\11\210\314\206" + ";\377\342\254_\377\344\265k\377\242}I\377\30\26\23\343\23\22\20\252\23\22" + "\20\306_P.\377\340\263m\377\337\255_\377\255u2\377\17\15\12\234\0\0\0\0\0" + "\0\0\0\14\13\7c\271a\32\377\320p\33\377\314n\33\377\26\22\13\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\20\17\15\252\333\263t\377\350\302\205\377\347\301\200\377(!\27\377\0\0\0" + "\0\0\0\0\0\0\0\0\0\20\17\15\252\333\261p\377\346\273w\377\340\237S\377\30" + "\25\17\377\0\0\0\0\0\0\0\0\13\12\10\244\323\236R\377\345\270r\377\346\277" + "{\377\246\177M\377\26\25\21\343\26\25\21\252\24\23\15\252\16\15\13\34\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\13\11\252\303p\36\377\321j\36\377\316o\33" + "\377e?\32\377\20\16\13\343\27\25\20\252\35\33\26\252\15\15\14*\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\20\17\15\252\330\247a\377\340\236W\377\330}-\377\30" + "\24\15\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\21\20\14\252\333\261p\377\350\303\211\377\347\275\200" + "\377\242}I\377\26\25\21\343\16\16\13\252\15\14\12\3062#\23\377\307p\34\377" + "\316o\33\377\314n\33\377\40\30\15\252\0\0\0\0\0\0\0\0\15\14\10]\302m!\377" + "\333\2136\377\340\236Q\377'\40\26\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\12\10\252\276h\33\377\320" + "p\33\377\314n\33\377\40\30\15\252\0\0\0\0\0\0\0\0\15\14\10U\270`\31\377\317" + "p\34\377\314f\33\377\201N\34\377\37\32\20\377\177T\"\377\333\223F\377\255" + "z>\377\17\16\14\324\6\6\5\31\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\17\15\252" + "\325\233P\377\335\220D\377\331\2024\377\37\31\20\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\252\275c\32\377\320" + "p\33\377\314n\33\377\233W\32\377H.\25\377\263g$\377\337\234L\377\330\252" + "a\377\206`/\377\256\177G\377\335\247Z\377\337\223H\377\336\236K\377\27\23" + "\16\374\0\0\0\0\0\0\0\0\13\12\10\252\326\246a\377\347\273|\377\346\277{\377" + "\344\266u\377\336\257e\377@2!\377\7\7\6\345\32\27\23\377\334\257i\377\344" + "\267q\377\344\274u\377\31\25\20\377\0\0\0\0\0\0\0\0\13\12\10\252\331\260" + "p\377\350\305\211\377\350\307\207\377%\37\26\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\15\14\12\252\306u%\377\327\177*\377\331\2024\377\25\23\16\377\0\0\0\0\0" + "\0\0\0\13\12\10\247\327\254h\377\350\277\205\377\347\276\204\377\246\177" + "M\377\27\25\20\343\22\21\17\252\21\20\14\306J4\33\377\314u!\377\323o\36\377" + "\255]\34\377\17\14\10\244\0\0\0\0\0\0\0\0\15\14\10X\271a\32\377\320p\33\377" + "\314n\33\377\23\20\12\377\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\252\276h\33\377" + "\324v#\377\330\2103\377\25\23\16\374\0\0\0\0\0\0\0\0\13\12\10\247\327\254" + "h\377\350\302\177\377\347\301\200\377\246\201M\377\27\25\20\343\23\22\20" + "\252\23\22\16\306Q;\"\377\325\220>\377\327\214<\377\245l(\377\15\14\12\247" + "\0\0\0\0\0\0\0\0\10\10\7Ue?\32\377\316r!\377\324y!\377\233\\$\377\27\25\20" + "\343\26\25\21\252\34\32\25\252\25\24\22\252\15\15\14\244\12\12\11U\6\6\6" + "\6\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\13\11\252\302" + "p\37\377\324w%\377\330\206-\377#\34\22\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\20\17\15\252\331\253j\377\347\273|\377\344\265k\377'\40" + "\26\377\0\0\0\0\0\0\0\0\0\0\0\0\20\17\13\252\320\2067\377\337\234F\377\335" + "\224F\377\27\24\16\356\0\0\0\0\0\0\0\0\13\12\10\252\314\2107\377\337\234" + "F\377\336\236K\377\"\34\23\377\0\0\0\0\0\0\0\0\0\0\0\0\16\15\13\252\331\253" + "j\377\350\275\177\377\346\272{\377\31\26\20\377\0\0\0\0\0\0\0\0\12\12\11" + "\247\322\233M\377\342\254_\377\340\245Q\377\37\32\22\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\17\15\14\252\331\255h\377\350\277\205\377\347\303" + "\204\377(!\27\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\11\205I:" + "$\377\341\270x\377\347\301\200\377\344\264o\377\223f0\377\17\15\12\343\10" + "\7\7\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\13\7\306d;\27" + "\377\251]\32\377\234[\33\377\256`\33\377\264c\33\377\250a\33\377i>\30\377" + "\22\17\11\377\7\6\6""0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7" + "\7\7\34\17\17\14\343\220rC\377\333\261p\377\337\260f\377\231q>\377\21\20" + "\14\343\7\7\6\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\17\15\252\325\233P\377" + "\337\222F\377\331\2012\377\33\26\16\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\14\12\11\303\241^\34\377\317r\40\377\301r$\377\27\24\20\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\13\11" + "\252\277i\34\377\317d\34\377\314n\33\377\32\24\13\314\0\0\0\0\0\0\0\0\6\5" + "\5\3\32\23\11\306\30\22\11\366\17\14\10\216\0\0\0\0\0\0\0\0\0\0\0\0\17\15" + "\12[\37\30\20\3643'\30\377\25\23\16[\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\12\11L=1\36\377\24\22\15\234\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\21\17\14\216\33\26\16\350\36\26\15\377\31\24\14\377" + "\26\22\13\356\25\20\12\377c:\26\377\313q\32\377\315o\34\377\203P\36\377\14" + "\13\11\216\0\0\0\0\0\0\0\0\13\12\10\252\324\240U\377\350\277\177\377\347" + "\303\204\377\304\233[\377Q;\"\377)\40\24\3776+\33\377\264\205G\377\330\220" + ";\377\320s!\377\201N\34\377\14\13\7\216\0\0\0\0\0\0\0\0\10\7\7""9H4\35\377" + "\327\233N\377\343\256b\377\317\236^\377U?\"\377$\35\23\3779+\32\377\275\202" + "B\377\333\225B\377\324y)\377\254i!\377\21\17\12\223\0\0\0\0\0\0\0\0\7\6\6" + """6:(\25\377\306q\35\377\316g\33\377\245W\30\377*\34\15\377\25\20\10\377" + "\33\24\12\377_<\26\377\312i\33\377\316d\35\377\314n\33\377#\30\14\252\0\0" + "\0\0\0\0\0\0\7\7\6""6F2\33\377\324\221A\377\343\256b\377\311\233X\377;,\34" + "\377\27\24\16\377\"\34\23\377\235h0\377\323~*\377\320s!\377\204R\35\377\15" + "\13\10\216\0\0\0\0\0\0\0\0\0\0\0\0\30\22\11\335l=\27\377\311p\32\377\317" + "p\34\377\314n\33\377\236[\31\377.\35\15\371\13\12\6""9\0\0\0\0\0\0\0\0\10" + "\10\7""9F2\33\377\324\216;\377\342\254_\377\317\236^\377U?\"\377)\40\24\377" + "9+\32\377\256|;\377\340\252]\377\345\270r\377\347\304\200\377\34\31\23\377" + "\0\0\0\0\0\0\0\0\12\12\11\247\327\251f\377\350\277\177\377\347\301\200\377" + "\304\232W\377M;\"\377)\37\24\3776+\33\377\250q1\377\324y)\377\316r!\377\204" + "R\35\377\14\13\11\202\0\0\0\0\0\0\0\0\14\13\7n\274b\31\377\316o\33\377\316" + "j\31\377\32\23\13\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16" + "\14\11\252\307u$\377\335\224>\377\343\256b\377\34\32\23\377\0\0\0\0\0\0\0" + "\0\12\12\11\247\324\241Y\377\340\246S\377\331\2012\377\40\30\17\377\5\5\4" + "\37\7\7\6\210A,\26\377\300j\35\377\313l\30\377rB\27\377\21\15\10\335\0\0" + "\0\0\0\0\0\0\0\0\0\0\12\11\7\213\271a\32\377\320p\33\377\320u\35\377\40\30" + "\15\252\0\0\0\0\0\0\0\0\17\15\10[\275c\32\377\327{*\377\342\254_\377\306" + "\230W\377Q:\"\377\260\205G\377\340\250_\377\305\212>\377A/\32\377\205Q\36" + "\377\320y%\377\324s%\377\230b#\377\14\13\11\216\0\0\0\0\0\0\0\0\12\11\7\223" + "\276k\31\377\316o\33\377\316j\31\377\236[\31\377*\34\15\377\25\17\10\377" + "\32\23\11\377rB\27\377\314q\31\377\320s!\377\255z>\377\20\17\15\226\0\0\0" + "\0\0\0\0\0\10\10\7GnW3\377\336\264q\377\340\246S\377\321\211<\377\205T\40" + "\377M2\30\377Y;\32\377\265m\40\377\322y#\377\324y)\377\253t4\377\17\16\14" + "\216\0\0\0\0\0\0\0\0\16\15\13\252\333\261p\377\347\273|\377\344\264o\377" + "\315\236Z\377O:\40\377&\35\23\3771#\26\377\247r.\377\331\222>\377\333\232" + "F\377\251u8\377\17\15\14\234\0\0\0\0\0\0\0\0\10\10\7GhP-\377\340\267w\377" + "\350\277\177\377\322\246a\377Q<\40\377'\36\22\3774(\31\377\257\200B\377\341" + "\255b\377\344\264i\377\342\257_\377\35\31\22\377\0\0\0\0\0\0\0\0\14\14\13" + "\252\320\2127\377\336\221?\377\334\213;\377\301y2\377D2\35\377&\34\23\377" + "0#\27\377\257p,\377\331\2166\377\331\220B\377\277\211B\377\23\20\14\252\0" + "\0\0\0\0\0\0\0\11\10\10JoR(\377\330\233K\377\342\254_\377\310\227Q\3779)" + "\32\377\33\27\20\377#\34\22\377)\40\24\377'\36\24\377\31\26\20\343\17\16" + "\12\216\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\34!\30\16\343\207Q\34\377\316u\37" + "\377\322l!\377\320n\37\377\253\\\34\3771!\20\374\15\13\10D\0\0\0\0\0\0\0" + "\0\13\12\10\252\303l\36\377\324v#\377\331\2114\377*!\27\377\0\0\0\0\0\0\0" + "\0\0\0\0\0\24\22\17\252\326\234Q\377\335\224>\377\326\177+\377\27\23\14\356" + "\0\0\0\0\0\0\0\0\12\12\7\237\304m\37\377\325w$\377\324{%\377\37\30\16\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\17\16\12\252\321\211<\377\344\254c\377\346\275w" + "\377\34\32\23\377\0\0\0\0\0\0\0\0\14\14\13\252\320\2067\377\332\2113\377" + "\326\177+\377#\33\20\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\16\13" + "\252\307t\"\377\331\2040\377\340\246S\377\40\32\23\377\0\0\0\0\0\0\0\0\12" + "\12\7\"Q:\"\377\340\262i\377\342\254_\377\201\\(\377\11\11\10\252\6\6\6U" + "\6\6\5q#\33\20\377\314u!\377\320u\35\377nE\31\377\16\14\7l\0\0\0\0\0\0\0" + "\0\12\12\7\252\303p\36\377\323s\36\377\323s\36\377\36\27\15\377\0\0\0\0\0" + "\0\0\0\0\0\0\0\16\14\11\252\304q\37\377\323x\40\377\326~)\377!\32\22\377" + "\0\0\0\0\0\0\0\0\11\10\6\34,!\23\324<*\27\377.#\25\377J5\37\377\234m5\377" + "\330\247a\377\344\263m\377\345\261n\377\343\270l\377\250{E\377\27\25\20\343" + "\11\10\10\34\0\0\0\0\0\0\0\0\0\0\0\0\21\20\16\252\206b3\377\337\246\\\377" + "\204d5\377\11\11\10\205\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\17\15" + "\252\333\261p\377\350\277\205\377\347\303\204\377(!\27\377\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\6\6\5-'\40\26\377\322\2011\377\254j#\377\24\21" + "\15\343\13\13\10\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\21\21\16\252\335\275\204\377\353\315\232\377\352\315\233\377*'\35\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\11\10\31\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\11\10\10\31\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\16\13" + "\252\320\215=\377\340\250W\377\344\256g\377\37\32\24\335\0\0\0\0\15\14\14" + "\202\332\271\177\377\352\312\223\377\350\306\213\377(!\31\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\21\21\16\260\214sG\377\346\312\223\377\350\312" + "\225\377\332\252e\377\310|+\377\306u%\377\306u%\377\304t%\377H4\33\377\14" + "\13\11\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\10" + "\7U%\37\24\377\256n)\377\322{'\377\314x%\377\202W\37\377\17\15\12\276\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\5\4q\34\32\23\377" + "\322\217A\377\334\243Q\377\331\246\\\377\336\255a\377\341\260b\377*%\31\377" + "\4\4\4J\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\14\12\252\320\215=\377" + "\342\254_\377\344\267o\377(\"\31\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\21\20\16\252\333\261p\377\350\302\205\377\351\312\224\377\33" + "\30\24\377\0\0\0\0\0\0\0\0\20\17\15U\307\241f\377\334\246Y\377\323\217>\377" + "\331\232H\377\337\241P\377\340\251[\377\341\271r\377\345\274|\377\347\276" + "\204\377\347\310\217\377\343\303\214\377\343\304\212\377\341\303\210\377" + ",%\33\252\0\0\0\0\0\0\0\0\21\20\16U\310\245m\377\343\306\216\377\341\277" + "\204\377\343\303\206\377\347\307\210\377\347\305\204\377\347\302|\377\345" + "\277\202\377\341\303\210\377\341\303\210\377\341\277\204\3771*\36\306\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\22\21" + "\15i\301\207B\377\335\257f\377\336\272{\377\337\276\204\377\340\300\207\377" + "\337\276\204\377\336\272{\377\335\262n\377\332\254i\377.'\33\303\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\6\6\6\34\33\32\24\377\330\252a\377\341\262h\377\260\210" + "S\377\20\17\15\306\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\21\21\16\252\335\274\202" + "\377\353\315\232\377\352\315\233\377\350\314\225\377\344\307\217\377\253" + "\220`\377@9)\377\232~Q\377\343\275z\377\346\270w\377\343\253b\377\"\36\25" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\21\20\16\252\335\272" + "~\377\352\312\223\377\350\300\207\377,'\33\377\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\11\10\216" + "\31\30\24\377r_5\377\317\251f\377\343\273v\377\342\274{\377\262\224_\377" + "\23\22\20\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\30\26\23U\305\221T\377\343\273v\377\347\302|\377\317\255r\377=7&\377" + "\10\10\10\210\0\0\0\0\0\0\0\0\0\0\0\0\12\12\11l-$\25\377\303t&\377\317z&" + "\377\213Z\40\377\15\14\10\252\0\0\0\0\12\12\11\306\320\214;\377\342\252[" + "\377\347\301\200\377(#\33\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\4\4\3\34\22\21\15\343\336\275\203\377\352\311" + "\217\377\345\277\202\377\"\36\27\314\0\0\0\0\0\0\0\0\13\13\12\252\323\236" + "R\377\342\252[\377\340\245Q\377\333\232F\377\320\2043\377\316\200-\377\314" + "z)\377\311x(\377\304t%\377oJ\36\377\24\22\15\343\10\10\7\34\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\6\6\34\34\32\25\377\336\272" + "{\377\345\304\204\377\265\220\\\377\20\17\15\324\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\6\6\6U\31\30\24\377\264\225e\377\347\315\232\377\350\314\225\377" + "\343\306\216\377\337\300\212\377\337\301\210\377\346\307\213\377\350\305" + "\215\377\323\260z\377@9)\377\10\10\7q\0\0\0\0\0\0\0\0\6\6\5\16!\37\30\343" + "\272\233k\377\350\314\225\377\351\315\230\377\343\305\214\377\335\275\204" + "\377\340\300\207\377\344\306\215\377\350\311\215\377\350\300\207\377\347" + "\305\204\377)#\32\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\21\20\16\213\323\262x\377\351\312\224\377\351\312\224\37780!\377\4\4" + "\4U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\13" + "\12\377\330\244Y\377\346\277{\377\343\303\206\377(#\33\343\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\17\15\343~iE\377\331\260p\377" + "\341\257h\377\337\237L\377\275|1\377+#\24\377\11\10\10""9\0\0\0\0\0\0\0\0" + "\12\12\11\205\302m!\377\327}&\377\324|'\377\220]!\377\35\30\20\377D5\35\377" + "\272{1\377\200_/\377\31\30\24\377\217wN\377\346\311\221\377!\36\30\377\0" + "\0\0\0\0\0\0\0\13\13\12\252\331\260p\377\344\266m\377\336\236K\377\324\206" + "3\377\314z)\377\306u%\377\310v%\377\320{'\377\324{%\377\326y'\377\331\205" + "2\377\30\25\17\364\0\0\0\0\0\0\0\0\13\13\12\252\332\271\177\377\353\313\224" + "\377\351\312\224\377\346\311\221\377\343\305\214\377\335\273\200\377\335" + "\270x\377\340\262i\377\340\244U\377\275\201:\377'\40\24\377\7\7\6U\0\0\0" + "\0\0\0\0\0\13\12\10}\302m!\377\327}&\377\325}(\377\35\30\20\377\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\21" + "\21\16\252\335\274\202\377\353\311\230\377\350\311\215\377*$\33\377\0\0\0" + "\0\0\0\0\0\0\0\0\0\21\21\16\252\333\263t\377\347\273|\377\344\267o\377\30" + "\26\21\377\0\0\0\0\0\0\0\0\13\13\12\252\332\271\177\377\350\305\211\377\343" + "\263h\377\333\233H\377\320\2043\377\314z)\377\312x'\377&\37\23\252\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\14\13\11\252\304n!\377\327q&\377\325z*\377\327" + "\217:\377\331\246\\\377\336\272{\377\341\303\210\3774,!\306\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\21\20\16\252\323\226F\377\333\2148\377\325~*\377\31\25" + "\16\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\21\21\16\252\335\273\200\377\350\307\215\377\344\264o\377" + "\333\233H\377\317\200,\377\307w'\377\310v%\377\320{'\377\324{%\377\326}'" + "\377\324|'\377\"\32\17\265\0\0\0\0\0\0\0\0\13\12\12\241\327\254h\377\352" + "\311\217\377\352\316\227\377*'\35\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\13\11\252\304n!\377\327}" + "&\377\324|'\377$\34\21\252\0\0\0\0\0\0\0\0\17\16\12U\302m!\377\327}&\377" + "\324|'\377\322\200)\377\323\2076\377\341\260b\377\347\305\204\37780!\377" + "\4\4\4U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\21\20\16\252\316\2073\377" + "\331\2052\377\325z*\377\31\25\16\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\13\11\252\304n!\377\327}&\377\325z*\377C" + "3\34\377\6\6\5\377(\"\31\377\342\276\177\377\212nE\377\7\7\7\377\31\30\24" + "\377\335\263p\377\350\277\177\377\350\311\215\377\32\27\23\377\0\0\0\0\0" + "\0\0\0\13\13\12\252\326\250e\377\346\273w\377\344\274u\377\324\255i\377\226" + "vC\377fV/\377oZ2\377\271\221X\377\343\273v\377\347\303\204\377\350\311\215" + "\377\32\27\23\377\0\0\0\0\0\0\0\0\13\13\12\252\333\270\200\377\353\315\232" + "\377\352\316\227\377*$\33\377\0\0\0\0\0\0\0\0\0\0\0\0\17\17\14\252\325\236" + "P\377\344\266m\377\346\277{\377\33\27\22\377\0\0\0\0\0\0\0\0\13\13\12\252" + "\333\275\204\377\353\315\232\377\350\305\215\377\341\271r\377\327\233N\377" + "\316\2073\377\315~*\377\321\200*\377\324y)\377\265o$\377'\36\22\377\10\10" + "\7""9\0\0\0\0\0\0\0\0\12\12\11\210\302m!\377\327}&\377\324|'\377\30\24\15" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\17\16\14\252\322\222G\377\345\267n\377\347\305" + "\204\377\32\27\23\377\0\0\0\0\0\0\0\0\13\13\12\252\332\275\177\377\352\307" + "\217\377\347\305\204\377\341\260j\377\326\231K\377\320\2127\377\315\2050" + "\377\322\177-\377\326\2061\377\263w*\377%\36\22\377\7\7\6U\0\0\0\0\0\0\0" + "\0\0\0\0\0\27\24\16\343\241s2\377\336\247Y\377\343\272r\377\341\276\202\377" + "\337\306\210\377\343\306\216\377\340\304\215\377\335\277\206\377\241\202" + "V\377!\36\30\345\12\12\11*\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\17\17\14\252\323\225L\377\344\266m\377\347\275\200\377,'\33\377\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\21\21\16\252\330\252a\377\342" + "\254_\377\340\245Q\377\37\32\22\377\0\0\0\0\0\0\0\0\0\0\0\0\15\14\12\252" + "\311x(\377\331\2052\377\330}-\377\31\25\16\324\0\0\0\0\0\0\0\0\13\12\10\220" + "\313\2024\377\340\246S\377\344\256g\377(\"\31\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\21\20\16\252\335\273\200\377\352\311\217\377\346\277{\377\34\31\23\364\0" + "\0\0\0\0\0\0\0\12\12\11\244\313z2\377\334\224?\377\331\2154\377\27\24\16" + "\377\0\0\0\0\0\0\0\0\16\15\13l\12\12\11\34\0\0\0\0\15\15\14\252\335\275\206" + "\377\353\315\232\377\352\316\227\377*%\33\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\13\13\12\377\336\275\203\377\350\303\203\377\340\242" + "Q\377$\35\23\377\4\4\4""6\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\7\7\6\34\23\21\14\350]B\36\377\267p$\377\321z&\377\324x'\377\237" + "f\"\377\26\23\15\377\7\7\6U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\6\6\5\34\21\20\16\343\225zT\377\343\303\214\377\343\277\206\377\263\216" + "Z\377\21\20\16\343\5\5\4\31\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\16" + "\14\252\314\2011\377\332\2153\377\325~*\377\31\25\16\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\7[D0\31\377\315\177,\377\334\231K\377" + "cN,\377\10\10\7q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\14\13\11\252\304n!\377\327}&\377\324|'\377\30\24\15\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\11\11\10\31\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\2\2\1\27\11\10\6\377\307t\"\377\327" + "}&\377\324\200-\377\33\30\20\317\0\0\0\0\0\0\0\0\13\13\12\252\333\270\200" + "\377\353\315\232\377\352\315\233\377:1#\377\5\5\4U\0\0\0\0\4\4\3\34\20\17" + "\13\343\314z)\377\327~(\377\322{'\377\40\31\17\252\0\0\0\0\0\0\0\0\15\15" + "\14z\320\250c\377\352\307\217\377\352\314\227\377?6&\377\5\5\4U\0\0\0\0\4" + "\4\3\34\22\21\15\327\314\177-\377\326}'\377\324y)\377\"\33\17\252\0\0\0\0" + "\0\0\0\0\15\14\12U\271p\"\377\327}&\377\324{%\377#\34\20\377\4\4\3U\0\0\0" + "\0\3\3\2\34\14\12\11\340\306u%\377\327}&\377\324|'\377\"\33\17\262\0\0\0" + "\0\0\0\0\0\16\15\13q\316\242^\377\350\307\215\377\352\317\233\377?5$\377" + "\4\4\3q\0\0\0\0\3\3\3\34\12\12\11\377\310v%\377\327}&\377\322{'\377\33\26" + "\16\343\0\0\0\0\0\0\0\0\0\0\0\0\3\3\2\6\15\13\10\335\307t\"\377\327}&\377" + "\324|'\377#\33\20\377\5\4\4""9\0\0\0\0\0\0\0\0\0\0\0\0\17\16\14\223\316\232" + "W\377\350\303\211\377\352\314\227\377?6&\377\5\5\4U\0\0\0\0\4\4\3\34\22\20" + "\15\343\336\275\203\377\353\315\230\377\352\315\233\377\33\30\24\377\0\0" + "\0\0\0\0\0\0\13\13\12\252\333\270\202\377\353\315\230\377\352\315\233\377" + ":1#\377\5\5\4U\0\0\0\0\4\4\3\34\16\14\11\343\307u$\377\327q&\377\322{'\377" + "\40\31\17\252\0\0\0\0\0\0\0\0\14\14\11f\302m!\377\327}&\377\324|'\377\33" + "\26\16\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\22\20\15\252\331" + "\260n\377\352\304\217\377\352\314\227\377\33\30\24\377\0\0\0\0\0\0\0\0\13" + "\12\12\252\314\206;\377\333\2106\377\325z*\377H2\33\377\10\10\7\377\31\26" + "\16\377\303t&\377\320{'\377\216[\37\377\20\16\11\301\4\4\3\21\0\0\0\0\0\0" + "\0\0\0\0\0\0\13\13\10\252\306u%\377\333\2058\377\335\230F\377\33\27\20\335" + "\0\0\0\0\0\0\0\0\15\14\12c\301q\"\377\337\234F\377\347\301\200\377(\"\31" + "\377\4\3\3q\21\20\14\343\320\210;\377-$\25\377\4\3\3q\12\11\7\317\304n!\377" + "\327}&\377\322\200)\377\40\31\17\252\0\0\0\0\0\0\0\0\14\13\11l\302m!\377" + "\327}&\377\324|'\377#\33\20\377\4\4\3U\0\0\0\0\3\3\2\34\14\13\11\343\307" + "u$\377\335\226B\377\345\277~\377\40\35\27\322\0\0\0\0\0\0\0\0\15\15\14z\314" + "\226O\377\337\237L\377\331\2154\377T9\35\377\11\10\6\252\5\5\4U\6\6\5q\33" + "\26\16\377\317\200,\377\337\223H\377\343\273v\377\"\36\27\317\0\0\0\0\0\0" + "\0\0\14\13\13\252\332\264w\377\345\270r\377\340\247U\3772(\31\377\5\5\4U" + "\0\0\0\0\4\4\3\34\16\14\11\343\313}*\377\331\2000\377\325\200-\377#\33\20" + "\255\0\0\0\0\0\0\0\0\14\14\13\202\321\243b\377\353\313\224\377\351\312\224" + "\377?6$\377\5\5\4U\0\0\0\0\4\4\3\34\17\17\14\343\321\211<\377\335\227D\377" + "\333\223>\377\27\24\16\356\0\0\0\0\0\0\0\0\12\12\11\226\304y)\377\331\200" + "0\377\327\205,\377(\37\23\377\5\5\5U\0\0\0\0\4\4\3\34\20\16\13\317\311x(" + "\377\331\2052\377\335\241L\3779,\34\252\0\0\0\0\0\0\0\0\17\16\14i\323\245" + "b\377\350\305\211\377\350\307\215\377:1#\377\4\4\3q\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\3\2\21\14\13" + "\11\343\307t\"\377\327}&\377\324|'\377#\33\20\377\4\4\3>\0\0\0\0\0\0\0\0" + "\0\0\0\0\14\13\11\252\310x)\377\337\237L\377\346\277{\377,%\33\377\0\0\0" + "\0\0\0\0\0\0\0\0\0\22\21\17\252\320\214;\377\331\2052\377\325}(\377\33\27" + "\16\303\0\0\0\0\0\0\0\0\14\13\11l\302m!\377\327}&\377\324|'\377\31\25\16" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\21\20\16\252\333\263t\377\353\311\230\377\352" + "\314\227\377\33\30\24\377\0\0\0\0\0\0\0\0\12\12\11\252\306z)\377\327\177" + "*\377\325}(\377\33\26\16\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\13" + "\11\252\311x(\377\340\234S\377\347\276\204\377(!\31\377\0\0\0\0\0\0\0\0\0" + "\0\0\0\12\12\11U4*\35\377\310\216;\377\267w,\377H4\33\377'\36\22\3771%\26" + "\377\226c!\377\304t%\377M2\30\377\12\11\7\220\0\0\0\0\0\0\0\0\0\0\0\0\12" + "\12\11\252\304s#\377\327}&\377\324|'\377\31\25\16\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\14\13\11\252\304n!\377\326\177+\377\336\236K\377)\"\30\377\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\5\4U\13\13\12\377\202e;\377\337" + "\260f\377\340\260e\377\261\211J\377\22\21\15\343\6\5\5\34\0\0\0\0\0\0\0\0" + "\0\0\0\0\24\23\17U\272x1\377\331\216>\377\331\2138\377\"\35\23\377\4\4\3" + "\21\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\21\21\16\252\335\274\202\377" + "\353\315\230\377\352\315\233\377*'\35\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\15\15\12\265\307w'\377\324y)\377\313y(\377#\35\21\252\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\24\22\17\252\336\272" + "{\377\352\311\217\377\350\305\207\377/(\34\377\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\15\13\252\325\240T\377\346\273w\377\347" + "\305\204\377#\36\26\306\0\0\0\0\16\15\13l\331\260p\377\350\301\211\377\347" + "\305\204\377!\34\26\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14" + "\14\13q\37\35\26\322(#\33\377)\"\30\377\35\30\20\377\40\32\21\377\222\\#" + "\377\326\2061\377\324\200-\377{Q$\377\17\15\12\216\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\7\7\6U\34\32\23\374\302\214G\377\324\177+\377\312v#\377" + "aB\36\377\17\16\12\317\6\6\5\31\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\6\6\5\10\17\15\14\343oV2\377\321\250f\377\260\210S\377UC,\377\243" + "\201P\377\335\272~\377SE,\377\7\7\6\252\5\5\5\10\0\0\0\0\11\11\10l\24\22" + "\15\252\15\14\12""3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\20\17\15\252\331\260n\377\350\302\205\377\350\306\213" + "\377$!\31\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\17\14\252" + "\333\263t\377\350\301\211\377\350\307\207\377\37\32\24\377\0\0\0\0\0\0\0" + "\0\13\13\12\34""80!\343bL-\377hP-\377\303\232`\377\343\272r\377\342\275}" + "\377\317\255r\377\336\274{\377\347\276\204\377\331\274|\377\211mF\377cV6" + "\377N@+\377\25\24\20U\0\0\0\0\0\0\0\0\14\14\13\34""60#\343VH/\377J?+\377" + "\253\211T\377\345\277\202\377\346\277{\377\346\272{\377\312\244i\377aP2\377" + "K@,\377H='\377\26\25\21f\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\14\13\13-7-\36\343ZG-\377N?)\377H='\377J?+\377H" + "='\377H='\377[J.\377N?)\377\26\24\21f\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\14\13\260" + "\204j=\377\344\274}\377\322\254q\377*%\35\377\11\11\10>\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\21\20\16\252\335\272|\377\352\307\217\377\350\311\215\377" + "\350\311\215\377\335\275\206\3774.!\377\6\7\6\343\30\27\21\377\320\2043\377" + "\327\205,\377\324|'\377\30\24\15\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\21\20\14\252\333\261p\377\347\273|\377\344\266m\377(!\27\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\11\11\10J\21\17\14\343C3\34\377\242k+\377\310\216C\377\314\235[\377\261" + "\214V\377J?+\377\23\21\20\306\11\11\10\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\16\13\37""8.\37\343\300\235g\377\345" + "\302\200\377\341\274|\377\222pC\377\13\12\10\244\0\0\0\0\0\0\0\0\7\7\6\34" + "\"\33\21\377\276k!\377\322y#\377\222_#\377\20\16\13\273\0\0\0\0\0\0\0\0\11" + "\11\10\252\326\244]\377\350\302\177\377\347\303\204\377(\"\31\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\15\15\12\252\325\235T\377\340\246S\377\335\226B\377\27\24\16\366\0\0\0\0" + "\0\0\0\0\14\13\11q\302m!\377\324w%\377\322q#\377\250g!\3778*\27\377\33\27" + "\16\377&\37\23\377\225\\\36\377\317v\40\377\317q\36\377|K\33\377\15\13\10" + "\241\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\14\13\260" + "\202c;\377\345\277~\377\323\256t\377+%\34\377\11\11\10;\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\10\10\7UD:%\377\326\261w\377\347\304\210\377\317\253r\377" + "aP2\3776/#\377B;)\377\262\224_\377\344\275y\377\340\273{\377\222pC\377\14" + "\14\13\252\0\0\0\0\0\0\0\0\0\0\0\0\12\12\11\34\20\17\15\223\35\34\26\335" + "0*\37\377F=)\377B9'\377F=)\377\253\214\\\377\340\252e\377\340\250W\377\340" + "\245Q\377'\40\26\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\16\15\13""9dR3\377\336\272{\377\342\254_\377qR&\377\11\10\10\177\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\11\6f\13" + "\12\6\252\13\12\10\252\14\13\11\252\17\15\12\252\17\15\12\252\17\16\12\252" + "\22\17\13\252\22\17\13\234\14\13\11\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\6\6\5A(\"\31\377\340\267w\377\345\303\210\377\253" + "\214\\\377\25\24\22\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13" + "\12\10f\203\\.\377\325\2218\377\326w+\377\322\200)\377\227^\40\377\27\25" + "\16\377\12\12\11U\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\252\277j\36\377\323s\36" + "\377\320r\37\377\215W\36\377$\37\23\377yZ*\377\331\250\\\377\315\243f\377" + "\204f;\377\325\254l\377\347\301\200\377#\36\26\377\0\0\0\0\0\0\0\0\13\13" + "\12\244\313\2012\377\327\177*\377\323u\"\377\246a\35\3776(\25\377\35\27\16" + "\377&\37\23\377xN\35\377\316v!\377\326\177+\377\340\233Q\377\27\25\20\377" + "\0\0\0\0\0\0\0\0\13\12\12\252\331\267t\377\352\311\217\377\350\306\213\377" + "\312\246m\377aN2\3774.!\377:2!\377\226`'\377\320y%\377\303p\36\377S5\30\377" + "\11\10\6q\0\0\0\0\0\0\0\0\15\14\10`\275h\34\377\322x!\377\326\204-\377\"" + "\35\23\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\21\20\14\252\331\254f\377\344\264i\377\344\265k\377(!" + "\27\377\0\0\0\0\0\0\0\0\0\0\0\0\21\17\14\252\330\253e\377\350\277\177\377" + "\347\305\204\377\30\26\21\377\0\0\0\0\0\0\0\0\13\13\12\247\321\222H\377\335" + "\227D\377\325~*\377\254j#\3779)\26\377*\40\23\377+!\24\374\22\17\13U\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\12\10\252\301o\36\377\327q&\377\334\220?" + "\377\305\221T\377[G,\377K>*\377K@,\377\26\25\21c\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\16\15\13\252\304n!\377\322s\37\377\322s\37\377\26\23\13\343\0\0" + "\0\0\0\0\0\0\20\15\11q\30\25\17\252\21\17\14\252\22\17\15\252\23\21\14\216" + "\11\10\10\34\0\0\0\0\0\0\0\0\16\15\13\252\322\222G\377\334\216;\377\325}" + "(\377\250g!\3776(\25\377\35\27\16\377&\37\23\377wN\36\377\314t\37\377\322" + "w\37\377\322s\37\377\32\24\15\322\0\0\0\0\0\0\0\0\13\13\12\252\331\263x\377" + "\352\312\223\377\350\311\215\377(#\31\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\12\10\252\301o\36\377" + "\323s\36\377\322s\37\377$\31\15\252\0\0\0\0\0\0\0\0\16\14\11U\276i\35\377" + "\322k\37\377\320r\37\377\273|*\377\217o8\377\322\253m\377\345\273\200\377" + "\203c6\377\10\10\7\234\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\14\12\252" + "\302p\37\377\322k\37\377\322s\37\377\26\23\13\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\12\10\252\301o\36\377\327}&\377" + "\332\215;\377'!\26\377\5\5\5\34\14\14\13\252\234~S\377\33\30\24\343\5\5\5" + "\27\16\15\13\306\333\261p\377\350\277\177\377\346\277{\377\31\26\20\371\0" + "\0\0\0\0\0\0\0\13\12\10\231\310x)\377\326\177+\377\325~*\377]B\40\377\13" + "\13\12\377\"\37\27\377\316\230Q\377\342\263o\377\347\275\200\377\350\300" + "\207\377\350\311\215\377\31\26\22\377\0\0\0\0\0\0\0\0\13\12\12\252\327\253" + "f\377\344\256i\377\336\236K\377\33\30\20\377\0\0\0\0\0\0\0\0\0\0\0\0\17\17" + "\14\252\333\261p\377\350\301\211\377\350\311\215\377\31\26\22\377\0\0\0\0" + "\0\0\0\0\13\12\12\252\327\254h\377\344\266m\377\335\233F\377\261r.\3777*" + "\30\377#\34\22\377)\37\22\377#\34\21\377\33\26\16\377\21\20\14\273\11\11" + "\10O\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\252\277j\36\377\323s\36\377\322s\37" + "\377!\31\16\377\0\0\0\0\0\0\0\0\0\0\0\0\25\24\20\252\335\264t\377\350\301" + "\211\377\350\311\215\377\31\26\22\377\0\0\0\0\0\0\0\0\13\13\12\252\324\240" + "U\377\340\234S\377\332\215;\377\257s,\3777*\30\377\37\31\20\377&\36\23\377" + "\177R\36\377\314t\37\377\303p\36\377R7\31\377\13\12\10\226\0\0\0\0\0\0\0" + "\0\0\0\0\0\11\11\10\34\17\16\14\216\34\31\23\335.(\35\377G<&\377B9'\377F" + "=)\377\301\237j\377\343\270l\377\335\231H\377\233b$\377\15\14\12\252\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\21\17\14\252\333\264p\377\350" + "\305\211\377\350\311\215\377(#\31\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\16\15\13\252\306u%\377\325|&\377\322y#\377\27\23\14\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\13\12\10\252\301o\36\377\323s\36\377\320r\37\377\27" + "\23\14\317\0\0\0\0\0\0\0\0\16\15\13U\265\204D\377\344\271u\377\347\301\200" + "\3776.\37\377\5\5\4\10\0\0\0\0\0\0\0\0\25\24\20\262\327\240X\377\337\223" + "H\377\316\2073\377\27\24\16\252\0\0\0\0\0\0\0\0\14\13\11f\300o\37\377\322" + "l!\377\320r\37\377\26\22\13\377\0\0\0\0\12\12\11qO=&\377\21\20\14\306\0\0" + "\0\0\20\17\15\252\333\263t\377\347\273|\377\340\251[\377!\34\24\377\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\10\10U'!\30\377\331\246\\\377\333\214" + "8\377\322y#\377B,\25\377\7\7\6\205\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\6\6\5J\23\22\14\377\267f\36\377\317i\36\377\322" + "o\37\377I3\30\377\10\10\7t\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\6\6\6\34\17\15\14\343\220p=\377\335\264t\377\340\262q\377\230tA\377\22" + "\21\15\335\10\10\7\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14" + "\12\11\252\301o\36\377\322k\37\377\322s\37\377\26\23\13\377\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\17\15\343\244z?\377\341\271" + "r\377\300\231a\377\25\23\20\350\7\7\6\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\13\12\10\252\301o\36\377\323s\36\377\322s\37\377\27\23\14" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\6\6\5""3\13\11\6U\14\12\7f\12\10\5\234\12\10\5\177\10\7\5\270" + "\33\26\14\377\306i\35\377\323z$\377\334\210=\377\31\26\20\377\0\0\0\0\0\0" + "\0\0\12\12\11\252\332\265{\377\352\312\223\377\350\305\215\377\36\33\25\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6\252\277j\36\377\323s\36\377\322o\37\377" + "'\33\16\252\0\0\0\0\0\0\0\0\14\13\13\252\332\264w\377\352\304\217\377\350" + "\311\215\377\35\32\24\377\0\0\0\0\0\0\0\0\0\0\0\0\7\7\6\34\33\26\16\234\31" + "\26\16\377\40\31\17\322\26\22\13\34\0\0\0\0\0\0\0\0\12\11\7\226\303p\36\377" + "\323s\36\377\322s\37\377\23\17\12\374\0\0\0\0\0\0\0\0\0\0\0\0\11\11\10\252" + "\277j\36\377\323o\36\377\320r\37\377\31\24\14\314\0\0\0\0\0\0\0\0\14\13\13" + "\252\332\264w\377\352\312\223\377\350\311\215\377\216o?\377\16\14\11\343" + "\12\11\7\177\10\7\5\265#\31\16\377\307p\34\377\321v\36\377\321u\34\377\36" + "\26\15\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6\247\277j\36\377\323s\36" + "\377\322s\37\377\23\17\12\374\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\25\23\20\252" + "\334\262q\377\350\305\211\377\350\311\215\377\32\27\23\377\0\0\0\0\0\0\0" + "\0\0\0\0\0\13\13\12\252\332\265{\377\352\311\217\377\347\305\204\377\30\26" + "\21\377\0\0\0\0\0\0\0\0\13\12\12\252\332\265{\377\352\311\217\377\347\305" + "\204\377\36\32\25\377\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6\247\277j\36\377\323" + "s\36\377\322o\37\377'\33\16\252\0\0\0\0\0\0\0\0\15\14\10U\276i\35\377\325" + "w$\377\326\204-\377\40\32\21\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\21\20\16\252\335\272|\377\352\312\223\377\350\307\207\377\31\26" + "\22\374\0\0\0\0\0\0\0\0\13\12\10\177\300o\37\377\322k\37\377\320r\37\377" + "\241^\34\377A+\24\377\221U\32\377\317u\36\377zK\35\377\17\16\12\252\5\5\4" + "\10\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\12\10\252\304s#\377\337\222F\377\344" + "\267o\377\31\26\20\374\0\0\0\0\0\0\0\0\16\14\11U\276i\35\377\327}&\377\332" + "\215;\377\36\30\21\303\0\0\0\0\12\12\7\252\301o\36\377\24\21\13\374\0\0\0" + "\0\13\12\10U\274g\33\377\323s\36\377\321j\36\377'\33\16\252\0\0\0\0\0\0\0" + "\0\15\14\10U\276i\35\377\323s\36\377\322s\37\377\23\17\12\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\11\10\6\247\300o\37\377\332\2113\377\343\257d\377\33\30\22\377" + "\0\0\0\0\0\0\0\0\13\12\10\223\304j!\377\322l!\377\322s\37\377\36\27\15\377" + "\4\4\3\16\0\0\0\0\0\0\0\0\17\16\14\303\323\225L\377\345\270r\377\350\307" + "\207\377\34\31\23\377\0\0\0\0\0\0\0\0\13\12\10\247\313\2012\377\327\177*" + "\377\322y#\377\24\21\13\350\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6\213\276i\35\377" + "\323o\36\377\321r\36\377\36\26\15\306\0\0\0\0\0\0\0\0\15\14\12\252\331\255" + "h\377\350\301\211\377\350\302\213\377\31\26\22\377\0\0\0\0\0\0\0\0\0\0\0" + "\0\11\10\10\234\300o\37\377\322l!\377\322s\37\377\40\30\15\255\0\0\0\0\0" + "\0\0\0\15\14\10X\276i\35\377\323s\36\377\320r\37\377\23\17\12\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\7\7\6\34\33\26\16\306-$\25\3774+\35\364\16\15\13U\0\0\0" + "\0\0\0\0\0\15\15\14X\261\217Z\377\346\302\203\377\342\254_\377\211[$\377" + "\12\11\7\343\10\10\5\241\12\11\7\247\12\11\7\210\15\12\6U\7\6\6J\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6\247\277j\36\377\323s\36" + "\377\322s\37\377\23\17\12\374\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\13\11\252" + "\320\215=\377\346\273w\377\350\311\215\377(\"\31\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\16\14\11\252\304m\37\377\322k\37\377\322s\37\377$\31\15\252\0\0\0\0" + "\0\0\0\0\12\11\7U\233[\34\377\320r\37\377\321j\36\377\36\26\15\377\0\0\0" + "\0\0\0\0\0\0\0\0\0\26\25\21\260\336\272{\377\352\307\217\377\342\303\207" + "\377#\35\26\262\0\0\0\0\0\0\0\0\14\13\11i\276i\35\377\323s\36\377\320r\37" + "\377\27\23\14\322\0\0\0\0\0\0\0\0\17\14\10;\7\6\4\3\0\0\0\0\11\11\10\237" + "\314\206;\377\346\266w\377\350\306\213\377'!\30\377\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\12\12\11\"\17\16\12\3064(\25\377\245`\34\377\306q\35\377\271f" + "\34\377P5\31\377\23\21\14\343\12\11\7L\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13" + "\12\10\252\303p\36\377\323s\36\377\322s\37\377\24\20\13\377\0\0\0\0\0\0\0" + "\0\0\0\0\0\12\11\7\252\300o\37\377\327}&\377\340\237S\377)!\30\377\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\7\6l\30\24\15\377\222X\37\377" + "\303\177&\377qM\"\377\17\16\14\322\7\7\6\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\14\14\13\34%\36\22\343\250c\37\377\316r!\3773\"\22\377\6\5\5G\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\21\20\16\252\335\272|\377\352\312\223\377" + "\350\311\215\377(#\31\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\21\17\12\343\306i\35\377\302m!\377>,\27\377\20\16\13U\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\23\21\14\216\326\253a\377\344\267" + "q\377\343\272l\3772(\31\343\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\14\13\11\306\326\236U\377\345\267n\377\344\265k\377\25\23\16\371" + "\2\2\1\24\10\10\7\265\322\234O\377\342\251_\377\340\233Q\377!\32\22\377\4" + "\4\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\3\3\2\34\13\12\10\377\321\212>\377\337\232H\377\335\244R\377" + "\33\27\20\371\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\7\6O.&\31\377\305\227T\377" + "\336\241Y\377\321\200*\377\215[\40\377\17\15\12\332\5\5\5\13\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12\213\277\203<\377\334" + "\250]\377\250{E\377\16\15\13\343\5\5\5U\11\11\10\252iN(\377\242t=\377XB%" + "\377\27\25\20\377\13\13\12\377N:#\377\320\226K\377=.\34\265\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12\252\330" + "\252a\377\346\273w\377\344\262q\377\"\34\23\377\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\17\15\12\252\327\247\\\377\345\263r\377\344\265k\377" + "\40\33\23\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\6\6\31\5\5\4\3064*\33\377" + "\334\251a\377\275\216L\377#\37\26\377\206`3\377\341\260j\377\214j5\377\6" + "\6\5\377\6\6\6""3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\5\5\5\34\17\15\12\343\320\210;\377\332\2125\377\325z*\377+\37\22\377\5\5" + "\4U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\10\10""99/" + "\36\377\324\243]\377\340\235U\377|Z-\377\12\12\11\223\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\17\15\12\252\330\252a\377\344\265k\377\340\245Q\377" + "\302\210=\377:.\35\377\14\14\13U\0\0\0\0\12\11\7\234\256[\27\377\312g\27" + "\377\312f\25\377\24\20\11\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\17\15\12\252\325\233P\377\343\257d\377\343\253b\377#\35\24\377\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\7\6U1!\22\377" + "\267l\"\377\321\200*\377\321\211<\377\272\206C\377_J'\377\26\24\17\345\10" + "\10\7i\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\5\4\4\34\21\17\14\343\330\247Y\377\344\265k\377\337" + "\260f\377\"\34\23\270\0\0\0\0\0\0\0\0\14\13\11l\264j!\377\326}'\377\331\215" + "4\377*!\25\377\4\4\4U\0\0\0\0\0\0\0\0\13\12\10\306\323\225L\377\340\240M" + "\377\334\220?\377\"\33\21\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\12\7\252\275c\32\377\316f\31\377" + "\313d\30\377\36\25\13\260\0\0\0\0\0\0\0\0\14\12\7U\247W\26\377\312g\27\377" + "\312f\25\377\33\24\12\377\4\4\3D\0\0\0\0\4\4\4\34\14\12\7\327\260[\27\377" + "\313h\30\377\312i\33\377\34\25\15\371\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\11\10\10""99/\36\377\325\247^\377\344\270s\377~\\/\377\11\11" + "\10\223\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\14\12\247\307\203:\377" + "\334\224?\377\333\223>\3771&\30\377\6\6\6U\0\0\0\0\5\5\5\34\17\16\14\343" + "\331\251^\377\344\267o\377\341\256f\377\37\31\22\361\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\5\5\34\17\15\12\343" + "\314\177-\377\333\2058\377\335\226B\377#\34\22\377\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\11U-\"\25\377\311n\36\377" + "\300d\31\3779#\20\377\14\12\7U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\15\13\6O~D\25\377\277d\32\377\306u%\377\320\213A\377\325\233P\377" + "\326\241U\377\327\247\\\377\330\247Y\377\327\240X\3771&\30\252\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\7\6L-$\30\371\317\244Z\377\344\267" + "o\377\217o8\377\15\14\12\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\15\14\10\216\266c\31\377\313l\30\377\312f\25\377pA\27\377\17" + "\15\10\343\6\6\5-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7\252\253Y\26\377" + "\312_\27\377\312g\27\377g@\32\377\24\22\15\377O=$\377\336\255a\377\343\263" + "h\377\340\254a\377\342\253c\377\340\260]\377$\35\23\317\0\0\0\0\0\0\0\0\14" + "\12\7q\260[\27\377\312_\27\377\312f\25\377\33\24\12\377\4\4\3J\0\0\0\0\4" + "\4\4\34\13\11\6\327\273e\30\377\330\206-\377\342\254_\377\27\25\20\361\0" + "\0\0\0\0\0\0\0\12\12\11\241\324\240U\377\342\254_\377\336\236K\3773'\30\377" + "\6\6\6U\0\0\0\0\4\4\3\34\13\12\6\327\260[\27\377\312f\25\377\277f\26\377" + "\26\21\11\252\0\0\0\0\0\0\0\0\14\12\7U\247W\26\377\314i\31\377\331\2052\377" + "#\34\22\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\17\15\12\252\307t\"\377\324r#\377\332\2137\377!\33\22" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12\252\325\240T\377\343\257d\377\340\245" + "Q\377\31\25\16\353\0\0\0\0\0\0\0\0\15\13\10l\270`\31\377\313`\30\377\312" + "_\27\377\33\24\12\377\4\4\3G\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\12\11\7\252\273e\30\377\330\206-\377\340\247U\3776*\33\377\6" + "\6\6U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\252" + "\253Y\26\377\312g\27\377\312f\25\377\35\25\12\252\0\0\0\0\13\11\6*\211M\30" + "\377\323\2108\377\327\247\\\377\330\246_\377\325\243T\377!\34\22\241\0\0" + "\0\0\0\0\0\0\13\12\10\202\270d\31\377\313d\30\377\312f\25\377\33\24\12\377" + "\4\4\3J\0\0\0\0\4\4\4\34\13\11\6\327\260[\27\377\312g\27\377\312_\27\377" + "\34\25\13\276\0\0\0\0\0\0\0\0\12\12\11\241\324\241Y\377\344\256i\377\337" + "\241P\377!\34\22\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\247\253Y\26\377\312g\27\377\312f\25" + "\377\35\25\12\252\0\0\0\0\0\0\0\0\14\12\7U\247W\26\377\312g\27\377\313l\30" + "\377D/\31\377\6\6\5\377\37\32\24\377\334\250]\377\334\261e\377nP)\377\14" + "\13\11\226\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\252\253Y\26\377\312g\27" + "\377\312f\25\377\24\20\11\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\12\11\7\252\301o\36\377\333\2106\377\340\245Q\377\33" + "\30\20\377\0\0\0\0\7\7\7\34\25\24\20\265\12\12\11U\0\0\0\0\14\13\11\252\314" + "\2023\377\332\2153\377\323z$\377\40\27\15\273\0\0\0\0\0\0\0\0\15\13\10U\247" + "W\26\377\313d\30\377\320i\35\377\27\23\14\377\4\4\3\34\13\12\10\265\323\236" + "R\377\345\267n\377\344\267o\377\344\267q\377\344\265k\377\33\27\20\345\0" + "\0\0\0\0\0\0\0\12\12\11\226\300o\37\377\320p\33\377\313l\30\377\25\21\12" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12\252\330\252a\377\345\267n\377\344\265" + "k\377\31\25\20\353\0\0\0\0\0\0\0\0\13\12\10\216\302t!\377\321j\36\377\313" + "l\30\377\33\24\12\377\4\4\3J\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7\252\253Y\26\377\312g\27\377\312f\25" + "\377*\34\15\377\6\5\5""0\0\0\0\0\6\6\6\34\25\23\16\377\335\257f\377\345\263" + "r\377\344\265k\377\30\24\17\366\0\0\0\0\0\0\0\0\14\13\11\177\276h\33\377" + "\316j\31\377\312g\27\377\33\24\12\377\4\4\3J\0\0\0\0\4\4\4\34\13\12\6\327" + "\260[\27\377\314i\31\377\317z&\377\34\26\17\356\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\5\5\34\17\15\12\343\303" + "o\34\377\314i\31\377\305d\26\377\26\21\11\340\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\17\15\12\252\330\252a\377\345\270r\377\344\265k\377" + "\"\34\23\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\252" + "\256[\27\377\312g\27\377\312f\25\377\24\20\11\374\0\0\0\0\0\0\0\0\0\0\0\0" + "\12\11\7\252\253Y\26\377\312k\27\377\316o\33\377\26\21\13\374\0\0\0\0\0\0" + "\0\0\10\7\7-I;$\377\332\256i\377\344\262k\377YC$\377\7\7\6q\0\0\0\0\5\5\4" + "\34\24\22\15\377\307n\36\377\312i\33\377X6\27\377\12\11\7q\0\0\0\0\0\0\0" + "\0\15\13\6U\247W\26\377\312_\27\377\312Z\27\377\40\30\15\377\4\4\3\262\23" + "\20\14\356\324\243]\377B4\37\377\5\5\5\270\16\15\13\377\315\2050\377\324" + "r#\377\320u\35\377\35\26\16\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\13\11" + "UeJ&\377\275y1\377\271h\40\377\264b\31\377\264]\27\377\232R\27\377K,\22\377" + "\13\11\6\220\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\12\11\7\252\235O\26\377\312f\25\377\312f\25\377\26\21\11\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\15\13\340\210b5\377\331" + "\245R\377\325\2218\377\226\\#\377\23\20\14\255\5\5\5\10\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7\252\253Y\26\377\312g\27\377" + "\312f\25\377\24\20\11\374\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\7\7\6;+#\30\377\335\257f\377\337\262j\377\206b3\377\16\15\13\216" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\247\253Y\26\377" + "\312g\27\377\312f\25\377\24\20\11\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\12\7\252.\35\15\377\214J\25\377\245" + "V\26\377\247W\26\377\245V\26\377\247W\26\377\271_\26\377\306a\27\377\316" + "o\33\377\335\222B\377\27\23\16\371\0\0\0\0\0\0\0\0\12\12\11\231\324\241Y" + "\377\345\267n\377\340\245Q\377\34\27\17\377\0\0\0\0\0\0\0\0\0\0\0\0\12\10" + "\7\234\253Y\26\377\312g\27\377\312f\25\377\37\25\12\252\0\0\0\0\0\0\0\0\12" + "\12\11\247\324\240U\377\344\261i\377\336\236K\377\33\27\20\377\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12" + "\10\7\252\247W\26\377\312g\27\377\312f\25\377\24\20\11\356\0\0\0\0\0\0\0" + "\0\0\0\0\0\12\10\7\244\253Y\26\377\312g\27\377\313d\30\377\26\22\13\353\0" + "\0\0\0\0\0\0\0\12\12\11\247\326\244]\377\344\266m\377\337\232P\377\317x$" + "\377\275^\30\377\247W\26\377\247W\26\377\273`\26\377\306]\27\377\312]\25" + "\377\306`\25\377\32\23\11\343\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7\247" + "\253Y\26\377\312g\27\377\312f\25\377\24\17\11\374\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\21\17\14\252\330\252a\377\345\267n\377\340\244U\377\35\30\20\377" + "\3\3\2\34\0\0\0\0\0\0\0\0\14\13\11\306\323\225L\377\335\227D\377\333\222" + "<\377\26\23\15\366\0\0\0\0\0\0\0\0\12\12\11\241\322\233M\377\337\223H\377" + "\325z*\377\27\22\14\377\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7\247\253Y\26\377\312" + "g\27\377\312f\25\377\35\25\12\252\0\0\0\0\0\0\0\0\14\12\7U\246W\27\377\321" + "v\36\377\332\2137\377!\33\22\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\17\15\12\252\327\237\\\377\342\251_\377\332\215;\377\"\32\17\276" + "\0\0\0\0\0\0\0\0\15\12\6U\247W\26\377\312g\27\377\306`\25\377\305`\26\377" + "\275a\26\377\306`\25\377\306`\25\377\31\23\12\377\4\4\3\34\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\252\262\\\27\377\322k\37\377\327\200," + "\377!\30\16\301\0\0\0\0\0\0\0\0\14\12\7U\247W\26\377\312_\27\377\312g\27" + "\377\40\26\13\252\0\0\0\0\12\10\7\252\253Y\26\377\30\21\11\371\0\0\0\0\14" + "\12\7U\243R\26\377\312g\27\377\312f\25\377\35\25\12\252\0\0\0\0\0\0\0\0\14" + "\12\7U\246W\27\377\312g\27\377\312f\25\377\24\17\11\377\0\0\0\0\0\0\0\0\0" + "\0\0\0\12\10\7\247\252Y\27\377\316j\31\377\320s!\377\34\25\15\317\0\0\0\0" + "\0\0\0\0\15\12\6U\247W\26\377\312_\27\377\312f\25\377\24\20\11\377\0\0\0" + "\0\0\0\0\0\0\0\0\0\17\15\12\252\326\236U\377\345\267n\377\344\271o\377\30" + "\24\17\371\0\0\0\0\0\0\0\0\14\13\11l\260[\27\377\312_\27\377\312f\25\377" + "\22\17\11\377\2\2\1\10\0\0\0\0\0\0\0\0\10\7\5\270\253Y\26\377\312_\27\377" + "\312f\25\377\"\27\13\255\0\0\0\0\0\0\0\0\14\13\11\210\324\240U\377\344\264" + "i\377\341\245X\377\37\31\22\377\3\3\2\34\0\0\0\0\0\0\0\0\10\7\5\262\253Y" + "\26\377\312g\27\377\312f\25\377\36\25\13\252\0\0\0\0\0\0\0\0\14\12\7U\247" + "W\26\377\312g\27\377\312f\25\377\24\17\11\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\7\6\34\36\33\25\356" + "\247o2\377\316n!\377\307f\30\377\257Z\26\377\245V\26\377\247W\26\377\247" + "W\26\377\241W\26\377T0\23\377\22\17\11\343\10\7\5\34\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\12\10\7\247\253Y\26\377\312g\27\377\312f\25\377\24\17\11\374" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12\252\323\237L\377\345\264n\377\344" + "\266m\377\"\34\23\377\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\252\253Y\26\377\312" + "g\27\377\312f\25\377\37\26\12\252\0\0\0\0\0\0\0\0\7\6\6\34""0\37\17\377\275" + "]\26\377\312f\25\377-\35\16\377\5\5\4q\0\0\0\0\5\5\4\34\26\24\17\377\334" + "\251a\377\342\262g\377\247v6\377\17\15\12\205\0\0\0\0\0\0\0\0\15\13\6U\247" + "W\26\377\312g\27\377\312f\25\377\23\17\10\327\0\0\0\0\13\11\6iyA\24\377\32" + "\22\11\276\0\0\0\0\11\11\10\247\320\226K\377\345\267n\377\344\265q\377%\35" + "\24\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\10\5\332\247W" + "\26\377\312]\25\377\306h\25\377\27\22\12\377\3\3\2""3\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\12\11\7\231\253Y\26\377\312_\27\377\312f\25\377\24\17" + "\11\377\2\2\1\21\0\0\0\0\0\0\0\0\10\7\5\265\270d\31\377\327w*\377\340\240" + "U\377\"\34\23\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6U\37\26" + "\14\377\246W\27\377\275a\26\377c<\26\377\17\15\10\252\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\4\3\3\27\15\13\10\343\266^\27\377\225" + "W\32\377\23\21\14\343\7\7\7\27\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12\252" + "\330\252a\377\345\263r\377\344\266m\377\"\34\23\377\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\11\10\6\202E*\22\377\303_\26\377#\30\14\377\5\5\4L\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\34\33" + "\30\20\270\40\33\23\377'\35\24\324\15\14\12U\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\15\13\10\252Q6\34\377\330\224C\377\337\241H\377\334" + "\223=\377uL\40\377\15\13\10\377,!\23\377\317{(\377\331\2102\377\332\2165" + "\377\234d'\377\22\17\13\343\12\10\7\34\0\0\0\0\0\0\0\0\0\0\0\0\17\15\10}" + "\23\16\12\252\16\13\7\252\12\10\7\252\13\11\6z\15\12\10U\10\7\5\231.!\25" + "\377\324\2123\377\335\227D\377\277\204>\377\23\21\14\260\0\0\0\0\0\0\0\0" + "\0\0\0\0\7\7\6L\32\26\17\361\275\201:\377\333\230H\377\331\232H\377\205W" + "&\377\17\15\12\335\6\6\5\34\0\0\0\0\0\0\0\0\17\14\10q\24\20\13\252\21\16" + "\12\216\7\6\6\34\0\0\0\0\0\0\0\0\23\20\14\252\310u#\377\324{%\377sJ\36\377" + "\11\10\6q\0\0\0\0\0\0\0\0\14\13\11\262hI%\377\316\223?\377\262y5\377:.\35" + "\377.$\31\377(\40\25\374\23\21\14U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\12\11\244\277\203<\377\337\241P\377" + "\335\227D\377.\"\25\377\4\4\3\3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\23" + "\20\14\255\320\2067\377\337\234F\377\330\240Q\377\25\23\16\377\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\6\5\5\31\21\16\12\343C0\34\377^C#\377\24\21\15\343" + "\6\6\5q\14\13\11\306C3\36\377U>\40\377\31\24\16\377\11\10\6R\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5\252\241W\26" + "\377\303Z\24\377\273[\24\377\23\16\10\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\17\14\10w\24\20\13\252\21\16\12\234\12\10\7\34\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\14\10z\22\17\13" + "\252\21\16\12\220\12\10\7\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\14\12\252" + "\235`$\377\323{&\377\307t\"\377\37\30\20\377\6\6\6\34\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\20\15\13\252\305n\40\377\321n\36\377\312g\27\377:$\17" + "\377\10\7\5q\0\0\0\0\0\0\0\0\12\10\5U\211D\22\377\271V\24\377\256X\23\377" + "\22\15\7\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\12\11\252" + "\314\2011\377\334\220?\377\331\2052\377\32\24\15\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\6\6L\27\23\14\364\271q$\377\317\201" + "4\377\255u2\377;.\34\377\22\17\15\306\11\11\10q\6\6\6\13\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\14\10\205\26\21\13\252\21\16\12\216\10" + "\7\5\34\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6\252\312\2001\377\334\224?\377\333" + "\2148\377\26\23\15\377\0\0\0\0\0\0\0\0\14\12\11\252\310}%\377\332\2153\377" + "\334\223=\377\212V#\377\15\12\10\343\13\11\6\252\15\13\10\306=)\26\377\312" + "o\37\377\314i\31\377\310i\25\377\26\21\11\335\0\0\0\0\0\0\0\0\0\0\0\0\13" + "\11\6l\16\13\7\252\13\11\6\213\6\5\3\21\0\0\0\0\0\0\0\0\0\0\0\0\11\7\6\205" + "\220K\23\377\271V\24\377\262V\23\377\33\22\10\252\0\0\0\0\0\0\0\0\13\11\6" + "U\206F\23\377\265X\24\377\264W\23\377\30\17\7\262\0\0\0\0\0\0\0\0\0\0\0\0" + "\12\10\5c\245V\26\377\316o\33\377\325|&\377$\33\21\377\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\12\11\205\247p0\377\336\246M\377\337\235" + "H\3776'\27\377\5\5\4%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\252" + "\265]\26\377\316o\33\377\326\177+\377\24\20\13\377\0\0\0\0\0\0\0\0\0\0\0" + "\0\11\10\10\252\313\2012\377\336\221?\377\334\223=\377!\32\20\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\14\12\7q\17\14\10\252\15\12\10z\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\12\10\7\252\310x)\377\334\216;\377\333\222<\377\33\25\16\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\15\13\10q\22\17\13\252\21\16\12\216\10\7\5\34\0\0\0" + "\0\0\0\0\0\0\0\0\0\16\14\11q\24\17\13\252\21\16\12\231\12\10\7\34\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6U\35\25\12\377w>\24\377\231O\24\377(\31\13" + "\377\11\10\6U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7\34\40\30\15" + "\332D/\31\377=+\30\377=.\34\377=/\34\377=/\34\377B2\35\377I7\40\377B0\35" + "\377\30\24\17U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\6\6O\40\32\21\364" + "\307\2046\377\320\226K\377zW)\377\21\17\12\252\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\34\40\27\13\3435!\16\377\"" + "\27\13\377\14\12\7\276\6\5\5\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11" + "\7\4\252\222L\23\377\305c\24\377\314n\33\377;)\26\377\6\6\6\252\12\11\11" + "q\37\32\22\270\36\31\21\377\35\31\22\377\"\33\23\377%\34\22\335\15\13\10" + """9\0\0\0\0\0\0\0\0\15\12\6X\220K\23\377\271V\24\377\262Z\23\377\24\16\7" + "\324\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4}\235Q\24\377\324u!\377\334\224?\377\33" + "\25\16\332\0\0\0\0\0\0\0\0\14\12\11\177\300o\37\377\320p\33\377\312g\27\377" + "\26\20\11\314\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5]\211D\22\377\271^\24\377\264" + "[\23\377\36\24\11\252\0\0\0\0\0\0\0\0\13\11\6U\214C\23\377\312j\25\377\326" + "}'\377\31\24\16\377\0\0\0\0\0\0\0\0\0\0\0\0\6\6\5\34\15\13\10\213\24\20\13" + "\252\23\17\12\216\10\7\5\34\0\0\0\0\0\0\0\0\12\11\5\216\231O\24\377\303Z" + "\24\377\316o\33\377\30\24\15\377\0\0\0\0\0\0\0\0\0\0\0\0\14\12\11\252\303" + "q\40\377\323s\36\377\313l\30\377\37\25\12\255\0\0\0\0\0\0\0\0\13\11\6U\214" + "F\23\377\271V\24\377\264W\23\377\30\17\7\265\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6\252\256[\27\377\327{*\377\335" + "\226B\377\31\24\16\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\11\7\4\252\224M\23\377\265\\\24\377\264W\23\377\31\21\10\252" + "\0\0\0\0\0\0\0\0\"\30\15\252\241f&\377\333\232F\377\334\216;\377\325|&\377" + "\40\30\15\306\0\0\0\0\0\0\0\0\13\11\6U\214F\23\377\271V\24\377\262Z\23\377" + "\24\16\7\324\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5\177\220N\23\377\271V\24\377\264" + "W\23\377\35\23\12\252\0\0\0\0\0\0\0\0\15\13\10t\302t!\377\321n\36\377\312" + "_\27\377\26\21\11\335\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5U\14\11\5\252\12\10" + "\5\202\6\5\3\10\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5n\220N\23\377\271V\24\377" + "\262V\23\377\33\22\10\252\0\0\0\0\0\0\0\0\13\10\6U\211D\22\377\271V\24\377" + "\310i\25\377\35\25\14\377\4\4\4\31\12\11\7\213\232d/\377\327\224F\377\306" + "\203-\377.\"\23\377\13\11\6X\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5w\220N\23\377" + "\271V\24\377\264W\23\377\25\17\10\322\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\252\307w'\377\334\220?\377\335\233" + "F\377\33\25\16\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\252\253" + "Y\26\377\303b\24\377\267Y\23\377\35\24\10\252\0\0\0\0\0\0\0\0\13\11\6U\213" + "F\24\377\312g\27\377\323v$\377\34\25\15\311\0\0\0\0\10\10\7""9vT'\377\327" + "\237V\377\333\225B\377\330\201-\377\323y\"\377\"\31\15\262\0\0\0\0\0\0\0" + "\0\13\12\6X\222L\23\377\271^\24\377\262Z\23\377\30\22\11\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\22\17\13\252\313z*\377\327~(\377\321j\36\377\40\26\15\270\0" + "\0\0\0\0\0\0\0\14\12\7U\217H\24\377\271^\24\377\262Z\23\377\24\16\7\322\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\11\7\4\252\224M\23\377\264W\23\377\262V\23\377\36\25\11\377\5\5\4" + "%\10\7\5\34\24\21\15\343\205Y&\377\327\2168\377\330\201-\377\321s\40\377" + "\32\23\13\322\0\0\0\0\0\0\0\0\13\11\6U\216J\23\377\271V\24\377\262Z\23\377" + "\24\16\7\322\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4z\217K\24\377\313l\30\377\330" + "\201-\377\36\27\17\377\0\0\0\0\0\0\0\0\0\0\0\0\14\12\7n\20\15\11\252\15\12" + "\10z\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6i\216J\23\377\271V\24\377\264" + "W\23\377\27\20\10\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17" + "\15\12\252\313z*\377\327~(\377\321v\36\377\30\21\13\377\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\10\4\252\224M\23\377\265\\\24\377\264W" + "\23\377\27\20\10\306\0\0\0\0\0\0\0\0\0\0\0\0\11\7\6\213\237R\24\377\313d" + "\30\377\324y!\377\34\25\15\377\0\0\0\0\0\0\0\0\0\0\0\0\14\13\11wQ;\"\377" + "\330\231G\377\255u2\377\25\22\16\377\12\12\11\364\13\12\10\377<#\17\377\255" + "U\24\377T1\21\377\15\12\6\252\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5\202\222O\23" + "\377\301Y\24\377\313h\30\377xM\37\377\23\21\14\377uP$\377\333\232F\377\262" + "y5\377\24\21\15\377-!\22\377\270^\25\377\303Z\24\377\315j\32\377\36\26\15" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\7\7\6R#\34\22\377\304r!\377\224P\31\377\40\26" + "\13\377\24\17\11\377\32\22\11\377X1\21\377\225N\24\377(\32\13\377\11\7\4" + "U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4\177\214" + "F\23\377\265X\24\377\264W\23\377\22\15\7\353\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\12\11\7]hE#\377\311\2030\377\302m!\377A*\24\377\14\12" + "\7\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\11\7\4\252\222O\23\377\265X\24\377\264W\23\377\27\20\10\306\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\16\12\306\274" + "\205=\377\333\225B\377\302s%\377\21\17\12\364\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\12\10\5q\220N\23\377\271V\24\377\264W\23\377\22\15\7" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\6" + "\4A5\37\14\377\242S\23\377\271^\24\377\202F\25\377\37\26\12\377\31\23\12" + "\306\26\21\11\366F(\17\377\251W\24\377\310i\25\377\324{%\377\34\25\15\335" + "\0\0\0\0\0\0\0\0\14\12\11\205\310\177)\377\322x!\377\312_\27\377\23\16\10" + "\356\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5n\220N\23\377\271V\24\377\262V\23\377" + "\34\23\11\252\0\0\0\0\0\0\0\0\14\12\11\205\302p\37\377\321n\36\377\312f\25" + "\377\25\17\10\353\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4""9\14\12\5X\12\10" + "\5U\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5}\222O\23\377\265X\24\377\264W\23\377" + "\31\21\10\303\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5w\220N\23\377\271^\24\377\310" + "i\25\377\27\22\12\335\0\0\0\0\0\0\0\0\13\11\10\231\310{)\377\324u!\377\312" + "g\27\377o?\24\377\33\24\12\377\24\20\11\366\26\21\11\371\34\24\11\306\36" + "\25\11\252\30\21\11\327\34\24\11\311\12\10\5U\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\11\7\4\252\222O\23\377\265X\24\377\264W\23\377\22\15\7\377\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\13\12\10q\230h/\377\326\2061\377\314i\31\377b6\23" + "\377\22\15\11\343\15\12\10\252\16\14\11\306<)\25\377\307p\34\377\312f\25" + "\377\312g\27\377\32\23\13\314\0\0\0\0\0\0\0\0\14\13\11t\273e\30\377\312]" + "\25\377\273[\24\377\22\15\7\377\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4\252\222O\23" + "\377\265X\24\377\262Z\23\377\33\21\10\252\0\0\0\0\0\0\0\0\13\11\6U\213F\24" + "\377\312g\27\377\324{%\377\40\30\17\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\15\14\12\252\304r!\377\316j\31\377\304c\25\377\34\23\11\252" + "\0\0\0\0\0\0\0\0\13\10\6U\211D\22\377\265X\24\377\262V\23\377\244U\25\377" + "\212I\25\377\257]\24\377\262V\23\377.\34\13\377\6\5\3l\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\11\7\4\252\222L\23\377\275X\24\377\275X\24\377\34" + "\23\11\252\0\0\0\0\0\0\0\0\13\11\6U\211D\22\377\271V\24\377\262Z\23\377\33" + "\21\10\252\0\0\0\0\11\7\4\247\222O\23\377\24\16\7\374\0\0\0\0\13\11\6U\211" + "D\22\377\271^\24\377\262Z\23\377\33\21\10\252\0\0\0\0\0\0\0\0\13\11\6U\211" + "D\22\377\271V\24\377\264W\23\377\22\15\7\377\0\0\0\0\0\0\0\0\0\0\0\0\11\7" + "\4\252\222O\23\377\271^\24\377\267U\23\377\33\23\10\252\0\0\0\0\0\0\0\0\13" + "\11\6U\214I\23\377\265X\24\377\262Z\23\377\24\17\7\377\0\0\0\0\0\0\0\0\0" + "\0\0\0\20\16\13\252\320\217;\377\337\234F\377\330\2071\377\34\26\15\322\0" + "\0\0\0\0\0\0\0\13\11\6U\214F\23\377\271^\24\377\262Z\23\377H'\15\377\12\10" + "\5\332\10\6\3\252\11\7\4\301'\30\12\377\240R\23\377\271^\24\377\220J\27\377" + "\20\15\11\252\0\0\0\0\0\0\0\0\12\11\7U\221e0\377\332\225C\377\322s\37\377" + "c9\23\377\12\10\5\343\10\6\3\252\11\7\4\276\36\24\11\377\236Q\23\377\271" + "^\24\377\262Z\23\377\33\21\10\252\0\0\0\0\0\0\0\0\13\10\6U\211D\22\377\271" + "V\24\377\264W\23\377\22\15\7\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\11\10\34\15\14\10\216" + "\33\24\12\252\35\25\12\301\30\21\11\374\26\21\11\350\26\21\11\377W1\22\377" + "\265X\24\377\262Z\23\377d6\21\377\13\12\6\226\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\11\7\4\252\222O\23\377\265X\24\377\264W\23\377\22\15\7\377\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\17\15\12\252\320\2157\377\337\234F\377\331\2052\377" + "\27\23\14\377\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5z\220N\23\377\271V\24\377\264" + "W\23\377\36\24\11\260\0\0\0\0\0\0\0\0\0\0\0\0\14\12\7U'\32\14\377\233P\24" + "\377c7\23\377\23\20\14\377\14\13\11\377\22\17\13\377wT&\377\321\211<\377" + "\212V#\377\22\17\13\262\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5\202\220N\23\377\265" + "\\\24\377\262Z\23\377'\30\12\377\6\5\3\322\35\24\10\377\251W\24\377a5\22" + "\377\10\7\5\377\32\25\17\377\324\216;\377\335\227D\377\332\2165\377\"\31" + "\17\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\5\4R\20\14\7\377\240R\23" + "\377\271V\24\377\271V\24\3774\35\13\377\7\6\4\252\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\10\7\5US.\20\377\265\\\24\377\262V\23\377W/\16\377\12\10" + "\5\340\10\6\3\252\11\7\4\276\35\24\10\377\303h\30\377\331\2102\377\335\233" + "F\377\36\27\17\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5U\32\22\11\377k" + ";\24\377\227P\26\377<\"\17\377\13\11\6\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5\252\237R\24\377\312v#\377" + "B3\35\377\11\11\10`\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12\252\320\214" + ";\377\337\234F\377\327\205,\377\33\24\14\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\16\14\7\364\203C\24\377\260Y\23\377\21\14\6\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\21\16" + "\12U\253_\34\377\316{!\377\320{\37\377\317p\34\377\312k\27\377\277b\26\377" + "\252[\25\377\303k\26\377\321{\36\377\324\204%\377\326\206'\377\323\205(\377" + "\312y#\377\35\25\14\244\0\0\0\0\0\0\0\0\14\12\7R\250b\35\377\312y#\377\304" + "x\37\377\302s\37\377\276s\33\377\271e\32\377\270d\31\377\307k\32\377\320" + "{\37\377\250i%\377\31\25\16\343\11\10\10\34\0\0\0\0\0\0\0\0\10\10\7\34'\36" + "\22\371\267z*\377\323\205(\377\322\205+\377\241j)\377\17\15\12\335\5\4\4" + "\21\0\0\0\0\0\0\0\0\16\13\7q\224S\31\377\301l\30\377\264]\27\377\33\22\12" + "\231\0\0\0\0\0\0\0\0\14\11\7z\220N\23\377\264[\23\377S.\20\377\7\6\4\270" + "\0\0\0\0\0\0\0\0\4\4\3U\34\25\15\377\312y#\377\321\204*\377\203W$\377\12" + "\11\7\377\5\5\5\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7DV>\37\377\316\203+\377\326\202'\377L2" + "\31\377\7\6\6q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\5\4\34\25\21\14\377\312" + "y#\377\322\207%\377\235d&\377\22\17\13\226\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\22\17\11[\241X\30\377i@\34\377\13\12\10\252\0\0\0\0\0\0\0\0\0\0\0\0\10" + "\7\7U(\34\21\377\256[\27\377*\33\15\255\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5t\205B\20\377\241U\21\377\241N\21\377" + "\31\20\10\335\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\14\10w\252" + "c\35\377\313~$\377\307\177\"\377\33\24\14\322\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\15\13\10z\252c\35\377\314\177%\377\307w\"\377\33\24" + "\14\306\0\0\0\0\0\0\0\0\0\0\0\0\4\4\3\13\22\15\11\377\232O\23\377\256X\23" + "\377\\3\21\377\14\12\7\306\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\13\11\6\223\216J\23\377\253Z\22\377\237Q\22\377\21\14\6\377\0\0\0\0\0" + "\0\0\0\0\0\0\0\10\7\5\216\205B\20\377\241U\21\377\241U\21\377\25\16\6\327" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\306\276k\31\377" + "\313h\30\377\304c\25\377\25\17\10\377\2\2\1\16\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\11\10\6%#\34\22\377\267p$\377\324\204%\377\262v)\377\33\27" + "\20\377\5\5\4\306\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\17\14\10i\216O\27\377\275a\26\377\240S\25\377\22\15\7\332\0\0\0" + "\0\0\0\0\0\0\0\0\0\12\10\7\306\304r!\377\326\201%\377\324\204%\377\33\25" + "\14\322\0\0\0\0\0\0\0\0\15\13\10t\300r\37\377\322}!\377\321{\36\377\313q" + "\32\377\261[\26\377\237R\24\377\240S\25\377\245U\24\377\250Y\23\377\243V" + "\22\377\241N\21\377\27\17\6\252\0\0\0\0\0\0\0\0\11\7\4""9c0\16\377\216I\21" + "\377\205B\20\377\23\15\6\276\0\0\0\0\0\0\0\0\0\0\0\0\7\6\4\244\207B\20\377" + "\241U\21\377\241U\21\377\31\20\6\252\0\0\0\0\0\0\0\0\12\10\5U\203A\20\377" + "\241U\21\377\241U\21\377\23\15\6\343\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5\260" + "\276k\31\377\324\177#\377\326\206'\377\36\25\15\377\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\14\12\7\252\302m!\377\325\204$\377\320z\35\377" + "\34\24\13\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4\223" + "\210F\21\377\312b\25\377\323~\"\377\33\24\14\377\3\3\2\34\0\0\0\0\0\0\0\0" + "\12\10\7\303\264]\27\377\312f\25\377\312f\25\377\31\21\12\335\0\0\0\0\0\0" + "\0\0\15\13\10A\201F\26\377\254X\25\377\220N\23\377\26\17\7\260\0\0\0\0\0" + "\0\0\0\0\0\0\0\12\10\7\306\306|%\377\327\210*\377\326\206'\377\33\25\14\324" + "\0\0\0\0\0\0\0\0\14\12\7O\227X\32\377\306t\35\377\300m\33\377\31\22\12\247" + "\0\0\0\0\0\0\0\0\14\11\7Rw>\24\377\256Y\25\377\232O\23\377\26\17\7\265\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\5\4D\24\16\7\371\216I\21\377\217" + "J\22\377-\32\12\377\12\10\5U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\6\6U'\36\22\377\304y)\377\325\207" + "*\377sH\36\377\12\11\7\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\5\4\21\6\5\5U\5\5\4-\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4\216\222O\23\377\314l\27\377" + "\324~!\377\36\26\15\377\3\3\3(\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5}\205B\20\377\241U\21\377\241U\21\377" + "\23\15\6\324\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5\177\210F\21\377\301a\24\377" + "\313l\30\377\36\25\13\301\0\0\0\0\0\0\0\0\15\12\6U\206F\23\377\253Z\22\377" + "\237Q\22\377\21\14\6\356\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5\220\207B\20\377\241" + "U\21\377\241U\21\377\27\17\6\252\0\0\0\0\0\0\0\0\12\7\5U\205B\20\377\271" + "^\24\377\321{\36\377\27\22\14\377\3\3\2\34\0\0\0\0\5\5\4\34\22\17\13\343" + "\206H\25\377\236Q\23\377\217J\22\377\26\17\7\216\0\0\0\0\0\0\0\0\12\10\5" + "U\203A\20\377\243O\22\377\262Z\23\377\26\20\11\377\3\2\2\24\0\0\0\0\0\0\0" + "\0\11\7\6\260\220N\23\377\257X\22\377\243O\22\377\32\20\7\252\0\0\0\0\0\0" + "\0\0\12\10\5U\201@\20\377\241U\21\377\241N\21\377\23\15\6\345\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5\234\220N\23\377" + "\312f\25\377\316o\33\377\33\24\14\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5\205\207B\20\377\241U\21\377\241U\21" + "\377\23\15\6\343\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5\377\254U\25\377\275\\\24" + "\377\254W\23\377\30\20\7\252\0\0\0\0\0\0\0\0\12\10\5U\201@\20\377\241U\21" + "\377\241U\21\377\23\15\6\324\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5\177\207B\20" + "\377\241U\21\377\241U\21\377\32\20\7\252\0\0\0\0\0\0\0\0\13\11\6U\206F\23" + "\377\253Z\22\377\237N\22\377\27\17\6\252\0\0\0\0\0\0\0\0\11\7\4""9b1\15\377" + "\213G\20\377\205B\20\377\23\15\6\301\0\0\0\0\0\0\0\0\0\0\0\0\7\6\4\260\205" + "B\20\377\241U\21\377\241U\21\377\27\17\6\252\0\0\0\0\0\0\0\0\12\10\5U\201" + "@\20\377\245W\22\377\264[\23\377\24\17\11\377\0\0\0\0\5\5\4\21\32\25\17\343" + "~K\31\377\262_\25\377\216J\23\377.\34\13\377\12\10\5""9\0\0\0\0\0\0\0\0\12" + "\10\5U\203A\20\377\241U\21\377\241U\21\377\21\14\6\374\2\1\1\10\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\252\307w\"\377\327" + "\210*\377\326\213)\377\34\24\15\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\10\7\5\252\207B\20\377\241U\21\377\241U\21\377\27\17\6\252\0\0\0\0\0\0" + "\0\0\12\10\5U\203C\20\377\312f\25\377\323\177$\377\26\21\13\371\0\0\0\0\0" + "\0\0\0\20\16\13\311eC\34\377\277b\26\377\271^\24\377\254W\23\377\32\21\7" + "\252\0\0\0\0\0\0\0\0\12\10\5U\201@\20\377\241U\21\377\241U\21\377\37\24\10" + "\377\5\5\4f\0\0\0\0\5\4\4\34\20\15\11\377\244U\25\377\264[\23\377\245W\22" + "\377\32\21\7\252\0\0\0\0\0\0\0\0\12\10\5U\201@\20\377\241U\21\377\241U\21" + "\377\23\15\6\324\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5\205\207B\20\377\241U\21\377\241U\21\377" + "\32\21\7\377\3\3\2\210\11\7\4\343\203C\24\377\305h\26\377\306h\25\377\267" + "]\23\377\254W\23\377\32\21\7\252\0\0\0\0\0\0\0\0\12\10\5U\201@\20\377\241" + "U\21\377\241U\21\377\23\15\6\324\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5\177\207" + "B\20\377\301a\24\377\321{\36\377\23\17\12\374\0\0\0\0\0\0\0\0\15\13\10A}" + "D\26\377\256V\25\377\222L\23\377\26\16\7\262\0\0\0\0\0\0\0\0\0\0\0\0\10\6" + "\5\220\207B\20\377\241U\21\377\241U\21\377\23\16\6\356\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\252\243W\24\377\264[\23\377\245W" + "\22\377\21\14\6\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7" + "\4\213\207B\20\377\241U\21\377\241U\21\377\17\13\6\366\0\0\0\0\0\0\0\0\0" + "\0\0\0\11\7\6\270\264]\27\377\323s\36\377\325\205&\377\34\24\15\377\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\14\13\11\252\230[\37\377\274i\37\377sB\26\377" + "[2\20\377T.\17\377t;\21\377v>\21\377\17\13\6\335\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\12\10\5t\222O\23\377\312g\27\377\321\200\40\377\310\177)\377\247" + "j(\377\305z*\377\322\202#\377\272j\33\377X3\23\377f7\21\377\235S\22\377\275" + "\\\24\377\321{\36\377\35\25\14\340\0\0\0\0\0\0\0\0\7\6\6\34)\37\22\353\240" + "T\27\377\252W\23\377-\32\12\377\5\5\4\252\4\4\4\10\4\4\3c\17\14\6\377\214" + "H\21\377\212G\21\377-\32\12\377\12\10\5U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\10\7\5\216\205B\20\377\241U\21\377\241U\21\377\23\15\6\345" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\252\240V\25\377" + "\271Z\24\377[2\20\377\7\6\4\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5\226\205B\20\377\241U\21\377" + "\241U\21\377\17\13\6\366\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\10\10\7nJ4\33\377\277g\30\377\260Y\23\377\"\26\11\377\6" + "\5\3""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5\241\205B\20\377\241" + "U\21\377\241N\21\377\17\13\6\374\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\14\12\5U{=\20\377\241U\21\377\241U\21\377\26\17" + "\7\377\2\2\1U\0\0\0\0\0\0\0\0\7\6\4\364\205B\20\377\247X\22\377\275\\\24" + "\377\33\23\12\303\0\0\0\0\0\0\0\0\14\12\7n\240S\25\377\261U\22\377\241N\21" + "\377\17\13\6\374\0\0\0\0\0\0\0\0\0\0\0\0\7\6\4\241\205B\20\377\241U\21\377" + "\241U\21\377\27\17\6\252\0\0\0\0\0\0\0\0\13\11\6U\206F\23\377\253Z\22\377" + "\237N\22\377\17\13\6\371\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5Ub1\15\377\207H\20" + "\377\205B\20\377\23\15\6\213\0\0\0\0\0\0\0\0\12\10\5U\203A\20\377\241U\21" + "\377\241U\21\377\17\13\6\366\0\0\0\0\0\0\0\0\0\0\0\0\7\6\4\244\205B\20\377" + "\245W\22\377\262Z\23\377\30\21\11\324\0\0\0\0\0\0\0\0\15\13\10i\245V\26\377" + "\264[\23\377\237Q\22\377\23\16\6\377\2\2\1O\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5\247\205" + "B\20\377\241U\21\377\241U\21\377\17\13\6\374\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\7\6\6\34\30\23\15\343g;\24\377\235S\22\377\232N\21\377\226Q\23\377\232" + "O\23\377\236Q\23\377\242S\23\377\241U\21\377\237Q\22\377\243V\22\377\33\22" + "\10\252\0\0\0\0\0\0\0\0\13\11\6U\203C\20\377\245W\22\377\241U\21\377\17\13" + "\6\374\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5\247\205B\20\377\241U\21\377\241U\21" + "\377\27\17\6\252\0\0\0\0\0\0\0\0\12\10\5U\203A\20\377\257X\22\377\277`\24" + "\377\31\22\12\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\11\6" + "\252\224M\23\377\251R\22\377\241U\21\377\27\17\6\252\0\0\0\0\0\0\0\0\12\10" + "\5U\201@\20\377\241U\21\377\241U\21\377W/\16\377\27\21\10\377A\"\14\377\226" + "L\21\377\204D\21\377)\31\12\377\12\10\5U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\10\7\5\226\205B\20\377\241U\21\377\241N\21\377\27\17\6\252\0\0\0\0\0\0\0" + "\0\12\10\5U\201@\20\377\241U\21\377\241U\21\377\27\17\6\252\0\0\0\0\10\7" + "\5\231\205B\20\377\23\15\6\356\0\0\0\0\12\10\5U\201@\20\377\241U\21\377\241" + "U\21\377\27\17\6\252\0\0\0\0\0\0\0\0\12\10\5U\201@\20\377\241U\21\377\241" + "U\21\377\17\13\6\374\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5\247\205B\20\377\241U" + "\21\377\241U\21\377\27\17\6\252\0\0\0\0\0\0\0\0\12\10\5U\201@\20\377\241" + "U\21\377\241U\21\377\37\24\10\377\5\4\4U\0\0\0\0\5\4\4(\21\16\12\377\310" + "x#\377\317p\34\377\303b\24\377\35\24\10\252\0\0\0\0\0\0\0\0\12\10\5U\203" + "A\20\377\243V\22\377\237Q\22\377\226L\21\377\211F\20\377\207H\20\377\207" + "B\20\377\222K\21\377\237Q\22\377\203C\24\377*\37\21\377\12\11\7>\0\0\0\0" + "\0\0\0\0\5\5\4\10\32\25\17\343\211O\34\377\256X\23\377\236S\21\377\211F\20" + "\377\207H\20\377\207B\20\377\222K\21\377\237Q\22\377\241U\21\377\241U\21" + "\377\27\17\6\252\0\0\0\0\0\0\0\0\12\10\5U\203C\20\377\243V\22\377\237Q\22" + "\377\21\14\6\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\2\1\1\10\7\6\4\371\211C\20\377\245P\22\377\232N\21\377\33\22\10" + "\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5\247\205B\20\377\241U\21\377\241" + "U\21\377\17\13\6\374\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\252\307|$\377" + "\323}\40\377\310i\25\377\22\15\7\377\0\0\0\0\0\0\0\0\0\0\0\0\7\6\4\244\205" + "B\20\377\241U\21\377\241N\21\377\23\15\6\343\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\10\7\5zD&\15\377\226S\27\377\256k#\377\265p&\377\276u'\377\301r$\377" + "\217T\32\377\17\14\10\324\4\4\3\6\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5l\207B\20" + "\377\241U\21\377\241U\21\377}A\20\377Z/\15\377y<\20\377\244T\23\377\275a" + "\26\377\261h\40\377\302{'\377\324\206)\377\322|\37\377\310i\25\377\27\21" + "\10\332\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5\2478\37\13\377n7\17\377v" + ">\21\377s:\20\377s:\20\377x?\21\377_.\16\377\21\15\6\343\7\6\4\34\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\16\14\7\343W+\16\377\232N\21\377\230M\21\377\213" + "G\20\377\207H\20\377\207B\20\377\222K\21\377\310i\25\377\323\177$\377\326" + "\206'\377\27\22\14\377\0\0\0\0\0\0\0\0\0\0\0\0\7\6\4U\32\20\7\377\203C\20" + "\377\221K\22\377N+\17\377\7\6\4\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5\210\235Q\24\377\322\201" + "!\377\213Y$\377\12\11\7\306\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\252" + "\304q\37\377\316r\31\377\275\\\24\377\22\15\7\364\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\5\4\4X\33\23\10\377\215I\22\377\241U\21\377\25\16\6\332\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\14\11\7c\13\10\6\252\12\10\5[\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\13\12\10\34\40\27\15\343l9\23\377\231R\22\377\232N\21\377\222K\21" + "\377a/\16\377$\30\13\377l@\31\377\313o\36\377\317v\40\377\317v\40\377\275" + "n\40\377?)\24\377\17\14\10L\0\0\0\0\0\0\0\0\11\10\6\34&\33\17\3323!\22\377" + "0\40\21\377\203J\30\377\266a\25\377\260Y\23\377\252W\23\377\206H\25\377%" + "\31\16\377\17\15\10\220\7\7\6\34\0\0\0\0\0\0\0\0\0\0\0\0\13\11\10\177\253" + "c\34\377\320{\37\377\313|\36\377h?\33\377\17\15\12\324\7\6\6\34\0\0\0\0\0" + "\0\0\0\0\0\0\0\16\13\7\252\216J\23\377\241U\21\377\237Q\22\377\33\22\10\270" + "\0\0\0\0\0\0\0\0\6\5\3\34\33\21\10\343\\.\15\377o7\16\377\37\24\10\377\10" + "\6\3\306\11\7\4\252\12\10\5\343\26\20\11\377='\22\377k@\32\377lB\31\377\40" + "\26\13\377\11\7\6\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\2348$\23\377\277r\40\377\257" + "b\36\377)\33\20\377\13\11\6""9\0\0\0\0\0\0\0\0\0\0\0\0\25\17\12\343d8\25" + "\377\240S\25\377P,\21\377\16\14\7\276\7\6\6\34\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\15\12\6\34\35\24\12\324\25\17\12\220\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\14\11\7U'\30\12\255\20\14\7U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\5\3\24\23\15\6\255\25\16\6\377\25\17\6\327" + "\12\10\5U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\14\10\252\276" + "b\27\377\313l\30\377\312o\27\377\27\21\12\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\21\15\12\252\303p\36\377\323|\36\377\315j\32\377\37" + "\25\14\377\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5\213,\31\11\377\207H\20\377h6\15" + "\377\17\13\6\371\7\6\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\7\6\4""9,\31\11\377\211I\20\377\217F\20\3771\31\10\377\10\6\3\270\10\6\3" + "U\10\6\3\216\27\20\6\377\202B\17\377\221M\20\377W,\14\377\12\10\5\216\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\11\10\2445\37\16\377\226J\23\377" + "\232N\21\377\224L\21\377A!\12\377\12\10\5\270\6\5\5\34\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\13\11\6\216\257f\36\377\317{\40\377\320r\37\377\304r!\377" + "Y8\32\377\21\15\12\377\13\10\6\252\11\7\6\252\13\10\6\252\17\13\10\252\22" + "\15\11\216\10\6\5\34\0\0\0\0\0\0\0\0\12\10\5]f5\21\377\237Q\22\377\232N\21" + "\377H%\13\377\13\10\6\343\11\7\6\252\13\10\6\306=$\24\377\304k\33\377\314" + "r\33\377\266f\37\377\23\16\12\252\0\0\0\0\0\0\0\0\6\6\5\24\32\23\13\306\34" + "\24\13\377\26\20\11\377\27\20\10\377\33\22\10\377\30\20\7\377\30\20\7\377" + "J'\13\377\213D\20\377\217F\20\377\217F\20\377\24\15\5\252\0\0\0\0\0\0\0\0" + "\7\6\4JW,\14\377\233O\22\377\227I\20\377C\"\12\377\11\7\4\306\11\7\4`\10" + "\6\5\237\33\21\10\377\211C\20\377\236P\21\377p8\17\377\12\10\5\247\0\0\0" + "\0\0\0\0\0\7\5\4UJ$\13\377\226S\21\377\221M\20\3777\35\12\377\10\6\3\306" + "\10\6\3X\7\6\4\231'\30\14\377\307p\34\377\322s\37\377\270l!\377\21\16\12" + "\306\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\11\6\252\213E\22" + "\377\250V\23\377\232N\21\377\21\14\6\353\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\7\6\4U@\40\13\377\242P\23\377\306`\25\377m?\32\377\17\13" + "\10\343\12\10\7\252\10\7\5\303\35\22\10\377\211C\20\377\232N\21\377r;\17" + "\377\13\12\6\244\0\0\0\0\0\0\0\0\11\7\6Ua2\20\377\237Q\22\377\230M\21\377" + "J$\13\377\12\10\5\306\7\6\4}\12\10\5\306=$\24\377\310i\35\377\321z\34\377" + "\264h\35\377\20\14\11\252\0\0\0\0\0\0\0\0\14\12\7\252\240S\25\377\267Y\23" + "\377\256X\23\377\34\23\11\273\0\0\0\0\0\0\0\0\16\12\7U\217K\24\377\303b\24" + "\377\275\\\24\377\25\17\10\340\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\7\6\4U\32\20\7\377o7\16\377\204C\17\377'\27\10\377\10\6\3q\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\6U\40\26\15" + "\377\274p\37\377\301r\36\377^9\31\377\21\15\12\252\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4" + "\216\12\10\5\377\12\10\5\306\6\5\3\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\10\7\5UX0\23\377\314r\33\377\320v\37\377o>\32\377\13\10\6\343" + "\10\7\5\226\12\10\5t\12\10\5X\11\7\4U\6\5\3J\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\12\10\5cr8\15\377\217F\20\377\217F\20\377\22\14\5\327\0\0\0\0\0\0\0" + "\0\0\0\0\0\10\7\3\202v<\15\377\224L\21\377\226L\21\377\30\20\7\252\0\0\0" + "\0\0\0\0\0\11\7\4Ur8\15\377\221J\20\377\217F\20\3774\34\11\377\10\6\3\306" + "\10\6\3X\10\6\3\220\27\17\6\377\202B\17\377\227P\20\377o7\16\377\12\10\5" + "\220\0\0\0\0\0\0\0\0\6\5\3;;\40\12\377\235S\22\377\271Z\24\377a6\26\377\16" + "\12\7\343\15\12\6\252\15\12\6\377T)\15\377\224L\21\377\233R\22\377\207B\20" + "\377\16\12\5\237\0\0\0\0\0\0\0\0\11\7\4Ur8\15\377\221M\20\377\221J\20\377" + "7\34\12\377\11\7\4\306\10\6\3]\10\6\3\223\31\20\6\377\202@\17\377\227P\20" + "\377o7\16\377\12\10\5\216\0\0\0\0\0\0\0\0\11\7\4Ur8\15\377\221M\20\377\217" + "F\20\3774\34\11\377\10\6\3\306\10\6\3f\10\6\3\213\10\6\3\252\11\10\4q\0\0" + "\0\0\0\0\0\0\0\0\0\0\12\10\5[r8\15\377\226L\21\377\226L\21\377\21\14\6\374" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\6\4U@" + "!\13\377\221M\20\377\217F\20\3778\35\11\377\10\6\3\306\10\6\3U\6\5\3w\16" + "\13\5\377\200B\17\377\227I\20\377\217L\20\377\24\15\5\252\0\0\0\0\0\0\0\0" + "\11\7\4Ur8\15\377\217F\20\377\217F\20\377\22\14\5\327\0\0\0\0\0\0\0\0\0\0" + "\0\0\10\7\3\202r8\15\377\217F\20\377\217F\20\377\24\15\5\252\0\0\0\0\0\0" + "\0\0\11\7\4Ur8\15\377\217F\20\377\217F\20\377\24\15\5\252\0\0\0\0\0\0\0\0" + "\7\6\4GW,\14\377\236W\21\377\241U\21\377g5\24\377\17\13\10\343\12\10\7\252" + "\12\10\7\303!\24\12\377\211C\20\377\227I\20\377o7\16\377\12\10\5\216\0\0" + "\0\0\0\0\0\0\11\7\4Ur8\15\377\217F\20\377\222K\21\377\22\15\7\377\0\0\0\0" + "\0\0\0\0\7\6\6J\30\20\7\377\204C\17\377\221M\20\377\207H\20\377\16\12\5\252" + "\0\0\0\0\0\0\0\0\11\7\4Ur8\15\377\221M\20\377\217F\20\377:\37\13\377\13\10" + "\6\343\13\11\6\252\13\10\6\252\12\7\5\252\11\10\4q\0\0\0\0\0\0\0\0\0\0\0" + "\0\13\11\6\241\257\\\30\377\313l\30\377\306e\27\377\31\22\12\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3\223r8\15\377\217F\20\377\217F\20" + "\377\24\15\5\252\0\0\0\0\0\0\0\0\11\7\4Ur8\15\377\252W\23\377\307j\30\377" + "\30\21\13\377\0\0\0\0\0\0\0\0\6\6\5\34\17\14\6\377\200B\17\377\221J\20\377" + "\217F\20\377\24\15\5\252\0\0\0\0\0\0\0\0\6\5\3""99\37\12\377\221M\20\377" + "\217F\20\377Z,\15\377\23\15\6\377\12\10\5\377\15\12\6\377>!\13\377\207H\20" + "\377\227I\20\377l5\15\377\12\10\5\216\0\0\0\0\0\0\0\0\11\7\4Ur8\15\377\217" + "F\20\377\217F\20\377\22\14\5\327\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\6\4U@!\13\377\221M\20\377\217" + "F\20\377C\"\12\377\16\12\5\3771\33\11\377\214H\21\377\240U\23\377\240U\23" + "\377n7\17\377\37\24\10\377\11\7\4""9\0\0\0\0\0\0\0\0\11\10\4Ur8\15\377\217" + "F\20\377\217F\20\377\22\14\5\327\0\0\0\0\0\0\0\0\0\0\0\0\10\7\3\210v<\15" + "\377\232K\21\377\254W\23\377\30\21\11\314\0\0\0\0\0\0\0\0\10\7\5U_1\20\377" + "\241U\21\377\230M\21\377G\"\12\377\11\7\4\306\10\6\3X\10\6\3\216\27\17\6" + "\377\202B\17\377\227P\20\377o7\16\377\16\12\5\252\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4\244v8\17\377\221J\20\377\217F\20\377\20\14" + "\5\340\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4UU+\14\377\227" + "P\20\377\217F\20\3777\35\12\377\10\6\3\306\10\6\3]\10\6\5\255-\33\16\377" + "\307p\34\377\322|\37\377\307w\"\377\23\17\12\335\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\15\13\10\252.\34\13\377\203A\20\377\221J\20\377\211C\20" + "\377F#\13\377\14\12\5\340\7\6\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5" + "\"%\31\16\377\265d\34\377\316q\37\377\317{\40\377\307w\"\377kC\34\377\34" + "\24\13\377\34\23\11\377T)\15\377\215K\20\377\221J\20\377\237R\24\377X5\31" + "\377\15\13\10c\0\0\0\0\0\0\0\0\15\12\6Ur<\21\377\224L\21\377\217F\20\377" + "\25\16\6\377\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5\252w=\16\377\221M\20\377\207" + "H\20\377\23\15\6\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7" + "\3\216r8\15\377\217F\20\377\217F\20\377\20\14\5\332\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\13\10\6\252~>\17\377\227P\20\377p9\15\377\23\15" + "\6\377\10\6\3\220\10\6\3U\11\7\4q\10\6\3\247\10\6\3\252\10\6\3\252\11\10" + "\4q\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5[r8\15\377\221J\20\377\217F\20\377=\40" + "\12\377\11\10\4\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\14\12\7\317J$\13\377\213J\20\377O(\14\377\12\10\5\322\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4U\33\21\6\377\202B\17\377\217F\20\377\217" + "L\20\377\20\14\5\335\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\10\6\3UJ'\13\377\221M\20\377\217F\20\377)\27\10\377\7\6\4\255" + "\5\5\2U\6\5\3q\16\12\5\377\201A\16\377\221J\20\377\221J\20\377\30\20\7\252" + "\0\0\0\0\0\0\0\0\12\10\5Up9\15\377\221M\20\377\217F\20\3774\34\11\377\10" + "\6\3\306\10\6\3X\10\6\3\220\27\17\6\377\202B\17\377\227P\20\377o7\16\377" + "\12\10\5\220\0\0\0\0\0\0\0\0\6\5\3;?\"\12\377\221M\20\377\217F\20\3777\35" + "\12\377\10\6\3\306\10\6\3U\10\6\3\220\40\23\7\377\213J\20\377\233O\22\377" + "\207B\20\377\16\12\5\252\0\0\0\0\0\0\0\0\6\5\3""99\37\12\377\221M\20\377" + "\217F\20\3777\35\12\377\10\6\3\306\10\6\3X\10\6\3\220\25\17\6\377\202B\17" + "\377\217L\20\377\222K\21\377\30\17\7\270\0\0\0\0\0\0\0\0\7\6\4GB!\13\377" + "\224O\21\377\217F\20\377-\31\10\377\7\5\4\260\7\5\4U\10\6\3U\11\7\4U\10\6" + "\3R\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\3\210r8" + "\15\377\217F\20\377\217F\20\377\20\14\5\335\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\7\6\4\34\12\10\5\202\23\15\6\252\35\23\10\255\30\20\7\324\33\22" + "\10\301\24\15\7\3667\35\12\377\213J\20\377\217F\20\377\217F\20\377\22\15" + "\5\252\0\0\0\0\0\0\0\0\11\7\4Us6\16\377\217F\20\377\217F\20\377\20\14\5\335" + "\0\0\0\0\0\0\0\0\0\0\0\0\10\7\3\210r8\15\377\217F\20\377\217F\20\377\24\15" + "\5\252\0\0\0\0\0\0\0\0\11\7\4Ur8\15\377\221J\20\377\221J\20\377\21\13\6\374" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5\252w=\16\377\221" + "J\20\377\217F\20\377\22\15\5\252\0\0\0\0\0\0\0\0\11\7\4Ur8\15\377\217F\20" + "\377\217F\20\377!\24\10\377\5\4\4\303\10\6\5\306.\32\11\377~>\17\377\204" + "C\17\377#\26\10\377\11\7\4]\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5]r8\15\377\217" + "F\20\377\217F\20\377\24\15\5\252\0\0\0\0\0\0\0\0\11\7\4Ur8\15\377\217F\20" + "\377\217F\20\377\24\15\5\252\0\0\0\0\11\7\4}r8\15\377\25\15\6\322\0\0\0\0" + "\11\7\4Ur8\15\377\217F\20\377\217F\20\377\24\15\5\252\0\0\0\0\0\0\0\0\11" + "\7\4Ur8\15\377\217F\20\377\217F\20\377\20\14\5\335\0\0\0\0\0\0\0\0\0\0\0" + "\0\10\7\3\210r8\15\377\217F\20\377\217F\20\377\24\15\5\252\0\0\0\0\0\0\0" + "\0\6\5\3""99\37\12\377\221M\20\377\217F\20\377Z,\15\377\21\14\6\377\14\11" + "\5\377\24\17\11\377a3\24\377\251W\24\377\241U\21\377p6\17\377\12\10\5\216" + "\0\0\0\0\0\0\0\0\11\7\4Uy<\20\377\256X\23\377\260Y\23\377p;\21\377%\27\12" + "\377\32\20\7\377\31\22\10\377\30\17\7\377\27\20\10\377\22\15\11\306\12\11" + "\7c\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6\"\14\12\7\247\24\16\7\322\25" + "\17\6\377\32\21\7\377\30\20\7\377\32\21\7\377F#\13\377\216I\21\377\224L\21" + "\377\230M\21\377\30\17\7\252\0\0\0\0\0\0\0\0\15\12\6`\201A\22\377\252W\23" + "\377\252W\23\377\30\20\11\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\4\2L\10\6\3U\10\6" + "\3U\10\6\3U\7\5\4U\6\5\3w\20\13\5\377\201A\16\377\227I\20\377v=\17\377\16" + "\12\5\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\3\210r8\15\377\217F\20\377" + "\217F\20\377\20\14\5\335\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7qmC\32\377" + "\270Z\25\377\224L\21\3774\34\11\377\10\6\3\306\10\6\3X\10\6\3\220\25\17\6" + "\377\202B\17\377\217L\20\377\217L\20\377\20\14\5\343\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\11\10\6\252C*\24\377\312|\37\377\320\200!\377\315j\32" + "\377h:\25\377\16\13\7\332\6\5\5\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\6\4" + "\34\33\21\10\345f3\15\377\213D\20\377\217I\20\377\221J\20\377G%\14\377\32" + "\22\11\377P2\27\377\314z!\377\320s!\377\312h\31\377\225N\24\3774\36\13\377" + "\12\10\5U\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\252U+\14\377\211I\20\377M'\14\377" + "\16\12\5\343\12\10\5\252\12\10\5\306.\32\11\377\211I\20\377s;\16\377\31\20" + "\6\350\10\6\3\37\0\0\0\0\0\0\0\0\0\0\0\0\6\5\3\34\12\10\5w\23\15\6\252\35" + "\23\10\255\32\20\7\322\33\22\10\273\21\14\6\366:\36\13\377\227M\22\377\300" + "a\25\377\300a\25\377\30\20\11\317\0\0\0\0\0\0\0\0\4\4\3\3\31\20\6\353s;\16" + "\377\217I\20\377\221M\20\377l5\15\377\25\16\6\377\7\6\4\244\12\7\5U\10\7" + "\5\223\11\7\4\210\10\6\5L\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5" + """9:!\15\377\274k\33\377\300o\37\377U3\30\377\22\15\11\273\6\5\5\24\0\0\0" + "\0\0\0\0\0\13\11\6\234\213E\22\377\236S\21\377\224L\21\377\27\17\6\252\0" + "\0\0\0\0\0\0\0\0\0\0\0\11\7\4U\23\15\6\377f3\15\377\200B\17\377Q)\14\377" + "\14\11\5\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\15\12\10Us<\30\377\242K\27\377y<\24\377\27\17\10\216\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\3\2\6\12\10\5\252]0\14\377{A\16" + "\377{<\16\377\16\12\5\343\3\3\2U\14\12\7\252\243S\30\377\307c\32\377\301" + "`\30\377)\32\16\343\6\6\5-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\3\3\2\34\13\10\6\252j2\15\377\201?\16\377\201?\16\377\35\22\10\343\6\5" + "\5\37\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\12\10\210\220I\25\377\266" + "Y\25\377c7\23\377\16\13\7\273\4\4\3\3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11" + "\7\4q].\14\377\203B\16\377y>\16\377\20\13\5\252\0\0\0\0\0\0\0\0\0\0\0\0\7" + "\6\4\34\16\12\5\343d2\15\377n;\15\377g4\16\377y;\22\377\206E\25\377\40\25" + "\13\377\6\5\5\306\12\10\7\343.\34\15\377h3\17\377`.\15\377\16\12\5\213\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\12\10\7l?%\22\377\260X\27\377\240P\25\377\24\16\11\252\0\0" + "\0\0\0\0\0\0\10\6\5OU)\14\377\203A\20\377B\"\13\377\12\10\5\252\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4\247" + "s8\20\377\245U\24\377pA\27\377\22\15\11\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\15\12\10\216\204D\25\377\242P\23\377\215F\22\377\21\14" + "\6\265\0\0\0\0\0\0\0\0\0\0\0\0\21\14\6\377g6\16\377\202B\17\377\37\24\10" + "\377\6\5\3q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\10\6\3\234#\26\10\377r:\15\377n;\15\377X-\13\377X*\13\377\\/\13\377h6" + "\15\377w:\16\377=\40\12\377\12\10\5\340\5\4\4\24\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\13\10\6Uq:\26\377\264Z\27\377\214E\21\377{?\16\377{<\16\377w8\16" + "\377x=\21\377\30\17\11\247\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\12\7\205\264" + "X\33\377\313k\36\377\307d\34\377\305h\34\377\277]\34\377\247N\30\377\204" + "D\25\377y>\22\377u<\22\377v9\21\377l2\17\377\21\14\6q\0\0\0\0\0\0\0\0\0\0" + "\0\0\16\12\5\343A!\12\377s;\16\377s;\16\377m4\16\377t9\21\377y;\22\377\213" + "D\24\377\232I\23\377s>\24\377!\27\14\377\11\10\6G\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\2\2\1\10\10\6\3\252]2\14" + "\377}@\16\377{<\16\377\16\12\5\237\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\340A!" + "\12\377s;\16\377s;\16\377m4\16\377w=\22\377\201B\24\377\224K\25\377\252T" + "\25\377\201C\26\377%\31\16\377\10\7\5""9\0\0\0\0\0\0\0\0\5\5\4\27\30\21\11" + "\377g6\22\377\204?\21\377x>\17\377b1\15\377Z-\13\377^-\15\377|<\21\377\254" + "Q\25\377\226N\31\377,\35\21\377\11\10\6[\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\10\7\3f].\14\377}@\16\377y>\16\377\22\14\5\252\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\12\5\343@!\13\377\204B" + "\21\377\236O\25\377\227F\26\377\202C\25\377n5\17\377l5\15\377v<\15\377U+" + "\14\377\25\16\6\377\7\6\4""9\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\343A!\12\377" + "\203A\20\377\225H\24\377\205D\24\377o6\20\377n5\17\377\212H\23\377\243Q\24" + "\377p:\23\377\34\24\11\377\10\7\5""9\0\0\0\0\0\0\0\0\11\7\4[`0\15\377\204" + "F\17\377{<\16\377\16\12\5\241\0\0\0\0\0\0\0\0\15\12\6U\224I\27\377\312e\33" + "\377\201C\32\377\22\15\11\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\6\5\3""0\21\14\6\343l7\15\377p7\15\377#\26\10\377\11\7\4""9" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\40\26\15\377\211" + "D\26\377\232I\23\377-\32\12\377\10\6\5\220\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3DC\"\12" + "\377s8\20\377m4\16\377\20\13\5\223\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\5\4\4\13\26\21\13\343\201L\34\377\303_\34\377\272T\27\377y;\22" + "\377k3\16\377`.\15\377Z-\13\377X-\13\377)\30\10\377\14\12\5\260\0\0\0\0\0" + "\0\0\0\0\0\0\0\10\6\3LX,\13\377}B\16\377{<\16\377\22\14\5\252\0\0\0\0\0\0" + "\0\0\0\0\0\0\11\7\4U\\/\13\377}@\16\377{<\16\377\20\13\5\226\0\0\0\0\0\0" + "\0\0\10\6\3>X-\13\377}@\16\377{<\16\377r:\15\377]2\14\377X,\13\377\\/\13" + "\377h6\15\377w:\16\377U+\14\377\25\17\6\377\7\6\4""3\0\0\0\0\0\0\0\0\0\0" + "\0\0\14\12\5\335=\40\12\377x>\17\377{=\20\377m4\16\377`.\15\377f3\15\377" + "s;\16\377{A\16\377U+\14\377\31\20\6\377\7\6\4""3\0\0\0\0\0\0\0\0\10\6\3J" + "X-\13\377}@\16\377{<\16\377r:\15\377]2\14\377X-\13\377\\/\13\377h4\15\377" + "v<\15\377U+\14\377\25\17\6\377\7\5\4(\0\0\0\0\0\0\0\0\10\6\3JX-\13\377}@" + "\16\377{<\16\377r:\15\377]2\14\377X-\13\377\\+\13\377]2\14\377]2\14\377\24" + "\15\5U\0\0\0\0\0\0\0\0\10\6\3AX-\13\377}@\16\377y>\16\377\22\15\5\252\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\12" + "\5\343;\37\12\377s>\16\377r:\15\377]2\14\377X,\13\377X,\13\377h6\15\377v" + "<\15\377{<\16\377{<\16\377\16\12\5\226\0\0\0\0\0\0\0\0\10\6\3AX-\13\377}" + "B\16\377{<\16\377\22\14\5\252\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4U\\/\13\377}" + "B\16\377{A\16\377\16\12\5\226\0\0\0\0\0\0\0\0\10\6\3AX-\13\377}B\16\377{" + "A\16\377\16\12\5\237\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\335F#\13\377\233J\24" + "\377\301Y\32\377\271[\34\377\254U\33\377\245P\30\377\233N\26\377\204B\21" + "\377Z,\15\377\25\17\6\377\7\5\4(\0\0\0\0\0\0\0\0\10\6\3JX-\13\377}@\16\377" + "y>\16\377\23\15\6\260\0\0\0\0\0\0\0\0\0\0\0\0\11\6\4\205]2\14\377\203B\16" + "\377{A\16\377\16\13\5\226\0\0\0\0\0\0\0\0\10\6\3>X-\13\377}@\16\377{<\16" + "\377v8\17\377x=\21\377\210C\25\377v9\21\377`0\15\377\\/\13\377\22\14\5U\0" + "\0\0\0\0\0\0\0\11\7\4Oh3\17\377\214B\21\377\207B\20\377\21\14\6\306\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4U\\/\13\377}B\16\377{A\16\377\16" + "\12\5\226\0\0\0\0\0\0\0\0\10\6\3AX-\13\377\207B\20\377\210C\21\377\26\16" + "\7\306\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3wX-\13\377}@\16\377{<\16\377\16\12\5" + "\237\0\0\0\0\0\0\0\0\0\0\0\0\14\12\5\322;\37\12\377s>\16\377v<\15\377h6\15" + "\377d2\15\377d2\15\377r:\15\377w?\16\377U+\14\377\25\17\6\377\7\5\4(\0\0" + "\0\0\0\0\0\0\10\6\3JX-\13\377}B\16\377{<\16\377\22\14\5\252\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\14\12\5\343;\37\12\377s>\16\377r:\15\377d2\15\377r8\15\377\205B\20\377" + "\240P\25\377\260S\25\377-\33\14\377\6\5\3\252\0\0\0\0\0\0\0\0\0\0\0\0\10" + "\6\3RX-\13\377}B\16\377{<\16\377\22\14\5\252\0\0\0\0\0\0\0\0\0\0\0\0\11\7" + "\4U\\/\13\377\203=\16\377~>\17\377\21\13\6\252\0\0\0\0\0\0\0\0\0\0\0\0\16" + "\12\5\343A!\12\377s;\16\377s>\16\377]2\14\377X,\13\377\\/\13\377h6\15\377" + "w:\16\377U+\14\377\25\17\6\377\7\6\4""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\11\7\4U\\/\13\377}B\16\377{<\16\377\22\14\5\252\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\5\4\34\23\15\6\377T*\13\377s>\16" + "\377n;\15\377]2\14\377T,\13\377j6\17\377\260T\27\377\307d\34\377\274e\37" + "\377Z6\31\377\15\12\10\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\10\6\3\244H%\13\377\203B\16\377n6\15\377\14\11\5\340\3\3\2\21\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\6\6U\36\24\15\377\276`\33\377" + "\307b\30\377yE\26\377\15\12\6\276\4\3\3\34\5\4\2i\33\21\6\377r8\15\377}@" + "\16\377-\32\12\377\10\7\5\231\0\0\0\0\0\0\0\0\0\0\0\0\12\7\5U`0\15\377}@" + "\16\377{<\16\377\20\13\5\303\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3n\\/\13\377\203" + "B\16\377{A\16\377\22\15\5\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\11\7\4U\\/\13\377}B\16\377{<\16\377\22\14\5\252\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\3c]2\14\377}B\16\377s;\16\377h6\15\377" + "X-\13\377X,\13\377\\+\13\377\\+\13\377\\+\13\377]2\14\377]2\14\377\24\15" + "\5U\0\0\0\0\0\0\0\0\10\6\3AX-\13\377}@\16\377{<\16\377s>\16\377].\14\377" + "\20\13\5\177\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\4" + "\4\34\14\12\5\366h6\15\377s;\16\377'\27\10\377\10\6\3R\0\0\0\0\0\0\0\0\0" + "\0\0\0:\37\11\377r:\15\377w?\16\377{<\16\377{A\16\377\22\14\5\252\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5" + "\343;\37\12\377s>\16\377n;\15\377X,\13\377P*\13\377X,\13\377h6\15\377s;\16" + "\377{<\16\377{<\16\377\20\13\5\226\0\0\0\0\0\0\0\0\10\6\3AX,\13\377}@\16" + "\377{<\16\377r:\15\377]2\14\377X,\13\377\\/\13\377h6\15\377w:\16\377U+\14" + "\377\25\17\6\377\7\6\4""3\0\0\0\0\0\0\0\0\0\0\0\0\14\11\5\340?\40\12\377" + "s>\16\377r8\15\377]2\14\377X,\13\377X-\13\377n;\15\377w=\16\377U+\14\377" + "\31\20\6\377\7\6\4""9\0\0\0\0\0\0\0\0\0\0\0\0\14\12\5\335;\37\12\377s>\16" + "\377r8\15\377]2\14\377X,\13\377\\/\13\377h6\15\377s;\16\377{<\16\377y>\16" + "\377\20\13\5\247\0\0\0\0\0\0\0\0\0\0\0\0\14\12\5\332;\37\12\377s>\16\377" + "n;\15\377X,\13\377P*\13\377X,\13\377X-\13\377X,\13\377\20\13\5i\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4U\\/\13\377}B\16\377{<\16\377" + "\22\14\5\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\5\4\306]2\14\377}B\16\377{<\16\377" + "\14\12\5\252\0\0\0\0\0\0\0\0\10\6\3AX-\13\377}B\16\377{A\16\377\22\14\5\252" + "\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4U\\/\13\377}B\16\377{A\16\377\16\12\5\226" + "\0\0\0\0\0\0\0\0\10\6\3AX-\13\377}B\16\377{<\16\377\22\15\5\252\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\3\2\13\11\7\4\343d2\15\377{<\16\377{<\16" + "\377\14\12\5\252\0\0\0\0\0\0\0\0\10\6\3>X-\13\377}B\16\377{<\16\377\16\12" + "\5\306\0\0\0\0\0\0\0\0\10\6\3\252#\26\10\377s;\16\377p7\15\377!\25\10\377" + "\10\6\3%\0\0\0\0\0\0\0\0\10\6\3JX-\13\377}B\16\377{A\16\377\16\12\5\226\0" + "\0\0\0\0\0\0\0\10\6\3AX-\13\377}B\16\377{A\16\377\16\13\5\223\0\0\0\0\11" + "\7\4U\\/\13\377\24\15\5\252\0\0\0\0\10\6\3>X-\13\377}B\16\377{A\16\377\16" + "\12\5\226\0\0\0\0\0\0\0\0\10\6\3AX-\13\377}B\16\377{<\16\377\22\14\5\252" + "\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4U\\/\13\377}B\16\377{<\16\377\16\12\5\237" + "\0\0\0\0\0\0\0\0\0\0\0\0\14\12\5\322;\37\12\377s;\16\377v<\15\377h6\15\377" + "f3\15\377p5\15\377z?\17\377{:\16\377U+\14\377\25\17\6\377\7\5\4-\0\0\0\0" + "\0\0\0\0\10\6\3Uq7\20\377\304\\\27\377\303`\30\377\31\21\12\377\4\3\3O\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\2\2\34\12\10\5\343" + "\212G\25\377\261W\24\377\256V\25\377\30\20\11\252\0\0\0\0\0\0\0\0\15\12\10" + "U\216I\27\377\303`\30\377\302[\27\377\30\21\13\343\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\11" + "\5\226#\26\10\377P*\13\377T,\13\377X,\13\377P*\13\377X,\13\377a2\14\377v" + "<\15\377U+\14\377\25\17\6\377\10\6\3""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11" + "\7\4U\\/\13\377}B\16\377{<\16\377\22\14\5\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\6\5\5\34\21\15\10\343D\"\13\377s;\16\377n;\15\377]2\14\377X,\13\377" + "\\/\13\377h6\15\377s;\16\377{<\16\377{A\16\377\22\14\5\252\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\11\7\252\203E\30\377\277Z\26\377\210" + "G\23\377\17\13\6\343\4\3\3\21\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\7\6\4\37\20\13\5\343h4\15\377\203B\16\377b1\15\377\12\10\5\301\3\2\2" + "D\10\7\5\252yB\32\377\303`\30\377\234J\23\377\"\25\11\377\11\7\4U\0\0\0\0" + "\0\0\0\0\0\0\0\0\10\6\3""3E#\12\377y>\16\377{<\16\377\20\13\5\343\4\3\3\34" + "\0\0\0\0\0\0\0\0\10\6\3\252\\/\13\377}@\16\377l7\15\377\16\12\5\244\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\7\5\4\306`0\15\377\206A\17\377\205B\20\377\17\13\6\252\0\0\0\0\0\0\0\0" + "\7\5\4UN'\13\377\202@\17\377\202@\17\377\206A\17\377\210C\21\377|>\21\377" + "r8\21\377q7\20\377v<\21\377k7\24\3770\35\17\377\14\12\7U\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6\252-\33\14\377\213F\24\377\203B\22\377k" + "5\16\377\23\15\6c\0\0\0\0\0\0\0\0\10\6\5U\\.\15\377\203=\16\377}@\16\377" + "\16\12\5\252\0\0\0\0\0\0\0\0\0\0\0\0:\37\11\377n;\15\377s;\16\3778\35\11" + "\377\12\10\5\343\5\4\4\27\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7\34\34\22\13\3241\34\20\377#\25\14\361\15" + "\12\6U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16" + "\12\5\216\24\16\5\252\20\14\5\244\10\6\3\34\0\0\0\0\0\0\0\0\30\20\11\216" + "\25\17\10\374\27\17\10\270\13\10\6\"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\24\16\5\252\20\13\5\252" + "\12\10\5\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\6\4\31\24\15" + "\7\223\26\17\7\252\12\10\5\216\5\4\4\3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\16\12\5\216\24\15\5\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\7\5\4\34\16\12\5\234\16\12\5\345\30\17\11\377\40\24" + "\13\377\34\22\13\364\14\11\7l\0\0\0\0\0\0\0\0\12\10\5\216\23\15\10\353\30" + "\17\7\343\12\10\5;\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5]\27\17\10\252\34\22\11" + "\255\17\13\6\34\0\0\0\0\0\0\0\0\0\0\0\0\22\14\5\216\25\16\6\252\11\7\4\205" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\10\6\5qY,\16\377d3\25\377\15\12\10\343\6\5\5\34\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\5\5\10\21\14\6\216\32\20\7\252\22\14\5" + "\252\11\7\4\34\0\0\0\0\0\0\0\0\6\5\3U6\34\13\377\210B\23\377y;\22\377\17" + "\12\6\361\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\10\6\3""9\14\11\5\252\22\15\5\262\16\12\5\361\16\12\5\377" + "\16\12\5\374\20\13\5\303\20\13\5\252\10\6\3q\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\10\6\5\34\30\20\11\314\30\21\11\377\21\14\6\322\16\12" + "\5\252\20\13\5\252\21\13\6\366\33\21\12\366\16\12\7U\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\10\6\5\34\25\16\12\303\26\17\13\377\22\15\11\377\22\15\11\377" + "\26\17\11\377\23\15\10\377\21\14\6\377\21\13\6\377\17\13\6\377\21\14\6\377" + "\23\15\6\314\14\11\5\34\0\0\0\0\0\0\0\0\0\0\0\0\5\4\2\31\10\6\3z\16\12\5" + "\252\22\15\5\260\16\12\5\353\17\13\6\377\17\13\6\377\23\14\6\314\23\15\6" + "\252\12\10\5\252\10\6\5""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\25\15\6\252" + "\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\5\4\2\31\10\6\3}\16\12\5\252" + "\16\12\5\322\27\17\10\377\36\24\13\377\36\24\13\377\27\21\12\377\24\16\11" + "\364\20\14\11\252\11\10\6O\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\6A\17\13" + "\10\252\21\14\10\350\25\16\10\377\32\20\11\377\27\17\10\377\25\16\10\377" + "\17\13\6\377\26\17\7\262\13\11\6\252\12\10\7""9\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\12\5\216\24\15\5\252\20\13\5\252" + "\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\5\4" + "\34\10\6\3\205\17\13\6\301\24\17\11\377\34\22\13\377\36\24\13\377\32\20\11" + "\377\16\12\5\356\20\13\5\252\11\7\4\231\7\5\4""9\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\5\4\2\34\10\6\3\216\22\14\7\317\26\17\11\377\34\22\13\377\33\22" + "\12\377\22\15\7\377\17\13\6\343\25\15\6\252\12\7\5\244\7\6\4""9\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\24\15\5\252\20\14\5\252\11\7\4\34\0\0" + "\0\0\0\0\0\0\12\10\7w\225@\32\377\203?\32\377\16\13\7\343\6\5\5\34\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\5\4\34\16\12" + "\5\234\24\15\5\252\14\11\5\216\6\5\3\6\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\14\12\7\216\30\17\7\252\25\15\6\252\10\6\3L\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\11\7\6US+\20\377\260X\27\377\202>\25\377\20\13\7\252\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6\34\15\12\10" + "\244\27\20\12\276\20\13\7\374\17\13\6\377\16\12\5\377\16\12\5\377\16\12\5" + "\377\20\13\5\350\16\12\5\252\10\6\3U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12" + "\5\216\25\15\6\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\16\12\5\216\24\15\5\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\16" + "\12\5\210\20\14\5\252\20\13\5\252\22\14\5\252\20\13\5\322\16\12\5\377\16" + "\12\5\371\20\14\5\301\20\13\5\252\11\7\4\231\7\5\4""9\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\5\5\4\34\10\6\3}\16\12\5\252\22\14\5\260\16\12\5\356\16\12\5" + "\366\20\14\5\303\22\15\5\252\20\13\5\252\11\7\4\226\7\5\4""6\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\16\12\5\216\20\14\5\252\20\13\5\252\22\14\5\252\20\13" + "\5\322\16\12\5\377\16\12\5\371\20\14\5\301\20\13\5\252\11\7\4\231\7\6\4""9" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\20\14\5\252\20\13\5\252\22\14" + "\5\252\20\13\5\322\16\12\5\374\14\11\5\377\20\13\5\377\24\15\5\311\13\11" + "\4\34\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\213\24\15\5\252\20\13\5\252\11\7\4" + "\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\5\5\4\34\10\6\3}\16\12\5\252\22\15\5\260\16\12\5\356\16\12\5\377\20\13" + "\5\353\22\15\5\255\20\13\5\252\20\14\5\252\20\13\5\244\11\7\4\34\0\0\0\0" + "\0\0\0\0\0\0\0\0\14\11\5\216\25\15\6\252\20\13\5\252\11\7\4\34\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\24\15\5\252\20\13\5\252\11\7\4\34\0\0" + "\0\0\0\0\0\0\0\0\0\0\14\11\5\216\25\15\6\252\20\13\5\252\11\7\4\34\0\0\0" + "\0\0\0\0\0\0\0\0\0\6\5\3\34\10\7\5\213\23\15\10\301\25\17\12\377\37\25\14" + "\377\40\25\15\377\37\24\14\377\27\21\12\377\22\14\7\324\12\10\5\237\7\6\4" + """9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\25\15\6\252\20\13\5\252\11" + "\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\25\15\6\252\20\14\5\252" + "\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\210\20\14\5\252\20\13\5\252\22" + "\14\5\260\21\14\6\374\25\16\10\377\21\14\6\377\20\13\5\377\24\15\5\314\13" + "\11\4\34\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\25\16\6\252\22\14\5\252\11\10" + "\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\24\15\5" + "\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\14\11\5\216\25\15\6\252" + "\20\14\5\252\12\10\5\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\11\5\216\24\15" + "\5\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\5\5\4\34\10\6\3}\16" + "\12\5\252\22\14\5\252\24\16\5\255\20\14\5\301\24\15\5\262\24\15\5\252\20" + "\13\5\252\11\7\4\231\7\6\4""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216" + "\25\15\6\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\5\4\34\10\6\3}\16\12" + "\5\252\22\15\5\252\24\16\5\252\22\14\5\252\15\12\6\343H&\23\377\271V\40\377" + "\220@\35\377\24\17\13\350\10\7\7\34\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\25" + "\15\6\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216" + "\24\15\5\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\5\4\2\31\10\6" + "\3z\16\12\5\252\22\15\5\260\16\12\5\356\16\12\5\377\16\12\5\371\20\14\5\301" + "\20\13\5\252\11\7\4\231\7\5\4""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\25\15\6\252\20\13\5\252\11\7\4\34\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""9\11\7\4\244" + "\16\12\5\252\22\15\5\255\16\12\5\345\16\12\5\377\21\14\6\377\26\17\11\377" + "\24\16\11\374\25\17\12\260\13\11\6\213\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\10\4z\22\14\5\252\16\12\5\226\7\5\4\34" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\7""9" + "\30\20\13\255\32\22\11\276\15\12\6\216\5\4\4\13\0\0\0\0\0\0\0\0\10\7\3D\16" + "\12\5\252\20\13\5\252\11\7\4J\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16" + "\12\5\216\24\16\5\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\16\12\5\216\24\16\5\252\20\13\5\252\11\10\4\34\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\24\15\5\252\20\13\5\252\11\7" + "\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216" + "\22\15\5\252\20\14\5\252\22\15\5\255\16\12\5\343\16\12\5\377\16\12\5\374" + "\14\11\5\377\14\11\5\377\20\13\5\377\24\15\5\311\13\11\4\34\0\0\0\0\0\0\0" + "\0\0\0\0\0\14\12\5\210\20\14\5\252\20\13\5\252\20\13\5\301\25\17\6\270\16" + "\12\5\37\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\10\6\3\2136\36\11\377k2\14\377N'\13\377\11\7\4\241\0\0\0\0\0\0\0\0\0\0\0" + "\0\24\15\5\216\22\14\5\322\20\13\5\252\20\13\5\252\20\13\5\252\11\7\4\34" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\12\10""9\11\7" + "\6\237\10\6\5\237\12\10\7\202\12\10\7w\11\7\6\205\11\7\6\247\12\10\7\252" + "\13\11\10q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\5\4\2\34\10\6\3}\16\12\5\252\22\15\5\260\16\12" + "\5\356\16\12\5\377\20\13\5\353\22\15\5\255\20\13\5\252\20\14\5\252\20\13" + "\5\244\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\210\20\14\5\252\20\13\5" + "\252\22\14\5\252\20\13\5\322\16\12\5\377\16\12\5\371\20\14\5\301\20\13\5" + "\252\11\7\4\231\7\5\4""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\5\4\34\10\6\3" + "}\16\12\5\252\22\15\5\260\16\12\5\356\16\12\5\377\16\12\5\371\20\13\5\301" + "\20\13\5\252\11\7\4\226\7\5\4""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\5\4\34" + "\10\6\3}\16\12\5\252\22\15\5\260\16\12\5\356\16\12\5\377\16\12\5\353\22\15" + "\5\255\20\13\5\252\20\14\5\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0" + "\0\0\5\5\4\34\10\6\3}\16\12\5\252\22\15\5\260\16\12\5\353\16\12\5\377\16" + "\12\5\377\20\13\5\377\24\15\5\317\14\11\5\"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\24\15\5\252\20\13\5\252\11\7\4\34" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\5\3U\7\5\4U\6" + "\5\3U\5\4\4U\5\4\4i\11\10\4\361H%\13\377n6\15\377C\"\12\377\10\6\3\220\0" + "\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\25\16\6\252\20\14\5\252\11\10\4\34\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\25\15\6\252\20\13\5\252\11\7\4\34" + "\0\0\0\0\0\0\0\0\0\0\0\0\14\11\5\216\25\15\6\252\20\13\5\252\11\7\4\34\0" + "\0\0\0\0\0\0\0\0\0\0\0\7\5\2%\10\6\3\216\10\6\3\343\31\17\6\377K$\12\377" + "c3\14\377B!\11\377\10\6\3\202\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\213\25\15\6" + "\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3O\16\12\5\252\22" + "\15\5\252\14\11\5\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\25\15\6" + "\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\14\11\5\216\25\15\6\252" + "\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\24\15\5U\13\10\4\34\0\0\0\0\0\0\0" + "\0\14\11\5\216\25\15\6\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0" + "\14\11\5\216\25\15\6\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\16\12\5\216\24\15\5\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0" + "\0\0\5\5\4\34\10\6\3}\16\12\5\252\22\14\5\252\24\16\5\255\20\14\5\301\24" + "\15\5\262\24\15\5\252\20\13\5\252\11\7\4\241\7\6\4""9\0\0\0\0\0\0\0\0\0\0" + "\0\0\10\6\3UT(\15\377\244I\27\377\270O\33\377\17\13\10\366\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\12\12\252\260" + "S%\377\304W!\377\300X\37\377\26\17\13\301\0\0\0\0\0\0\0\0\0\0\0\0\25\17\12" + "\237\32\21\13\377\30\21\13\335\12\10\7U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\3;\14\11\5\252" + "\20\13\5\322\16\12\5\377\16\12\5\377\16\12\5\377\16\12\5\366\20\14\5\301" + "\20\13\5\252\11\7\4\231\6\5\3""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\16\12\5\216\24\15\5\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\6\5\3\34\10\6\3\177\16\12\5\252\22\15\5\260\16\12" + "\5\356\16\12\5\377\16\12\5\353\22\15\5\255\20\13\5\252\20\14\5\252\20\13" + "\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\16\13\7\216\35\23\10\252\21\13\6\237\10\6\3\34\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\5\4\34\16\12\5\226\24\15\5\252\14" + "\11\5\216\5\4\2\16\0\0\0\0\0\0\0\0\17\13\10\216\32\22\11\262\23\15\6\252" + "\10\6\3D\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\22\14\5\216\20\13\5\356" + "\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\11\5\216\20\13" + "\5\327\22\15\5\273\13\11\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\4\4\3\6\5\4" + "\2R\5\4\2U\5\4\2U\5\4\2U\5\4\2c\11\7\4\361H%\13\377p5\15\377M'\14\377\12" + "\10\5\252\0\0\0\0\0\0\0\0\0\0\0\0\23\15\10\270\24\16\11\377\20\13\7\377\16" + "\13\7\377\21\14\10\377\26\17\11\377\33\21\12\377\36\23\13\377\34\22\13\377" + "\25\17\12\377\17\14\10\306\11\7\6\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\10\6\5[\17\13\6\252\16\13\5\356\23\15\6\306\14\11\5\34\0\0\0" + "\0\0\0\0\0\6\5\3U6\35\11\377d0\15\377m4\16\377\17\13\6\252\0\0\0\0\0\0\0" + "\0\0\0\0\0\23\15\6\220\16\12\5\377\20\13\5\262\10\6\3w\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\11\7Xc,\24\377" + "\32\20\13\350\5\4\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\5\3""9<" + "\34\13\377\236C\27\377X,\27\377\13\11\6\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\11" + "\7n~3\31\377\31\21\14\350\5\4\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\5\5\34\23\16\12\3434\35\21\377" + "\36\24\15\377\11\10\6R\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\12\11\252" + "\254Q1\377\325}^\377\271X:\377\27\20\16\237\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\4\2\34\20\13\5\364D" + "\"\11\377>!\11\377\11\10\4\213\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\12\10\7""0G!\22\377l/\27\377k0\26\377q3\30\377m2\30\377h-\25\377h" + "-\25\377q1\30\377s2\30\377\22\15\11\210\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\11\7\6\"\22\15\11\364B\37\17\377T%\21\377S$\20\377K\"\16\377" + "I#\16\377[)\20\377n/\23\377O(\20\377\30\20\11\377\10\6\5""9\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\26\16\5\364(\27\7\377*\27\7\377" + "6\34\11\377<\37\11\377$\26\7\377\14\11\5\364\6\5\3\34\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\6UH\"\15\377~8\25\377\224" + "?\31\377\31\21\16\276\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\17\14\14\205\262V9\377\310Y7\377\302R/\377\36\24\21" + "\273\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4c\21\14" + "\6\377*\26\11\3771\31\11\3776\32\13\3774\32\13\377;\34\14\377R%\17\377o1" + "\22\377T'\21\377\31\21\12\377\10\7\5""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\5\3""9&\26\7\377U'\14\377" + "|4\25\377\24\15\11\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\10\6\5\34\32\20\13\252\13\10\6U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\14\10\5w\24\16\11\252\14\11\7\216\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\11\7\6\34\33\21\14\252\13\11\10U\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\7\6\6\34\10\7\5U\10\6\5""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\31\21\20\241)\33\32\377(\32\27\353\16\14\13R\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10" + "\6\3%\11\7\4\216\11\7\4\210\6\5\3\6\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\27\17\12\231\23\15\12\377\20\13\11\377\20\13\11\377\20" + "\13\11\377\20\13\11\377\20\13\11\377\22\15\11\377\30\20\13\314\20\13\11\37" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7\216\22\14" + "\11\317\22\15\11\377\20\13\11\377\17\13\10\377\17\13\10\374\22\15\11\303" + "\22\14\11\252\13\10\6\247\10\7\5""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\11\10\4\216\16\12\5\252\15\12\6\252\15\11\6\252" + "\13\10\6\252\7\6\4\202\6\5\3\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\7\216\25\16\12\252\23\15\12" + "\252\16\13\11\37\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\10\7\10\16\31\21\20\216\33\22\20\301\32\22\17\252\17\13" + "\12\"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4\34\13" + "\10\6\252\16\12\7\350\17\12\10\377\17\12\10\377\17\12\10\377\17\12\10\374" + "\22\14\11\303\22\14\11\252\13\10\6\247\11\7\6""9\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\11\7\4[\20\13\7\252\24\15\11\252\15\12\10\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0", +}; + diff -Nru kodi-visualization-goom-1.1.0/lib/goom/tools/Makefile.devel kodi-visualization-goom-2.1.0/lib/goom/tools/Makefile.devel --- kodi-visualization-goom-1.1.0/lib/goom/tools/Makefile.devel 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/tools/Makefile.devel 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,5 @@ +minicompress:minicompress.c + gcc -o minicompress -Wall minicompress.c + +clean: + rm -f *~ *.o minicompress diff -Nru kodi-visualization-goom-1.1.0/lib/goom/tools/minicompress.c kodi-visualization-goom-2.1.0/lib/goom/tools/minicompress.c --- kodi-visualization-goom-1.1.0/lib/goom/tools/minicompress.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/tools/minicompress.c 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,65 @@ +#include +#include + +#define THE_FILE "gfont.c" +#define THE_FONT the_font +#define THE_FONTS "the_font" + +#include THE_FILE + +int main (int argc, char **argv) { + int i = 1; + int size = 0; + unsigned char pc = the_font.pixel_data[0]; + int nbz = 0; + unsigned char *rle; + rle = malloc (the_font.width*the_font.height*the_font.bytes_per_pixel); + + while (i < the_font.width *the_font.height*the_font.bytes_per_pixel) { + unsigned char c = the_font.pixel_data[i]; + if (pc==0) { + nbz ++; + if (c==0) { + if (nbz == 0xff) { + rle [size++] = 0; + rle [size++] = nbz; + nbz = 0; + } + } + else { + rle [size++] = 0; + rle [size++] = nbz; + nbz = 0; + } + } + else { + rle [size++] = pc; + } + pc = c; + i++; + } + + printf ("/* RGBA C-Source image dump (with zRLE compression) */\n" + "static const struct {\n" + " unsigned int width;\n" + " unsigned int height;\n" + " unsigned int bytes_per_pixel;\n" + " unsigned int rle_size;\n" + " unsigned char rle_pixel [%i];\n", size); + printf ("} " THE_FONTS " = {\n" + "%i, %i, %i, %i, {\n", + the_font.width,the_font.height,the_font.bytes_per_pixel,size); + + printf ("%i",rle[0]); + for (i=1;i= 0.9.5.1 +BuildPrereq: xmms-devel, gtk+-devel + +%description +A great visual plugins for XMMS. + +%prep +%setup -q -n %{name}_%{version} + +%build +%configure --libdir=%{_xmmsoutputdir} +make + +%install +rm -rf %{buildroot} +%makeinstall libdir=%{buildroot}/%{_xmmsoutputdir} +strip %{buildroot}/%{_xmmsoutputdir}/*.so + +%clean +rm -rf %{buildroot} + +%files +%defattr(-,root,root) +%doc AUTHORS COPYING ChangeLog NEWS README doc +%{_xmmsoutputdir}/libgoom.* + +%changelog +* Sun Jan 6 2002 Matthias Saou +- Initial RPM release. + diff -Nru kodi-visualization-goom-1.1.0/lib/goom/xmms-goom/Makefile.am kodi-visualization-goom-2.1.0/lib/goom/xmms-goom/Makefile.am --- kodi-visualization-goom-1.1.0/lib/goom/xmms-goom/Makefile.am 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/xmms-goom/Makefile.am 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,11 @@ +# the xmms plugin + +if HAVE_XMMS +xmms_lib_LTLIBRARIES = libxmmsgoom2.la +xmms_libdir = $(libdir) +libxmmsgoom2_la_LIBADD = $(top_builddir)/src/libgoom2.la $(XMMS_LIBS) +libxmmsgoom2_la_SOURCES = xmms_goom.c +INCLUDES=-DDATADIR=\"@XMMS_DATA_DIR@\" @XMMS_CFLAGS@ -Wall -I../src/ +endif + +libxmmsgoom2_la_LDFLAGS = -module -avoid-version diff -Nru kodi-visualization-goom-1.1.0/lib/goom/xmms-goom/xmms_goom.c kodi-visualization-goom-2.1.0/lib/goom/xmms-goom/xmms_goom.c --- kodi-visualization-goom-1.1.0/lib/goom/xmms-goom/xmms_goom.c 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom/xmms-goom/xmms_goom.c 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,130 @@ +#include +#include "goom_config.h" + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +static void plug_init (void); +static void plug_cleanup (void); +static void plug_render_pcm (gint16 data[2][512]); + +static int fd_in, fd_out; +static pid_t goom_pid = -1; + +static VisPlugin plug_vp = { + NULL, + NULL, + 0, + "What A GOOM!! " VERSION, + 2, + 0, + plug_init,/* init */ + plug_cleanup,/* cleanup */ + NULL,/* about */ + NULL,/* configure */ + NULL,/* disable_plugin */ + NULL,/* playback_start */ + NULL,/* playback_stop */ + plug_render_pcm, /* render_pcm */ + NULL /* render_freq */ +}; + +VisPlugin * +get_vplugin_info (void) +{ + return &plug_vp; +} + +static void +plug_init (void) +{ + int fd[2]; + pid_t pid; + + /* create a pipe */ + if (pipe(fd) < 0) { + fprintf (stderr, "System Error\n"); + /* TODO: en gtk? */ + return; + } + fd_in = fd[0]; + fd_out = fd[1]; + + /* load an executable */ + pid = fork(); + + /* todo look at the result */ + if (pid == 0) { + dup2(fd_in, 0); + + execlp ("goom2", "goom2", NULL); + fprintf (stderr, "Unable to load goom...\n"); /* TODO: Message en gtk + check the PATH */ + exit (1); + } + if (pid == -1) { + /* erreur system : TODO -> dialog en gtk */ + } + if (goom_pid != -1) + kill (goom_pid, SIGQUIT); + goom_pid = pid; +} + +static void sendIntToGoom(int i) { + write (fd_out, &i, sizeof(int)); +} + +static void +plug_cleanup (void) +{ + sendIntToGoom(2); + kill (goom_pid, SIGQUIT); + goom_pid = -1; +} + +static void +plug_render_pcm (gint16 data[2][512]) +{ + fd_set rfds; + struct timeval tv; + int retval; + + tv.tv_sec = 0; + tv.tv_usec = 10000; + + FD_ZERO(&rfds); + FD_SET(fd_out, &rfds); + retval = select(fd_out+1, NULL, &rfds, NULL, &tv); + if (retval) { + /* send sound datas to goom */ + { + sendIntToGoom(0); + write (fd_out, &data[0][0], 512*sizeof(gint16)*2); + fsync(fd_out); + } + + /* send song title to goom */ + { + static int spos = -1; + int pos = xmms_remote_get_playlist_pos(plug_vp.xmms_session); + char title[2048]; + if (spos != pos) { + sendIntToGoom(1); + strcpy(title, xmms_remote_get_playlist_title(plug_vp.xmms_session, pos)); + write (fd_out, &title[0], 2048); + spos = pos; + } + } + } + else { + usleep(100); + } +} diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/AUTHORS kodi-visualization-goom-2.1.0/lib/goom2k4-0/AUTHORS --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/AUTHORS 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/AUTHORS 1970-01-01 00:00:00.000000000 +0000 @@ -1,9 +0,0 @@ -What a GOOM! -============ - -Copyright (c)2000-2004, Jean-Christophe Hoelt -Programmer and Software Designer at iOS software. - -iTunes port/PowerPC/Core-Hacking: Guillaume Borios -WINAMP/WMP port: Fred - diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/autogen.sh kodi-visualization-goom-2.1.0/lib/goom2k4-0/autogen.sh --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/autogen.sh 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/autogen.sh 1970-01-01 00:00:00.000000000 +0000 @@ -1,8 +0,0 @@ -#!/bin/sh - -if libtoolize --version 2> /dev/null; then -aclocal -I m4 && libtoolize --copy --force && automake --foreign --add-missing && autoconf -else -aclocal -I m4 && glibtoolize --copy --force && automake --foreign --add-missing && autoconf -fi - diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/ChangeLog kodi-visualization-goom-2.1.0/lib/goom2k4-0/ChangeLog --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/ChangeLog 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/ChangeLog 1970-01-01 00:00:00.000000000 +0000 @@ -1,85 +0,0 @@ -ChangeLogs for GOOM -------------------- - -.10/03/2004: version 2k4-dev12 - - A Goom Scripting Language embedded in. It allows hi level of - configuration and easy hacking of the effect's behaviour. - - Zoom filter now works on relative screen coordinates. -.04/12/2003: version 2k4-dev2 - A long time since last entry here but some work has been done during - this year, Goom v2 is now on the track and working pretty well. - Added: - - Configurability. - - A particule system for rain, fireworks and fountains. - - Dynamic brightness changes to make gooms more impressive. - - Cleaning the code. -.30/12/2002: - Auto-CPU detection. New font.. now stored in the binary file. -.28/12/2002: - Optimisation of the asm loop in ExtendedMMX -.30/11/2002: - Added tentacle3d. -.15/11/2002: - Dirty Hack to make inline asm compile well : - remove the -fPIC flag (by modifying ltconfig) -.11/11/2002: - Partial rewriting of the sound evaluator. -.10/11/2002: - bug fixes (crash with some song title, ...) - display/hide of the fps. - show information messages. -.10/08/2002: - xmms-goom now uses SDL. -.**/07/2002: - display the title. -.07/06/2002: version 1.9 - Slow change between FX. -.20/04/2002: version 1.8.1 - Hypercos effect. - - added a param to goom_core to force the fx change - - fullscreen for xmms works well - - keyboard input for xmms - - xmms-ctrl (control xmms from goom) - - auto-change fx after a large number of cycle with the same one -.11/04/2002: version 1.8.0 - IFS point effect.. -.10/12/2001: - Adding some new stuff from iGoom (circle line) - removing the init-close bug. - adding the oportunity to double the size of the pixel. -.11/07/2001: - Hello mister proper.. The code is more portable now. -.16/06/2001: - Fixing a little bug with the initial config loading. - Using the 2 new FX of the zoom filter. - - -ChangeLogs for KOP2ZEDEMO: the zoom filter ------------------------------------------- - -.16/06/2001: - NEW FX -> vPlane & hPlane. (to do rotations) - NEW FX -> noisify ; to add noise to the transformation buffer. -.03/01/2001: - All buffers are now created by a malloc - reduction of the performances... but it is now more configurable... - .(MMX version is now 50 clocks per pixel) -.28/12/2000: - Optimizing a little the sinFilter -.27/12/2000: - Optimizing the buffer generator - .(previous : 767 clocks/pixel => now : 234 clk/pxl) - Adding two effect: AMULETTE and SCRUNCH -.22/12/2000: - Good optimization : reducing mem access - .(MMX version is now 45 clocks per pixel) -.13/12/2000: - Unrolling loop -.12/12/2000: - Optimisation of the ASM code -> 64bits RAM access - .(MMX version is now 55 clocks per pixel) -.10/12/2000: - MMX version of the zoomer - .(MMX version is now 70 clocks per pixel) - -author: Jean-Christophe Hoelt diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/configure.in kodi-visualization-goom-2.1.0/lib/goom2k4-0/configure.in --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/configure.in 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/configure.in 1970-01-01 00:00:00.000000000 +0000 @@ -1,147 +0,0 @@ -AC_INIT(README) - -AM_DISABLE_STATIC -AM_INIT_AUTOMAKE(SDL_Goom, 2k4) - -ACLOCAL="$ACLOCAL -I m4" - -AM_PROG_LIBTOOL -AC_PROG_CC -AC_PROG_LN_S -AM_PROG_LEX -AC_PROG_YACC - -AC_C_BIGENDIAN - -dnl Get the CFlags -CFLAGS="${CFLAGS}" -LDFLAGS="${LDFLAGS}" - -dnl *** check for xmms *** - -HAVE_XMMS="no" -AM_CONDITIONAL(HAVE_XMMS,test "x$HAVE_XMMS" = "xyes") - - -dnl *** SDL *** - -HAVE_SDL="no" -AM_CONDITIONAL(HAVE_SDL,test "x$HAVE_SDL" = "xyes") - - -dnl *** MMX *** - -dnl rm -f mmx_zoom.s -HAVE_MMX="no" -HAVE_PPC="no" -MACTARGET="no" - -dnl HOST -case "$host" in -*-apple-darwin*) - MACTARGET="no" - MACFOLDER="" - AC_SUBST(MACFOLDER) - CCAS='$(CC)' - AC_SUBST(CCAS) - ;; -*-*-cygwin*) - CFLAGS="$CFLAGS -mno-cygwin -mwindows" - LDFLAGS="$LDFLAGS -lmingw32" - ;; -esac - -dnl ARCH -case "$host" in -i*86_64-*-*) - AC_DEFINE(HAVE_MMX) - AC_DEFINE(CPU_X86) - HAVE_MMX="yes" - ;; - -powerpc-*-*) - CCASFLAGS=-force_cpusubtype_ALL - AC_SUBST(CCASFLAGS) - AC_DEFINE(CPU_POWERPC) - HAVE_PPC="yes" - ;; - -esac -AM_CONDITIONAL(HAVE_MMX,test "x$HAVE_MMX" = "xyes") -AM_CONDITIONAL(HAVE_PPC,test "x$HAVE_PPC" = "xyes") -AM_CONDITIONAL(MACTARGET,test "x$MACTARGET" = "xyes") - - -AC_CHECK_HEADER(pthread.h,,AC_MSG_ERROR([*** POSIX thread support not installed - please install first ***])) - -PTHREAD_LIBS=error -AC_CHECK_LIB(pthread, pthread_attr_init, PTHREAD_LIBS="-lpthread") - -if test "x$PTHREAD_LIBS" = xerror; then - AC_CHECK_LIB(pthreads, pthread_attr_init, PTHREAD_LIBS="-lpthreads") -fi - -if test "x$PTHREAD_LIBS" = xerror; then - AC_CHECK_LIB(c_r, pthread_attr_init, PTHREAD_LIBS="-lc_r") -fi - -if test "x$PTHREAD_LIBS" = xerror; then - AC_CHECK_FUNC(pthread_attr_init, PTHREAD_LIBS="") -fi - -AC_SUBST(PTHREAD_LIBS) - -dnl rm -f mmx_zoom.s -dnl echo -n checking for nasm... -dnl if nasm -r 1> /dev/null 2> /dev/null -dnl then -dnl echo " `nasm -r` founded.."; -dnl else -dnl echo " not found." -dnl echo '*** NASM needed to build x86 assembly..***' -dnl AC_MSG_ERROR -dnl fi -dnl esac - -dnl AC_DEFINE(USE_ASM_MMX) -dnl ln -s mmx_zoom_x86.s mmx_zoom.s ;; -dnl *) -dnl ln -s mmx_zoom_dummy.s mmx_zoom.s ;; -dnl esac - -AC_SUBST(CFLAGS) -AC_SUBST(LDFLAGS) - -AC_OUTPUT(Makefile src/Makefile xmms-goom/Makefile sdl-goom/Makefile libgoom2.pc) - -dnl *** nice user info *** - -AC_MSG_NOTICE([goom2k4 was configured with the following options:]) -if test "x$HAVE_PPC" = "xyes"; then - AC_MSG_NOTICE([ ** PPC support enabled]) -else - AC_MSG_NOTICE([ PPC support disabled]) -fi -if test "x$HAVE_MMX" = "xyes"; then - AC_MSG_NOTICE([ ** MMX support enabled]) -else - AC_MSG_NOTICE([ MMX support disabled]) -fi -AC_MSG_NOTICE([ ** goom lib will be built]) -if test "x$HAVE_XMMS" = "xyes"; then - AC_MSG_NOTICE([ ** XMMS plugin will be built]) -else - AC_MSG_NOTICE([ XMMS plugin will not be built]) -fi -if test "x$MACTARGET" = "xyes"; then - AC_MSG_NOTICE([ ** goom mac application will be built]) - AC_MSG_NOTICE([ ** goom mac iTunes plugin will be built]) -else - AC_MSG_NOTICE([ goom mac application will not be built]) - AC_MSG_NOTICE([ goom mac iTunes plugin will not be built]) -fi -if test "x$HAVE_SDL" = "xyes"; then - AC_MSG_NOTICE([ ** goom sdl application will be built]) -else - AC_MSG_NOTICE([ goom sdl application will not be built]) -fi diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/COPYING kodi-visualization-goom-2.1.0/lib/goom2k4-0/COPYING --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/COPYING 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/COPYING 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ -This program is under the LGPL. -You can find the terms of this licence somewhere on the internet. -(for exemple, search "LGPL" on your favorite search engine). Binary files /tmp/tmpPt54Nf/VKyUZvMq5a/kodi-visualization-goom-1.1.0/lib/goom2k4-0/goom2k4.png and /tmp/tmpPt54Nf/jSnkFgw56d/kodi-visualization-goom-2.1.0/lib/goom2k4-0/goom2k4.png differ diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/ABOUT-NLS kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/ABOUT-NLS --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/ABOUT-NLS 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/ABOUT-NLS 1970-01-01 00:00:00.000000000 +0000 @@ -1,226 +0,0 @@ -Notes on the Free Translation Project -************************************* - - Free software is going international! The Free Translation Project -is a way to get maintainers of free software, translators, and users all -together, so that will gradually become able to speak many languages. -A few packages already provide translations for their messages. - - If you found this `ABOUT-NLS' file inside a distribution, you may -assume that the distributed package does use GNU `gettext' internally, -itself available at your nearest GNU archive site. But you do *not* -need to install GNU `gettext' prior to configuring, installing or using -this package with messages translated. - - Installers will find here some useful hints. These notes also -explain how users should proceed for getting the programs to use the -available translations. They tell how people wanting to contribute and -work at translations should contact the appropriate team. - - When reporting bugs in the `intl/' directory or bugs which may be -related to internationalization, you should tell about the version of -`gettext' which is used. The information can be found in the -`intl/VERSION' file, in internationalized packages. - -One advise in advance -===================== - - If you want to exploit the full power of internationalization, you -should configure it using - - ./configure --with-included-gettext - -to force usage of internationalizing routines provided within this -package, despite the existence of internationalizing capabilities in the -operating system where this package is being installed. So far, only -the `gettext' implementation in the GNU C library version 2 provides as -many features (such as locale alias or message inheritance) as the -implementation here. It is also not possible to offer this additional -functionality on top of a `catgets' implementation. Future versions of -GNU `gettext' will very likely convey even more functionality. So it -might be a good idea to change to GNU `gettext' as soon as possible. - - So you need not provide this option if you are using GNU libc 2 or -you have installed a recent copy of the GNU gettext package with the -included `libintl'. - -INSTALL Matters -=============== - - Some packages are "localizable" when properly installed; the -programs they contain can be made to speak your own native language. -Most such packages use GNU `gettext'. Other packages have their own -ways to internationalization, predating GNU `gettext'. - - By default, this package will be installed to allow translation of -messages. It will automatically detect whether the system provides -usable `catgets' (if using this is selected by the installer) or -`gettext' functions. If neither is available, the GNU `gettext' own -library will be used. This library is wholly contained within this -package, usually in the `intl/' subdirectory, so prior installation of -the GNU `gettext' package is *not* required. Installers may use -special options at configuration time for changing the default -behaviour. The commands: - - ./configure --with-included-gettext - ./configure --with-catgets - ./configure --disable-nls - -will respectively bypass any pre-existing `catgets' or `gettext' to use -the internationalizing routines provided within this package, enable -the use of the `catgets' functions (if found on the locale system), or -else, *totally* disable translation of messages. - - When you already have GNU `gettext' installed on your system and run -configure without an option for your new package, `configure' will -probably detect the previously built and installed `libintl.a' file and -will decide to use this. This might be not what is desirable. You -should use the more recent version of the GNU `gettext' library. I.e. -if the file `intl/VERSION' shows that the library which comes with this -package is more recent, you should use - - ./configure --with-included-gettext - -to prevent auto-detection. - - By default the configuration process will not test for the `catgets' -function and therefore they will not be used. The reasons are already -given above: the emulation on top of `catgets' cannot provide all the -extensions provided by the GNU `gettext' library. If you nevertheless -want to use the `catgets' functions use - - ./configure --with-catgets - -to enable the test for `catgets' (this causes no harm if `catgets' is -not available on your system). If you really select this option we -would like to hear about the reasons because we cannot think of any -good one ourself. - - Internationalized packages have usually many `po/LL.po' files, where -LL gives an ISO 639 two-letter code identifying the language. Unless -translations have been forbidden at `configure' time by using the -`--disable-nls' switch, all available translations are installed -together with the package. However, the environment variable `LINGUAS' -may be set, prior to configuration, to limit the installed set. -`LINGUAS' should then contain a space separated list of two-letter -codes, stating which languages are allowed. - -Using This Package -================== - - As a user, if your language has been installed for this package, you -only have to set the `LANG' environment variable to the appropriate -ISO 639 `LL' two-letter code prior to using the programs in the -package. For example, let's suppose that you speak German. At the -shell prompt, merely execute `setenv LANG de' (in `csh'), -`export LANG; LANG=de' (in `sh') or `export LANG=de' (in `bash'). This -can be done from your `.login' or `.profile' file, once and for all. - - An operating system might already offer message localization for -many of its programs, while other programs have been installed locally -with the full capabilities of GNU `gettext'. Just using `gettext' -extended syntax for `LANG' would break proper localization of already -available operating system programs. In this case, users should set -both `LANGUAGE' and `LANG' variables in their environment, as programs -using GNU `gettext' give preference to `LANGUAGE'. For example, some -Swedish users would rather read translations in German than English for -when Swedish is not available. This is easily accomplished by setting -`LANGUAGE' to `sv:de' while leaving `LANG' to `sv'. - -Translating Teams -================= - - For the Free Translation Project to be a success, we need interested -people who like their own language and write it well, and who are also -able to synergize with other translators speaking the same language. -Each translation team has its own mailing list, courtesy of Linux -International. You may reach your translation team at the address -`LL@li.org', replacing LL by the two-letter ISO 639 code for your -language. Language codes are *not* the same as the country codes given -in ISO 3166. The following translation teams exist, as of December -1997: - - Chinese `zh', Czech `cs', Danish `da', Dutch `nl', English `en', - Esperanto `eo', Finnish `fi', French `fr', German `de', Hungarian - `hu', Irish `ga', Italian `it', Indonesian `id', Japanese `ja', - Korean `ko', Latin `la', Norwegian `no', Persian `fa', Polish - `pl', Portuguese `pt', Russian `ru', Slovenian `sl', Spanish `es', - Swedish `sv', and Turkish `tr'. - -For example, you may reach the Chinese translation team by writing to -`zh@li.org'. - - If you'd like to volunteer to *work* at translating messages, you -should become a member of the translating team for your own language. -The subscribing address is *not* the same as the list itself, it has -`-request' appended. For example, speakers of Swedish can send a -message to `sv-request@li.org', having this message body: - - subscribe - - Keep in mind that team members are expected to participate -*actively* in translations, or at solving translational difficulties, -rather than merely lurking around. If your team does not exist yet and -you want to start one, or if you are unsure about what to do or how to -get started, please write to `translation@iro.umontreal.ca' to reach the -coordinator for all translator teams. - - The English team is special. It works at improving and uniformizing -the terminology in use. Proven linguistic skill are praised more than -programming skill, here. - -Available Packages -================== - - Languages are not equally supported in all packages. The following -matrix shows the current state of internationalization, as of December -1997. The matrix shows, in regard of each package, for which languages -PO files have been submitted to translation coordination. - - Ready PO files cs da de en es fi fr it ja ko nl no pl pt ru sl sv - .----------------------------------------------------. - bash | [] [] [] | 3 - bison | [] [] [] | 3 - clisp | [] [] [] [] | 4 - cpio | [] [] [] [] [] [] | 6 - diffutils | [] [] [] [] [] | 5 - enscript | [] [] [] [] [] [] | 6 - fileutils | [] [] [] [] [] [] [] [] [] [] | 10 - findutils | [] [] [] [] [] [] [] [] [] | 9 - flex | [] [] [] [] | 4 - gcal | [] [] [] [] [] | 5 - gettext | [] [] [] [] [] [] [] [] [] [] [] | 12 - grep | [] [] [] [] [] [] [] [] [] [] | 10 - hello | [] [] [] [] [] [] [] [] [] [] [] | 11 - id-utils | [] [] [] | 3 - indent | [] [] [] [] [] | 5 - libc | [] [] [] [] [] [] [] | 7 - m4 | [] [] [] [] [] [] | 6 - make | [] [] [] [] [] [] | 6 - music | [] [] | 2 - ptx | [] [] [] [] [] [] [] [] | 8 - recode | [] [] [] [] [] [] [] [] [] | 9 - sh-utils | [] [] [] [] [] [] [] [] | 8 - sharutils | [] [] [] [] [] [] | 6 - tar | [] [] [] [] [] [] [] [] [] [] [] | 11 - texinfo | [] [] [] | 3 - textutils | [] [] [] [] [] [] [] [] [] | 9 - wdiff | [] [] [] [] [] [] [] [] | 8 - `----------------------------------------------------' - 17 languages cs da de en es fi fr it ja ko nl no pl pt ru sl sv - 27 packages 6 4 25 1 18 1 26 2 1 12 20 9 19 7 4 7 17 179 - - Some counters in the preceding matrix are higher than the number of -visible blocks let us expect. This is because a few extra PO files are -used for implementing regional variants of languages, or language -dialects. - - For a PO file in the matrix above to be effective, the package to -which it applies should also have been internationalized and -distributed as such by its maintainer. There might be an observable -lag between the mere existence a PO file and its wide availability in a -distribution. - - If December 1997 seems to be old, you may fetch a more recent copy -of this `ABOUT-NLS' file on most GNU archive sites. - diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/acconfig.h kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/acconfig.h --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/acconfig.h 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/acconfig.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,9 +0,0 @@ -#undef ENABLE_NLS -#undef HAVE_CATGETS -#undef HAVE_GETTEXT -#undef HAVE_LC_MESSAGES -#undef HAVE_STPCPY -#undef HAVE_LIBSM -#undef PACKAGE_LOCALE_DIR -#undef PACKAGE_DATA_DIR -#undef PACKAGE_SOURCE_DIR diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/aclocal.m4 kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/aclocal.m4 --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/aclocal.m4 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/aclocal.m4 1970-01-01 00:00:00.000000000 +0000 @@ -1,796 +0,0 @@ -dnl aclocal.m4 generated automatically by aclocal 1.4a - -dnl Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. -dnl This file is free software; the Free Software Foundation -dnl gives unlimited permission to copy and/or distribute it, -dnl with or without modifications, as long as this notice is preserved. - -dnl This program is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without -dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A -dnl PARTICULAR PURPOSE. - -# Do all the work for Automake. This macro actually does too much -- -# some checks are only needed if your package does certain things. -# But this isn't really a big deal. - -# serial 1 - -dnl Usage: -dnl AM_INIT_AUTOMAKE(package,version, [no-define]) - -AC_DEFUN(AM_INIT_AUTOMAKE, -[AC_REQUIRE([AC_PROG_INSTALL]) -dnl We require 2.13 because we rely on SHELL being computed by configure. -AC_PREREQ([2.13]) -PACKAGE=[$1] -AC_SUBST(PACKAGE) -VERSION=[$2] -AC_SUBST(VERSION) -dnl test to see if srcdir already configured -if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then - AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) -fi -ifelse([$3],, -AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) -AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])) -AC_REQUIRE([AM_SANITY_CHECK]) -AC_REQUIRE([AC_ARG_PROGRAM]) -dnl FIXME This is truly gross. -missing_dir=`cd $ac_aux_dir && pwd` -AM_MISSING_PROG(ACLOCAL, aclocal, $missing_dir) -AM_MISSING_PROG(AUTOCONF, autoconf, $missing_dir) -AM_MISSING_PROG(AUTOMAKE, automake, $missing_dir) -AM_MISSING_PROG(AUTOHEADER, autoheader, $missing_dir) -AM_MISSING_PROG(MAKEINFO, makeinfo, $missing_dir) -AC_REQUIRE([AC_PROG_MAKE_SET])]) - -# -# Check to make sure that the build environment is sane. -# - -AC_DEFUN(AM_SANITY_CHECK, -[AC_MSG_CHECKING([whether build environment is sane]) -# Just in case -sleep 1 -echo timestamp > conftestfile -# Do `set' in a subshell so we don't clobber the current shell's -# arguments. Must try -L first in case configure is actually a -# symlink; some systems play weird games with the mod time of symlinks -# (eg FreeBSD returns the mod time of the symlink's containing -# directory). -if ( - set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null` - if test "[$]*" = "X"; then - # -L didn't work. - set X `ls -t $srcdir/configure conftestfile` - fi - if test "[$]*" != "X $srcdir/configure conftestfile" \ - && test "[$]*" != "X conftestfile $srcdir/configure"; then - - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken -alias in your environment]) - fi - - test "[$]2" = conftestfile - ) -then - # Ok. - : -else - AC_MSG_ERROR([newly created file is older than distributed files! -Check your system clock]) -fi -rm -f conftest* -AC_MSG_RESULT(yes)]) - -dnl AM_MISSING_PROG(NAME, PROGRAM, DIRECTORY) -dnl The program must properly implement --version. -AC_DEFUN(AM_MISSING_PROG, -[AC_MSG_CHECKING(for working $2) -# Run test in a subshell; some versions of sh will print an error if -# an executable is not found, even if stderr is redirected. -# Redirect stdin to placate older versions of autoconf. Sigh. -if ($2 --version) < /dev/null > /dev/null 2>&1; then - $1=$2 - AC_MSG_RESULT(found) -else - $1="$3/missing $2" - AC_MSG_RESULT(missing) -fi -AC_SUBST($1)]) - -# Like AC_CONFIG_HEADER, but automatically create stamp file. - -AC_DEFUN(AM_CONFIG_HEADER, -[AC_PREREQ([2.12]) -AC_CONFIG_HEADER([$1]) -dnl When config.status generates a header, we must update the stamp-h file. -dnl This file resides in the same directory as the config header -dnl that is generated. We must strip everything past the first ":", -dnl and everything past the last "/". -AC_OUTPUT_COMMANDS(changequote(<<,>>)dnl -ifelse(patsubst(<<$1>>, <<[^ ]>>, <<>>), <<>>, -<>CONFIG_HEADERS" || echo timestamp > patsubst(<<$1>>, <<^\([^:]*/\)?.*>>, <<\1>>)stamp-h<<>>dnl>>, -<>; do - case " <<$>>CONFIG_HEADERS " in - *" <<$>>am_file "*<<)>> - echo timestamp > `echo <<$>>am_file | sed -e 's%:.*%%' -e 's%[^/]*$%%'`stamp-h$am_indx - ;; - esac - am_indx=`expr "<<$>>am_indx" + 1` -done<<>>dnl>>) -changequote([,]))]) - - -# serial 1 - -# @defmac AC_PROG_CC_STDC -# @maindex PROG_CC_STDC -# @ovindex CC -# If the C compiler in not in ANSI C mode by default, try to add an option -# to output variable @code{CC} to make it so. This macro tries various -# options that select ANSI C on some system or another. It considers the -# compiler to be in ANSI C mode if it handles function prototypes correctly. -# -# If you use this macro, you should check after calling it whether the C -# compiler has been set to accept ANSI C; if not, the shell variable -# @code{am_cv_prog_cc_stdc} is set to @samp{no}. If you wrote your source -# code in ANSI C, you can make an un-ANSIfied copy of it by using the -# program @code{ansi2knr}, which comes with Ghostscript. -# @end defmac - -AC_DEFUN(AM_PROG_CC_STDC, -[AC_REQUIRE([AC_PROG_CC]) -AC_BEFORE([$0], [AC_C_INLINE]) -AC_BEFORE([$0], [AC_C_CONST]) -dnl Force this before AC_PROG_CPP. Some cpp's, eg on HPUX, require -dnl a magic option to avoid problems with ANSI preprocessor commands -dnl like #elif. -dnl FIXME: can't do this because then AC_AIX won't work due to a -dnl circular dependency. -dnl AC_BEFORE([$0], [AC_PROG_CPP]) -AC_MSG_CHECKING(for ${CC-cc} option to accept ANSI C) -AC_CACHE_VAL(am_cv_prog_cc_stdc, -[am_cv_prog_cc_stdc=no -ac_save_CC="$CC" -# Don't try gcc -ansi; that turns off useful extensions and -# breaks some systems' header files. -# AIX -qlanglvl=ansi -# Ultrix and OSF/1 -std1 -# HP-UX -Aa -D_HPUX_SOURCE -# SVR4 -Xc -D__EXTENSIONS__ -for ac_arg in "" -qlanglvl=ansi -std1 "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" -do - CC="$ac_save_CC $ac_arg" - AC_TRY_COMPILE( -[#include -#include -#include -#include -/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ -struct buf { int x; }; -FILE * (*rcsopen) (struct buf *, struct stat *, int); -static char *e (p, i) - char **p; - int i; -{ - return p[i]; -} -static char *f (char * (*g) (char **, int), char **p, ...) -{ - char *s; - va_list v; - va_start (v,p); - s = g (p, va_arg (v,int)); - va_end (v); - return s; -} -int test (int i, double x); -struct s1 {int (*f) (int a);}; -struct s2 {int (*f) (double a);}; -int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); -int argc; -char **argv; -], [ -return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; -], -[am_cv_prog_cc_stdc="$ac_arg"; break]) -done -CC="$ac_save_CC" -]) -if test -z "$am_cv_prog_cc_stdc"; then - AC_MSG_RESULT([none needed]) -else - AC_MSG_RESULT($am_cv_prog_cc_stdc) -fi -case "x$am_cv_prog_cc_stdc" in - x|xno) ;; - *) CC="$CC $am_cv_prog_cc_stdc" ;; -esac -]) - -# Configure paths for GTK+ -# Owen Taylor 97-11-3 - -dnl AM_PATH_GTK([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND [, MODULES]]]]) -dnl Test for GTK, and define GTK_CFLAGS and GTK_LIBS -dnl -AC_DEFUN(AM_PATH_GTK, -[dnl -dnl Get the cflags and libraries from the gtk-config script -dnl -AC_ARG_WITH(gtk-prefix,[ --with-gtk-prefix=PFX Prefix where GTK is installed (optional)], - gtk_config_prefix="$withval", gtk_config_prefix="") -AC_ARG_WITH(gtk-exec-prefix,[ --with-gtk-exec-prefix=PFX Exec prefix where GTK is installed (optional)], - gtk_config_exec_prefix="$withval", gtk_config_exec_prefix="") -AC_ARG_ENABLE(gtktest, [ --disable-gtktest Do not try to compile and run a test GTK program], - , enable_gtktest=yes) - - for module in . $4 - do - case "$module" in - gthread) - gtk_config_args="$gtk_config_args gthread" - ;; - esac - done - - if test x$gtk_config_exec_prefix != x ; then - gtk_config_args="$gtk_config_args --exec-prefix=$gtk_config_exec_prefix" - if test x${GTK_CONFIG+set} != xset ; then - GTK_CONFIG=$gtk_config_exec_prefix/bin/gtk-config - fi - fi - if test x$gtk_config_prefix != x ; then - gtk_config_args="$gtk_config_args --prefix=$gtk_config_prefix" - if test x${GTK_CONFIG+set} != xset ; then - GTK_CONFIG=$gtk_config_prefix/bin/gtk-config - fi - fi - - AC_PATH_PROG(GTK_CONFIG, gtk-config, no) - min_gtk_version=ifelse([$1], ,0.99.7,$1) - AC_MSG_CHECKING(for GTK - version >= $min_gtk_version) - no_gtk="" - if test "$GTK_CONFIG" = "no" ; then - no_gtk=yes - else - GTK_CFLAGS=`$GTK_CONFIG $gtk_config_args --cflags` - GTK_LIBS=`$GTK_CONFIG $gtk_config_args --libs` - gtk_config_major_version=`$GTK_CONFIG $gtk_config_args --version | \ - sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` - gtk_config_minor_version=`$GTK_CONFIG $gtk_config_args --version | \ - sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` - gtk_config_micro_version=`$GTK_CONFIG $gtk_config_args --version | \ - sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` - if test "x$enable_gtktest" = "xyes" ; then - ac_save_CFLAGS="$CFLAGS" - ac_save_LIBS="$LIBS" - CFLAGS="$CFLAGS $GTK_CFLAGS" - LIBS="$GTK_LIBS $LIBS" -dnl -dnl Now check if the installed GTK is sufficiently new. (Also sanity -dnl checks the results of gtk-config to some extent -dnl - rm -f conf.gtktest - AC_TRY_RUN([ -#include -#include -#include - -int -main () -{ - int major, minor, micro; - char *tmp_version; - - system ("touch conf.gtktest"); - - /* HP/UX 9 (%@#!) writes to sscanf strings */ - tmp_version = g_strdup("$min_gtk_version"); - if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { - printf("%s, bad version string\n", "$min_gtk_version"); - exit(1); - } - - if ((gtk_major_version != $gtk_config_major_version) || - (gtk_minor_version != $gtk_config_minor_version) || - (gtk_micro_version != $gtk_config_micro_version)) - { - printf("\n*** 'gtk-config --version' returned %d.%d.%d, but GTK+ (%d.%d.%d)\n", - $gtk_config_major_version, $gtk_config_minor_version, $gtk_config_micro_version, - gtk_major_version, gtk_minor_version, gtk_micro_version); - printf ("*** was found! If gtk-config was correct, then it is best\n"); - printf ("*** to remove the old version of GTK+. You may also be able to fix the error\n"); - printf("*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing\n"); - printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n"); - printf("*** required on your system.\n"); - printf("*** If gtk-config was wrong, set the environment variable GTK_CONFIG\n"); - printf("*** to point to the correct copy of gtk-config, and remove the file config.cache\n"); - printf("*** before re-running configure\n"); - } -#if defined (GTK_MAJOR_VERSION) && defined (GTK_MINOR_VERSION) && defined (GTK_MICRO_VERSION) - else if ((gtk_major_version != GTK_MAJOR_VERSION) || - (gtk_minor_version != GTK_MINOR_VERSION) || - (gtk_micro_version != GTK_MICRO_VERSION)) - { - printf("*** GTK+ header files (version %d.%d.%d) do not match\n", - GTK_MAJOR_VERSION, GTK_MINOR_VERSION, GTK_MICRO_VERSION); - printf("*** library (version %d.%d.%d)\n", - gtk_major_version, gtk_minor_version, gtk_micro_version); - } -#endif /* defined (GTK_MAJOR_VERSION) ... */ - else - { - if ((gtk_major_version > major) || - ((gtk_major_version == major) && (gtk_minor_version > minor)) || - ((gtk_major_version == major) && (gtk_minor_version == minor) && (gtk_micro_version >= micro))) - { - return 0; - } - else - { - printf("\n*** An old version of GTK+ (%d.%d.%d) was found.\n", - gtk_major_version, gtk_minor_version, gtk_micro_version); - printf("*** You need a version of GTK+ newer than %d.%d.%d. The latest version of\n", - major, minor, micro); - printf("*** GTK+ is always available from ftp://ftp.gtk.org.\n"); - printf("***\n"); - printf("*** If you have already installed a sufficiently new version, this error\n"); - printf("*** probably means that the wrong copy of the gtk-config shell script is\n"); - printf("*** being found. The easiest way to fix this is to remove the old version\n"); - printf("*** of GTK+, but you can also set the GTK_CONFIG environment to point to the\n"); - printf("*** correct copy of gtk-config. (In this case, you will have to\n"); - printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n"); - printf("*** so that the correct libraries are found at run-time))\n"); - } - } - return 1; -} -],, no_gtk=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) - CFLAGS="$ac_save_CFLAGS" - LIBS="$ac_save_LIBS" - fi - fi - if test "x$no_gtk" = x ; then - AC_MSG_RESULT(yes) - ifelse([$2], , :, [$2]) - else - AC_MSG_RESULT(no) - if test "$GTK_CONFIG" = "no" ; then - echo "*** The gtk-config script installed by GTK could not be found" - echo "*** If GTK was installed in PREFIX, make sure PREFIX/bin is in" - echo "*** your path, or set the GTK_CONFIG environment variable to the" - echo "*** full path to gtk-config." - else - if test -f conf.gtktest ; then - : - else - echo "*** Could not run GTK test program, checking why..." - CFLAGS="$CFLAGS $GTK_CFLAGS" - LIBS="$LIBS $GTK_LIBS" - AC_TRY_LINK([ -#include -#include -], [ return ((gtk_major_version) || (gtk_minor_version) || (gtk_micro_version)); ], - [ echo "*** The test program compiled, but did not run. This usually means" - echo "*** that the run-time linker is not finding GTK or finding the wrong" - echo "*** version of GTK. If it is not finding GTK, you'll need to set your" - echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" - echo "*** to the installed location Also, make sure you have run ldconfig if that" - echo "*** is required on your system" - echo "***" - echo "*** If you have an old version installed, it is best to remove it, although" - echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH" - echo "***" - echo "*** If you have a RedHat 5.0 system, you should remove the GTK package that" - echo "*** came with the system with the command" - echo "***" - echo "*** rpm --erase --nodeps gtk gtk-devel" ], - [ echo "*** The test program failed to compile or link. See the file config.log for the" - echo "*** exact error that occured. This usually means GTK was incorrectly installed" - echo "*** or that you have moved GTK since it was installed. In the latter case, you" - echo "*** may want to edit the gtk-config script: $GTK_CONFIG" ]) - CFLAGS="$ac_save_CFLAGS" - LIBS="$ac_save_LIBS" - fi - fi - GTK_CFLAGS="" - GTK_LIBS="" - ifelse([$3], , :, [$3]) - fi - AC_SUBST(GTK_CFLAGS) - AC_SUBST(GTK_LIBS) - rm -f conf.gtktest -]) - -# Macro to add for using GNU gettext. -# Ulrich Drepper , 1995. -# -# This file can be copied and used freely without restrictions. It can -# be used in projects which are not available under the GNU Public License -# but which still want to provide support for the GNU gettext functionality. -# Please note that the actual code is *not* freely available. - -# serial 5 - -AC_DEFUN(AM_WITH_NLS, - [AC_MSG_CHECKING([whether NLS is requested]) - dnl Default is enabled NLS - AC_ARG_ENABLE(nls, - [ --disable-nls do not use Native Language Support], - USE_NLS=$enableval, USE_NLS=yes) - AC_MSG_RESULT($USE_NLS) - AC_SUBST(USE_NLS) - - USE_INCLUDED_LIBINTL=no - - dnl If we use NLS figure out what method - if test "$USE_NLS" = "yes"; then - AC_DEFINE(ENABLE_NLS) - AC_MSG_CHECKING([whether included gettext is requested]) - AC_ARG_WITH(included-gettext, - [ --with-included-gettext use the GNU gettext library included here], - nls_cv_force_use_gnu_gettext=$withval, - nls_cv_force_use_gnu_gettext=no) - AC_MSG_RESULT($nls_cv_force_use_gnu_gettext) - - nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext" - if test "$nls_cv_force_use_gnu_gettext" != "yes"; then - dnl User does not insist on using GNU NLS library. Figure out what - dnl to use. If gettext or catgets are available (in this order) we - dnl use this. Else we have to fall back to GNU NLS library. - dnl catgets is only used if permitted by option --with-catgets. - nls_cv_header_intl= - nls_cv_header_libgt= - CATOBJEXT=NONE - - AC_CHECK_HEADER(libintl.h, - [AC_CACHE_CHECK([for gettext in libc], gt_cv_func_gettext_libc, - [AC_TRY_LINK([#include ], [return (int) gettext ("")], - gt_cv_func_gettext_libc=yes, gt_cv_func_gettext_libc=no)]) - - if test "$gt_cv_func_gettext_libc" != "yes"; then - AC_CHECK_LIB(intl, bindtextdomain, - [AC_CACHE_CHECK([for gettext in libintl], - gt_cv_func_gettext_libintl, - [AC_CHECK_LIB(intl, gettext, - gt_cv_func_gettext_libintl=yes, - gt_cv_func_gettext_libintl=no)], - gt_cv_func_gettext_libintl=no)]) - fi - - if test "$gt_cv_func_gettext_libc" = "yes" \ - || test "$gt_cv_func_gettext_libintl" = "yes"; then - AC_DEFINE(HAVE_GETTEXT) - AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, - [test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"], no)dnl - if test "$MSGFMT" != "no"; then - AC_CHECK_FUNCS(dcgettext) - AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) - AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, - [test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :) - AC_TRY_LINK(, [extern int _nl_msg_cat_cntr; - return _nl_msg_cat_cntr], - [CATOBJEXT=.gmo - DATADIRNAME=share], - [CATOBJEXT=.mo - DATADIRNAME=lib]) - INSTOBJEXT=.mo - fi - fi - ]) - - if test "$CATOBJEXT" = "NONE"; then - AC_MSG_CHECKING([whether catgets can be used]) - AC_ARG_WITH(catgets, - [ --with-catgets use catgets functions if available], - nls_cv_use_catgets=$withval, nls_cv_use_catgets=no) - AC_MSG_RESULT($nls_cv_use_catgets) - - if test "$nls_cv_use_catgets" = "yes"; then - dnl No gettext in C library. Try catgets next. - AC_CHECK_LIB(i, main) - AC_CHECK_FUNC(catgets, - [AC_DEFINE(HAVE_CATGETS) - INTLOBJS="\$(CATOBJS)" - AC_PATH_PROG(GENCAT, gencat, no)dnl - if test "$GENCAT" != "no"; then - AC_PATH_PROG(GMSGFMT, gmsgfmt, no) - if test "$GMSGFMT" = "no"; then - AM_PATH_PROG_WITH_TEST(GMSGFMT, msgfmt, - [test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"], no) - fi - AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, - [test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :) - USE_INCLUDED_LIBINTL=yes - CATOBJEXT=.cat - INSTOBJEXT=.cat - DATADIRNAME=lib - INTLDEPS='$(top_builddir)/intl/libintl.a' - INTLLIBS=$INTLDEPS - LIBS=`echo $LIBS | sed -e 's/-lintl//'` - nls_cv_header_intl=intl/libintl.h - nls_cv_header_libgt=intl/libgettext.h - fi]) - fi - fi - - if test "$CATOBJEXT" = "NONE"; then - dnl Neither gettext nor catgets in included in the C library. - dnl Fall back on GNU gettext library. - nls_cv_use_gnu_gettext=yes - fi - fi - - if test "$nls_cv_use_gnu_gettext" = "yes"; then - dnl Mark actions used to generate GNU NLS library. - INTLOBJS="\$(GETTOBJS)" - AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, - [test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"], msgfmt) - AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) - AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, - [test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :) - AC_SUBST(MSGFMT) - USE_INCLUDED_LIBINTL=yes - CATOBJEXT=.gmo - INSTOBJEXT=.mo - DATADIRNAME=share - INTLDEPS='$(top_builddir)/intl/libintl.a' - INTLLIBS=$INTLDEPS - LIBS=`echo $LIBS | sed -e 's/-lintl//'` - nls_cv_header_intl=intl/libintl.h - nls_cv_header_libgt=intl/libgettext.h - fi - - dnl Test whether we really found GNU xgettext. - if test "$XGETTEXT" != ":"; then - dnl If it is no GNU xgettext we define it as : so that the - dnl Makefiles still can work. - if $XGETTEXT --omit-header /dev/null 2> /dev/null; then - : ; - else - AC_MSG_RESULT( - [found xgettext program is not GNU xgettext; ignore it]) - XGETTEXT=":" - fi - fi - - # We need to process the po/ directory. - POSUB=po - else - DATADIRNAME=share - nls_cv_header_intl=intl/libintl.h - nls_cv_header_libgt=intl/libgettext.h - fi - AC_LINK_FILES($nls_cv_header_libgt, $nls_cv_header_intl) - AC_OUTPUT_COMMANDS( - [case "$CONFIG_FILES" in *po/Makefile.in*) - sed -e "/POTFILES =/r po/POTFILES" po/Makefile.in > po/Makefile - esac]) - - - # If this is used in GNU gettext we have to set USE_NLS to `yes' - # because some of the sources are only built for this goal. - if test "$PACKAGE" = gettext; then - USE_NLS=yes - USE_INCLUDED_LIBINTL=yes - fi - - dnl These rules are solely for the distribution goal. While doing this - dnl we only have to keep exactly one list of the available catalogs - dnl in configure.in. - for lang in $ALL_LINGUAS; do - GMOFILES="$GMOFILES $lang.gmo" - POFILES="$POFILES $lang.po" - done - - dnl Make all variables we use known to autoconf. - AC_SUBST(USE_INCLUDED_LIBINTL) - AC_SUBST(CATALOGS) - AC_SUBST(CATOBJEXT) - AC_SUBST(DATADIRNAME) - AC_SUBST(GMOFILES) - AC_SUBST(INSTOBJEXT) - AC_SUBST(INTLDEPS) - AC_SUBST(INTLLIBS) - AC_SUBST(INTLOBJS) - AC_SUBST(POFILES) - AC_SUBST(POSUB) - ]) - -AC_DEFUN(AM_GNU_GETTEXT, - [AC_REQUIRE([AC_PROG_MAKE_SET])dnl - AC_REQUIRE([AC_PROG_CC])dnl - AC_REQUIRE([AC_PROG_RANLIB])dnl - AC_REQUIRE([AC_ISC_POSIX])dnl - AC_REQUIRE([AC_HEADER_STDC])dnl - AC_REQUIRE([AC_C_CONST])dnl - AC_REQUIRE([AC_C_INLINE])dnl - AC_REQUIRE([AC_TYPE_OFF_T])dnl - AC_REQUIRE([AC_TYPE_SIZE_T])dnl - AC_REQUIRE([AC_FUNC_ALLOCA])dnl - AC_REQUIRE([AC_FUNC_MMAP])dnl - - AC_CHECK_HEADERS([argz.h limits.h locale.h nl_types.h malloc.h string.h \ -unistd.h sys/param.h]) - AC_CHECK_FUNCS([getcwd munmap putenv setenv setlocale strchr strcasecmp \ -strdup __argz_count __argz_stringify __argz_next]) - - if test "${ac_cv_func_stpcpy+set}" != "set"; then - AC_CHECK_FUNCS(stpcpy) - fi - if test "${ac_cv_func_stpcpy}" = "yes"; then - AC_DEFINE(HAVE_STPCPY) - fi - - AM_LC_MESSAGES - AM_WITH_NLS - - if test "x$CATOBJEXT" != "x"; then - if test "x$ALL_LINGUAS" = "x"; then - LINGUAS= - else - AC_MSG_CHECKING(for catalogs to be installed) - NEW_LINGUAS= - for lang in ${LINGUAS=$ALL_LINGUAS}; do - case "$ALL_LINGUAS" in - *$lang*) NEW_LINGUAS="$NEW_LINGUAS $lang" ;; - esac - done - LINGUAS=$NEW_LINGUAS - AC_MSG_RESULT($LINGUAS) - fi - - dnl Construct list of names of catalog files to be constructed. - if test -n "$LINGUAS"; then - for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done - fi - fi - - dnl The reference to in the installed file - dnl must be resolved because we cannot expect the users of this - dnl to define HAVE_LOCALE_H. - if test $ac_cv_header_locale_h = yes; then - INCLUDE_LOCALE_H="#include " - else - INCLUDE_LOCALE_H="\ -/* The system does not provide the header . Take care yourself. */" - fi - AC_SUBST(INCLUDE_LOCALE_H) - - dnl Determine which catalog format we have (if any is needed) - dnl For now we know about two different formats: - dnl Linux libc-5 and the normal X/Open format - test -d intl || mkdir intl - if test "$CATOBJEXT" = ".cat"; then - AC_CHECK_HEADER(linux/version.h, msgformat=linux, msgformat=xopen) - - dnl Transform the SED scripts while copying because some dumb SEDs - dnl cannot handle comments. - sed -e '/^#/d' $srcdir/intl/$msgformat-msg.sed > intl/po2msg.sed - fi - dnl po2tbl.sed is always needed. - sed -e '/^#.*[^\\]$/d' -e '/^#$/d' \ - $srcdir/intl/po2tbl.sed.in > intl/po2tbl.sed - - dnl In the intl/Makefile.in we have a special dependency which makes - dnl only sense for gettext. We comment this out for non-gettext - dnl packages. - if test "$PACKAGE" = "gettext"; then - GT_NO="#NO#" - GT_YES= - else - GT_NO= - GT_YES="#YES#" - fi - AC_SUBST(GT_NO) - AC_SUBST(GT_YES) - - dnl If the AC_CONFIG_AUX_DIR macro for autoconf is used we possibly - dnl find the mkinstalldirs script in another subdir but ($top_srcdir). - dnl Try to locate is. - MKINSTALLDIRS= - if test -n "$ac_aux_dir"; then - MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" - fi - if test -z "$MKINSTALLDIRS"; then - MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs" - fi - AC_SUBST(MKINSTALLDIRS) - - dnl *** For now the libtool support in intl/Makefile is not for real. - l= - AC_SUBST(l) - - dnl Generate list of files to be processed by xgettext which will - dnl be included in po/Makefile. - test -d po || mkdir po - if test "x$srcdir" != "x."; then - if test "x`echo $srcdir | sed 's@/.*@@'`" = "x"; then - posrcprefix="$srcdir/" - else - posrcprefix="../$srcdir/" - fi - else - posrcprefix="../" - fi - rm -f po/POTFILES - sed -e "/^#/d" -e "/^\$/d" -e "s,.*, $posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \ - < $srcdir/po/POTFILES.in > po/POTFILES - ]) - -# Search path for a program which passes the given test. -# Ulrich Drepper , 1996. -# -# This file can be copied and used freely without restrictions. It can -# be used in projects which are not available under the GNU Public License -# but which still want to provide support for the GNU gettext functionality. -# Please note that the actual code is *not* freely available. - -# serial 1 - -dnl AM_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR, -dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]]) -AC_DEFUN(AM_PATH_PROG_WITH_TEST, -[# Extract the first word of "$2", so it can be a program name with args. -set dummy $2; ac_word=[$]2 -AC_MSG_CHECKING([for $ac_word]) -AC_CACHE_VAL(ac_cv_path_$1, -[case "[$]$1" in - /*) - ac_cv_path_$1="[$]$1" # Let the user override the test with a path. - ;; - *) - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" - for ac_dir in ifelse([$5], , $PATH, [$5]); do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - if [$3]; then - ac_cv_path_$1="$ac_dir/$ac_word" - break - fi - fi - done - IFS="$ac_save_ifs" -dnl If no 4th arg is given, leave the cache variable unset, -dnl so AC_PATH_PROGS will keep looking. -ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" -])dnl - ;; -esac])dnl -$1="$ac_cv_path_$1" -if test -n "[$]$1"; then - AC_MSG_RESULT([$]$1) -else - AC_MSG_RESULT(no) -fi -AC_SUBST($1)dnl -]) - -# Check whether LC_MESSAGES is available in . -# Ulrich Drepper , 1995. -# -# This file can be copied and used freely without restrictions. It can -# be used in projects which are not available under the GNU Public License -# but which still want to provide support for the GNU gettext functionality. -# Please note that the actual code is *not* freely available. - -# serial 1 - -AC_DEFUN(AM_LC_MESSAGES, - [if test $ac_cv_header_locale_h = yes; then - AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES, - [AC_TRY_LINK([#include ], [return LC_MESSAGES], - am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)]) - if test $am_cv_val_LC_MESSAGES = yes; then - AC_DEFINE(HAVE_LC_MESSAGES) - fi - fi]) - diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/autogen.sh kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/autogen.sh --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/autogen.sh 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/autogen.sh 1970-01-01 00:00:00.000000000 +0000 @@ -1,148 +0,0 @@ -#!/bin/sh -# Run this to generate all the initial makefiles, etc. - -srcdir=`dirname $0` -PKG_NAME="the package." - -DIE=0 - -(autoconf --version) < /dev/null > /dev/null 2>&1 || { - echo - echo "**Error**: You must have \`autoconf' installed to." - echo "Download the appropriate package for your distribution," - echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" - DIE=1 -} - -(grep "^AM_PROG_LIBTOOL" $srcdir/configure.in >/dev/null) && { - (libtool --version) < /dev/null > /dev/null 2>&1 || { - echo - echo "**Error**: You must have \`libtool' installed." - echo "Get ftp://ftp.gnu.org/pub/gnu/libtool-1.2d.tar.gz" - echo "(or a newer version if it is available)" - DIE=1 - } -} - -grep "^AM_GNU_GETTEXT" $srcdir/configure.in >/dev/null && { - grep "sed.*POTFILES" $srcdir/configure.in >/dev/null || \ - (gettext --version) < /dev/null > /dev/null 2>&1 || { - echo - echo "**Error**: You must have \`gettext' installed." - echo "Get ftp://alpha.gnu.org/gnu/gettext-0.10.35.tar.gz" - echo "(or a newer version if it is available)" - DIE=1 - } -} - -grep "^AM_GNOME_GETTEXT" $srcdir/configure.in >/dev/null && { - grep "sed.*POTFILES" $srcdir/configure.in >/dev/null || \ - (gettext --version) < /dev/null > /dev/null 2>&1 || { - echo - echo "**Error**: You must have \`gettext' installed." - echo "Get ftp://alpha.gnu.org/gnu/gettext-0.10.35.tar.gz" - echo "(or a newer version if it is available)" - DIE=1 - } -} - -(automake --version) < /dev/null > /dev/null 2>&1 || { - echo - echo "**Error**: You must have \`automake' installed." - echo "Get ftp://ftp.gnu.org/pub/gnu/automake-1.3.tar.gz" - echo "(or a newer version if it is available)" - DIE=1 - NO_AUTOMAKE=yes -} - - -# if no automake, don't bother testing for aclocal -test -n "$NO_AUTOMAKE" || (aclocal --version) < /dev/null > /dev/null 2>&1 || { - echo - echo "**Error**: Missing \`aclocal'. The version of \`automake'" - echo "installed doesn't appear recent enough." - echo "Get ftp://ftp.gnu.org/pub/gnu/automake-1.3.tar.gz" - echo "(or a newer version if it is available)" - DIE=1 -} - -if test "$DIE" -eq 1; then - exit 1 -fi - -if test -z "$*"; then - echo "**Warning**: I am going to run \`configure' with no arguments." - echo "If you wish to pass any to it, please specify them on the" - echo \`$0\'" command line." - echo -fi - -case $CC in -xlc ) - am_opt=--include-deps;; -esac - -for coin in `find $srcdir -name configure.in -print` -do - dr=`dirname $coin` - if test -f $dr/NO-AUTO-GEN; then - echo skipping $dr -- flagged as no auto-gen - else - echo processing $dr - macrodirs=`sed -n -e 's,AM_ACLOCAL_INCLUDE(\(.*\)),\1,gp' < $coin` - ( cd $dr - aclocalinclude="$ACLOCAL_FLAGS" - for k in $macrodirs; do - if test -d $k; then - aclocalinclude="$aclocalinclude -I $k" - ##else - ## echo "**Warning**: No such directory \`$k'. Ignored." - fi - done - if grep "^AM_GNU_GETTEXT" configure.in >/dev/null; then - if grep "sed.*POTFILES" configure.in >/dev/null; then - : do nothing -- we still have an old unmodified configure.in - else - echo "Creating $dr/aclocal.m4 ..." - test -r $dr/aclocal.m4 || touch $dr/aclocal.m4 - echo "Running gettextize... Ignore non-fatal messages." - echo "no" | gettextize --force --copy - echo "Making $dr/aclocal.m4 writable ..." - test -r $dr/aclocal.m4 && chmod u+w $dr/aclocal.m4 - fi - fi - if grep "^AM_GNOME_GETTEXT" configure.in >/dev/null; then - echo "Creating $dr/aclocal.m4 ..." - test -r $dr/aclocal.m4 || touch $dr/aclocal.m4 - echo "Running gettextize... Ignore non-fatal messages." - echo "no" | gettextize --force --copy - echo "Making $dr/aclocal.m4 writable ..." - test -r $dr/aclocal.m4 && chmod u+w $dr/aclocal.m4 - fi - if grep "^AM_PROG_LIBTOOL" configure.in >/dev/null; then - echo "Running libtoolize..." - libtoolize --force --copy - fi - echo "Running aclocal $aclocalinclude ..." - aclocal $aclocalinclude - if grep "^AM_CONFIG_HEADER" configure.in >/dev/null; then - echo "Running autoheader..." - autoheader - fi - echo "Running automake --gnu $am_opt ..." - automake --add-missing --gnu $am_opt - echo "Running autoconf ..." - autoconf - ) - fi -done - -#conf_flags="--enable-maintainer-mode --enable-compile-warnings" #--enable-iso-c - -if test x$NOCONFIGURE = x; then - echo Running $srcdir/configure $conf_flags "$@" ... - $srcdir/configure $conf_flags "$@" \ - && echo Now type \`make\' to compile $PKG_NAME -else - echo Skipping configure process. -fi diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/config.h.in kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/config.h.in --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/config.h.in 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/config.h.in 1970-01-01 00:00:00.000000000 +0000 @@ -1,134 +0,0 @@ -/* config.h.in. Generated automatically from configure.in by autoheader. */ - -/* Define if using alloca.c. */ -#undef C_ALLOCA - -/* Define to empty if the keyword does not work. */ -#undef const - -/* Define to one of _getb67, GETB67, getb67 for Cray-2 and Cray-YMP systems. - This function is required for alloca.c support on those systems. */ -#undef CRAY_STACKSEG_END - -/* Define if you have alloca, as a function or macro. */ -#undef HAVE_ALLOCA - -/* Define if you have and it should be used (not on Ultrix). */ -#undef HAVE_ALLOCA_H - -/* Define if you have a working `mmap' system call. */ -#undef HAVE_MMAP - -/* Define as __inline if that's what the C compiler calls it. */ -#undef inline - -/* Define to `long' if doesn't define. */ -#undef off_t - -/* Define if you need to in order for stat and other things to work. */ -#undef _POSIX_SOURCE - -/* Define to `unsigned' if doesn't define. */ -#undef size_t - -/* If using the C implementation of alloca, define if you know the - direction of stack growth for your system; otherwise it will be - automatically deduced at run-time. - STACK_DIRECTION > 0 => grows toward higher addresses - STACK_DIRECTION < 0 => grows toward lower addresses - STACK_DIRECTION = 0 => direction of growth unknown - */ -#undef STACK_DIRECTION - -/* Define if you have the ANSI C header files. */ -#undef STDC_HEADERS - -/* Define if your processor stores words with the most significant - byte first (like Motorola and SPARC, unlike Intel and VAX). */ -#undef WORDS_BIGENDIAN - -#undef ENABLE_NLS -#undef HAVE_CATGETS -#undef HAVE_GETTEXT -#undef HAVE_LC_MESSAGES -#undef HAVE_STPCPY -#undef HAVE_LIBSM -#undef PACKAGE_LOCALE_DIR -#undef PACKAGE_DATA_DIR -#undef PACKAGE_SOURCE_DIR - -/* Define if you have the __argz_count function. */ -#undef HAVE___ARGZ_COUNT - -/* Define if you have the __argz_next function. */ -#undef HAVE___ARGZ_NEXT - -/* Define if you have the __argz_stringify function. */ -#undef HAVE___ARGZ_STRINGIFY - -/* Define if you have the dcgettext function. */ -#undef HAVE_DCGETTEXT - -/* Define if you have the getcwd function. */ -#undef HAVE_GETCWD - -/* Define if you have the getpagesize function. */ -#undef HAVE_GETPAGESIZE - -/* Define if you have the munmap function. */ -#undef HAVE_MUNMAP - -/* Define if you have the putenv function. */ -#undef HAVE_PUTENV - -/* Define if you have the setenv function. */ -#undef HAVE_SETENV - -/* Define if you have the setlocale function. */ -#undef HAVE_SETLOCALE - -/* Define if you have the stpcpy function. */ -#undef HAVE_STPCPY - -/* Define if you have the strcasecmp function. */ -#undef HAVE_STRCASECMP - -/* Define if you have the strchr function. */ -#undef HAVE_STRCHR - -/* Define if you have the strdup function. */ -#undef HAVE_STRDUP - -/* Define if you have the header file. */ -#undef HAVE_ARGZ_H - -/* Define if you have the header file. */ -#undef HAVE_LIMITS_H - -/* Define if you have the header file. */ -#undef HAVE_LOCALE_H - -/* Define if you have the header file. */ -#undef HAVE_MALLOC_H - -/* Define if you have the header file. */ -#undef HAVE_NL_TYPES_H - -/* Define if you have the header file. */ -#undef HAVE_STRING_H - -/* Define if you have the header file. */ -#undef HAVE_SYS_PARAM_H - -/* Define if you have the header file. */ -#undef HAVE_UNISTD_H - -/* Define if you have the i library (-li). */ -#undef HAVE_LIBI - -/* Name of package */ -#undef PACKAGE - -/* Version number of package */ -#undef VERSION - diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/configure kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/configure --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/configure 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/configure 1970-01-01 00:00:00.000000000 +0000 @@ -1,4206 +0,0 @@ -#! /bin/sh - -# Guess values for system-dependent variables and create Makefiles. -# Generated automatically using autoconf version 2.13 -# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc. -# -# This configure script is free software; the Free Software Foundation -# gives unlimited permission to copy, distribute and modify it. - -# Defaults: -ac_help= -ac_default_prefix=/usr/local -# Any additions from configure.in: -ac_help="$ac_help - --with-gtk-prefix=PFX Prefix where GTK is installed (optional)" -ac_help="$ac_help - --with-gtk-exec-prefix=PFX Exec prefix where GTK is installed (optional)" -ac_help="$ac_help - --disable-gtktest Do not try to compile and run a test GTK program" -ac_help="$ac_help - --disable-nls do not use Native Language Support" -ac_help="$ac_help - --with-included-gettext use the GNU gettext library included here" -ac_help="$ac_help - --with-catgets use catgets functions if available" - -# Initialize some variables set by options. -# The variables have the same names as the options, with -# dashes changed to underlines. -build=NONE -cache_file=./config.cache -exec_prefix=NONE -host=NONE -no_create= -nonopt=NONE -no_recursion= -prefix=NONE -program_prefix=NONE -program_suffix=NONE -program_transform_name=s,x,x, -silent= -site= -srcdir= -target=NONE -verbose= -x_includes=NONE -x_libraries=NONE -bindir='${exec_prefix}/bin' -sbindir='${exec_prefix}/sbin' -libexecdir='${exec_prefix}/libexec' -datadir='${prefix}/share' -sysconfdir='${prefix}/etc' -sharedstatedir='${prefix}/com' -localstatedir='${prefix}/var' -libdir='${exec_prefix}/lib' -includedir='${prefix}/include' -oldincludedir='/usr/include' -infodir='${prefix}/info' -mandir='${prefix}/man' - -# Initialize some other variables. -subdirs= -MFLAGS= MAKEFLAGS= -SHELL=${CONFIG_SHELL-/bin/sh} -# Maximum number of lines to put in a shell here document. -ac_max_here_lines=12 - -ac_prev= -for ac_option -do - - # If the previous option needs an argument, assign it. - if test -n "$ac_prev"; then - eval "$ac_prev=\$ac_option" - ac_prev= - continue - fi - - case "$ac_option" in - -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; - *) ac_optarg= ;; - esac - - # Accept the important Cygnus configure options, so we can diagnose typos. - - case "$ac_option" in - - -bindir | --bindir | --bindi | --bind | --bin | --bi) - ac_prev=bindir ;; - -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) - bindir="$ac_optarg" ;; - - -build | --build | --buil | --bui | --bu) - ac_prev=build ;; - -build=* | --build=* | --buil=* | --bui=* | --bu=*) - build="$ac_optarg" ;; - - -cache-file | --cache-file | --cache-fil | --cache-fi \ - | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) - ac_prev=cache_file ;; - -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ - | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) - cache_file="$ac_optarg" ;; - - -datadir | --datadir | --datadi | --datad | --data | --dat | --da) - ac_prev=datadir ;; - -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ - | --da=*) - datadir="$ac_optarg" ;; - - -disable-* | --disable-*) - ac_feature=`echo $ac_option|sed -e 's/-*disable-//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then - { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } - fi - ac_feature=`echo $ac_feature| sed 's/-/_/g'` - eval "enable_${ac_feature}=no" ;; - - -enable-* | --enable-*) - ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then - { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } - fi - ac_feature=`echo $ac_feature| sed 's/-/_/g'` - case "$ac_option" in - *=*) ;; - *) ac_optarg=yes ;; - esac - eval "enable_${ac_feature}='$ac_optarg'" ;; - - -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ - | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ - | --exec | --exe | --ex) - ac_prev=exec_prefix ;; - -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ - | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ - | --exec=* | --exe=* | --ex=*) - exec_prefix="$ac_optarg" ;; - - -gas | --gas | --ga | --g) - # Obsolete; use --with-gas. - with_gas=yes ;; - - -help | --help | --hel | --he) - # Omit some internal or obsolete options to make the list less imposing. - # This message is too long to be a string in the A/UX 3.1 sh. - cat << EOF -Usage: configure [options] [host] -Options: [defaults in brackets after descriptions] -Configuration: - --cache-file=FILE cache test results in FILE - --help print this message - --no-create do not create output files - --quiet, --silent do not print \`checking...' messages - --version print the version of autoconf that created configure -Directory and file names: - --prefix=PREFIX install architecture-independent files in PREFIX - [$ac_default_prefix] - --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX - [same as prefix] - --bindir=DIR user executables in DIR [EPREFIX/bin] - --sbindir=DIR system admin executables in DIR [EPREFIX/sbin] - --libexecdir=DIR program executables in DIR [EPREFIX/libexec] - --datadir=DIR read-only architecture-independent data in DIR - [PREFIX/share] - --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc] - --sharedstatedir=DIR modifiable architecture-independent data in DIR - [PREFIX/com] - --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var] - --libdir=DIR object code libraries in DIR [EPREFIX/lib] - --includedir=DIR C header files in DIR [PREFIX/include] - --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include] - --infodir=DIR info documentation in DIR [PREFIX/info] - --mandir=DIR man documentation in DIR [PREFIX/man] - --srcdir=DIR find the sources in DIR [configure dir or ..] - --program-prefix=PREFIX prepend PREFIX to installed program names - --program-suffix=SUFFIX append SUFFIX to installed program names - --program-transform-name=PROGRAM - run sed PROGRAM on installed program names -EOF - cat << EOF -Host type: - --build=BUILD configure for building on BUILD [BUILD=HOST] - --host=HOST configure for HOST [guessed] - --target=TARGET configure for TARGET [TARGET=HOST] -Features and packages: - --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) - --enable-FEATURE[=ARG] include FEATURE [ARG=yes] - --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] - --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) - --x-includes=DIR X include files are in DIR - --x-libraries=DIR X library files are in DIR -EOF - if test -n "$ac_help"; then - echo "--enable and --with options recognized:$ac_help" - fi - exit 0 ;; - - -host | --host | --hos | --ho) - ac_prev=host ;; - -host=* | --host=* | --hos=* | --ho=*) - host="$ac_optarg" ;; - - -includedir | --includedir | --includedi | --included | --include \ - | --includ | --inclu | --incl | --inc) - ac_prev=includedir ;; - -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ - | --includ=* | --inclu=* | --incl=* | --inc=*) - includedir="$ac_optarg" ;; - - -infodir | --infodir | --infodi | --infod | --info | --inf) - ac_prev=infodir ;; - -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) - infodir="$ac_optarg" ;; - - -libdir | --libdir | --libdi | --libd) - ac_prev=libdir ;; - -libdir=* | --libdir=* | --libdi=* | --libd=*) - libdir="$ac_optarg" ;; - - -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ - | --libexe | --libex | --libe) - ac_prev=libexecdir ;; - -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ - | --libexe=* | --libex=* | --libe=*) - libexecdir="$ac_optarg" ;; - - -localstatedir | --localstatedir | --localstatedi | --localstated \ - | --localstate | --localstat | --localsta | --localst \ - | --locals | --local | --loca | --loc | --lo) - ac_prev=localstatedir ;; - -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ - | --localstate=* | --localstat=* | --localsta=* | --localst=* \ - | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) - localstatedir="$ac_optarg" ;; - - -mandir | --mandir | --mandi | --mand | --man | --ma | --m) - ac_prev=mandir ;; - -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) - mandir="$ac_optarg" ;; - - -nfp | --nfp | --nf) - # Obsolete; use --without-fp. - with_fp=no ;; - - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c) - no_create=yes ;; - - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) - no_recursion=yes ;; - - -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ - | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ - | --oldin | --oldi | --old | --ol | --o) - ac_prev=oldincludedir ;; - -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ - | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ - | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) - oldincludedir="$ac_optarg" ;; - - -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) - ac_prev=prefix ;; - -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) - prefix="$ac_optarg" ;; - - -program-prefix | --program-prefix | --program-prefi | --program-pref \ - | --program-pre | --program-pr | --program-p) - ac_prev=program_prefix ;; - -program-prefix=* | --program-prefix=* | --program-prefi=* \ - | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) - program_prefix="$ac_optarg" ;; - - -program-suffix | --program-suffix | --program-suffi | --program-suff \ - | --program-suf | --program-su | --program-s) - ac_prev=program_suffix ;; - -program-suffix=* | --program-suffix=* | --program-suffi=* \ - | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) - program_suffix="$ac_optarg" ;; - - -program-transform-name | --program-transform-name \ - | --program-transform-nam | --program-transform-na \ - | --program-transform-n | --program-transform- \ - | --program-transform | --program-transfor \ - | --program-transfo | --program-transf \ - | --program-trans | --program-tran \ - | --progr-tra | --program-tr | --program-t) - ac_prev=program_transform_name ;; - -program-transform-name=* | --program-transform-name=* \ - | --program-transform-nam=* | --program-transform-na=* \ - | --program-transform-n=* | --program-transform-=* \ - | --program-transform=* | --program-transfor=* \ - | --program-transfo=* | --program-transf=* \ - | --program-trans=* | --program-tran=* \ - | --progr-tra=* | --program-tr=* | --program-t=*) - program_transform_name="$ac_optarg" ;; - - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - silent=yes ;; - - -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) - ac_prev=sbindir ;; - -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ - | --sbi=* | --sb=*) - sbindir="$ac_optarg" ;; - - -sharedstatedir | --sharedstatedir | --sharedstatedi \ - | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ - | --sharedst | --shareds | --shared | --share | --shar \ - | --sha | --sh) - ac_prev=sharedstatedir ;; - -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ - | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ - | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ - | --sha=* | --sh=*) - sharedstatedir="$ac_optarg" ;; - - -site | --site | --sit) - ac_prev=site ;; - -site=* | --site=* | --sit=*) - site="$ac_optarg" ;; - - -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) - ac_prev=srcdir ;; - -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) - srcdir="$ac_optarg" ;; - - -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ - | --syscon | --sysco | --sysc | --sys | --sy) - ac_prev=sysconfdir ;; - -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ - | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) - sysconfdir="$ac_optarg" ;; - - -target | --target | --targe | --targ | --tar | --ta | --t) - ac_prev=target ;; - -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) - target="$ac_optarg" ;; - - -v | -verbose | --verbose | --verbos | --verbo | --verb) - verbose=yes ;; - - -version | --version | --versio | --versi | --vers) - echo "configure generated by autoconf version 2.13" - exit 0 ;; - - -with-* | --with-*) - ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then - { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } - fi - ac_package=`echo $ac_package| sed 's/-/_/g'` - case "$ac_option" in - *=*) ;; - *) ac_optarg=yes ;; - esac - eval "with_${ac_package}='$ac_optarg'" ;; - - -without-* | --without-*) - ac_package=`echo $ac_option|sed -e 's/-*without-//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then - { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } - fi - ac_package=`echo $ac_package| sed 's/-/_/g'` - eval "with_${ac_package}=no" ;; - - --x) - # Obsolete; use --with-x. - with_x=yes ;; - - -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ - | --x-incl | --x-inc | --x-in | --x-i) - ac_prev=x_includes ;; - -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ - | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) - x_includes="$ac_optarg" ;; - - -x-libraries | --x-libraries | --x-librarie | --x-librari \ - | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) - ac_prev=x_libraries ;; - -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ - | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) - x_libraries="$ac_optarg" ;; - - -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; } - ;; - - *) - if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then - echo "configure: warning: $ac_option: invalid host type" 1>&2 - fi - if test "x$nonopt" != xNONE; then - { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } - fi - nonopt="$ac_option" - ;; - - esac -done - -if test -n "$ac_prev"; then - { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; } -fi - -trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 - -# File descriptor usage: -# 0 standard input -# 1 file creation -# 2 errors and warnings -# 3 some systems may open it to /dev/tty -# 4 used on the Kubota Titan -# 6 checking for... messages and results -# 5 compiler messages saved in config.log -if test "$silent" = yes; then - exec 6>/dev/null -else - exec 6>&1 -fi -exec 5>./config.log - -echo "\ -This file contains any messages produced by compilers while -running configure, to aid debugging if configure makes a mistake. -" 1>&5 - -# Strip out --no-create and --no-recursion so they do not pile up. -# Also quote any args containing shell metacharacters. -ac_configure_args= -for ac_arg -do - case "$ac_arg" in - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c) ;; - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;; - *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) - ac_configure_args="$ac_configure_args '$ac_arg'" ;; - *) ac_configure_args="$ac_configure_args $ac_arg" ;; - esac -done - -# NLS nuisances. -# Only set these to C if already set. These must not be set unconditionally -# because not all systems understand e.g. LANG=C (notably SCO). -# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'! -# Non-C LC_CTYPE values break the ctype check. -if test "${LANG+set}" = set; then LANG=C; export LANG; fi -if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi -if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi -if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi - -# confdefs.h avoids OS command line length limits that DEFS can exceed. -rm -rf conftest* confdefs.h -# AIX cpp loses on an empty file, so make sure it contains at least a newline. -echo > confdefs.h - -# A filename unique to this package, relative to the directory that -# configure is in, which we can look for to find out if srcdir is correct. -ac_unique_file=configure.in - -# Find the source files, if location was not specified. -if test -z "$srcdir"; then - ac_srcdir_defaulted=yes - # Try the directory containing this script, then its parent. - ac_prog=$0 - ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'` - test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. - srcdir=$ac_confdir - if test ! -r $srcdir/$ac_unique_file; then - srcdir=.. - fi -else - ac_srcdir_defaulted=no -fi -if test ! -r $srcdir/$ac_unique_file; then - if test "$ac_srcdir_defaulted" = yes; then - { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; } - else - { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; } - fi -fi -srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` - -# Prefer explicitly selected file to automatically selected ones. -if test -z "$CONFIG_SITE"; then - if test "x$prefix" != xNONE; then - CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" - else - CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" - fi -fi -for ac_site_file in $CONFIG_SITE; do - if test -r "$ac_site_file"; then - echo "loading site script $ac_site_file" - . "$ac_site_file" - fi -done - -if test -r "$cache_file"; then - echo "loading cache $cache_file" - . $cache_file -else - echo "creating cache $cache_file" - > $cache_file -fi - -ac_ext=c -# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. -ac_cpp='$CPP $CPPFLAGS' -ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' -ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' -cross_compiling=$ac_cv_prog_cc_cross - -ac_exeext= -ac_objext=o -if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then - # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. - if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then - ac_n= ac_c=' -' ac_t=' ' - else - ac_n=-n ac_c= ac_t= - fi -else - ac_n= ac_c='\c' ac_t= -fi - - -ac_aux_dir= -for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do - if test -f $ac_dir/install-sh; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install-sh -c" - break - elif test -f $ac_dir/install.sh; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install.sh -c" - break - fi -done -if test -z "$ac_aux_dir"; then - { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; } -fi -ac_config_guess=$ac_aux_dir/config.guess -ac_config_sub=$ac_aux_dir/config.sub -ac_configure=$ac_aux_dir/configure # This should be Cygnus configure. - -# Find a good install program. We prefer a C program (faster), -# so one script is as good as another. But avoid the broken or -# incompatible versions: -# SysV /etc/install, /usr/sbin/install -# SunOS /usr/etc/install -# IRIX /sbin/install -# AIX /bin/install -# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag -# AFS /usr/afsws/bin/install, which mishandles nonexistent args -# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" -# ./install, which can be erroneously created by make from ./install.sh. -echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 -echo "configure:568: checking for a BSD compatible install" >&5 -if test -z "$INSTALL"; then -if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS=":" - for ac_dir in $PATH; do - # Account for people who put trailing slashes in PATH elements. - case "$ac_dir/" in - /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;; - *) - # OSF1 and SCO ODT 3.0 have their own names for install. - # Don't use installbsd from OSF since it installs stuff as root - # by default. - for ac_prog in ginstall scoinst install; do - if test -f $ac_dir/$ac_prog; then - if test $ac_prog = install && - grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then - # AIX install. It has an incompatible calling convention. - : - else - ac_cv_path_install="$ac_dir/$ac_prog -c" - break 2 - fi - fi - done - ;; - esac - done - IFS="$ac_save_IFS" - -fi - if test "${ac_cv_path_install+set}" = set; then - INSTALL="$ac_cv_path_install" - else - # As a last resort, use the slow shell script. We don't cache a - # path for INSTALL within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the path is relative. - INSTALL="$ac_install_sh" - fi -fi -echo "$ac_t""$INSTALL" 1>&6 - -# Use test -z because SunOS4 sh mishandles braces in ${var-val}. -# It thinks the first close brace ends the variable substitution. -test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' - -test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}' - -test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' - -echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6 -echo "configure:621: checking whether build environment is sane" >&5 -# Just in case -sleep 1 -echo timestamp > conftestfile -# Do `set' in a subshell so we don't clobber the current shell's -# arguments. Must try -L first in case configure is actually a -# symlink; some systems play weird games with the mod time of symlinks -# (eg FreeBSD returns the mod time of the symlink's containing -# directory). -if ( - set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null` - if test "$*" = "X"; then - # -L didn't work. - set X `ls -t $srcdir/configure conftestfile` - fi - if test "$*" != "X $srcdir/configure conftestfile" \ - && test "$*" != "X conftestfile $srcdir/configure"; then - - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - { echo "configure: error: ls -t appears to fail. Make sure there is not a broken -alias in your environment" 1>&2; exit 1; } - fi - - test "$2" = conftestfile - ) -then - # Ok. - : -else - { echo "configure: error: newly created file is older than distributed files! -Check your system clock" 1>&2; exit 1; } -fi -rm -f conftest* -echo "$ac_t""yes" 1>&6 -if test "$program_transform_name" = s,x,x,; then - program_transform_name= -else - # Double any \ or $. echo might interpret backslashes. - cat <<\EOF_SED > conftestsed -s,\\,\\\\,g; s,\$,$$,g -EOF_SED - program_transform_name="`echo $program_transform_name|sed -f conftestsed`" - rm -f conftestsed -fi -test "$program_prefix" != NONE && - program_transform_name="s,^,${program_prefix},; $program_transform_name" -# Use a double $ so make ignores it. -test "$program_suffix" != NONE && - program_transform_name="s,\$\$,${program_suffix},; $program_transform_name" - -# sed with no file args requires a program. -test "$program_transform_name" = "" && program_transform_name="s,x,x," - -echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6 -echo "configure:678: checking whether ${MAKE-make} sets \${MAKE}" >&5 -set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'` -if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftestmake <<\EOF -all: - @echo 'ac_maketemp="${MAKE}"' -EOF -# GNU make sometimes prints "make[1]: Entering...", which would confuse us. -eval `${MAKE-make} -f conftestmake 2>/dev/null | grep temp=` -if test -n "$ac_maketemp"; then - eval ac_cv_prog_make_${ac_make}_set=yes -else - eval ac_cv_prog_make_${ac_make}_set=no -fi -rm -f conftestmake -fi -if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then - echo "$ac_t""yes" 1>&6 - SET_MAKE= -else - echo "$ac_t""no" 1>&6 - SET_MAKE="MAKE=${MAKE-make}" -fi - - - -PACKAGE=goom2 - -VERSION=0.1 - -if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then - { echo "configure: error: source directory already configured; run "make distclean" there first" 1>&2; exit 1; } -fi -cat >> confdefs.h <> confdefs.h <&6 -echo "configure:725: checking for working aclocal" >&5 -# Run test in a subshell; some versions of sh will print an error if -# an executable is not found, even if stderr is redirected. -# Redirect stdin to placate older versions of autoconf. Sigh. -if (aclocal --version) < /dev/null > /dev/null 2>&1; then - ACLOCAL=aclocal - echo "$ac_t""found" 1>&6 -else - ACLOCAL="$missing_dir/missing aclocal" - echo "$ac_t""missing" 1>&6 -fi - -echo $ac_n "checking for working autoconf""... $ac_c" 1>&6 -echo "configure:738: checking for working autoconf" >&5 -# Run test in a subshell; some versions of sh will print an error if -# an executable is not found, even if stderr is redirected. -# Redirect stdin to placate older versions of autoconf. Sigh. -if (autoconf --version) < /dev/null > /dev/null 2>&1; then - AUTOCONF=autoconf - echo "$ac_t""found" 1>&6 -else - AUTOCONF="$missing_dir/missing autoconf" - echo "$ac_t""missing" 1>&6 -fi - -echo $ac_n "checking for working automake""... $ac_c" 1>&6 -echo "configure:751: checking for working automake" >&5 -# Run test in a subshell; some versions of sh will print an error if -# an executable is not found, even if stderr is redirected. -# Redirect stdin to placate older versions of autoconf. Sigh. -if (automake --version) < /dev/null > /dev/null 2>&1; then - AUTOMAKE=automake - echo "$ac_t""found" 1>&6 -else - AUTOMAKE="$missing_dir/missing automake" - echo "$ac_t""missing" 1>&6 -fi - -echo $ac_n "checking for working autoheader""... $ac_c" 1>&6 -echo "configure:764: checking for working autoheader" >&5 -# Run test in a subshell; some versions of sh will print an error if -# an executable is not found, even if stderr is redirected. -# Redirect stdin to placate older versions of autoconf. Sigh. -if (autoheader --version) < /dev/null > /dev/null 2>&1; then - AUTOHEADER=autoheader - echo "$ac_t""found" 1>&6 -else - AUTOHEADER="$missing_dir/missing autoheader" - echo "$ac_t""missing" 1>&6 -fi - -echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6 -echo "configure:777: checking for working makeinfo" >&5 -# Run test in a subshell; some versions of sh will print an error if -# an executable is not found, even if stderr is redirected. -# Redirect stdin to placate older versions of autoconf. Sigh. -if (makeinfo --version) < /dev/null > /dev/null 2>&1; then - MAKEINFO=makeinfo - echo "$ac_t""found" 1>&6 -else - MAKEINFO="$missing_dir/missing makeinfo" - echo "$ac_t""missing" 1>&6 -fi - - - - - - -# Extract the first word of "gcc", so it can be a program name with args. -set dummy gcc; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:797: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_CC="gcc" - break - fi - done - IFS="$ac_save_ifs" -fi -fi -CC="$ac_cv_prog_CC" -if test -n "$CC"; then - echo "$ac_t""$CC" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -if test -z "$CC"; then - # Extract the first word of "cc", so it can be a program name with args. -set dummy cc; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:827: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_prog_rejected=no - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then - ac_prog_rejected=yes - continue - fi - ac_cv_prog_CC="cc" - break - fi - done - IFS="$ac_save_ifs" -if test $ac_prog_rejected = yes; then - # We found a bogon in the path, so make sure we never use it. - set dummy $ac_cv_prog_CC - shift - if test $# -gt 0; then - # We chose a different compiler from the bogus one. - # However, it has the same basename, so the bogon will be chosen - # first if we set CC to just the basename; use the full file name. - shift - set dummy "$ac_dir/$ac_word" "$@" - shift - ac_cv_prog_CC="$@" - fi -fi -fi -fi -CC="$ac_cv_prog_CC" -if test -n "$CC"; then - echo "$ac_t""$CC" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - if test -z "$CC"; then - case "`uname -s`" in - *win32* | *WIN32*) - # Extract the first word of "cl", so it can be a program name with args. -set dummy cl; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:878: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_CC="cl" - break - fi - done - IFS="$ac_save_ifs" -fi -fi -CC="$ac_cv_prog_CC" -if test -n "$CC"; then - echo "$ac_t""$CC" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - ;; - esac - fi - test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; } -fi - -echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 -echo "configure:910: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 - -ac_ext=c -# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. -ac_cpp='$CPP $CPPFLAGS' -ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' -ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' -cross_compiling=$ac_cv_prog_cc_cross - -cat > conftest.$ac_ext << EOF - -#line 921 "configure" -#include "confdefs.h" - -main(){return(0);} -EOF -if { (eval echo configure:926: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - ac_cv_prog_cc_works=yes - # If we can't run a trivial program, we are probably using a cross compiler. - if (./conftest; exit) 2>/dev/null; then - ac_cv_prog_cc_cross=no - else - ac_cv_prog_cc_cross=yes - fi -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - ac_cv_prog_cc_works=no -fi -rm -fr conftest* -ac_ext=c -# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. -ac_cpp='$CPP $CPPFLAGS' -ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' -ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' -cross_compiling=$ac_cv_prog_cc_cross - -echo "$ac_t""$ac_cv_prog_cc_works" 1>&6 -if test $ac_cv_prog_cc_works = no; then - { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } -fi -echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 -echo "configure:952: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 -echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 -cross_compiling=$ac_cv_prog_cc_cross - -echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 -echo "configure:957: checking whether we are using GNU C" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.c <&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then - ac_cv_prog_gcc=yes -else - ac_cv_prog_gcc=no -fi -fi - -echo "$ac_t""$ac_cv_prog_gcc" 1>&6 - -if test $ac_cv_prog_gcc = yes; then - GCC=yes -else - GCC= -fi - -ac_test_CFLAGS="${CFLAGS+set}" -ac_save_CFLAGS="$CFLAGS" -CFLAGS= -echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 -echo "configure:985: checking whether ${CC-cc} accepts -g" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - echo 'void f(){}' > conftest.c -if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then - ac_cv_prog_cc_g=yes -else - ac_cv_prog_cc_g=no -fi -rm -f conftest* - -fi - -echo "$ac_t""$ac_cv_prog_cc_g" 1>&6 -if test "$ac_test_CFLAGS" = set; then - CFLAGS="$ac_save_CFLAGS" -elif test $ac_cv_prog_cc_g = yes; then - if test "$GCC" = yes; then - CFLAGS="-g -O2" - else - CFLAGS="-g" - fi -else - if test "$GCC" = yes; then - CFLAGS="-O2" - else - CFLAGS= - fi -fi - -echo $ac_n "checking for POSIXized ISC""... $ac_c" 1>&6 -echo "configure:1017: checking for POSIXized ISC" >&5 -if test -d /etc/conf/kconfig.d && - grep _POSIX_VERSION /usr/include/sys/unistd.h >/dev/null 2>&1 -then - echo "$ac_t""yes" 1>&6 - ISC=yes # If later tests want to check for ISC. - cat >> confdefs.h <<\EOF -#define _POSIX_SOURCE 1 -EOF - - if test "$GCC" = yes; then - CC="$CC -posix" - else - CC="$CC -Xp" - fi -else - echo "$ac_t""no" 1>&6 - ISC= -fi - -# Extract the first word of "gcc", so it can be a program name with args. -set dummy gcc; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1040: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_CC="gcc" - break - fi - done - IFS="$ac_save_ifs" -fi -fi -CC="$ac_cv_prog_CC" -if test -n "$CC"; then - echo "$ac_t""$CC" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -if test -z "$CC"; then - # Extract the first word of "cc", so it can be a program name with args. -set dummy cc; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1070: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_prog_rejected=no - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then - ac_prog_rejected=yes - continue - fi - ac_cv_prog_CC="cc" - break - fi - done - IFS="$ac_save_ifs" -if test $ac_prog_rejected = yes; then - # We found a bogon in the path, so make sure we never use it. - set dummy $ac_cv_prog_CC - shift - if test $# -gt 0; then - # We chose a different compiler from the bogus one. - # However, it has the same basename, so the bogon will be chosen - # first if we set CC to just the basename; use the full file name. - shift - set dummy "$ac_dir/$ac_word" "$@" - shift - ac_cv_prog_CC="$@" - fi -fi -fi -fi -CC="$ac_cv_prog_CC" -if test -n "$CC"; then - echo "$ac_t""$CC" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - if test -z "$CC"; then - case "`uname -s`" in - *win32* | *WIN32*) - # Extract the first word of "cl", so it can be a program name with args. -set dummy cl; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1121: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_CC="cl" - break - fi - done - IFS="$ac_save_ifs" -fi -fi -CC="$ac_cv_prog_CC" -if test -n "$CC"; then - echo "$ac_t""$CC" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - ;; - esac - fi - test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; } -fi - -echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 -echo "configure:1153: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 - -ac_ext=c -# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. -ac_cpp='$CPP $CPPFLAGS' -ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' -ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' -cross_compiling=$ac_cv_prog_cc_cross - -cat > conftest.$ac_ext << EOF - -#line 1164 "configure" -#include "confdefs.h" - -main(){return(0);} -EOF -if { (eval echo configure:1169: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - ac_cv_prog_cc_works=yes - # If we can't run a trivial program, we are probably using a cross compiler. - if (./conftest; exit) 2>/dev/null; then - ac_cv_prog_cc_cross=no - else - ac_cv_prog_cc_cross=yes - fi -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - ac_cv_prog_cc_works=no -fi -rm -fr conftest* -ac_ext=c -# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. -ac_cpp='$CPP $CPPFLAGS' -ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' -ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' -cross_compiling=$ac_cv_prog_cc_cross - -echo "$ac_t""$ac_cv_prog_cc_works" 1>&6 -if test $ac_cv_prog_cc_works = no; then - { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } -fi -echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 -echo "configure:1195: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 -echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 -cross_compiling=$ac_cv_prog_cc_cross - -echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 -echo "configure:1200: checking whether we are using GNU C" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.c <&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then - ac_cv_prog_gcc=yes -else - ac_cv_prog_gcc=no -fi -fi - -echo "$ac_t""$ac_cv_prog_gcc" 1>&6 - -if test $ac_cv_prog_gcc = yes; then - GCC=yes -else - GCC= -fi - -ac_test_CFLAGS="${CFLAGS+set}" -ac_save_CFLAGS="$CFLAGS" -CFLAGS= -echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 -echo "configure:1228: checking whether ${CC-cc} accepts -g" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - echo 'void f(){}' > conftest.c -if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then - ac_cv_prog_cc_g=yes -else - ac_cv_prog_cc_g=no -fi -rm -f conftest* - -fi - -echo "$ac_t""$ac_cv_prog_cc_g" 1>&6 -if test "$ac_test_CFLAGS" = set; then - CFLAGS="$ac_save_CFLAGS" -elif test $ac_cv_prog_cc_g = yes; then - if test "$GCC" = yes; then - CFLAGS="-g -O2" - else - CFLAGS="-g" - fi -else - if test "$GCC" = yes; then - CFLAGS="-O2" - else - CFLAGS= - fi -fi - - - - -echo $ac_n "checking for ${CC-cc} option to accept ANSI C""... $ac_c" 1>&6 -echo "configure:1263: checking for ${CC-cc} option to accept ANSI C" >&5 -if eval "test \"`echo '$''{'am_cv_prog_cc_stdc'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - am_cv_prog_cc_stdc=no -ac_save_CC="$CC" -# Don't try gcc -ansi; that turns off useful extensions and -# breaks some systems' header files. -# AIX -qlanglvl=ansi -# Ultrix and OSF/1 -std1 -# HP-UX -Aa -D_HPUX_SOURCE -# SVR4 -Xc -D__EXTENSIONS__ -for ac_arg in "" -qlanglvl=ansi -std1 "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" -do - CC="$ac_save_CC $ac_arg" - cat > conftest.$ac_ext < -#include -#include -#include -/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ -struct buf { int x; }; -FILE * (*rcsopen) (struct buf *, struct stat *, int); -static char *e (p, i) - char **p; - int i; -{ - return p[i]; -} -static char *f (char * (*g) (char **, int), char **p, ...) -{ - char *s; - va_list v; - va_start (v,p); - s = g (p, va_arg (v,int)); - va_end (v); - return s; -} -int test (int i, double x); -struct s1 {int (*f) (int a);}; -struct s2 {int (*f) (double a);}; -int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); -int argc; -char **argv; - -int main() { - -return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; - -; return 0; } -EOF -if { (eval echo configure:1316: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then - rm -rf conftest* - am_cv_prog_cc_stdc="$ac_arg"; break -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 -fi -rm -f conftest* -done -CC="$ac_save_CC" - -fi - -if test -z "$am_cv_prog_cc_stdc"; then - echo "$ac_t""none needed" 1>&6 -else - echo "$ac_t""$am_cv_prog_cc_stdc" 1>&6 -fi -case "x$am_cv_prog_cc_stdc" in - x|xno) ;; - *) CC="$CC $am_cv_prog_cc_stdc" ;; -esac - -echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 -echo "configure:1340: checking how to run the C preprocessor" >&5 -# On Suns, sometimes $CPP names a directory. -if test -n "$CPP" && test -d "$CPP"; then - CPP= -fi -if test -z "$CPP"; then -if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - # This must be in double quotes, not single quotes, because CPP may get - # substituted into the Makefile and "${CC-cc}" will confuse make. - CPP="${CC-cc} -E" - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. - cat > conftest.$ac_ext < -Syntax Error -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1361: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` -if test -z "$ac_err"; then - : -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - CPP="${CC-cc} -E -traditional-cpp" - cat > conftest.$ac_ext < -Syntax Error -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1378: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` -if test -z "$ac_err"; then - : -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - CPP="${CC-cc} -nologo -E" - cat > conftest.$ac_ext < -Syntax Error -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1395: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` -if test -z "$ac_err"; then - : -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - CPP=/lib/cpp -fi -rm -f conftest* -fi -rm -f conftest* -fi -rm -f conftest* - ac_cv_prog_CPP="$CPP" -fi - CPP="$ac_cv_prog_CPP" -else - ac_cv_prog_CPP="$CPP" -fi -echo "$ac_t""$CPP" 1>&6 - -echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6 -echo "configure:1420: checking for ANSI C header files" >&5 -if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -#include -#include -#include -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1433: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` -if test -z "$ac_err"; then - rm -rf conftest* - ac_cv_header_stdc=yes -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - ac_cv_header_stdc=no -fi -rm -f conftest* - -if test $ac_cv_header_stdc = yes; then - # SunOS 4.x string.h does not declare mem*, contrary to ANSI. -cat > conftest.$ac_ext < -EOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - egrep "memchr" >/dev/null 2>&1; then - : -else - rm -rf conftest* - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. -cat > conftest.$ac_ext < -EOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - egrep "free" >/dev/null 2>&1; then - : -else - rm -rf conftest* - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. -if test "$cross_compiling" = yes; then - : -else - cat > conftest.$ac_ext < -#define ISLOWER(c) ('a' <= (c) && (c) <= 'z') -#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) -#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) -int main () { int i; for (i = 0; i < 256; i++) -if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); -exit (0); } - -EOF -if { (eval echo configure:1500: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null -then - : -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -fr conftest* - ac_cv_header_stdc=no -fi -rm -fr conftest* -fi - -fi -fi - -echo "$ac_t""$ac_cv_header_stdc" 1>&6 -if test $ac_cv_header_stdc = yes; then - cat >> confdefs.h <<\EOF -#define STDC_HEADERS 1 -EOF - -fi - -echo $ac_n "checking whether byte ordering is bigendian""... $ac_c" 1>&6 -echo "configure:1524: checking whether byte ordering is bigendian" >&5 -if eval "test \"`echo '$''{'ac_cv_c_bigendian'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_cv_c_bigendian=unknown -# See if sys/param.h defines the BYTE_ORDER macro. -cat > conftest.$ac_ext < -#include -int main() { - -#if !BYTE_ORDER || !BIG_ENDIAN || !LITTLE_ENDIAN - bogus endian macros -#endif -; return 0; } -EOF -if { (eval echo configure:1542: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then - rm -rf conftest* - # It does; now see whether it defined to BIG_ENDIAN or not. -cat > conftest.$ac_ext < -#include -int main() { - -#if BYTE_ORDER != BIG_ENDIAN - not big endian -#endif -; return 0; } -EOF -if { (eval echo configure:1557: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then - rm -rf conftest* - ac_cv_c_bigendian=yes -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - ac_cv_c_bigendian=no -fi -rm -f conftest* -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 -fi -rm -f conftest* -if test $ac_cv_c_bigendian = unknown; then -if test "$cross_compiling" = yes; then - { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; } -else - cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null -then - ac_cv_c_bigendian=no -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -fr conftest* - ac_cv_c_bigendian=yes -fi -rm -fr conftest* -fi - -fi -fi - -echo "$ac_t""$ac_cv_c_bigendian" 1>&6 -if test $ac_cv_c_bigendian = yes; then - cat >> confdefs.h <<\EOF -#define WORDS_BIGENDIAN 1 -EOF - -fi - - - -# Check whether --with-gtk-prefix or --without-gtk-prefix was given. -if test "${with_gtk_prefix+set}" = set; then - withval="$with_gtk_prefix" - gtk_config_prefix="$withval" -else - gtk_config_prefix="" -fi - -# Check whether --with-gtk-exec-prefix or --without-gtk-exec-prefix was given. -if test "${with_gtk_exec_prefix+set}" = set; then - withval="$with_gtk_exec_prefix" - gtk_config_exec_prefix="$withval" -else - gtk_config_exec_prefix="" -fi - -# Check whether --enable-gtktest or --disable-gtktest was given. -if test "${enable_gtktest+set}" = set; then - enableval="$enable_gtktest" - : -else - enable_gtktest=yes -fi - - - for module in . - do - case "$module" in - gthread) - gtk_config_args="$gtk_config_args gthread" - ;; - esac - done - - if test x$gtk_config_exec_prefix != x ; then - gtk_config_args="$gtk_config_args --exec-prefix=$gtk_config_exec_prefix" - if test x${GTK_CONFIG+set} != xset ; then - GTK_CONFIG=$gtk_config_exec_prefix/bin/gtk-config - fi - fi - if test x$gtk_config_prefix != x ; then - gtk_config_args="$gtk_config_args --prefix=$gtk_config_prefix" - if test x${GTK_CONFIG+set} != xset ; then - GTK_CONFIG=$gtk_config_prefix/bin/gtk-config - fi - fi - - # Extract the first word of "gtk-config", so it can be a program name with args. -set dummy gtk-config; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1665: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_path_GTK_CONFIG'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - case "$GTK_CONFIG" in - /*) - ac_cv_path_GTK_CONFIG="$GTK_CONFIG" # Let the user override the test with a path. - ;; - ?:/*) - ac_cv_path_GTK_CONFIG="$GTK_CONFIG" # Let the user override the test with a dos path. - ;; - *) - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_path_GTK_CONFIG="$ac_dir/$ac_word" - break - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_path_GTK_CONFIG" && ac_cv_path_GTK_CONFIG="no" - ;; -esac -fi -GTK_CONFIG="$ac_cv_path_GTK_CONFIG" -if test -n "$GTK_CONFIG"; then - echo "$ac_t""$GTK_CONFIG" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - min_gtk_version=1.2.0 - echo $ac_n "checking for GTK - version >= $min_gtk_version""... $ac_c" 1>&6 -echo "configure:1700: checking for GTK - version >= $min_gtk_version" >&5 - no_gtk="" - if test "$GTK_CONFIG" = "no" ; then - no_gtk=yes - else - GTK_CFLAGS=`$GTK_CONFIG $gtk_config_args --cflags` - GTK_LIBS=`$GTK_CONFIG $gtk_config_args --libs` - gtk_config_major_version=`$GTK_CONFIG $gtk_config_args --version | \ - sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'` - gtk_config_minor_version=`$GTK_CONFIG $gtk_config_args --version | \ - sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'` - gtk_config_micro_version=`$GTK_CONFIG $gtk_config_args --version | \ - sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'` - if test "x$enable_gtktest" = "xyes" ; then - ac_save_CFLAGS="$CFLAGS" - ac_save_LIBS="$LIBS" - CFLAGS="$CFLAGS $GTK_CFLAGS" - LIBS="$GTK_LIBS $LIBS" - rm -f conf.gtktest - if test "$cross_compiling" = yes; then - echo $ac_n "cross compiling; assumed OK... $ac_c" -else - cat > conftest.$ac_ext < -#include -#include - -int -main () -{ - int major, minor, micro; - char *tmp_version; - - system ("touch conf.gtktest"); - - /* HP/UX 9 (%@#!) writes to sscanf strings */ - tmp_version = g_strdup("$min_gtk_version"); - if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { - printf("%s, bad version string\n", "$min_gtk_version"); - exit(1); - } - - if ((gtk_major_version != $gtk_config_major_version) || - (gtk_minor_version != $gtk_config_minor_version) || - (gtk_micro_version != $gtk_config_micro_version)) - { - printf("\n*** 'gtk-config --version' returned %d.%d.%d, but GTK+ (%d.%d.%d)\n", - $gtk_config_major_version, $gtk_config_minor_version, $gtk_config_micro_version, - gtk_major_version, gtk_minor_version, gtk_micro_version); - printf ("*** was found! If gtk-config was correct, then it is best\n"); - printf ("*** to remove the old version of GTK+. You may also be able to fix the error\n"); - printf("*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing\n"); - printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n"); - printf("*** required on your system.\n"); - printf("*** If gtk-config was wrong, set the environment variable GTK_CONFIG\n"); - printf("*** to point to the correct copy of gtk-config, and remove the file config.cache\n"); - printf("*** before re-running configure\n"); - } -#if defined (GTK_MAJOR_VERSION) && defined (GTK_MINOR_VERSION) && defined (GTK_MICRO_VERSION) - else if ((gtk_major_version != GTK_MAJOR_VERSION) || - (gtk_minor_version != GTK_MINOR_VERSION) || - (gtk_micro_version != GTK_MICRO_VERSION)) - { - printf("*** GTK+ header files (version %d.%d.%d) do not match\n", - GTK_MAJOR_VERSION, GTK_MINOR_VERSION, GTK_MICRO_VERSION); - printf("*** library (version %d.%d.%d)\n", - gtk_major_version, gtk_minor_version, gtk_micro_version); - } -#endif /* defined (GTK_MAJOR_VERSION) ... */ - else - { - if ((gtk_major_version > major) || - ((gtk_major_version == major) && (gtk_minor_version > minor)) || - ((gtk_major_version == major) && (gtk_minor_version == minor) && (gtk_micro_version >= micro))) - { - return 0; - } - else - { - printf("\n*** An old version of GTK+ (%d.%d.%d) was found.\n", - gtk_major_version, gtk_minor_version, gtk_micro_version); - printf("*** You need a version of GTK+ newer than %d.%d.%d. The latest version of\n", - major, minor, micro); - printf("*** GTK+ is always available from ftp://ftp.gtk.org.\n"); - printf("***\n"); - printf("*** If you have already installed a sufficiently new version, this error\n"); - printf("*** probably means that the wrong copy of the gtk-config shell script is\n"); - printf("*** being found. The easiest way to fix this is to remove the old version\n"); - printf("*** of GTK+, but you can also set the GTK_CONFIG environment to point to the\n"); - printf("*** correct copy of gtk-config. (In this case, you will have to\n"); - printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n"); - printf("*** so that the correct libraries are found at run-time))\n"); - } - } - return 1; -} - -EOF -if { (eval echo configure:1801: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null -then - : -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -fr conftest* - no_gtk=yes -fi -rm -fr conftest* -fi - - CFLAGS="$ac_save_CFLAGS" - LIBS="$ac_save_LIBS" - fi - fi - if test "x$no_gtk" = x ; then - echo "$ac_t""yes" 1>&6 - : - else - echo "$ac_t""no" 1>&6 - if test "$GTK_CONFIG" = "no" ; then - echo "*** The gtk-config script installed by GTK could not be found" - echo "*** If GTK was installed in PREFIX, make sure PREFIX/bin is in" - echo "*** your path, or set the GTK_CONFIG environment variable to the" - echo "*** full path to gtk-config." - else - if test -f conf.gtktest ; then - : - else - echo "*** Could not run GTK test program, checking why..." - CFLAGS="$CFLAGS $GTK_CFLAGS" - LIBS="$LIBS $GTK_LIBS" - cat > conftest.$ac_ext < -#include - -int main() { - return ((gtk_major_version) || (gtk_minor_version) || (gtk_micro_version)); -; return 0; } -EOF -if { (eval echo configure:1845: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - echo "*** The test program compiled, but did not run. This usually means" - echo "*** that the run-time linker is not finding GTK or finding the wrong" - echo "*** version of GTK. If it is not finding GTK, you'll need to set your" - echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" - echo "*** to the installed location Also, make sure you have run ldconfig if that" - echo "*** is required on your system" - echo "***" - echo "*** If you have an old version installed, it is best to remove it, although" - echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH" - echo "***" - echo "*** If you have a RedHat 5.0 system, you should remove the GTK package that" - echo "*** came with the system with the command" - echo "***" - echo "*** rpm --erase --nodeps gtk gtk-devel" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - echo "*** The test program failed to compile or link. See the file config.log for the" - echo "*** exact error that occured. This usually means GTK was incorrectly installed" - echo "*** or that you have moved GTK since it was installed. In the latter case, you" - echo "*** may want to edit the gtk-config script: $GTK_CONFIG" -fi -rm -f conftest* - CFLAGS="$ac_save_CFLAGS" - LIBS="$ac_save_LIBS" - fi - fi - GTK_CFLAGS="" - GTK_LIBS="" - { echo "configure: error: Cannot find GTK: Is gtk-config in path?" 1>&2; exit 1; } - fi - - - rm -f conf.gtktest - - -ALL_LINGUAS="" -# Extract the first word of "ranlib", so it can be a program name with args. -set dummy ranlib; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1888: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$RANLIB"; then - ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_RANLIB="ranlib" - break - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":" -fi -fi -RANLIB="$ac_cv_prog_RANLIB" -if test -n "$RANLIB"; then - echo "$ac_t""$RANLIB" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -echo $ac_n "checking for working const""... $ac_c" 1>&6 -echo "configure:1916: checking for working const" >&5 -if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <j = 5; -} -{ /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ - const int foo = 10; -} - -; return 0; } -EOF -if { (eval echo configure:1970: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then - rm -rf conftest* - ac_cv_c_const=yes -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - ac_cv_c_const=no -fi -rm -f conftest* -fi - -echo "$ac_t""$ac_cv_c_const" 1>&6 -if test $ac_cv_c_const = no; then - cat >> confdefs.h <<\EOF -#define const -EOF - -fi - -echo $ac_n "checking for inline""... $ac_c" 1>&6 -echo "configure:1991: checking for inline" >&5 -if eval "test \"`echo '$''{'ac_cv_c_inline'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_cv_c_inline=no -for ac_kw in inline __inline__ __inline; do - cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then - rm -rf conftest* - ac_cv_c_inline=$ac_kw; break -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 -fi -rm -f conftest* -done - -fi - -echo "$ac_t""$ac_cv_c_inline" 1>&6 -case "$ac_cv_c_inline" in - inline | yes) ;; - no) cat >> confdefs.h <<\EOF -#define inline -EOF - ;; - *) cat >> confdefs.h <&6 -echo "configure:2031: checking for off_t" >&5 -if eval "test \"`echo '$''{'ac_cv_type_off_t'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -#if STDC_HEADERS -#include -#include -#endif -EOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - egrep "(^|[^a-zA-Z_0-9])off_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then - rm -rf conftest* - ac_cv_type_off_t=yes -else - rm -rf conftest* - ac_cv_type_off_t=no -fi -rm -f conftest* - -fi -echo "$ac_t""$ac_cv_type_off_t" 1>&6 -if test $ac_cv_type_off_t = no; then - cat >> confdefs.h <<\EOF -#define off_t long -EOF - -fi - -echo $ac_n "checking for size_t""... $ac_c" 1>&6 -echo "configure:2064: checking for size_t" >&5 -if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -#if STDC_HEADERS -#include -#include -#endif -EOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - egrep "(^|[^a-zA-Z_0-9])size_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then - rm -rf conftest* - ac_cv_type_size_t=yes -else - rm -rf conftest* - ac_cv_type_size_t=no -fi -rm -f conftest* - -fi -echo "$ac_t""$ac_cv_type_size_t" 1>&6 -if test $ac_cv_type_size_t = no; then - cat >> confdefs.h <<\EOF -#define size_t unsigned -EOF - -fi - -# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works -# for constant arguments. Useless! -echo $ac_n "checking for working alloca.h""... $ac_c" 1>&6 -echo "configure:2099: checking for working alloca.h" >&5 -if eval "test \"`echo '$''{'ac_cv_header_alloca_h'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -int main() { -char *p = alloca(2 * sizeof(int)); -; return 0; } -EOF -if { (eval echo configure:2111: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - ac_cv_header_alloca_h=yes -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - ac_cv_header_alloca_h=no -fi -rm -f conftest* -fi - -echo "$ac_t""$ac_cv_header_alloca_h" 1>&6 -if test $ac_cv_header_alloca_h = yes; then - cat >> confdefs.h <<\EOF -#define HAVE_ALLOCA_H 1 -EOF - -fi - -echo $ac_n "checking for alloca""... $ac_c" 1>&6 -echo "configure:2132: checking for alloca" >&5 -if eval "test \"`echo '$''{'ac_cv_func_alloca_works'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -# define alloca _alloca -# else -# if HAVE_ALLOCA_H -# include -# else -# ifdef _AIX - #pragma alloca -# else -# ifndef alloca /* predefined by HP cc +Olibcalls */ -char *alloca (); -# endif -# endif -# endif -# endif -#endif - -int main() { -char *p = (char *) alloca(1); -; return 0; } -EOF -if { (eval echo configure:2165: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - ac_cv_func_alloca_works=yes -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - ac_cv_func_alloca_works=no -fi -rm -f conftest* -fi - -echo "$ac_t""$ac_cv_func_alloca_works" 1>&6 -if test $ac_cv_func_alloca_works = yes; then - cat >> confdefs.h <<\EOF -#define HAVE_ALLOCA 1 -EOF - -fi - -if test $ac_cv_func_alloca_works = no; then - # The SVR3 libPW and SVR4 libucb both contain incompatible functions - # that cause trouble. Some versions do not even contain alloca or - # contain a buggy version. If you still want to use their alloca, - # use ar to extract alloca.o from them instead of compiling alloca.c. - ALLOCA=alloca.${ac_objext} - cat >> confdefs.h <<\EOF -#define C_ALLOCA 1 -EOF - - -echo $ac_n "checking whether alloca needs Cray hooks""... $ac_c" 1>&6 -echo "configure:2197: checking whether alloca needs Cray hooks" >&5 -if eval "test \"`echo '$''{'ac_cv_os_cray'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <&5 | - egrep "webecray" >/dev/null 2>&1; then - rm -rf conftest* - ac_cv_os_cray=yes -else - rm -rf conftest* - ac_cv_os_cray=no -fi -rm -f conftest* - -fi - -echo "$ac_t""$ac_cv_os_cray" 1>&6 -if test $ac_cv_os_cray = yes; then -for ac_func in _getb67 GETB67 getb67; do - echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:2227: checking for $ac_func" >&5 -if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -/* Override any gcc2 internal prototype to avoid an error. */ -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func(); - -int main() { - -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -$ac_func(); -#endif - -; return 0; } -EOF -if { (eval echo configure:2255: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_func_$ac_func=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_func_$ac_func=no" -fi -rm -f conftest* -fi - -if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then - echo "$ac_t""yes" 1>&6 - cat >> confdefs.h <&6 -fi - -done -fi - -echo $ac_n "checking stack direction for C alloca""... $ac_c" 1>&6 -echo "configure:2282: checking stack direction for C alloca" >&5 -if eval "test \"`echo '$''{'ac_cv_c_stack_direction'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test "$cross_compiling" = yes; then - ac_cv_c_stack_direction=0 -else - cat > conftest.$ac_ext < addr) ? 1 : -1; -} -main () -{ - exit (find_stack_direction() < 0); -} -EOF -if { (eval echo configure:2309: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null -then - ac_cv_c_stack_direction=1 -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -fr conftest* - ac_cv_c_stack_direction=-1 -fi -rm -fr conftest* -fi - -fi - -echo "$ac_t""$ac_cv_c_stack_direction" 1>&6 -cat >> confdefs.h <&6 -echo "configure:2334: checking for $ac_hdr" >&5 -if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:2344: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` -if test -z "$ac_err"; then - rm -rf conftest* - eval "ac_cv_header_$ac_safe=yes" -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_header_$ac_safe=no" -fi -rm -f conftest* -fi -if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then - echo "$ac_t""yes" 1>&6 - ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` - cat >> confdefs.h <&6 -fi -done - -for ac_func in getpagesize -do -echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:2373: checking for $ac_func" >&5 -if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -/* Override any gcc2 internal prototype to avoid an error. */ -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func(); - -int main() { - -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -$ac_func(); -#endif - -; return 0; } -EOF -if { (eval echo configure:2401: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_func_$ac_func=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_func_$ac_func=no" -fi -rm -f conftest* -fi - -if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then - echo "$ac_t""yes" 1>&6 - ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` - cat >> confdefs.h <&6 -fi -done - -echo $ac_n "checking for working mmap""... $ac_c" 1>&6 -echo "configure:2426: checking for working mmap" >&5 -if eval "test \"`echo '$''{'ac_cv_func_mmap_fixed_mapped'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test "$cross_compiling" = yes; then - ac_cv_func_mmap_fixed_mapped=no -else - cat > conftest.$ac_ext < -#include -#include - -/* This mess was copied from the GNU getpagesize.h. */ -#ifndef HAVE_GETPAGESIZE -# ifdef HAVE_UNISTD_H -# include -# endif - -/* Assume that all systems that can run configure have sys/param.h. */ -# ifndef HAVE_SYS_PARAM_H -# define HAVE_SYS_PARAM_H 1 -# endif - -# ifdef _SC_PAGESIZE -# define getpagesize() sysconf(_SC_PAGESIZE) -# else /* no _SC_PAGESIZE */ -# ifdef HAVE_SYS_PARAM_H -# include -# ifdef EXEC_PAGESIZE -# define getpagesize() EXEC_PAGESIZE -# else /* no EXEC_PAGESIZE */ -# ifdef NBPG -# define getpagesize() NBPG * CLSIZE -# ifndef CLSIZE -# define CLSIZE 1 -# endif /* no CLSIZE */ -# else /* no NBPG */ -# ifdef NBPC -# define getpagesize() NBPC -# else /* no NBPC */ -# ifdef PAGESIZE -# define getpagesize() PAGESIZE -# endif /* PAGESIZE */ -# endif /* no NBPC */ -# endif /* no NBPG */ -# endif /* no EXEC_PAGESIZE */ -# else /* no HAVE_SYS_PARAM_H */ -# define getpagesize() 8192 /* punt totally */ -# endif /* no HAVE_SYS_PARAM_H */ -# endif /* no _SC_PAGESIZE */ - -#endif /* no HAVE_GETPAGESIZE */ - -#ifdef __cplusplus -extern "C" { void *malloc(unsigned); } -#else -char *malloc(); -#endif - -int -main() -{ - char *data, *data2, *data3; - int i, pagesize; - int fd; - - pagesize = getpagesize(); - - /* - * First, make a file with some known garbage in it. - */ - data = malloc(pagesize); - if (!data) - exit(1); - for (i = 0; i < pagesize; ++i) - *(data + i) = rand(); - umask(0); - fd = creat("conftestmmap", 0600); - if (fd < 0) - exit(1); - if (write(fd, data, pagesize) != pagesize) - exit(1); - close(fd); - - /* - * Next, try to mmap the file at a fixed address which - * already has something else allocated at it. If we can, - * also make sure that we see the same garbage. - */ - fd = open("conftestmmap", O_RDWR); - if (fd < 0) - exit(1); - data2 = malloc(2 * pagesize); - if (!data2) - exit(1); - data2 += (pagesize - ((int) data2 & (pagesize - 1))) & (pagesize - 1); - if (data2 != mmap(data2, pagesize, PROT_READ | PROT_WRITE, - MAP_PRIVATE | MAP_FIXED, fd, 0L)) - exit(1); - for (i = 0; i < pagesize; ++i) - if (*(data + i) != *(data2 + i)) - exit(1); - - /* - * Finally, make sure that changes to the mapped area - * do not percolate back to the file as seen by read(). - * (This is a bug on some variants of i386 svr4.0.) - */ - for (i = 0; i < pagesize; ++i) - *(data2 + i) = *(data2 + i) + 1; - data3 = malloc(pagesize); - if (!data3) - exit(1); - if (read(fd, data3, pagesize) != pagesize) - exit(1); - for (i = 0; i < pagesize; ++i) - if (*(data + i) != *(data3 + i)) - exit(1); - close(fd); - unlink("conftestmmap"); - exit(0); -} - -EOF -if { (eval echo configure:2574: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null -then - ac_cv_func_mmap_fixed_mapped=yes -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -fr conftest* - ac_cv_func_mmap_fixed_mapped=no -fi -rm -fr conftest* -fi - -fi - -echo "$ac_t""$ac_cv_func_mmap_fixed_mapped" 1>&6 -if test $ac_cv_func_mmap_fixed_mapped = yes; then - cat >> confdefs.h <<\EOF -#define HAVE_MMAP 1 -EOF - -fi - - - for ac_hdr in argz.h limits.h locale.h nl_types.h malloc.h string.h \ -unistd.h sys/param.h -do -ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` -echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -echo "configure:2602: checking for $ac_hdr" >&5 -if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:2612: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` -if test -z "$ac_err"; then - rm -rf conftest* - eval "ac_cv_header_$ac_safe=yes" -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_header_$ac_safe=no" -fi -rm -f conftest* -fi -if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then - echo "$ac_t""yes" 1>&6 - ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` - cat >> confdefs.h <&6 -fi -done - - for ac_func in getcwd munmap putenv setenv setlocale strchr strcasecmp \ -strdup __argz_count __argz_stringify __argz_next -do -echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:2642: checking for $ac_func" >&5 -if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -/* Override any gcc2 internal prototype to avoid an error. */ -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func(); - -int main() { - -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -$ac_func(); -#endif - -; return 0; } -EOF -if { (eval echo configure:2670: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_func_$ac_func=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_func_$ac_func=no" -fi -rm -f conftest* -fi - -if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then - echo "$ac_t""yes" 1>&6 - ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` - cat >> confdefs.h <&6 -fi -done - - - if test "${ac_cv_func_stpcpy+set}" != "set"; then - for ac_func in stpcpy -do -echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:2699: checking for $ac_func" >&5 -if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -/* Override any gcc2 internal prototype to avoid an error. */ -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func(); - -int main() { - -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -$ac_func(); -#endif - -; return 0; } -EOF -if { (eval echo configure:2727: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_func_$ac_func=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_func_$ac_func=no" -fi -rm -f conftest* -fi - -if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then - echo "$ac_t""yes" 1>&6 - ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` - cat >> confdefs.h <&6 -fi -done - - fi - if test "${ac_cv_func_stpcpy}" = "yes"; then - cat >> confdefs.h <<\EOF -#define HAVE_STPCPY 1 -EOF - - fi - - if test $ac_cv_header_locale_h = yes; then - echo $ac_n "checking for LC_MESSAGES""... $ac_c" 1>&6 -echo "configure:2761: checking for LC_MESSAGES" >&5 -if eval "test \"`echo '$''{'am_cv_val_LC_MESSAGES'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -int main() { -return LC_MESSAGES -; return 0; } -EOF -if { (eval echo configure:2773: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - am_cv_val_LC_MESSAGES=yes -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - am_cv_val_LC_MESSAGES=no -fi -rm -f conftest* -fi - -echo "$ac_t""$am_cv_val_LC_MESSAGES" 1>&6 - if test $am_cv_val_LC_MESSAGES = yes; then - cat >> confdefs.h <<\EOF -#define HAVE_LC_MESSAGES 1 -EOF - - fi - fi - echo $ac_n "checking whether NLS is requested""... $ac_c" 1>&6 -echo "configure:2794: checking whether NLS is requested" >&5 - # Check whether --enable-nls or --disable-nls was given. -if test "${enable_nls+set}" = set; then - enableval="$enable_nls" - USE_NLS=$enableval -else - USE_NLS=yes -fi - - echo "$ac_t""$USE_NLS" 1>&6 - - - USE_INCLUDED_LIBINTL=no - - if test "$USE_NLS" = "yes"; then - cat >> confdefs.h <<\EOF -#define ENABLE_NLS 1 -EOF - - echo $ac_n "checking whether included gettext is requested""... $ac_c" 1>&6 -echo "configure:2814: checking whether included gettext is requested" >&5 - # Check whether --with-included-gettext or --without-included-gettext was given. -if test "${with_included_gettext+set}" = set; then - withval="$with_included_gettext" - nls_cv_force_use_gnu_gettext=$withval -else - nls_cv_force_use_gnu_gettext=no -fi - - echo "$ac_t""$nls_cv_force_use_gnu_gettext" 1>&6 - - nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext" - if test "$nls_cv_force_use_gnu_gettext" != "yes"; then - nls_cv_header_intl= - nls_cv_header_libgt= - CATOBJEXT=NONE - - ac_safe=`echo "libintl.h" | sed 'y%./+-%__p_%'` -echo $ac_n "checking for libintl.h""... $ac_c" 1>&6 -echo "configure:2833: checking for libintl.h" >&5 -if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:2843: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` -if test -z "$ac_err"; then - rm -rf conftest* - eval "ac_cv_header_$ac_safe=yes" -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_header_$ac_safe=no" -fi -rm -f conftest* -fi -if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then - echo "$ac_t""yes" 1>&6 - echo $ac_n "checking for gettext in libc""... $ac_c" 1>&6 -echo "configure:2860: checking for gettext in libc" >&5 -if eval "test \"`echo '$''{'gt_cv_func_gettext_libc'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -int main() { -return (int) gettext ("") -; return 0; } -EOF -if { (eval echo configure:2872: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - gt_cv_func_gettext_libc=yes -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - gt_cv_func_gettext_libc=no -fi -rm -f conftest* -fi - -echo "$ac_t""$gt_cv_func_gettext_libc" 1>&6 - - if test "$gt_cv_func_gettext_libc" != "yes"; then - echo $ac_n "checking for bindtextdomain in -lintl""... $ac_c" 1>&6 -echo "configure:2888: checking for bindtextdomain in -lintl" >&5 -ac_lib_var=`echo intl'_'bindtextdomain | sed 'y%./+-%__p_%'` -if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-lintl $LIBS" -cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=no" -fi -rm -f conftest* -LIBS="$ac_save_LIBS" - -fi -if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then - echo "$ac_t""yes" 1>&6 - echo $ac_n "checking for gettext in libintl""... $ac_c" 1>&6 -echo "configure:2923: checking for gettext in libintl" >&5 -if eval "test \"`echo '$''{'gt_cv_func_gettext_libintl'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - echo $ac_n "checking for gettext in -lintl""... $ac_c" 1>&6 -echo "configure:2928: checking for gettext in -lintl" >&5 -ac_lib_var=`echo intl'_'gettext | sed 'y%./+-%__p_%'` -if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-lintl $LIBS" -cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=no" -fi -rm -f conftest* -LIBS="$ac_save_LIBS" - -fi -if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then - echo "$ac_t""yes" 1>&6 - gt_cv_func_gettext_libintl=yes -else - echo "$ac_t""no" 1>&6 -gt_cv_func_gettext_libintl=no -fi - -fi - -echo "$ac_t""$gt_cv_func_gettext_libintl" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - fi - - if test "$gt_cv_func_gettext_libc" = "yes" \ - || test "$gt_cv_func_gettext_libintl" = "yes"; then - cat >> confdefs.h <<\EOF -#define HAVE_GETTEXT 1 -EOF - - # Extract the first word of "msgfmt", so it can be a program name with args. -set dummy msgfmt; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:2986: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_path_MSGFMT'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - case "$MSGFMT" in - /*) - ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path. - ;; - *) - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" - for ac_dir in $PATH; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - if test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"; then - ac_cv_path_MSGFMT="$ac_dir/$ac_word" - break - fi - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT="no" - ;; -esac -fi -MSGFMT="$ac_cv_path_MSGFMT" -if test -n "$MSGFMT"; then - echo "$ac_t""$MSGFMT" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - if test "$MSGFMT" != "no"; then - for ac_func in dcgettext -do -echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:3020: checking for $ac_func" >&5 -if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -/* Override any gcc2 internal prototype to avoid an error. */ -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func(); - -int main() { - -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -$ac_func(); -#endif - -; return 0; } -EOF -if { (eval echo configure:3048: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_func_$ac_func=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_func_$ac_func=no" -fi -rm -f conftest* -fi - -if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then - echo "$ac_t""yes" 1>&6 - ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` - cat >> confdefs.h <&6 -fi -done - - # Extract the first word of "gmsgfmt", so it can be a program name with args. -set dummy gmsgfmt; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:3075: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_path_GMSGFMT'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - case "$GMSGFMT" in - /*) - ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path. - ;; - ?:/*) - ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a dos path. - ;; - *) - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_path_GMSGFMT="$ac_dir/$ac_word" - break - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT" - ;; -esac -fi -GMSGFMT="$ac_cv_path_GMSGFMT" -if test -n "$GMSGFMT"; then - echo "$ac_t""$GMSGFMT" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - # Extract the first word of "xgettext", so it can be a program name with args. -set dummy xgettext; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:3111: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_path_XGETTEXT'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - case "$XGETTEXT" in - /*) - ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path. - ;; - *) - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" - for ac_dir in $PATH; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - if test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"; then - ac_cv_path_XGETTEXT="$ac_dir/$ac_word" - break - fi - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":" - ;; -esac -fi -XGETTEXT="$ac_cv_path_XGETTEXT" -if test -n "$XGETTEXT"; then - echo "$ac_t""$XGETTEXT" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - CATOBJEXT=.gmo - DATADIRNAME=share -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - CATOBJEXT=.mo - DATADIRNAME=lib -fi -rm -f conftest* - INSTOBJEXT=.mo - fi - fi - -else - echo "$ac_t""no" 1>&6 -fi - - - if test "$CATOBJEXT" = "NONE"; then - echo $ac_n "checking whether catgets can be used""... $ac_c" 1>&6 -echo "configure:3174: checking whether catgets can be used" >&5 - # Check whether --with-catgets or --without-catgets was given. -if test "${with_catgets+set}" = set; then - withval="$with_catgets" - nls_cv_use_catgets=$withval -else - nls_cv_use_catgets=no -fi - - echo "$ac_t""$nls_cv_use_catgets" 1>&6 - - if test "$nls_cv_use_catgets" = "yes"; then - echo $ac_n "checking for main in -li""... $ac_c" 1>&6 -echo "configure:3187: checking for main in -li" >&5 -ac_lib_var=`echo i'_'main | sed 'y%./+-%__p_%'` -if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-li $LIBS" -cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=no" -fi -rm -f conftest* -LIBS="$ac_save_LIBS" - -fi -if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then - echo "$ac_t""yes" 1>&6 - ac_tr_lib=HAVE_LIB`echo i | sed -e 's/[^a-zA-Z0-9_]/_/g' \ - -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'` - cat >> confdefs.h <&6 -fi - - echo $ac_n "checking for catgets""... $ac_c" 1>&6 -echo "configure:3230: checking for catgets" >&5 -if eval "test \"`echo '$''{'ac_cv_func_catgets'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -/* Override any gcc2 internal prototype to avoid an error. */ -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char catgets(); - -int main() { - -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_catgets) || defined (__stub___catgets) -choke me -#else -catgets(); -#endif - -; return 0; } -EOF -if { (eval echo configure:3258: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_func_catgets=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_func_catgets=no" -fi -rm -f conftest* -fi - -if eval "test \"`echo '$ac_cv_func_'catgets`\" = yes"; then - echo "$ac_t""yes" 1>&6 - cat >> confdefs.h <<\EOF -#define HAVE_CATGETS 1 -EOF - - INTLOBJS="\$(CATOBJS)" - # Extract the first word of "gencat", so it can be a program name with args. -set dummy gencat; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:3280: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_path_GENCAT'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - case "$GENCAT" in - /*) - ac_cv_path_GENCAT="$GENCAT" # Let the user override the test with a path. - ;; - ?:/*) - ac_cv_path_GENCAT="$GENCAT" # Let the user override the test with a dos path. - ;; - *) - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_path_GENCAT="$ac_dir/$ac_word" - break - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_path_GENCAT" && ac_cv_path_GENCAT="no" - ;; -esac -fi -GENCAT="$ac_cv_path_GENCAT" -if test -n "$GENCAT"; then - echo "$ac_t""$GENCAT" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - if test "$GENCAT" != "no"; then - # Extract the first word of "gmsgfmt", so it can be a program name with args. -set dummy gmsgfmt; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:3316: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_path_GMSGFMT'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - case "$GMSGFMT" in - /*) - ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path. - ;; - ?:/*) - ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a dos path. - ;; - *) - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_path_GMSGFMT="$ac_dir/$ac_word" - break - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="no" - ;; -esac -fi -GMSGFMT="$ac_cv_path_GMSGFMT" -if test -n "$GMSGFMT"; then - echo "$ac_t""$GMSGFMT" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - if test "$GMSGFMT" = "no"; then - # Extract the first word of "msgfmt", so it can be a program name with args. -set dummy msgfmt; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:3353: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_path_GMSGFMT'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - case "$GMSGFMT" in - /*) - ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path. - ;; - *) - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" - for ac_dir in $PATH; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - if test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"; then - ac_cv_path_GMSGFMT="$ac_dir/$ac_word" - break - fi - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="no" - ;; -esac -fi -GMSGFMT="$ac_cv_path_GMSGFMT" -if test -n "$GMSGFMT"; then - echo "$ac_t""$GMSGFMT" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - fi - # Extract the first word of "xgettext", so it can be a program name with args. -set dummy xgettext; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:3388: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_path_XGETTEXT'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - case "$XGETTEXT" in - /*) - ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path. - ;; - *) - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" - for ac_dir in $PATH; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - if test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"; then - ac_cv_path_XGETTEXT="$ac_dir/$ac_word" - break - fi - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":" - ;; -esac -fi -XGETTEXT="$ac_cv_path_XGETTEXT" -if test -n "$XGETTEXT"; then - echo "$ac_t""$XGETTEXT" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - USE_INCLUDED_LIBINTL=yes - CATOBJEXT=.cat - INSTOBJEXT=.cat - DATADIRNAME=lib - INTLDEPS='$(top_builddir)/intl/libintl.a' - INTLLIBS=$INTLDEPS - LIBS=`echo $LIBS | sed -e 's/-lintl//'` - nls_cv_header_intl=intl/libintl.h - nls_cv_header_libgt=intl/libgettext.h - fi -else - echo "$ac_t""no" 1>&6 -fi - - fi - fi - - if test "$CATOBJEXT" = "NONE"; then - nls_cv_use_gnu_gettext=yes - fi - fi - - if test "$nls_cv_use_gnu_gettext" = "yes"; then - INTLOBJS="\$(GETTOBJS)" - # Extract the first word of "msgfmt", so it can be a program name with args. -set dummy msgfmt; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:3446: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_path_MSGFMT'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - case "$MSGFMT" in - /*) - ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path. - ;; - *) - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" - for ac_dir in $PATH; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - if test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"; then - ac_cv_path_MSGFMT="$ac_dir/$ac_word" - break - fi - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT="msgfmt" - ;; -esac -fi -MSGFMT="$ac_cv_path_MSGFMT" -if test -n "$MSGFMT"; then - echo "$ac_t""$MSGFMT" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - # Extract the first word of "gmsgfmt", so it can be a program name with args. -set dummy gmsgfmt; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:3480: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_path_GMSGFMT'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - case "$GMSGFMT" in - /*) - ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path. - ;; - ?:/*) - ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a dos path. - ;; - *) - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_path_GMSGFMT="$ac_dir/$ac_word" - break - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT" - ;; -esac -fi -GMSGFMT="$ac_cv_path_GMSGFMT" -if test -n "$GMSGFMT"; then - echo "$ac_t""$GMSGFMT" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - # Extract the first word of "xgettext", so it can be a program name with args. -set dummy xgettext; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:3516: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_path_XGETTEXT'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - case "$XGETTEXT" in - /*) - ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path. - ;; - *) - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" - for ac_dir in $PATH; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - if test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"; then - ac_cv_path_XGETTEXT="$ac_dir/$ac_word" - break - fi - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":" - ;; -esac -fi -XGETTEXT="$ac_cv_path_XGETTEXT" -if test -n "$XGETTEXT"; then - echo "$ac_t""$XGETTEXT" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - - USE_INCLUDED_LIBINTL=yes - CATOBJEXT=.gmo - INSTOBJEXT=.mo - DATADIRNAME=share - INTLDEPS='$(top_builddir)/intl/libintl.a' - INTLLIBS=$INTLDEPS - LIBS=`echo $LIBS | sed -e 's/-lintl//'` - nls_cv_header_intl=intl/libintl.h - nls_cv_header_libgt=intl/libgettext.h - fi - - if test "$XGETTEXT" != ":"; then - if $XGETTEXT --omit-header /dev/null 2> /dev/null; then - : ; - else - echo "$ac_t""found xgettext program is not GNU xgettext; ignore it" 1>&6 - XGETTEXT=":" - fi - fi - - # We need to process the po/ directory. - POSUB=po - else - DATADIRNAME=share - nls_cv_header_intl=intl/libintl.h - nls_cv_header_libgt=intl/libgettext.h - fi - - - - - # If this is used in GNU gettext we have to set USE_NLS to `yes' - # because some of the sources are only built for this goal. - if test "$PACKAGE" = gettext; then - USE_NLS=yes - USE_INCLUDED_LIBINTL=yes - fi - - for lang in $ALL_LINGUAS; do - GMOFILES="$GMOFILES $lang.gmo" - POFILES="$POFILES $lang.po" - done - - - - - - - - - - - - - - - if test "x$CATOBJEXT" != "x"; then - if test "x$ALL_LINGUAS" = "x"; then - LINGUAS= - else - echo $ac_n "checking for catalogs to be installed""... $ac_c" 1>&6 -echo "configure:3609: checking for catalogs to be installed" >&5 - NEW_LINGUAS= - for lang in ${LINGUAS=$ALL_LINGUAS}; do - case "$ALL_LINGUAS" in - *$lang*) NEW_LINGUAS="$NEW_LINGUAS $lang" ;; - esac - done - LINGUAS=$NEW_LINGUAS - echo "$ac_t""$LINGUAS" 1>&6 - fi - - if test -n "$LINGUAS"; then - for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done - fi - fi - - if test $ac_cv_header_locale_h = yes; then - INCLUDE_LOCALE_H="#include " - else - INCLUDE_LOCALE_H="\ -/* The system does not provide the header . Take care yourself. */" - fi - - - test -d intl || mkdir intl - if test "$CATOBJEXT" = ".cat"; then - ac_safe=`echo "linux/version.h" | sed 'y%./+-%__p_%'` -echo $ac_n "checking for linux/version.h""... $ac_c" 1>&6 -echo "configure:3637: checking for linux/version.h" >&5 -if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:3647: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` -if test -z "$ac_err"; then - rm -rf conftest* - eval "ac_cv_header_$ac_safe=yes" -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_header_$ac_safe=no" -fi -rm -f conftest* -fi -if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then - echo "$ac_t""yes" 1>&6 - msgformat=linux -else - echo "$ac_t""no" 1>&6 -msgformat=xopen -fi - - - sed -e '/^#/d' $srcdir/intl/$msgformat-msg.sed > intl/po2msg.sed - fi - sed -e '/^#.*[^\\]$/d' -e '/^#$/d' \ - $srcdir/intl/po2tbl.sed.in > intl/po2tbl.sed - - if test "$PACKAGE" = "gettext"; then - GT_NO="#NO#" - GT_YES= - else - GT_NO= - GT_YES="#YES#" - fi - - - - MKINSTALLDIRS= - if test -n "$ac_aux_dir"; then - MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" - fi - if test -z "$MKINSTALLDIRS"; then - MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs" - fi - - - l= - - - test -d po || mkdir po - if test "x$srcdir" != "x."; then - if test "x`echo $srcdir | sed 's@/.*@@'`" = "x"; then - posrcprefix="$srcdir/" - else - posrcprefix="../$srcdir/" - fi - else - posrcprefix="../" - fi - rm -f po/POTFILES - sed -e "/^#/d" -e "/^\$/d" -e "s,.*, $posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \ - < $srcdir/po/POTFILES.in > po/POTFILES - - -if test "x${prefix}" = "xNONE"; then - cat >> confdefs.h <> confdefs.h <> confdefs.h <> confdefs.h <> confdefs.h <> confdefs.h < confcache <<\EOF -# This file is a shell script that caches the results of configure -# tests run on this system so they can be shared between configure -# scripts and configure runs. It is not useful on other systems. -# If it contains results you don't want to keep, you may remove or edit it. -# -# By default, configure uses ./config.cache as the cache file, -# creating it if it does not exist already. You can give configure -# the --cache-file=FILE option to use a different cache file; that is -# what configure does when it calls configure scripts in -# subdirectories, so they share the cache. -# Giving --cache-file=/dev/null disables caching, for debugging configure. -# config.status only pays attention to the cache file if you give it the -# --recheck option to rerun configure. -# -EOF -# The following way of writing the cache mishandles newlines in values, -# but we know of no workaround that is simple, portable, and efficient. -# So, don't put newlines in cache variables' values. -# Ultrix sh set writes to stderr and can't be redirected directly, -# and sets the high bit in the cache file unless we assign to the vars. -(set) 2>&1 | - case `(ac_space=' '; set | grep ac_space) 2>&1` in - *ac_space=\ *) - # `set' does not quote correctly, so add quotes (double-quote substitution - # turns \\\\ into \\, and sed turns \\ into \). - sed -n \ - -e "s/'/'\\\\''/g" \ - -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" - ;; - *) - # `set' quotes correctly as required by POSIX, so do not add quotes. - sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' - ;; - esac >> confcache -if cmp -s $cache_file confcache; then - : -else - if test -w $cache_file; then - echo "updating cache $cache_file" - cat confcache > $cache_file - else - echo "not updating unwritable cache $cache_file" - fi -fi -rm -f confcache - -trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 - -test "x$prefix" = xNONE && prefix=$ac_default_prefix -# Let make expand exec_prefix. -test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' - -# Any assignment to VPATH causes Sun make to only execute -# the first set of double-colon rules, so remove it if not needed. -# If there is a colon in the path, we need to keep it. -if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d' -fi - -trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15 - -DEFS=-DHAVE_CONFIG_H - -# Without the "./", some shells look in PATH for config.status. -: ${CONFIG_STATUS=./config.status} - -echo creating $CONFIG_STATUS -rm -f $CONFIG_STATUS -cat > $CONFIG_STATUS </dev/null | sed 1q`: -# -# $0 $ac_configure_args -# -# Compiler output produced by configure, useful for debugging -# configure, is in ./config.log if it exists. - -ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]" -for ac_option -do - case "\$ac_option" in - -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) - echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" - exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; - -version | --version | --versio | --versi | --vers | --ver | --ve | --v) - echo "$CONFIG_STATUS generated by autoconf version 2.13" - exit 0 ;; - -help | --help | --hel | --he | --h) - echo "\$ac_cs_usage"; exit 0 ;; - *) echo "\$ac_cs_usage"; exit 1 ;; - esac -done - -ac_given_srcdir=$srcdir -ac_given_INSTALL="$INSTALL" - -trap 'rm -fr `echo " -Makefile -gtk-gui/Makefile -intl/Makefile -po/Makefile.in - config.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 -EOF -cat >> $CONFIG_STATUS < conftest.subs <<\\CEOF -$ac_vpsub -$extrasub -s%@SHELL@%$SHELL%g -s%@CFLAGS@%$CFLAGS%g -s%@CPPFLAGS@%$CPPFLAGS%g -s%@CXXFLAGS@%$CXXFLAGS%g -s%@FFLAGS@%$FFLAGS%g -s%@DEFS@%$DEFS%g -s%@LDFLAGS@%$LDFLAGS%g -s%@LIBS@%$LIBS%g -s%@exec_prefix@%$exec_prefix%g -s%@prefix@%$prefix%g -s%@program_transform_name@%$program_transform_name%g -s%@bindir@%$bindir%g -s%@sbindir@%$sbindir%g -s%@libexecdir@%$libexecdir%g -s%@datadir@%$datadir%g -s%@sysconfdir@%$sysconfdir%g -s%@sharedstatedir@%$sharedstatedir%g -s%@localstatedir@%$localstatedir%g -s%@libdir@%$libdir%g -s%@includedir@%$includedir%g -s%@oldincludedir@%$oldincludedir%g -s%@infodir@%$infodir%g -s%@mandir@%$mandir%g -s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g -s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g -s%@INSTALL_DATA@%$INSTALL_DATA%g -s%@PACKAGE@%$PACKAGE%g -s%@VERSION@%$VERSION%g -s%@ACLOCAL@%$ACLOCAL%g -s%@AUTOCONF@%$AUTOCONF%g -s%@AUTOMAKE@%$AUTOMAKE%g -s%@AUTOHEADER@%$AUTOHEADER%g -s%@MAKEINFO@%$MAKEINFO%g -s%@SET_MAKE@%$SET_MAKE%g -s%@CC@%$CC%g -s%@CPP@%$CPP%g -s%@GTK_CONFIG@%$GTK_CONFIG%g -s%@GTK_CFLAGS@%$GTK_CFLAGS%g -s%@GTK_LIBS@%$GTK_LIBS%g -s%@RANLIB@%$RANLIB%g -s%@ALLOCA@%$ALLOCA%g -s%@USE_NLS@%$USE_NLS%g -s%@MSGFMT@%$MSGFMT%g -s%@GMSGFMT@%$GMSGFMT%g -s%@XGETTEXT@%$XGETTEXT%g -s%@GENCAT@%$GENCAT%g -s%@USE_INCLUDED_LIBINTL@%$USE_INCLUDED_LIBINTL%g -s%@CATALOGS@%$CATALOGS%g -s%@CATOBJEXT@%$CATOBJEXT%g -s%@DATADIRNAME@%$DATADIRNAME%g -s%@GMOFILES@%$GMOFILES%g -s%@INSTOBJEXT@%$INSTOBJEXT%g -s%@INTLDEPS@%$INTLDEPS%g -s%@INTLLIBS@%$INTLLIBS%g -s%@INTLOBJS@%$INTLOBJS%g -s%@POFILES@%$POFILES%g -s%@POSUB@%$POSUB%g -s%@INCLUDE_LOCALE_H@%$INCLUDE_LOCALE_H%g -s%@GT_NO@%$GT_NO%g -s%@GT_YES@%$GT_YES%g -s%@MKINSTALLDIRS@%$MKINSTALLDIRS%g -s%@l@%$l%g - -CEOF -EOF - -cat >> $CONFIG_STATUS <<\EOF - -# Split the substitutions into bite-sized pieces for seds with -# small command number limits, like on Digital OSF/1 and HP-UX. -ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script. -ac_file=1 # Number of current file. -ac_beg=1 # First line for current file. -ac_end=$ac_max_sed_cmds # Line after last line for current file. -ac_more_lines=: -ac_sed_cmds="" -while $ac_more_lines; do - if test $ac_beg -gt 1; then - sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file - else - sed "${ac_end}q" conftest.subs > conftest.s$ac_file - fi - if test ! -s conftest.s$ac_file; then - ac_more_lines=false - rm -f conftest.s$ac_file - else - if test -z "$ac_sed_cmds"; then - ac_sed_cmds="sed -f conftest.s$ac_file" - else - ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file" - fi - ac_file=`expr $ac_file + 1` - ac_beg=$ac_end - ac_end=`expr $ac_end + $ac_max_sed_cmds` - fi -done -if test -z "$ac_sed_cmds"; then - ac_sed_cmds=cat -fi -EOF - -cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF -for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then - # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". - case "$ac_file" in - *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` - ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; - *) ac_file_in="${ac_file}.in" ;; - esac - - # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories. - - # Remove last slash and all that follows it. Not all systems have dirname. - ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` - if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then - # The file is in a subdirectory. - test ! -d "$ac_dir" && mkdir "$ac_dir" - ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`" - # A "../" for each directory in $ac_dir_suffix. - ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'` - else - ac_dir_suffix= ac_dots= - fi - - case "$ac_given_srcdir" in - .) srcdir=. - if test -z "$ac_dots"; then top_srcdir=. - else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;; - /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;; - *) # Relative path. - srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix" - top_srcdir="$ac_dots$ac_given_srcdir" ;; - esac - - case "$ac_given_INSTALL" in - [/$]*) INSTALL="$ac_given_INSTALL" ;; - *) INSTALL="$ac_dots$ac_given_INSTALL" ;; - esac - - echo creating "$ac_file" - rm -f "$ac_file" - configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure." - case "$ac_file" in - *Makefile*) ac_comsub="1i\\ -# $configure_input" ;; - *) ac_comsub= ;; - esac - - ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` - sed -e "$ac_comsub -s%@configure_input@%$configure_input%g -s%@srcdir@%$srcdir%g -s%@top_srcdir@%$top_srcdir%g -s%@INSTALL@%$INSTALL%g -" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file -fi; done -rm -f conftest.s* - -# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where -# NAME is the cpp macro being defined and VALUE is the value it is being given. -# -# ac_d sets the value in "#define NAME VALUE" lines. -ac_dA='s%^\([ ]*\)#\([ ]*define[ ][ ]*\)' -ac_dB='\([ ][ ]*\)[^ ]*%\1#\2' -ac_dC='\3' -ac_dD='%g' -# ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE". -ac_uA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' -ac_uB='\([ ]\)%\1#\2define\3' -ac_uC=' ' -ac_uD='\4%g' -# ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE". -ac_eA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' -ac_eB='$%\1#\2define\3' -ac_eC=' ' -ac_eD='%g' - -if test "${CONFIG_HEADERS+set}" != set; then -EOF -cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF -fi -for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then - # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". - case "$ac_file" in - *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` - ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; - *) ac_file_in="${ac_file}.in" ;; - esac - - echo creating $ac_file - - rm -f conftest.frag conftest.in conftest.out - ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` - cat $ac_file_inputs > conftest.in - -EOF - -# Transform confdefs.h into a sed script conftest.vals that substitutes -# the proper values into config.h.in to produce config.h. And first: -# Protect against being on the right side of a sed subst in config.status. -# Protect against being in an unquoted here document in config.status. -rm -f conftest.vals -cat > conftest.hdr <<\EOF -s/[\\&%]/\\&/g -s%[\\$`]%\\&%g -s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp -s%ac_d%ac_u%gp -s%ac_u%ac_e%gp -EOF -sed -n -f conftest.hdr confdefs.h > conftest.vals -rm -f conftest.hdr - -# This sed command replaces #undef with comments. This is necessary, for -# example, in the case of _POSIX_SOURCE, which is predefined and required -# on some systems where configure will not decide to define it. -cat >> conftest.vals <<\EOF -s%^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */% -EOF - -# Break up conftest.vals because some shells have a limit on -# the size of here documents, and old seds have small limits too. - -rm -f conftest.tail -while : -do - ac_lines=`grep -c . conftest.vals` - # grep -c gives empty output for an empty file on some AIX systems. - if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi - # Write a limited-size here document to conftest.frag. - echo ' cat > conftest.frag <> $CONFIG_STATUS - sed ${ac_max_here_lines}q conftest.vals >> $CONFIG_STATUS - echo 'CEOF - sed -f conftest.frag conftest.in > conftest.out - rm -f conftest.in - mv conftest.out conftest.in -' >> $CONFIG_STATUS - sed 1,${ac_max_here_lines}d conftest.vals > conftest.tail - rm -f conftest.vals - mv conftest.tail conftest.vals -done -rm -f conftest.vals - -cat >> $CONFIG_STATUS <<\EOF - rm -f conftest.frag conftest.h - echo "/* $ac_file. Generated automatically by configure. */" > conftest.h - cat conftest.in >> conftest.h - rm -f conftest.in - if cmp -s $ac_file conftest.h 2>/dev/null; then - echo "$ac_file is unchanged" - rm -f conftest.h - else - # Remove last slash and all that follows it. Not all systems have dirname. - ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` - if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then - # The file is in a subdirectory. - test ! -d "$ac_dir" && mkdir "$ac_dir" - fi - rm -f $ac_file - mv conftest.h $ac_file - fi -fi; done - -EOF - -cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF -srcdir=$ac_given_srcdir -while test -n "$ac_sources"; do - set $ac_dests; ac_dest=$1; shift; ac_dests=$* - set $ac_sources; ac_source=$1; shift; ac_sources=$* - - echo "linking $srcdir/$ac_source to $ac_dest" - - if test ! -r $srcdir/$ac_source; then - { echo "configure: error: $srcdir/$ac_source: File not found" 1>&2; exit 1; } - fi - rm -f $ac_dest - - # Make relative symlinks. - # Remove last slash and all that follows it. Not all systems have dirname. - ac_dest_dir=`echo $ac_dest|sed 's%/[^/][^/]*$%%'` - if test "$ac_dest_dir" != "$ac_dest" && test "$ac_dest_dir" != .; then - # The dest file is in a subdirectory. - test ! -d "$ac_dest_dir" && mkdir "$ac_dest_dir" - ac_dest_dir_suffix="/`echo $ac_dest_dir|sed 's%^\./%%'`" - # A "../" for each directory in $ac_dest_dir_suffix. - ac_dots=`echo $ac_dest_dir_suffix|sed 's%/[^/]*%../%g'` - else - ac_dest_dir_suffix= ac_dots= - fi - - case "$srcdir" in - [/$]*) ac_rel_source="$srcdir/$ac_source" ;; - *) ac_rel_source="$ac_dots$srcdir/$ac_source" ;; - esac - - # Make a symlink if possible; otherwise try a hard link. - if ln -s $ac_rel_source $ac_dest 2>/dev/null || - ln $srcdir/$ac_source $ac_dest; then : - else - { echo "configure: error: can not link $ac_dest to $srcdir/$ac_source" 1>&2; exit 1; } - fi -done -EOF -cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF -test -z "$CONFIG_HEADERS" || echo timestamp > stamp-h -case "$CONFIG_FILES" in *po/Makefile.in*) - sed -e "/POTFILES =/r po/POTFILES" po/Makefile.in > po/Makefile - esac - -exit 0 -EOF -chmod +x $CONFIG_STATUS -rm -fr confdefs* $ac_clean_files -test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1 - - diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/configure.in kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/configure.in --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/configure.in 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/configure.in 1970-01-01 00:00:00.000000000 +0000 @@ -1,59 +0,0 @@ -dnl Process this file with autoconf to produce a configure script. - -AC_INIT(configure.in) -AM_INIT_AUTOMAKE(goom2, 0.1) -AM_CONFIG_HEADER(config.h) - -AC_ISC_POSIX -AC_PROG_CC -AM_PROG_CC_STDC -AC_HEADER_STDC -AC_C_BIGENDIAN - - -AM_PATH_GTK(1.2.0, , - AC_MSG_ERROR(Cannot find GTK: Is gtk-config in path?)) - -dnl Add the languages which your application supports here. -ALL_LINGUAS="" -AM_GNU_GETTEXT - -dnl Set PACKAGE_LOCALE_DIR in config.h. -if test "x${prefix}" = "xNONE"; then - AC_DEFINE_UNQUOTED(PACKAGE_LOCALE_DIR, "${ac_default_prefix}/${DATADIRNAME}/locale") -else - AC_DEFINE_UNQUOTED(PACKAGE_LOCALE_DIR, "${prefix}/${DATADIRNAME}/locale") -fi - -dnl Set PACKAGE_DATA_DIR in config.h. -if test "x${datadir}" = 'x${prefix}/share'; then - if test "x${prefix}" = "xNONE"; then - AC_DEFINE_UNQUOTED(PACKAGE_DATA_DIR, "${ac_default_prefix}/share/${PACKAGE}") - else - AC_DEFINE_UNQUOTED(PACKAGE_DATA_DIR, "${prefix}/share/${PACKAGE}") - fi -else - AC_DEFINE_UNQUOTED(PACKAGE_DATA_DIR, "${datadir}/${PACKAGE}") -fi - -dnl Set PACKAGE_SOURCE_DIR in config.h. -packagesrcdir=`cd $srcdir && pwd` -AC_DEFINE_UNQUOTED(PACKAGE_SOURCE_DIR, "${packagesrcdir}") - -dnl Use -Wall if we have gcc. -changequote(,)dnl -if test "x$GCC" = "xyes"; then - case " $CFLAGS " in - *[\ \ ]-Wall[\ \ ]*) ;; - *) CFLAGS="$CFLAGS -Wall" ;; - esac -fi -changequote([,])dnl - -AC_OUTPUT([ -Makefile -gtk-gui/Makefile -intl/Makefile -po/Makefile.in -]) - diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/COPYING kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/COPYING --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/COPYING 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/COPYING 1970-01-01 00:00:00.000000000 +0000 @@ -1,340 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/goom2.glade kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/goom2.glade --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/goom2.glade 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/goom2.glade 1970-01-01 00:00:00.000000000 +0000 @@ -1,158 +0,0 @@ - - - - - Goom2 - goom2 - - gtk-gui - pixmaps - C - False - True - True - False - gtk-interface.c - gtk-interface.h - gtk-callbacks.c - gtk-callbacks.h - gtk-support.c - gtk-support.h - - - - GtkWindow - config_window - - destroy_event - on_config_window_destroy_event - Fri, 23 May 2003 09:08:30 GMT - - - delete_event - on_config_window_delete_event - Fri, 23 May 2003 09:09:21 GMT - - Goom Control Center - GTK_WINDOW_TOPLEVEL - GTK_WIN_POS_NONE - False - False - True - False - - - GtkVBox - vbox1 - False - 0 - - - GtkToolbar - toolbar1 - 3 - GTK_ORIENTATION_HORIZONTAL - GTK_TOOLBAR_TEXT - 8 - GTK_TOOLBAR_SPACE_LINE - GTK_RELIEF_NORMAL - True - - 0 - False - False - - - - GtkButton - Toolbar:button - b_open_config - - - - - GtkButton - Toolbar:button - b_save_config - - - - - - GtkNotebook - notebook1 - True - True - True - GTK_POS_LEFT - False - 2 - 2 - False - - 0 - True - True - - - - GtkScrolledWindow - scrolledwindow1 - GTK_POLICY_NEVER - GTK_POLICY_ALWAYS - GTK_UPDATE_CONTINUOUS - GTK_UPDATE_CONTINUOUS - - - GtkText - text1 - 400 - 300 - True - False - What a GOOM!! v2 - -copyright 2000-2003, by J.C. Hoelt <jeko@free.fr> - -This is my first visual plugins for XMMS, and I -think that it's the best I have ever done ! - ---- - -This dialog will help you to configure goom. -Many options here will seem strange to you, -anyway, just try things and look what happen ! - -Enjoy, - - Jeko - - - - - GtkLabel - Notebook:tab - goom_control - - GTK_JUSTIFY_CENTER - False - 0.5 - 0.5 - 0 - 0 - - - - - GtkStatusbar - statusbar1 - - 0 - False - False - - - - - - diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-callbacks.c kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-callbacks.c --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-callbacks.c 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-callbacks.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,267 +0,0 @@ -#ifdef HAVE_CONFIG_H -# include -#endif - -#include - -#include "gtk-callbacks.h" -#include "gtk-interface.h" -#include "gtk-support.h" - -#define WINSIZE_COMBO "combo_winsize" - -#include "sdl_goom.h" -#include "config_param.h" - -#include -#include - -static SdlGoom *sdlGoom; -static GtkObject *owin; - -void -on_spinbutton_int_changed (GtkEditable *editable, - gpointer user_data) -{ - PluginParam *param = (PluginParam*)gtk_object_get_data (GTK_OBJECT(editable),"param"); - IVAL(*param) = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON(editable)); - param->changed(param); -} - -void -on_list_changed (GtkEditable *editable, - gpointer user_data) -{ - PluginParam *param = (PluginParam*)gtk_object_get_data (GTK_OBJECT(editable),"param"); - LVAL(*param) = gtk_editable_get_chars (editable,0,-1); - param->changed(param); -} - -void -on_bool_toggled (GtkToggleButton *togglebutton, - gpointer user_data) -{ - PluginParam *param = (PluginParam*)gtk_object_get_data (GTK_OBJECT(togglebutton),"param"); - BVAL(*param) = gtk_toggle_button_get_active(togglebutton); - param->changed(param); -} - -void my_int_listener (PluginParam *param) { - GtkEditable *editable; - - if (sdlGoom->config_win == 0) return; - editable = GTK_EDITABLE(param->user_data); - - if (editable) { - int pos = 0; - char str[256]; - sprintf (str, "%d", IVAL(*param)); - if (strcmp(str,gtk_editable_get_chars(editable,0,-1))) { - gtk_editable_delete_text (editable,0,-1); - gtk_editable_insert_text (editable,str,strlen(str),&pos); - } - } -} - -void my_list_listener (PluginParam *param) { - GtkEntry *editable; - - if (sdlGoom->config_win == 0) return; - editable = GTK_ENTRY(param->user_data); - - if (editable) { - if (strcmp(gtk_entry_get_text(editable),LVAL(*param))) { - gtk_entry_set_text (editable, LVAL(*param)); - } - } -} - -void my_bool_listener (PluginParam *param) { - GtkCheckButton *editable; - - if (sdlGoom->config_win == 0) return; - editable = GTK_CHECK_BUTTON(param->user_data); - - if (editable) { - if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(editable)) != BVAL(*param)) - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(editable),BVAL(*param)); - } -} - -void my_float_listener (PluginParam *param) { - GtkProgressBar *progress; - - if (sdlGoom->config_win == 0) return; - progress = GTK_PROGRESS_BAR(param->user_data); - - if (progress) { - if (FVAL(*param)FMAX(*param)) - FVAL(*param) = FMAX(*param); - gtk_progress_bar_update (progress, FVAL(*param)); - } -} - -void addParams (GtkNotebook *notebook, PluginParameters *params) { - int n; - GtkWidget *table = gtk_table_new (params->nbParams, 2, FALSE); - gtk_container_set_border_width (GTK_CONTAINER (table), 11); - gtk_table_set_row_spacings (GTK_TABLE (table), 6); - gtk_table_set_col_spacings (GTK_TABLE (table), 6); - - for (n=0;nnbParams;++n) { - if (params->params[n] == 0) { - GtkWidget *hseparator = gtk_hseparator_new (); - gtk_widget_show (hseparator); - gtk_table_attach (GTK_TABLE (table), hseparator, 0, 2, n, n+1, - (GtkAttachOptions) (GTK_FILL), - (GtkAttachOptions) (GTK_FILL), 0, 5); - } else { - PluginParam *p = params->params[n]; - - if (p->type != PARAM_BOOLVAL) { - GtkWidget *label4 = gtk_label_new (p->name); - gtk_widget_show (label4); - gtk_table_attach (GTK_TABLE (table), label4, 0, 1, n, n+1, - (GtkAttachOptions) (GTK_FILL), - (GtkAttachOptions) (0), 0, 0); - gtk_label_set_justify (GTK_LABEL (label4), GTK_JUSTIFY_RIGHT); - gtk_misc_set_alignment (GTK_MISC (label4), 0, 0.5); - } - - switch (p->type) { - case PARAM_INTVAL: { - GtkWidget *spinbutton_adj,*spinbutton; - - spinbutton_adj = (GtkWidget*)gtk_adjustment_new ( - p->param.ival.value, - p->param.ival.min, p->param.ival.max, - p->param.ival.step, p->param.ival.step*10, - p->param.ival.step*10); - spinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (spinbutton_adj), 1, 0); - gtk_widget_show (spinbutton); - gtk_table_attach (GTK_TABLE (table), spinbutton, 1, 2, n, n+1, - (GtkAttachOptions) (GTK_FILL), - (GtkAttachOptions) (0), 0, 1); - gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbutton), TRUE); - gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (spinbutton), - GTK_UPDATE_IF_VALID); - p->user_data = spinbutton; - gtk_object_set_data (GTK_OBJECT(spinbutton),"param",(void*)p); - p->change_listener = my_int_listener; - gtk_signal_connect (GTK_OBJECT (spinbutton), "changed", - GTK_SIGNAL_FUNC (on_spinbutton_int_changed), - NULL); - break; - } - - case PARAM_FLOATVAL: { - GtkWidget *progress,*prog_adj; - - prog_adj = (GtkWidget*)gtk_adjustment_new ( - p->param.fval.value, - p->param.fval.min, p->param.fval.max, - p->param.fval.step, p->param.fval.step*10, - p->param.fval.step*10); - - progress = gtk_progress_bar_new_with_adjustment(GTK_ADJUSTMENT(prog_adj)); - gtk_widget_show(progress); - gtk_table_attach (GTK_TABLE (table), progress, 1, 2, n, n+1, - (GtkAttachOptions) (GTK_FILL), - (GtkAttachOptions) (0), 0, 1); - - p->user_data = progress; - p->change_listener = my_float_listener; - break; - } - - case PARAM_LISTVAL: { - int i; - GList *combo_winsize_items = NULL; - GtkWidget *combo_entry_winsize = NULL; - GtkWidget *combo_winsize = gtk_combo_new (); - gtk_widget_show (combo_winsize); - gtk_table_attach (GTK_TABLE (table), combo_winsize, 1, 2, n, n+1, - (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), - (GtkAttachOptions) (0), 0, 0); - gtk_combo_set_value_in_list (GTK_COMBO (combo_winsize), TRUE, TRUE); - for (i=0;iparam.slist.nbChoices;++i) - combo_winsize_items = g_list_append (combo_winsize_items, - p->param.slist.choices[i]); - gtk_combo_set_popdown_strings (GTK_COMBO (combo_winsize), combo_winsize_items); - g_list_free (combo_winsize_items); - - combo_entry_winsize = GTK_COMBO (combo_winsize)->entry; - gtk_widget_show (combo_entry_winsize); - gtk_entry_set_editable (GTK_ENTRY (combo_entry_winsize), FALSE); - gtk_entry_set_text (GTK_ENTRY (combo_entry_winsize), LVAL(*p)); - p->change_listener = my_list_listener; - p->user_data = combo_entry_winsize; - gtk_object_set_data (GTK_OBJECT(combo_entry_winsize),"param",(void*)p); - gtk_signal_connect (GTK_OBJECT (combo_entry_winsize), "changed", - GTK_SIGNAL_FUNC (on_list_changed), - NULL); - break; - } - - case PARAM_BOOLVAL: { - GtkWidget *checkbutton_double = - gtk_check_button_new_with_label (p->name); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton_double),BVAL(*p)); - gtk_widget_show (checkbutton_double); - gtk_table_attach (GTK_TABLE (table), checkbutton_double, 1, 2, n, n+1, - (GtkAttachOptions) (GTK_FILL), - (GtkAttachOptions) (0), 0, 0); - gtk_signal_connect (GTK_OBJECT (checkbutton_double), "toggled", - GTK_SIGNAL_FUNC (on_bool_toggled), - NULL); - gtk_object_set_data (GTK_OBJECT(checkbutton_double),"param",(void*)p); - p->user_data = checkbutton_double; - p->change_listener = my_bool_listener; - break; - } - } - } - } - - gtk_widget_show_all(GTK_WIDGET(table)); - gtk_container_add(GTK_CONTAINER(notebook),table); - gtk_notebook_set_tab_label_text(notebook,GTK_WIDGET(table),params->name); -} - -void gtk_data_init(SdlGoom *sg) { - sdlGoom = sg; - if (sdlGoom->config_win) { - int i; - GtkNotebook *notebook; - owin = GTK_OBJECT(sdlGoom->config_win); - notebook = GTK_NOTEBOOK(gtk_object_get_data (owin, "notebook1")); - addParams (notebook, &sdlGoom->screen); - for (i = 0; i < sdlGoom->plugin->nbParams; ++i) { - addParams (notebook, &sdlGoom->plugin->params[i]); - } - } -} - -gboolean -on_config_window_destroy_event (GtkWidget *widget, - GdkEvent *event, - gpointer user_data) -{ - sdlGoom->config_win = 0; - owin = 0; - return FALSE; -} - - -gboolean -on_config_window_delete_event (GtkWidget *widget, - GdkEvent *event, - gpointer user_data) -{ - sdlGoom->config_win = 0; - owin = 0; - return FALSE; -} - diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-callbacks.h kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-callbacks.h --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-callbacks.h 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-callbacks.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,24 +0,0 @@ -#include - - -void -on_checkbutton_double_toggled (GtkToggleButton *togglebutton, - gpointer user_data); - -void -on_spinbutton_fps_changed (GtkEditable *editable, - gpointer user_data); - -void -on_combo_entry_winsize_changed (GtkEditable *editable, - gpointer user_data); - -gboolean -on_config_window_destroy_event (GtkWidget *widget, - GdkEvent *event, - gpointer user_data); - -gboolean -on_config_window_delete_event (GtkWidget *widget, - GdkEvent *event, - gpointer user_data); diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-interface.c kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-interface.c --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-interface.c 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-interface.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,137 +0,0 @@ -/* - * DO NOT EDIT THIS FILE - it is generated by Glade. - */ - -#ifdef HAVE_CONFIG_H -# include -#endif - -#include -#include -#include -#include - -#include -#include - -#include "gtk-callbacks.h" -#include "gtk-interface.h" -#include "gtk-support.h" - -GtkWidget* -create_config_window (void) -{ - GtkWidget *config_window; - GtkWidget *vbox1; - GtkWidget *toolbar1; - GtkWidget *b_open_config; - GtkWidget *b_save_config; - GtkWidget *notebook1; - GtkWidget *scrolledwindow1; - GtkWidget *text1; - GtkWidget *goom_control; - GtkWidget *statusbar1; - - config_window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_widget_set_name (config_window, "config_window"); - gtk_object_set_data (GTK_OBJECT (config_window), "config_window", config_window); - gtk_window_set_title (GTK_WINDOW (config_window), _("Goom Control Center")); - - vbox1 = gtk_vbox_new (FALSE, 0); - gtk_widget_set_name (vbox1, "vbox1"); - gtk_widget_ref (vbox1); - gtk_object_set_data_full (GTK_OBJECT (config_window), "vbox1", vbox1, - (GtkDestroyNotify) gtk_widget_unref); - gtk_widget_show (vbox1); - gtk_container_add (GTK_CONTAINER (config_window), vbox1); - - toolbar1 = gtk_toolbar_new (GTK_ORIENTATION_HORIZONTAL, GTK_TOOLBAR_TEXT); - gtk_widget_set_name (toolbar1, "toolbar1"); - gtk_widget_ref (toolbar1); - gtk_object_set_data_full (GTK_OBJECT (config_window), "toolbar1", toolbar1, - (GtkDestroyNotify) gtk_widget_unref); - gtk_widget_show (toolbar1); - gtk_box_pack_start (GTK_BOX (vbox1), toolbar1, FALSE, FALSE, 0); - gtk_container_set_border_width (GTK_CONTAINER (toolbar1), 3); - gtk_toolbar_set_space_size (GTK_TOOLBAR (toolbar1), 8); - gtk_toolbar_set_space_style (GTK_TOOLBAR (toolbar1), GTK_TOOLBAR_SPACE_LINE); - - b_open_config = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar1), - GTK_TOOLBAR_CHILD_BUTTON, - NULL, - _("Open..."), - NULL, NULL, - NULL, NULL, NULL); - gtk_widget_set_name (b_open_config, "b_open_config"); - gtk_widget_ref (b_open_config); - gtk_object_set_data_full (GTK_OBJECT (config_window), "b_open_config", b_open_config, - (GtkDestroyNotify) gtk_widget_unref); - gtk_widget_show (b_open_config); - - b_save_config = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar1), - GTK_TOOLBAR_CHILD_BUTTON, - NULL, - _("Save..."), - NULL, NULL, - NULL, NULL, NULL); - gtk_widget_set_name (b_save_config, "b_save_config"); - gtk_widget_ref (b_save_config); - gtk_object_set_data_full (GTK_OBJECT (config_window), "b_save_config", b_save_config, - (GtkDestroyNotify) gtk_widget_unref); - gtk_widget_show (b_save_config); - - notebook1 = gtk_notebook_new (); - gtk_widget_set_name (notebook1, "notebook1"); - gtk_widget_ref (notebook1); - gtk_object_set_data_full (GTK_OBJECT (config_window), "notebook1", notebook1, - (GtkDestroyNotify) gtk_widget_unref); - gtk_widget_show (notebook1); - gtk_box_pack_start (GTK_BOX (vbox1), notebook1, TRUE, TRUE, 0); - gtk_notebook_set_tab_pos (GTK_NOTEBOOK (notebook1), GTK_POS_LEFT); - - scrolledwindow1 = gtk_scrolled_window_new (NULL, NULL); - gtk_widget_set_name (scrolledwindow1, "scrolledwindow1"); - gtk_widget_ref (scrolledwindow1); - gtk_object_set_data_full (GTK_OBJECT (config_window), "scrolledwindow1", scrolledwindow1, - (GtkDestroyNotify) gtk_widget_unref); - gtk_widget_show (scrolledwindow1); - gtk_container_add (GTK_CONTAINER (notebook1), scrolledwindow1); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow1), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS); - - text1 = gtk_text_new (NULL, NULL); - gtk_widget_set_name (text1, "text1"); - gtk_widget_ref (text1); - gtk_object_set_data_full (GTK_OBJECT (config_window), "text1", text1, - (GtkDestroyNotify) gtk_widget_unref); - gtk_widget_show (text1); - gtk_container_add (GTK_CONTAINER (scrolledwindow1), text1); - gtk_widget_set_usize (text1, 400, 300); - gtk_text_insert (GTK_TEXT (text1), NULL, NULL, NULL, - _("What a GOOM!! v2\n\ncopyright 2000-2003, by J.C. Hoelt \n\nThis is my first visual plugins for XMMS, and I\nthink that it's the best I have ever done !\n\n---\n\nThis dialog will help you to configure goom.\nMany options here will seem strange to you,\nanyway, just try things and look what happen !\n\nEnjoy,\n\n\tJeko"), 317); - - goom_control = gtk_label_new (_("About goom...")); - gtk_widget_set_name (goom_control, "goom_control"); - gtk_widget_ref (goom_control); - gtk_object_set_data_full (GTK_OBJECT (config_window), "goom_control", goom_control, - (GtkDestroyNotify) gtk_widget_unref); - gtk_widget_show (goom_control); - gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook1), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook1), 0), goom_control); - - statusbar1 = gtk_statusbar_new (); - gtk_widget_set_name (statusbar1, "statusbar1"); - gtk_widget_ref (statusbar1); - gtk_object_set_data_full (GTK_OBJECT (config_window), "statusbar1", statusbar1, - (GtkDestroyNotify) gtk_widget_unref); - gtk_widget_show (statusbar1); - gtk_box_pack_start (GTK_BOX (vbox1), statusbar1, FALSE, FALSE, 0); - - gtk_signal_connect (GTK_OBJECT (config_window), "destroy_event", - GTK_SIGNAL_FUNC (on_config_window_destroy_event), - NULL); - gtk_signal_connect (GTK_OBJECT (config_window), "delete_event", - GTK_SIGNAL_FUNC (on_config_window_delete_event), - NULL); - - return config_window; -} - diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-interface.h kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-interface.h --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-interface.h 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-interface.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ -/* - * DO NOT EDIT THIS FILE - it is generated by Glade. - */ - -GtkWidget* create_config_window (void); diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-support.c kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-support.c --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-support.c 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-support.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,162 +0,0 @@ -/* - * DO NOT EDIT THIS FILE - it is generated by Glade. - */ - -#ifdef HAVE_CONFIG_H -# include -#endif - -#include -#include -#include -#include - -#include - -#include "gtk-support.h" - -/* This is an internally used function to check if a pixmap file exists. */ -static gchar* check_file_exists (const gchar *directory, - const gchar *filename); - -/* This is an internally used function to create pixmaps. */ -static GtkWidget* create_dummy_pixmap (GtkWidget *widget); - -GtkWidget* -lookup_widget (GtkWidget *widget, - const gchar *widget_name) -{ - GtkWidget *parent, *found_widget; - - for (;;) - { - if (GTK_IS_MENU (widget)) - parent = gtk_menu_get_attach_widget (GTK_MENU (widget)); - else - parent = widget->parent; - if (parent == NULL) - break; - widget = parent; - } - - found_widget = (GtkWidget*) gtk_object_get_data (GTK_OBJECT (widget), - widget_name); - if (!found_widget) - g_warning ("Widget not found: %s", widget_name); - return found_widget; -} - -/* This is a dummy pixmap we use when a pixmap can't be found. */ -static char *dummy_pixmap_xpm[] = { -/* columns rows colors chars-per-pixel */ -"1 1 1 1", -" c None", -/* pixels */ -" " -}; - -/* This is an internally used function to create pixmaps. */ -static GtkWidget* -create_dummy_pixmap (GtkWidget *widget) -{ - GdkColormap *colormap; - GdkPixmap *gdkpixmap; - GdkBitmap *mask; - GtkWidget *pixmap; - - colormap = gtk_widget_get_colormap (widget); - gdkpixmap = gdk_pixmap_colormap_create_from_xpm_d (NULL, colormap, &mask, - NULL, dummy_pixmap_xpm); - if (gdkpixmap == NULL) - g_error ("Couldn't create replacement pixmap."); - pixmap = gtk_pixmap_new (gdkpixmap, mask); - gdk_pixmap_unref (gdkpixmap); - gdk_bitmap_unref (mask); - return pixmap; -} - -static GList *pixmaps_directories = NULL; - -/* Use this function to set the directory containing installed pixmaps. */ -void -add_pixmap_directory (const gchar *directory) -{ - pixmaps_directories = g_list_prepend (pixmaps_directories, - g_strdup (directory)); -} - -/* This is an internally used function to create pixmaps. */ -GtkWidget* -create_pixmap (GtkWidget *widget, - const gchar *filename) -{ - gchar *found_filename = NULL; - GdkColormap *colormap; - GdkPixmap *gdkpixmap; - GdkBitmap *mask; - GtkWidget *pixmap; - GList *elem; - - if (!filename || !filename[0]) - return create_dummy_pixmap (widget); - - /* We first try any pixmaps directories set by the application. */ - elem = pixmaps_directories; - while (elem) - { - found_filename = check_file_exists ((gchar*)elem->data, filename); - if (found_filename) - break; - elem = elem->next; - } - - /* If we haven't found the pixmap, try the source directory. */ - if (!found_filename) - { - found_filename = check_file_exists ("../pixmaps", filename); - } - - if (!found_filename) - { - g_warning (_("Couldn't find pixmap file: %s"), filename); - return create_dummy_pixmap (widget); - } - - colormap = gtk_widget_get_colormap (widget); - gdkpixmap = gdk_pixmap_colormap_create_from_xpm (NULL, colormap, &mask, - NULL, found_filename); - if (gdkpixmap == NULL) - { - g_warning (_("Error loading pixmap file: %s"), found_filename); - g_free (found_filename); - return create_dummy_pixmap (widget); - } - g_free (found_filename); - pixmap = gtk_pixmap_new (gdkpixmap, mask); - gdk_pixmap_unref (gdkpixmap); - gdk_bitmap_unref (mask); - return pixmap; -} - -/* This is an internally used function to check if a pixmap file exists. */ -gchar* -check_file_exists (const gchar *directory, - const gchar *filename) -{ - gchar *full_filename; - struct stat s; - gint status; - - full_filename = (gchar*) g_malloc (strlen (directory) + 1 - + strlen (filename) + 1); - strcpy (full_filename, directory); - strcat (full_filename, G_DIR_SEPARATOR_S); - strcat (full_filename, filename); - - status = stat (full_filename, &s); - if (status == 0 && S_ISREG (s.st_mode)) - return full_filename; - g_free (full_filename); - return NULL; -} - diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-support.h kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-support.h --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-support.h 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/gtk-gui/gtk-support.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,61 +0,0 @@ -/* - * DO NOT EDIT THIS FILE - it is generated by Glade. - */ - -#ifdef HAVE_CONFIG_H -# include -#endif - -#include - -/* - * Standard gettext macros. - */ -#ifdef ENABLE_NLS -# include -# undef _ -# define _(String) dgettext (PACKAGE, String) -# ifdef gettext_noop -# define N_(String) gettext_noop (String) -# else -# define N_(String) (String) -# endif -#else -# define textdomain(String) (String) -# define gettext(String) (String) -# define dgettext(Domain,Message) (Message) -# define dcgettext(Domain,Message,Type) (Message) -# define bindtextdomain(Domain,Directory) (Domain) -# define _(String) (String) -# define N_(String) (String) -#endif - - -/* - * Public Functions. - */ - -/* - * This function returns a widget in a component created by Glade. - * Call it with the toplevel widget in the component (i.e. a window/dialog), - * or alternatively any widget in the component, and the name of the widget - * you want returned. - */ -GtkWidget* lookup_widget (GtkWidget *widget, - const gchar *widget_name); - -/* get_widget() is deprecated. Use lookup_widget instead. */ -#define get_widget lookup_widget - -/* Use this function to set the directory containing installed pixmaps. */ -void add_pixmap_directory (const gchar *directory); - - -/* - * Private Functions. - */ - -/* This is used to create the pixmaps in the interface. */ -GtkWidget* create_pixmap (GtkWidget *widget, - const gchar *filename); - diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/gtk-gui/main.c kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/gtk-gui/main.c --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/gtk-gui/main.c 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/gtk-gui/main.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,42 +0,0 @@ -/* - * Initial main.c file generated by Glade. Edit as required. - * Glade will not overwrite this file. - */ - -#ifdef HAVE_CONFIG_H -# include -#endif - -#include - -#include "interface.h" -#include "support.h" - -int -main (int argc, char *argv[]) -{ - GtkWidget *config_window; - -#ifdef ENABLE_NLS - bindtextdomain (PACKAGE, PACKAGE_LOCALE_DIR); - textdomain (PACKAGE); -#endif - - gtk_set_locale (); - gtk_init (&argc, &argv); - - add_pixmap_directory (PACKAGE_DATA_DIR "/pixmaps"); - add_pixmap_directory (PACKAGE_SOURCE_DIR "/pixmaps"); - - /* - * The following code was added by Glade to create one of each component - * (except popup menus), just so that you see something after building - * the project. Delete any components that you don't want shown initially. - */ - config_window = create_config_window (); - gtk_widget_show (config_window); - - gtk_main (); - return 0; -} - diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/gtk-gui/Makefile.am kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/gtk-gui/Makefile.am --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/gtk-gui/Makefile.am 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/gtk-gui/Makefile.am 1970-01-01 00:00:00.000000000 +0000 @@ -1,16 +0,0 @@ -## Process this file with automake to produce Makefile.in - -INCLUDES = \ - -I$(top_srcdir)/intl \ - @GTK_CFLAGS@ - -bin_PROGRAMS = goom2 - -goom2_SOURCES = \ - main.c \ - support.c support.h \ - interface.c interface.h \ - callbacks.c callbacks.h - -goom2_LDADD = @GTK_LIBS@ $(INTLLIBS) - diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/INSTALL kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/INSTALL --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/INSTALL 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/INSTALL 1970-01-01 00:00:00.000000000 +0000 @@ -1,231 +0,0 @@ -Copyright 1994, 1995, 1996, 1999, 2000, 2001 Free Software Foundation, -Inc. - - This file is free documentation; the Free Software Foundation gives -unlimited permission to copy, distribute and modify it. - -Basic Installation -================== - - These are generic installation instructions. - - The `configure' shell script attempts to guess correct values for -various system-dependent variables used during compilation. It uses -those values to create a `Makefile' in each directory of the package. -It may also create one or more `.h' files containing system-dependent -definitions. Finally, it creates a shell script `config.status' that -you can run in the future to recreate the current configuration, and a -file `config.log' containing compiler output (useful mainly for -debugging `configure'). - - It can also use an optional file (typically called `config.cache' -and enabled with `--cache-file=config.cache' or simply `-C') that saves -the results of its tests to speed up reconfiguring. (Caching is -disabled by default to prevent problems with accidental use of stale -cache files.) - - If you need to do unusual things to compile the package, please try -to figure out how `configure' could check whether to do them, and mail -diffs or instructions to the address given in the `README' so they can -be considered for the next release. If you are using the cache, and at -some point `config.cache' contains results you don't want to keep, you -may remove or edit it. - - The file `configure.ac' (or `configure.in') is used to create -`configure' by a program called `autoconf'. You only need -`configure.ac' if you want to change it or regenerate `configure' using -a newer version of `autoconf'. - -The simplest way to compile this package is: - - 1. `cd' to the directory containing the package's source code and type - `./configure' to configure the package for your system. If you're - using `csh' on an old version of System V, you might need to type - `sh ./configure' instead to prevent `csh' from trying to execute - `configure' itself. - - Running `configure' takes awhile. While running, it prints some - messages telling which features it is checking for. - - 2. Type `make' to compile the package. - - 3. Optionally, type `make check' to run any self-tests that come with - the package. - - 4. Type `make install' to install the programs and any data files and - documentation. - - 5. You can remove the program binaries and object files from the - source code directory by typing `make clean'. To also remove the - files that `configure' created (so you can compile the package for - a different kind of computer), type `make distclean'. There is - also a `make maintainer-clean' target, but that is intended mainly - for the package's developers. If you use it, you may have to get - all sorts of other programs in order to regenerate files that came - with the distribution. - -Compilers and Options -===================== - - Some systems require unusual options for compilation or linking that -the `configure' script does not know about. Run `./configure --help' -for details on some of the pertinent environment variables. - - You can give `configure' initial values for variables by setting -them in the environment. You can do that on the command line like this: - - ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix - - *Note Defining Variables::, for more details. - -Compiling For Multiple Architectures -==================================== - - You can compile the package for more than one kind of computer at the -same time, by placing the object files for each architecture in their -own directory. To do this, you must use a version of `make' that -supports the `VPATH' variable, such as GNU `make'. `cd' to the -directory where you want the object files and executables to go and run -the `configure' script. `configure' automatically checks for the -source code in the directory that `configure' is in and in `..'. - - If you have to use a `make' that does not support the `VPATH' -variable, you have to compile the package for one architecture at a -time in the source code directory. After you have installed the -package for one architecture, use `make distclean' before reconfiguring -for another architecture. - -Installation Names -================== - - By default, `make install' will install the package's files in -`/usr/local/bin', `/usr/local/man', etc. You can specify an -installation prefix other than `/usr/local' by giving `configure' the -option `--prefix=PATH'. - - You can specify separate installation prefixes for -architecture-specific files and architecture-independent files. If you -give `configure' the option `--exec-prefix=PATH', the package will use -PATH as the prefix for installing programs and libraries. -Documentation and other data files will still use the regular prefix. - - In addition, if you use an unusual directory layout you can give -options like `--bindir=PATH' to specify different values for particular -kinds of files. Run `configure --help' for a list of the directories -you can set and what kinds of files go in them. - - If the package supports it, you can cause programs to be installed -with an extra prefix or suffix on their names by giving `configure' the -option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. - -Optional Features -================= - - Some packages pay attention to `--enable-FEATURE' options to -`configure', where FEATURE indicates an optional part of the package. -They may also pay attention to `--with-PACKAGE' options, where PACKAGE -is something like `gnu-as' or `x' (for the X Window System). The -`README' should mention any `--enable-' and `--with-' options that the -package recognizes. - - For packages that use the X Window System, `configure' can usually -find the X include and library files automatically, but if it doesn't, -you can use the `configure' options `--x-includes=DIR' and -`--x-libraries=DIR' to specify their locations. - -Specifying the System Type -========================== - - There may be some features `configure' cannot figure out -automatically, but needs to determine by the type of host the package -will run on. Usually `configure' can figure that out, but if it prints -a message saying it cannot guess the host type, give it the -`--build=TYPE' option. TYPE can either be a short name for the system -type, such as `sun4', or a canonical name which has the form: - - CPU-COMPANY-SYSTEM - -where SYSTEM can have one of these forms: - - OS KERNEL-OS - - See the file `config.sub' for the possible values of each field. If -`config.sub' isn't included in this package, then this package doesn't -need to know the host type. - - If you are _building_ compiler tools for cross-compiling, you should -use the `--target=TYPE' option to select the type of system they will -produce code for. - - If you want to _use_ a cross compiler, that generates code for a -platform different from the build platform, you should specify the host -platform (i.e., that on which the generated programs will eventually be -run) with `--host=TYPE'. In this case, you should also specify the -build platform with `--build=TYPE', because, in this case, it may not -be possible to guess the build platform (it sometimes involves -compiling and running simple test programs, and this can't be done if -the compiler is a cross compiler). - -Sharing Defaults -================ - - If you want to set default values for `configure' scripts to share, -you can create a site shell script called `config.site' that gives -default values for variables like `CC', `cache_file', and `prefix'. -`configure' looks for `PREFIX/share/config.site' if it exists, then -`PREFIX/etc/config.site' if it exists. Or, you can set the -`CONFIG_SITE' environment variable to the location of the site script. -A warning: not all `configure' scripts look for a site script. - -Defining Variables -================== - - Variables not defined in a site shell script can be set in the -environment passed to `configure'. However, some packages may run -configure again during the build, and the customized values of these -variables may be lost. In order to avoid this problem, you should set -them in the `configure' command line, using `VAR=value'. For example: - - ./configure CC=/usr/local2/bin/gcc - -will cause the specified gcc to be used as the C compiler (unless it is -overridden in the site shell script). - -`configure' Invocation -====================== - - `configure' recognizes the following options to control how it -operates. - -`--help' -`-h' - Print a summary of the options to `configure', and exit. - -`--version' -`-V' - Print the version of Autoconf used to generate the `configure' - script, and exit. - -`--cache-file=FILE' - Enable the cache: use and save the results of the tests in FILE, - traditionally `config.cache'. FILE defaults to `/dev/null' to - disable caching. - -`--config-cache' -`-C' - Alias for `--cache-file=config.cache'. - -`--quiet' -`--silent' -`-q' - Do not print messages saying which checks are being made. To - suppress all normal output, redirect it to `/dev/null' (any error - messages will still be shown). - -`--srcdir=DIR' - Look for the package's source code in directory DIR. Usually - `configure' can determine that directory automatically. - -`configure' also accepts some other, not widely useful, options. Run -`configure --help' for more details. - diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/install-sh kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/install-sh --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/install-sh 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/install-sh 1970-01-01 00:00:00.000000000 +0000 @@ -1,251 +0,0 @@ -#!/bin/sh -# -# install - install a program, script, or datafile -# This comes from X11R5 (mit/util/scripts/install.sh). -# -# Copyright 1991 by the Massachusetts Institute of Technology -# -# Permission to use, copy, modify, distribute, and sell this software and its -# documentation for any purpose is hereby granted without fee, provided that -# the above copyright notice appear in all copies and that both that -# copyright notice and this permission notice appear in supporting -# documentation, and that the name of M.I.T. not be used in advertising or -# publicity pertaining to distribution of the software without specific, -# written prior permission. M.I.T. makes no representations about the -# suitability of this software for any purpose. It is provided "as is" -# without express or implied warranty. -# -# Calling this script install-sh is preferred over install.sh, to prevent -# `make' implicit rules from creating a file called install from it -# when there is no Makefile. -# -# This script is compatible with the BSD install script, but was written -# from scratch. It can only install one file at a time, a restriction -# shared with many OS's install programs. - - -# set DOITPROG to echo to test this script - -# Don't use :- since 4.3BSD and earlier shells don't like it. -doit="${DOITPROG-}" - - -# put in absolute paths if you don't have them in your path; or use env. vars. - -mvprog="${MVPROG-mv}" -cpprog="${CPPROG-cp}" -chmodprog="${CHMODPROG-chmod}" -chownprog="${CHOWNPROG-chown}" -chgrpprog="${CHGRPPROG-chgrp}" -stripprog="${STRIPPROG-strip}" -rmprog="${RMPROG-rm}" -mkdirprog="${MKDIRPROG-mkdir}" - -transformbasename="" -transform_arg="" -instcmd="$mvprog" -chmodcmd="$chmodprog 0755" -chowncmd="" -chgrpcmd="" -stripcmd="" -rmcmd="$rmprog -f" -mvcmd="$mvprog" -src="" -dst="" -dir_arg="" - -while [ x"$1" != x ]; do - case $1 in - -c) instcmd="$cpprog" - shift - continue;; - - -d) dir_arg=true - shift - continue;; - - -m) chmodcmd="$chmodprog $2" - shift - shift - continue;; - - -o) chowncmd="$chownprog $2" - shift - shift - continue;; - - -g) chgrpcmd="$chgrpprog $2" - shift - shift - continue;; - - -s) stripcmd="$stripprog" - shift - continue;; - - -t=*) transformarg=`echo $1 | sed 's/-t=//'` - shift - continue;; - - -b=*) transformbasename=`echo $1 | sed 's/-b=//'` - shift - continue;; - - *) if [ x"$src" = x ] - then - src=$1 - else - # this colon is to work around a 386BSD /bin/sh bug - : - dst=$1 - fi - shift - continue;; - esac -done - -if [ x"$src" = x ] -then - echo "install: no input file specified" - exit 1 -else - : -fi - -if [ x"$dir_arg" != x ]; then - dst=$src - src="" - - if [ -d $dst ]; then - instcmd=: - chmodcmd="" - else - instcmd=$mkdirprog - fi -else - -# Waiting for this to be detected by the "$instcmd $src $dsttmp" command -# might cause directories to be created, which would be especially bad -# if $src (and thus $dsttmp) contains '*'. - - if [ -f $src -o -d $src ] - then - : - else - echo "install: $src does not exist" - exit 1 - fi - - if [ x"$dst" = x ] - then - echo "install: no destination specified" - exit 1 - else - : - fi - -# If destination is a directory, append the input filename; if your system -# does not like double slashes in filenames, you may need to add some logic - - if [ -d $dst ] - then - dst="$dst"/`basename $src` - else - : - fi -fi - -## this sed command emulates the dirname command -dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` - -# Make sure that the destination directory exists. -# this part is taken from Noah Friedman's mkinstalldirs script - -# Skip lots of stat calls in the usual case. -if [ ! -d "$dstdir" ]; then -defaultIFS=' - ' -IFS="${IFS-${defaultIFS}}" - -oIFS="${IFS}" -# Some sh's can't handle IFS=/ for some reason. -IFS='%' -set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` -IFS="${oIFS}" - -pathcomp='' - -while [ $# -ne 0 ] ; do - pathcomp="${pathcomp}${1}" - shift - - if [ ! -d "${pathcomp}" ] ; - then - $mkdirprog "${pathcomp}" - else - : - fi - - pathcomp="${pathcomp}/" -done -fi - -if [ x"$dir_arg" != x ] -then - $doit $instcmd $dst && - - if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else : ; fi && - if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else : ; fi && - if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else : ; fi && - if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else : ; fi -else - -# If we're going to rename the final executable, determine the name now. - - if [ x"$transformarg" = x ] - then - dstfile=`basename $dst` - else - dstfile=`basename $dst $transformbasename | - sed $transformarg`$transformbasename - fi - -# don't allow the sed command to completely eliminate the filename - - if [ x"$dstfile" = x ] - then - dstfile=`basename $dst` - else - : - fi - -# Make a temp file name in the proper directory. - - dsttmp=$dstdir/#inst.$$# - -# Move or copy the file name to the temp name - - $doit $instcmd $src $dsttmp && - - trap "rm -f ${dsttmp}" 0 && - -# and set any options; do chmod last to preserve setuid bits - -# If any of these fail, we abort the whole thing. If we want to -# ignore errors from any of these, just make sure not to ignore -# errors from the above "$doit $instcmd $src $dsttmp" command. - - if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else :;fi && - if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else :;fi && - if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else :;fi && - if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else :;fi && - -# Now rename the file to the real destination. - - $doit $rmcmd -f $dstdir/$dstfile && - $doit $mvcmd $dsttmp $dstdir/$dstfile - -fi && - - -exit 0 diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/intl/bindtextdom.c kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/intl/bindtextdom.c --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/intl/bindtextdom.c 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/intl/bindtextdom.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,203 +0,0 @@ -/* Implementation of the bindtextdomain(3) function - Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ifdef HAVE_CONFIG_H -# include -#endif - -#if defined STDC_HEADERS || defined _LIBC -# include -#else -# ifdef HAVE_MALLOC_H -# include -# else -void free (); -# endif -#endif - -#if defined HAVE_STRING_H || defined _LIBC -# include -#else -# include -# ifndef memcpy -# define memcpy(Dst, Src, Num) bcopy (Src, Dst, Num) -# endif -#endif - -#ifdef _LIBC -# include -#else -# include "libgettext.h" -#endif -#include "gettext.h" -#include "gettextP.h" - -/* @@ end of prolog @@ */ - -/* Contains the default location of the message catalogs. */ -extern const char _nl_default_dirname[]; - -/* List with bindings of specific domains. */ -extern struct binding *_nl_domain_bindings; - - -/* Names for the libintl functions are a problem. They must not clash - with existing names and they should follow ANSI C. But this source - code is also used in GNU C Library where the names have a __ - prefix. So we have to make a difference here. */ -#ifdef _LIBC -# define BINDTEXTDOMAIN __bindtextdomain -# ifndef strdup -# define strdup(str) __strdup (str) -# endif -#else -# define BINDTEXTDOMAIN bindtextdomain__ -#endif - -/* Specify that the DOMAINNAME message catalog will be found - in DIRNAME rather than in the system locale data base. */ -char * -BINDTEXTDOMAIN (domainname, dirname) - const char *domainname; - const char *dirname; -{ - struct binding *binding; - - /* Some sanity checks. */ - if (domainname == NULL || domainname[0] == '\0') - return NULL; - - for (binding = _nl_domain_bindings; binding != NULL; binding = binding->next) - { - int compare = strcmp (domainname, binding->domainname); - if (compare == 0) - /* We found it! */ - break; - if (compare < 0) - { - /* It is not in the list. */ - binding = NULL; - break; - } - } - - if (dirname == NULL) - /* The current binding has be to returned. */ - return binding == NULL ? (char *) _nl_default_dirname : binding->dirname; - - if (binding != NULL) - { - /* The domain is already bound. If the new value and the old - one are equal we simply do nothing. Otherwise replace the - old binding. */ - if (strcmp (dirname, binding->dirname) != 0) - { - char *new_dirname; - - if (strcmp (dirname, _nl_default_dirname) == 0) - new_dirname = (char *) _nl_default_dirname; - else - { -#if defined _LIBC || defined HAVE_STRDUP - new_dirname = strdup (dirname); - if (new_dirname == NULL) - return NULL; -#else - size_t len = strlen (dirname) + 1; - new_dirname = (char *) malloc (len); - if (new_dirname == NULL) - return NULL; - - memcpy (new_dirname, dirname, len); -#endif - } - - if (binding->dirname != _nl_default_dirname) - free (binding->dirname); - - binding->dirname = new_dirname; - } - } - else - { - /* We have to create a new binding. */ -#if !defined _LIBC && !defined HAVE_STRDUP - size_t len; -#endif - struct binding *new_binding = - (struct binding *) malloc (sizeof (*new_binding)); - - if (new_binding == NULL) - return NULL; - -#if defined _LIBC || defined HAVE_STRDUP - new_binding->domainname = strdup (domainname); - if (new_binding->domainname == NULL) - return NULL; -#else - len = strlen (domainname) + 1; - new_binding->domainname = (char *) malloc (len); - if (new_binding->domainname == NULL) - return NULL; - memcpy (new_binding->domainname, domainname, len); -#endif - - if (strcmp (dirname, _nl_default_dirname) == 0) - new_binding->dirname = (char *) _nl_default_dirname; - else - { -#if defined _LIBC || defined HAVE_STRDUP - new_binding->dirname = strdup (dirname); - if (new_binding->dirname == NULL) - return NULL; -#else - len = strlen (dirname) + 1; - new_binding->dirname = (char *) malloc (len); - if (new_binding->dirname == NULL) - return NULL; - memcpy (new_binding->dirname, dirname, len); -#endif - } - - /* Now enqueue it. */ - if (_nl_domain_bindings == NULL - || strcmp (domainname, _nl_domain_bindings->domainname) < 0) - { - new_binding->next = _nl_domain_bindings; - _nl_domain_bindings = new_binding; - } - else - { - binding = _nl_domain_bindings; - while (binding->next != NULL - && strcmp (domainname, binding->next->domainname) > 0) - binding = binding->next; - - new_binding->next = binding->next; - binding->next = new_binding; - } - - binding = new_binding; - } - - return binding->dirname; -} - -#ifdef _LIBC -/* Alias for function name in GNU C Library. */ -weak_alias (__bindtextdomain, bindtextdomain); -#endif diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/intl/cat-compat.c kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/intl/cat-compat.c --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/intl/cat-compat.c 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/intl/cat-compat.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,262 +0,0 @@ -/* Compatibility code for gettext-using-catgets interface. - Copyright (C) 1995, 1997 Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ifdef HAVE_CONFIG_H -# include -#endif - -#include - -#ifdef STDC_HEADERS -# include -# include -#else -char *getenv (); -# ifdef HAVE_MALLOC_H -# include -# endif -#endif - -#ifdef HAVE_NL_TYPES_H -# include -#endif - -#include "libgettext.h" - -/* @@ end of prolog @@ */ - -/* XPG3 defines the result of `setlocale (category, NULL)' as: - ``Directs `setlocale()' to query `category' and return the current - setting of `local'.'' - However it does not specify the exact format. And even worse: POSIX - defines this not at all. So we can use this feature only on selected - system (e.g. those using GNU C Library). */ -#ifdef _LIBC -# define HAVE_LOCALE_NULL -#endif - -/* The catalog descriptor. */ -static nl_catd catalog = (nl_catd) -1; - -/* Name of the default catalog. */ -static const char default_catalog_name[] = "messages"; - -/* Name of currently used catalog. */ -static const char *catalog_name = default_catalog_name; - -/* Get ID for given string. If not found return -1. */ -static int msg_to_cat_id PARAMS ((const char *msg)); - -/* Substitution for systems lacking this function in their C library. */ -#if !_LIBC && !HAVE_STPCPY -static char *stpcpy PARAMS ((char *dest, const char *src)); -#endif - - -/* Set currently used domain/catalog. */ -char * -textdomain (domainname) - const char *domainname; -{ - nl_catd new_catalog; - char *new_name; - size_t new_name_len; - char *lang; - -#if defined HAVE_SETLOCALE && defined HAVE_LC_MESSAGES \ - && defined HAVE_LOCALE_NULL - lang = setlocale (LC_MESSAGES, NULL); -#else - lang = getenv ("LC_ALL"); - if (lang == NULL || lang[0] == '\0') - { - lang = getenv ("LC_MESSAGES"); - if (lang == NULL || lang[0] == '\0') - lang = getenv ("LANG"); - } -#endif - if (lang == NULL || lang[0] == '\0') - lang = "C"; - - /* See whether name of currently used domain is asked. */ - if (domainname == NULL) - return (char *) catalog_name; - - if (domainname[0] == '\0') - domainname = default_catalog_name; - - /* Compute length of added path element. */ - new_name_len = sizeof (LOCALEDIR) - 1 + 1 + strlen (lang) - + sizeof ("/LC_MESSAGES/") - 1 + sizeof (PACKAGE) - 1 - + sizeof (".cat"); - - new_name = (char *) malloc (new_name_len); - if (new_name == NULL) - return NULL; - - strcpy (new_name, PACKAGE); - new_catalog = catopen (new_name, 0); - - if (new_catalog == (nl_catd) -1) - { - /* NLSPATH search didn't work, try absolute path */ - sprintf (new_name, "%s/%s/LC_MESSAGES/%s.cat", LOCALEDIR, lang, - PACKAGE); - new_catalog = catopen (new_name, 0); - - if (new_catalog == (nl_catd) -1) - { - free (new_name); - return (char *) catalog_name; - } - } - - /* Close old catalog. */ - if (catalog != (nl_catd) -1) - catclose (catalog); - if (catalog_name != default_catalog_name) - free ((char *) catalog_name); - - catalog = new_catalog; - catalog_name = new_name; - - return (char *) catalog_name; -} - -char * -bindtextdomain (domainname, dirname) - const char *domainname; - const char *dirname; -{ -#if HAVE_SETENV || HAVE_PUTENV - char *old_val, *new_val, *cp; - size_t new_val_len; - - /* This does not make much sense here but to be compatible do it. */ - if (domainname == NULL) - return NULL; - - /* Compute length of added path element. If we use setenv we don't need - the first byts for NLSPATH=, but why complicate the code for this - peanuts. */ - new_val_len = sizeof ("NLSPATH=") - 1 + strlen (dirname) - + sizeof ("/%L/LC_MESSAGES/%N.cat"); - - old_val = getenv ("NLSPATH"); - if (old_val == NULL || old_val[0] == '\0') - { - old_val = NULL; - new_val_len += 1 + sizeof (LOCALEDIR) - 1 - + sizeof ("/%L/LC_MESSAGES/%N.cat"); - } - else - new_val_len += strlen (old_val); - - new_val = (char *) malloc (new_val_len); - if (new_val == NULL) - return NULL; - -# if HAVE_SETENV - cp = new_val; -# else - cp = stpcpy (new_val, "NLSPATH="); -# endif - - cp = stpcpy (cp, dirname); - cp = stpcpy (cp, "/%L/LC_MESSAGES/%N.cat:"); - - if (old_val == NULL) - { -# if __STDC__ - stpcpy (cp, LOCALEDIR "/%L/LC_MESSAGES/%N.cat"); -# else - - cp = stpcpy (cp, LOCALEDIR); - stpcpy (cp, "/%L/LC_MESSAGES/%N.cat"); -# endif - } - else - stpcpy (cp, old_val); - -# if HAVE_SETENV - setenv ("NLSPATH", new_val, 1); - free (new_val); -# else - putenv (new_val); - /* Do *not* free the environment entry we just entered. It is used - from now on. */ -# endif - -#endif - - return (char *) domainname; -} - -#undef gettext -char * -gettext (msg) - const char *msg; -{ - int msgid; - - if (msg == NULL || catalog == (nl_catd) -1) - return (char *) msg; - - /* Get the message from the catalog. We always use set number 1. - The message ID is computed by the function `msg_to_cat_id' - which works on the table generated by `po-to-tbl'. */ - msgid = msg_to_cat_id (msg); - if (msgid == -1) - return (char *) msg; - - return catgets (catalog, 1, msgid, (char *) msg); -} - -/* Look through the table `_msg_tbl' which has `_msg_tbl_length' entries - for the one equal to msg. If it is found return the ID. In case when - the string is not found return -1. */ -static int -msg_to_cat_id (msg) - const char *msg; -{ - int cnt; - - for (cnt = 0; cnt < _msg_tbl_length; ++cnt) - if (strcmp (msg, _msg_tbl[cnt]._msg) == 0) - return _msg_tbl[cnt]._msg_number; - - return -1; -} - - -/* @@ begin of epilog @@ */ - -/* We don't want libintl.a to depend on any other library. So we - avoid the non-standard function stpcpy. In GNU C Library this - function is available, though. Also allow the symbol HAVE_STPCPY - to be defined. */ -#if !_LIBC && !HAVE_STPCPY -static char * -stpcpy (dest, src) - char *dest; - const char *src; -{ - while ((*dest++ = *src++) != '\0') - /* Do nothing. */ ; - return dest - 1; -} -#endif diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/intl/ChangeLog kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/intl/ChangeLog --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/intl/ChangeLog 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/intl/ChangeLog 1970-01-01 00:00:00.000000000 +0000 @@ -1,1086 +0,0 @@ -1998-04-29 Ulrich Drepper - - * intl/localealias.c (read_alias_file): Use unsigned char for - local variables. Remove unused variable tp. - * intl/l10nflist.c (_nl_normalize_codeset): Use unsigned char * - for type of codeset. For loosing Solaris systems. - * intl/loadinfo.h: Adapt prototype of _nl_normalize_codeset. - * intl/bindtextdom.c (BINDTEXTDOMAIN): Don't define local variable - len if not needed. - Patches by Jim Meyering. - -1998-04-28 Ulrich Drepper - - * loadmsgcat.c (_nl_load_domain): Don't assign the element use_mmap if - mmap is not supported. - - * hash-string.h: Don't include . - -1998-04-27 Ulrich Drepper - - * textdomain.c: Use strdup is available. - - * localealias.c: Define HAVE_MEMPCPY so that we can use this - function. Define and use semapahores to protect modfication of - global objects when compiling for glibc. Add code to allow - freeing alias table. - - * l10nflist.c: Don't assume stpcpy not being a macro. - - * gettextP.h: Define internal_function macri if not already done. - Use glibc byte-swap macros instead of defining SWAP when compiled - for glibc. - (struct loaded_domain): Add elements to allow unloading. - - * Makefile.in (distclean): Don't remove libintl.h here. - - * bindtextdomain.c: Carry over changes from glibc. Use strdup if - available. - - * dcgettext.c: Don't assume stpcpy not being a macro. Mark internal - functions. Add memory freeing code for glibc. - - * dgettext.c: Update copyright. - - * explodename.c: Include stdlib.h and string.h only if they exist. - Use strings.h eventually. - - * finddomain.c: Mark internal functions. Use strdup if available. - Add memory freeing code for glibc. - -1997-10-10 20:00 Ulrich Drepper - - * libgettext.h: Fix dummy textdomain and bindtextdomain macros. - They should return reasonable values. - Reported by Tom Tromey . - -1997-09-16 03:33 Ulrich Drepper - - * libgettext.h: Define PARAMS also to `args' if __cplusplus is defined. - * intlh.inst.in: Likewise. - Reported by Jean-Marc Lasgouttes . - - * libintl.glibc: Update from current glibc version. - -1997-09-06 02:10 Ulrich Drepper - - * intlh.inst.in: Reformat copyright. - -1997-08-19 15:22 Ulrich Drepper - - * dcgettext.c (DCGETTEXT): Remove wrong comment. - -1997-08-16 00:13 Ulrich Drepper - - * Makefile.in (install-data): Don't change directory to install. - -1997-08-01 14:30 Ulrich Drepper - - * cat-compat.c: Fix copyright. - - * localealias.c: Don't define strchr unless !HAVE_STRCHR. - - * loadmsgcat.c: Update copyright. Fix typos. - - * l10nflist.c: Don't define strchr unless !HAVE_STRCHR. - (_nl_make_l10nflist): Handle sponsor and revision correctly. - - * gettext.c: Update copyright. - * gettext.h: Likewise. - * hash-string.h: Likewise. - - * finddomain.c: Remoave dead code. Define strchr only if - !HAVE_STRCHR. - - * explodename.c: Include . - - * explodename.c: Reformat copyright text. - (_nl_explode_name): Fix typo. - - * dcgettext.c: Define and use __set_errno. - (guess_category_value): Don't use setlocale if HAVE_LC_MESSAGES is - not defined. - - * bindtextdom.c: Pretty printing. - -1997-05-01 02:25 Ulrich Drepper - - * dcgettext.c (guess_category_value): Don't depend on - HAVE_LC_MESSAGES. We don't need the macro here. - Patch by Bruno Haible . - - * cat-compat.c (textdomain): DoN't refer to HAVE_SETLOCALE_NULL - macro. Instead use HAVE_LOCALE_NULL and define it when using - glibc, as in dcgettext.c. - Patch by Bruno Haible . - - * Makefile.in (CPPFLAGS): New variable. Reported by Franc,ois - Pinard. - -Mon Mar 10 06:51:17 1997 Ulrich Drepper - - * Makefile.in: Implement handling of libtool. - - * gettextP.h: Change data structures for use of generic lowlevel - i18n file handling. - -Wed Dec 4 20:21:18 1996 Ulrich Drepper - - * textdomain.c: Put parentheses around arguments of memcpy macro - definition. - * localealias.c: Likewise. - * l10nflist.c: Likewise. - * finddomain.c: Likewise. - * bindtextdom.c: Likewise. - Reported by Thomas Esken. - -Mon Nov 25 22:57:51 1996 Ulrich Drepper - - * textdomain.c: Move definition of `memcpy` macro to right - position. - -Fri Nov 22 04:01:58 1996 Ulrich Drepper - - * finddomain.c [!HAVE_STRING_H && !_LIBC]: Define memcpy using - bcopy if not already defined. Reported by Thomas Esken. - * bindtextdom.c: Likewise. - * l10nflist.c: Likewise. - * localealias.c: Likewise. - * textdomain.c: Likewise. - -Tue Oct 29 11:10:27 1996 Ulrich Drepper - - * Makefile.in (libdir): Change to use exec_prefix instead of - prefix. Reported by Knut-HvardAksnes . - -Sat Aug 31 03:07:09 1996 Ulrich Drepper - - * l10nflist.c (_nl_normalize_codeset): We convert to lower case, - so don't prepend uppercase `ISO' for only numeric arg. - -Fri Jul 19 00:15:46 1996 Ulrich Drepper - - * l10nflist.c: Move inclusion of argz.h, ctype.h, stdlib.h after - definition of _GNU_SOURCE. Patch by Roland McGrath. - - * Makefile.in (uninstall): Fix another bug with `for' loop and - empty arguments. Patch by Jim Meyering. Correct name os - uninstalled files: no intl- prefix anymore. - - * Makefile.in (install-data): Again work around shells which - cannot handle mpty for list. Reported by Jim Meyering. - -Sat Jul 13 18:11:35 1996 Ulrich Drepper - - * Makefile.in (install): Split goal. Now depend on install-exec - and install-data. - (install-exec, install-data): New goals. Created from former - install goal. - Reported by Karl Berry. - -Sat Jun 22 04:58:14 1996 Ulrich Drepper - - * Makefile.in (MKINSTALLDIRS): New variable. Path to - mkinstalldirs script. - (install): use MKINSTALLDIRS variable or if the script is not present - try to find it in the $top_scrdir). - -Wed Jun 19 02:56:56 1996 Ulrich Drepper - - * l10nflist.c: Linux libc *partly* includes the argz_* functions. - Grr. Work around by renaming the static version and use macros - for renaming. - -Tue Jun 18 20:11:17 1996 Ulrich Drepper - - * l10nflist.c: Correct presence test macros of __argz_* functions. - - * l10nflist.c: Include based on test of it instead when - __argz_* functions are available. - Reported by Andreas Schwab. - -Thu Jun 13 15:17:44 1996 Ulrich Drepper - - * explodename.c, l10nflist.c: Define NULL for dumb systems. - -Tue Jun 11 17:05:13 1996 Ulrich Drepper - - * intlh.inst.in, libgettext.h (dcgettext): Rename local variable - result to __result to prevent name clash. - - * l10nflist.c, localealias.c, dcgettext.c: Define _GNU_SOURCE to - get prototype for stpcpy and strcasecmp. - - * intlh.inst.in, libgettext.h: Move declaration of - `_nl_msg_cat_cntr' outside __extension__ block to prevent warning - from gcc's -Wnested-extern option. - -Fri Jun 7 01:58:00 1996 Ulrich Drepper - - * Makefile.in (install): Remove comment. - -Thu Jun 6 17:28:17 1996 Ulrich Drepper - - * Makefile.in (install): Work around for another Buglix stupidity. - Always use an `else' close for `if's. Reported by Nelson Beebe. - - * Makefile.in (intlh.inst): Correct typo in phony rule. - Reported by Nelson Beebe. - -Thu Jun 6 01:49:52 1996 Ulrich Drepper - - * dcgettext.c (read_alias_file): Rename variable alloca_list to - block_list as the macro calls assume. - Patch by Eric Backus. - - * localealias.c [!HAVE_ALLOCA]: Define alloca as macro using - malloc. - (read_alias_file): Rename varriabe alloca_list to block_list as the - macro calls assume. - Patch by Eric Backus. - - * l10nflist.c: Correct conditional for inclusion. - Reported by Roland McGrath. - - * Makefile.in (all): Depend on all-@USE_INCLUDED_LIBINTL@, not - all-@USE_NLS@. - - * Makefile.in (install): intlh.inst comes from local dir, not - $(srcdir). - - * Makefile.in (intlh.inst): Special handling of this goal. If - used in gettext, this is really a rul to construct this file. If - used in any other package it is defined as a .PHONY rule with - empty body. - - * finddomain.c: Extract locale file information handling into - l10nfile.c. Rename local stpcpy__ function to stpcpy. - - * dcgettext.c (stpcpy): Add local definition. - - * l10nflist.c: Solve some portability problems. Patches partly by - Thomas Esken. Add local definition of stpcpy. - -Tue Jun 4 02:47:49 1996 Ulrich Drepper - - * intlh.inst.in: Don't depend including on - HAVE_LOCALE_H. Instead configure must rewrite this fiile - depending on the result of the configure run. - - * Makefile.in (install): libintl.inst is now called intlh.inst. - Add rules for updating intlh.inst from intlh.inst.in. - - * libintl.inst: Renamed to intlh.inst.in. - - * localealias.c, dcgettext.c [__GNUC__]: Define HAVE_ALLOCA to 1 - because gcc has __buitlin_alloca. - Reported by Roland McGrath. - -Mon Jun 3 00:32:16 1996 Ulrich Drepper - - * Makefile.in (installcheck): New goal to fulfill needs of - automake's distcheck. - - * Makefile.in (install): Reorder commands so that VERSION is - found. - - * Makefile.in (gettextsrcdir): Now use subdirectory intl/ in - @datadir@/gettext. - (COMSRCS): Add l10nfile.c. - (OBJECTS): Add l10nfile.o. - (DISTFILES): Rename to DISTFILE.normal. Remove $(DISTFILES.common). - (DISTFILE.gettext): Remove $(DISTFILES.common). - (all-gettext): Remove goal. - (install): If $(PACKAGE) = gettext install, otherwose do nothing. No - package but gettext itself should install libintl.h + headers. - (dist): Extend goal to work for gettext, too. - (dist-gettext): Remove goal. - - * dcgettext.c [!HAVE_ALLOCA]: Define macro alloca by using malloc. - -Sun Jun 2 17:33:06 1996 Ulrich Drepper - - * loadmsgcat.c (_nl_load_domain): Parameter is now comes from - find_l10nfile. - -Sat Jun 1 02:23:03 1996 Ulrich Drepper - - * l10nflist.c (__argz_next): Add definition. - - * dcgettext.c [!HAVE_ALLOCA]: Add code for handling missing alloca - code. Use new l10nfile handling. - - * localealias.c [!HAVE_ALLOCA]: Add code for handling missing - alloca code. - - * l10nflist.c: Initial revision. - -Tue Apr 2 18:51:18 1996 Ulrich Drepper - - * Makefile.in (all-gettext): New goal. Same as all-yes. - -Thu Mar 28 23:01:22 1996 Karl Eichwalder - - * Makefile.in (gettextsrcdir): Define using @datadir@. - -Tue Mar 26 12:39:14 1996 Ulrich Drepper - - * finddomain.c: Include . Reported by Roland McGrath. - -Sat Mar 23 02:00:35 1996 Ulrich Drepper - - * finddomain.c (stpcpy): Rename to stpcpy__ to prevent clashing - with external declaration. - -Sat Mar 2 00:47:09 1996 Ulrich Drepper - - * Makefile.in (all-no): Rename from all_no. - -Sat Feb 17 00:25:59 1996 Ulrich Drepper - - * gettextP.h [loaded_domain]: Array `successor' must now contain up - to 63 elements (because of codeset name normalization). - - * finddomain.c: Implement codeset name normalization. - -Thu Feb 15 04:39:09 1996 Ulrich Drepper - - * Makefile.in (all): Define to `all-@USE_NLS@'. - (all-yes, all_no): New goals. `all-no' is noop, `all-yes' - is former all. - -Mon Jan 15 21:46:01 1996 Howard Gayle - - * localealias.c (alias_compare): Increment string pointers in loop - of strcasecmp replacement. - -Fri Dec 29 21:16:34 1995 Ulrich Drepper - - * Makefile.in (install-src): Who commented this goal out ? :-) - -Fri Dec 29 15:08:16 1995 Ulrich Drepper - - * dcgettext.c (DCGETTEXT): Save `errno'. Failing system calls - should not effect it because a missing catalog is no error. - Reported by Harald Knig . - -Tue Dec 19 22:09:13 1995 Ulrich Drepper - - * Makefile.in (Makefile): Explicitly use $(SHELL) for running - shell scripts. - -Fri Dec 15 17:34:59 1995 Andreas Schwab - - * Makefile.in (install-src): Only install library and header when - we use the own implementation. Don't do it when using the - system's gettext or catgets functions. - - * dcgettext.c (find_msg): Must not swap domain->hash_size here. - -Sat Dec 9 16:24:37 1995 Ulrich Drepper - - * localealias.c, libintl.inst, libgettext.h, hash-string.h, - gettextP.h, finddomain.c, dcgettext.c, cat-compat.c: - Use PARAMS instead of __P. Suggested by Roland McGrath. - -Tue Dec 5 11:39:14 1995 Larry Schwimmer - - * libgettext.h: Use `#if !defined (_LIBINTL_H)' instead of `#if - !_LIBINTL_H' because Solaris defines _LIBINTL_H as empty. - -Mon Dec 4 15:42:07 1995 Ulrich Drepper - - * Makefile.in (install-src): - Install libintl.inst instead of libintl.h.install. - -Sat Dec 2 22:51:38 1995 Marcus Daniels - - * cat-compat.c (textdomain): - Reverse order in which files are tried you load. First - try local file, when this failed absolute path. - -Wed Nov 29 02:03:53 1995 Nelson H. F. Beebe - - * cat-compat.c (bindtextdomain): Add missing { }. - -Sun Nov 26 18:21:41 1995 Ulrich Drepper - - * libintl.inst: Add missing __P definition. Reported by Nelson Beebe. - - * Makefile.in: - Add dummy `all' and `dvi' goals. Reported by Tom Tromey. - -Sat Nov 25 16:12:01 1995 Franc,ois Pinard - - * hash-string.h: Capitalize arguments of macros. - -Sat Nov 25 12:01:36 1995 Ulrich Drepper - - * Makefile.in (DISTFILES): Prevent files names longer than 13 - characters. libintl.h.glibc->libintl.glibc, - libintl.h.install->libintl.inst. Reported by Joshua R. Poulson. - -Sat Nov 25 11:31:12 1995 Eric Backus - - * dcgettext.c: Fix bug in preprocessor conditionals. - -Sat Nov 25 02:35:27 1995 Nelson H. F. Beebe - - * libgettext.h: Solaris cc does not understand - #if !SYMBOL1 && !SYMBOL2. Sad but true. - -Thu Nov 23 16:22:14 1995 Ulrich Drepper - - * hash-string.h (hash_string): - Fix for machine with >32 bit `unsigned long's. - - * dcgettext.c (DCGETTEXT): - Fix horrible bug in loop for alternative translation. - -Thu Nov 23 01:45:29 1995 Ulrich Drepper - - * po2tbl.sed.in, linux-msg.sed, xopen-msg.sed: - Some further simplifications in message number generation. - -Mon Nov 20 21:08:43 1995 Ulrich Drepper - - * libintl.h.glibc: Use __const instead of const in prototypes. - - * Makefile.in (install-src): - Install libintl.h.install instead of libintl.h. This - is a stripped-down version. Suggested by Peter Miller. - - * libintl.h.install, libintl.h.glibc: Initial revision. - - * localealias.c (_nl_expand_alias, read_alias_file): - Protect prototypes in type casts by __P. - -Tue Nov 14 16:43:58 1995 Ulrich Drepper - - * hash-string.h: Correct prototype for hash_string. - -Sun Nov 12 12:42:30 1995 Ulrich Drepper - - * hash-string.h (hash_string): Add prototype. - - * gettextP.h: Fix copyright. - (SWAP): Add prototype. - -Wed Nov 8 22:56:33 1995 Ulrich Drepper - - * localealias.c (read_alias_file): Forgot sizeof. - Avoid calling *printf function. This introduces a big overhead. - Patch by Roland McGrath. - -Tue Nov 7 14:21:08 1995 Ulrich Drepper - - * finddomain.c, cat-compat.c: Wrong indentation in #if for stpcpy. - - * finddomain.c (stpcpy): - Define substitution function local. The macro was to flaky. - - * cat-compat.c: Fix typo. - - * xopen-msg.sed, linux-msg.sed: - While bringing message number to right place only accept digits. - - * linux-msg.sed, xopen-msg.sed: Now that the counter does not have - leading 0s we don't need to remove them. Reported by Marcus - Daniels. - - * Makefile.in (../po/cat-id-tbl.o): Use $(top_srdir) in - dependency. Reported by Marcus Daniels. - - * cat-compat.c: (stpcpy) [!_LIBC && !HAVE_STPCPY]: Define replacement. - Generally cleanup using #if instead of #ifndef. - - * Makefile.in: Correct typos in comment. By Franc,ois Pinard. - -Mon Nov 6 00:27:02 1995 Ulrich Drepper - - * Makefile.in (install-src): Don't install libintl.h and libintl.a - if we use an available gettext implementation. - -Sun Nov 5 22:02:08 1995 Ulrich Drepper - - * libgettext.h: Fix typo: HAVE_CATGETTS -> HAVE_CATGETS. Reported - by Franc,ois Pinard. - - * libgettext.h: Use #if instead of #ifdef/#ifndef. - - * finddomain.c: - Comments describing what has to be done should start with FIXME. - -Sun Nov 5 19:38:01 1995 Ulrich Drepper - - * Makefile.in (DISTFILES): Split. Use DISTFILES with normal meaning. - DISTFILES.common names the files common to both dist goals. - DISTFILES.gettext are the files only distributed in GNU gettext. - -Sun Nov 5 17:32:54 1995 Ulrich Drepper - - * dcgettext.c (DCGETTEXT): Correct searching in derived locales. - This was necessary since a change in _nl_find_msg several weeks - ago. I really don't know this is still not fixed. - -Sun Nov 5 12:43:12 1995 Ulrich Drepper - - * loadmsgcat.c (_nl_load_domain): Test for FILENAME == NULL. This - might mark a special condition. - - * finddomain.c (make_entry_rec): Don't make illegal entry as decided. - - * Makefile.in (dist): Suppress error message when ln failed. - Get files from $(srcdir) explicitly. - - * libgettext.h (gettext_const): Rename to gettext_noop. - -Fri Nov 3 07:36:50 1995 Ulrich Drepper - - * finddomain.c (make_entry_rec): - Protect against wrong locale names by testing mask. - - * libgettext.h (gettext_const): Add macro definition. - Capitalize macro arguments. - -Thu Nov 2 23:15:51 1995 Ulrich Drepper - - * finddomain.c (_nl_find_domain): - Test for pointer != NULL before accessing value. - Reported by Tom Tromey. - - * gettext.c (NULL): - Define as (void*)0 instad of 0. Reported by Franc,ois Pinard. - -Mon Oct 30 21:28:52 1995 Ulrich Drepper - - * po2tbl.sed.in: Serious typo bug fixed by Jim Meyering. - -Sat Oct 28 23:20:47 1995 Ulrich Drepper - - * libgettext.h: Disable dcgettext optimization for Solaris 2.3. - - * localealias.c (alias_compare): - Peter Miller reported that tolower in some systems is - even dumber than I thought. Protect call by `isupper'. - -Fri Oct 27 22:22:51 1995 Ulrich Drepper - - * Makefile.in (libdir, includedir): New variables. - (install-src): Install libintl.a and libintl.h in correct dirs. - -Fri Oct 27 22:07:29 1995 Ulrich Drepper - - * Makefile.in (SOURCES): Fix typo: intrl.compat.c -> intl-compat.c. - - * po2tbl.sed.in: Patch for buggy SEDs by Christian von Roques. - - * localealias.c: - Fix typo and superflous test. Reported by Christian von Roques. - -Fri Oct 6 11:52:05 1995 Ulrich Drepper - - * finddomain.c (_nl_find_domain): - Correct some remainder from the pre-CEN syntax. Now - we don't have a constant number of successors anymore. - -Wed Sep 27 21:41:13 1995 Ulrich Drepper - - * Makefile.in (DISTFILES): Add libintl.h.glibc. - - * Makefile.in (dist-libc): Add goal for packing sources for glibc. - (COMSRCS, COMHDRS): Splitted to separate sources shared with glibc. - - * loadmsgcat.c: Forget to continue #if line. - - * localealias.c: - [_LIBC]: Rename strcasecmp to __strcasecmp to keep ANSI C name - space clean. - - * dcgettext.c, finddomain.c: Better comment to last change. - - * loadmsgcat.c: - [_LIBC]: Rename fstat, open, close, read, mmap, and munmap to - __fstat, __open, __close, __read, __mmap, and __munmap resp - to keep ANSI C name space clean. - - * finddomain.c: - [_LIBC]: Rename stpcpy to __stpcpy to keep ANSI C name space clean. - - * dcgettext.c: - [_LIBC]: Rename getced and stpcpy to __getcwd and __stpcpy resp to - keep ANSI C name space clean. - - * libgettext.h: - Include sys/types.h for those old SysV systems out there. - Reported by Francesco Potorti`. - - * loadmsgcat.c (use_mmap): Define if compiled for glibc. - - * bindtextdom.c: Include all those standard headers - unconditionally if _LIBC is defined. - - * finddomain.c: Fix 2 times defiend -> defined. - - * textdomain.c: Include libintl.h instead of libgettext.h when - compiling for glibc. Include all those standard headers - unconditionally if _LIBC is defined. - - * localealias.c, loadmsgcat.c: Prepare to be compiled in glibc. - - * gettext.c: - Include libintl.h instead of libgettext.h when compiling for glibc. - Get NULL from stddef.h if we compile for glibc. - - * finddomain.c: Include libintl.h instead of libgettext.h when - compiling for glibc. Include all those standard headers - unconditionally if _LIBC is defined. - - * dcgettext.c: Include all those standard headers unconditionally - if _LIBC is defined. - - * dgettext.c: If compiled in glibc include libintl.h instead of - libgettext.h. - (locale.h): Don't rely on HAVE_LOCALE_H when compiling for glibc. - - * dcgettext.c: If compiled in glibc include libintl.h instead of - libgettext.h. - (getcwd): Don't rely on HAVE_GETCWD when compiling for glibc. - - * bindtextdom.c: - If compiled in glibc include libintl.h instead of libgettext.h. - -Mon Sep 25 22:23:06 1995 Ulrich Drepper - - * localealias.c (_nl_expand_alias): Don't call bsearch if NMAP <= 0. - Reported by Marcus Daniels. - - * cat-compat.c (bindtextdomain): - String used in putenv must not be recycled. - Reported by Marcus Daniels. - - * libgettext.h (__USE_GNU_GETTEXT): - Additional symbol to signal that we use GNU gettext - library. - - * cat-compat.c (bindtextdomain): - Fix bug with the strange stpcpy replacement. - Reported by Nelson Beebe. - -Sat Sep 23 08:23:51 1995 Ulrich Drepper - - * cat-compat.c: Include for stpcpy prototype. - - * localealias.c (read_alias_file): - While expand strdup code temporary variable `cp' hided - higher level variable with same name. Rename to `tp'. - - * textdomain.c (textdomain): - Avoid warning by using temporary variable in strdup code. - - * finddomain.c (_nl_find_domain): Remove unused variable `application'. - -Thu Sep 21 15:51:44 1995 Ulrich Drepper - - * localealias.c (alias_compare): - Use strcasecmp() only if available. Else use - implementation in place. - - * intl-compat.c: - Wrapper functions now call *__ functions instead of __*. - - * libgettext.h: Declare prototypes for *__ functions instead for __*. - - * cat-compat.c, loadmsgcat.c: - Don't use xmalloc, xstrdup, and stpcpy. These functions are not part - of the standard libc and so prevent libintl.a from being used - standalone. - - * bindtextdom.c: - Don't use xmalloc, xstrdup, and stpcpy. These functions are not part - of the standard libc and so prevent libintl.a from being used - standalone. - Rename to bindtextdomain__ if not used in GNU C Library. - - * dgettext.c: - Rename function to dgettext__ if not used in GNU C Library. - - * gettext.c: - Don't use xmalloc, xstrdup, and stpcpy. These functions are not part - of the standard libc and so prevent libintl.a from being used - standalone. - Functions now called gettext__ if not used in GNU C Library. - - * dcgettext.c, localealias.c, textdomain.c, finddomain.c: - Don't use xmalloc, xstrdup, and stpcpy. These functions are not part - of the standard libc and so prevent libintl.a from being used - standalone. - -Sun Sep 17 23:14:49 1995 Ulrich Drepper - - * finddomain.c: Correct some bugs in handling of CEN standard - locale definitions. - -Thu Sep 7 01:49:28 1995 Ulrich Drepper - - * finddomain.c: Implement CEN syntax. - - * gettextP.h (loaded_domain): Extend number of successors to 31. - -Sat Aug 19 19:25:29 1995 Ulrich Drepper - - * Makefile.in (aliaspath): Remove path to X11 locale dir. - - * Makefile.in: Make install-src depend on install. This helps - gettext to install the sources and other packages can use the - install goal. - -Sat Aug 19 15:19:33 1995 Ulrich Drepper - - * Makefile.in (uninstall): Remove stuff installed by install-src. - -Tue Aug 15 13:13:53 1995 Ulrich Drepper - - * VERSION.in: Initial revision. - - * Makefile.in (DISTFILES): - Add VERSION file. This is not necessary for gettext, but - for other packages using this library. - -Tue Aug 15 06:16:44 1995 Ulrich Drepper - - * gettextP.h (_nl_find_domain): - New prototype after changing search strategy. - - * finddomain.c (_nl_find_domain): - We now try only to find a specified catalog. Fall back to other - catalogs listed in the locale list is now done in __dcgettext. - - * dcgettext.c (__dcgettext): - Now we provide message fall back even to different languages. - I.e. if a message is not available in one language all the other - in the locale list a tried. Formerly fall back was only possible - within one language. Implemented by moving one loop from - _nl_find_domain to here. - -Mon Aug 14 23:45:50 1995 Ulrich Drepper - - * Makefile.in (gettextsrcdir): - Directory where source of GNU gettext library are made - available. - (INSTALL, INSTALL_DATA): Programs used for installing sources. - (gettext-src): New. Rule to install GNU gettext sources for use in - gettextize shell script. - -Sun Aug 13 14:40:48 1995 Ulrich Drepper - - * loadmsgcat.c (_nl_load_domain): - Use mmap for loading only when munmap function is - also available. - - * Makefile.in (install): Depend on `all' goal. - -Wed Aug 9 11:04:33 1995 Ulrich Drepper - - * localealias.c (read_alias_file): - Do not overwrite '\n' when terminating alias value string. - - * localealias.c (read_alias_file): - Handle long lines. Ignore the rest not fitting in - the buffer after the initial `fgets' call. - -Wed Aug 9 00:54:29 1995 Ulrich Drepper - - * gettextP.h (_nl_load_domain): - Add prototype, replacing prototype for _nl_load_msg_cat. - - * finddomain.c (_nl_find_domain): - Remove unneeded variable filename and filename_len. - (expand_alias): Remove prototype because functions does not - exist anymore. - - * localealias.c (read_alias_file): - Change type of fname_len parameter to int. - (xmalloc): Add prototype. - - * loadmsgcat.c: Better prototypes for xmalloc. - -Tue Aug 8 22:30:39 1995 Ulrich Drepper - - * finddomain.c (_nl_find_domain): - Allow alias name to be constructed from the four components. - - * Makefile.in (aliaspath): New variable. Set to preliminary value. - (SOURCES): Add localealias.c. - (OBJECTS): Add localealias.o. - - * gettextP.h: Add prototype for _nl_expand_alias. - - * finddomain.c: Aliasing handled in intl/localealias.c. - - * localealias.c: Aliasing for locale names. - - * bindtextdom.c: Better prototypes for xmalloc and xstrdup. - -Mon Aug 7 23:47:42 1995 Ulrich Drepper - - * Makefile.in (DISTFILES): gettext.perl is now found in misc/. - - * cat-compat.c (bindtextdomain): - Correct implementation. dirname parameter was not used. - Reported by Marcus Daniels. - - * gettextP.h (loaded_domain): - New fields `successor' and `decided' for oo, lazy - message handling implementation. - - * dcgettext.c: - Adopt for oo, lazy message handliing. - Now we can inherit translations from less specific locales. - (find_msg): New function. - - * loadmsgcat.c, finddomain.c: - Complete rewrite. Implement oo, lazy message handling :-). - We now have an additional environment variable `LANGUAGE' with - a higher priority than LC_ALL for the LC_MESSAGE locale. - Here we can set a colon separated list of specifications each - of the form `language[_territory[.codeset]][@modifier]'. - -Sat Aug 5 09:55:42 1995 Ulrich Drepper - - * finddomain.c (unistd.h): - Include to get _PC_PATH_MAX defined on system having it. - -Fri Aug 4 22:42:00 1995 Ulrich Drepper - - * finddomain.c (stpcpy): Include prototype. - - * Makefile.in (dist): Remove `copying instead' message. - -Wed Aug 2 18:52:03 1995 Ulrich Drepper - - * Makefile.in (ID, TAGS): Do not use $^. - -Tue Aug 1 20:07:11 1995 Ulrich Drepper - - * Makefile.in (TAGS, ID): Use $^ as command argument. - (TAGS): Give etags -o option t write to current directory, - not $(srcdir). - (ID): Use $(srcdir) instead os $(top_srcdir)/src. - (distclean): Remove ID. - -Sun Jul 30 11:51:46 1995 Ulrich Drepper - - * Makefile.in (gnulocaledir): - New variable, always using share/ for data directory. - (DEFS): Add GNULOCALEDIR, used in finddomain.c. - - * finddomain.c (_nl_default_dirname): - Set to GNULOCALEDIR, because it always has to point - to the directory where GNU gettext Library writes it to. - - * intl-compat.c (textdomain, bindtextdomain): - Undefine macros before function definition. - -Sat Jul 22 01:10:02 1995 Ulrich Drepper - - * libgettext.h (_LIBINTL_H): - Protect definition in case where this file is included as - libgettext.h on Solaris machines. Add comment about this. - -Wed Jul 19 02:36:42 1995 Ulrich Drepper - - * intl-compat.c (textdomain): Correct typo. - -Wed Jul 19 01:51:35 1995 Ulrich Drepper - - * dcgettext.c (dcgettext): Function now called __dcgettext. - - * dgettext.c (dgettext): Now called __dgettext and calls - __dcgettext. - - * gettext.c (gettext): - Function now called __gettext and calls __dgettext. - - * textdomain.c (textdomain): Function now called __textdomain. - - * bindtextdom.c (bindtextdomain): Function now called - __bindtextdomain. - - * intl-compat.c: Initial revision. - - * Makefile.in (SOURCES): Add intl-compat.c. - (OBJECTS): We always compile the GNU gettext library functions. - OBJECTS contains all objects but cat-compat.o, ../po/cat-if-tbl.o, - and intl-compat.o. - (GETTOBJS): Contains now only intl-compat.o. - - * libgettext.h: - Re-include protection matches dualistic character of libgettext.h. - For all functions in GNU gettext library define __ counter part. - - * finddomain.c (strchr): Define as index if not found in C library. - (_nl_find_domain): For relative paths paste / in between. - -Tue Jul 18 16:37:45 1995 Ulrich Drepper - - * loadmsgcat.c, finddomain.c: Add inclusion of sys/types.h. - - * xopen-msg.sed: Fix bug with `msgstr ""' lines. - A little bit better comments. - -Tue Jul 18 01:18:27 1995 Ulrich Drepper - - * Makefile.in: - po-mode.el, makelinks, combine-sh are now found in ../misc. - - * po-mode.el, makelinks, combine-sh, elisp-comp: - Moved to ../misc/. - - * libgettext.h, gettextP.h, gettext.h: Uniform test for __STDC__. - -Sun Jul 16 22:33:02 1995 Ulrich Drepper - - * Makefile.in (INSTALL, INSTALL_DATA): New variables. - (install-data, uninstall): Install/uninstall .elc file. - - * po-mode.el (Installation comment): - Add .pox as possible extension of .po files. - -Sun Jul 16 13:23:27 1995 Ulrich Drepper - - * elisp-comp: Complete new version by Franc,ois: This does not - fail when not compiling in the source directory. - -Sun Jul 16 00:12:17 1995 Ulrich Drepper - - * Makefile.in (../po/cat-id-tbl.o): - Use $(MAKE) instead of make for recursive make. - - * Makefile.in (.el.elc): Use $(SHELL) instead of /bin/sh. - (install-exec): Add missing dummy goal. - (install-data, uninstall): @ in multi-line shell command at - beginning, not in front of echo. Reported by Eric Backus. - -Sat Jul 15 00:21:28 1995 Ulrich Drepper - - * Makefile.in (DISTFILES): - Rename libgettext.perl to gettext.perl to fit in 14 chars - file systems. - - * gettext.perl: - Rename to gettext.perl to fit in 14 chars file systems. - -Thu Jul 13 23:17:20 1995 Ulrich Drepper - - * cat-compat.c: If !STDC_HEADERS try to include malloc.h. - -Thu Jul 13 20:55:02 1995 Ulrich Drepper - - * po2tbl.sed.in: Pretty printing. - - * linux-msg.sed, xopen-msg.sed: - Correct bugs with handling substitute flags in branches. - - * hash-string.h (hash_string): - Old K&R compilers don't under stand `unsigned char'. - - * gettext.h (nls_uint32): - Some old K&R compilers (eg HP) don't understand `unsigned int'. - - * cat-compat.c (msg_to_cat_id): De-ANSI-fy prototypes. - -Thu Jul 13 01:34:33 1995 Ulrich Drepper - - * Makefile.in (ELCFILES): New variable. - (DISTFILES): Add elisp-comp. - Add implicit rule for .el -> .elc compilation. - (install-data): install $ELCFILES - (clean): renamed po-to-tbl and po-to-msg to po2tbl and po2msg resp. - - * elisp-comp: Initial revision - -Wed Jul 12 16:14:52 1995 Ulrich Drepper - - * Makefile.in: - cat-id-tbl.c is now found in po/. This enables us to use an identical - intl/ directory in all packages. - - * dcgettext.c (dcgettext): hashing does not work for table size <= 2. - - * textdomain.c: fix typo (#if def -> #if defined) - -Tue Jul 11 18:44:43 1995 Ulrich Drepper - - * Makefile.in (stamp-cat-id): use top_srcdir to address source files - (DISTFILES,distclean): move tupdate.perl to src/ - - * po-to-tbl.sed.in: - add additional jump to clear change flag to recognize multiline strings - -Tue Jul 11 01:32:50 1995 Ulrich Drepper - - * textdomain.c: Protect inclusion of stdlib.h and string.h. - - * loadmsgcat.c: Protect inclusion of stdlib.h. - - * libgettext.h: Protect inclusion of locale.h. - Allow use in C++ programs. - Define NULL is not happened already. - - * Makefile.in (DISTFILES): ship po-to-tbl.sed.in instead of - po-to-tbl.sed. - (distclean): remove po-to-tbl.sed and tupdate.perl. - - * tupdate.perl.in: Substitute Perl path even in exec line. - Don't include entries without translation from old .po file. - -Tue Jul 4 00:41:51 1995 Ulrich Drepper - - * tupdate.perl.in: use "Updated: " in msgid "". - - * cat-compat.c: Fix typo (LOCALDIR -> LOCALEDIR). - Define getenv if !__STDC__. - - * bindtextdom.c: Protect stdlib.h and string.h inclusion. - Define free if !__STDC__. - - * finddomain.c: Change DEF_MSG_DOM_DIR to LOCALEDIR. - Define free if !__STDC__. - - * cat-compat.c: Change DEF_MSG_DOM_DIR to LOCALEDIR. - -Mon Jul 3 23:56:30 1995 Ulrich Drepper - - * Makefile.in: Use LOCALEDIR instead of DEF_MSG_DOM_DIR. - Remove unneeded $(srcdir) from Makefile.in dependency. - - * makelinks: Add copyright and short description. - - * po-mode.el: Last version for 0.7. - - * tupdate.perl.in: Fix die message. - - * dcgettext.c: Protect include of string.h. - - * gettext.c: Protect include of stdlib.h and further tries to get NULL. - - * finddomain.c: Some corrections in includes. - - * Makefile.in (INCLUDES): Prune list correct path to Makefile.in. - - * po-to-tbl.sed: Adopt for new .po file format. - - * linux-msg.sed, xopen-msg.sed: Adopt for new .po file format. - -Sun Jul 2 23:55:03 1995 Ulrich Drepper - - * tupdate.perl.in: Complete rewrite for new .po file format. - -Sun Jul 2 02:06:50 1995 Ulrich Drepper - - * First official release. This directory contains all the code - needed to internationalize own packages. It provides functions - which allow to use the X/Open catgets function with an interface - like the Uniforum gettext function. For system which does not - have neither of those a complete implementation is provided. diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/intl/dcgettext.c kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/intl/dcgettext.c --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/intl/dcgettext.c 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/intl/dcgettext.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,624 +0,0 @@ -/* Implementation of the dcgettext(3) function. - Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ifdef HAVE_CONFIG_H -# include -#endif - -#include - -#ifdef __GNUC__ -# define alloca __builtin_alloca -# define HAVE_ALLOCA 1 -#else -# if defined HAVE_ALLOCA_H || defined _LIBC -# include -# else -# ifdef _AIX - #pragma alloca -# else -# ifndef alloca -char *alloca (); -# endif -# endif -# endif -#endif - -#include -#ifndef errno -extern int errno; -#endif -#ifndef __set_errno -# define __set_errno(val) errno = (val) -#endif - -#if defined STDC_HEADERS || defined _LIBC -# include -#else -char *getenv (); -# ifdef HAVE_MALLOC_H -# include -# else -void free (); -# endif -#endif - -#if defined HAVE_STRING_H || defined _LIBC -# ifndef _GNU_SOURCE -# define _GNU_SOURCE 1 -# endif -# include -#else -# include -#endif -#if !HAVE_STRCHR && !defined _LIBC -# ifndef strchr -# define strchr index -# endif -#endif - -#if defined HAVE_UNISTD_H || defined _LIBC -# include -#endif - -#include "gettext.h" -#include "gettextP.h" -#ifdef _LIBC -# include -#else -# include "libgettext.h" -#endif -#include "hash-string.h" - -/* @@ end of prolog @@ */ - -#ifdef _LIBC -/* Rename the non ANSI C functions. This is required by the standard - because some ANSI C functions will require linking with this object - file and the name space must not be polluted. */ -# define getcwd __getcwd -# ifndef stpcpy -# define stpcpy __stpcpy -# endif -#else -# if !defined HAVE_GETCWD -char *getwd (); -# define getcwd(buf, max) getwd (buf) -# else -char *getcwd (); -# endif -# ifndef HAVE_STPCPY -static char *stpcpy PARAMS ((char *dest, const char *src)); -# endif -#endif - -/* Amount to increase buffer size by in each try. */ -#define PATH_INCR 32 - -/* The following is from pathmax.h. */ -/* Non-POSIX BSD systems might have gcc's limits.h, which doesn't define - PATH_MAX but might cause redefinition warnings when sys/param.h is - later included (as on MORE/BSD 4.3). */ -#if defined(_POSIX_VERSION) || (defined(HAVE_LIMITS_H) && !defined(__GNUC__)) -# include -#endif - -#ifndef _POSIX_PATH_MAX -# define _POSIX_PATH_MAX 255 -#endif - -#if !defined(PATH_MAX) && defined(_PC_PATH_MAX) -# define PATH_MAX (pathconf ("/", _PC_PATH_MAX) < 1 ? 1024 : pathconf ("/", _PC_PATH_MAX)) -#endif - -/* Don't include sys/param.h if it already has been. */ -#if defined(HAVE_SYS_PARAM_H) && !defined(PATH_MAX) && !defined(MAXPATHLEN) -# include -#endif - -#if !defined(PATH_MAX) && defined(MAXPATHLEN) -# define PATH_MAX MAXPATHLEN -#endif - -#ifndef PATH_MAX -# define PATH_MAX _POSIX_PATH_MAX -#endif - -/* XPG3 defines the result of `setlocale (category, NULL)' as: - ``Directs `setlocale()' to query `category' and return the current - setting of `local'.'' - However it does not specify the exact format. And even worse: POSIX - defines this not at all. So we can use this feature only on selected - system (e.g. those using GNU C Library). */ -#ifdef _LIBC -# define HAVE_LOCALE_NULL -#endif - -/* Name of the default domain used for gettext(3) prior any call to - textdomain(3). The default value for this is "messages". */ -const char _nl_default_default_domain[] = "messages"; - -/* Value used as the default domain for gettext(3). */ -const char *_nl_current_default_domain = _nl_default_default_domain; - -/* Contains the default location of the message catalogs. */ -const char _nl_default_dirname[] = GNULOCALEDIR; - -/* List with bindings of specific domains created by bindtextdomain() - calls. */ -struct binding *_nl_domain_bindings; - -/* Prototypes for local functions. */ -static char *find_msg PARAMS ((struct loaded_l10nfile *domain_file, - const char *msgid)) internal_function; -static const char *category_to_name PARAMS ((int category)) internal_function; -static const char *guess_category_value PARAMS ((int category, - const char *categoryname)) - internal_function; - - -/* For those loosing systems which don't have `alloca' we have to add - some additional code emulating it. */ -#ifdef HAVE_ALLOCA -/* Nothing has to be done. */ -# define ADD_BLOCK(list, address) /* nothing */ -# define FREE_BLOCKS(list) /* nothing */ -#else -struct block_list -{ - void *address; - struct block_list *next; -}; -# define ADD_BLOCK(list, addr) \ - do { \ - struct block_list *newp = (struct block_list *) malloc (sizeof (*newp)); \ - /* If we cannot get a free block we cannot add the new element to \ - the list. */ \ - if (newp != NULL) { \ - newp->address = (addr); \ - newp->next = (list); \ - (list) = newp; \ - } \ - } while (0) -# define FREE_BLOCKS(list) \ - do { \ - while (list != NULL) { \ - struct block_list *old = list; \ - list = list->next; \ - free (old); \ - } \ - } while (0) -# undef alloca -# define alloca(size) (malloc (size)) -#endif /* have alloca */ - - -/* Names for the libintl functions are a problem. They must not clash - with existing names and they should follow ANSI C. But this source - code is also used in GNU C Library where the names have a __ - prefix. So we have to make a difference here. */ -#ifdef _LIBC -# define DCGETTEXT __dcgettext -#else -# define DCGETTEXT dcgettext__ -#endif - -/* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY - locale. */ -char * -DCGETTEXT (domainname, msgid, category) - const char *domainname; - const char *msgid; - int category; -{ -#ifndef HAVE_ALLOCA - struct block_list *block_list = NULL; -#endif - struct loaded_l10nfile *domain; - struct binding *binding; - const char *categoryname; - const char *categoryvalue; - char *dirname, *xdomainname; - char *single_locale; - char *retval; - int saved_errno = errno; - - /* If no real MSGID is given return NULL. */ - if (msgid == NULL) - return NULL; - - /* If DOMAINNAME is NULL, we are interested in the default domain. If - CATEGORY is not LC_MESSAGES this might not make much sense but the - defintion left this undefined. */ - if (domainname == NULL) - domainname = _nl_current_default_domain; - - /* First find matching binding. */ - for (binding = _nl_domain_bindings; binding != NULL; binding = binding->next) - { - int compare = strcmp (domainname, binding->domainname); - if (compare == 0) - /* We found it! */ - break; - if (compare < 0) - { - /* It is not in the list. */ - binding = NULL; - break; - } - } - - if (binding == NULL) - dirname = (char *) _nl_default_dirname; - else if (binding->dirname[0] == '/') - dirname = binding->dirname; - else - { - /* We have a relative path. Make it absolute now. */ - size_t dirname_len = strlen (binding->dirname) + 1; - size_t path_max; - char *ret; - - path_max = (unsigned) PATH_MAX; - path_max += 2; /* The getcwd docs say to do this. */ - - dirname = (char *) alloca (path_max + dirname_len); - ADD_BLOCK (block_list, dirname); - - __set_errno (0); - while ((ret = getcwd (dirname, path_max)) == NULL && errno == ERANGE) - { - path_max += PATH_INCR; - dirname = (char *) alloca (path_max + dirname_len); - ADD_BLOCK (block_list, dirname); - __set_errno (0); - } - - if (ret == NULL) - { - /* We cannot get the current working directory. Don't signal an - error but simply return the default string. */ - FREE_BLOCKS (block_list); - __set_errno (saved_errno); - return (char *) msgid; - } - - stpcpy (stpcpy (strchr (dirname, '\0'), "/"), binding->dirname); - } - - /* Now determine the symbolic name of CATEGORY and its value. */ - categoryname = category_to_name (category); - categoryvalue = guess_category_value (category, categoryname); - - xdomainname = (char *) alloca (strlen (categoryname) - + strlen (domainname) + 5); - ADD_BLOCK (block_list, xdomainname); - - stpcpy (stpcpy (stpcpy (stpcpy (xdomainname, categoryname), "/"), - domainname), - ".mo"); - - /* Creating working area. */ - single_locale = (char *) alloca (strlen (categoryvalue) + 1); - ADD_BLOCK (block_list, single_locale); - - - /* Search for the given string. This is a loop because we perhaps - got an ordered list of languages to consider for th translation. */ - while (1) - { - /* Make CATEGORYVALUE point to the next element of the list. */ - while (categoryvalue[0] != '\0' && categoryvalue[0] == ':') - ++categoryvalue; - if (categoryvalue[0] == '\0') - { - /* The whole contents of CATEGORYVALUE has been searched but - no valid entry has been found. We solve this situation - by implicitly appending a "C" entry, i.e. no translation - will take place. */ - single_locale[0] = 'C'; - single_locale[1] = '\0'; - } - else - { - char *cp = single_locale; - while (categoryvalue[0] != '\0' && categoryvalue[0] != ':') - *cp++ = *categoryvalue++; - *cp = '\0'; - } - - /* If the current locale value is C (or POSIX) we don't load a - domain. Return the MSGID. */ - if (strcmp (single_locale, "C") == 0 - || strcmp (single_locale, "POSIX") == 0) - { - FREE_BLOCKS (block_list); - __set_errno (saved_errno); - return (char *) msgid; - } - - - /* Find structure describing the message catalog matching the - DOMAINNAME and CATEGORY. */ - domain = _nl_find_domain (dirname, single_locale, xdomainname); - - if (domain != NULL) - { - retval = find_msg (domain, msgid); - - if (retval == NULL) - { - int cnt; - - for (cnt = 0; domain->successor[cnt] != NULL; ++cnt) - { - retval = find_msg (domain->successor[cnt], msgid); - - if (retval != NULL) - break; - } - } - - if (retval != NULL) - { - FREE_BLOCKS (block_list); - __set_errno (saved_errno); - return retval; - } - } - } - /* NOTREACHED */ -} - -#ifdef _LIBC -/* Alias for function name in GNU C Library. */ -weak_alias (__dcgettext, dcgettext); -#endif - - -static char * -internal_function -find_msg (domain_file, msgid) - struct loaded_l10nfile *domain_file; - const char *msgid; -{ - size_t top, act, bottom; - struct loaded_domain *domain; - - if (domain_file->decided == 0) - _nl_load_domain (domain_file); - - if (domain_file->data == NULL) - return NULL; - - domain = (struct loaded_domain *) domain_file->data; - - /* Locate the MSGID and its translation. */ - if (domain->hash_size > 2 && domain->hash_tab != NULL) - { - /* Use the hashing table. */ - nls_uint32 len = strlen (msgid); - nls_uint32 hash_val = hash_string (msgid); - nls_uint32 idx = hash_val % domain->hash_size; - nls_uint32 incr = 1 + (hash_val % (domain->hash_size - 2)); - nls_uint32 nstr = W (domain->must_swap, domain->hash_tab[idx]); - - if (nstr == 0) - /* Hash table entry is empty. */ - return NULL; - - if (W (domain->must_swap, domain->orig_tab[nstr - 1].length) == len - && strcmp (msgid, - domain->data + W (domain->must_swap, - domain->orig_tab[nstr - 1].offset)) == 0) - return (char *) domain->data + W (domain->must_swap, - domain->trans_tab[nstr - 1].offset); - - while (1) - { - if (idx >= domain->hash_size - incr) - idx -= domain->hash_size - incr; - else - idx += incr; - - nstr = W (domain->must_swap, domain->hash_tab[idx]); - if (nstr == 0) - /* Hash table entry is empty. */ - return NULL; - - if (W (domain->must_swap, domain->orig_tab[nstr - 1].length) == len - && strcmp (msgid, - domain->data + W (domain->must_swap, - domain->orig_tab[nstr - 1].offset)) - == 0) - return (char *) domain->data - + W (domain->must_swap, domain->trans_tab[nstr - 1].offset); - } - /* NOTREACHED */ - } - - /* Now we try the default method: binary search in the sorted - array of messages. */ - bottom = 0; - top = domain->nstrings; - while (bottom < top) - { - int cmp_val; - - act = (bottom + top) / 2; - cmp_val = strcmp (msgid, domain->data - + W (domain->must_swap, - domain->orig_tab[act].offset)); - if (cmp_val < 0) - top = act; - else if (cmp_val > 0) - bottom = act + 1; - else - break; - } - - /* If an translation is found return this. */ - return bottom >= top ? NULL : (char *) domain->data - + W (domain->must_swap, - domain->trans_tab[act].offset); -} - - -/* Return string representation of locale CATEGORY. */ -static const char * -internal_function -category_to_name (category) - int category; -{ - const char *retval; - - switch (category) - { -#ifdef LC_COLLATE - case LC_COLLATE: - retval = "LC_COLLATE"; - break; -#endif -#ifdef LC_CTYPE - case LC_CTYPE: - retval = "LC_CTYPE"; - break; -#endif -#ifdef LC_MONETARY - case LC_MONETARY: - retval = "LC_MONETARY"; - break; -#endif -#ifdef LC_NUMERIC - case LC_NUMERIC: - retval = "LC_NUMERIC"; - break; -#endif -#ifdef LC_TIME - case LC_TIME: - retval = "LC_TIME"; - break; -#endif -#ifdef LC_MESSAGES - case LC_MESSAGES: - retval = "LC_MESSAGES"; - break; -#endif -#ifdef LC_RESPONSE - case LC_RESPONSE: - retval = "LC_RESPONSE"; - break; -#endif -#ifdef LC_ALL - case LC_ALL: - /* This might not make sense but is perhaps better than any other - value. */ - retval = "LC_ALL"; - break; -#endif - default: - /* If you have a better idea for a default value let me know. */ - retval = "LC_XXX"; - } - - return retval; -} - -/* Guess value of current locale from value of the environment variables. */ -static const char * -internal_function -guess_category_value (category, categoryname) - int category; - const char *categoryname; -{ - const char *retval; - - /* The highest priority value is the `LANGUAGE' environment - variable. This is a GNU extension. */ - retval = getenv ("LANGUAGE"); - if (retval != NULL && retval[0] != '\0') - return retval; - - /* `LANGUAGE' is not set. So we have to proceed with the POSIX - methods of looking to `LC_ALL', `LC_xxx', and `LANG'. On some - systems this can be done by the `setlocale' function itself. */ -#if defined HAVE_SETLOCALE && defined HAVE_LC_MESSAGES && defined HAVE_LOCALE_NULL - return setlocale (category, NULL); -#else - /* Setting of LC_ALL overwrites all other. */ - retval = getenv ("LC_ALL"); - if (retval != NULL && retval[0] != '\0') - return retval; - - /* Next comes the name of the desired category. */ - retval = getenv (categoryname); - if (retval != NULL && retval[0] != '\0') - return retval; - - /* Last possibility is the LANG environment variable. */ - retval = getenv ("LANG"); - if (retval != NULL && retval[0] != '\0') - return retval; - - /* We use C as the default domain. POSIX says this is implementation - defined. */ - return "C"; -#endif -} - -/* @@ begin of epilog @@ */ - -/* We don't want libintl.a to depend on any other library. So we - avoid the non-standard function stpcpy. In GNU C Library this - function is available, though. Also allow the symbol HAVE_STPCPY - to be defined. */ -#if !_LIBC && !HAVE_STPCPY -static char * -stpcpy (dest, src) - char *dest; - const char *src; -{ - while ((*dest++ = *src++) != '\0') - /* Do nothing. */ ; - return dest - 1; -} -#endif - - -#ifdef _LIBC -/* If we want to free all resources we have to do some work at - program's end. */ -static void __attribute__ ((unused)) -free_mem (void) -{ - struct binding *runp; - - for (runp = _nl_domain_bindings; runp != NULL; runp = runp->next) - { - free (runp->domainname); - if (runp->dirname != _nl_default_dirname) - /* Yes, this is a pointer comparison. */ - free (runp->dirname); - } - - if (_nl_current_default_domain != _nl_default_default_domain) - /* Yes, again a pointer comparison. */ - free ((char *) _nl_current_default_domain); -} - -text_set_element (__libc_subfreeres, free_mem); -#endif diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/intl/dgettext.c kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/intl/dgettext.c --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/intl/dgettext.c 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/intl/dgettext.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,59 +0,0 @@ -/* Implementation of the dgettext(3) function - Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ifdef HAVE_CONFIG_H -# include -#endif - -#if defined HAVE_LOCALE_H || defined _LIBC -# include -#endif - -#ifdef _LIBC -# include -#else -# include "libgettext.h" -#endif - -/* @@ end of prolog @@ */ - -/* Names for the libintl functions are a problem. They must not clash - with existing names and they should follow ANSI C. But this source - code is also used in GNU C Library where the names have a __ - prefix. So we have to make a difference here. */ -#ifdef _LIBC -# define DGETTEXT __dgettext -# define DCGETTEXT __dcgettext -#else -# define DGETTEXT dgettext__ -# define DCGETTEXT dcgettext__ -#endif - -/* Look up MSGID in the DOMAINNAME message catalog of the current - LC_MESSAGES locale. */ -char * -DGETTEXT (domainname, msgid) - const char *domainname; - const char *msgid; -{ - return DCGETTEXT (domainname, msgid, LC_MESSAGES); -} - -#ifdef _LIBC -/* Alias for function name in GNU C Library. */ -weak_alias (__dgettext, dgettext); -#endif diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/intl/explodename.c kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/intl/explodename.c --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/intl/explodename.c 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/intl/explodename.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,188 +0,0 @@ -/* Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc. - Contributed by Ulrich Drepper , 1995. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ifdef HAVE_CONFIG_H -# include -#endif - -#if defined STDC_HEADERS || defined _LIBC -# include -#endif - -#if defined HAVE_STRING_H || defined _LIBC -# include -#else -# include -#endif -#include - -#include "loadinfo.h" - -/* On some strange systems still no definition of NULL is found. Sigh! */ -#ifndef NULL -# if defined __STDC__ && __STDC__ -# define NULL ((void *) 0) -# else -# define NULL 0 -# endif -#endif - -/* @@ end of prolog @@ */ - -int -_nl_explode_name (name, language, modifier, territory, codeset, - normalized_codeset, special, sponsor, revision) - char *name; - const char **language; - const char **modifier; - const char **territory; - const char **codeset; - const char **normalized_codeset; - const char **special; - const char **sponsor; - const char **revision; -{ - enum { undecided, xpg, cen } syntax; - char *cp; - int mask; - - *modifier = NULL; - *territory = NULL; - *codeset = NULL; - *normalized_codeset = NULL; - *special = NULL; - *sponsor = NULL; - *revision = NULL; - - /* Now we determine the single parts of the locale name. First - look for the language. Termination symbols are `_' and `@' if - we use XPG4 style, and `_', `+', and `,' if we use CEN syntax. */ - mask = 0; - syntax = undecided; - *language = cp = name; - while (cp[0] != '\0' && cp[0] != '_' && cp[0] != '@' - && cp[0] != '+' && cp[0] != ',') - ++cp; - - if (*language == cp) - /* This does not make sense: language has to be specified. Use - this entry as it is without exploding. Perhaps it is an alias. */ - cp = strchr (*language, '\0'); - else if (cp[0] == '_') - { - /* Next is the territory. */ - cp[0] = '\0'; - *territory = ++cp; - - while (cp[0] != '\0' && cp[0] != '.' && cp[0] != '@' - && cp[0] != '+' && cp[0] != ',' && cp[0] != '_') - ++cp; - - mask |= TERRITORY; - - if (cp[0] == '.') - { - /* Next is the codeset. */ - syntax = xpg; - cp[0] = '\0'; - *codeset = ++cp; - - while (cp[0] != '\0' && cp[0] != '@') - ++cp; - - mask |= XPG_CODESET; - - if (*codeset != cp && (*codeset)[0] != '\0') - { - *normalized_codeset = _nl_normalize_codeset (*codeset, - cp - *codeset); - if (strcmp (*codeset, *normalized_codeset) == 0) - free ((char *) *normalized_codeset); - else - mask |= XPG_NORM_CODESET; - } - } - } - - if (cp[0] == '@' || (syntax != xpg && cp[0] == '+')) - { - /* Next is the modifier. */ - syntax = cp[0] == '@' ? xpg : cen; - cp[0] = '\0'; - *modifier = ++cp; - - while (syntax == cen && cp[0] != '\0' && cp[0] != '+' - && cp[0] != ',' && cp[0] != '_') - ++cp; - - mask |= XPG_MODIFIER | CEN_AUDIENCE; - } - - if (syntax != xpg && (cp[0] == '+' || cp[0] == ',' || cp[0] == '_')) - { - syntax = cen; - - if (cp[0] == '+') - { - /* Next is special application (CEN syntax). */ - cp[0] = '\0'; - *special = ++cp; - - while (cp[0] != '\0' && cp[0] != ',' && cp[0] != '_') - ++cp; - - mask |= CEN_SPECIAL; - } - - if (cp[0] == ',') - { - /* Next is sponsor (CEN syntax). */ - cp[0] = '\0'; - *sponsor = ++cp; - - while (cp[0] != '\0' && cp[0] != '_') - ++cp; - - mask |= CEN_SPONSOR; - } - - if (cp[0] == '_') - { - /* Next is revision (CEN syntax). */ - cp[0] = '\0'; - *revision = ++cp; - - mask |= CEN_REVISION; - } - } - - /* For CEN syntax values it might be important to have the - separator character in the file name, not for XPG syntax. */ - if (syntax == xpg) - { - if (*territory != NULL && (*territory)[0] == '\0') - mask &= ~TERRITORY; - - if (*codeset != NULL && (*codeset)[0] == '\0') - mask &= ~XPG_CODESET; - - if (*modifier != NULL && (*modifier)[0] == '\0') - mask &= ~XPG_MODIFIER; - } - - return mask; -} diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/intl/finddomain.c kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/intl/finddomain.c --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/intl/finddomain.c 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/intl/finddomain.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,216 +0,0 @@ -/* Handle list of needed message catalogs - Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc. - Written by Ulrich Drepper , 1995. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ifdef HAVE_CONFIG_H -# include -#endif - -#include -#include -#include -#include - -#if defined STDC_HEADERS || defined _LIBC -# include -#else -# ifdef HAVE_MALLOC_H -# include -# else -void free (); -# endif -#endif - -#if defined HAVE_STRING_H || defined _LIBC -# include -#else -# include -# ifndef memcpy -# define memcpy(Dst, Src, Num) bcopy (Src, Dst, Num) -# endif -#endif -#if !HAVE_STRCHR && !defined _LIBC -# ifndef strchr -# define strchr index -# endif -#endif - -#if defined HAVE_UNISTD_H || defined _LIBC -# include -#endif - -#include "gettext.h" -#include "gettextP.h" -#ifdef _LIBC -# include -#else -# include "libgettext.h" -#endif - -/* @@ end of prolog @@ */ -/* List of already loaded domains. */ -static struct loaded_l10nfile *_nl_loaded_domains; - - -/* Return a data structure describing the message catalog described by - the DOMAINNAME and CATEGORY parameters with respect to the currently - established bindings. */ -struct loaded_l10nfile * -internal_function -_nl_find_domain (dirname, locale, domainname) - const char *dirname; - char *locale; - const char *domainname; -{ - struct loaded_l10nfile *retval; - const char *language; - const char *modifier; - const char *territory; - const char *codeset; - const char *normalized_codeset; - const char *special; - const char *sponsor; - const char *revision; - const char *alias_value; - int mask; - - /* LOCALE can consist of up to four recognized parts for the XPG syntax: - - language[_territory[.codeset]][@modifier] - - and six parts for the CEN syntax: - - language[_territory][+audience][+special][,[sponsor][_revision]] - - Beside the first part all of them are allowed to be missing. If - the full specified locale is not found, the less specific one are - looked for. The various parts will be stripped off according to - the following order: - (1) revision - (2) sponsor - (3) special - (4) codeset - (5) normalized codeset - (6) territory - (7) audience/modifier - */ - - /* If we have already tested for this locale entry there has to - be one data set in the list of loaded domains. */ - retval = _nl_make_l10nflist (&_nl_loaded_domains, dirname, - strlen (dirname) + 1, 0, locale, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, domainname, 0); - if (retval != NULL) - { - /* We know something about this locale. */ - int cnt; - - if (retval->decided == 0) - _nl_load_domain (retval); - - if (retval->data != NULL) - return retval; - - for (cnt = 0; retval->successor[cnt] != NULL; ++cnt) - { - if (retval->successor[cnt]->decided == 0) - _nl_load_domain (retval->successor[cnt]); - - if (retval->successor[cnt]->data != NULL) - break; - } - return cnt >= 0 ? retval : NULL; - /* NOTREACHED */ - } - - /* See whether the locale value is an alias. If yes its value - *overwrites* the alias name. No test for the original value is - done. */ - alias_value = _nl_expand_alias (locale); - if (alias_value != NULL) - { -#if defined _LIBC || defined HAVE_STRDUP - locale = strdup (alias_value); - if (locale == NULL) - return NULL; -#else - size_t len = strlen (alias_value) + 1; - locale = (char *) malloc (len); - if (locale == NULL) - return NULL; - - memcpy (locale, alias_value, len); -#endif - } - - /* Now we determine the single parts of the locale name. First - look for the language. Termination symbols are `_' and `@' if - we use XPG4 style, and `_', `+', and `,' if we use CEN syntax. */ - mask = _nl_explode_name (locale, &language, &modifier, &territory, - &codeset, &normalized_codeset, &special, - &sponsor, &revision); - - /* Create all possible locale entries which might be interested in - generalization. */ - retval = _nl_make_l10nflist (&_nl_loaded_domains, dirname, - strlen (dirname) + 1, mask, language, territory, - codeset, normalized_codeset, modifier, special, - sponsor, revision, domainname, 1); - if (retval == NULL) - /* This means we are out of core. */ - return NULL; - - if (retval->decided == 0) - _nl_load_domain (retval); - if (retval->data == NULL) - { - int cnt; - for (cnt = 0; retval->successor[cnt] != NULL; ++cnt) - { - if (retval->successor[cnt]->decided == 0) - _nl_load_domain (retval->successor[cnt]); - if (retval->successor[cnt]->data != NULL) - break; - } - } - - /* The room for an alias was dynamically allocated. Free it now. */ - if (alias_value != NULL) - free (locale); - - return retval; -} - - -#ifdef _LIBC -static void __attribute__ ((unused)) -free_mem (void) -{ - struct loaded_l10nfile *runp = _nl_loaded_domains; - - while (runp != NULL) - { - struct loaded_l10nfile *here = runp; - if (runp->data != NULL) - _nl_unload_domain ((struct loaded_domain *) runp->data); - runp = runp->next; - free (here); - } -} - -text_set_element (__libc_subfreeres, free_mem); -#endif diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/intl/gettext.c kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/intl/gettext.c --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/intl/gettext.c 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/intl/gettext.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,70 +0,0 @@ -/* Implementation of gettext(3) function. - Copyright (C) 1995, 1997 Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ifdef HAVE_CONFIG_H -# include -#endif - -#ifdef _LIBC -# define __need_NULL -# include -#else -# ifdef STDC_HEADERS -# include /* Just for NULL. */ -# else -# ifdef HAVE_STRING_H -# include -# else -# define NULL ((void *) 0) -# endif -# endif -#endif - -#ifdef _LIBC -# include -#else -# include "libgettext.h" -#endif - -/* @@ end of prolog @@ */ - -/* Names for the libintl functions are a problem. They must not clash - with existing names and they should follow ANSI C. But this source - code is also used in GNU C Library where the names have a __ - prefix. So we have to make a difference here. */ -#ifdef _LIBC -# define GETTEXT __gettext -# define DGETTEXT __dgettext -#else -# define GETTEXT gettext__ -# define DGETTEXT dgettext__ -#endif - -/* Look up MSGID in the current default message catalog for the current - LC_MESSAGES locale. If not found, returns MSGID itself (the default - text). */ -char * -GETTEXT (msgid) - const char *msgid; -{ - return DGETTEXT (NULL, msgid); -} - -#ifdef _LIBC -/* Alias for function name in GNU C Library. */ -weak_alias (__gettext, gettext); -#endif diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/intl/gettext.h kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/intl/gettext.h --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/intl/gettext.h 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/intl/gettext.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,105 +0,0 @@ -/* Internal header for GNU gettext internationalization functions. - Copyright (C) 1995, 1997 Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with the GNU C Library; see the file COPYING.LIB. If not, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#ifndef _GETTEXT_H -#define _GETTEXT_H 1 - -#include - -#if HAVE_LIMITS_H || _LIBC -# include -#endif - -/* @@ end of prolog @@ */ - -/* The magic number of the GNU message catalog format. */ -#define _MAGIC 0x950412de -#define _MAGIC_SWAPPED 0xde120495 - -/* Revision number of the currently used .mo (binary) file format. */ -#define MO_REVISION_NUMBER 0 - -/* The following contortions are an attempt to use the C preprocessor - to determine an unsigned integral type that is 32 bits wide. An - alternative approach is to use autoconf's AC_CHECK_SIZEOF macro, but - doing that would require that the configure script compile and *run* - the resulting executable. Locally running cross-compiled executables - is usually not possible. */ - -#if __STDC__ -# define UINT_MAX_32_BITS 4294967295U -#else -# define UINT_MAX_32_BITS 0xFFFFFFFF -#endif - -/* If UINT_MAX isn't defined, assume it's a 32-bit type. - This should be valid for all systems GNU cares about because - that doesn't include 16-bit systems, and only modern systems - (that certainly have ) have 64+-bit integral types. */ - -#ifndef UINT_MAX -# define UINT_MAX UINT_MAX_32_BITS -#endif - -#if UINT_MAX == UINT_MAX_32_BITS -typedef unsigned nls_uint32; -#else -# if USHRT_MAX == UINT_MAX_32_BITS -typedef unsigned short nls_uint32; -# else -# if ULONG_MAX == UINT_MAX_32_BITS -typedef unsigned long nls_uint32; -# else - /* The following line is intended to throw an error. Using #error is - not portable enough. */ - "Cannot determine unsigned 32-bit data type." -# endif -# endif -#endif - - -/* Header for binary .mo file format. */ -struct mo_file_header -{ - /* The magic number. */ - nls_uint32 magic; - /* The revision number of the file format. */ - nls_uint32 revision; - /* The number of strings pairs. */ - nls_uint32 nstrings; - /* Offset of table with start offsets of original strings. */ - nls_uint32 orig_tab_offset; - /* Offset of table with start offsets of translation strings. */ - nls_uint32 trans_tab_offset; - /* Size of hashing table. */ - nls_uint32 hash_tab_size; - /* Offset of first hashing entry. */ - nls_uint32 hash_tab_offset; -}; - -struct string_desc -{ - /* Length of addressed string. */ - nls_uint32 length; - /* Offset of string in file. */ - nls_uint32 offset; -}; - -/* @@ begin of epilog @@ */ - -#endif /* gettext.h */ diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/intl/gettextP.h kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/intl/gettextP.h --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/intl/gettextP.h 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/intl/gettextP.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,89 +0,0 @@ -/* Header describing internals of gettext library - Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc. - Written by Ulrich Drepper , 1995. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ifndef _GETTEXTP_H -#define _GETTEXTP_H - -#include "loadinfo.h" - -/* @@ end of prolog @@ */ - -#ifndef PARAMS -# if __STDC__ -# define PARAMS(args) args -# else -# define PARAMS(args) () -# endif -#endif - -#ifndef internal_function -# define internal_function -#endif - -#ifndef W -# define W(flag, data) ((flag) ? SWAP (data) : (data)) -#endif - - -#ifdef _LIBC -# include -# define SWAP(i) bswap_32 (i) -#else -static nls_uint32 SWAP PARAMS ((nls_uint32 i)); - -static inline nls_uint32 -SWAP (i) - nls_uint32 i; -{ - return (i << 24) | ((i & 0xff00) << 8) | ((i >> 8) & 0xff00) | (i >> 24); -} -#endif - - -struct loaded_domain -{ - const char *data; - int use_mmap; - size_t mmap_size; - int must_swap; - nls_uint32 nstrings; - struct string_desc *orig_tab; - struct string_desc *trans_tab; - nls_uint32 hash_size; - nls_uint32 *hash_tab; -}; - -struct binding -{ - struct binding *next; - char *domainname; - char *dirname; -}; - -struct loaded_l10nfile *_nl_find_domain PARAMS ((const char *__dirname, - char *__locale, - const char *__domainname)) - internal_function; -void _nl_load_domain PARAMS ((struct loaded_l10nfile *__domain)) - internal_function; -void _nl_unload_domain PARAMS ((struct loaded_domain *__domain)) - internal_function; - -/* @@ begin of epilog @@ */ - -#endif /* gettextP.h */ diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/intl/hash-string.h kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/intl/hash-string.h --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/intl/hash-string.h 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/intl/hash-string.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,59 +0,0 @@ -/* Implements a string hashing function. - Copyright (C) 1995, 1997 Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with the GNU C Library; see the file COPYING.LIB. If not, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -/* @@ end of prolog @@ */ - -#ifndef PARAMS -# if __STDC__ -# define PARAMS(Args) Args -# else -# define PARAMS(Args) () -# endif -#endif - -/* We assume to have `unsigned long int' value with at least 32 bits. */ -#define HASHWORDBITS 32 - - -/* Defines the so called `hashpjw' function by P.J. Weinberger - [see Aho/Sethi/Ullman, COMPILERS: Principles, Techniques and Tools, - 1986, 1987 Bell Telephone Laboratories, Inc.] */ -static unsigned long hash_string PARAMS ((const char *__str_param)); - -static inline unsigned long -hash_string (str_param) - const char *str_param; -{ - unsigned long int hval, g; - const char *str = str_param; - - /* Compute the hash value for the given string. */ - hval = 0; - while (*str != '\0') - { - hval <<= 4; - hval += (unsigned long) *str++; - g = hval & ((unsigned long) 0xf << (HASHWORDBITS - 4)); - if (g != 0) - { - hval ^= g >> (HASHWORDBITS - 8); - hval ^= g; - } - } - return hval; -} diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/intl/intl-compat.c kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/intl/intl-compat.c --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/intl/intl-compat.c 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/intl/intl-compat.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,76 +0,0 @@ -/* intl-compat.c - Stub functions to call gettext functions from GNU gettext - Library. - Copyright (C) 1995 Software Foundation, Inc. - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2, or (at your option) -any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ifdef HAVE_CONFIG_H -# include -#endif - -#include "libgettext.h" - -/* @@ end of prolog @@ */ - - -#undef gettext -#undef dgettext -#undef dcgettext -#undef textdomain -#undef bindtextdomain - - -char * -bindtextdomain (domainname, dirname) - const char *domainname; - const char *dirname; -{ - return bindtextdomain__ (domainname, dirname); -} - - -char * -dcgettext (domainname, msgid, category) - const char *domainname; - const char *msgid; - int category; -{ - return dcgettext__ (domainname, msgid, category); -} - - -char * -dgettext (domainname, msgid) - const char *domainname; - const char *msgid; -{ - return dgettext__ (domainname, msgid); -} - - -char * -gettext (msgid) - const char *msgid; -{ - return gettext__ (msgid); -} - - -char * -textdomain (domainname) - const char *domainname; -{ - return textdomain__ (domainname); -} diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/intl/l10nflist.c kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/intl/l10nflist.c --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/intl/l10nflist.c 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/intl/l10nflist.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,411 +0,0 @@ -/* Handle list of needed message catalogs - Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. - Contributed by Ulrich Drepper , 1995. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ifdef HAVE_CONFIG_H -# include -#endif - - -#if defined HAVE_STRING_H || defined _LIBC -# ifndef _GNU_SOURCE -# define _GNU_SOURCE 1 -# endif -# include -#else -# include -# ifndef memcpy -# define memcpy(Dst, Src, Num) bcopy (Src, Dst, Num) -# endif -#endif -#if !HAVE_STRCHR && !defined _LIBC -# ifndef strchr -# define strchr index -# endif -#endif - -#if defined _LIBC || defined HAVE_ARGZ_H -# include -#endif -#include -#include - -#if defined STDC_HEADERS || defined _LIBC -# include -#endif - -#include "loadinfo.h" - -/* On some strange systems still no definition of NULL is found. Sigh! */ -#ifndef NULL -# if defined __STDC__ && __STDC__ -# define NULL ((void *) 0) -# else -# define NULL 0 -# endif -#endif - -/* @@ end of prolog @@ */ - -#ifdef _LIBC -/* Rename the non ANSI C functions. This is required by the standard - because some ANSI C functions will require linking with this object - file and the name space must not be polluted. */ -# ifndef stpcpy -# define stpcpy(dest, src) __stpcpy(dest, src) -# endif -#else -# ifndef HAVE_STPCPY -static char *stpcpy PARAMS ((char *dest, const char *src)); -# endif -#endif - -/* Define function which are usually not available. */ - -#if !defined _LIBC && !defined HAVE___ARGZ_COUNT -/* Returns the number of strings in ARGZ. */ -static size_t argz_count__ PARAMS ((const char *argz, size_t len)); - -static size_t -argz_count__ (argz, len) - const char *argz; - size_t len; -{ - size_t count = 0; - while (len > 0) - { - size_t part_len = strlen (argz); - argz += part_len + 1; - len -= part_len + 1; - count++; - } - return count; -} -# undef __argz_count -# define __argz_count(argz, len) argz_count__ (argz, len) -#endif /* !_LIBC && !HAVE___ARGZ_COUNT */ - -#if !defined _LIBC && !defined HAVE___ARGZ_STRINGIFY -/* Make '\0' separated arg vector ARGZ printable by converting all the '\0's - except the last into the character SEP. */ -static void argz_stringify__ PARAMS ((char *argz, size_t len, int sep)); - -static void -argz_stringify__ (argz, len, sep) - char *argz; - size_t len; - int sep; -{ - while (len > 0) - { - size_t part_len = strlen (argz); - argz += part_len; - len -= part_len + 1; - if (len > 0) - *argz++ = sep; - } -} -# undef __argz_stringify -# define __argz_stringify(argz, len, sep) argz_stringify__ (argz, len, sep) -#endif /* !_LIBC && !HAVE___ARGZ_STRINGIFY */ - -#if !defined _LIBC && !defined HAVE___ARGZ_NEXT -static char *argz_next__ PARAMS ((char *argz, size_t argz_len, - const char *entry)); - -static char * -argz_next__ (argz, argz_len, entry) - char *argz; - size_t argz_len; - const char *entry; -{ - if (entry) - { - if (entry < argz + argz_len) - entry = strchr (entry, '\0') + 1; - - return entry >= argz + argz_len ? NULL : (char *) entry; - } - else - if (argz_len > 0) - return argz; - else - return 0; -} -# undef __argz_next -# define __argz_next(argz, len, entry) argz_next__ (argz, len, entry) -#endif /* !_LIBC && !HAVE___ARGZ_NEXT */ - - -/* Return number of bits set in X. */ -static int pop PARAMS ((int x)); - -static inline int -pop (x) - int x; -{ - /* We assume that no more than 16 bits are used. */ - x = ((x & ~0x5555) >> 1) + (x & 0x5555); - x = ((x & ~0x3333) >> 2) + (x & 0x3333); - x = ((x >> 4) + x) & 0x0f0f; - x = ((x >> 8) + x) & 0xff; - - return x; -} - - -struct loaded_l10nfile * -_nl_make_l10nflist (l10nfile_list, dirlist, dirlist_len, mask, language, - territory, codeset, normalized_codeset, modifier, special, - sponsor, revision, filename, do_allocate) - struct loaded_l10nfile **l10nfile_list; - const char *dirlist; - size_t dirlist_len; - int mask; - const char *language; - const char *territory; - const char *codeset; - const char *normalized_codeset; - const char *modifier; - const char *special; - const char *sponsor; - const char *revision; - const char *filename; - int do_allocate; -{ - char *abs_filename; - struct loaded_l10nfile *last = NULL; - struct loaded_l10nfile *retval; - char *cp; - size_t entries; - int cnt; - - /* Allocate room for the full file name. */ - abs_filename = (char *) malloc (dirlist_len - + strlen (language) - + ((mask & TERRITORY) != 0 - ? strlen (territory) + 1 : 0) - + ((mask & XPG_CODESET) != 0 - ? strlen (codeset) + 1 : 0) - + ((mask & XPG_NORM_CODESET) != 0 - ? strlen (normalized_codeset) + 1 : 0) - + (((mask & XPG_MODIFIER) != 0 - || (mask & CEN_AUDIENCE) != 0) - ? strlen (modifier) + 1 : 0) - + ((mask & CEN_SPECIAL) != 0 - ? strlen (special) + 1 : 0) - + (((mask & CEN_SPONSOR) != 0 - || (mask & CEN_REVISION) != 0) - ? (1 + ((mask & CEN_SPONSOR) != 0 - ? strlen (sponsor) + 1 : 0) - + ((mask & CEN_REVISION) != 0 - ? strlen (revision) + 1 : 0)) : 0) - + 1 + strlen (filename) + 1); - - if (abs_filename == NULL) - return NULL; - - retval = NULL; - last = NULL; - - /* Construct file name. */ - memcpy (abs_filename, dirlist, dirlist_len); - __argz_stringify (abs_filename, dirlist_len, ':'); - cp = abs_filename + (dirlist_len - 1); - *cp++ = '/'; - cp = stpcpy (cp, language); - - if ((mask & TERRITORY) != 0) - { - *cp++ = '_'; - cp = stpcpy (cp, territory); - } - if ((mask & XPG_CODESET) != 0) - { - *cp++ = '.'; - cp = stpcpy (cp, codeset); - } - if ((mask & XPG_NORM_CODESET) != 0) - { - *cp++ = '.'; - cp = stpcpy (cp, normalized_codeset); - } - if ((mask & (XPG_MODIFIER | CEN_AUDIENCE)) != 0) - { - /* This component can be part of both syntaces but has different - leading characters. For CEN we use `+', else `@'. */ - *cp++ = (mask & CEN_AUDIENCE) != 0 ? '+' : '@'; - cp = stpcpy (cp, modifier); - } - if ((mask & CEN_SPECIAL) != 0) - { - *cp++ = '+'; - cp = stpcpy (cp, special); - } - if ((mask & (CEN_SPONSOR | CEN_REVISION)) != 0) - { - *cp++ = ','; - if ((mask & CEN_SPONSOR) != 0) - cp = stpcpy (cp, sponsor); - if ((mask & CEN_REVISION) != 0) - { - *cp++ = '_'; - cp = stpcpy (cp, revision); - } - } - - *cp++ = '/'; - stpcpy (cp, filename); - - /* Look in list of already loaded domains whether it is already - available. */ - last = NULL; - for (retval = *l10nfile_list; retval != NULL; retval = retval->next) - if (retval->filename != NULL) - { - int compare = strcmp (retval->filename, abs_filename); - if (compare == 0) - /* We found it! */ - break; - if (compare < 0) - { - /* It's not in the list. */ - retval = NULL; - break; - } - - last = retval; - } - - if (retval != NULL || do_allocate == 0) - { - free (abs_filename); - return retval; - } - - retval = (struct loaded_l10nfile *) - malloc (sizeof (*retval) + (__argz_count (dirlist, dirlist_len) - * (1 << pop (mask)) - * sizeof (struct loaded_l10nfile *))); - if (retval == NULL) - return NULL; - - retval->filename = abs_filename; - retval->decided = (__argz_count (dirlist, dirlist_len) != 1 - || ((mask & XPG_CODESET) != 0 - && (mask & XPG_NORM_CODESET) != 0)); - retval->data = NULL; - - if (last == NULL) - { - retval->next = *l10nfile_list; - *l10nfile_list = retval; - } - else - { - retval->next = last->next; - last->next = retval; - } - - entries = 0; - /* If the DIRLIST is a real list the RETVAL entry corresponds not to - a real file. So we have to use the DIRLIST separation mechanism - of the inner loop. */ - cnt = __argz_count (dirlist, dirlist_len) == 1 ? mask - 1 : mask; - for (; cnt >= 0; --cnt) - if ((cnt & ~mask) == 0 - && ((cnt & CEN_SPECIFIC) == 0 || (cnt & XPG_SPECIFIC) == 0) - && ((cnt & XPG_CODESET) == 0 || (cnt & XPG_NORM_CODESET) == 0)) - { - /* Iterate over all elements of the DIRLIST. */ - char *dir = NULL; - - while ((dir = __argz_next ((char *) dirlist, dirlist_len, dir)) - != NULL) - retval->successor[entries++] - = _nl_make_l10nflist (l10nfile_list, dir, strlen (dir) + 1, cnt, - language, territory, codeset, - normalized_codeset, modifier, special, - sponsor, revision, filename, 1); - } - retval->successor[entries] = NULL; - - return retval; -} - -/* Normalize codeset name. There is no standard for the codeset - names. Normalization allows the user to use any of the common - names. */ -const char * -_nl_normalize_codeset (codeset, name_len) - const unsigned char *codeset; - size_t name_len; -{ - int len = 0; - int only_digit = 1; - char *retval; - char *wp; - size_t cnt; - - for (cnt = 0; cnt < name_len; ++cnt) - if (isalnum (codeset[cnt])) - { - ++len; - - if (isalpha (codeset[cnt])) - only_digit = 0; - } - - retval = (char *) malloc ((only_digit ? 3 : 0) + len + 1); - - if (retval != NULL) - { - if (only_digit) - wp = stpcpy (retval, "iso"); - else - wp = retval; - - for (cnt = 0; cnt < name_len; ++cnt) - if (isalpha (codeset[cnt])) - *wp++ = tolower (codeset[cnt]); - else if (isdigit (codeset[cnt])) - *wp++ = codeset[cnt]; - - *wp = '\0'; - } - - return (const char *) retval; -} - - -/* @@ begin of epilog @@ */ - -/* We don't want libintl.a to depend on any other library. So we - avoid the non-standard function stpcpy. In GNU C Library this - function is available, though. Also allow the symbol HAVE_STPCPY - to be defined. */ -#if !_LIBC && !HAVE_STPCPY -static char * -stpcpy (dest, src) - char *dest; - const char *src; -{ - while ((*dest++ = *src++) != '\0') - /* Do nothing. */ ; - return dest - 1; -} -#endif diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/intl/libgettext.h kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/intl/libgettext.h --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/intl/libgettext.h 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/intl/libgettext.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,182 +0,0 @@ -/* Message catalogs for internationalization. - Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* Because on some systems (e.g. Solaris) we sometimes have to include - the systems libintl.h as well as this file we have more complex - include protection above. But the systems header might perhaps also - define _LIBINTL_H and therefore we have to protect the definition here. */ - -#if !defined _LIBINTL_H || !defined _LIBGETTEXT_H -#ifndef _LIBINTL_H -# define _LIBINTL_H 1 -#endif -#define _LIBGETTEXT_H 1 - -/* We define an additional symbol to signal that we use the GNU - implementation of gettext. */ -#define __USE_GNU_GETTEXT 1 - -#include - -#if HAVE_LOCALE_H -# include -#endif - - -#ifdef __cplusplus -extern "C" { -#endif - -/* @@ end of prolog @@ */ - -#ifndef PARAMS -# if __STDC__ || defined __cplusplus -# define PARAMS(args) args -# else -# define PARAMS(args) () -# endif -#endif - -#ifndef NULL -# if !defined __cplusplus || defined __GNUC__ -# define NULL ((void *) 0) -# else -# define NULL (0) -# endif -#endif - -#if !HAVE_LC_MESSAGES -/* This value determines the behaviour of the gettext() and dgettext() - function. But some system does not have this defined. Define it - to a default value. */ -# define LC_MESSAGES (-1) -#endif - - -/* Declarations for gettext-using-catgets interface. Derived from - Jim Meyering's libintl.h. */ -struct _msg_ent -{ - const char *_msg; - int _msg_number; -}; - - -#if HAVE_CATGETS -/* These two variables are defined in the automatically by po-to-tbl.sed - generated file `cat-id-tbl.c'. */ -extern const struct _msg_ent _msg_tbl[]; -extern int _msg_tbl_length; -#endif - - -/* For automatical extraction of messages sometimes no real - translation is needed. Instead the string itself is the result. */ -#define gettext_noop(Str) (Str) - -/* Look up MSGID in the current default message catalog for the current - LC_MESSAGES locale. If not found, returns MSGID itself (the default - text). */ -extern char *gettext PARAMS ((const char *__msgid)); -extern char *gettext__ PARAMS ((const char *__msgid)); - -/* Look up MSGID in the DOMAINNAME message catalog for the current - LC_MESSAGES locale. */ -extern char *dgettext PARAMS ((const char *__domainname, const char *__msgid)); -extern char *dgettext__ PARAMS ((const char *__domainname, - const char *__msgid)); - -/* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY - locale. */ -extern char *dcgettext PARAMS ((const char *__domainname, const char *__msgid, - int __category)); -extern char *dcgettext__ PARAMS ((const char *__domainname, - const char *__msgid, int __category)); - - -/* Set the current default message catalog to DOMAINNAME. - If DOMAINNAME is null, return the current default. - If DOMAINNAME is "", reset to the default of "messages". */ -extern char *textdomain PARAMS ((const char *__domainname)); -extern char *textdomain__ PARAMS ((const char *__domainname)); - -/* Specify that the DOMAINNAME message catalog will be found - in DIRNAME rather than in the system locale data base. */ -extern char *bindtextdomain PARAMS ((const char *__domainname, - const char *__dirname)); -extern char *bindtextdomain__ PARAMS ((const char *__domainname, - const char *__dirname)); - -#if ENABLE_NLS - -/* Solaris 2.3 has the gettext function but dcgettext is missing. - So we omit this optimization for Solaris 2.3. BTW, Solaris 2.4 - has dcgettext. */ -# if !HAVE_CATGETS && (!HAVE_GETTEXT || HAVE_DCGETTEXT) - -# define gettext(Msgid) \ - dgettext (NULL, Msgid) - -# define dgettext(Domainname, Msgid) \ - dcgettext (Domainname, Msgid, LC_MESSAGES) - -# if defined __GNUC__ && __GNUC__ == 2 && __GNUC_MINOR__ >= 7 -/* This global variable is defined in loadmsgcat.c. We need a sign, - whether a new catalog was loaded, which can be associated with all - translations. */ -extern int _nl_msg_cat_cntr; - -# define dcgettext(Domainname, Msgid, Category) \ - (__extension__ \ - ({ \ - char *__result; \ - if (__builtin_constant_p (Msgid)) \ - { \ - static char *__translation__; \ - static int __catalog_counter__; \ - if (! __translation__ || __catalog_counter__ != _nl_msg_cat_cntr) \ - { \ - __translation__ = \ - dcgettext__ (Domainname, Msgid, Category); \ - __catalog_counter__ = _nl_msg_cat_cntr; \ - } \ - __result = __translation__; \ - } \ - else \ - __result = dcgettext__ (Domainname, Msgid, Category); \ - __result; \ - })) -# endif -# endif - -#else - -# define gettext(Msgid) (Msgid) -# define dgettext(Domainname, Msgid) (Msgid) -# define dcgettext(Domainname, Msgid, Category) (Msgid) -# define textdomain(Domainname) ((char *) Domainname) -# define bindtextdomain(Domainname, Dirname) ((char *) Dirname) - -#endif - -/* @@ begin of epilog @@ */ - -#ifdef __cplusplus -} -#endif - -#endif diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/intl/linux-msg.sed kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/intl/linux-msg.sed --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/intl/linux-msg.sed 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/intl/linux-msg.sed 1970-01-01 00:00:00.000000000 +0000 @@ -1,100 +0,0 @@ -# po2msg.sed - Convert Uniforum style .po file to Linux style .msg file -# Copyright (C) 1995 Free Software Foundation, Inc. -# Ulrich Drepper , 1995. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# -# The first directive in the .msg should be the definition of the -# message set number. We use always set number 1. -# -1 { - i\ -$set 1 # Automatically created by po2msg.sed - h - s/.*/0/ - x -} -# -# Mitch's old catalog format does not allow comments. -# -# We copy the original message as a comment into the .msg file. -# -/^msgid/ { - s/msgid[ ]*"// -# -# This does not work now with the new format. -# /"$/! { -# s/\\$// -# s/$/ ... (more lines following)"/ -# } - x -# The following nice solution is by -# Bruno - td -# Increment a decimal number in pattern space. -# First hide trailing `9' digits. - :d - s/9\(_*\)$/_\1/ - td -# Assure at least one digit is available. - s/^\(_*\)$/0\1/ -# Increment the last digit. - s/8\(_*\)$/9\1/ - s/7\(_*\)$/8\1/ - s/6\(_*\)$/7\1/ - s/5\(_*\)$/6\1/ - s/4\(_*\)$/5\1/ - s/3\(_*\)$/4\1/ - s/2\(_*\)$/3\1/ - s/1\(_*\)$/2\1/ - s/0\(_*\)$/1\1/ -# Convert the hidden `9' digits to `0's. - s/_/0/g - x - G - s/\(.*\)"\n\([0-9]*\)/$ #\2 Original Message:(\1)/p -} -# -# The .msg file contains, other then the .po file, only the translations -# but each given a unique ID. Starting from 1 and incrementing by 1 for -# each message we assign them to the messages. -# It is important that the .po file used to generate the cat-id-tbl.c file -# (with po-to-tbl) is the same as the one used here. (At least the order -# of declarations must not be changed.) -# -/^msgstr/ { - s/msgstr[ ]*"\(.*\)"/# \1/ -# Clear substitution flag. - tb -# Append the next line. - :b - N -# Look whether second part is continuation line. - s/\(.*\n\)"\(.*\)"/\1\2/ -# Yes, then branch. - ta - P - D -# Note that D includes a jump to the start!! -# We found a continuation line. But before printing insert '\'. - :a - s/\(.*\)\(\n.*\)/\1\\\2/ - P -# We cannot use D here. - s/.*\n\(.*\)/\1/ - tb -} -d diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/intl/loadinfo.h kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/intl/loadinfo.h --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/intl/loadinfo.h 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/intl/loadinfo.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,76 +0,0 @@ -/* Copyright (C) 1996, 1997 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper , 1996. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ifndef PARAMS -# if __STDC__ -# define PARAMS(args) args -# else -# define PARAMS(args) () -# endif -#endif - -/* Encoding of locale name parts. */ -#define CEN_REVISION 1 -#define CEN_SPONSOR 2 -#define CEN_SPECIAL 4 -#define XPG_NORM_CODESET 8 -#define XPG_CODESET 16 -#define TERRITORY 32 -#define CEN_AUDIENCE 64 -#define XPG_MODIFIER 128 - -#define CEN_SPECIFIC (CEN_REVISION|CEN_SPONSOR|CEN_SPECIAL|CEN_AUDIENCE) -#define XPG_SPECIFIC (XPG_CODESET|XPG_NORM_CODESET|XPG_MODIFIER) - - -struct loaded_l10nfile -{ - const char *filename; - int decided; - - const void *data; - - struct loaded_l10nfile *next; - struct loaded_l10nfile *successor[1]; -}; - - -extern const char *_nl_normalize_codeset PARAMS ((const unsigned char *codeset, - size_t name_len)); - -extern struct loaded_l10nfile * -_nl_make_l10nflist PARAMS ((struct loaded_l10nfile **l10nfile_list, - const char *dirlist, size_t dirlist_len, int mask, - const char *language, const char *territory, - const char *codeset, - const char *normalized_codeset, - const char *modifier, const char *special, - const char *sponsor, const char *revision, - const char *filename, int do_allocate)); - - -extern const char *_nl_expand_alias PARAMS ((const char *name)); - -extern int _nl_explode_name PARAMS ((char *name, const char **language, - const char **modifier, - const char **territory, - const char **codeset, - const char **normalized_codeset, - const char **special, - const char **sponsor, - const char **revision)); diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/intl/loadmsgcat.c kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/intl/loadmsgcat.c --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/intl/loadmsgcat.c 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/intl/loadmsgcat.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,222 +0,0 @@ -/* Load needed message catalogs. - Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ifdef HAVE_CONFIG_H -# include -#endif - -#include -#include -#include - -#if defined STDC_HEADERS || defined _LIBC -# include -#endif - -#if defined HAVE_UNISTD_H || defined _LIBC -# include -#endif - -#if (defined HAVE_MMAP && defined HAVE_MUNMAP) || defined _LIBC -# include -#endif - -#include "gettext.h" -#include "gettextP.h" - -/* @@ end of prolog @@ */ - -#ifdef _LIBC -/* Rename the non ISO C functions. This is required by the standard - because some ISO C functions will require linking with this object - file and the name space must not be polluted. */ -# define open __open -# define close __close -# define read __read -# define mmap __mmap -# define munmap __munmap -#endif - -/* We need a sign, whether a new catalog was loaded, which can be associated - with all translations. This is important if the translations are - cached by one of GCC's features. */ -int _nl_msg_cat_cntr = 0; - - -/* Load the message catalogs specified by FILENAME. If it is no valid - message catalog do nothing. */ -void -internal_function -_nl_load_domain (domain_file) - struct loaded_l10nfile *domain_file; -{ - int fd; - size_t size; - struct stat st; - struct mo_file_header *data = (struct mo_file_header *) -1; -#if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \ - || defined _LIBC - int use_mmap = 0; -#endif - struct loaded_domain *domain; - - domain_file->decided = 1; - domain_file->data = NULL; - - /* If the record does not represent a valid locale the FILENAME - might be NULL. This can happen when according to the given - specification the locale file name is different for XPG and CEN - syntax. */ - if (domain_file->filename == NULL) - return; - - /* Try to open the addressed file. */ - fd = open (domain_file->filename, O_RDONLY); - if (fd == -1) - return; - - /* We must know about the size of the file. */ - if (fstat (fd, &st) != 0 - || (size = (size_t) st.st_size) != st.st_size - || size < sizeof (struct mo_file_header)) - { - /* Something went wrong. */ - close (fd); - return; - } - -#if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \ - || defined _LIBC - /* Now we are ready to load the file. If mmap() is available we try - this first. If not available or it failed we try to load it. */ - data = (struct mo_file_header *) mmap (NULL, size, PROT_READ, - MAP_PRIVATE, fd, 0); - - if (data != (struct mo_file_header *) -1) - { - /* mmap() call was successful. */ - close (fd); - use_mmap = 1; - } -#endif - - /* If the data is not yet available (i.e. mmap'ed) we try to load - it manually. */ - if (data == (struct mo_file_header *) -1) - { - size_t to_read; - char *read_ptr; - - data = (struct mo_file_header *) malloc (size); - if (data == NULL) - return; - - to_read = size; - read_ptr = (char *) data; - do - { - long int nb = (long int) read (fd, read_ptr, to_read); - if (nb == -1) - { - close (fd); - return; - } - - read_ptr += nb; - to_read -= nb; - } - while (to_read > 0); - - close (fd); - } - - /* Using the magic number we can test whether it really is a message - catalog file. */ - if (data->magic != _MAGIC && data->magic != _MAGIC_SWAPPED) - { - /* The magic number is wrong: not a message catalog file. */ -#if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \ - || defined _LIBC - if (use_mmap) - munmap ((caddr_t) data, size); - else -#endif - free (data); - return; - } - - domain_file->data - = (struct loaded_domain *) malloc (sizeof (struct loaded_domain)); - if (domain_file->data == NULL) - return; - - domain = (struct loaded_domain *) domain_file->data; - domain->data = (char *) data; -#if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \ - || defined _LIBC - domain->use_mmap = use_mmap; -#endif - domain->mmap_size = size; - domain->must_swap = data->magic != _MAGIC; - - /* Fill in the information about the available tables. */ - switch (W (domain->must_swap, data->revision)) - { - case 0: - domain->nstrings = W (domain->must_swap, data->nstrings); - domain->orig_tab = (struct string_desc *) - ((char *) data + W (domain->must_swap, data->orig_tab_offset)); - domain->trans_tab = (struct string_desc *) - ((char *) data + W (domain->must_swap, data->trans_tab_offset)); - domain->hash_size = W (domain->must_swap, data->hash_tab_size); - domain->hash_tab = (nls_uint32 *) - ((char *) data + W (domain->must_swap, data->hash_tab_offset)); - break; - default: - /* This is an illegal revision. */ -#if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \ - || defined _LIBC - if (use_mmap) - munmap ((caddr_t) data, size); - else -#endif - free (data); - free (domain); - domain_file->data = NULL; - return; - } - - /* Show that one domain is changed. This might make some cached - translations invalid. */ - ++_nl_msg_cat_cntr; -} - - -#ifdef _LIBC -void -internal_function -_nl_unload_domain (domain) - struct loaded_domain *domain; -{ - if (domain->use_mmap) - munmap ((caddr_t) domain->data, domain->mmap_size); - else - free ((void *) domain->data); - - free (domain); -} -#endif diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/intl/localealias.c kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/intl/localealias.c --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/intl/localealias.c 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/intl/localealias.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,424 +0,0 @@ -/* Handle aliases for locale names. - Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc. - Written by Ulrich Drepper , 1995. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ifdef HAVE_CONFIG_H -# include -#endif - -#include -#include -#include - -#ifdef __GNUC__ -# define alloca __builtin_alloca -# define HAVE_ALLOCA 1 -#else -# if defined HAVE_ALLOCA_H || defined _LIBC -# include -# else -# ifdef _AIX - #pragma alloca -# else -# ifndef alloca -char *alloca (); -# endif -# endif -# endif -#endif - -#if defined STDC_HEADERS || defined _LIBC -# include -#else -char *getenv (); -# ifdef HAVE_MALLOC_H -# include -# else -void free (); -# endif -#endif - -#if defined HAVE_STRING_H || defined _LIBC -# ifndef _GNU_SOURCE -# define _GNU_SOURCE 1 -# endif -# include -#else -# include -# ifndef memcpy -# define memcpy(Dst, Src, Num) bcopy (Src, Dst, Num) -# endif -#endif -#if !HAVE_STRCHR && !defined _LIBC -# ifndef strchr -# define strchr index -# endif -#endif - -#include "gettext.h" -#include "gettextP.h" - -/* @@ end of prolog @@ */ - -#ifdef _LIBC -/* Rename the non ANSI C functions. This is required by the standard - because some ANSI C functions will require linking with this object - file and the name space must not be polluted. */ -# define strcasecmp __strcasecmp - -# define mempcpy __mempcpy -# define HAVE_MEMPCPY 1 - -/* We need locking here since we can be called from different places. */ -# include - -__libc_lock_define_initialized (static, lock); -#endif - - -/* For those loosing systems which don't have `alloca' we have to add - some additional code emulating it. */ -#ifdef HAVE_ALLOCA -/* Nothing has to be done. */ -# define ADD_BLOCK(list, address) /* nothing */ -# define FREE_BLOCKS(list) /* nothing */ -#else -struct block_list -{ - void *address; - struct block_list *next; -}; -# define ADD_BLOCK(list, addr) \ - do { \ - struct block_list *newp = (struct block_list *) malloc (sizeof (*newp)); \ - /* If we cannot get a free block we cannot add the new element to \ - the list. */ \ - if (newp != NULL) { \ - newp->address = (addr); \ - newp->next = (list); \ - (list) = newp; \ - } \ - } while (0) -# define FREE_BLOCKS(list) \ - do { \ - while (list != NULL) { \ - struct block_list *old = list; \ - list = list->next; \ - free (old); \ - } \ - } while (0) -# undef alloca -# define alloca(size) (malloc (size)) -#endif /* have alloca */ - - -struct alias_map -{ - const char *alias; - const char *value; -}; - - -static char *string_space = NULL; -static size_t string_space_act = 0; -static size_t string_space_max = 0; -static struct alias_map *map; -static size_t nmap = 0; -static size_t maxmap = 0; - - -/* Prototypes for local functions. */ -static size_t read_alias_file PARAMS ((const char *fname, int fname_len)) - internal_function; -static void extend_alias_table PARAMS ((void)); -static int alias_compare PARAMS ((const struct alias_map *map1, - const struct alias_map *map2)); - - -const char * -_nl_expand_alias (name) - const char *name; -{ - static const char *locale_alias_path = LOCALE_ALIAS_PATH; - struct alias_map *retval; - const char *result = NULL; - size_t added; - -#ifdef _LIBC - __libc_lock_lock (lock); -#endif - - do - { - struct alias_map item; - - item.alias = name; - - if (nmap > 0) - retval = (struct alias_map *) bsearch (&item, map, nmap, - sizeof (struct alias_map), - (int (*) PARAMS ((const void *, - const void *)) - ) alias_compare); - else - retval = NULL; - - /* We really found an alias. Return the value. */ - if (retval != NULL) - { - result = retval->value; - break; - } - - /* Perhaps we can find another alias file. */ - added = 0; - while (added == 0 && locale_alias_path[0] != '\0') - { - const char *start; - - while (locale_alias_path[0] == ':') - ++locale_alias_path; - start = locale_alias_path; - - while (locale_alias_path[0] != '\0' && locale_alias_path[0] != ':') - ++locale_alias_path; - - if (start < locale_alias_path) - added = read_alias_file (start, locale_alias_path - start); - } - } - while (added != 0); - -#ifdef _LIBC - __libc_lock_unlock (lock); -#endif - - return result; -} - - -static size_t -internal_function -read_alias_file (fname, fname_len) - const char *fname; - int fname_len; -{ -#ifndef HAVE_ALLOCA - struct block_list *block_list = NULL; -#endif - FILE *fp; - char *full_fname; - size_t added; - static const char aliasfile[] = "/locale.alias"; - - full_fname = (char *) alloca (fname_len + sizeof aliasfile); - ADD_BLOCK (block_list, full_fname); -#ifdef HAVE_MEMPCPY - mempcpy (mempcpy (full_fname, fname, fname_len), - aliasfile, sizeof aliasfile); -#else - memcpy (full_fname, fname, fname_len); - memcpy (&full_fname[fname_len], aliasfile, sizeof aliasfile); -#endif - - fp = fopen (full_fname, "r"); - if (fp == NULL) - { - FREE_BLOCKS (block_list); - return 0; - } - - added = 0; - while (!feof (fp)) - { - /* It is a reasonable approach to use a fix buffer here because - a) we are only interested in the first two fields - b) these fields must be usable as file names and so must not - be that long - */ - unsigned char buf[BUFSIZ]; - unsigned char *alias; - unsigned char *value; - unsigned char *cp; - - if (fgets (buf, sizeof buf, fp) == NULL) - /* EOF reached. */ - break; - - /* Possibly not the whole line fits into the buffer. Ignore - the rest of the line. */ - if (strchr (buf, '\n') == NULL) - { - char altbuf[BUFSIZ]; - do - if (fgets (altbuf, sizeof altbuf, fp) == NULL) - /* Make sure the inner loop will be left. The outer loop - will exit at the `feof' test. */ - break; - while (strchr (altbuf, '\n') == NULL); - } - - cp = buf; - /* Ignore leading white space. */ - while (isspace (cp[0])) - ++cp; - - /* A leading '#' signals a comment line. */ - if (cp[0] != '\0' && cp[0] != '#') - { - alias = cp++; - while (cp[0] != '\0' && !isspace (cp[0])) - ++cp; - /* Terminate alias name. */ - if (cp[0] != '\0') - *cp++ = '\0'; - - /* Now look for the beginning of the value. */ - while (isspace (cp[0])) - ++cp; - - if (cp[0] != '\0') - { - size_t alias_len; - size_t value_len; - - value = cp++; - while (cp[0] != '\0' && !isspace (cp[0])) - ++cp; - /* Terminate value. */ - if (cp[0] == '\n') - { - /* This has to be done to make the following test - for the end of line possible. We are looking for - the terminating '\n' which do not overwrite here. */ - *cp++ = '\0'; - *cp = '\n'; - } - else if (cp[0] != '\0') - *cp++ = '\0'; - - if (nmap >= maxmap) - extend_alias_table (); - - alias_len = strlen (alias) + 1; - value_len = strlen (value) + 1; - - if (string_space_act + alias_len + value_len > string_space_max) - { - /* Increase size of memory pool. */ - size_t new_size = (string_space_max - + (alias_len + value_len > 1024 - ? alias_len + value_len : 1024)); - char *new_pool = (char *) realloc (string_space, new_size); - if (new_pool == NULL) - { - FREE_BLOCKS (block_list); - return added; - } - string_space = new_pool; - string_space_max = new_size; - } - - map[nmap].alias = memcpy (&string_space[string_space_act], - alias, alias_len); - string_space_act += alias_len; - - map[nmap].value = memcpy (&string_space[string_space_act], - value, value_len); - string_space_act += value_len; - - ++nmap; - ++added; - } - } - } - - /* Should we test for ferror()? I think we have to silently ignore - errors. --drepper */ - fclose (fp); - - if (added > 0) - qsort (map, nmap, sizeof (struct alias_map), - (int (*) PARAMS ((const void *, const void *))) alias_compare); - - FREE_BLOCKS (block_list); - return added; -} - - -static void -extend_alias_table () -{ - size_t new_size; - struct alias_map *new_map; - - new_size = maxmap == 0 ? 100 : 2 * maxmap; - new_map = (struct alias_map *) realloc (map, (new_size - * sizeof (struct alias_map))); - if (new_map == NULL) - /* Simply don't extend: we don't have any more core. */ - return; - - map = new_map; - maxmap = new_size; -} - - -#ifdef _LIBC -static void __attribute__ ((unused)) -free_mem (void) -{ - if (string_space != NULL) - free (string_space); - if (map != NULL) - free (map); -} -text_set_element (__libc_subfreeres, free_mem); -#endif - - -static int -alias_compare (map1, map2) - const struct alias_map *map1; - const struct alias_map *map2; -{ -#if defined _LIBC || defined HAVE_STRCASECMP - return strcasecmp (map1->alias, map2->alias); -#else - const unsigned char *p1 = (const unsigned char *) map1->alias; - const unsigned char *p2 = (const unsigned char *) map2->alias; - unsigned char c1, c2; - - if (p1 == p2) - return 0; - - do - { - /* I know this seems to be odd but the tolower() function in - some systems libc cannot handle nonalpha characters. */ - c1 = isupper (*p1) ? tolower (*p1) : *p1; - c2 = isupper (*p2) ? tolower (*p2) : *p2; - if (c1 == '\0') - break; - ++p1; - ++p2; - } - while (c1 == c2); - - return c1 - c2; -#endif -} diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/intl/po2tbl.sed.in kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/intl/po2tbl.sed.in --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/intl/po2tbl.sed.in 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/intl/po2tbl.sed.in 1970-01-01 00:00:00.000000000 +0000 @@ -1,102 +0,0 @@ -# po2tbl.sed - Convert Uniforum style .po file to lookup table for catgets -# Copyright (C) 1995 Free Software Foundation, Inc. -# Ulrich Drepper , 1995. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -1 { - i\ -/* Automatically generated by po2tbl.sed from @PACKAGE NAME@.pot. */\ -\ -#if HAVE_CONFIG_H\ -# include \ -#endif\ -\ -#include "libgettext.h"\ -\ -const struct _msg_ent _msg_tbl[] = { - h - s/.*/0/ - x -} -# -# Write msgid entries in C array form. -# -/^msgid/ { - s/msgid[ ]*\(".*"\)/ {\1/ - tb -# Append the next line - :b - N -# Look whether second part is continuation line. - s/\(.*\)"\(\n\)"\(.*"\)/\1\2\3/ -# Yes, then branch. - ta -# Because we assume that the input file correctly formed the line -# just read cannot be again be a msgid line. So it's safe to ignore -# it. - s/\(.*\)\n.*/\1/ - bc -# We found a continuation line. But before printing insert '\'. - :a - s/\(.*\)\(\n.*\)/\1\\\2/ - P -# We cannot use D here. - s/.*\n\(.*\)/\1/ -# Some buggy seds do not clear the `successful substitution since last ``t''' -# flag on `N', so we do a `t' here to clear it. - tb -# Not reached - :c - x -# The following nice solution is by -# Bruno - td -# Increment a decimal number in pattern space. -# First hide trailing `9' digits. - :d - s/9\(_*\)$/_\1/ - td -# Assure at least one digit is available. - s/^\(_*\)$/0\1/ -# Increment the last digit. - s/8\(_*\)$/9\1/ - s/7\(_*\)$/8\1/ - s/6\(_*\)$/7\1/ - s/5\(_*\)$/6\1/ - s/4\(_*\)$/5\1/ - s/3\(_*\)$/4\1/ - s/2\(_*\)$/3\1/ - s/1\(_*\)$/2\1/ - s/0\(_*\)$/1\1/ -# Convert the hidden `9' digits to `0's. - s/_/0/g - x - G - s/\(.*\)\n\([0-9]*\)/\1, \2},/ - s/\(.*\)"$/\1/ - p -} -# -# Last line. -# -$ { - i\ -};\ - - g - s/0*\(.*\)/int _msg_tbl_length = \1;/p -} -d diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/intl/textdomain.c kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/intl/textdomain.c --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/intl/textdomain.c 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/intl/textdomain.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,108 +0,0 @@ -/* Implementation of the textdomain(3) function. - Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc. - Written by Ulrich Drepper , 1995. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ifdef HAVE_CONFIG_H -# include -#endif - -#if defined STDC_HEADERS || defined _LIBC -# include -#endif - -#if defined STDC_HEADERS || defined HAVE_STRING_H || defined _LIBC -# include -#else -# include -# ifndef memcpy -# define memcpy(Dst, Src, Num) bcopy (Src, Dst, Num) -# endif -#endif - -#ifdef _LIBC -# include -#else -# include "libgettext.h" -#endif - -/* @@ end of prolog @@ */ - -/* Name of the default text domain. */ -extern const char _nl_default_default_domain[]; - -/* Default text domain in which entries for gettext(3) are to be found. */ -extern const char *_nl_current_default_domain; - - -/* Names for the libintl functions are a problem. They must not clash - with existing names and they should follow ANSI C. But this source - code is also used in GNU C Library where the names have a __ - prefix. So we have to make a difference here. */ -#ifdef _LIBC -# define TEXTDOMAIN __textdomain -# ifndef strdup -# define strdup(str) __strdup (str) -# endif -#else -# define TEXTDOMAIN textdomain__ -#endif - -/* Set the current default message catalog to DOMAINNAME. - If DOMAINNAME is null, return the current default. - If DOMAINNAME is "", reset to the default of "messages". */ -char * -TEXTDOMAIN (domainname) - const char *domainname; -{ - char *old; - - /* A NULL pointer requests the current setting. */ - if (domainname == NULL) - return (char *) _nl_current_default_domain; - - old = (char *) _nl_current_default_domain; - - /* If domain name is the null string set to default domain "messages". */ - if (domainname[0] == '\0' - || strcmp (domainname, _nl_default_default_domain) == 0) - _nl_current_default_domain = _nl_default_default_domain; - else - { - /* If the following malloc fails `_nl_current_default_domain' - will be NULL. This value will be returned and so signals we - are out of core. */ -#if defined _LIBC || defined HAVE_STRDUP - _nl_current_default_domain = strdup (domainname); -#else - size_t len = strlen (domainname) + 1; - char *cp = (char *) malloc (len); - if (cp != NULL) - memcpy (cp, domainname, len); - _nl_current_default_domain = cp; -#endif - } - - if (old != _nl_default_default_domain) - free (old); - - return (char *) _nl_current_default_domain; -} - -#ifdef _LIBC -/* Alias for function name in GNU C Library. */ -weak_alias (__textdomain, textdomain); -#endif diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/intl/VERSION kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/intl/VERSION --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/intl/VERSION 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/intl/VERSION 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -GNU gettext library from gettext-0.10.35 diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/intl/xopen-msg.sed kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/intl/xopen-msg.sed --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/intl/xopen-msg.sed 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/intl/xopen-msg.sed 1970-01-01 00:00:00.000000000 +0000 @@ -1,104 +0,0 @@ -# po2msg.sed - Convert Uniforum style .po file to X/Open style .msg file -# Copyright (C) 1995 Free Software Foundation, Inc. -# Ulrich Drepper , 1995. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# -# The first directive in the .msg should be the definition of the -# message set number. We use always set number 1. -# -1 { - i\ -$set 1 # Automatically created by po2msg.sed - h - s/.*/0/ - x -} -# -# We copy all comments into the .msg file. Perhaps they can help. -# -/^#/ s/^#[ ]*/$ /p -# -# We copy the original message as a comment into the .msg file. -# -/^msgid/ { -# Does not work now -# /"$/! { -# s/\\$// -# s/$/ ... (more lines following)"/ -# } - s/^msgid[ ]*"\(.*\)"$/$ Original Message: \1/ - p -} -# -# The .msg file contains, other then the .po file, only the translations -# but each given a unique ID. Starting from 1 and incrementing by 1 for -# each message we assign them to the messages. -# It is important that the .po file used to generate the cat-id-tbl.c file -# (with po-to-tbl) is the same as the one used here. (At least the order -# of declarations must not be changed.) -# -/^msgstr/ { - s/msgstr[ ]*"\(.*\)"/\1/ - x -# The following nice solution is by -# Bruno - td -# Increment a decimal number in pattern space. -# First hide trailing `9' digits. - :d - s/9\(_*\)$/_\1/ - td -# Assure at least one digit is available. - s/^\(_*\)$/0\1/ -# Increment the last digit. - s/8\(_*\)$/9\1/ - s/7\(_*\)$/8\1/ - s/6\(_*\)$/7\1/ - s/5\(_*\)$/6\1/ - s/4\(_*\)$/5\1/ - s/3\(_*\)$/4\1/ - s/2\(_*\)$/3\1/ - s/1\(_*\)$/2\1/ - s/0\(_*\)$/1\1/ -# Convert the hidden `9' digits to `0's. - s/_/0/g - x -# Bring the line in the format ` ' - G - s/^[^\n]*$/& / - s/\(.*\)\n\([0-9]*\)/\2 \1/ -# Clear flag from last substitution. - tb -# Append the next line. - :b - N -# Look whether second part is a continuation line. - s/\(.*\n\)"\(.*\)"/\1\2/ -# Yes, then branch. - ta - P - D -# Note that `D' includes a jump to the start!! -# We found a continuation line. But before printing insert '\'. - :a - s/\(.*\)\(\n.*\)/\1\\\2/ - P -# We cannot use the sed command `D' here - s/.*\n\(.*\)/\1/ - tb -} -d diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/Makefile.am kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/Makefile.am --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/Makefile.am 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/Makefile.am 1970-01-01 00:00:00.000000000 +0000 @@ -1,29 +0,0 @@ -## Process this file with automake to produce Makefile.in - -SUBDIRS = intl po gtk-gui - -EXTRA_DIST = \ - autogen.sh \ - goom2.glade - -install-data-local: - @$(NORMAL_INSTALL) - if test -d $(srcdir)/pixmaps; then \ - $(mkinstalldirs) $(DESTDIR)$(pkgdatadir)/pixmaps; \ - for pixmap in $(srcdir)/pixmaps/*; do \ - if test -f $$pixmap; then \ - $(INSTALL_DATA) $$pixmap $(DESTDIR)$(pkgdatadir)/pixmaps; \ - fi \ - done \ - fi - -dist-hook: - if test -d pixmaps; then \ - mkdir $(distdir)/pixmaps; \ - for pixmap in pixmaps/*; do \ - if test -f $$pixmap; then \ - cp -p $$pixmap $(distdir)/pixmaps; \ - fi \ - done \ - fi - diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/missing kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/missing --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/missing 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/missing 1970-01-01 00:00:00.000000000 +0000 @@ -1,336 +0,0 @@ -#! /bin/sh -# Common stub for a few missing GNU programs while installing. -# Copyright 1996, 1997, 1999, 2000 Free Software Foundation, Inc. -# Originally by Fran,cois Pinard , 1996. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -# 02111-1307, USA. - -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -if test $# -eq 0; then - echo 1>&2 "Try \`$0 --help' for more information" - exit 1 -fi - -run=: - -# In the cases where this matters, `missing' is being run in the -# srcdir already. -if test -f configure.ac; then - configure_ac=configure.ac -else - configure_ac=configure.in -fi - -case "$1" in ---run) - # Try to run requested program, and just exit if it succeeds. - run= - shift - "$@" && exit 0 - ;; -esac - -# If it does not exist, or fails to run (possibly an outdated version), -# try to emulate it. -case "$1" in - - -h|--h|--he|--hel|--help) - echo "\ -$0 [OPTION]... PROGRAM [ARGUMENT]... - -Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an -error status if there is no known handling for PROGRAM. - -Options: - -h, --help display this help and exit - -v, --version output version information and exit - --run try to run the given command, and emulate it if it fails - -Supported PROGRAM values: - aclocal touch file \`aclocal.m4' - autoconf touch file \`configure' - autoheader touch file \`config.h.in' - automake touch all \`Makefile.in' files - bison create \`y.tab.[ch]', if possible, from existing .[ch] - flex create \`lex.yy.c', if possible, from existing .c - help2man touch the output file - lex create \`lex.yy.c', if possible, from existing .c - makeinfo touch the output file - tar try tar, gnutar, gtar, then tar without non-portable flags - yacc create \`y.tab.[ch]', if possible, from existing .[ch]" - ;; - - -v|--v|--ve|--ver|--vers|--versi|--versio|--version) - echo "missing 0.4 - GNU automake" - ;; - - -*) - echo 1>&2 "$0: Unknown \`$1' option" - echo 1>&2 "Try \`$0 --help' for more information" - exit 1 - ;; - - aclocal*) - if test -z "$run" && ($1 --version) > /dev/null 2>&1; then - # We have it, but it failed. - exit 1 - fi - - echo 1>&2 "\ -WARNING: \`$1' is missing on your system. You should only need it if - you modified \`acinclude.m4' or \`${configure_ac}'. You might want - to install the \`Automake' and \`Perl' packages. Grab them from - any GNU archive site." - touch aclocal.m4 - ;; - - autoconf) - if test -z "$run" && ($1 --version) > /dev/null 2>&1; then - # We have it, but it failed. - exit 1 - fi - - echo 1>&2 "\ -WARNING: \`$1' is missing on your system. You should only need it if - you modified \`${configure_ac}'. You might want to install the - \`Autoconf' and \`GNU m4' packages. Grab them from any GNU - archive site." - touch configure - ;; - - autoheader) - if test -z "$run" && ($1 --version) > /dev/null 2>&1; then - # We have it, but it failed. - exit 1 - fi - - echo 1>&2 "\ -WARNING: \`$1' is missing on your system. You should only need it if - you modified \`acconfig.h' or \`${configure_ac}'. You might want - to install the \`Autoconf' and \`GNU m4' packages. Grab them - from any GNU archive site." - files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` - test -z "$files" && files="config.h" - touch_files= - for f in $files; do - case "$f" in - *:*) touch_files="$touch_files "`echo "$f" | - sed -e 's/^[^:]*://' -e 's/:.*//'`;; - *) touch_files="$touch_files $f.in";; - esac - done - touch $touch_files - ;; - - automake*) - if test -z "$run" && ($1 --version) > /dev/null 2>&1; then - # We have it, but it failed. - exit 1 - fi - - echo 1>&2 "\ -WARNING: \`$1' is missing on your system. You should only need it if - you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. - You might want to install the \`Automake' and \`Perl' packages. - Grab them from any GNU archive site." - find . -type f -name Makefile.am -print | - sed 's/\.am$/.in/' | - while read f; do touch "$f"; done - ;; - - autom4te) - if test -z "$run" && ($1 --version) > /dev/null 2>&1; then - # We have it, but it failed. - exit 1 - fi - - echo 1>&2 "\ -WARNING: \`$1' is needed, and you do not seem to have it handy on your - system. You might have modified some files without having the - proper tools for further handling them. - You can get \`$1Help2man' as part of \`Autoconf' from any GNU - archive site." - - file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'` - test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'` - if test -f "$file"; then - touch $file - else - test -z "$file" || exec >$file - echo "#! /bin/sh" - echo "# Created by GNU Automake missing as a replacement of" - echo "# $ $@" - echo "exit 0" - chmod +x $file - exit 1 - fi - ;; - - bison|yacc) - echo 1>&2 "\ -WARNING: \`$1' is missing on your system. You should only need it if - you modified a \`.y' file. You may need the \`Bison' package - in order for those modifications to take effect. You can get - \`Bison' from any GNU archive site." - rm -f y.tab.c y.tab.h - if [ $# -ne 1 ]; then - eval LASTARG="\${$#}" - case "$LASTARG" in - *.y) - SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` - if [ -f "$SRCFILE" ]; then - cp "$SRCFILE" y.tab.c - fi - SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` - if [ -f "$SRCFILE" ]; then - cp "$SRCFILE" y.tab.h - fi - ;; - esac - fi - if [ ! -f y.tab.h ]; then - echo >y.tab.h - fi - if [ ! -f y.tab.c ]; then - echo 'main() { return 0; }' >y.tab.c - fi - ;; - - lex|flex) - echo 1>&2 "\ -WARNING: \`$1' is missing on your system. You should only need it if - you modified a \`.l' file. You may need the \`Flex' package - in order for those modifications to take effect. You can get - \`Flex' from any GNU archive site." - rm -f lex.yy.c - if [ $# -ne 1 ]; then - eval LASTARG="\${$#}" - case "$LASTARG" in - *.l) - SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` - if [ -f "$SRCFILE" ]; then - cp "$SRCFILE" lex.yy.c - fi - ;; - esac - fi - if [ ! -f lex.yy.c ]; then - echo 'main() { return 0; }' >lex.yy.c - fi - ;; - - help2man) - if test -z "$run" && ($1 --version) > /dev/null 2>&1; then - # We have it, but it failed. - exit 1 - fi - - echo 1>&2 "\ -WARNING: \`$1' is missing on your system. You should only need it if - you modified a dependency of a manual page. You may need the - \`Help2man' package in order for those modifications to take - effect. You can get \`Help2man' from any GNU archive site." - - file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` - if test -z "$file"; then - file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'` - fi - if [ -f "$file" ]; then - touch $file - else - test -z "$file" || exec >$file - echo ".ab help2man is required to generate this page" - exit 1 - fi - ;; - - makeinfo) - if test -z "$run" && (makeinfo --version) > /dev/null 2>&1; then - # We have makeinfo, but it failed. - exit 1 - fi - - echo 1>&2 "\ -WARNING: \`$1' is missing on your system. You should only need it if - you modified a \`.texi' or \`.texinfo' file, or any other file - indirectly affecting the aspect of the manual. The spurious - call might also be the consequence of using a buggy \`make' (AIX, - DU, IRIX). You might want to install the \`Texinfo' package or - the \`GNU make' package. Grab either from any GNU archive site." - file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` - if test -z "$file"; then - file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` - file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file` - fi - touch $file - ;; - - tar) - shift - if test -n "$run"; then - echo 1>&2 "ERROR: \`tar' requires --run" - exit 1 - fi - - # We have already tried tar in the generic part. - # Look for gnutar/gtar before invocation to avoid ugly error - # messages. - if (gnutar --version > /dev/null 2>&1); then - gnutar ${1+"$@"} && exit 0 - fi - if (gtar --version > /dev/null 2>&1); then - gtar ${1+"$@"} && exit 0 - fi - firstarg="$1" - if shift; then - case "$firstarg" in - *o*) - firstarg=`echo "$firstarg" | sed s/o//` - tar "$firstarg" ${1+"$@"} && exit 0 - ;; - esac - case "$firstarg" in - *h*) - firstarg=`echo "$firstarg" | sed s/h//` - tar "$firstarg" ${1+"$@"} && exit 0 - ;; - esac - fi - - echo 1>&2 "\ -WARNING: I can't seem to be able to run \`tar' with the given arguments. - You may want to install GNU tar or Free paxutils, or check the - command line arguments." - exit 1 - ;; - - *) - echo 1>&2 "\ -WARNING: \`$1' is needed, and you do not seem to have it handy on your - system. You might have modified some files without having the - proper tools for further handling them. Check the \`README' file, - it often tells you about the needed prerequirements for installing - this package. You may also peek at any GNU archive site, in case - some other package would contain this missing \`$1' program." - exit 1 - ;; -esac - -exit 0 diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/mkinstalldirs kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/mkinstalldirs --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/mkinstalldirs 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/mkinstalldirs 1970-01-01 00:00:00.000000000 +0000 @@ -1,101 +0,0 @@ -#! /bin/sh -# mkinstalldirs --- make directory hierarchy -# Author: Noah Friedman -# Created: 1993-05-16 -# Public domain - -# $Id: mkinstalldirs,v 1.1.1.1 2004/12/10 13:59:00 jchoelt Exp $ - -errstatus=0 -dirmode="" - -usage="\ -Usage: mkinstalldirs [-h] [--help] [-m mode] dir ..." - -# process command line arguments -while test $# -gt 0 ; do - case "${1}" in - -h | --help | --h* ) # -h for help - echo "${usage}" 1>&2; exit 0 ;; - -m ) # -m PERM arg - shift - test $# -eq 0 && { echo "${usage}" 1>&2; exit 1; } - dirmode="${1}" - shift ;; - -- ) shift; break ;; # stop option processing - -* ) echo "${usage}" 1>&2; exit 1 ;; # unknown option - * ) break ;; # first non-opt arg - esac -done - -for file -do - if test -d "$file"; then - shift - else - break - fi -done - -case $# in -0) exit 0 ;; -esac - -case $dirmode in -'') - if mkdir -p -- . 2>/dev/null; then - echo "mkdir -p -- $*" - exec mkdir -p -- "$@" - fi ;; -*) - if mkdir -m "$dirmode" -p -- . 2>/dev/null; then - echo "mkdir -m $dirmode -p -- $*" - exec mkdir -m "$dirmode" -p -- "$@" - fi ;; -esac - -for file -do - set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` - shift - - pathcomp= - for d - do - pathcomp="$pathcomp$d" - case "$pathcomp" in - -* ) pathcomp=./$pathcomp ;; - esac - - if test ! -d "$pathcomp"; then - echo "mkdir $pathcomp" - - mkdir "$pathcomp" || lasterr=$? - - if test ! -d "$pathcomp"; then - errstatus=$lasterr - else - if test ! -z "$dirmode"; then - echo "chmod $dirmode $pathcomp" - - lasterr="" - chmod "$dirmode" "$pathcomp" || lasterr=$? - - if test ! -z "$lasterr"; then - errstatus=$lasterr - fi - fi - fi - fi - - pathcomp="$pathcomp/" - done -done - -exit $errstatus - -# Local Variables: -# mode: shell-script -# sh-indentation: 3 -# End: -# mkinstalldirs ends here diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/po/cat-id-tbl.c kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/po/cat-id-tbl.c --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/po/cat-id-tbl.c 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/po/cat-id-tbl.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -/* Automatically generated by po2tbl.sed from goom2.pot. */ - -#if HAVE_CONFIG_H -# include -#endif - -#include "libgettext.h" - -const struct _msg_ent _msg_tbl[] = { - {"", 1}, - {"Goom Control Window", 2}, - {"_File", 3}, - {"Window Y-Size:", 4}, - {"Window X-Size:", 5}, - {"Double Pixel:", 6}, - {"Frame Rate Limiter:", 7}, - {"Display", 8}, - {"TODO", 9}, - {"Inspect", 10}, - {"Customize", 11}, - {"Couldn't find pixmap file: %s", 12}, - {"Error loading pixmap file: %s", 13}, -}; - -int _msg_tbl_length = 13; diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/po/goom2.pot kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/po/goom2.pot --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/po/goom2.pot 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/po/goom2.pot 1970-01-01 00:00:00.000000000 +0000 @@ -1,65 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR Free Software Foundation, Inc. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"POT-Creation-Date: 2003-04-27 17:01+0200\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=CHARSET\n" -"Content-Transfer-Encoding: ENCODING\n" - -#: gtk-gui/interface.c:56 -msgid "Goom Control Window" -msgstr "" - -#: gtk-gui/interface.c:74 -msgid "_File" -msgstr "" - -#: gtk-gui/interface.c:107 -msgid "Window Y-Size:" -msgstr "" - -#: gtk-gui/interface.c:154 -msgid "Window X-Size:" -msgstr "" - -#: gtk-gui/interface.c:174 -msgid "Double Pixel:" -msgstr "" - -#: gtk-gui/interface.c:185 -msgid "Frame Rate Limiter:" -msgstr "" - -#: gtk-gui/interface.c:206 -msgid "Display" -msgstr "" - -#: gtk-gui/interface.c:213 gtk-gui/interface.c:227 -msgid "TODO" -msgstr "" - -#: gtk-gui/interface.c:220 -msgid "Inspect" -msgstr "" - -#: gtk-gui/interface.c:234 -msgid "Customize" -msgstr "" - -#: gtk-gui/support.c:121 -#, c-format -msgid "Couldn't find pixmap file: %s" -msgstr "" - -#: gtk-gui/support.c:130 -#, c-format -msgid "Error loading pixmap file: %s" -msgstr "" diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/po/Makefile.in.in kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/po/Makefile.in.in --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/po/Makefile.in.in 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/po/Makefile.in.in 1970-01-01 00:00:00.000000000 +0000 @@ -1,248 +0,0 @@ -# Makefile for program source directory in GNU NLS utilities package. -# Copyright (C) 1995, 1996, 1997 by Ulrich Drepper -# -# This file file be copied and used freely without restrictions. It can -# be used in projects which are not available under the GNU Public License -# but which still want to provide support for the GNU gettext functionality. -# Please note that the actual code is *not* freely available. - -PACKAGE = @PACKAGE@ -VERSION = @VERSION@ - -SHELL = /bin/sh -@SET_MAKE@ - -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -VPATH = @srcdir@ - -prefix = @prefix@ -exec_prefix = @exec_prefix@ -datadir = $(prefix)/@DATADIRNAME@ -localedir = $(datadir)/locale -gnulocaledir = $(prefix)/share/locale -gettextsrcdir = $(prefix)/share/gettext/po -subdir = po - -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -MKINSTALLDIRS = $(top_srcdir)/@MKINSTALLDIRS@ - -CC = @CC@ -GENCAT = @GENCAT@ -GMSGFMT = PATH=../src:$$PATH @GMSGFMT@ -MSGFMT = @MSGFMT@ -XGETTEXT = PATH=../src:$$PATH @XGETTEXT@ -MSGMERGE = PATH=../src:$$PATH msgmerge - -DEFS = @DEFS@ -CFLAGS = @CFLAGS@ -CPPFLAGS = @CPPFLAGS@ - -INCLUDES = -I.. -I$(top_srcdir)/intl - -COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS) - -SOURCES = cat-id-tbl.c -POFILES = @POFILES@ -GMOFILES = @GMOFILES@ -DISTFILES = ChangeLog Makefile.in.in POTFILES.in $(PACKAGE).pot \ -stamp-cat-id $(POFILES) $(GMOFILES) $(SOURCES) - -POTFILES = \ - -CATALOGS = @CATALOGS@ -CATOBJEXT = @CATOBJEXT@ -INSTOBJEXT = @INSTOBJEXT@ - -.SUFFIXES: -.SUFFIXES: .c .o .po .pox .gmo .mo .msg .cat - -.c.o: - $(COMPILE) $< - -.po.pox: - $(MAKE) $(PACKAGE).pot - $(MSGMERGE) $< $(srcdir)/$(PACKAGE).pot -o $*.pox - -.po.mo: - $(MSGFMT) -o $@ $< - -.po.gmo: - file=$(srcdir)/`echo $* | sed 's,.*/,,'`.gmo \ - && rm -f $$file && $(GMSGFMT) -o $$file $< - -.po.cat: - sed -f ../intl/po2msg.sed < $< > $*.msg \ - && rm -f $@ && $(GENCAT) $@ $*.msg - - -all: all-@USE_NLS@ - -all-yes: cat-id-tbl.c $(CATALOGS) -all-no: - -$(srcdir)/$(PACKAGE).pot: $(POTFILES) - $(XGETTEXT) --default-domain=$(PACKAGE) --directory=$(top_srcdir) \ - --add-comments --keyword=_ --keyword=N_ \ - --files-from=$(srcdir)/POTFILES.in \ - && test ! -f $(PACKAGE).po \ - || ( rm -f $(srcdir)/$(PACKAGE).pot \ - && mv $(PACKAGE).po $(srcdir)/$(PACKAGE).pot ) - -$(srcdir)/cat-id-tbl.c: stamp-cat-id; @: -$(srcdir)/stamp-cat-id: $(PACKAGE).pot - rm -f cat-id-tbl.tmp - sed -f ../intl/po2tbl.sed $(srcdir)/$(PACKAGE).pot \ - | sed -e "s/@PACKAGE NAME@/$(PACKAGE)/" > cat-id-tbl.tmp - if cmp -s cat-id-tbl.tmp $(srcdir)/cat-id-tbl.c; then \ - rm cat-id-tbl.tmp; \ - else \ - echo cat-id-tbl.c changed; \ - rm -f $(srcdir)/cat-id-tbl.c; \ - mv cat-id-tbl.tmp $(srcdir)/cat-id-tbl.c; \ - fi - cd $(srcdir) && rm -f stamp-cat-id && echo timestamp > stamp-cat-id - - -install: install-exec install-data -install-exec: -install-data: install-data-@USE_NLS@ -install-data-no: all -install-data-yes: all - if test -r "$(MKINSTALLDIRS)"; then \ - $(MKINSTALLDIRS) $(datadir); \ - else \ - $(SHELL) $(top_srcdir)/mkinstalldirs $(datadir); \ - fi - @catalogs='$(CATALOGS)'; \ - for cat in $$catalogs; do \ - cat=`basename $$cat`; \ - case "$$cat" in \ - *.gmo) destdir=$(gnulocaledir);; \ - *) destdir=$(localedir);; \ - esac; \ - lang=`echo $$cat | sed 's/\$(CATOBJEXT)$$//'`; \ - dir=$$destdir/$$lang/LC_MESSAGES; \ - if test -r "$(MKINSTALLDIRS)"; then \ - $(MKINSTALLDIRS) $$dir; \ - else \ - $(SHELL) $(top_srcdir)/mkinstalldirs $$dir; \ - fi; \ - if test -r $$cat; then \ - $(INSTALL_DATA) $$cat $$dir/$(PACKAGE)$(INSTOBJEXT); \ - echo "installing $$cat as $$dir/$(PACKAGE)$(INSTOBJEXT)"; \ - else \ - $(INSTALL_DATA) $(srcdir)/$$cat $$dir/$(PACKAGE)$(INSTOBJEXT); \ - echo "installing $(srcdir)/$$cat as" \ - "$$dir/$(PACKAGE)$(INSTOBJEXT)"; \ - fi; \ - if test -r $$cat.m; then \ - $(INSTALL_DATA) $$cat.m $$dir/$(PACKAGE)$(INSTOBJEXT).m; \ - echo "installing $$cat.m as $$dir/$(PACKAGE)$(INSTOBJEXT).m"; \ - else \ - if test -r $(srcdir)/$$cat.m ; then \ - $(INSTALL_DATA) $(srcdir)/$$cat.m \ - $$dir/$(PACKAGE)$(INSTOBJEXT).m; \ - echo "installing $(srcdir)/$$cat as" \ - "$$dir/$(PACKAGE)$(INSTOBJEXT).m"; \ - else \ - true; \ - fi; \ - fi; \ - done - if test "$(PACKAGE)" = "gettext"; then \ - if test -r "$(MKINSTALLDIRS)"; then \ - $(MKINSTALLDIRS) $(gettextsrcdir); \ - else \ - $(SHELL) $(top_srcdir)/mkinstalldirs $(gettextsrcdir); \ - fi; \ - $(INSTALL_DATA) $(srcdir)/Makefile.in.in \ - $(gettextsrcdir)/Makefile.in.in; \ - else \ - : ; \ - fi - -# Define this as empty until I found a useful application. -installcheck: - -uninstall: - catalogs='$(CATALOGS)'; \ - for cat in $$catalogs; do \ - cat=`basename $$cat`; \ - lang=`echo $$cat | sed 's/\$(CATOBJEXT)$$//'`; \ - rm -f $(localedir)/$$lang/LC_MESSAGES/$(PACKAGE)$(INSTOBJEXT); \ - rm -f $(localedir)/$$lang/LC_MESSAGES/$(PACKAGE)$(INSTOBJEXT).m; \ - rm -f $(gnulocaledir)/$$lang/LC_MESSAGES/$(PACKAGE)$(INSTOBJEXT); \ - rm -f $(gnulocaledir)/$$lang/LC_MESSAGES/$(PACKAGE)$(INSTOBJEXT).m; \ - done - rm -f $(gettextsrcdir)/po-Makefile.in.in - -check: all - -cat-id-tbl.o: ../intl/libgettext.h - -dvi info tags TAGS ID: - -mostlyclean: - rm -f core core.* *.pox $(PACKAGE).po *.old.po cat-id-tbl.tmp - rm -fr *.o - -clean: mostlyclean - -distclean: clean - rm -f Makefile Makefile.in POTFILES *.mo *.msg *.cat *.cat.m - -maintainer-clean: distclean - @echo "This command is intended for maintainers to use;" - @echo "it deletes files that may require special tools to rebuild." - rm -f $(GMOFILES) - -distdir = ../$(PACKAGE)-$(VERSION)/$(subdir) -dist distdir: update-po $(DISTFILES) - dists="$(DISTFILES)"; \ - for file in $$dists; do \ - ln $(srcdir)/$$file $(distdir) 2> /dev/null \ - || cp -p $(srcdir)/$$file $(distdir); \ - done - -update-po: Makefile - $(MAKE) $(PACKAGE).pot - PATH=`pwd`/../src:$$PATH; \ - cd $(srcdir); \ - catalogs='$(CATALOGS)'; \ - for cat in $$catalogs; do \ - cat=`basename $$cat`; \ - lang=`echo $$cat | sed 's/\$(CATOBJEXT)$$//'`; \ - mv $$lang.po $$lang.old.po; \ - echo "$$lang:"; \ - if $(MSGMERGE) $$lang.old.po $(PACKAGE).pot -o $$lang.po; then \ - rm -f $$lang.old.po; \ - else \ - echo "msgmerge for $$cat failed!"; \ - rm -f $$lang.po; \ - mv $$lang.old.po $$lang.po; \ - fi; \ - done - -POTFILES: POTFILES.in - ( if test 'x$(srcdir)' != 'x.'; then \ - posrcprefix='$(top_srcdir)/'; \ - else \ - posrcprefix="../"; \ - fi; \ - rm -f $@-t $@ \ - && (sed -e '/^#/d' -e '/^[ ]*$$/d' \ - -e "s@.*@ $$posrcprefix& \\\\@" < $(srcdir)/$@.in \ - | sed -e '$$s/\\$$//') > $@-t \ - && chmod a-w $@-t \ - && mv $@-t $@ ) - -Makefile: Makefile.in.in ../config.status POTFILES - cd .. \ - && CONFIG_FILES=$(subdir)/$@.in CONFIG_HEADERS= \ - $(SHELL) ./config.status - -# Tell versions [3.59,3.63) of GNU make not to export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/po/POTFILES.in kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/po/POTFILES.in --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/po/POTFILES.in 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/po/POTFILES.in 1970-01-01 00:00:00.000000000 +0000 @@ -1,6 +0,0 @@ -# List of source files containing translatable strings. - -gtk-gui/main.c -gtk-gui/interface.c -gtk-gui/callbacks.c -gtk-gui/support.c diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/po/stamp-cat-id kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/po/stamp-cat-id --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/po/stamp-cat-id 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/po/stamp-cat-id 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -timestamp diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/stamp-h.in kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/stamp-h.in --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/gtk-gui-devel/stamp-h.in 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/gtk-gui-devel/stamp-h.in 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -timestamp diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/KNOWNBUGS kodi-visualization-goom-2.1.0/lib/goom2k4-0/KNOWNBUGS --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/KNOWNBUGS 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/KNOWNBUGS 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ - diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/libgoom2.pc.in kodi-visualization-goom-2.1.0/lib/goom2k4-0/libgoom2.pc.in --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/libgoom2.pc.in 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/libgoom2.pc.in 1970-01-01 00:00:00.000000000 +0000 @@ -1,12 +0,0 @@ -prefix=@prefix@ -exec_prefix=@exec_prefix@ -libdir=@libdir@ -includedir=@includedir@ - -Name: libgoom2 -Version: @VERSION@ -Description: goom audio visualisation effects. -Requires: -Libs: -L${libdir} -lgoom2 -Cflags: -I${includedir} - diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/m4/sdl.m4 kodi-visualization-goom-2.1.0/lib/goom2k4-0/m4/sdl.m4 --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/m4/sdl.m4 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/m4/sdl.m4 1970-01-01 00:00:00.000000000 +0000 @@ -1,175 +0,0 @@ -# Configure paths for SDL -# Sam Lantinga 9/21/99 -# stolen from Manish Singh -# stolen back from Frank Belew -# stolen from Manish Singh -# Shamelessly stolen from Owen Taylor - -dnl AM_PATH_SDL([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]]) -dnl Test for SDL, and define SDL_CFLAGS and SDL_LIBS -dnl -AC_DEFUN([AM_PATH_SDL2], -[dnl -dnl Get the cflags and libraries from the sdl-config script -dnl -AC_ARG_WITH(sdl-prefix,[ --with-sdl-prefix=PFX Prefix where SDL is installed (optional)], - sdl_prefix="$withval", sdl_prefix="") -AC_ARG_WITH(sdl-exec-prefix,[ --with-sdl-exec-prefix=PFX Exec prefix where SDL is installed (optional)], - sdl_exec_prefix="$withval", sdl_exec_prefix="") -AC_ARG_ENABLE(sdltest, [ --disable-sdltest Do not try to compile and run a test SDL program], - , enable_sdltest=yes) - - if test x$sdl_exec_prefix != x ; then - sdl_args="$sdl_args --exec-prefix=$sdl_exec_prefix" - if test x${SDL_CONFIG+set} != xset ; then - SDL_CONFIG=$sdl_exec_prefix/bin/sdl-config - fi - fi - if test x$sdl_prefix != x ; then - sdl_args="$sdl_args --prefix=$sdl_prefix" - if test x${SDL_CONFIG+set} != xset ; then - SDL_CONFIG=$sdl_prefix/bin/sdl-config - fi - fi - - AC_REQUIRE([AC_CANONICAL_HOST]) - PATH="$prefix/bin:$prefix/usr/bin:$PATH" - AC_PATH_PROG(SDL_CONFIG, sdl-config, no, [$PATH]) - min_sdl_version=ifelse([$1], ,0.11.0,$1) - AC_MSG_CHECKING(for SDL - version >= $min_sdl_version) - no_sdl="" - if test "$SDL_CONFIG" = "no" ; then - no_sdl=yes - else - SDL_CFLAGS=`$SDL_CONFIG $sdlconf_args --cflags` - SDL_LIBS=`$SDL_CONFIG $sdlconf_args --libs` - - sdl_major_version=`$SDL_CONFIG $sdl_args --version | \ - sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` - sdl_minor_version=`$SDL_CONFIG $sdl_args --version | \ - sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` - sdl_micro_version=`$SDL_CONFIG $sdl_config_args --version | \ - sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` - if test "x$enable_sdltest" = "xyes" ; then - ac_save_CFLAGS="$CFLAGS" - ac_save_LIBS="$LIBS" - CFLAGS="$CFLAGS $SDL_CFLAGS" - LIBS="$LIBS $SDL_LIBS" -dnl -dnl Now check if the installed SDL is sufficiently new. (Also sanity -dnl checks the results of sdl-config to some extent -dnl - rm -f conf.sdltest - AC_TRY_RUN([ -#include -#include -#include -#include "SDL.h" - -char* -my_strdup (char *str) -{ - char *new_str; - - if (str) - { - new_str = (char *)malloc ((strlen (str) + 1) * sizeof(char)); - strcpy (new_str, str); - } - else - new_str = NULL; - - return new_str; -} - -int main (int argc, char *argv[]) -{ - int major, minor, micro; - char *tmp_version; - - /* This hangs on some systems (?) - system ("touch conf.sdltest"); - */ - { FILE *fp = fopen("conf.sdltest", "a"); if ( fp ) fclose(fp); } - - /* HP/UX 9 (%@#!) writes to sscanf strings */ - tmp_version = my_strdup("$min_sdl_version"); - if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { - printf("%s, bad version string\n", "$min_sdl_version"); - exit(1); - } - - if (($sdl_major_version > major) || - (($sdl_major_version == major) && ($sdl_minor_version > minor)) || - (($sdl_major_version == major) && ($sdl_minor_version == minor) && ($sdl_micro_version >= micro))) - { - return 0; - } - else - { - printf("\n*** 'sdl-config --version' returned %d.%d.%d, but the minimum version\n", $sdl_major_version, $sdl_minor_version, $sdl_micro_version); - printf("*** of SDL required is %d.%d.%d. If sdl-config is correct, then it is\n", major, minor, micro); - printf("*** best to upgrade to the required version.\n"); - printf("*** If sdl-config was wrong, set the environment variable SDL_CONFIG\n"); - printf("*** to point to the correct copy of sdl-config, and remove the file\n"); - printf("*** config.cache before re-running configure\n"); - return 1; - } -} - -],, no_sdl=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) - CFLAGS="$ac_save_CFLAGS" - LIBS="$ac_save_LIBS" - fi - fi - if test "x$no_sdl" = x ; then - AC_MSG_RESULT(yes) - ifelse([$2], , :, [$2]) - else - AC_MSG_RESULT(no) - if test "$SDL_CONFIG" = "no" ; then - echo "*** The sdl-config script installed by SDL could not be found" - echo "*** If SDL was installed in PREFIX, make sure PREFIX/bin is in" - echo "*** your path, or set the SDL_CONFIG environment variable to the" - echo "*** full path to sdl-config." - else - if test -f conf.sdltest ; then - : - else - echo "*** Could not run SDL test program, checking why..." - CFLAGS="$CFLAGS $SDL_CFLAGS" - LIBS="$LIBS $SDL_LIBS" - AC_TRY_LINK([ -#include -#include "SDL.h" - -int main(int argc, char *argv[]) -{ return 0; } -#undef main -#define main K_and_R_C_main -], [ return 0; ], - [ echo "*** The test program compiled, but did not run. This usually means" - echo "*** that the run-time linker is not finding SDL or finding the wrong" - echo "*** version of SDL. If it is not finding SDL, you'll need to set your" - echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" - echo "*** to the installed location Also, make sure you have run ldconfig if that" - echo "*** is required on your system" - echo "***" - echo "*** If you have an old version installed, it is best to remove it, although" - echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"], - [ echo "*** The test program failed to compile or link. See the file config.log for the" - echo "*** exact error that occured. This usually means SDL was incorrectly installed" - echo "*** or that you have moved SDL since it was installed. In the latter case, you" - echo "*** may want to edit the sdl-config script: $SDL_CONFIG" ]) - CFLAGS="$ac_save_CFLAGS" - LIBS="$ac_save_LIBS" - fi - fi - SDL_CFLAGS="" - SDL_LIBS="" - ifelse([$3], , :, [$3]) - fi - AC_SUBST(SDL_CFLAGS) - AC_SUBST(SDL_LIBS) - rm -f conf.sdltest -]) diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/m4/xmms.m4 kodi-visualization-goom-2.1.0/lib/goom2k4-0/m4/xmms.m4 --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/m4/xmms.m4 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/m4/xmms.m4 1970-01-01 00:00:00.000000000 +0000 @@ -1,148 +0,0 @@ -# CFLAGS and library paths for XMMS -# written 15 December 1999 by Ben Gertzfield - -dnl Usage: -dnl AM_PATH_XMMS([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]]) -dnl -dnl Example: -dnl AM_PATH_XMMS(0.9.5.1, , AC_MSG_ERROR([*** XMMS >= 0.9.5.1 not installed - please install first ***])) -dnl -dnl Defines XMMS_CFLAGS, XMMS_LIBS, XMMS_DATA_DIR, XMMS_PLUGIN_DIR, -dnl XMMS_VISUALIZATION_PLUGIN_DIR, XMMS_INPUT_PLUGIN_DIR, -dnl XMMS_OUTPUT_PLUGIN_DIR, XMMS_GENERAL_PLUGIN_DIR, XMMS_EFFECT_PLUGIN_DIR, -dnl and XMMS_VERSION for your plugin pleasure. -dnl - -dnl XMMS_TEST_VERSION(AVAILABLE-VERSION, NEEDED-VERSION [, ACTION-IF-OKAY [, ACTION-IF-NOT-OKAY]]) -AC_DEFUN(XMMS_TEST_VERSION2, [ - -# Determine which version number is greater. Prints 2 to stdout if -# the second number is greater, 1 if the first number is greater, -# 0 if the numbers are equal. - -# Written 15 December 1999 by Ben Gertzfield -# Revised 15 December 1999 by Jim Monty - - AC_PROG_AWK - xmms_got_version=[` $AWK ' \ -BEGIN { \ - print vercmp(ARGV[1], ARGV[2]); \ -} \ - \ -function vercmp(ver1, ver2, ver1arr, ver2arr, \ - ver1len, ver2len, \ - ver1int, ver2int, len, i, p) { \ - \ - ver1len = split(ver1, ver1arr, /\./); \ - ver2len = split(ver2, ver2arr, /\./); \ - \ - len = ver1len > ver2len ? ver1len : ver2len; \ - \ - for (i = 1; i <= len; i++) { \ - p = 1000 ^ (len - i); \ - ver1int += ver1arr[i] * p; \ - ver2int += ver2arr[i] * p; \ - } \ - \ - if (ver1int < ver2int) \ - return 2; \ - else if (ver1int > ver2int) \ - return 1; \ - else \ - return 0; \ -}' $1 $2`] - - if test $xmms_got_version -eq 2; then # failure - ifelse([$4], , :, $4) - else # success! - ifelse([$3], , :, $3) - fi -]) - -AC_DEFUN(AM_PATH_XMMS2, -[ -AC_ARG_WITH(xmms-prefix,[ --with-xmms-prefix=PFX Prefix where XMMS is installed (optional)], - xmms_config_prefix="$withval", xmms_config_prefix="") -AC_ARG_WITH(xmms-exec-prefix,[ --with-xmms-exec-prefix=PFX Exec prefix where XMMS is installed (optional)], - xmms_config_exec_prefix="$withval", xmms_config_exec_prefix="") - -if test x$xmms_config_exec_prefix != x; then - xmms_config_args="$xmms_config_args --exec-prefix=$xmms_config_exec_prefix" - if test x${XMMS_CONFIG+set} != xset; then - XMMS_CONFIG=$xmms_config_exec_prefix/bin/xmms-config - fi -fi - -if test x$xmms_config_prefix != x; then - xmms_config_args="$xmms_config_args --prefix=$xmms_config_prefix" - if test x${XMMS_CONFIG+set} != xset; then - XMMS_CONFIG=$xmms_config_prefix/bin/xmms-config - fi -fi - -AC_PATH_PROG(XMMS_CONFIG, xmms-config, no) -min_xmms_version=ifelse([$1], ,0.9.5.1, $1) - -if test "$XMMS_CONFIG" = "no"; then - no_xmms=yes -else - XMMS_CFLAGS=`$XMMS_CONFIG $xmms_config_args --cflags` - XMMS_LIBS=`$XMMS_CONFIG $xmms_config_args --libs` - XMMS_VERSION=`$XMMS_CONFIG $xmms_config_args --version` - XMMS_DATA_DIR=`$XMMS_CONFIG $xmms_config_args --data-dir` - XMMS_PLUGIN_DIR=`$XMMS_CONFIG $xmms_config_args --plugin-dir` - XMMS_VISUALIZATION_PLUGIN_DIR=`$XMMS_CONFIG $xmms_config_args \ - --visualization-plugin-dir` - XMMS_INPUT_PLUGIN_DIR=`$XMMS_CONFIG $xmms_config_args --input-plugin-dir` - XMMS_OUTPUT_PLUGIN_DIR=`$XMMS_CONFIG $xmms_config_args --output-plugin-dir` - XMMS_EFFECT_PLUGIN_DIR=`$XMMS_CONFIG $xmms_config_args --effect-plugin-dir` - XMMS_GENERAL_PLUGIN_DIR=`$XMMS_CONFIG $xmms_config_args --general-plugin-dir` - - XMMS_TEST_VERSION2($XMMS_VERSION, $min_xmms_version, ,no_xmms=version) -fi - -AC_MSG_CHECKING(for XMMS - version >= $min_xmms_version) - -if test "x$no_xmms" = x; then - AC_MSG_RESULT(yes) - ifelse([$2], , :, [$2]) -else - AC_MSG_RESULT(no) - - if test "$XMMS_CONFIG" = "no" ; then - echo "*** The xmms-config script installed by XMMS could not be found." - echo "*** If XMMS was installed in PREFIX, make sure PREFIX/bin is in" - echo "*** your path, or set the XMMS_CONFIG environment variable to the" - echo "*** full path to xmms-config." - else - if test "$no_xmms" = "version"; then - echo "*** An old version of XMMS, $XMMS_VERSION, was found." - echo "*** You need a version of XMMS newer than $min_xmms_version." - echo "*** The latest version of XMMS is always available from" - echo "*** http://www.xmms.org/" - echo "***" - - echo "*** If you have already installed a sufficiently new version, this error" - echo "*** probably means that the wrong copy of the xmms-config shell script is" - echo "*** being found. The easiest way to fix this is to remove the old version" - echo "*** of XMMS, but you can also set the XMMS_CONFIG environment to point to the" - echo "*** correct copy of xmms-config. (In this case, you will have to" - echo "*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf" - echo "*** so that the correct libraries are found at run-time)" - fi - fi - XMMS_CFLAGS="" - XMMS_LIBS="" - ifelse([$3], , :, [$3]) -fi -AC_SUBST(XMMS_CFLAGS) -AC_SUBST(XMMS_LIBS) -AC_SUBST(XMMS_VERSION) -AC_SUBST(XMMS_DATA_DIR) -AC_SUBST(XMMS_PLUGIN_DIR) -AC_SUBST(XMMS_VISUALIZATION_PLUGIN_DIR) -AC_SUBST(XMMS_INPUT_PLUGIN_DIR) -AC_SUBST(XMMS_OUTPUT_PLUGIN_DIR) -AC_SUBST(XMMS_GENERAL_PLUGIN_DIR) -AC_SUBST(XMMS_EFFECT_PLUGIN_DIR) -]) diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/iGoom.xcode/project.pbxproj kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/iGoom.xcode/project.pbxproj --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/iGoom.xcode/project.pbxproj 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/iGoom.xcode/project.pbxproj 1970-01-01 00:00:00.000000000 +0000 @@ -1,1130 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 39; - objects = { - 1058C7A0FEA54F0111CA2CBB = { - children = ( - 1058C7A1FEA54F0111CA2CBB, - 3B336C0906D1537B003DCDCB, - 3B336CD606D159F9003DCDCB, - ); - isa = PBXGroup; - name = "Linked Frameworks"; - refType = 4; - sourceTree = ""; - }; - 1058C7A1FEA54F0111CA2CBB = { - isa = PBXFileReference; - lastKnownFileType = wrapper.framework; - name = Cocoa.framework; - path = /System/Library/Frameworks/Cocoa.framework; - refType = 0; - sourceTree = ""; - }; - 1058C7A2FEA54F0111CA2CBB = { - children = ( - 3BE13CC706D3FE26005DAB04, - 29B97325FDCFA39411CA2CEA, - 29B97324FDCFA39411CA2CEA, - ); - isa = PBXGroup; - name = "Other Frameworks"; - refType = 4; - sourceTree = ""; - }; -//100 -//101 -//102 -//103 -//104 -//190 -//191 -//192 -//193 -//194 - 19C28FACFE9D520D11CA2CBB = { - children = ( - 8D1107320486CEB800E47090, - 3BE13C9406D3FD5D005DAB04, - ); - isa = PBXGroup; - name = Products; - refType = 4; - sourceTree = ""; - }; -//190 -//191 -//192 -//193 -//194 -//290 -//291 -//292 -//293 -//294 - 29B97313FDCFA39411CA2CEA = { - buildSettings = { - }; - buildStyles = ( - 4A9504CCFFE6A4B311CA0CBA, - 4A9504CDFFE6A4B311CA0CBA, - ); - hasScannedForEncodings = 1; - isa = PBXProject; - mainGroup = 29B97314FDCFA39411CA2CEA; - projectDirPath = ""; - targets = ( - 8D1107260486CEB800E47090, - 3BE13C9306D3FD5D005DAB04, - ); - }; - 29B97314FDCFA39411CA2CEA = { - children = ( - 3BE13CAB06D3FDB2005DAB04, - 3BE13C9B06D3FDB2005DAB04, - 3B336D8A06D3DE8E003DCDCB, - 29B97315FDCFA39411CA2CEA, - 29B97323FDCFA39411CA2CEA, - 19C28FACFE9D520D11CA2CBB, - ); - isa = PBXGroup; - name = iGoom; - path = ""; - refType = 4; - sourceTree = ""; - }; - 29B97315FDCFA39411CA2CEA = { - children = ( - 32CA4F630368D1EE00C91783, - ); - isa = PBXGroup; - name = "Other Sources"; - path = ""; - refType = 4; - sourceTree = ""; - }; - 29B97323FDCFA39411CA2CEA = { - children = ( - 3BA6971006D8B8EF007E5D2B, - 3BE13C7E06D3FAE8005DAB04, - 1058C7A0FEA54F0111CA2CBB, - 1058C7A2FEA54F0111CA2CBB, - ); - isa = PBXGroup; - name = Frameworks; - path = ""; - refType = 4; - sourceTree = ""; - }; - 29B97324FDCFA39411CA2CEA = { - isa = PBXFileReference; - lastKnownFileType = wrapper.framework; - name = AppKit.framework; - path = /System/Library/Frameworks/AppKit.framework; - refType = 0; - sourceTree = ""; - }; - 29B97325FDCFA39411CA2CEA = { - isa = PBXFileReference; - lastKnownFileType = wrapper.framework; - name = Foundation.framework; - path = /System/Library/Frameworks/Foundation.framework; - refType = 0; - sourceTree = ""; - }; -//290 -//291 -//292 -//293 -//294 -//320 -//321 -//322 -//323 -//324 - 32CA4F630368D1EE00C91783 = { - fileEncoding = 4; - isa = PBXFileReference; - lastKnownFileType = sourcecode.c.h; - path = iGoom_Prefix.pch; - refType = 4; - sourceTree = ""; - }; -//320 -//321 -//322 -//323 -//324 -//3B0 -//3B1 -//3B2 -//3B3 -//3B4 - 3B336C0906D1537B003DCDCB = { - isa = PBXFileReference; - lastKnownFileType = wrapper.framework; - name = OpenGL.framework; - path = /System/Library/Frameworks/OpenGL.framework; - refType = 0; - sourceTree = ""; - }; - 3B336C0A06D1537B003DCDCB = { - fileRef = 3B336C0906D1537B003DCDCB; - isa = PBXBuildFile; - settings = { - }; - }; - 3B336CD606D159F9003DCDCB = { - isa = PBXFileReference; - lastKnownFileType = wrapper.framework; - name = CoreAudio.framework; - path = /System/Library/Frameworks/CoreAudio.framework; - refType = 0; - sourceTree = ""; - }; - 3B336CD706D159F9003DCDCB = { - fileRef = 3B336CD606D159F9003DCDCB; - isa = PBXBuildFile; - settings = { - }; - }; - 3B336D8A06D3DE8E003DCDCB = { - children = ( - 3B336D9A06D3DE8E003DCDCB, - 3B336D8B06D3DE8E003DCDCB, - 3B336D8C06D3DE8E003DCDCB, - 3B336D9D06D3DE8E003DCDCB, - 3B336D9E06D3DE8E003DCDCB, - 3BCD10C30798B01500910E20, - 3BCD10C40798B02D00910E20, - 3B336D9B06D3DE8E003DCDCB, - 3B336D9C06D3DE8E003DCDCB, - 3B336D9306D3DE8E003DCDCB, - 3B336D9406D3DE8E003DCDCB, - 3B336D9506D3DE8E003DCDCB, - 3B336D9606D3DE8E003DCDCB, - 3B336D9706D3DE8E003DCDCB, - 3B336D9806D3DE8E003DCDCB, - ); - isa = PBXGroup; - path = StandAlone; - refType = 4; - sourceTree = ""; - }; - 3B336D8B06D3DE8E003DCDCB = { - fileEncoding = 4; - isa = PBXFileReference; - lastKnownFileType = sourcecode.c.h; - path = AppController.h; - refType = 4; - sourceTree = ""; - }; - 3B336D8C06D3DE8E003DCDCB = { - fileEncoding = 4; - isa = PBXFileReference; - lastKnownFileType = sourcecode.c.objc; - path = AppController.m; - refType = 4; - sourceTree = ""; - }; - 3B336D8F06D3DE8E003DCDCB = { - children = ( - 3B336D9006D3DE8E003DCDCB, - ); - isa = PBXVariantGroup; - name = InfoPlist.strings; - path = ""; - refType = 4; - sourceTree = ""; - }; - 3B336D9006D3DE8E003DCDCB = { - fileEncoding = 4; - isa = PBXFileReference; - lastKnownFileType = text.plist.strings; - name = English; - path = English.lproj/InfoPlist.strings; - refType = 4; - sourceTree = ""; - }; - 3B336D9106D3DE8E003DCDCB = { - children = ( - 3B336D9206D3DE8E003DCDCB, - ); - isa = PBXVariantGroup; - name = MainMenu.nib; - path = ""; - refType = 4; - sourceTree = ""; - }; - 3B336D9206D3DE8E003DCDCB = { - isa = PBXFileReference; - lastKnownFileType = wrapper.nib; - name = English; - path = English.lproj/MainMenu.nib; - refType = 4; - sourceTree = ""; - }; - 3B336D9306D3DE8E003DCDCB = { - fileEncoding = 4; - isa = PBXFileReference; - lastKnownFileType = sourcecode.c.h; - path = Goom.h; - refType = 4; - sourceTree = ""; - }; - 3B336D9406D3DE8E003DCDCB = { - fileEncoding = 4; - isa = PBXFileReference; - lastKnownFileType = sourcecode.c.objc; - path = Goom.m; - refType = 4; - sourceTree = ""; - }; - 3B336D9506D3DE8E003DCDCB = { - fileEncoding = 4; - isa = PBXFileReference; - lastKnownFileType = sourcecode.c.h; - path = GoomFXParam.h; - refType = 4; - sourceTree = ""; - }; - 3B336D9606D3DE8E003DCDCB = { - fileEncoding = 4; - isa = PBXFileReference; - lastKnownFileType = sourcecode.c.objc; - path = GoomFXParam.m; - refType = 4; - sourceTree = ""; - }; - 3B336D9706D3DE8E003DCDCB = { - fileEncoding = 4; - isa = PBXFileReference; - lastKnownFileType = sourcecode.c.h; - path = GoomFXView.h; - refType = 4; - sourceTree = ""; - }; - 3B336D9806D3DE8E003DCDCB = { - fileEncoding = 4; - isa = PBXFileReference; - lastKnownFileType = sourcecode.c.objc; - path = GoomFXView.m; - refType = 4; - sourceTree = ""; - }; - 3B336D9A06D3DE8E003DCDCB = { - fileEncoding = 4; - isa = PBXFileReference; - lastKnownFileType = sourcecode.c.objc; - path = main.m; - refType = 4; - sourceTree = ""; - }; - 3B336D9B06D3DE8E003DCDCB = { - fileEncoding = 4; - isa = PBXFileReference; - lastKnownFileType = sourcecode.c.h; - path = MainOpenGLView.h; - refType = 4; - sourceTree = ""; - }; - 3B336D9C06D3DE8E003DCDCB = { - fileEncoding = 4; - isa = PBXFileReference; - lastKnownFileType = sourcecode.c.objc; - path = MainOpenGLView.m; - refType = 4; - sourceTree = ""; - }; - 3B336D9D06D3DE8E003DCDCB = { - fileEncoding = 4; - isa = PBXFileReference; - lastKnownFileType = sourcecode.c.h; - path = MyApplication.h; - refType = 4; - sourceTree = ""; - }; - 3B336D9E06D3DE8E003DCDCB = { - fileEncoding = 4; - isa = PBXFileReference; - lastKnownFileType = sourcecode.c.objc; - path = MyApplication.m; - refType = 4; - sourceTree = ""; - }; - 3B336D9F06D3DE8E003DCDCB = { - fileEncoding = 4; - isa = PBXFileReference; - lastKnownFileType = sourcecode.c.h; - path = SoundSampler.h; - refType = 4; - sourceTree = ""; - }; - 3B336DA006D3DE8E003DCDCB = { - fileEncoding = 4; - isa = PBXFileReference; - lastKnownFileType = sourcecode.cpp.objcpp; - path = SoundSampler.mm; - refType = 4; - sourceTree = ""; - }; - 3B336DA106D3DE8E003DCDCB = { - fileRef = 3B336D8B06D3DE8E003DCDCB; - isa = PBXBuildFile; - settings = { - }; - }; - 3B336DA206D3DE8E003DCDCB = { - fileRef = 3B336D8C06D3DE8E003DCDCB; - isa = PBXBuildFile; - settings = { - }; - }; - 3B336DA506D3DE8E003DCDCB = { - fileRef = 3B336D8F06D3DE8E003DCDCB; - isa = PBXBuildFile; - settings = { - }; - }; - 3B336DA606D3DE8E003DCDCB = { - fileRef = 3B336D9106D3DE8E003DCDCB; - isa = PBXBuildFile; - settings = { - }; - }; - 3B336DA706D3DE8E003DCDCB = { - fileRef = 3B336D9306D3DE8E003DCDCB; - isa = PBXBuildFile; - settings = { - }; - }; - 3B336DA806D3DE8E003DCDCB = { - fileRef = 3B336D9406D3DE8E003DCDCB; - isa = PBXBuildFile; - settings = { - }; - }; - 3B336DA906D3DE8E003DCDCB = { - fileRef = 3B336D9506D3DE8E003DCDCB; - isa = PBXBuildFile; - settings = { - }; - }; - 3B336DAA06D3DE8E003DCDCB = { - fileRef = 3B336D9606D3DE8E003DCDCB; - isa = PBXBuildFile; - settings = { - }; - }; - 3B336DAB06D3DE8E003DCDCB = { - fileRef = 3B336D9706D3DE8E003DCDCB; - isa = PBXBuildFile; - settings = { - }; - }; - 3B336DAC06D3DE8E003DCDCB = { - fileRef = 3B336D9806D3DE8E003DCDCB; - isa = PBXBuildFile; - settings = { - }; - }; - 3B336DAE06D3DE8E003DCDCB = { - fileRef = 3B336D9A06D3DE8E003DCDCB; - isa = PBXBuildFile; - settings = { - }; - }; - 3B336DAF06D3DE8E003DCDCB = { - fileRef = 3B336D9B06D3DE8E003DCDCB; - isa = PBXBuildFile; - settings = { - }; - }; - 3B336DB006D3DE8E003DCDCB = { - fileRef = 3B336D9C06D3DE8E003DCDCB; - isa = PBXBuildFile; - settings = { - }; - }; - 3B336DB106D3DE8E003DCDCB = { - fileRef = 3B336D9D06D3DE8E003DCDCB; - isa = PBXBuildFile; - settings = { - }; - }; - 3B336DB206D3DE8E003DCDCB = { - fileRef = 3B336D9E06D3DE8E003DCDCB; - isa = PBXBuildFile; - settings = { - }; - }; - 3B336DB306D3DE8E003DCDCB = { - fileRef = 3B336D9F06D3DE8E003DCDCB; - isa = PBXBuildFile; - settings = { - }; - }; - 3B336DB406D3DE8E003DCDCB = { - fileRef = 3B336DA006D3DE8E003DCDCB; - isa = PBXBuildFile; - settings = { - }; - }; - 3B336E1206D3F5D2003DCDCB = { - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - 3BA696BF06D7FAA2007E5D2B, - ); - isa = PBXCopyFilesBuildPhase; - runOnlyForDeploymentPostprocessing = 0; - }; - 3B73A57E0798599C001B0B2B = { - isa = PBXFileReference; - lastKnownFileType = image.png; - name = goom2k4.png; - path = ../../goom2k4.png; - refType = 4; - sourceTree = ""; - }; - 3B73A57F0798599C001B0B2B = { - fileRef = 3B73A57E0798599C001B0B2B; - isa = PBXBuildFile; - settings = { - }; - }; - 3B73A60207986421001B0B2B = { - fileEncoding = 4; - isa = PBXFileReference; - lastKnownFileType = sourcecode.c.h; - path = CoreAudioHardware.h; - refType = 4; - sourceTree = ""; - }; - 3B73A60307986421001B0B2B = { - fileEncoding = 4; - isa = PBXFileReference; - lastKnownFileType = sourcecode.cpp.cpp; - path = CoreAudioHardware.cpp; - refType = 4; - sourceTree = ""; - }; - 3B73A60407986421001B0B2B = { - fileRef = 3B73A60207986421001B0B2B; - isa = PBXBuildFile; - settings = { - }; - }; - 3B73A60507986421001B0B2B = { - fileRef = 3B73A60307986421001B0B2B; - isa = PBXBuildFile; - settings = { - }; - }; - 3B73A67107986CB2001B0B2B = { - fileEncoding = 4; - isa = PBXFileReference; - lastKnownFileType = sourcecode.c.h; - path = CoreAudioDevice.h; - refType = 4; - sourceTree = ""; - }; - 3B73A67207986CB2001B0B2B = { - fileEncoding = 4; - isa = PBXFileReference; - lastKnownFileType = sourcecode.cpp.cpp; - path = CoreAudioDevice.cpp; - refType = 4; - sourceTree = ""; - }; - 3B73A67307986CB2001B0B2B = { - fileRef = 3B73A67107986CB2001B0B2B; - isa = PBXBuildFile; - settings = { - }; - }; - 3B73A67407986CB2001B0B2B = { - fileRef = 3B73A67207986CB2001B0B2B; - isa = PBXBuildFile; - settings = { - }; - }; - 3BA4F62007A1C93D00722D4D = { - fileRef = 3BA7946306D4005C0013ADCC; - isa = PBXBuildFile; - settings = { - }; - }; - 3BA696BE06D7FA9A007E5D2B = { - fileRef = 3BE13C7E06D3FAE8005DAB04; - isa = PBXBuildFile; - settings = { - }; - }; - 3BA696BF06D7FAA2007E5D2B = { - fileRef = 3BE13C7E06D3FAE8005DAB04; - isa = PBXBuildFile; - settings = { - }; - }; - 3BA6971006D8B8EF007E5D2B = { - isa = PBXFileReference; - lastKnownFileType = archive.ar; - name = libgoom2.0.a; - path = iTunes/libgoom2.0.a; - refType = 4; - sourceTree = ""; - }; - 3BA6971E06D8BCE9007E5D2B = { - fileRef = 3BA6971006D8B8EF007E5D2B; - isa = PBXBuildFile; - settings = { - }; - }; - 3BA7946306D4005C0013ADCC = { - fileEncoding = 4; - isa = PBXFileReference; - lastKnownFileType = text.xml; - path = "iGoom-StandAlone.plist"; - refType = 4; - sourceTree = ""; - }; - 3BCD10A60798AF8300910E20 = { - children = ( - 3BCD10A70798AF8300910E20, - ); - isa = PBXVariantGroup; - name = Localizable.strings; - path = French.lproj; - refType = 4; - sourceTree = ""; - }; - 3BCD10A70798AF8300910E20 = { - fileEncoding = 4; - isa = PBXFileReference; - lastKnownFileType = text.plist.strings; - name = French; - path = Localizable.strings; - refType = 4; - sourceTree = ""; - }; - 3BCD10A80798AF8300910E20 = { - fileRef = 3BCD10A60798AF8300910E20; - isa = PBXBuildFile; - settings = { - }; - }; - 3BCD10C30798B01500910E20 = { - children = ( - 3B73A67107986CB2001B0B2B, - 3B73A67207986CB2001B0B2B, - 3B73A60207986421001B0B2B, - 3B73A60307986421001B0B2B, - 3B336D9F06D3DE8E003DCDCB, - 3B336DA006D3DE8E003DCDCB, - ); - isa = PBXGroup; - name = AudioRecorder; - refType = 4; - sourceTree = ""; - }; - 3BCD10C40798B02D00910E20 = { - children = ( - 3B73A57E0798599C001B0B2B, - 3BA7946306D4005C0013ADCC, - 3B336D8F06D3DE8E003DCDCB, - 3B336D9106D3DE8E003DCDCB, - 3BCD10A60798AF8300910E20, - 3BCD18E9079A034800910E20, - ); - isa = PBXGroup; - name = Ressources; - refType = 4; - sourceTree = ""; - }; - 3BCD18E9079A034800910E20 = { - isa = PBXFileReference; - lastKnownFileType = image.icns; - path = icon.icns; - refType = 4; - sourceTree = ""; - }; - 3BCD18EA079A034800910E20 = { - fileRef = 3BCD18E9079A034800910E20; - isa = PBXBuildFile; - settings = { - }; - }; - 3BE13C7E06D3FAE8005DAB04 = { - isa = PBXFileReference; - lastKnownFileType = "compiled.mach-o.dylib"; - name = libgoom2.0.dylib; - path = StandAlone/libgoom2.0.dylib; - refType = 2; - sourceTree = SOURCE_ROOT; - }; - 3BE13C9006D3FD5D005DAB04 = { - buildActionMask = 2147483647; - files = ( - 3BE13CAC06D3FDB2005DAB04, - 3BE13CAD06D3FDB2005DAB04, - 3BE13CAE06D3FDB2005DAB04, - 3BE13CB006D3FDB2005DAB04, - 3BE13CB106D3FDB2005DAB04, - ); - isa = PBXResourcesBuildPhase; - runOnlyForDeploymentPostprocessing = 0; - }; - 3BE13C9106D3FD5D005DAB04 = { - buildActionMask = 2147483647; - files = ( - 3BE13CAF06D3FDB2005DAB04, - 3BE13CBE06D3FE0D005DAB04, - 3BE13D6B06D3FF60005DAB04, - ); - isa = PBXSourcesBuildPhase; - runOnlyForDeploymentPostprocessing = 0; - }; - 3BE13C9206D3FD5D005DAB04 = { - buildActionMask = 2147483647; - files = ( - 3BE13CC806D3FE26005DAB04, - 3BA6971E06D8BCE9007E5D2B, - ); - isa = PBXFrameworksBuildPhase; - runOnlyForDeploymentPostprocessing = 0; - }; - 3BE13C9306D3FD5D005DAB04 = { - buildPhases = ( - 3BE13C9006D3FD5D005DAB04, - 3BE13C9106D3FD5D005DAB04, - 3BE13C9206D3FD5D005DAB04, - ); - buildRules = ( - ); - buildSettings = { - DSTROOT = "$(USER_LIBRARY_DIR)/iTunes/iTunes Plug-ins/"; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/Carbon.framework/Headers/Carbon.h"; - GENERATE_PKGINFO_FILE = YES; - HEADER_SEARCH_PATHS = "/usr/local/include/ ../"; - INFOPLIST_FILE = "iTunes/iGoom-Info.plist"; - INSTALL_PATH = ""; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/iTunes"; - OTHER_CFLAGS = ""; - OTHER_LDFLAGS = "-framework Carbon"; - OTHER_REZFLAGS = ""; - PRODUCT_NAME = iGoom; - SECTORDER_FLAGS = ""; - WARNING_CFLAGS = "-Wmost -Wno-four-char-constants -Wno-unknown-pragmas"; - }; - dependencies = ( - ); - isa = PBXNativeTarget; - name = "iGoom - iTunes"; - productName = iGoom; - productReference = 3BE13C9406D3FD5D005DAB04; - productSettingsXML = " - - - - CFBundleDevelopmentRegion - English - CFBundleExecutable - iGoom - CFBundleIdentifier - com.yourcompany.iGoom - CFBundleInfoDictionaryVersion - 6.0 - CFBundlePackageType - APPL - CFBundleSignature - ???? - CFBundleVersion - 1.0 - CSResourcesFileMapped - yes - - -"; - productType = "com.apple.product-type.bundle"; - }; - 3BE13C9406D3FD5D005DAB04 = { - explicitFileType = wrapper.cfbundle; - includeInIndex = 0; - isa = PBXFileReference; - path = iGoom.bundle; - refType = 3; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 3BE13C9506D3FD5D005DAB04 = { - isa = PBXFileReference; - lastKnownFileType = text.xml; - path = "iGoom-Info.plist"; - refType = 4; - sourceTree = ""; - }; - 3BE13C9B06D3FDB2005DAB04 = { - children = ( - 3BE13CBD06D3FE0D005DAB04, - 3BE13D6A06D3FF60005DAB04, - 3BE13C9C06D3FDB2005DAB04, - 3BE13C9E06D3FDB2005DAB04, - 3BE13CA006D3FDB2005DAB04, - 3BE13CA506D3FDB2005DAB04, - 3BE13C9506D3FD5D005DAB04, - ); - isa = PBXGroup; - path = iTunes; - refType = 4; - sourceTree = ""; - }; - 3BE13C9C06D3FDB2005DAB04 = { - children = ( - 3BE13C9D06D3FDB2005DAB04, - 3BE13CA206D3FDB2005DAB04, - ); - isa = PBXVariantGroup; - name = About.strings; - path = ""; - refType = 4; - sourceTree = ""; - }; - 3BE13C9D06D3FDB2005DAB04 = { - fileEncoding = 4; - isa = PBXFileReference; - lastKnownFileType = text.plist.strings; - name = English; - path = English.lproj/About.strings; - refType = 4; - sourceTree = ""; - }; - 3BE13C9E06D3FDB2005DAB04 = { - children = ( - 3BE13C9F06D3FDB2005DAB04, - 3BE13CA306D3FDB2005DAB04, - ); - isa = PBXVariantGroup; - name = InfoPlist.strings; - path = ""; - refType = 4; - sourceTree = ""; - }; - 3BE13C9F06D3FDB2005DAB04 = { - fileEncoding = 4; - isa = PBXFileReference; - lastKnownFileType = text.plist.strings; - name = English; - path = English.lproj/InfoPlist.strings; - refType = 4; - sourceTree = ""; - }; - 3BE13CA006D3FDB2005DAB04 = { - children = ( - 3BE13CA106D3FDB2005DAB04, - 3BE13CA406D3FDB2005DAB04, - ); - isa = PBXVariantGroup; - name = SettingsDialog.nib; - path = ""; - refType = 4; - sourceTree = ""; - }; - 3BE13CA106D3FDB2005DAB04 = { - isa = PBXFileReference; - lastKnownFileType = wrapper.nib; - name = English; - path = English.lproj/SettingsDialog.nib; - refType = 4; - sourceTree = ""; - }; - 3BE13CA206D3FDB2005DAB04 = { - fileEncoding = 4; - isa = PBXFileReference; - lastKnownFileType = text.plist.strings; - name = French; - path = French.lproj/About.strings; - refType = 4; - sourceTree = ""; - }; - 3BE13CA306D3FDB2005DAB04 = { - fileEncoding = 4; - isa = PBXFileReference; - lastKnownFileType = text.plist.strings; - name = French; - path = French.lproj/InfoPlist.strings; - refType = 4; - sourceTree = ""; - }; - 3BE13CA406D3FDB2005DAB04 = { - isa = PBXFileReference; - lastKnownFileType = wrapper.nib; - name = French; - path = French.lproj/SettingsDialog.nib; - refType = 4; - sourceTree = ""; - }; - 3BE13CA506D3FDB2005DAB04 = { - children = ( - 3BE13CA606D3FDB2005DAB04, - 3BE13CA706D3FDB2005DAB04, - 3BE13CA806D3FDB2005DAB04, - ); - isa = PBXGroup; - path = iTuneVisualAPI; - refType = 4; - sourceTree = ""; - }; - 3BE13CA606D3FDB2005DAB04 = { - fileEncoding = 4; - isa = PBXFileReference; - lastKnownFileType = sourcecode.c.c; - path = iTunesAPI.c; - refType = 4; - sourceTree = ""; - }; - 3BE13CA706D3FDB2005DAB04 = { - fileEncoding = 4; - isa = PBXFileReference; - lastKnownFileType = sourcecode.c.h; - path = iTunesAPI.h; - refType = 4; - sourceTree = ""; - }; - 3BE13CA806D3FDB2005DAB04 = { - fileEncoding = 4; - isa = PBXFileReference; - lastKnownFileType = sourcecode.c.h; - path = iTunesVisualAPI.h; - refType = 4; - sourceTree = ""; - }; - 3BE13CAB06D3FDB2005DAB04 = { - isa = PBXFileReference; - lastKnownFileType = text.rtf; - path = ReadMe.rtf; - refType = 4; - sourceTree = ""; - }; - 3BE13CAC06D3FDB2005DAB04 = { - fileRef = 3BE13C9C06D3FDB2005DAB04; - isa = PBXBuildFile; - settings = { - }; - }; - 3BE13CAD06D3FDB2005DAB04 = { - fileRef = 3BE13C9E06D3FDB2005DAB04; - isa = PBXBuildFile; - settings = { - }; - }; - 3BE13CAE06D3FDB2005DAB04 = { - fileRef = 3BE13CA006D3FDB2005DAB04; - isa = PBXBuildFile; - settings = { - }; - }; - 3BE13CAF06D3FDB2005DAB04 = { - fileRef = 3BE13CA606D3FDB2005DAB04; - isa = PBXBuildFile; - settings = { - }; - }; - 3BE13CB006D3FDB2005DAB04 = { - fileRef = 3BE13CA706D3FDB2005DAB04; - isa = PBXBuildFile; - settings = { - }; - }; - 3BE13CB106D3FDB2005DAB04 = { - fileRef = 3BE13CA806D3FDB2005DAB04; - isa = PBXBuildFile; - settings = { - }; - }; - 3BE13CBD06D3FE0D005DAB04 = { - fileEncoding = 4; - isa = PBXFileReference; - lastKnownFileType = sourcecode.c.c; - path = iGoom.c; - refType = 4; - sourceTree = ""; - }; - 3BE13CBE06D3FE0D005DAB04 = { - fileRef = 3BE13CBD06D3FE0D005DAB04; - isa = PBXBuildFile; - settings = { - }; - }; - 3BE13CC706D3FE26005DAB04 = { - isa = PBXFileReference; - lastKnownFileType = wrapper.framework; - name = Carbon.framework; - path = /System/Library/Frameworks/Carbon.framework; - refType = 0; - sourceTree = ""; - }; - 3BE13CC806D3FE26005DAB04 = { - fileRef = 3BE13CC706D3FE26005DAB04; - isa = PBXBuildFile; - settings = { - }; - }; - 3BE13D6A06D3FF60005DAB04 = { - fileEncoding = 4; - isa = PBXFileReference; - lastKnownFileType = sourcecode.asm; - path = ppc_doubling.s; - refType = 4; - sourceTree = ""; - }; - 3BE13D6B06D3FF60005DAB04 = { - fileRef = 3BE13D6A06D3FF60005DAB04; - isa = PBXBuildFile; - settings = { - }; - }; -//3B0 -//3B1 -//3B2 -//3B3 -//3B4 -//4A0 -//4A1 -//4A2 -//4A3 -//4A4 - 4A9504CCFFE6A4B311CA0CBA = { - buildSettings = { - COPY_PHASE_STRIP = NO; - GCC_DYNAMIC_NO_PIC = NO; - GCC_ENABLE_FIX_AND_CONTINUE = YES; - GCC_GENERATE_DEBUGGING_SYMBOLS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - ZERO_LINK = YES; - }; - isa = PBXBuildStyle; - name = Development; - }; - 4A9504CDFFE6A4B311CA0CBA = { - buildSettings = { - COPY_PHASE_STRIP = YES; - GCC_ENABLE_FIX_AND_CONTINUE = NO; - ZERO_LINK = NO; - }; - isa = PBXBuildStyle; - name = Deployment; - }; -//4A0 -//4A1 -//4A2 -//4A3 -//4A4 -//8D0 -//8D1 -//8D2 -//8D3 -//8D4 - 8D1107260486CEB800E47090 = { - buildPhases = ( - 8D1107290486CEB800E47090, - 8D11072C0486CEB800E47090, - 8D11072E0486CEB800E47090, - 3B336E1206D3F5D2003DCDCB, - ); - buildRules = ( - ); - buildSettings = { - GCC_DYNAMIC_NO_PIC = YES; - GCC_GENERATE_DEBUGGING_SYMBOLS = NO; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = Standalone/iGoom_Prefix.pch; - HEADER_SEARCH_PATHS = "/usr/local/include/ ../"; - INFOPLIST_FILE = "StandAlone/iGoom-StandAlone.plist"; - INSTALL_PATH = "$(HOME)/Applications"; - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/StandAlone"; - LIBRARY_STYLE = STATIC; - OTHER_LDFLAGS = ""; - PRODUCT_NAME = iGoom; - WRAPPER_EXTENSION = app; - }; - dependencies = ( - ); - isa = PBXNativeTarget; - name = "iGoom - StandAlone"; - productInstallPath = "$(HOME)/Applications"; - productName = iGoom; - productReference = 8D1107320486CEB800E47090; - productType = "com.apple.product-type.application"; - }; - 8D1107290486CEB800E47090 = { - buildActionMask = 2147483647; - files = ( - 3B336DA106D3DE8E003DCDCB, - 3B336DA506D3DE8E003DCDCB, - 3B336DA606D3DE8E003DCDCB, - 3B336DA706D3DE8E003DCDCB, - 3B336DA906D3DE8E003DCDCB, - 3B336DAB06D3DE8E003DCDCB, - 3B336DAF06D3DE8E003DCDCB, - 3B336DB106D3DE8E003DCDCB, - 3B336DB306D3DE8E003DCDCB, - 3B73A57F0798599C001B0B2B, - 3B73A60407986421001B0B2B, - 3B73A67307986CB2001B0B2B, - 3BCD10A80798AF8300910E20, - 3BCD18EA079A034800910E20, - 3BA4F62007A1C93D00722D4D, - ); - isa = PBXResourcesBuildPhase; - runOnlyForDeploymentPostprocessing = 0; - }; - 8D11072C0486CEB800E47090 = { - buildActionMask = 2147483647; - files = ( - 3B336DA206D3DE8E003DCDCB, - 3B336DA806D3DE8E003DCDCB, - 3B336DAA06D3DE8E003DCDCB, - 3B336DAC06D3DE8E003DCDCB, - 3B336DAE06D3DE8E003DCDCB, - 3B336DB006D3DE8E003DCDCB, - 3B336DB206D3DE8E003DCDCB, - 3B336DB406D3DE8E003DCDCB, - 3B73A60507986421001B0B2B, - 3B73A67407986CB2001B0B2B, - ); - isa = PBXSourcesBuildPhase; - runOnlyForDeploymentPostprocessing = 0; - }; - 8D11072E0486CEB800E47090 = { - buildActionMask = 2147483647; - files = ( - 8D11072F0486CEB800E47090, - 3B336C0A06D1537B003DCDCB, - 3B336CD706D159F9003DCDCB, - 3BA696BE06D7FA9A007E5D2B, - ); - isa = PBXFrameworksBuildPhase; - runOnlyForDeploymentPostprocessing = 0; - }; - 8D11072F0486CEB800E47090 = { - fileRef = 1058C7A1FEA54F0111CA2CBB; - isa = PBXBuildFile; - settings = { - }; - }; - 8D1107320486CEB800E47090 = { - explicitFileType = wrapper.application; - includeInIndex = 0; - isa = PBXFileReference; - path = iGoom.app; - refType = 3; - sourceTree = BUILT_PRODUCTS_DIR; - }; - }; - rootObject = 29B97313FDCFA39411CA2CEA; -} diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/iTunes/English.lproj/About.strings kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/iTunes/English.lproj/About.strings --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/iTunes/English.lproj/About.strings 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/iTunes/English.lproj/About.strings 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ -/* Localized versions of about strings */ - -"AboutString" = "Made by Jeko, Gyom and Fred\n \nKeys :\nQ to switch Quality (Pixel Doubling)\nF to toggle frame rate display\nT to disable this display\n< and > to change sensitivity\n \nContact : Gyom (gyom@ios-software.com)"; diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/iTunes/English.lproj/InfoPlist.strings kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/iTunes/English.lproj/InfoPlist.strings --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/iTunes/English.lproj/InfoPlist.strings 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/iTunes/English.lproj/InfoPlist.strings 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ -/* Localized versions of Info.plist keys */ - -CFBundleName = "iGoom"; -CFBundleShortVersionString = "2.0"; -CFBundleGetInfoString = "iGoom version 2.0, Copyright 2001/2003, iOS."; -NSHumanReadableCopyright = "Copyright 2001/2003, iOS."; -CFBundleVersion = "2.0"; \ No newline at end of file diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/iTunes/English.lproj/SettingsDialog.nib/classes.nib kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/iTunes/English.lproj/SettingsDialog.nib/classes.nib --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/iTunes/English.lproj/SettingsDialog.nib/classes.nib 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/iTunes/English.lproj/SettingsDialog.nib/classes.nib 1970-01-01 00:00:00.000000000 +0000 @@ -1,4 +0,0 @@ -{ -IBClasses = (); -IBVersion = 1; -} diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/iTunes/English.lproj/SettingsDialog.nib/info.nib kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/iTunes/English.lproj/SettingsDialog.nib/info.nib --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/iTunes/English.lproj/SettingsDialog.nib/info.nib 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/iTunes/English.lproj/SettingsDialog.nib/info.nib 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ - - - - - IBDocumentLocation - 123 115 356 240 0 0 1280 1002 - IBFramework Version - 364.0 - IBOpenObjects - - 166 - - IBSystem Version - 7M34 - targetFramework - IBCarbonFramework - - diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/iTunes/English.lproj/SettingsDialog.nib/objects.xib kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/iTunes/English.lproj/SettingsDialog.nib/objects.xib --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/iTunes/English.lproj/SettingsDialog.nib/objects.xib 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/iTunes/English.lproj/SettingsDialog.nib/objects.xib 1970-01-01 00:00:00.000000000 +0000 @@ -1,138 +0,0 @@ - - - IBCarbonFramework - - NSApplication - - - - 226 360 483 751 - Settings - - 0 0 257 391 - 0 0 391 257 - - - 20 20 143 170 - 20 20 150 123 - FALSE - - - 20 194 38 351 - 194 20 157 18 - cbox - 2 - Pixel doubling (Q) - - - 217 163 237 233 - 163 217 70 20 - 1 - OK - ok - 1 - - - 72 20 86 170 - 20 72 150 14 - iGoom 2k4 - 1 - - - 189 30 205 361 - 30 189 331 16 - http://www.ios-software.com/ - 1 - - - 46 194 60 351 - 194 46 157 14 - cbox - 3 - Show frame rate (F) - - - 165 30 181 361 - 30 165 331 16 - Support and bug report : gyom@ios-software.com - 1 - - - 119 193 145 371 - 193 119 178 26 - slid - 4 - TRUE - 11 - 160 - 70 - 250 - - - 99 194 115 371 - 194 99 177 16 - Sensitivity (< and >) : - - - 68 194 82 371 - 194 68 177 14 - cbox - 5 - Show infos when idle (T) - - - - FALSE - FALSE - FALSE - FALSE - FALSE - FALSE - TRUE - 4 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - File's Owner - - IBCarbonButton - - IBCarbonCheckBox - - IBCarbonStaticText - - IBCarbonStaticText21 - - IBCarbonStaticText211 - - PluginSettings - - - 210 - diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/iTunes/French.lproj/About.strings kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/iTunes/French.lproj/About.strings --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/iTunes/French.lproj/About.strings 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/iTunes/French.lproj/About.strings 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ -/* Localized versions of about strings */ - -"AboutString" = "Ecrit par Jeko, Gyom et Fred\n \nTouches :\nQ pour changer de qualite\nF pour voir la frequence d'affichage\nT pour desactiver cet affichage\n< et > pour modifier la sensibilite\n \nContact : Gyom (gyom@ios-software.com)"; diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/iTunes/French.lproj/InfoPlist.strings kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/iTunes/French.lproj/InfoPlist.strings --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/iTunes/French.lproj/InfoPlist.strings 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/iTunes/French.lproj/InfoPlist.strings 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ -/* Localized versions of Info.plist keys */ - -CFBundleName = "iGoom"; -CFBundleShortVersionString = "2.0"; -CFBundleGetInfoString = "iGoom version 2.0, Copyright 2001/2003, iOS."; -NSHumanReadableCopyright = "Copyright 2001/2003, iOS."; -CFBundleVersion = "2.0"; \ No newline at end of file diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/iTunes/French.lproj/SettingsDialog.nib/classes.nib kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/iTunes/French.lproj/SettingsDialog.nib/classes.nib --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/iTunes/French.lproj/SettingsDialog.nib/classes.nib 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/iTunes/French.lproj/SettingsDialog.nib/classes.nib 1970-01-01 00:00:00.000000000 +0000 @@ -1,4 +0,0 @@ -{ -IBClasses = (); -IBVersion = 1; -} diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/iTunes/French.lproj/SettingsDialog.nib/info.nib kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/iTunes/French.lproj/SettingsDialog.nib/info.nib --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/iTunes/French.lproj/SettingsDialog.nib/info.nib 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/iTunes/French.lproj/SettingsDialog.nib/info.nib 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ - - - - - IBDocumentLocation - 123 115 356 240 0 0 1280 1002 - IBFramework Version - 364.0 - IBOpenObjects - - 166 - - IBSystem Version - 7M34 - targetFramework - IBCarbonFramework - - diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/iTunes/French.lproj/SettingsDialog.nib/objects.xib kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/iTunes/French.lproj/SettingsDialog.nib/objects.xib --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/iTunes/French.lproj/SettingsDialog.nib/objects.xib 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/iTunes/French.lproj/SettingsDialog.nib/objects.xib 1970-01-01 00:00:00.000000000 +0000 @@ -1,138 +0,0 @@ - - - IBCarbonFramework - - NSApplication - - - - 61 758 318 1149 - Réglages - - 0 0 257 391 - 0 0 391 257 - - - 20 20 143 170 - 20 20 150 123 - FALSE - - - 20 194 38 371 - 194 20 177 18 - cbox - 2 - Pixels doublés (Q) - - - 217 163 237 233 - 163 217 70 20 - 1 - OK - ok - 1 - - - 72 20 86 170 - 20 72 150 14 - iGoom 2k4 - 1 - - - 189 30 205 361 - 30 189 331 16 - http://www.ios-software.com/ - 1 - - - 46 194 60 371 - 194 46 177 14 - cbox - 3 - Fréquence d'affichage (F) - - - 165 20 181 371 - 20 165 351 16 - Support et retours de bugs : gyom@ios-software.com - 1 - - - 119 193 145 371 - 193 119 178 26 - slid - 4 - TRUE - 11 - 160 - 70 - 250 - - - 99 194 115 371 - 194 99 177 16 - Sensibilité (< et >) : - - - 68 194 82 371 - 194 68 177 14 - cbox - 5 - Afficher les infos (T) - - - - FALSE - FALSE - FALSE - FALSE - FALSE - FALSE - TRUE - 4 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - File's Owner - - IBCarbonButton - - IBCarbonCheckBox - - IBCarbonStaticText - - IBCarbonStaticText21 - - IBCarbonStaticText211 - - PluginSettings - - - 210 - diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/iTunes/iGoom.c kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/iTunes/iGoom.c --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/iTunes/iGoom.c 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/iTunes/iGoom.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,896 +0,0 @@ -// includes -#include -#include "iTunesVisualAPI.h" -#include "iTunesAPI.h" -#include "src/goom.h" -#include -#include - -//***************************************************** -#include -#include -//***************************************************** - -CFStringRef CFBundleIdentifier; - -extern void ppc_doubling(unsigned int,UInt32 *,UInt32 *,UInt32 *,UInt32,UInt32); - -// typedef's, struct's, enum's, etc. -#define kTVisualPluginName "\piGoom" -#define kTVisualPluginCreator 'gyom' -#define kTVisualPluginMajorVersion 2 -#define kTVisualPluginMinorVersion 4 -#define kTVisualPluginReleaseStage betaStage -#define kTVisualPluginNonFinalRelease 1 - -#define VERSION "2k4" - -#define kPixelDoublingPrefName "PixelDoubling" -#define kShowFPSPrefName "ShowFPS" -#define kSensitivityPrefName "Sensitivity" -#define kShowAboutWhenIdlePrefName "ShowAboutWhenIdle" - -//#define Timers - -enum -{ - kOKSettingID = 1, - kPixelDoublingSettingID = 2, - kFrameRateSettingID = 3, - kSensitivitySettingID = 4, - kShowAboutWhenIdleSettingID = 5 -}; - -typedef struct VisualPluginData { - void * appCookie; - ITAppProcPtr appProc; - ITFileSpec pluginFileSpec; - - CGrafPtr destPort; - Rect destRect; - OptionBits destOptions; - UInt32 destBitDepth; - - ITTrackInfo trackInfo; - ITStreamInfo streamInfo; - - Boolean playing; - - // Plugin-specific data - GWorldPtr offscreen; - signed short data[2][512]; -} VisualPluginData; - - -// local (static) globals -//static unsigned int useSpectrum = 0; -static CGrafPtr gSavePort; -static GDHandle gSaveDevice; -static unsigned int changeRes = FALSE; -static unsigned int oldx = 0, oldy = 0; -static signed int forced = 0; -static unsigned int showFPS = 0; -static int showTexte = 0, showTitle = 1; -static Boolean doublePixels = true; -static int sensitivity = 160; -static int ShowAboutWhenIdle = 0; -static AbsoluteTime backUpTime; -static char * aboutMessage; - -static PluginInfo * goomInfo; - - -// exported function prototypes -extern OSStatus iTunesPluginMainMachO(OSType message,PluginMessageInfo *messageInfo,void *refCon); - -// Calcul de diff de temps -#ifdef Timers -static void HowLong(const char* text) -{ - AbsoluteTime absTime; - Nanoseconds nanosec; - - absTime = SubAbsoluteFromAbsolute(UpTime(), backUpTime); - nanosec = AbsoluteToNanoseconds(absTime); - fprintf(stderr,"Time for %s: %f\n", text, (float) UnsignedWideToUInt64( nanosec ) / 1000000.0); - backUpTime = UpTime(); -} -#else -#define HowLong(a) -#endif - -// ProcessRenderData --> preprocessing des donnees en entre -static void ProcessRenderData(VisualPluginData *visualPluginData,const RenderVisualData *renderData) -{ - SInt16 index; - SInt32 channel; - - if (renderData == nil) - { - bzero(&visualPluginData->data,sizeof(visualPluginData->data)); - return; - } - else - { - for (channel = 0;channel < 2;channel++) - { - for (index = 0; index < 512; index++) - visualPluginData->data[channel][index] = (renderData->waveformData[channel][index]-127)*sensitivity; - } - } -} - -// GetPortCopyBitsBitMap -// -static BitMap* GetPortCopyBitsBitMap(CGrafPtr port) -{ - BitMap* destBMap; - -#if ACCESSOR_CALLS_ARE_FUNCTIONS - destBMap = (BitMap*)GetPortBitMapForCopyBits(port); -#else -#if OPAQUE_TOOLBOX_STRUCTS - PixMapHandle pixMap; - - pixMap = GetPortPixMap(port); - destBMap = (BitMap*) (*pixMap); -#else - destBMap = (BitMap*) &((GrafPtr)port)->portBits; -#endif -#endif - return destBMap; -} - -// RenderVisualPort -/* OK, This is pretty weird : if we are not in pixel doubling mode, -the goom internal buffer is copied on destPort via CopyBits(). -Now, if we are in pixel doubling mode : if we are full screen, -the goom internal buffer is copied on another buffer with ppc_doubling() -and then to destPort with CopyBits().*/ - -char * Str255ToC(Str255 source) -{ - static char dst[255]; - char * cur = dst, * src = (char*)source; - int i; - int size = *src; - if (source == NULL) return ""; - src++; - for (i=0; ioffscreen); - Point pt = {0,0}; - static float fpssampler = 0; - static char textBuffer[15]; - static char titleBuffer[255]; - unsigned char * str, * str2; - - AbsoluteTime absTime; - Nanoseconds nanosec; - - LocalToGlobal(&pt); - fullscreen = (pt.v == 0); - - if ((NULL == destPort) || (NULL == destRect) || (NULL == visualPluginData->offscreen)) return; - - absTime = SubAbsoluteFromAbsolute(UpTime(), backUpTime); - nanosec = AbsoluteToNanoseconds(absTime); - fpssampler = 1000000000.0 / (float) UnsignedWideToUInt64( nanosec ); - if (fpssampler>35) return; - backUpTime = UpTime(); - - - GetGWorld(&gSavePort,&gSaveDevice); - SetGWorld(destPort,nil); - - srcBitMap = GetPortCopyBitsBitMap(visualPluginData->offscreen); - dstBitMap = GetPortCopyBitsBitMap(destPort); - - OffsetRect(&srcRect,-srcRect.left,-srcRect.top); - if (!pixMapHdl || !*pixMapHdl) return; - - right = srcRect.right; - bottom = srcRect.bottom; - if ((right<2) || (bottom<2)) return; - - // Update our offscreen pixmap - if ((changeRes) || (oldx != right) || (oldy != bottom)) - { - if (doublePixels) - goom_set_resolution (goomInfo,right%2 + right/2, bottom/2 + bottom%2); - else - goom_set_resolution (goomInfo,right, bottom); - oldx = right; - oldy = bottom; - changeRes = FALSE; - } - - str2 = NULL; - if (showTitle == 0) - { - strcpy(titleBuffer, Str255ToC(visualPluginData->trackInfo.name)); - str2 = titleBuffer; - str = " "; - showTexte = 10000; - } - else - { - if (ShowAboutWhenIdle) - { - switch (showTexte) - { - case 0: - str2 = " "; - sprintf(textBuffer,"The iGoom %s",VERSION); - str = textBuffer; - break; - case 500: - str = "http://www.ios-software.com/"; - break; - case 1000 : - str = aboutMessage; - break; - default : - str = NULL; - break; - } - } - else - { - str = " "; - } - } - - if (doublePixels) - { - UInt32 rowBytes = (GetPixRowBytes(pixMapHdl))>>2; - register UInt32 *myX = (UInt32*) GetPixBaseAddr(pixMapHdl); - register UInt32 inc = 2*rowBytes - right - right%2; - register UInt32 *myx = (UInt32*) goom_update (goomInfo,visualPluginData->data,forced,(showFPS > 0)?fpssampler:-1,str2,str); - - ppc_doubling(right/2 + right%2, myx, myX, myX + rowBytes, bottom/2,inc*4); - srcBitMap = GetPortCopyBitsBitMap(visualPluginData->offscreen); - CopyBits(srcBitMap,dstBitMap,&srcRect,&dstRect,srcCopy,nil); - } - else - { - NewGWorldFromPtr(&offscreen, k32ARGBPixelFormat,&srcRect, NULL, NULL, 0, (Ptr) goom_update (goomInfo,visualPluginData->data,forced, (showFPS > 0)?fpssampler:-1, str2, str), right*4); - HowLong("Goom"); - srcBitMap = GetPortCopyBitsBitMap(offscreen); - CopyBits(srcBitMap,dstBitMap,&srcRect,&dstRect,srcCopy,nil); - DisposeGWorld(offscreen); - } - showTexte++; - if (showTexte>10000) showTexte = 10000; - showTitle = 1; - if (forced>0) forced = -1; - - SetGWorld(gSavePort,gSaveDevice); -} - - -/* AllocateVisualData is where you should allocate any information that depends -on the port or rect changing (like offscreen GWorlds). */ -static OSStatus AllocateVisualData(VisualPluginData *visualPluginData,CGrafPtr destPort,const Rect *destRect) -{ - OSStatus status; - Rect allocateRect; - - (void) destPort; - - GetGWorld(&gSavePort,&gSaveDevice); - - allocateRect = *destRect; - OffsetRect(&allocateRect,-allocateRect.left,-allocateRect.top); - - status = NewGWorld(&visualPluginData->offscreen,32,&allocateRect,nil,nil,useTempMem); - if (status == noErr) - { - PixMapHandle pix = GetGWorldPixMap(visualPluginData->offscreen); - LockPixels(pix); - - // Offscreen starts out black - SetGWorld(visualPluginData->offscreen,nil); - ForeColor(blackColor); - PaintRect(&allocateRect); - } - SetGWorld(gSavePort,gSaveDevice); - - return status; -} - -// DeallocateVisualData is where you should deallocate the . -static void DeallocateVisualData(VisualPluginData *visualPluginData) -{ - CFPreferencesAppSynchronize(CFBundleIdentifier); - - if (visualPluginData->offscreen != nil) - { - DisposeGWorld(visualPluginData->offscreen); - visualPluginData->offscreen = nil; - } -} - -// ChangeVisualPort -static OSStatus ChangeVisualPort(VisualPluginData *visualPluginData,CGrafPtr destPort,const Rect *destRect) -{ - OSStatus status; - Boolean doAllocate; - Boolean doDeallocate; - - status = noErr; - - doAllocate = false; - doDeallocate = false; - - if (destPort != nil) - { - if (visualPluginData->destPort != nil) - { - if (false == EqualRect(destRect,&visualPluginData->destRect)) - { - doDeallocate = true; - doAllocate = true; - } - } - else - { - doAllocate = true; - } - } - else - { - doDeallocate = true; - } - - if (doDeallocate) - DeallocateVisualData(visualPluginData); - - if (doAllocate) - status = AllocateVisualData(visualPluginData,destPort,destRect); - - if (status != noErr) - destPort = nil; - - visualPluginData->destPort = destPort; - if (destRect != nil) - visualPluginData->destRect = *destRect; - - return status; -} - -// ResetRenderData -static void ResetRenderData(VisualPluginData *visualPluginData) -{ - bzero(&visualPluginData->data,sizeof(visualPluginData->data)); -} - -// settingsControlHandler -pascal OSStatus settingsControlHandler(EventHandlerCallRef inRef,EventRef inEvent, void* userData) -{ - WindowRef wind=NULL; - ControlID controlID; - ControlRef control=NULL; - //get control hit by event - GetEventParameter(inEvent,kEventParamDirectObject,typeControlRef,NULL,sizeof(ControlRef),NULL,&control); - wind=GetControlOwner(control); - GetControlID(control,&controlID); - switch(controlID.id){ - - case kShowAboutWhenIdleSettingID: - ShowAboutWhenIdle = GetControlValue(control); - CFPreferencesSetAppValue (CFSTR(kShowAboutWhenIdlePrefName),ShowAboutWhenIdle?CFSTR("YES"):CFSTR("NO"),CFBundleIdentifier); - break; - - case kPixelDoublingSettingID: - doublePixels = GetControlValue(control); - CFPreferencesSetAppValue (CFSTR(kPixelDoublingPrefName),doublePixels?CFSTR("YES"):CFSTR("NO"),CFBundleIdentifier); - changeRes = TRUE; - break; - - case kFrameRateSettingID: - showFPS = GetControlValue( control ); - CFPreferencesSetAppValue (CFSTR(kShowFPSPrefName),showFPS?CFSTR("YES"):CFSTR("NO"),CFBundleIdentifier); - break; - - case kSensitivitySettingID: - sensitivity = GetControlValue( control ); - { - CFNumberRef value = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &sensitivity); - CFPreferencesSetAppValue (CFSTR(kSensitivityPrefName), value, CFBundleIdentifier); - CFRelease(value); - } - break; - - case kOKSettingID: - HideWindow(wind); - break; - } - return noErr; -} - -// VisualPluginHandler -static OSStatus VisualPluginHandler(OSType message,VisualPluginMessageInfo *messageInfo,void *refCon) -{ - OSStatus status; - VisualPluginData * visualPluginData; - - visualPluginData = (VisualPluginData*) refCon; - - status = noErr; - - switch (message) - { - // Sent when the visual plugin is registered. The plugin should do minimal - // memory allocations here. The resource fork of the plugin is still available. - case kVisualPluginInitMessage: - { - visualPluginData = (VisualPluginData*) NewPtrClear(sizeof(VisualPluginData)); - if (visualPluginData == nil) - { - status = memFullErr; - break; - } - visualPluginData->appCookie = messageInfo->u.initMessage.appCookie; - visualPluginData->appProc = messageInfo->u.initMessage.appProc; - // Remember the file spec of our plugin file. - // We need this so we can open our resource fork during - // the configuration message - - status = PlayerGetPluginFileSpec(visualPluginData->appCookie, visualPluginData->appProc, &visualPluginData->pluginFileSpec); - messageInfo->u.initMessage.refCon = (void*) visualPluginData; - goomInfo = goom_init(100,100); - - //fprintf(stderr,"Loc : %s\n", CFStringGetCStringPtr(CFCopyLocalizedStringFromTableInBundle(CFSTR("AboutString"), CFSTR("About"), CFBundleGetBundleWithIdentifier(CFBundleIdentifier), NULL),kCFStringEncodingMacRoman)); - - aboutMessage = (char*)CFStringGetCStringPtr(CFCopyLocalizedStringFromTableInBundle(CFSTR("AboutString"), CFSTR("About"), CFBundleGetBundleWithIdentifier(CFBundleIdentifier), NULL),kCFStringEncodingMacRoman); - - break; - } - - // Sent when the visual plugin is unloaded - case kVisualPluginCleanupMessage: - if (visualPluginData != nil) - DisposePtr((Ptr)visualPluginData); - - goom_close(goomInfo); - break; - - // Sent when the visual plugin is enabled. iTunes currently enables all - // loaded visual plugins. The plugin should not do anything here. - case kVisualPluginEnableMessage: - if (true == visualPluginData->playing) - { - showTexte = 10000; - showTitle = 0; - } - else - { - showTexte = 0; - showTitle = 1; - } - case kVisualPluginDisableMessage: - break; - - // Sent if the plugin requests idle messages. Do this by setting the kVisualWantsIdleMessages - // option in the RegisterVisualMessage.options field. - case kVisualPluginIdleMessage: - RenderVisualPort(visualPluginData,visualPluginData->destPort,&visualPluginData->destRect,false); - break; - - // Sent if the plugin requests the ability for the user to configure it. Do this by setting - // the kVisualWantsConfigure option in the RegisterVisualMessage.options field. - case kVisualPluginConfigureMessage: - { - - // kOKSettingID = 1, - //kPixelDoublingSettingID = 2, - //kFrameRateSettingID = 3, - //kSensitivitySettingID = 4 - - static EventTypeSpec controlEvent={kEventClassControl,kEventControlHit}; - static const ControlID kPixelDoublingSettingControlID={'cbox',kPixelDoublingSettingID}; - static const ControlID kFrameRateSettingControlID={'cbox',kFrameRateSettingID}; - static const ControlID kSensitivitySettingControlID={'slid',kSensitivitySettingID}; - static const ControlID kShowAboutWhenIdleSettingControlID={'cbox',kShowAboutWhenIdleSettingID}; - static WindowRef settingsDialog=NULL; - static ControlRef PixelDoublingCTRL=NULL; - static ControlRef FrameRateCTRL=NULL; - static ControlRef SensitivityCTRL=NULL; - static ControlRef ShowAboutWhenIdleCTRL=NULL; - - if(settingsDialog==NULL){ - IBNibRef nibRef; - CFBundleRef iGoomPlugin; - //we have to find our bundle to load the nib inside of it - iGoomPlugin=CFBundleGetBundleWithIdentifier(CFBundleIdentifier); - CreateNibReferenceWithCFBundle(iGoomPlugin,CFSTR("SettingsDialog"), &nibRef); - CreateWindowFromNib(nibRef, CFSTR("PluginSettings"), &settingsDialog); - DisposeNibReference(nibRef); - - - //fprintf (stderr,"Picture @ %d\n", (PicHandle)GetPicture (12866)); - - InstallWindowEventHandler(settingsDialog,NewEventHandlerUPP(settingsControlHandler), - 1,&controlEvent,0,NULL); - GetControlByID(settingsDialog,&kPixelDoublingSettingControlID,&PixelDoublingCTRL); - GetControlByID(settingsDialog,&kFrameRateSettingControlID,&FrameRateCTRL); - GetControlByID(settingsDialog,&kSensitivitySettingControlID,&SensitivityCTRL); - GetControlByID(settingsDialog,&kShowAboutWhenIdleSettingControlID,&ShowAboutWhenIdleCTRL); - } - SetControlValue(PixelDoublingCTRL,doublePixels); - SetControlValue(FrameRateCTRL,showFPS); - SetControlValue(SensitivityCTRL,sensitivity); - SetControlValue(ShowAboutWhenIdleCTRL,ShowAboutWhenIdle); - - ShowWindow(settingsDialog); - } - break; - - // Sent when iTunes is going to show the visual plugin in a port. At - // this point,the plugin should allocate any large buffers it needs. - case kVisualPluginShowWindowMessage: - if (true == visualPluginData->playing) - { - showTexte = 10000; - showTitle = 0; - } - else - { - showTexte = 0; - showTitle = 1; - } - visualPluginData->destOptions = messageInfo->u.showWindowMessage.options; - status = ChangeVisualPort( visualPluginData, messageInfo->u.showWindowMessage.port, - &messageInfo->u.showWindowMessage.drawRect); - //FIXME setres here - break; - // Sent when iTunes is no longer displayed. - case kVisualPluginHideWindowMessage: - - (void) ChangeVisualPort(visualPluginData,nil,nil); - - bzero(&visualPluginData->trackInfo,sizeof(visualPluginData->trackInfo)); - bzero(&visualPluginData->streamInfo,sizeof(visualPluginData->streamInfo)); - break; - - // Sent when iTunes needs to change the port or rectangle of the currently - // displayed visual. - case kVisualPluginSetWindowMessage: - visualPluginData->destOptions = messageInfo->u.setWindowMessage.options; - - status = ChangeVisualPort( visualPluginData, - messageInfo->u.setWindowMessage.port, - &messageInfo->u.setWindowMessage.drawRect); - break; - - // Sent for the visual plugin to render a frame. - case kVisualPluginRenderMessage: - ProcessRenderData(visualPluginData,messageInfo->u.renderMessage.renderData); - RenderVisualPort(visualPluginData,visualPluginData->destPort,&visualPluginData->destRect,false); - break; - - // Sent in response to an update event. The visual plugin should update - // into its remembered port. This will only be sent if the plugin has been - // previously given a ShowWindow message. - case kVisualPluginUpdateMessage: - RenderVisualPort(visualPluginData,visualPluginData->destPort,&visualPluginData->destRect,true); - break; - - // Sent when the player starts. - case kVisualPluginPlayMessage: - if (messageInfo->u.playMessage.trackInfo != nil) - visualPluginData->trackInfo = *messageInfo->u.playMessage.trackInfo; - else - bzero(&visualPluginData->trackInfo,sizeof(visualPluginData->trackInfo)); - - if (messageInfo->u.playMessage.streamInfo != nil) - visualPluginData->streamInfo = *messageInfo->u.playMessage.streamInfo; - else - bzero(&visualPluginData->streamInfo,sizeof(visualPluginData->streamInfo)); - - visualPluginData->playing = true; - showTexte = 10000; - showTitle = 0; - break; - - // Sent when the player changes the current track information. This - // is used when the information about a track changes,or when the CD - // moves onto the next track. The visual plugin should update any displayed - // information about the currently playing song. - case kVisualPluginChangeTrackMessage: - if (messageInfo->u.changeTrackMessage.trackInfo != nil) - visualPluginData->trackInfo = *messageInfo->u.changeTrackMessage.trackInfo; - else - bzero(&visualPluginData->trackInfo,sizeof(visualPluginData->trackInfo)); - - if (messageInfo->u.changeTrackMessage.streamInfo != nil) - visualPluginData->streamInfo = *messageInfo->u.changeTrackMessage.streamInfo; - else - bzero(&visualPluginData->streamInfo,sizeof(visualPluginData->streamInfo)); - showTexte = 10000; - showTitle = 0; - break; - - // Sent when the player stops. - case kVisualPluginStopMessage: - visualPluginData->playing = false; - ResetRenderData(visualPluginData); - //RenderVisualPort(visualPluginData,visualPluginData->destPort,&visualPluginData->destRect,true); - showTexte = 0; - showTitle = 1; - break; - - // Sent when the player changes position. - case kVisualPluginSetPositionMessage: - break; - - // Sent when the player pauses. iTunes does not currently use pause or unpause. - // A pause in iTunes is handled by stopping and remembering the position. - case kVisualPluginPauseMessage: - visualPluginData->playing = false; - ResetRenderData(visualPluginData); - //RenderVisualPort(visualPluginData,visualPluginData->destPort,&visualPluginData->destRect,true); - break; - - // Sent when the player unpauses. iTunes does not currently use pause or unpause. - // A pause in iTunes is handled by stopping and remembering the position. - case kVisualPluginUnpauseMessage: - visualPluginData->playing = true; - break; - - // Sent to the plugin in response to a MacOS event. The plugin should return noErr - // for any event it handles completely,or an error (unimpErr) if iTunes should handle it. - case kVisualPluginEventMessage: - { - EventRecord* tEventPtr = messageInfo->u.eventMessage.event; - if ((tEventPtr->what == keyDown) || (tEventPtr->what == autoKey)) - { // charCodeMask,keyCodeMask; - char theChar = tEventPtr->message & charCodeMask; - - switch (theChar) // Process keys here - { - - case 't': - case 'T': - ShowAboutWhenIdle = (ShowAboutWhenIdle==0)?1:0; - CFPreferencesSetAppValue (CFSTR(kShowAboutWhenIdlePrefName),ShowAboutWhenIdle?CFSTR("YES"):CFSTR("NO"), CFBundleIdentifier); - break; - case 'q': - case 'Q': - doublePixels = (doublePixels==0)?1:0; - CFPreferencesSetAppValue (CFSTR(kPixelDoublingPrefName),doublePixels?CFSTR("YES"):CFSTR("NO"), CFBundleIdentifier); - changeRes = TRUE; - break; - case '0': - forced = (forced == 0) ? -1 : 0; - break; - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - forced = theChar - '0'; - break; - case 'f': - case 'F': - showFPS = (showFPS==0)?1:0; - CFPreferencesSetAppValue (CFSTR(kShowFPSPrefName),showFPS?CFSTR("YES"):CFSTR("NO"),CFBundleIdentifier); - break; - - case '>': - if (sensitivity <= 240) sensitivity += 10; - { - CFNumberRef value = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &sensitivity); - CFPreferencesSetAppValue (CFSTR(kSensitivityPrefName), value, CFBundleIdentifier); - CFRelease(value); - } - break; - case '<': - if (sensitivity >= 80) sensitivity -= 10; - { - CFNumberRef value = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &sensitivity); - CFPreferencesSetAppValue (CFSTR(kSensitivityPrefName), value, CFBundleIdentifier); - CFRelease(value); - } - break; - - case '\r': - case '\n': - break; - default: - status = unimpErr; - break; - } - } - else - status = unimpErr; - } - break; - - default: - status = unimpErr; - break; - } - return status; -} - -// RegisterVisualPlugin -static OSStatus RegisterVisualPlugin(PluginMessageInfo *messageInfo) -{ - OSStatus status; - PlayerMessageInfo playerMessageInfo; - Str255 pluginName = kTVisualPluginName; -#ifdef Timers - backUpTime = UpTime(); -#endif - - CFStringRef aString; - CFNumberRef aNumber; - CFComparisonResult result; - - CFBundleIdentifier = CFSTR("com.ios.igoom"); - - // Read the preferences - aString = CFPreferencesCopyAppValue(CFSTR(kPixelDoublingPrefName),CFBundleIdentifier); - if (aString != NULL) - { - result = CFStringCompareWithOptions(aString, CFSTR("YES"), CFRangeMake(0,CFStringGetLength(aString)), kCFCompareCaseInsensitive); - if (result == kCFCompareEqualTo) { - doublePixels = true; - } - else doublePixels = false; - } - - aString = CFPreferencesCopyAppValue(CFSTR(kShowFPSPrefName),CFBundleIdentifier); - if (aString != NULL) - { - result = CFStringCompareWithOptions(aString, CFSTR("YES"), CFRangeMake(0,CFStringGetLength(aString)), kCFCompareCaseInsensitive); - if (result == kCFCompareEqualTo) { - showFPS = true; - } - else showFPS = false; - } - - aString = CFPreferencesCopyAppValue(CFSTR(kShowAboutWhenIdlePrefName),CFBundleIdentifier); - if (aString != NULL) - { - result = CFStringCompareWithOptions(aString, CFSTR("YES"), CFRangeMake(0,CFStringGetLength(aString)), kCFCompareCaseInsensitive); - if (result == kCFCompareEqualTo) { - ShowAboutWhenIdle = true; - } - else ShowAboutWhenIdle = false; - } - - aNumber = CFPreferencesCopyAppValue(CFSTR(kSensitivityPrefName),CFBundleIdentifier); - if (aNumber != NULL) - { - CFNumberGetValue(aNumber,kCFNumberIntType,&sensitivity); - } - - - - - bzero(&playerMessageInfo.u.registerVisualPluginMessage,sizeof(playerMessageInfo.u.registerVisualPluginMessage)); - BlockMoveData((Ptr)&pluginName[0],(Ptr)&playerMessageInfo.u.registerVisualPluginMessage.name[0],pluginName[0] + 1); - - SetNumVersion(&playerMessageInfo.u.registerVisualPluginMessage.pluginVersion, kTVisualPluginMajorVersion, kTVisualPluginMinorVersion, kTVisualPluginReleaseStage, kTVisualPluginNonFinalRelease); - - playerMessageInfo.u.registerVisualPluginMessage.options = kVisualWantsIdleMessages | kVisualWantsConfigure; - playerMessageInfo.u.registerVisualPluginMessage.handler = (VisualPluginProcPtr)VisualPluginHandler; - playerMessageInfo.u.registerVisualPluginMessage.registerRefCon = 0; - playerMessageInfo.u.registerVisualPluginMessage.creator = kTVisualPluginCreator; - - playerMessageInfo.u.registerVisualPluginMessage.timeBetweenDataInMS = 0xFFFFFFFF; // 16 milliseconds = 1 Tick, 0xFFFFFFFF = Often as possible. - playerMessageInfo.u.registerVisualPluginMessage.numWaveformChannels = 2; - playerMessageInfo.u.registerVisualPluginMessage.numSpectrumChannels = 0; - - playerMessageInfo.u.registerVisualPluginMessage.minWidth = 100; - playerMessageInfo.u.registerVisualPluginMessage.minHeight = 100; - playerMessageInfo.u.registerVisualPluginMessage.maxWidth = 2000; - playerMessageInfo.u.registerVisualPluginMessage.maxHeight = 2000; - playerMessageInfo.u.registerVisualPluginMessage.minFullScreenBitDepth = 32; - playerMessageInfo.u.registerVisualPluginMessage.maxFullScreenBitDepth = 32; - playerMessageInfo.u.registerVisualPluginMessage.windowAlignmentInBytes = 0; - - status = PlayerRegisterVisualPlugin(messageInfo->u.initMessage.appCookie,messageInfo->u.initMessage.appProc,&playerMessageInfo); -/* - Gestalt(gestaltPowerPCProcessorFeatures,&CPU); - if (1 & (CPU >> gestaltPowerPCHasVectorInstructions)) CPU_FLAVOUR = 1; - else CPU_FLAVOUR = 0; -*/ - - return status; -} - -// main entrypoint -OSStatus iTunesPluginMainMachO(OSType message,PluginMessageInfo *messageInfo,void *refCon) -{ - OSStatus status; - - (void) refCon; - - switch (message) - { - case kPluginInitMessage: - status = RegisterVisualPlugin(messageInfo); - break; - case kPluginCleanupMessage: - status = noErr; - break; - default: - status = unimpErr; - break; - } - - return status; -} diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/iTunes/iGoom-Info.plist kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/iTunes/iGoom-Info.plist --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/iTunes/iGoom-Info.plist 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/iTunes/iGoom-Info.plist 1970-01-01 00:00:00.000000000 +0000 @@ -1,46 +0,0 @@ - - - - - CFBundleDevelopmentRegion - English - CFBundleExecutable - iGoom - CFBundleGetInfoString - 2k4 iGoom for iTunes © gyom & jeko / iOS - CFBundleIdentifier - com.ios.igoom - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - iGoom ! - CFBundlePackageType - hvpl - CFBundleShortVersionString - 2.4.1 - CFBundleSignature - hook - CFBundleVersion - 2.4.2 - CFPlugInDynamicRegisterFunction - - CFPlugInDynamicRegistration - NO - CFPlugInFactories - - 00000000-0000-0000-0000-000000000000 - MyFactoryFunction - - CFPlugInTypes - - 00000000-0000-0000-0000-000000000000 - - 00000000-0000-0000-0000-000000000000 - - - CFPlugInUnloadFunction - - NSMainNibFile - - - diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/iTunes/Installer.applescript kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/iTunes/Installer.applescript --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/iTunes/Installer.applescript 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/iTunes/Installer.applescript 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -(* iTunes installer script for iGoom *) (* If application is running, warn and quit it *) set pid to do shell script "ps -U ${USER} | grep /Applications/iTunes.app/Contents/MacOS/iTunes | grep -v grep | cut -c1-5" if pid is not "" then display dialog "iTunes must not be running while installing. Can I quit it?" with icon 2 tell application "iTunes" quit end tell end if (* Install the new plugin *) set cmd to "\\rm -rf ~/\"Library/iTunes/iTunes Plug-ins\"iGoom.bundle" do shell script cmd set r to "err" set cmd to "\\cp -Rf /Volumes/iGoom/iGoom.bundle ~/\"Library/iTunes/iTunes Plug-ins\"" try do shell script cmd set r to "" end try if r is not "" then (* Troubleshooting *) display dialog "There was a problem during installation." buttons {"Open ReadMe", "Forum", "OK"} default button 1 with icon 0 set dresult to button returned of result if dresult is "Open ReadMe" then do shell script "open /Volumes/iGoom/ReadMe.rtf" else if dresult is "Forum" then open location "http://www.ios-software.com/?page=forum&quoi=1" end if end if else (* relaunch, but not too quickly ! *) set relaunched to false repeat until relaunched is true try tell application "iTunes" activate end tell set relaunched to true end try end repeat (* Select the new plugin et show it if possible *) tell application "iTunes" repeat with i in visuals if name of i is "iGoom" then set current visual to i try set full screen to false set visuals enabled to true play first item of library playlists end try end if end repeat end tell (* Tell the user the plugin was successfully installed *) activate display dialog "Installation was successful. If you like Goom, consider donating or buying some goodies !" buttons {"iOS Store", "Donate", "Use Goom"} default button "iOS Store" with icon 1 set dresult to button returned of result if dresult is "iOS Store" then open location "http://www.cafepress.com/iossoftware" end if if dresult is "Donate" then open location "http://www.ios-software.com/?page=index&what=about" end if if dresult is "Use Goom" then tell application "iTunes" activate end tell end if end if \ No newline at end of file diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/iTunes/iTuneVisualAPI/iTunesAPI.c kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/iTunes/iTuneVisualAPI/iTunesAPI.c --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/iTunes/iTuneVisualAPI/iTunesAPI.c 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/iTunes/iTuneVisualAPI/iTunesAPI.c 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -/* File: iTunesAPI.c Contains: iTunes Plug-ins interfaces Version: Technology: iTunes Release: 1.1 Copyright: 2001 by Apple Computer, Inc., all rights reserved. Bugs?: For bug reports, consult the following page on the World Wide Web: http://developer.apple.com/bugreporter/ */ #include "iTunesAPI.h" #include "iTunesVisualAPI.h" // MemClear // static void MemClear (LogicalAddress dest, SInt32 length) { register unsigned char *ptr; ptr = (unsigned char *) dest; if( length > 16 ) { register unsigned long *longPtr; while( ((unsigned long) ptr & 3) != 0 ) { *ptr++ = 0; --length; } longPtr = (unsigned long *) ptr; while( length >= 4 ) { *longPtr++ = 0; length -= 4; } ptr = (unsigned char *) longPtr; } while( --length >= 0 ) { *ptr++ = 0; } } // SetNumVersion // void SetNumVersion (NumVersion *numVersion, UInt8 majorRev, UInt8 minorAndBugRev, UInt8 stage, UInt8 nonRelRev) { numVersion->majorRev = majorRev; numVersion->minorAndBugRev = minorAndBugRev; numVersion->stage = stage; numVersion->nonRelRev = nonRelRev; } // ITCallApplication // OSStatus ITCallApplication (void *appCookie, ITAppProcPtr handler, OSType message, PlayerMessageInfo *messageInfo) { PlayerMessageInfo localMessageInfo; if (messageInfo == nil) { MemClear(&localMessageInfo, sizeof(localMessageInfo)); messageInfo = &localMessageInfo; } messageInfo->messageMajorVersion = kITCurrentPluginMajorMessageVersion; messageInfo->messageMinorVersion = kITCurrentPluginMinorMessageVersion; messageInfo->messageInfoSize = sizeof(PlayerMessageInfo); return handler(appCookie, message, messageInfo); } // PlayerSetFullScreen // OSStatus PlayerSetFullScreen (void *appCookie, ITAppProcPtr appProc, Boolean fullScreen) { PlayerMessageInfo messageInfo; MemClear(&messageInfo, sizeof(messageInfo)); messageInfo.u.setFullScreenMessage.fullScreen = fullScreen; return ITCallApplication(appCookie, appProc, kPlayerSetFullScreenMessage, &messageInfo); } // PlayerSetFullScreenOptions // OSStatus PlayerSetFullScreenOptions (void *appCookie, ITAppProcPtr appProc, SInt16 minBitDepth, SInt16 maxBitDepth, SInt16 preferredBitDepth, SInt16 desiredWidth, SInt16 desiredHeight) { PlayerMessageInfo messageInfo; MemClear(&messageInfo, sizeof(messageInfo)); messageInfo.u.setFullScreenOptionsMessage.minBitDepth = minBitDepth; messageInfo.u.setFullScreenOptionsMessage.maxBitDepth = maxBitDepth; messageInfo.u.setFullScreenOptionsMessage.preferredBitDepth = preferredBitDepth; messageInfo.u.setFullScreenOptionsMessage.desiredWidth = desiredWidth; messageInfo.u.setFullScreenOptionsMessage.desiredHeight = desiredHeight; return ITCallApplication(appCookie, appProc, kPlayerSetFullScreenOptionsMessage, &messageInfo); } // PlayerGetPluginData // OSStatus PlayerGetPluginData (void *appCookie, ITAppProcPtr appProc, void *dataPtr, UInt32 dataBufferSize, UInt32 *dataSize) { OSStatus status; PlayerMessageInfo messageInfo; MemClear(&messageInfo, sizeof(messageInfo)); messageInfo.u.getPluginDataMessage.dataPtr = dataPtr; messageInfo.u.getPluginDataMessage.dataBufferSize = dataBufferSize; status = ITCallApplication(appCookie, appProc, kPlayerGetPluginDataMessage, &messageInfo); if (dataSize != nil) *dataSize = messageInfo.u.getPluginDataMessage.dataSize; return status; } // PlayerSetPluginData // OSStatus PlayerSetPluginData (void *appCookie, ITAppProcPtr appProc, void *dataPtr, UInt32 dataSize) { PlayerMessageInfo messageInfo; MemClear(&messageInfo, sizeof(messageInfo)); messageInfo.u.setPluginDataMessage.dataPtr = dataPtr; messageInfo.u.setPluginDataMessage.dataSize = dataSize; return ITCallApplication(appCookie, appProc, kPlayerSetPluginDataMessage, &messageInfo); } // PlayerGetPluginNamedData // OSStatus PlayerGetPluginNamedData (void *appCookie, ITAppProcPtr appProc, ConstStringPtr dataName, void *dataPtr, UInt32 dataBufferSize, UInt32 *dataSize) { OSStatus status; PlayerMessageInfo messageInfo; MemClear(&messageInfo, sizeof(messageInfo)); messageInfo.u.getPluginNamedDataMessage.dataName = dataName; messageInfo.u.getPluginNamedDataMessage.dataPtr = dataPtr; messageInfo.u.getPluginNamedDataMessage.dataBufferSize = dataBufferSize; status = ITCallApplication(appCookie, appProc, kPlayerGetPluginNamedDataMessage, &messageInfo); if (dataSize != nil) *dataSize = messageInfo.u.getPluginNamedDataMessage.dataSize; return status; } // PlayerSetPluginNamedData // OSStatus PlayerSetPluginNamedData (void *appCookie, ITAppProcPtr appProc, ConstStringPtr dataName, void *dataPtr, UInt32 dataSize) { PlayerMessageInfo messageInfo; MemClear(&messageInfo, sizeof(messageInfo)); messageInfo.u.setPluginNamedDataMessage.dataName = dataName; messageInfo.u.setPluginNamedDataMessage.dataPtr = dataPtr; messageInfo.u.setPluginNamedDataMessage.dataSize = dataSize; return ITCallApplication(appCookie, appProc, kPlayerSetPluginNamedDataMessage, &messageInfo); } // PlayerIdle // OSStatus PlayerIdle (void *appCookie, ITAppProcPtr appProc) { return ITCallApplication(appCookie, appProc, kPlayerIdleMessage, nil); } // PlayerShowAbout // void PlayerShowAbout (void *appCookie, ITAppProcPtr appProc) { ITCallApplication(appCookie, appProc, kPlayerShowAboutMessage, nil); } // PlayerOpenURL // void PlayerOpenURL (void *appCookie, ITAppProcPtr appProc, SInt8 *string, UInt32 length) { PlayerMessageInfo messageInfo; MemClear(&messageInfo, sizeof(messageInfo)); messageInfo.u.openURLMessage.url = string; messageInfo.u.openURLMessage.length = length; ITCallApplication(appCookie, appProc, kPlayerOpenURLMessage, &messageInfo); } // PlayerUnregisterPlugin // OSStatus PlayerUnregisterPlugin (void *appCookie, ITAppProcPtr appProc, PlayerMessageInfo *messageInfo) { return ITCallApplication(appCookie, appProc, kPlayerUnregisterPluginMessage, messageInfo); } // PlayerRegisterVisualPlugin // OSStatus PlayerRegisterVisualPlugin (void *appCookie, ITAppProcPtr appProc, PlayerMessageInfo *messageInfo) { return ITCallApplication(appCookie, appProc, kPlayerRegisterVisualPluginMessage, messageInfo); } // PlayerRegisterDevicePlugin // OSStatus PlayerRegisterDevicePlugin (void *appCookie, ITAppProcPtr appProc, PlayerMessageInfo *messageInfo) { return ITCallApplication(appCookie, appProc, kPlayerRegisterDevicePluginMessage, messageInfo); } // PlayerSetDeviceSerialNumber // OSStatus PlayerSetDeviceSerialNumber (void *appCookie, ITAppProcPtr appProc, ConstStringPtr serialNumber) { PlayerMessageInfo messageInfo; MemClear(&messageInfo, sizeof(messageInfo)); messageInfo.u.setDeviceSerialNumberMessage.serialNumber = serialNumber; return ITCallApplication(appCookie, appProc, kPlayerSetDeviceSerialNumberMessage, &messageInfo); } // PlayerHandleMacOSEvent // OSStatus PlayerHandleMacOSEvent (void *appCookie, ITAppProcPtr appProc, const EventRecord *theEvent, Boolean *eventHandled) { PlayerMessageInfo messageInfo; OSStatus status; MemClear(&messageInfo, sizeof(messageInfo)); messageInfo.u.handleMacOSEventMessage.theEvent = theEvent; status = ITCallApplication(appCookie, appProc, kPlayerHandleMacOSEventMessage, &messageInfo); if( eventHandled != nil ) *eventHandled = messageInfo.u.handleMacOSEventMessage.handled; return status; } // PlayerGetPluginFileSpec // OSStatus PlayerGetPluginFileSpec (void *appCookie, ITAppProcPtr appProc, FSSpec *pluginFileSpec) { PlayerMessageInfo messageInfo; MemClear(&messageInfo, sizeof(messageInfo)); messageInfo.u.getPluginFileSpecMessage.fileSpec = pluginFileSpec; return ITCallApplication(appCookie, appProc, kPlayerGetPluginFileSpecMessage, &messageInfo); } \ No newline at end of file diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/iTunes/iTuneVisualAPI/iTunesAPI.h kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/iTunes/iTuneVisualAPI/iTunesAPI.h --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/iTunes/iTuneVisualAPI/iTunesAPI.h 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/iTunes/iTuneVisualAPI/iTunesAPI.h 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -/* File: iTunesAPI.h Contains: iTunes Plug-ins interfaces Version: Technology: iTunes Release: 1.1 Copyright: � 2001 by Apple Computer, Inc., all rights reserved. Bugs?: For bug reports, consult the following page on the World Wide Web: http://developer.apple.com/bugreporter/ */ #ifndef __ITUNESAPI__ #define __ITUNESAPI__ #include /* #if PRAGMA_ONCE #pragma once #endif */ #ifdef __cplusplus extern "C" { #endif /* #if PRAGMA_STRUCT_ALIGN #pragma options align=power #elif PRAGMA_STRUCT_PACKPUSH #pragma pack(push, 2) #elif PRAGMA_STRUCT_PACK #pragma pack(2) #endif */ enum { kITCurrentPluginMajorMessageVersion = 10, kITCurrentPluginMinorMessageVersion = 1 }; enum { kTrackSupportsID3Tags = (1L << 0), kTrackHasVariableBitRate = (1L << 1), kTrackIsFolder = (1L << 2), /* Device tracks only. Information returned is for a folder */ kTrackIsLocked = (1L << 3), /* Device tracks only. Track cannot be deleted or renamed */ kTrackCanBeDownloaded = (1L << 4), /* Device tracks only. Track can be copied from device to desktop. */ kTrackIsHidden = (1L << 5) /* Device tracks only. Track should not be displayed in the device window. */ }; typedef OptionBits ITTrackAttributes; enum { /* These mask values are specified in ITTrackInfo.validFields to indicate which fields contain valid data */ kITTINameFieldMask = (1L << 0), kITTIFileNameFieldMask = (1L << 1), kITTIArtistFieldMask = (1L << 2), kITTIAlbumFieldMask = (1L << 3), kITTIGenreFieldMask = (1L << 4), kITTIKindFieldMask = (1L << 5), kITTITrackNumberFieldsMask = (1L << 6), kITTIYearFieldMask = (1L << 7), kITTISoundVolumeFieldMask = (1L << 8), kITTICommentsFieldMask = (1L << 10), kITTITotalTimeFieldMask = (1L << 11), kITTIStartTimeFieldMask = (1L << 12), kITTIStopTimeFieldMask = (1L << 13), kITTISizeFieldMask = (1L << 14), kITTIBitRateFieldMask = (1L << 15), kITTISampleRateFieldMask = (1L << 16), kITTIAttributesFieldMask = (1L << 17), kITTIFileTypeFieldMask = (1L << 18), kITTIDateFieldMask = (1L << 19) }; typedef OptionBits ITTIFieldMask; struct ITTrackInfo { ITTIFieldMask validFields; UInt32 reserved; /* Must be zero */ Str255 name; Str255 fileName; Str255 artist; Str255 album; Str255 genre; Str255 kind; UInt32 trackNumber; UInt32 numTracks; UInt16 year; SInt16 soundVolumeAdjustment; /* Valid range is -255 to +255 */ Str255 unusedReserved1; /* Must be empty string */ Str255 comments; UInt32 totalTimeInMS; UInt32 startTimeInMS; UInt32 stopTimeInMS; UInt32 sizeInBytes; UInt32 bitRate; UInt32 sampleRateFixed; OSType fileType; UInt32 date; UInt32 unusedReserved2; /* Must be zero */ ITTrackAttributes attributes; ITTrackAttributes validAttributes; /* Mask indicating which attributes are applicable */ }; typedef struct ITTrackInfo ITTrackInfo; enum { kCurrentITStreamInfoVersion = 1 }; typedef FSSpec ITFileSpec; struct ITFileLocation { ITFileSpec spec; FInfo fInfo; }; typedef struct ITFileLocation ITFileLocation; struct ITStreamInfo { SInt32 version; Str255 streamTitle; Str255 streamURL; Str255 streamMessage; }; typedef struct ITStreamInfo ITStreamInfo; enum { /* messages sent to plugin main */ kPluginInitMessage = 'init', kPluginCleanupMessage = 'clr ', kPluginIdleMessage = 'idle' }; enum { /* PluginInitMessage.options */ kPluginWantsIdleMessages = (1L << 1), /* Send idle messages to plugin main */ kPluginWantsToBeLeftOpen = (1L << 2) /* Don't close this plugin just because */ /* it didn't register anyone */ }; enum { /* iTunes API messages */ kPlayerRegisterVisualPluginMessage = 'rvis', /* Register a visual plugin */ kPlayerRegisterDevicePluginMessage = 'rdev', /* Register a device plugin */ /* Available for all plugins */ kPlayerIdleMessage = 'idle', /* Give iTunes some time */ kPlayerShowAboutMessage = 'abou', /* Show the about box. */ kPlayerOpenURLMessage = 'url ', /* Open a URL */ kPlayerSetPluginDataMessage = 'sprf', /* Set plugin preferences */ kPlayerGetPluginDataMessage = 'gprf', /* Get plugin preferences */ kPlayerSetPluginNamedDataMessage = 'snpr', /* Set plugin named preferenes */ kPlayerGetPluginNamedDataMessage = 'gnpr', /* Get plugin named preferenes */ kPlayerHandleMacOSEventMessage = 'evnt', /* Tell player to handle unhandled event */ kPlayerGetPluginFileSpecMessage = 'pspc', /* Get the location of the plugin executable */ /* Available for visual plugins */ kPlayerSetFullScreenMessage = 'sful', /* Set full screen mode */ kPlayerSetFullScreenOptionsMessage = 'sfop', /* Set full screen options */ /* Available for device plugins */ kPlayerSetDeviceSerialNumberMessage = 'dvsn', /* Set a serial number string for a device. Needed for per-device prefs */ kPlayerUnregisterPluginMessage = 'unrg' /* Unregister the plugin this comes from */ }; typedef OSStatus (*ITAppProcPtr)(void *appCookie, OSType message,void *messageInfo); /* Plugin main Messages */ struct PluginInitMessage { UInt32 majorVersion; /* Input */ UInt32 minorVersion; /* Input */ void * appCookie; /* Input */ ITAppProcPtr appProc; /* Input */ OptionBits options; /* Output, see above for values */ void * refCon; /* Output */ }; typedef struct PluginInitMessage PluginInitMessage; struct PluginMessageInfo { union { PluginInitMessage initMessage; } u; }; typedef struct PluginMessageInfo PluginMessageInfo; /* Plugin main entry point message handler */ typedef OSStatus (*PluginProcPtr)(OSType message, PluginMessageInfo *messageInfo, void *refCon); /* Visual plugin message handler */ typedef OSStatus (*VisualPluginProcPtr)(OSType message,void *messageInfo, void *refCon); /* Device plugin message handler */ typedef OSStatus (*DevicePluginProcPtr)(OSType message,void *messageInfo, void *refCon); /* Callbacks to iTunes */ enum { /* PlayerRegisterVisualPluginMessage.options */ kVisualWantsIdleMessages = (1L << 3), kVisualWantsConfigure = (1L << 5) }; struct PlayerRegisterVisualPluginMessage { /* Input from plugin */ Str63 name; /* Displayed in the Visual menu */ OptionBits options; /* See above */ OSType creator; /* Identifies the plugin */ NumVersion pluginVersion; /* Version number of the plugin */ VisualPluginProcPtr handler; /* Handler for the plugin's messages */ void * registerRefCon; /* RefCon for the plugin's handler */ UInt32 timeBetweenDataInMS; /* How often to call the plugin (0xFFFFFFFF = as often as possible) */ UInt32 numWaveformChannels; /* 0-2 waveforms requested */ UInt32 numSpectrumChannels; /* 0-2 spectrums requested */ SInt16 minWidth; /* Minimum resizeable width */ SInt16 minHeight; /* Minimum resizeable height */ SInt16 maxWidth; /* Maximum resizeable width */ SInt16 maxHeight; /* Maximum resizeable height */ UInt16 minFullScreenBitDepth; /* 0 = Any */ UInt16 maxFullScreenBitDepth; /* 0 = Any */ UInt16 windowAlignmentInBytes; /* Reserved (should be zero) */ }; typedef struct PlayerRegisterVisualPluginMessage PlayerRegisterVisualPluginMessage; enum { /* PlayerRegisterDevicePluginMessage.options */ kDeviceWantsIdleMessages = (1L << 0) }; struct PlayerRegisterDevicePluginMessage { /* Input from plugin */ Str63 name; /* Used internally. Not currently displayed */ OptionBits options; /* See above */ NumVersion pluginVersion; /* Version number of the plugin */ DevicePluginProcPtr handler; /* Handler for the plugin's messages */ void * registerRefCon; /* RefCon for the plugin's handler */ UInt32 reserved[2]; /* Must be zero */ }; typedef struct PlayerRegisterDevicePluginMessage PlayerRegisterDevicePluginMessage; struct PlayerSetFullScreenMessage { Boolean fullScreen; }; typedef struct PlayerSetFullScreenMessage PlayerSetFullScreenMessage; struct PlayerSetFullScreenOptionsMessage { SInt16 minBitDepth; /* 0 = Any */ SInt16 maxBitDepth; /* 0 = Any */ SInt16 preferredBitDepth; /* 0 = Current */ SInt16 desiredWidth; /* Must be within minWidth & maxWidth */ SInt16 desiredHeight; /* Must be within minHeight & maxHeight */ }; typedef struct PlayerSetFullScreenOptionsMessage PlayerSetFullScreenOptionsMessage; struct PlayerOpenURLMessage { SInt8 * url; UInt32 length; }; typedef struct PlayerOpenURLMessage PlayerOpenURLMessage; struct PlayerSetPluginDataMessage { void * dataPtr; /* Input */ UInt32 dataSize; /* Input */ }; typedef struct PlayerSetPluginDataMessage PlayerSetPluginDataMessage; struct PlayerGetPluginDataMessage { void * dataPtr; /* Input */ UInt32 dataBufferSize; /* Input */ UInt32 dataSize; /* Output */ }; typedef struct PlayerGetPluginDataMessage PlayerGetPluginDataMessage; struct PlayerSetPluginNamedDataMessage { ConstStringPtr dataName; /* Input */ void * dataPtr; /* Input */ UInt32 dataSize; /* Input */ }; typedef struct PlayerSetPluginNamedDataMessage PlayerSetPluginNamedDataMessage; struct PlayerGetPluginNamedDataMessage { ConstStringPtr dataName; /* Input */ void * dataPtr; /* Input */ UInt32 dataBufferSize; /* Input */ UInt32 dataSize; /* Output */ }; typedef struct PlayerGetPluginNamedDataMessage PlayerGetPluginNamedDataMessage; struct PlayerHandleMacOSEventMessage { const EventRecord * theEvent; /* Input */ Boolean handled; /* Output */ }; typedef struct PlayerHandleMacOSEventMessage PlayerHandleMacOSEventMessage; struct PlayerGetPluginFileSpecMessage { FSSpec * fileSpec; /* Output */ }; typedef struct PlayerGetPluginFileSpecMessage PlayerGetPluginFileSpecMessage; struct PlayerSetDeviceSerialNumberMessage { ConstStringPtr serialNumber; /* Input */ }; typedef struct PlayerSetDeviceSerialNumberMessage PlayerSetDeviceSerialNumberMessage; struct PlayerMessageInfo { UInt32 messageMajorVersion; /* Should be kITCurrentPluginMajorMessageVersion */ UInt32 messageMinorVersion; /* Should be kITCurrentPluginMinorMessageVersion */ UInt32 messageInfoSize; /* Should be sizeof(PlayerMessageInfo) */ union { PlayerRegisterVisualPluginMessage registerVisualPluginMessage; PlayerRegisterDevicePluginMessage registerDevicePluginMessage; PlayerOpenURLMessage openURLMessage; PlayerSetPluginDataMessage setPluginDataMessage; PlayerGetPluginDataMessage getPluginDataMessage; PlayerSetPluginNamedDataMessage setPluginNamedDataMessage; PlayerGetPluginNamedDataMessage getPluginNamedDataMessage; PlayerHandleMacOSEventMessage handleMacOSEventMessage; PlayerGetPluginFileSpecMessage getPluginFileSpecMessage; PlayerSetFullScreenMessage setFullScreenMessage; PlayerSetFullScreenOptionsMessage setFullScreenOptionsMessage; PlayerSetDeviceSerialNumberMessage setDeviceSerialNumberMessage; } u; }; typedef struct PlayerMessageInfo PlayerMessageInfo; extern OSStatus ITCallApplication (void *appCookie, ITAppProcPtr appProc, OSType message, PlayerMessageInfo *messageInfo); extern void SetNumVersion (NumVersion *numVersion, UInt8 majorRev, UInt8 minorAndBugRev, UInt8 stage, UInt8 nonRelRev); /* for use from plugin main */ extern OSStatus PlayerRegisterVisualPlugin (void *appCookie, ITAppProcPtr appProc, PlayerMessageInfo *messageInfo); extern OSStatus PlayerRegisterDevicePlugin (void *appCookie, ITAppProcPtr appProc, PlayerMessageInfo *messageInfo); /* For all plugins */ extern OSStatus PlayerIdle (void *appCookie, ITAppProcPtr appProc); extern void PlayerShowAbout (void *appCookie, ITAppProcPtr appProc); extern void PlayerOpenURL (void *appCookie, ITAppProcPtr appProc, SInt8 *string, UInt32 length); extern OSStatus PlayerGetPluginData (void *appCookie, ITAppProcPtr appProc, void *dataPtr, UInt32 dataBufferSize, UInt32 *dataSize); extern OSStatus PlayerSetPluginData (void *appCookie, ITAppProcPtr appProc, void *dataPtr, UInt32 dataSize); extern OSStatus PlayerGetPluginNamedData (void *appCookie, ITAppProcPtr appProc, ConstStringPtr dataName, void *dataPtr, UInt32 dataBufferSize, UInt32 *dataSize); extern OSStatus PlayerSetPluginNamedData (void *appCookie, ITAppProcPtr appProc, ConstStringPtr dataName, void *dataPtr, UInt32 dataSize); extern OSStatus PlayerHandleMacOSEvent (void *appCookie, ITAppProcPtr appProc, const EventRecord *theEvent, Boolean *eventHandled); extern OSStatus PlayerGetPluginFileSpec (void *appCookie, ITAppProcPtr appProc, FSSpec *pluginFileSpec); /* For visual plugins */ extern OSStatus PlayerSetFullScreen (void *appCookie, ITAppProcPtr appProc, Boolean fullScreen); extern OSStatus PlayerSetFullScreenOptions (void *appCookie, ITAppProcPtr appProc, SInt16 minBitDepth, SInt16 maxBitDepth, SInt16 preferredBitDepth, SInt16 desiredWidth, SInt16 desiredHeight); /* For device plugins */ extern OSStatus PlayerSetDeviceSerialNumber (void *appCookie, ITAppProcPtr appProc, ConstStringPtr serialNumber); extern OSStatus PlayerUnregisterPlugin (void *appCookie, ITAppProcPtr appProc, PlayerMessageInfo *messageInfo); /* #if PRAGMA_STRUCT_ALIGN #pragma options align=reset #elif PRAGMA_STRUCT_PACKPUSH #pragma pack(pop) #elif PRAGMA_STRUCT_PACK #pragma pack() #endif */ #ifdef __cplusplus } #endif #endif /* __ITUNESAPI__ */ \ No newline at end of file diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/iTunes/iTuneVisualAPI/iTunesVisualAPI.h kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/iTunes/iTuneVisualAPI/iTunesVisualAPI.h --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/iTunes/iTuneVisualAPI/iTunesVisualAPI.h 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/iTunes/iTuneVisualAPI/iTunesVisualAPI.h 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -/* File: iTunesVisualAPI.h Contains: iTunes Visual Plug-ins interfaces Version: Technology: iTunes Release: 1.1 Copyright: � 2001 by Apple Computer, Inc., all rights reserved. Bugs?: For bug reports, consult the following page on the World Wide Web: http://developer.apple.com/bugreporter/ */ #ifndef __ITUNESVISUALAPI__ #define __ITUNESVISUALAPI__ #include "iTunesAPI.h" /* #if PRAGMA_ONCE #pragma once #endif */ #ifdef __cplusplus extern "C" { #endif /* #if PRAGMA_STRUCT_ALIGN #pragma options align=power #elif PRAGMA_STRUCT_PACKPUSH #pragma pack(push, 2) #elif PRAGMA_STRUCT_PACK #pragma pack(2) #endif */ enum { /* VisualPlugin messages */ kVisualPluginIdleMessage = 'null', kVisualPluginInitMessage = 'init', kVisualPluginCleanupMessage = 'clr ', kVisualPluginConfigureMessage = 'cnfg', /* Configure the plugin (may not be enabled) */ kVisualPluginEnableMessage = 'von ', /* Turn on the module (automatic)*/ kVisualPluginDisableMessage = 'voff', /* Turn off the module */ kVisualPluginShowWindowMessage = 'show', /* Show the plugin window (allocate large memory here!) */ kVisualPluginHideWindowMessage = 'hide', /* Hide the plugin window (deallocate large memory here!) */ kVisualPluginSetWindowMessage = 'swin', /* Change the window parameters */ kVisualPluginRenderMessage = 'vrnd', /* Render to window */ kVisualPluginUpdateMessage = 'vupd', /* Update the window */ kVisualPluginPlayMessage = 'vply', /* Playing a track */ kVisualPluginChangeTrackMessage = 'ctrk', /* Change track (for CD continuous play) */ kVisualPluginStopMessage = 'vstp', /* Stopping a track */ kVisualPluginSetPositionMessage = 'setp', /* Setting the position of a track */ kVisualPluginPauseMessage = 'vpau', /* Pausing a track (unused - Pause is stop) */ kVisualPluginUnpauseMessage = 'vunp', /* Unpausing a track (unused - Pause is stop) */ kVisualPluginEventMessage = 'vevt' /* Mac-event. */ }; /* VisualPlugin messages */ enum { kVisualMaxDataChannels = 2, kVisualNumWaveformEntries = 512, kVisualNumSpectrumEntries = 512 }; enum { /* ShowWindow options */ kWindowIsFullScreen = (1L << 0) }; struct RenderVisualData { UInt8 numWaveformChannels; UInt8 waveformData[kVisualMaxDataChannels][kVisualNumWaveformEntries]; UInt8 numSpectrumChannels; UInt8 spectrumData[kVisualMaxDataChannels][kVisualNumSpectrumEntries]; }; typedef struct RenderVisualData RenderVisualData; struct VisualPluginInitMessage { UInt32 messageMajorVersion; /* Input */ UInt32 messageMinorVersion; /* Input */ NumVersion appVersion; /* Input */ void * appCookie; /* Input */ ITAppProcPtr appProc; /* Input */ OptionBits options; /* Output */ void * refCon; /* Output */ }; typedef struct VisualPluginInitMessage VisualPluginInitMessage; struct VisualPluginShowWindowMessage { CGrafPtr port; /* Input */ Rect drawRect; /* Input */ OptionBits options; /* Input */ }; typedef struct VisualPluginShowWindowMessage VisualPluginShowWindowMessage; struct VisualPluginSetWindowMessage { CGrafPtr port; /* Input */ Rect drawRect; /* Input */ OptionBits options; /* Input */ }; typedef struct VisualPluginSetWindowMessage VisualPluginSetWindowMessage; struct VisualPluginPlayMessage { ITTrackInfo * trackInfo; /* Input */ ITStreamInfo * streamInfo; /* Input */ SInt32 volume; /* Input */ UInt32 bitRate; /* Input */ SoundComponentData soundFormat; /* Input */ }; typedef struct VisualPluginPlayMessage VisualPluginPlayMessage; struct VisualPluginChangeTrackMessage { ITTrackInfo * trackInfo; /* Input */ ITStreamInfo * streamInfo; /* Input */ }; typedef struct VisualPluginChangeTrackMessage VisualPluginChangeTrackMessage; struct VisualPluginRenderMessage { RenderVisualData * renderData; /* Input */ UInt32 timeStampID; /* Input */ }; typedef struct VisualPluginRenderMessage VisualPluginRenderMessage; struct VisualPluginSetPositionMessage { UInt32 positionTimeInMS; /* Input */ }; typedef struct VisualPluginSetPositionMessage VisualPluginSetPositionMessage; struct VisualPluginEventMessage { EventRecord * event; /* Input */ }; typedef struct VisualPluginEventMessage VisualPluginEventMessage; struct VisualPluginMessageInfo { union { VisualPluginInitMessage initMessage; VisualPluginShowWindowMessage showWindowMessage; VisualPluginSetWindowMessage setWindowMessage; VisualPluginPlayMessage playMessage; VisualPluginChangeTrackMessage changeTrackMessage; VisualPluginRenderMessage renderMessage; VisualPluginSetPositionMessage setPositionMessage; VisualPluginEventMessage eventMessage; } u; }; typedef struct VisualPluginMessageInfo VisualPluginMessageInfo; /* #if PRAGMA_STRUCT_ALIGN #pragma options align=reset #elif PRAGMA_STRUCT_PACKPUSH #pragma pack(pop) #elif PRAGMA_STRUCT_PACK #pragma pack() #endif */ #ifdef __cplusplus } #endif #endif /* __ITUNESVISUALAPI__ */ \ No newline at end of file diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/iTunes/ppc_doubling.s kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/iTunes/ppc_doubling.s --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/iTunes/ppc_doubling.s 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/iTunes/ppc_doubling.s 1970-01-01 00:00:00.000000000 +0000 @@ -1,50 +0,0 @@ -.section regular,__TEXT -.globl _ppc_doubling ; name of the function to call by C program - -; width (src width)->r3 -; myx (src) ->r4 -; myX (dest) ->r5 -; myX2 (dest + 1 complete line)->r6 -; heigth (src height)->r7 -; inc (increment for next line in dest) ->r8 - -_ppc_doubling: - -mtspr ctr,r3 - -addi r4,r4,-4 -addi r5,r5,-4 -addi r6,r6,-4 - -1:;boucle: - -lwzu r10,4(r4) -stwu r10,4(r5) -stwu r10,4(r5) -stwu r10,4(r6) -stwu r10,4(r6) - -bdnz 1boucle - -subi r7,r7,1 -add r5,r5,r8 -cmpwi cr1,r7,0 -add r6,r6,r8 -mtspr ctr,r3 -bgt cr1,1boucle - -blr - -;backup - -lwzu r10,4(r4) -stwu r10,4(r5) -stwu r10,4(r6) -stwu r10,4(r5) -stwu r10,4(r6) - -lwzu r10,4(r4) -stwu r10,4(r5) -stwu r10,4(r6) -stwu r10,4(r5) -stwu r10,4(r6) diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/Makefile kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/Makefile --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/Makefile 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/Makefile 1970-01-01 00:00:00.000000000 +0000 @@ -1,88 +0,0 @@ -# Makefile -# author: Gyom / iOS-Software -# Jan 2005 - - -############### -# Settings -macimage_name=iGoom -libobjects=../src/.libs/*.o -#buildroot=defaults read com.apple.Xcode "PBXApplicationwideBuildSettings" | cut -f2 -d"SYMROOT" | cut -f2 -d"\"" -buildroot=. -BUNDLE=$(buildroot)/iGoom.bundle -APP=$(buildroot)/iGoom.app -installer=iTunes/iTunes-Installer.app - - -all: $(APP) $(BUNDLE) - - -############### -# Misc library Targets - -# We build an embedable version of libgoom -StandAlone/libgoom2.0.dylib:$(libobjects) - gcc -dynamiclib -flat_namespace -o StandAlone/libgoom2.0.dylib $(libobjects) -install_name @executable_path/../Frameworks/libgoom2.0.dylib -compatibility_version 1 -current_version 1.0 -seg1addr 0x40000 -prebind - -# We link static only with iTunes because the install_path -# cannot be set properly to embed the lib in the bundle -# We must not place it in the mac folder because the bundle will -# link against the dynamic version if it is present -iTunes/libgoom2.0.a:$(libobjects) - libtool -static -o iTunes/libgoom2.0.a $(libobjects) - - -######################### -# Standalone Application - -standalone:$(APP) - -$(APP): StandAlone/libgoom2.0.dylib Makefile - xcodebuild -target "iGoom - StandAlone" -buildstyle Deployment SYMROOT=$(buildroot) - -cleanstandalone: - xcodebuild clean -target "iGoom - StandAlone" -buildstyle Deployment SYMROOT=$(buildroot) - - - -############### -# iTunes Plugin - -itunes:$(BUNDLE) - -$(BUNDLE):iTunes/libgoom2.0.a Makefile - xcodebuild -target "iGoom - iTunes" -buildstyle Deployment SYMROOT=$(buildroot) - -cleanitunes: - xcodebuild clean -target "iGoom - iTunes" -buildstyle Deployment SYMROOT=$(buildroot) - -$(installer):iTunes/Installer.applescript - osacompile -o $(installer) -x iTunes/Installer.applescript - - - -###################### -# Distribution Package - -all: $(APP) $(BUNDLE) - -package:$(macimage_name).dmg - -$(macimage_name).dmg:all ReadMe.rtf $(installer) - rm -rf $(macimage_name).dmg $(macimage_name) - mkdir -p $(macimage_name) - cp -r $(BUNDLE) $(macimage_name) - cp -r $(APP) $(macimage_name) - cp ReadMe.rtf $(macimage_name) - cp -rf $(installer) $(macimage_name)/ - hdiutil create -srcfolder $(macimage_name) $(macimage_name).dmg - - -########## -# Clean up - -clean: - rm -rf $(BUNDLE) $(APP) $(installer) - rm -rf $(macimage_name).dmg $(macimage_name) $(buildroot)/iGoom.build - rm -f StandAlone/libgoom2.* iTunes/libgoom2.* libgoom2.* - diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/ReadMe.rtf kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/ReadMe.rtf --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/ReadMe.rtf 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/ReadMe.rtf 1970-01-01 00:00:00.000000000 +0000 @@ -1,256 +0,0 @@ -{\rtf1\mac\ansicpg10000\cocoartf102 -{\fonttbl\f0\fswiss\fcharset77 Helvetica-Bold;\f1\fswiss\fcharset77 Helvetica;\f2\fnil\fcharset77 LucidaGrande; -} -{\colortbl;\red255\green255\blue255;\red255\green0\blue0;\red1\green128\blue0;\red0\green12\blue255; -\red0\green0\blue255;\red0\green22\blue255;\red0\green0\blue0;\red0\green132\blue14;} -\vieww15220\viewh13580\viewkind0 -\pard\tx1440\tx2880\tx4320\tx5760\tx7200\qc - -\f0\b\fs36 \cf0 iGoom 2k4\ -\'a9 2001/2005 iOS-Software\ -\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural - -\f1\b0\fs24 \cf0 \ -\cf2 \ -iGoom\cf0 is a wonderful visual effect plug-in for \cf3 iTunes\cf0 for Mac OS X. A mac standalone version is now also available. This is the Mac version of Goom, originally written by Jean-Christophe Hoelt "jeko" (\cf4 \ul \ulc4 jeko@ios-software.com\cf0 \ulnone ) and ported to iTunes by Guillaume Borios "gyom" (\cf4 \ul gyom@ios-software.com\cf0 \ulnone ).\ -\ -Check for informations or updates at \cf5 \ul \ulc5 http://www.\cf4 \ul \ulc4 ios-software.com\cf5 \ul \ulc5 /?page=projet&quoi=1\cf0 \ulnone .\cf6 \ul \ulc6 \ -\cf0 \ulnone \ -\ -\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural - -\f0\b\fs28 \cf0 License and Warranty\ -\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural - -\f1\b0\fs24 \cf0 \ -The iTunes plug-in and the StandAlone application are\cf7 distributed under the terms of the GNU General Public License.\ -See \cf5 http://www.gnu.org/licenses/gpl.html\cf7 .\ -\cf0 \ -\ -\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural - -\f0\b\fs28 \cf0 How to install\ -\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural - -\f1\b0\fs24 \cf0 \ -\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural - -\f0\b \cf0 iTunes:\ -\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural - -\f1\b0 \cf0 Use the included install script\ -OR\ -Quit iTunes and drag the iGoom.bundle file into your "~/Library/iTunes/iTunes Plug-ins" folder. (the "~" means your home folder, the one with your user name). If any previous version of iGoom was already there, you MUST overwrite it or put it away, don't just rename.\ -\ -\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural - -\f0\b \cf0 Standalone:\ -\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural - -\f1\b0 \cf0 Drag and drop the application anywhere you want on your hard drive.\ -\ -\ -\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural - -\f0\b\fs28 \cf0 How to use the iTunes plugin\ -\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural - -\f1\b0\fs24 \cf0 Launch iTunes, then select iGoom in the iTunes "Visual" menu, enable the visual effects ( -\f2 \AppleTypeServicesU1 \uc0\u8984 -\f1 \AppleTypeServicesU0 +T) and play your favorite songs.\ -\ -When iGoom is activated you can click the option button in the iTunes window to get the Preference panel.\ -\ -The preferences can also be set 'live' by simply hitting the following keys :\ -\ -* \cf8 Pixel doubling\cf0 (Key : Q): when activated, iGoom calculates a half sized image and artificially doubles its size when rendering.\ -* \cf8 Sensitivity\cf0 (Keys : < to decrease and > to increase) : Use this to make iGoom match the music YOU hear.\ -* \cf8 Presets\cf0 (Keys : 0 to 9) : Presets selection (0 Blocks the current effect).\ -* \cf8 Framerate\cf0 (Key : F) : Display the frame rate.\ -* \cf8 Information display\cf0 (Key : T) : Toggle information display when iTunes is Idle.\ -\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural - -\f0\b\fs28 \cf0 \ -\ -Performance tips -\f1\b0\fs24 \ -To accelerate iGoom, try these tips :\ -\'a5 Quit all other applications you don't need\ -\'a5 Enable the Quick Mode (Lower quality)\ -\'a5 Prefer the full screen mode to large windows in iTunes (full screen mode switches the resolution)\ -\'a5 Reduce the render size in iTunes (select medium size or low size in the visual menu).\ -\'a5 Buy a new Machine ;-)\ -\ -For full screen playback, I recommend at least a G4@800 (better with G4 or G5 and higher clock rates of course). Please note that iGoom can't use a lot of 3D acceleration and is not easily optimizable with Velocity Engine. \cf2 A fast CPU with lots of cache is the key.\cf0 \ -\ -\ - -\f0\b\fs28 Known bugs / Things to do\ -\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural - -\f1\b0\fs24 \cf0 Try to make it even faster (But don't expect too much now...),\ -Add new effects,\ -Finish the scripting system,\ -Enhance the functionalities of the standalone application.\ -\ -\ -\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural - -\f0\b\fs28 \cf0 Version history -\f1\b0\fs24 \ -\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural - -\f0\b \cf0 \ -2k4 ~ January 2005\ -\'a5 -\f1\b0 In sync with the final Goom 2k4\ -\'a5 The StandAlone version is available.\ -\'a5 The source tree is back to the sourceforge cvs and mac compatible. -\f0\b \ -\ -2k4 dev 14 ~ March 2004\ -\'a5 -\f1\b0 Added the scripting system into the core (not yet scriptable without recompilation). -\f0\b \ -\ -2k4 dev 8 ~ February 2004\ -\'a5 -\f1\b0 Added G5 optimizations. -\f0\b \ -\'a5 -\f1\b0 Caught a crashing bug in the PowerPC render.\ - -\f0\b \'a5 -\f1\b0 Added luminosity post-processing. -\f0\b \ -\'a5 -\f1\b0 Rewrote the transformation computation to make it independent from the resolution.\ - -\f0\b \'a5 -\f1\b0 A new fireworks effect. -\f0\b \ -\'a5 -\f1\b0 Lots of internal modifications to prepare future features. -\f0\b \ -\'a5 -\f1\b0 Many little optimizations. -\f0\b \ -\ -1.99.5 ~ January 7th 2003\ -\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural - -\f1\b0 \cf0 \'a5 Information display can now be set on and off using the key T or the preference panel. Since many users seem to find it annoying, this feature is off by default.\ -\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural - -\f0\b \cf0 \ -1.99.4 ~ January 6th 2003\ -\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural - -\f1\b0 \cf0 \'a5 Not faster but does more than before.\ -\'a5 Smoother animations.\ -\'a5 Nice text display with cool font and effect.\ -\'a5 New "tentacle" line effect.\ -\'a5 New zooms.\ -\'a5 Resize crashing bug hopefully corrected.\ -\'a5 Tuned many effects.\ -\'a5 Preferences window modified.\ -\'a5 iGoom now uses its own preference file instead of parasiting the iTune's one. \ -\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural - -\f0\b \cf0 \ -1.9Dev5 ~ July 21st 2002\ -\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural - -\f1\b0 \cf0 \'a5 Dynamic transitions between transforms.\ -\'a5 Dynamic lines effects transitions with new colors.\ -\'a5 1 new transform.\ -\'a5 Assembly routines rewritten but G4 optimisations disabled.\ -\'a5 Tuned many effects.\ -\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural - -\f0\b \cf0 \ -1.7.8 ~ April 12th 2002\ -\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural - -\f1\b0 \cf0 \'a5 Added a tuned version of the fabulous ifs effect.\ -(Copyright (c) 1997 by Massimino Pascal ).\ -\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural - -\f0\b \cf0 \ -1.7.7 ~ April 5th 2002\ -\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural - -\f1\b0 \cf0 \'a5 Little speed bump (+8%) on G3\ -(Improved the G3 assembly code, lend me a G4 and I'll do it for Altivec too!)\ -\'a5 Finally caught the crashing lines bug.\ -\'a5 Enabled the original lines effects again.\ -\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural - -\f0\b \cf0 \ -1.7.6 ~ March 15th 2002\ -\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural - -\f1\b0 \cf0 \'a5 In sync with goom 1.7.6,\ -\'a5 Now retains the quality mode.\ -\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural - -\f0\b \cf0 \ -1.7.5a3 ~ Not released\ -\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural - -\f1\b0 \cf0 \'a5 Big speed bump on Smooth Mode (full quality) of about 30%.\ -\'a5 Little speed bump on Quick Mode (doubled pixels) of about 5%.\ -\'a5 Minor speed bump for G3 users.\ -\'a5 Added graphic visualization of setup (not available on fullscreen smooth mode).\ -\'a5 Added sensitivity setup.\ -\'a5 Tuned the moving pixels filter.\ -\ -\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural - -\f0\b \cf0 1.7.4 ~ November 8th 2001\ -\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural - -\f1\b0 \cf0 \'a5 Pixel doubling mode is now the default.\ -\'a5 Better default parameters.\ -\'a5 Accelerated the full quality mode by about 8%\ -\'a5 Added that nice (?) purple circle in the centre.\ -\'a5 Code clean-up (1.7.0 - 180kb -> 1.7.4 - 72kb)\ -\'a5 Version number corrected again (should be good this time)\ -\'a5 The random resizing crashes seem to be corrected by the code clean up.\ -\ -\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural - -\f0\b \cf0 1.7.3 ~ July 26th 2001 -\f1\b0 \ -\'a5 The 1.7.2 archive was broken for G3, corrected the archive\ -\ - -\f0\b 1.7.2 ~ July 26th 2001 -\f1\b0 \ -\'a5 Now detects if Altivec (Velocity Engine) is present or not and enables a new G4 assembly zoom routine whenever possible. This makes it about 30% faster than before on G4 CPUs.\ -\'a5 Corrected a bug that would make the render go weird with odd horizontal resolutions and pixel doubling enabled.\ -\'a5 G3 Assembly acceleration rewritten for easier Altivec integration (No speed loss).\ -\'a5 Core goom code cleaned up to make possible Altivec accelerations (better data alignment and misc details). This make the G3 version a bit faster too and should accelerate future releases for other platforms.\ -\'a5 Corrected the bundle version number\ -\ - -\f0\b 1.7.1 ~ July 19th 2001 -\f1\b0 \ -\'a5 Added a PowerPC assembly routine instead of pure C to execute the critical part of the zoom (just like on MMX processors). We gain about 50% more Frame Per Second !\ -\ - -\f0\b 1.7.0 ~ July 17th 2001 -\f1\b0 \ -\'a5 In sync with Goom 1.7 (with some new effects available).\ -\'a5 Code clean up.\ -\'a5 Rendering functions (both normal and pixel doubling) rewritten for speed concerns.\ -\ - -\f0\b 1.6.1 ~ July 14th 2001 -\f1\b0 \ -\'a5 Pixel doubling bug corrected.\ -\ - -\f0\b 1.6.0 ~ July 11th 2001 -\f1\b0 \ -\'a5 Initial release, in sync with Goom 1.6 for XMMS.} \ No newline at end of file diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/StandAlone/AppController.h kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/StandAlone/AppController.h --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/StandAlone/AppController.h 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/StandAlone/AppController.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,38 +0,0 @@ -#import - -#import "Goom.h" - -#import "MainOpenGLView.h" - -@interface AppController : NSResponder -{ - // Views - IBOutlet NSWindow * PrefWin; - IBOutlet NSTabView * TabView; - - IBOutlet MainOpenGLView * GLView; - - IBOutlet NSButton * HQButton; - IBOutlet NSTextField * QEWarning; - IBOutlet NSTextField * FPSCounter; - - // Model - BOOL isAnimating; - NSTimer *animationTimer; - CFAbsoluteTime timeBefore; - - BOOL stayInFullScreenMode; - NSOpenGLContext *fullScreenContext; - - IBOutlet Goom * myGoom; - float FrameRate; - float lastFPS; - AbsoluteTime backUpTime; -} - -- (IBAction) goFullScreen:(id)sender; -- (IBAction) setHighQuality:(id)sender; -- (IBAction) setFrameRate:(id)sender; -- (BOOL) isInFullScreenMode; - -@end diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/StandAlone/AppController.m kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/StandAlone/AppController.m --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/StandAlone/AppController.m 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/StandAlone/AppController.m 1970-01-01 00:00:00.000000000 +0000 @@ -1,438 +0,0 @@ -#import "AppController.h" -#import "GoomFXView.h" -#include "src/goom.h" - -#import - -@interface AppController (AnimationMethods) -- (BOOL) isAnimating; -- (void) startAnimation; -- (void) stopAnimation; -- (void) toggleAnimation; - -- (void) startAnimationTimer; -- (void) stopAnimationTimer; -- (void) animationTimerFired:(NSTimer *)timer; -@end - -static float HowLong(AbsoluteTime * backUpTime) -{ - AbsoluteTime absTime; - Nanoseconds nanosec; - - absTime = SubAbsoluteFromAbsolute(UpTime(), *backUpTime); - nanosec = AbsoluteToNanoseconds(absTime); - //fprintf(stderr,"Time : %f\n", (float) UnsignedWideToUInt64( nanosec ) / 1000000000.0); - //fprintf(stderr,"FPS : %f\n", (float) 1000000000.0f/UnsignedWideToUInt64( nanosec )); - *backUpTime = UpTime(); - return (float) (1000000000.0f/UnsignedWideToUInt64( nanosec )); -} - -static void logGLError(int line) -{ - GLenum err = glGetError(); - char * code; - - if (err == GL_NO_ERROR) return; - - switch (err) - { - case GL_INVALID_ENUM: - code = "GL_INVALID_ENUM"; - break; - case GL_INVALID_VALUE: - code = "GL_INVALID_VALUE"; - break; - case GL_INVALID_OPERATION: - code = "GL_INVALID_OPERATION"; - break; - case GL_STACK_OVERFLOW: - code = "GL_STACK_OVERFLOW"; - break; - case GL_STACK_UNDERFLOW: - code = "GL_STACK_UNDERFLOW"; - break; - case GL_OUT_OF_MEMORY: - code = "GL_OUT_OF_MEMORY"; - break; - default: - code = "Unknown Error"; - break; - } - fprintf(stderr,"iGoom OpenGL error : %s", code); - -} - -@implementation AppController - --(void) awakeFromNib -{ - PluginInfo * goomInfos; - int i; - - goomInfos = [myGoom infos]; - - for (i=0; i < goomInfos->nbParams; i++) - { - NSTabViewItem * item = [[[NSTabViewItem alloc] initWithIdentifier:nil] autorelease]; - [item setLabel:[NSString stringWithCString:goomInfos->params[i].name]]; - [item setView:[[[GoomFXView alloc] initWithFrame:[TabView contentRect] andFX:goomInfos->params[i]] autorelease]]; - [TabView addTabViewItem:item]; - - // Create and load textures for the first time - //[GLView loadTextures:GL_TRUE]; - } - - //[self goFullScreen:self]; - isAnimating = NO; - lastFPS = 0.0f; - backUpTime=UpTime(); - FrameRate = 0.028f; // ~35 FPS - - if ([GLView canBeHQ]) - { - [HQButton setEnabled:YES]; - [QEWarning removeFromSuperview]; - } - - [self startAnimation]; -} - - -// Action method wired up to fire when the user clicks the "Go FullScreen" button. We remain in this method until the user exits FullScreen mode. -- (IBAction) goFullScreen:(id)sender -{ - CFAbsoluteTime timeNow; - CGLContextObj cglContext; - CGDisplayErr err; - long oldSwapInterval; - long newSwapInterval; - BOOL plugrunning = YES; - long rendererID; - - // Pixel Format Attributes for the FullScreen NSOpenGLContext - NSOpenGLPixelFormatAttribute attrs[] = { - - // Specify that we want a full-screen OpenGL context. - NSOpenGLPFAFullScreen, - - // We may be on a multi-display system (and each screen may be driven by a different renderer), - // so we need to specify which screen we want to take over. - // For this demo, we'll specify the main screen. - NSOpenGLPFAScreenMask, CGDisplayIDToOpenGLDisplayMask(kCGDirectMainDisplay), - - // Attributes Common to FullScreen and non-FullScreen - NSOpenGLPFAColorSize, 24, - NSOpenGLPFADepthSize, 16, - NSOpenGLPFADoubleBuffer, - NSOpenGLPFAAccelerated, - 0 - }; - - // Create the FullScreen NSOpenGLContext with the attributes listed above. - NSOpenGLPixelFormat *pixelFormat = [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs]; - if (pixelFormat == nil) { - NSLog(@"Failed to create 1st pixelFormat, trying another format..."); - NSOpenGLPixelFormatAttribute attrs2[] = { - NSOpenGLPFAFullScreen, - NSOpenGLPFAScreenMask, CGDisplayIDToOpenGLDisplayMask(kCGDirectMainDisplay), - 0 - }; - - // Create the FullScreen NSOpenGLContext with the attributes listed above. - NSOpenGLPixelFormat *pixelFormat = [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs2]; - if (pixelFormat == nil) { - NSLog(@"Failed to create 2nd pixelFormat, canceling full screen mode."); - return; - } - } - - // Just as a diagnostic, report the renderer ID that this pixel format binds to. - // CGLRenderers.h contains a list of known renderers and their corresponding RendererID codes. - [pixelFormat getValues:&rendererID forAttribute:NSOpenGLPFARendererID forVirtualScreen:0]; - - // Create an NSOpenGLContext with the FullScreen pixel format. - // By specifying the non-FullScreen context as our "shareContext", - // we automatically inherit all of the textures, display lists, and other OpenGL objects it has defined. - fullScreenContext = [[NSOpenGLContext alloc] initWithFormat:pixelFormat shareContext:[GLView openGLContext]]; - [pixelFormat release]; - pixelFormat = nil; - - if (fullScreenContext == nil) { - NSLog(@"Failed to create fullScreenContext"); - return; - } - - // Pause animation in the OpenGL view. - // While we're in full-screen mode, we'll drive the animation actively instead of using a timer callback. - if ([self isAnimating]) { - [self stopAnimationTimer]; - } - - // Take control of the display where we're about to go FullScreen. - err = CGCaptureAllDisplays(); - if (err != CGDisplayNoErr) { - [fullScreenContext release]; - fullScreenContext = nil; - return; - } - - // Enter FullScreen mode and make our FullScreen context the active context for OpenGL commands. - [fullScreenContext setFullScreen]; - [fullScreenContext makeCurrentContext]; - - // Save the current swap interval so we can restore it later, and then set the new swap interval to lock us to the display's refresh rate. - cglContext = CGLGetCurrentContext(); - CGLGetParameter(cglContext, kCGLCPSwapInterval, &oldSwapInterval); - newSwapInterval = 1; - CGLSetParameter(cglContext, kCGLCPSwapInterval, &newSwapInterval); - - // Tell the myGoom the dimensions of the area it's going to render to, so it can set up an appropriate viewport and viewing transformation. - [myGoom setSize:NSMakeSize(CGDisplayPixelsWide(kCGDirectMainDisplay), CGDisplayPixelsHigh(kCGDirectMainDisplay))]; - - // Now that we've got the screen, we enter a loop in which we alternately process input events and computer and render the next frame of our animation. The shift here is from a model in which we passively receive events handed to us by the AppKit to one in which we are actively driving event processing. - timeBefore = CFAbsoluteTimeGetCurrent(); - stayInFullScreenMode = YES; - while (stayInFullScreenMode) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - - // Check for and process input events. - NSEvent *event; - while (event = [NSApp nextEventMatchingMask:NSAnyEventMask untilDate:[NSDate distantPast] inMode:NSDefaultRunLoopMode dequeue:YES]) { - switch ([event type]) { - case NSLeftMouseDown: - [self mouseDown:event]; - break; - - case NSLeftMouseUp: - plugrunning = plugrunning?NO:YES; - [self mouseUp:event]; - break; - - case NSRightMouseUp: - plugrunning = plugrunning?NO:YES; - break; - - case NSLeftMouseDragged: - [self mouseDragged:event]; - break; - - case NSKeyDown: - [self keyDown:event]; - break; - - default: - break; - } - } - - // Render a frame, and swap the front and back buffers. - timeNow = CFAbsoluteTimeGetCurrent(); - if ((timeNow-timeBefore) >= FrameRate) - { - timeBefore = timeNow; - if (plugrunning==YES) { - [myGoom render]; - [fullScreenContext flushBuffer]; - } - } - - - // Clean up any autoreleased objects that were created this time through the loop. - [pool release]; - } - - // Clear the front and back framebuffers before switching out of FullScreen mode. (This is not strictly necessary, but avoids an untidy flash of garbage.) - glClearColor(0.0, 0.0, 0.0, 0.0); - glClear(GL_COLOR_BUFFER_BIT); - [fullScreenContext flushBuffer]; - glClear(GL_COLOR_BUFFER_BIT); - [fullScreenContext flushBuffer]; - - // Restore the previously set swap interval. - CGLSetParameter(cglContext, kCGLCPSwapInterval, &oldSwapInterval); - - // Exit fullscreen mode and release our FullScreen NSOpenGLContext. - [NSOpenGLContext clearCurrentContext]; - [fullScreenContext clearDrawable]; - [fullScreenContext release]; - fullScreenContext = nil; - - // Release control of the display. - CGReleaseAllDisplays(); - - // Reset the size to the window size - [myGoom setSize:[GLView frame].size]; - - // Mark our view as needing drawing. (The animation has advanced while we were in FullScreen mode, so its current contents are stale.) - [GLView setNeedsDisplay:YES]; - - // Resume animation timer firings. - if ([self isAnimating]) { - [self startAnimationTimer]; - } -} - -- (IBAction) setHighQuality:(id)sender -{ - [myGoom setHighQuality:([sender state]==NSOnState)]; -} - -- (IBAction) setFrameRate:(id)sender -{ - FrameRate = 1.0f/[sender floatValue]; - [self stopAnimation]; - [self startAnimation]; -} - -- (void) keyDown:(NSEvent *)event -{ - unichar c = [[event charactersIgnoringModifiers] characterAtIndex:0]; - switch (c) { - - // [Esc] exits FullScreen mode. - case 27: - stayInFullScreenMode = NO; - break; - - // [space] toggles rotation of the globe. - case 32: - [self toggleAnimation]; - break; - - case 'l': - case 'L': - [myGoom setHighQuality:NO]; - break; - - case 'h': - case 'H': - [myGoom setHighQuality:YES]; - break; - - default: - break; - } -} -/* -- (void)mouseDown:(NSEvent *)theEvent -{ - BOOL wasAnimating = [self isAnimating]; - BOOL dragging = YES; - NSPoint windowPoint; - NSPoint lastWindowPoint = [theEvent locationInWindow]; - float dx, dy; - - if (wasAnimating) { - [self stopAnimation]; - } - while (dragging) { - theEvent = [[GLView window] nextEventMatchingMask:NSLeftMouseUpMask | NSLeftMouseDraggedMask]; - windowPoint = [theEvent locationInWindow]; - switch ([theEvent type]) { - case NSLeftMouseUp: - dragging = NO; - break; - - case NSLeftMouseDragged: - dx = windowPoint.x - lastWindowPoint.x; - dy = windowPoint.y - lastWindowPoint.y; - lastWindowPoint = windowPoint; - - // Render a frame. - if (fullScreenContext) { - [myGoom render]; - [fullScreenContext flushBuffer]; - } else { - [GLView display]; - } - break; - - default: - break; - } - } - if (wasAnimating) { - [self startAnimation]; - timeBefore = CFAbsoluteTimeGetCurrent(); - } -} -*/ -- (BOOL) isInFullScreenMode -{ - return fullScreenContext != nil; -} - -@end - -@implementation AppController (AnimationMethods) - -- (BOOL) isAnimating -{ - return isAnimating; -} - -- (void) startAnimation -{ - if (!isAnimating) { - isAnimating = YES; - if (![self isInFullScreenMode]) - { - [self startAnimationTimer]; - } - } -} - -- (void) stopAnimation -{ - if (isAnimating) { - if (animationTimer != nil) { - [self stopAnimationTimer]; - } - isAnimating = NO; - } -} - -- (void) toggleAnimation -{ - if ([self isAnimating]) [self stopAnimation]; - else [self startAnimation]; -} - -- (void) startAnimationTimer -{ - if (animationTimer == nil) { - animationTimer = [[NSTimer scheduledTimerWithTimeInterval:FrameRate target:self selector:@selector(animationTimerFired:) userInfo:nil repeats:YES] retain]; - } -} - -- (void) stopAnimationTimer -{ - if (animationTimer != nil) { - [animationTimer invalidate]; - [animationTimer release]; - animationTimer = nil; - } -} - -- (void) animationTimerFired:(NSTimer *)timer -{ - lastFPS = (HowLong(&backUpTime) + lastFPS) * 0.5f; - [FPSCounter setStringValue:[NSString stringWithFormat:@"%d/%d FPS",(int)lastFPS,(int)(1.0f/FrameRate)]]; - [GLView setNeedsDisplay:YES]; -} - -// TAB VIEW DELEGATE -- (void)tabView:(NSTabView *)tabView didSelectTabViewItem:(NSTabViewItem *)tabViewItem -{ - NSRect frame = [PrefWin frame]; - float height; - if(![[tabViewItem identifier] isEqual:@"maintab"]) height = ((GoomFXView*)[tabViewItem view])->height; - else height = 356.0f; - height += 20.0f; - frame.origin.y -= height-frame.size.height; - frame.size.height = height; - [PrefWin setFrame:frame display:YES animate:YES]; -} - -@end diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/StandAlone/CoreAudioDevice.cpp kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/StandAlone/CoreAudioDevice.cpp --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/StandAlone/CoreAudioDevice.cpp 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/StandAlone/CoreAudioDevice.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,126 +0,0 @@ -/* - * CoreAudioDevice.cpp - * iGoom - * - * Created by Guillaume Borios on 14/01/05. - * Copyright 2005 iOS Software. All rights reserved. - * - */ - -#include "CoreAudioDevice.h" - - -CoreAudioDevice::CoreAudioDevice(AudioDeviceID devId):deviceID(devId) {} - -CoreAudioDevice::~CoreAudioDevice() {} - - -CFStringRef CoreAudioDevice::name() const -{ - CFStringRef nom; - try - { - UInt32 size = sizeof(CFStringRef); - propertyData(0, kAudioDeviceSectionGlobal, kAudioDevicePropertyDeviceNameCFString, size, &nom); - } - catch(...) - { - nom = CFSTR(""); - } - return nom; -} - -UInt32 CoreAudioDevice::propertyDataSize(UInt32 channel, CoreAudioDeviceSection section, AudioHardwarePropertyID property) const -{ - UInt32 size = 0; - if (AudioDeviceGetPropertyInfo(deviceID, channel, section, property, &size, NULL) != 0) - { - fprintf(stderr,"Error while fetching audio device property size. Exiting."); - exit(0); - } - return size; -} - -void CoreAudioDevice::propertyData(UInt32 channel, CoreAudioDeviceSection section, AudioHardwarePropertyID property, UInt32 &size, void* data) const -{ - AudioDeviceGetProperty(deviceID, channel, section, property, &size, data) != 0; -} - -void CoreAudioDevice::setPropertyData(UInt32 channel, CoreAudioDeviceSection section, AudioHardwarePropertyID property, UInt32 inDataSize, const void* data) -{ - OSStatus theError = AudioDeviceSetProperty(deviceID, NULL, channel, section, property, inDataSize, data); - //if (theError) fprintf(stderr,"Error"); -} - -UInt32 CoreAudioDevice::numberOfChannels(CoreAudioDeviceSection section) const -{ - UInt32 n = 0; - UInt32 size = propertyDataSize(0, section, kAudioDevicePropertyStreamConfiguration); - AudioBufferList* bufList=(AudioBufferList*)malloc(size); - - propertyData(0, section, kAudioDevicePropertyStreamConfiguration, size, bufList); - for(UInt32 i = 0; i < bufList->mNumberBuffers; ++i) - { - n += bufList->mBuffers[i].mNumberChannels; - } - free(bufList); - return n; -} - -pid_t CoreAudioDevice::hogModeOwner() const -{ - pid_t retour = 0; - UInt32 size = sizeof(pid_t); - propertyData(0, kAudioDeviceSectionInput, kAudioDevicePropertyHogMode, size, &retour); - return retour; -} - - -void CoreAudioDevice::AddPropertyListener(UInt32 inChannel, CoreAudioDeviceSection inSection, AudioHardwarePropertyID inPropertyID, AudioDevicePropertyListenerProc inListenerProc, void* inClientData) -{ - if (AudioDeviceAddPropertyListener(deviceID, inChannel, inSection, inPropertyID, inListenerProc, inClientData) != 0) - { - fprintf(stderr,"Error while Installing device notifications listener. Exiting."); - exit(0); - } -} - -void CoreAudioDevice::RemovePropertyListener(UInt32 inChannel, CoreAudioDeviceSection inSection, AudioHardwarePropertyID inPropertyID, AudioDevicePropertyListenerProc inListenerProc) -{ - if (AudioDeviceRemovePropertyListener(deviceID, inChannel, inSection, inPropertyID, inListenerProc) !=0) - { - //fprintf(stderr,"Error while Removing device notifications listener. Exiting."); - //exit(0); - } -} - -// *************************************** VOLUME CONTROL *************************************** - -bool CoreAudioDevice::HasVolumeControl(UInt32 channel, CoreAudioDeviceSection section) const -{ - OSStatus theError = AudioDeviceGetPropertyInfo(deviceID, channel, section, kAudioDevicePropertyVolumeScalar, NULL, NULL); - return (theError == 0); -} - -bool CoreAudioDevice::VolumeControlIsSettable(UInt32 channel, CoreAudioDeviceSection section) const -{ - Boolean isWritable = false; - OSStatus theError = AudioDeviceGetPropertyInfo(deviceID, channel, section, kAudioDevicePropertyVolumeScalar, NULL, &isWritable); - return (isWritable != 0); -} - -Float32 CoreAudioDevice::GetVolumeControlScalarValue(UInt32 channel, CoreAudioDeviceSection section) const -{ - Float32 value = 0.0; - UInt32 size = sizeof(Float32); - propertyData(channel, section, kAudioDevicePropertyVolumeScalar, size, &value); - return value; -} - -void CoreAudioDevice::SetVolumeControlScalarValue(UInt32 channel, CoreAudioDeviceSection section, Float32 value) -{ - UInt32 size = sizeof(Float32); - setPropertyData(channel, section, kAudioDevicePropertyVolumeScalar, size, &value); -} - - diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/StandAlone/CoreAudioDevice.h kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/StandAlone/CoreAudioDevice.h --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/StandAlone/CoreAudioDevice.h 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/StandAlone/CoreAudioDevice.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,53 +0,0 @@ -/* - * CoreAudioDevice.h - * iGoom - * - * Created by Guillaume Borios on 14/01/05. - * Copyright 2005 iOS Software. All rights reserved. - * - */ - -#include -#include - -#ifndef COREAUDIODEVICE -#define COREAUDIODEVICE - -typedef UInt8 CoreAudioDeviceSection; -#define kAudioDeviceSectionInput ((CoreAudioDeviceSection)0x01) -#define kAudioDeviceSectionOutput ((CoreAudioDeviceSection)0x00) -#define kAudioDeviceSectionGlobal ((CoreAudioDeviceSection)0x00) -#define kAudioDeviceSectionWildcard ((CoreAudioDeviceSection)0xFF) - -class CoreAudioDevice -{ - -public: - CoreAudioDevice(AudioDeviceID devId); - ~CoreAudioDevice(); - - AudioDeviceID getDeviceID() const { return deviceID; } - CFStringRef name() const; - - UInt32 propertyDataSize(UInt32 channel, CoreAudioDeviceSection section, AudioHardwarePropertyID property) const; - void propertyData(UInt32 channel, CoreAudioDeviceSection section, AudioHardwarePropertyID property, UInt32 &size, void* data) const; - void setPropertyData(UInt32 channel, CoreAudioDeviceSection section, AudioHardwarePropertyID property, UInt32 inDataSize, const void* data); - - UInt32 numberOfChannels(CoreAudioDeviceSection section) const; - - pid_t hogModeOwner() const; - - void AddPropertyListener(UInt32 inChannel, CoreAudioDeviceSection inSection, AudioHardwarePropertyID inPropertyID, AudioDevicePropertyListenerProc inListenerProc, void* inClientData); - void RemovePropertyListener(UInt32 inChannel, CoreAudioDeviceSection inSection, AudioHardwarePropertyID inPropertyID, AudioDevicePropertyListenerProc inListenerProc); - - bool CoreAudioDevice::HasVolumeControl(UInt32 channel, CoreAudioDeviceSection section) const; - bool CoreAudioDevice::VolumeControlIsSettable(UInt32 channel, CoreAudioDeviceSection section) const; - Float32 CoreAudioDevice::GetVolumeControlScalarValue(UInt32 channel, CoreAudioDeviceSection section) const; - void CoreAudioDevice::SetVolumeControlScalarValue(UInt32 channel, CoreAudioDeviceSection section, Float32 value); - -private: - AudioDeviceID deviceID; -}; - - -#endif /* COREAUDIODEVICE */ \ No newline at end of file diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/StandAlone/CoreAudioHardware.cpp kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/StandAlone/CoreAudioHardware.cpp --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/StandAlone/CoreAudioHardware.cpp 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/StandAlone/CoreAudioHardware.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,70 +0,0 @@ -/* - * CoreAudioHardware.cpp - * iGoom - * - * Created by Guillaume Borios on 14/01/05. - * Copyright 2005 iOS Software. All rights reserved. - * - */ - -#include "CoreAudioHardware.h" -#include -#include - -UInt32 CoreAudioHardware::numberOfDevices() -{ - return ( propertyDataSize(kAudioHardwarePropertyDevices) / sizeof(AudioDeviceID) ); -} - -AudioDeviceID CoreAudioHardware::deviceAtIndex(unsigned int i) -{ - AudioDeviceID devID = 0; - int n = numberOfDevices(); - if((n > 0) && (i < n)) - { - UInt32 size = n * sizeof(AudioDeviceID); - AudioDeviceID * list = (AudioDeviceID *)malloc(size); - propertyData(kAudioHardwarePropertyDevices, size, list); - devID = list[i]; - free(list); - } - return devID; -} - -UInt32 CoreAudioHardware::propertyDataSize(AudioHardwarePropertyID property) -{ - UInt32 size = 0; - if (AudioHardwareGetPropertyInfo(property, &size, NULL) != 0) - { - fprintf(stderr,"Error while fetching audio property size. Exiting."); - exit(0); - } - return size; -} - -void CoreAudioHardware::propertyData(AudioHardwarePropertyID property, UInt32 &size, void *data) -{ - if (AudioHardwareGetProperty(property, &size, data) != 0) - { - fprintf(stderr,"Error while fetching audio property. Exiting."); - exit(0); - } -} - -void CoreAudioHardware::AddPropertyListener(AudioHardwarePropertyID property, AudioHardwarePropertyListenerProc proc, void* data) -{ - if (AudioHardwareAddPropertyListener(property, proc, data)!= 0) - { - fprintf(stderr,"Error could not add a property listener. Exiting."); - exit(0); - } -} - -void CoreAudioHardware::RemovePropertyListener(AudioHardwarePropertyID property, AudioHardwarePropertyListenerProc proc) -{ - if (AudioHardwareRemovePropertyListener(property, proc)!= 0) - { - fprintf(stderr,"Error could not remove a property listener. Exiting."); - exit(0); - } -} diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/StandAlone/CoreAudioHardware.h kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/StandAlone/CoreAudioHardware.h --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/StandAlone/CoreAudioHardware.h 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/StandAlone/CoreAudioHardware.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,29 +0,0 @@ -/* - * CoreAudioHardware.h - * iGoom - * - * Created by Guillaume Borios on 14/01/05. - * Copyright 2005 iOS Software. All rights reserved. - * - */ - -#include - - -#ifndef COREAUDIOHARDWARE -#define COREAUDIOHARDWARE - -class CoreAudioHardware -{ -public: - static UInt32 numberOfDevices(); - static AudioDeviceID deviceAtIndex(unsigned int i); -public: - static UInt32 propertyDataSize(AudioHardwarePropertyID property); - static void propertyData(AudioHardwarePropertyID property, UInt32 &size, void *data); - static void AddPropertyListener(AudioHardwarePropertyID property, AudioHardwarePropertyListenerProc listenerProc, void* inClientData); - static void RemovePropertyListener(AudioHardwarePropertyID property, AudioHardwarePropertyListenerProc listenerProc); - -}; - -#endif /*COREAUDIOHARDWARE*/ diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/StandAlone/English.lproj/InfoPlist.strings kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/StandAlone/English.lproj/InfoPlist.strings --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/StandAlone/English.lproj/InfoPlist.strings 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/StandAlone/English.lproj/InfoPlist.strings 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ -/* Localized versions of Info.plist keys */ - -CFBundleName = "iGoom"; -CFBundleShortVersionString = "2.0"; -CFBundleGetInfoString = "iGoom version 2.0, Copyright 2001~2005, iOS-Software.\nhttp://www.ios-software.com/"; -NSHumanReadableCopyright = "Copyright 2001~2005, iOS-Software.\nhttp://www.ios-software.com/"; -CFBundleVersion = "2.0"; diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/StandAlone/English.lproj/MainMenu.nib/classes.nib kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/StandAlone/English.lproj/MainMenu.nib/classes.nib --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/StandAlone/English.lproj/MainMenu.nib/classes.nib 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/StandAlone/English.lproj/MainMenu.nib/classes.nib 1970-01-01 00:00:00.000000000 +0000 @@ -1,44 +0,0 @@ -{ - IBClasses = ( - { - ACTIONS = {goFullScreen = id; setFrameRate = id; setHighQuality = id; }; - CLASS = AppController; - LANGUAGE = ObjC; - OUTLETS = { - FPSCounter = NSTextField; - GLView = MainOpenGLView; - HQButton = NSButton; - PrefWin = NSWindow; - QEWarning = NSTextField; - TabView = NSTabView; - myGoom = Goom; - }; - SUPERCLASS = NSResponder; - }, - {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, - {CLASS = Goom; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, - { - ACTIONS = { - clientStorage = id; - frameRate = id; - rectTextures = id; - setFullscreen = id; - textureHint = id; - textureRange = id; - }; - CLASS = MainOpenGLView; - LANGUAGE = ObjC; - OUTLETS = {StartingView = NSView; myGoom = Goom; sizeField = NSTextField; }; - SUPERCLASS = NSOpenGLView; - }, - {CLASS = MyApplication; LANGUAGE = ObjC; SUPERCLASS = NSApplication; }, - { - ACTIONS = {changeAudioDevice = id; changeAudioVolume = id; }; - CLASS = SoundSampler; - LANGUAGE = ObjC; - OUTLETS = {ODeviceList = NSPopUpButton; OSoundVolume = NSSlider; }; - SUPERCLASS = NSObject; - } - ); - IBVersion = 1; -} \ No newline at end of file diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/StandAlone/English.lproj/MainMenu.nib/info.nib kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/StandAlone/English.lproj/MainMenu.nib/info.nib --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/StandAlone/English.lproj/MainMenu.nib/info.nib 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/StandAlone/English.lproj/MainMenu.nib/info.nib 1970-01-01 00:00:00.000000000 +0000 @@ -1,23 +0,0 @@ - - - - - IBDocumentLocation - 46 72 356 295 0 0 1024 746 - IBEditorPositions - - 29 - 43 545 183 44 0 0 1280 1002 - - IBFramework Version - 364.0 - IBOpenObjects - - 29 - 508 - 21 - - IBSystem Version - 7S215 - - Binary files /tmp/tmpPt54Nf/VKyUZvMq5a/kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/StandAlone/English.lproj/MainMenu.nib/keyedobjects.nib and /tmp/tmpPt54Nf/jSnkFgw56d/kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/StandAlone/English.lproj/MainMenu.nib/keyedobjects.nib differ diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/StandAlone/French.lproj/Localizable.strings kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/StandAlone/French.lproj/Localizable.strings --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/StandAlone/French.lproj/Localizable.strings 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/StandAlone/French.lproj/Localizable.strings 1970-01-01 00:00:00.000000000 +0000 @@ -1,14 +0,0 @@ -//---------------------------------------------------------------------------// -// -// Localizable.strings -// iGoom StandAlone Project -// -// Copyright (c) 2002-2003 iOS. All rights reserved. -// -//---------------------------------------------------------------------------// - -/* */ -"" = ""; - -/* Audio Input Devices */ -"Built-in Audio" = "Audio intégré"; diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/StandAlone/GoomFXParam.h kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/StandAlone/GoomFXParam.h --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/StandAlone/GoomFXParam.h 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/StandAlone/GoomFXParam.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,26 +0,0 @@ -// -// GoomFXParam.h -// iGoom copie -// -// Created by Guillaume Borios on Sun Jul 20 2003. -// Copyright (c) 2003 iOS. All rights reserved. -// - -#import - -#include "src/goom.h" - -@interface GoomFXParam : NSObject { - PluginParam * parametres; - NSProgressIndicator * progress; - NSSlider * slider; - NSButton * button; - - NSTextField * value; -} - -- (GoomFXParam*)initWithParam:(PluginParam*)p; -- (NSView*)makeViewAtHeight:(float)h; -- (void)setValue:(id)sender; - -@end diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/StandAlone/GoomFXParam.m kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/StandAlone/GoomFXParam.m --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/StandAlone/GoomFXParam.m 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/StandAlone/GoomFXParam.m 1970-01-01 00:00:00.000000000 +0000 @@ -1,213 +0,0 @@ -// -// GoomFXParam.m -// iGoom copie -// -// Created by Guillaume Borios on Sun Jul 20 2003. -// Copyright (c) 2003 iOS. All rights reserved. -// - -#import "GoomFXParam.h" - -NSMutableDictionary * paramlist = nil; - -void goom_input_stub(PluginParam *_this) -{ - [(GoomFXParam*)[paramlist objectForKey:[NSString stringWithFormat:@"%p",_this]] setValue:nil]; -} - -@implementation GoomFXParam - -- (GoomFXParam*)initWithParam:(PluginParam*)p -{ - self = [super init]; - - if (self) - { - parametres = p; - if (paramlist == nil) paramlist = [[NSMutableDictionary alloc] init]; - [paramlist setObject:self forKey:[NSString stringWithFormat:@"%p",p]]; - } - return self; -} - -- (void)setValue:(id)sender -{ - - switch (parametres->type) - { - case PARAM_INTVAL: - if (parametres->rw == TRUE) - { - if (sender) - { - parametres->param.ival.value = [sender intValue]; - parametres->changed(parametres); - } - else [slider setIntValue:parametres->param.ival.value]; - [value setIntValue:parametres->param.ival.value]; - } - else - { - [progress setDoubleValue:(double)parametres->param.ival.value]; - } - break; - case PARAM_FLOATVAL: - if (parametres->rw == TRUE) - { - if (sender) - { - parametres->param.fval.value = (float)[sender doubleValue]; - parametres->changed(parametres); - } - else [slider setDoubleValue:(double)parametres->param.fval.value]; - [value setDoubleValue:(double)parametres->param.fval.value]; - } - else - { - [progress setDoubleValue:(double)parametres->param.fval.value]; - } - break; - case PARAM_BOOLVAL: - if ((parametres->rw == TRUE) && (sender != nil)) - { - parametres->param.bval.value = ([sender state]==NSOnState); - parametres->changed(parametres); - } - else - { - [button setState:(parametres->param.bval.value == YES)?NSOnState:NSOffState]; - } - break; - case PARAM_STRVAL: - break; - case PARAM_LISTVAL: - break; - default: - break; - } -} - -- (NSView*)makeViewAtHeight:(float)h -{ - NSView * container; - NSTextField * text; - - container = [[NSView alloc] initWithFrame:NSMakeRect(20,h,420,25)]; - - if (parametres->type != PARAM_BOOLVAL) - { - text = [[NSTextField alloc] initWithFrame:NSMakeRect(0,5,214,15)]; - [text setStringValue:[NSString stringWithCString:parametres->name]]; - [text setDrawsBackground:NO]; - [text setSelectable:NO]; - [text setEditable:NO]; - [text setBordered:NO]; - [container addSubview:[text autorelease]]; - } - - - if (parametres->rw == TRUE) - { - switch (parametres->type) - { - case PARAM_INTVAL: - case PARAM_FLOATVAL: - // Value text field - value = [[NSTextField alloc] initWithFrame:NSMakeRect(374,5,214,15)]; - [value setDrawsBackground:NO]; - [value setSelectable:NO]; - [value setEditable:NO]; - [value setBordered:NO]; - - [container addSubview:[value autorelease]]; - //slider - slider = [[NSSlider alloc] initWithFrame:NSMakeRect(222,2,144,20)]; - [slider setAction:@selector(setValue:)]; - [slider setTickMarkPosition:NSTickMarkAbove]; - [slider setTarget:self]; - [container addSubview:[slider autorelease]]; - //values - if (parametres->type == PARAM_INTVAL) - { - [value setIntValue:parametres->param.ival.value]; - [slider setMaxValue:(double)parametres->param.ival.max]; - [slider setMinValue:(double)parametres->param.ival.min]; - [slider setIntValue:parametres->param.ival.value]; - } - else - { - [value setDoubleValue:parametres->param.fval.value]; - [[value cell] setFloatingPointFormat:YES left:1 right:1]; - [slider setMaxValue:(double)parametres->param.fval.max]; - [slider setMinValue:(double)parametres->param.fval.min]; - [slider setDoubleValue:(double)parametres->param.fval.value]; - } - break; - case PARAM_BOOLVAL: - button = [[NSButton alloc] initWithFrame:NSMakeRect(0,2,344,18)]; - [button setEnabled:YES]; - [button setState:(parametres->param.bval.value == YES)?NSOnState:NSOffState]; - [button setTitle:[NSString stringWithCString:parametres->name]]; - [button setButtonType:NSSwitchButton]; - [button setTransparent:NO]; - [button setTarget:self]; - [button setAction:@selector(setValue:)]; - [container addSubview:[button autorelease]]; - break; - case PARAM_STRVAL: - NSLog(@"PARAM_STRVAL rw not implemented"); - break; - case PARAM_LISTVAL: - NSLog(@"PARAM_LISTVAL rw not implemented"); - break; - default: - break; - } - } - else - { - switch (parametres->type) - { - case PARAM_INTVAL: - //slider - progress = [[NSProgressIndicator alloc] initWithFrame:NSMakeRect(222,7,144,10)]; - [progress setMaxValue:(double)parametres->param.ival.max]; - [progress setMinValue:(double)parametres->param.ival.min]; - [progress setDoubleValue:(double)parametres->param.ival.value]; - [progress setIndeterminate:NO]; - [container addSubview:[progress autorelease]]; - break; - case PARAM_FLOATVAL: - //slider - progress = [[NSProgressIndicator alloc] initWithFrame:NSMakeRect(222,7,144,10)]; - [progress setMaxValue:(double)parametres->param.fval.max]; - [progress setMinValue:(double)parametres->param.fval.min]; - [progress setDoubleValue:(double)parametres->param.fval.value]; - [progress setIndeterminate:NO]; - [container addSubview:[progress autorelease]]; - break; - case PARAM_BOOLVAL: - button = [[NSButton alloc] initWithFrame:NSMakeRect(0,2,344,18)]; - [button setEnabled:NO]; - [button setState:(parametres->param.bval.value == YES)?NSOnState:NSOffState]; - [button setTitle:[NSString stringWithCString:parametres->name]]; - [button setButtonType:NSSwitchButton]; - [button setTransparent:NO]; - [container addSubview:[button autorelease]]; - break; - case PARAM_STRVAL: - NSLog(@"PARAM_STRVAL ro not implemented"); - break; - case PARAM_LISTVAL: - NSLog(@"PARAM_LISTVAL ro not implemented"); - break; - default: - break; - } - parametres->change_listener = goom_input_stub; - } - - return [container autorelease]; -} - -@end diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/StandAlone/GoomFXView.h kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/StandAlone/GoomFXView.h --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/StandAlone/GoomFXView.h 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/StandAlone/GoomFXView.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,22 +0,0 @@ -// -// GoomFXView.h -// iGoom copie -// -// Created by Guillaume Borios on Sun Jul 20 2003. -// Copyright (c) 2003 iOS. All rights reserved. -// - -#import - -#include "src/goom.h" - -@interface GoomFXView : NSTabView { - - NSMutableArray * params; - @public - float height; -} - -- (id)initWithFrame:(NSRect)frame andFX:(PluginParameters)FX ; - -@end diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/StandAlone/GoomFXView.m kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/StandAlone/GoomFXView.m --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/StandAlone/GoomFXView.m 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/StandAlone/GoomFXView.m 1970-01-01 00:00:00.000000000 +0000 @@ -1,65 +0,0 @@ -// -// GoomFXView.m -// iGoom copie -// -// Created by Guillaume Borios on Sun Jul 20 2003. -// Copyright (c) 2003 iOS. All rights reserved. -// - -#import "GoomFXView.h" -#import "GoomFXParam.h" - - -@implementation GoomFXView - -- (id)initWithFrame:(NSRect)frame andFX:(PluginParameters)FX { - self = [super initWithFrame:frame]; - if (self) { - int i; - height = 15.0f; - params = [[NSMutableArray alloc] init]; - for (i=0; i < FX.nbParams; i++) - { - if (FX.params[i] != NULL) - { - GoomFXParam * FXP = [[[GoomFXParam alloc]initWithParam:FX.params[i]]autorelease]; - [params addObject:FXP]; - [self addSubview:[FXP makeViewAtHeight:height]]; - height += 29.0f; - } - else - { - height += 12.0f; - } - } - } - - height += 73.0f; - - return self; -} - -- (void)resizeWindow -{ - NSWindow * parent = [self window]; - NSRect frame = [parent frame]; - if (frame.size.height != height) - { - frame.origin.y -= height-frame.size.height; - frame.size.height = height; - [parent setFrame:frame display:NO animate:NO]; - } -} - -- (void)drawRect:(NSRect)rect { - // Drawing code here. -} - --(void)dealloc -{ - [params release]; - - [super dealloc]; -} - -@end diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/StandAlone/Goom.h kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/StandAlone/Goom.h --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/StandAlone/Goom.h 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/StandAlone/Goom.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,46 +0,0 @@ -// -// Goom.h -// iGoom -// -// Created by Guillaume Borios on Sat Dec 20 2003. -// Copyright (c) 2003 iOS. All rights reserved. -// - -#import -#import -#import -#include -#include "src/goom.h" - -@interface Goom : NSObject { - - PluginInfo * goomInfos; - - gint16 sndData[2][512]; - - GLuint textureName; - AbsoluteTime backUpTime; - - GLenum texture_hint; - GLboolean client_storage; - - NSSize curSize; - BOOL HQ; - BOOL dirty; -} - -- (void)setSize:(NSSize)_size; - -- (PluginInfo*)infos; - --(void)render; - --(void)setHighQuality:(BOOL)quality; -- (void)prepareTextures; - -- (guint32 *)getGoomDataWithFPS:(float)fps; - --(void)setTextureHint:(GLenum)hint; --(void)clientStorage:(GLboolean)client; - -@end diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/StandAlone/Goom.m kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/StandAlone/Goom.m --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/StandAlone/Goom.m 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/StandAlone/Goom.m 1970-01-01 00:00:00.000000000 +0000 @@ -1,294 +0,0 @@ -// -// Goom.m -// iGoom -// -// Created by Guillaume Borios on Sat Dec 20 2003. -// Copyright (c) 2003 iOS. All rights reserved. -// - -#import "Goom.h" -#import -#include -#import "SoundSampler.h" - -@implementation Goom - -unsigned int IMAGE_SIZE(NSSize curSize) -{ - int retour = (1<<(int)(log((curSize.width>curSize.height)?curSize.width:curSize.height)/log(2.0f))); - if (retour > 512) retour = 512; - return retour; -} - --(Goom*)init -{ - self = [super init]; - - if (self != nil) - { - curSize = NSMakeSize(16,16); - HQ = NO; - dirty = YES; - goomInfos = goom_init(16,16); - backUpTime = UpTime(); - - client_storage = GL_TRUE; - texture_hint = GL_STORAGE_SHARED_APPLE; - } - //NSLog(@"Goom Init"); - return self; -} - --(Goom*)initWithSize:(NSSize)_size -{ - self = [super init]; - - if (self != nil) - { - curSize = _size; - HQ = NO; - dirty = YES; - backUpTime = UpTime(); - } - //NSLog(@"Goom Init with Size : %f x %f",_size.width,_size.height); - return self; -} - -- (PluginInfo*)infos -{ - return goomInfos; -} - --(void)setSize:(NSSize)_size -{ - if ((curSize.width != _size.width) || (curSize.height != _size.height)) - { - //NSLog(@"Set size (%f,%f)",_size.width, _size.height); - curSize = _size; - dirty = YES; - } -} - --(void)render -{ - if (dirty==YES) [self prepareTextures]; - - //glClear(0); - - // Bind, update and draw new image - if(HQ==YES) - { - //NSLog(@"Render HQ (%f,%f)",curSize.width, curSize.height); - - glEnable(GL_TEXTURE_RECTANGLE_EXT); - - glBindTexture(GL_TEXTURE_RECTANGLE_EXT, textureName); - glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, 1); - glTexSubImage2D(GL_TEXTURE_RECTANGLE_EXT, 0, 0, 0, curSize.width, curSize.height, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, [self getGoomDataWithFPS:0]); - - glBegin(GL_QUADS); - glTexCoord2f(0.0f, 0.0f); - glVertex2f(-1.0f, 1.0f); - glTexCoord2f(0.0f, curSize.height); - glVertex2f(-1.0f, -1.0f); - glTexCoord2f(curSize.width, curSize.height); - glVertex2f(1.0f, -1.0f); - glTexCoord2f(curSize.width, 0.0f); - glVertex2f(1.0f, 1.0f); - glEnd(); - - glDisable(GL_TEXTURE_RECTANGLE_EXT); - - } - else - { - int loggedSize = IMAGE_SIZE(curSize); - float ratio = curSize.width/curSize.height; - - //NSLog(@"Render LQ (%f,%f / %d)",curSize.width, curSize.height,IMAGE_SIZE(curSize)); - - glEnable(GL_TEXTURE_2D); - - //glColor4f(0.0, 0.5, 0.1, 0.0); - glBindTexture(GL_TEXTURE_2D, textureName); - glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, 1); - glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, loggedSize, loggedSize, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, [self getGoomDataWithFPS:0]); - - //glShadeModel(GL_SMOOTH); - - glBegin(GL_POLYGON); - - if (ratio>1.0f) - { - float o=0.5f-0.5f/ratio; - float y=1.0f/ratio+o; - //glColor4f(0.0, 0.5, 0.1, 1.0); - glTexCoord2f(0.0f, o); - glVertex2f(-1.0f, 1.0f); - //glColor4f(0.3, 0.5, 0.1, 0.5); - glTexCoord2f(0.0f, y); - glVertex2f(-1.0f, -1.0f); - //glColor4f(0.6, 0.5, 0.1, 0.2); - glTexCoord2f(1.0f, y); - glVertex2f(1.0f, -1.0f); - //glColor4f(0.9, 0.5, 0.1, 0.0); - glTexCoord2f(1.0f, o); - glVertex2f(1.0f, 1.0f); - } - else - { - float o=0.5f-0.5f*ratio; - float x=ratio+o; - //glColor4f(0.0, 0.5, 0.1, 1.0); - glTexCoord2f(o, 0.0f); - glVertex2f(-1.0f, 1.0f); - //glColor4f(0.3, 0.5, 0.1, 0.5); - glTexCoord2f(o, 1.0f); - glVertex2f(-1.0f, -1.0f); - //glColor4f(0.6, 0.5, 0.1, 0.2); - glTexCoord2f(x, 1.0f); - glVertex2f(1.0f, -1.0f); - //glColor4f(0.9, 0.5, 0.1, 0.0); - glTexCoord2f(x, 0.0f); - glVertex2f(1.0f, 1.0f); - } - - glEnd(); - - glDisable(GL_TEXTURE_2D); - //glShadeModel(GL_FLAT); - - /* - glBegin(GL_QUADS); - - glColor4f(0.0, 0.1, 0.0, 1.0); - glVertex3f(-1.0, -1.0, 0.0); - glVertex3f( 1.0, -1.0, 0.0); - - glColor4f(0.0, 0.5, 0.1, 1.0); - glVertex3f( 1.0, 1.0, 0.0); - glVertex3f(-1.0, 1.0, 0.0); - - glEnd();*/ - - } - - //glFlush(); -} - - --(guint32 *)getGoomDataWithFPS:(float)fps -{ - - if (fps>0) return goom_update(goomInfos, [[SoundSampler sharedSampler] getData], 0, fps, 0, 0); - else return goom_update(goomInfos, [[SoundSampler sharedSampler] getData], 0, 0, 0, 0); - // return goom_update(goomInfos, sndData, 0, fps, 0, 0); - -} - - - --(void)setHighQuality:(BOOL)quality -{ - HQ = quality; - dirty = YES; -} - -- (void)prepareTextures -{ - //static BOOL first = YES; - //[[self openGLContext] update]; - - // Setup some basic OpenGL stuff - glPixelStorei(GL_UNPACK_ALIGNMENT, 1); - glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); - glClearColor(1.0f, 1.0f, 1.0f, 0.0f); - glColor4f(1.0f, 1.0f, 1.0f, 1.0f); - - dirty = NO; - - glViewport(0, 0, (int) curSize.width, (int) curSize.height); - - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - - //glEnable(GL_LIGHTING); - - - if(HQ==YES) - { - //NSLog(@"Prepare HQ (%f,%f)",curSize.width, curSize.height); - - //glTextureRangeAPPLE(GL_TEXTURE_RECTANGLE_EXT, 0, NULL); - - glDeleteTextures(1, &textureName); - glDisable(GL_TEXTURE_2D); - glEnable(GL_TEXTURE_RECTANGLE_EXT); - - glGenTextures( 1, &textureName ); - glBindTexture(GL_TEXTURE_RECTANGLE_EXT, textureName); - - glTextureRangeAPPLE(GL_TEXTURE_RECTANGLE_EXT, 0, NULL); - - glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_STORAGE_HINT_APPLE , client_storage); - glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, texture_hint); - glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - - goom_set_resolution (goomInfos, curSize.width, curSize.height); - glTexImage2D(GL_TEXTURE_RECTANGLE_EXT, 0, GL_RGBA, curSize.width, curSize.height, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, [self getGoomDataWithFPS:0]); - } - else - { - //NSLog(@"Prepare LQ (%f,%f)",curSize.width, curSize.height); - - //glTextureRangeAPPLE(GL_TEXTURE_2D, 0, NULL); - - glDeleteTextures(1, &textureName); - glDisable(GL_TEXTURE_RECTANGLE_EXT); - glEnable(GL_TEXTURE_2D); - - glGenTextures( 1, &textureName ); - glBindTexture(GL_TEXTURE_2D, textureName); - - glTextureRangeAPPLE(GL_TEXTURE_2D, 0, NULL); - - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_STORAGE_HINT_APPLE , client_storage); - glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, texture_hint); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - - goom_set_resolution (goomInfos, IMAGE_SIZE(curSize), IMAGE_SIZE(curSize)); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, IMAGE_SIZE(curSize), IMAGE_SIZE(curSize), 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, [self getGoomDataWithFPS:0]); - - } - glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); -} - --(void)setTextureHint:(GLenum)hint -{ - texture_hint = hint; -} - --(void)clientStorage:(GLboolean)client -{ - client_storage = client; -} - - -- (void)dealloc -{ - goom_close(goomInfos); - [super dealloc]; -} - - - -@end Binary files /tmp/tmpPt54Nf/VKyUZvMq5a/kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/StandAlone/icon.icns and /tmp/tmpPt54Nf/jSnkFgw56d/kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/StandAlone/icon.icns differ diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/StandAlone/iGoom_Prefix.pch kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/StandAlone/iGoom_Prefix.pch --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/StandAlone/iGoom_Prefix.pch 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/StandAlone/iGoom_Prefix.pch 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ -// -// Prefix header for all source files of the 'iGoom' target in the 'iGoom' project -// - -#ifdef __OBJC__ - #import -#endif diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/StandAlone/iGoom-StandAlone.plist kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/StandAlone/iGoom-StandAlone.plist --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/StandAlone/iGoom-StandAlone.plist 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/StandAlone/iGoom-StandAlone.plist 1970-01-01 00:00:00.000000000 +0000 @@ -1,32 +0,0 @@ - - - - - CFBundleDevelopmentRegion - English - CFBundleExecutable - iGoom - CFBundleGetInfoString - - CFBundleIconFile - icon.icns - CFBundleIdentifier - com.ios.igoom.standalone - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - - CFBundlePackageType - APPL - CFBundleShortVersionString - - CFBundleSignature - ???? - CFBundleVersion - 2.0 - NSMainNibFile - MainMenu - NSPrincipalClass - NSApplication - - diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/StandAlone/main.m kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/StandAlone/main.m --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/StandAlone/main.m 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/StandAlone/main.m 1970-01-01 00:00:00.000000000 +0000 @@ -1,45 +0,0 @@ -/* - * - Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc. - ("Apple") in consideration of your agreement to the following terms, and your - use, installation, modification or redistribution of this Apple software - constitutes acceptance of these terms. If you do not agree with these terms, - please do not use, install, modify or redistribute this Apple software. - - In consideration of your agreement to abide by the following terms, and subject - to these terms, Apple grants you a personal, non-exclusive license, under Apples - copyrights in this original Apple software (the "Apple Software"), to use, - reproduce, modify and redistribute the Apple Software, with or without - modifications, in source and/or binary forms; provided that if you redistribute - the Apple Software in its entirety and without modifications, you must retain - this notice and the following text and disclaimers in all such redistributions of - the Apple Software. Neither the name, trademarks, service marks or logos of - Apple Computer, Inc. may be used to endorse or promote products derived from the - Apple Software without specific prior written permission from Apple. Except as - expressly stated in this notice, no other rights or licenses, express or implied, - are granted by Apple herein, including but not limited to any patent rights that - may be infringed by your derivative works or by other works in which the Apple - Software may be incorporated. - - The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO - WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED - WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN - COMBINATION WITH YOUR PRODUCTS. - - IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION - OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT - (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ - -#import - -int main(int argc, const char *argv[]) -{ - return NSApplicationMain(argc, argv); -} diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/StandAlone/MainOpenGLView.h kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/StandAlone/MainOpenGLView.h --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/StandAlone/MainOpenGLView.h 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/StandAlone/MainOpenGLView.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,88 +0,0 @@ -/* - * - Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc. - ("Apple") in consideration of your agreement to the following terms, and your - use, installation, modification or redistribution of this Apple software - constitutes acceptance of these terms. If you do not agree with these terms, - please do not use, install, modify or redistribute this Apple software. - - In consideration of your agreement to abide by the following terms, and subject - to these terms, Apple grants you a personal, non-exclusive license, under Apples - copyrights in this original Apple software (the "Apple Software"), to use, - reproduce, modify and redistribute the Apple Software, with or without - modifications, in source and/or binary forms; provided that if you redistribute - the Apple Software in its entirety and without modifications, you must retain - this notice and the following text and disclaimers in all such redistributions of - the Apple Software. Neither the name, trademarks, service marks or logos of - Apple Computer, Inc. may be used to endorse or promote products derived from the - Apple Software without specific prior written permission from Apple. Except as - expressly stated in this notice, no other rights or licenses, express or implied, - are granted by Apple herein, including but not limited to any patent rights that - may be infringed by your derivative works or by other works in which the Apple - Software may be incorporated. - - The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO - WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED - WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN - COMBINATION WITH YOUR PRODUCTS. - - IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION - OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT - (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ - -#import - -#include -#include -#include - -#include -#include - -#import "Goom.h" - -#define STAT_UPDATE 0.6f -#define IMAGE_DEPTH 32 - -@interface MainOpenGLView : NSOpenGLView -{ - GLubyte *image; - - GLint buffers; - GLint frame_rate; - - GLboolean rect_texture; - GLboolean client_storage; - GLboolean texture_range; - - bool fullscreen; - NSWindow * FullScreenWindow; - IBOutlet NSView * StartingView; - - - struct timeval cycle_time; - - IBOutlet NSTextField *sizeField; - - IBOutlet Goom * myGoom; - - NSTimer* timer; - - @public - float avg_fps; -} - -- (IBAction) clientStorage: (id) sender; -- (IBAction) textureHint: (id) sender; -- (IBAction) rectTextures: (id) sender; - -- (BOOL)canBeHQ; - -@end diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/StandAlone/MainOpenGLView.m kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/StandAlone/MainOpenGLView.m --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/StandAlone/MainOpenGLView.m 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/StandAlone/MainOpenGLView.m 1970-01-01 00:00:00.000000000 +0000 @@ -1,249 +0,0 @@ -#define IMAGE_SIZE (1<<(int)(log(([self bounds].size.width<[self bounds].size.height)?[self bounds].size.width:[self bounds].size.height)/log(2.0f))) - -#include -#include -#include - -#include "src/goom.h" - -#include // for image loading and decompression -#include // for file type support - -#include -#include -#include - -#import "MainOpenGLView.h" - -@implementation MainOpenGLView - -- (void) dealloc -{ - [super dealloc]; -} - -- (id)initWithFrame:(NSRect)frameRect -{ - // Init pixel format attribs - NSOpenGLPixelFormatAttribute attrs[] = - { - // Attributes Common to FullScreen and non-FullScreen - NSOpenGLPFAColorSize, 24, - NSOpenGLPFADepthSize, 16, - NSOpenGLPFADoubleBuffer, - NSOpenGLPFAAccelerated, - NSOpenGLPFANoRecovery, - 0 - }; - - // Get pixel format from OpenGL - NSOpenGLPixelFormat* pixFmt = [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs]; - if (!pixFmt) - { - NSLog(@"No pixel format -- exiting"); - exit(1); - } - - self = [super initWithFrame:frameRect pixelFormat:pixFmt]; - return self; -} -/* -- (void)displayMPixels -{ - static long loop_count = 0; - struct timeval t2; - unsigned long t; - - loop_count++; - - gettimeofday(&t2, NULL); - t = 1000000 * (t2.tv_sec - cycle_time.tv_sec) + (t2.tv_usec - cycle_time.tv_usec); - - // Display the average data rate - if(t > 1000000 * STAT_UPDATE) - { - gettimeofday(&t2, NULL); - t = 1000000 * (t2.tv_sec - cycle_time.tv_sec) + (t2.tv_usec - cycle_time.tv_usec); - gettimeofday(&cycle_time, NULL); - avg_fps = (1000000.0f * (float) loop_count) / (float) t; - - loop_count = 0; - - gettimeofday(&cycle_time, NULL); - } -} -*/ - -- (BOOL)canBeHQ -{ - [[self openGLContext] makeCurrentContext]; - return (strstr(glGetString(GL_EXTENSIONS),"GL_EXT_texture_rectangle") != NULL); -} - - - (void) drawRect:(NSRect)rect - { - // Delegate to our scene object for rendering. - - [[self openGLContext] makeCurrentContext]; - - glViewport(0, 0, (GLsizei) rect.size.width, (GLsizei) rect.size.height); - - //GLfloat clear_color[4] = { 1.0f, 0.0f, 0.0f, 0.0f }; - //glClearColor(clear_color[0], clear_color[1], clear_color[2], clear_color[3]); - //glClear(GL_COLOR_BUFFER_BIT+GL_DEPTH_BUFFER_BIT+GL_STENCIL_BUFFER_BIT); - - [myGoom render]; - - [[self openGLContext] flushBuffer]; - } - - -- (void)update // moved or resized -{ - NSRect rect; - - [myGoom setSize:[self bounds].size]; - - [super update]; - - [[self openGLContext] makeCurrentContext]; - [[self openGLContext] update]; - - rect = [self bounds]; - - glViewport(0, 0, (int) rect.size.width, (int) rect.size.height); - - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - - - [self setNeedsDisplay:true]; -} - -- (void)reshape // scrolled, moved or resized -{ - NSRect rect; - - [myGoom setSize:[self bounds].size]; - - [super reshape]; - - [[self openGLContext] makeCurrentContext]; - [[self openGLContext] update]; - - //[myGoom setSize:[self bounds].size]; - - - rect = [self bounds]; - - glViewport(0, 0, (int) rect.size.width, (int) rect.size.height); - - //[self loadTextures:GL_FALSE]; - - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - - [self setNeedsDisplay:true]; -} - -- (IBAction) clientStorage: (id) sender -{ - [myGoom clientStorage:([sender state]==NSOnState)?GL_TRUE:GL_FALSE]; - - //[self loadTextures:GL_FALSE]; -} - -- (IBAction) rectTextures: (id) sender -{ - [myGoom setHighQuality:(rect_texture==NSOnState)?YES:NO]; - - //[self loadTextures:GL_FALSE]; -} - -- (IBAction) textureHint: (id) sender -{ - int tag = [[sender selectedItem] tag]; - GLenum texture_hint = GL_STORAGE_CACHED_APPLE; - if(tag == 1) texture_hint = GL_STORAGE_PRIVATE_APPLE; - if(tag == 2) texture_hint = GL_STORAGE_SHARED_APPLE; - - [myGoom setTextureHint:texture_hint]; - //[self loadTextures:YES]; -} -/* -- (void)loadTextures: (GLboolean)first -{ - NSLog(@"LoadsTExtures"); - PluginInfo * goomInfos = [myGoom infos]; - - NSRect rect = [self bounds]; - - [[self openGLContext] makeCurrentContext]; - [[self openGLContext] update]; - glEnable(GL_LIGHTING); - if(rect_texture) - { - if(!first) - { - GLint dt = 1; - glDeleteTextures(1, &dt); - } - - goom_set_resolution (goomInfos, rect.size.width, rect.size.height); - - glDisable(GL_TEXTURE_2D); - glEnable(GL_TEXTURE_RECTANGLE_EXT); - glBindTexture(GL_TEXTURE_RECTANGLE_EXT, 1); - - glTextureRangeAPPLE(GL_TEXTURE_RECTANGLE_EXT, 0, NULL); - - glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_STORAGE_HINT_APPLE , texture_hint); - glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, client_storage); - glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); - - glTexImage2D(GL_TEXTURE_RECTANGLE_EXT, 0, GL_RGBA, [self bounds].size.width, - [self bounds].size.height, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, [myGoom getGoomDataWithFPS:avg_fps]); - } - else - { - glTextureRangeAPPLE(GL_TEXTURE_RECTANGLE_EXT, 0, NULL); - glTextureRangeAPPLE(GL_TEXTURE_2D, 0, NULL); - - if(!first) - { - GLint dt = 1; - glDeleteTextures(1, &dt); - } - - goom_set_resolution (goomInfos,IMAGE_SIZE, IMAGE_SIZE); - - glDisable(GL_TEXTURE_RECTANGLE_EXT); - glEnable(GL_TEXTURE_2D); - glBindTexture(GL_TEXTURE_2D, 1); - - glTextureRangeAPPLE(GL_TEXTURE_2D, 0, NULL); - - glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_STORAGE_HINT_APPLE , texture_hint); - glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, client_storage); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); - - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, IMAGE_SIZE, - IMAGE_SIZE, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, [myGoom getGoomDataWithFPS:avg_fps]); - } -} -*/ -@end diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/StandAlone/MyApplication.h kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/StandAlone/MyApplication.h --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/StandAlone/MyApplication.h 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/StandAlone/MyApplication.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,45 +0,0 @@ -/* - * - Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc. - ("Apple") in consideration of your agreement to the following terms, and your - use, installation, modification or redistribution of this Apple software - constitutes acceptance of these terms. If you do not agree with these terms, - please do not use, install, modify or redistribute this Apple software. - - In consideration of your agreement to abide by the following terms, and subject - to these terms, Apple grants you a personal, non-exclusive license, under Apples - copyrights in this original Apple software (the "Apple Software"), to use, - reproduce, modify and redistribute the Apple Software, with or without - modifications, in source and/or binary forms; provided that if you redistribute - the Apple Software in its entirety and without modifications, you must retain - this notice and the following text and disclaimers in all such redistributions of - the Apple Software. Neither the name, trademarks, service marks or logos of - Apple Computer, Inc. may be used to endorse or promote products derived from the - Apple Software without specific prior written permission from Apple. Except as - expressly stated in this notice, no other rights or licenses, express or implied, - are granted by Apple herein, including but not limited to any patent rights that - may be infringed by your derivative works or by other works in which the Apple - Software may be incorporated. - - The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO - WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED - WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN - COMBINATION WITH YOUR PRODUCTS. - - IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION - OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT - (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ - -#import - -@interface MyApplication : NSApplication -{ -} -@end diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/StandAlone/MyApplication.m kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/StandAlone/MyApplication.m --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/StandAlone/MyApplication.m 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/StandAlone/MyApplication.m 1970-01-01 00:00:00.000000000 +0000 @@ -1,57 +0,0 @@ -/* - * - Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc. - ("Apple") in consideration of your agreement to the following terms, and your - use, installation, modification or redistribution of this Apple software - constitutes acceptance of these terms. If you do not agree with these terms, - please do not use, install, modify or redistribute this Apple software. - - In consideration of your agreement to abide by the following terms, and subject - to these terms, Apple grants you a personal, non-exclusive license, under Apples - copyrights in this original Apple software (the "Apple Software"), to use, - reproduce, modify and redistribute the Apple Software, with or without - modifications, in source and/or binary forms; provided that if you redistribute - the Apple Software in its entirety and without modifications, you must retain - this notice and the following text and disclaimers in all such redistributions of - the Apple Software. Neither the name, trademarks, service marks or logos of - Apple Computer, Inc. may be used to endorse or promote products derived from the - Apple Software without specific prior written permission from Apple. Except as - expressly stated in this notice, no other rights or licenses, express or implied, - are granted by Apple herein, including but not limited to any patent rights that - may be infringed by your derivative works or by other works in which the Apple - Software may be incorporated. - - The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO - WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED - WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN - COMBINATION WITH YOUR PRODUCTS. - - IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION - OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT - (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ - -#import "MyApplication.h" -#import "AppController.h" - -@implementation MyApplication - -- (NSEvent *)nextEventMatchingMask:(unsigned int)mask - untilDate:(NSDate *)expiration inMode:(NSString *)mode dequeue:(BOOL)flag -{ - NSEvent *event; - - event = [super nextEventMatchingMask:mask untilDate:expiration inMode:mode dequeue:flag]; - - //[[self delegate] UpdateDrawing]; - - return event; -} - -@end diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/StandAlone/SoundSampler.h kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/StandAlone/SoundSampler.h --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/StandAlone/SoundSampler.h 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/StandAlone/SoundSampler.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,36 +0,0 @@ -// -// SoundSampler.h -// iGoom -// -// Created by Guillaume Borios on Thu May 27 2004. -// Copyright (c) 2004 iOS. All rights reserved. -// - -#import -#include - - -@interface SoundSampler : NSObject { - - @private - - IBOutlet NSPopUpButton * ODeviceList; - IBOutlet NSSlider * OSoundVolume; - - AudioDeviceID oldDevice, curDevice; - - signed short data[3][2][512]; - int BufferIndexReady, BufferIndexRead, BufferIndexWrite; - NSLock * BufferLock; -} - -+(SoundSampler*)sharedSampler; --(void*)getData; --(void) UpdateDeviceList; --(void)updateBuffer:(const AudioBufferList *)inInputData withDevice:(AudioDeviceID)inDevice; - --(IBAction)changeAudioDevice:(id)sender; --(IBAction)changeAudioVolume:(id)sender; --(void)refreshAudioVolumeInterface:(float)value; - -@end diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/StandAlone/SoundSampler.mm kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/StandAlone/SoundSampler.mm --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/mac/StandAlone/SoundSampler.mm 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/mac/StandAlone/SoundSampler.mm 1970-01-01 00:00:00.000000000 +0000 @@ -1,372 +0,0 @@ -// -// SoundSampler.mm -// iGoom -// -// Created by Guillaume Borios on Thu May 27 2004. -// Copyright (c) 2004 iOS. All rights reserved. -// - -#import "SoundSampler.h" - -#import "CoreAudioHardware.h" -#import "CoreAudioDevice.h" - -#include -#include - -#define kAudioDeviceNone 0 -#define kAudioDeviceUndefined 0xFFFF - - -OSStatus deviceChanged(AudioDeviceID inDevice, UInt32 /*inChannel*/, Boolean inIsInput, AudioDevicePropertyID inPropertyID, void * deviceController) -{ - if (inIsInput) - { - NS_DURING - - switch(inPropertyID) - { - case kAudioDevicePropertyDeviceIsAlive: - case kAudioDevicePropertyHogMode: - case kAudioDevicePropertyDeviceHasChanged: - { - [(SoundSampler*)deviceController UpdateDeviceList]; - CoreAudioDevice theDevice(inDevice); - [(SoundSampler*)deviceController refreshAudioVolumeInterface:theDevice.GetVolumeControlScalarValue(1,kAudioDeviceSectionInput)]; - } - break; - - default: - break; - }; - - NS_HANDLER - NS_ENDHANDLER - } - return 0; -} - -OSStatus devicesChanged(AudioHardwarePropertyID property, void * deviceController) -{ - NS_DURING - - switch(property) - { - case kAudioHardwarePropertyDevices: - [(SoundSampler*)deviceController UpdateDeviceList]; - break; - - default: - break; - }; - - NS_HANDLER - NS_ENDHANDLER - - return 0; -} - -static SoundSampler * sharedInstance = nil; - -@implementation SoundSampler - --(SoundSampler*)init -{ - self = [super init]; - if (self) - { - if (sharedInstance==nil) sharedInstance = self; - oldDevice = curDevice = kAudioDeviceUndefined; - BufferIndexReady = 2; - BufferIndexRead = 0; - BufferIndexWrite = 1; - BufferLock = [[NSLock alloc] init]; - } - return self; -} - -+(SoundSampler*)sharedSampler -{ - if (sharedInstance==nil) - { - NSLog(@"Error : Sound Sampler invoked to early"); - exit(0); - } - return sharedInstance; -} - --(void)awakeFromNib -{ - [ODeviceList setAutoenablesItems:NO]; - [self UpdateDeviceList]; - CoreAudioHardware::AddPropertyListener(kAudioHardwarePropertyDevices, (AudioHardwarePropertyListenerProc)devicesChanged, self); -} - --(void) dealloc -{ - CoreAudioHardware::RemovePropertyListener(kAudioHardwarePropertyDevices, (AudioHardwarePropertyListenerProc)devicesChanged); - [super dealloc]; -} - - -OSStatus myDeviceProc(AudioDeviceID inDevice, const AudioTimeStamp * inNow, - const AudioBufferList * inInputData, - const AudioTimeStamp * inInputTime, - AudioBufferList * outOutputData, - const AudioTimeStamp * inOutputTime, void * inClientData) -{ - [(SoundSampler*)inClientData updateBuffer:inInputData withDevice:inDevice]; -} - -#define maxValue 32567.0f - --(void)swapBuffersForRead:(BOOL)read -{ - int tmp; - - [BufferLock lock]; - if (read) - { - tmp = BufferIndexRead; - BufferIndexRead = BufferIndexReady; - BufferIndexReady = tmp; - } - else - { - tmp = BufferIndexWrite; - BufferIndexWrite = BufferIndexReady; - BufferIndexReady = tmp; - } - [BufferLock unlock]; -} - --(void)updateBuffer:(const AudioBufferList *)inInputData withDevice:(AudioDeviceID)inDevice -{ - // WARNING !!! This function assumes the input format is (interleaved) Float32 !!! - int curBuffer; - int curPosition = 512-1; - int i; - for (curBuffer = inInputData->mNumberBuffers-1; (curBuffer >= 0) && (curPosition >= 0); --curBuffer) - { - UInt32 channels = inInputData->mBuffers[curBuffer].mNumberChannels; - UInt32 size = inInputData->mBuffers[curBuffer].mDataByteSize / (sizeof(Float32)*channels); - if ( (channels > 0) && (size > 0) ) - { - if (channels == 1) - { - // We will duplicate the first channel - for (i=size-1; (i >=0 ) && (curPosition >= 0); --i) - { - data[BufferIndexWrite][0][curPosition]=(short)(maxValue * ((Float32*)inInputData->mBuffers[curBuffer].mData)[i]); - data[BufferIndexWrite][1][curPosition]=data[BufferIndexWrite][0][curPosition]; - curPosition--; - } - } - else - { - // Uses only the 2 first channels - for (i=size-1; (i >=0 ) && (curPosition >= 1); --i) - { - data[BufferIndexWrite][0][curPosition]=(short)(maxValue * ((Float32*)inInputData->mBuffers[curBuffer].mData)[i]); - i--; - data[BufferIndexWrite][1][curPosition]=(short)(maxValue * ((Float32*)inInputData->mBuffers[curBuffer].mData)[i]); - curPosition--; - } - } - } - } - [self swapBuffersForRead:NO]; -} - --(void*)getData -{ - if (oldDevice != curDevice ) - { - // The device changed - - // Stop the old one - if ( (oldDevice != kAudioDeviceUndefined) && (oldDevice != kAudioDeviceNone) ) - { - AudioDeviceStop(oldDevice, myDeviceProc); - AudioDeviceRemoveIOProc(oldDevice, myDeviceProc); - bzero((void*)data,3*2*512*sizeof(short)); - } - oldDevice = curDevice; - - //Start the new one - if ( (curDevice != kAudioDeviceUndefined) && (curDevice != kAudioDeviceNone) ) - { - AudioDeviceAddIOProc(curDevice, myDeviceProc, (void*)self); - AudioDeviceStart(curDevice, myDeviceProc); - } - } - - [self swapBuffersForRead:YES]; - - return (void*)(&(data[BufferIndexRead][0][0])); -} - - - - --(IBAction)_changeAudioDevice:(AudioDeviceID)device -{ - if (oldDevice==device) return; - - //NSLog(@"Changing audio device from %d to %d",oldDevice,device); - - if ( (oldDevice != kAudioDeviceUndefined) && (oldDevice != kAudioDeviceNone) ) - { - CoreAudioDevice old(oldDevice); - old.RemovePropertyListener(kAudioPropertyWildcardChannel, kAudioPropertyWildcardSection, kAudioPropertyWildcardPropertyID, (AudioDevicePropertyListenerProc)deviceChanged); - } - - curDevice = device; - - if (device == kAudioDeviceNone) - { - [OSoundVolume setEnabled:NO]; - [OSoundVolume setFloatValue:0.0f]; - } - else - { - CoreAudioDevice theDevice(device); - theDevice.AddPropertyListener(kAudioPropertyWildcardChannel, kAudioPropertyWildcardSection, kAudioPropertyWildcardPropertyID, (AudioDevicePropertyListenerProc)deviceChanged, self); - if (theDevice.HasVolumeControl(1,kAudioDeviceSectionInput)) - { - [OSoundVolume setEnabled:theDevice.VolumeControlIsSettable(1,kAudioDeviceSectionInput)]; - [OSoundVolume setFloatValue:theDevice.GetVolumeControlScalarValue(1,kAudioDeviceSectionInput)]; - } - else - { - [OSoundVolume setEnabled:NO]; - [OSoundVolume setFloatValue:0.0f]; - } - } -} - --(IBAction)changeAudioDevice:(id)sender -{ - //NSLog(@"Will change to %@",[[ODeviceList selectedItem]title]); - [self _changeAudioDevice:[[ODeviceList selectedItem]tag]]; -} - - --(void) AddDeviceToMenu:(CoreAudioDevice *)dev -{ - if (dev == nil) - { - [ODeviceList addItemWithTitle:[[NSBundle bundleForClass:[self class]] localizedStringForKey:@"None" value:nil table:nil]]; - [[ODeviceList lastItem] setTag:kAudioDeviceNone]; - } - else - { - [ODeviceList addItemWithTitle:@""]; - NSMenuItem* zeItem = [ODeviceList lastItem]; - - NSString* name = (NSString*)dev->name(); - [zeItem setTitle: [[NSBundle bundleForClass:[self class]] localizedStringForKey:name value:nil table:nil]]; - [name release]; - [zeItem setTag: dev->getDeviceID()]; - } -} - - --(void) UpdateDeviceList -{ - int i,c; - - - // Cleanup - [ODeviceList removeAllItems]; - [self AddDeviceToMenu:nil]; - - - // List devices - int n = CoreAudioHardware::numberOfDevices(); - //NSLog(@"Current device %d",curDevice); - for(i = 0; i < n; i++) - { - CoreAudioDevice theDevice(CoreAudioHardware::deviceAtIndex(i)); - - // select audio devices with input streams only - if (theDevice.numberOfChannels(kAudioDeviceSectionInput) > 0) - { - [self AddDeviceToMenu:&theDevice]; - } - //NSLog(@"Tag %d : %d",i,[ODeviceList lastItem]); - } - - // Set up the new selection - pid_t theHogModeOwner; - - - // Choose the old device, if not hogged... - c = [ODeviceList indexOfItemWithTag: curDevice]; - if (c != -1) - { - CoreAudioDevice dev(CoreAudioHardware::deviceAtIndex(i-1)); - theHogModeOwner = dev.hogModeOwner(); - if ((theHogModeOwner != -1) && (theHogModeOwner != getpid())) - { - c = -1; - } - } - - // Disables all hogged audio inputs, and choose one if necessary and possible - int m = 1; - for (i = 0; i < n; i++) - { - CoreAudioDevice dev(CoreAudioHardware::deviceAtIndex(i)); - if (dev.numberOfChannels(kAudioDeviceSectionInput) > 0) - { - theHogModeOwner = dev.hogModeOwner(); - if ((theHogModeOwner != -1) && (theHogModeOwner != getpid())) - { - NS_DURING - [[ODeviceList itemAtIndex:m] setEnabled:NO]; - NS_HANDLER - //NSLog(@"Exception 1 a pété ! c = %d, i = %d, n = %d, max = %d",c,i,n,[ODeviceList numberOfItems]); - NS_ENDHANDLER - } - else if (c == -1) - { - c = m; - NS_DURING - [self _changeAudioDevice:[[ODeviceList itemAtIndex:c] tag]]; - NS_HANDLER - //NSLog(@"Exception 2 a pété ! c = %d, i = %d, n = %d, max = %d",c,i,n,[ODeviceList numberOfItems]); - NS_ENDHANDLER - } - m++; - } - } - - // If nothing could be selected, choose "None" - if (c == -1) - { - c = 0; - [self _changeAudioDevice:kAudioDeviceNone]; - } - - [ODeviceList selectItemAtIndex:c]; -} - - --(void)refreshAudioVolumeInterface:(float)value -{ - [OSoundVolume setFloatValue:value]; -} - --(IBAction)changeAudioVolume:(id)sender -{ - CoreAudioDevice theDevice(curDevice); - if (theDevice.VolumeControlIsSettable(1,kAudioDeviceSectionInput)) - theDevice.SetVolumeControlScalarValue(1,kAudioDeviceSectionInput,[sender floatValue]); - if (theDevice.VolumeControlIsSettable(2,kAudioDeviceSectionInput)) - theDevice.SetVolumeControlScalarValue(2,kAudioDeviceSectionInput,[sender floatValue]); -} - - - -@end diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/Makefile.am kodi-visualization-goom-2.1.0/lib/goom2k4-0/Makefile.am --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/Makefile.am 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/Makefile.am 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ -SUBDIRS = src xmms-goom sdl-goom @MACFOLDER@ - -#.pc file -pkgconfigdir = $(libdir)/pkgconfig -pkgconfig_DATA = libgoom2.pc - -DISTCLEANFILES = libgoom2.pc diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/NEWS kodi-visualization-goom-2.1.0/lib/goom2k4-0/NEWS --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/NEWS 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/NEWS 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -see ChangeLog diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/README kodi-visualization-goom-2.1.0/lib/goom2k4-0/README --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/README 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/README 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -************************** -* What a GOOM! version 2 * -************************** -copyright 2000-2004, by Jean-Christophe Hoelt - -This is my first visual plugins for XMMS, and I think that it's the best -I have ever done ! - - /-----------------\\ ---< where to get Goom >-- - \\-----------------/ - -You can find the last version on the website of -iOS software: -http://www.ios-software.com/ - - /------\\ ---< thanks >-- - \\------/ - -Skal for the code of IFS -Burkhard for the initial fullscreen patch -Gyom for the iTunes version -Fred for the Windows version and a lot of other Goom Stuff - diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/sdl-goom/frame_rate_tester.c kodi-visualization-goom-2.1.0/lib/goom2k4-0/sdl-goom/frame_rate_tester.c --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/sdl-goom/frame_rate_tester.c 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/sdl-goom/frame_rate_tester.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,83 +0,0 @@ -/* - * file : frame_rate_tester.c - * author : JC Hoelt - * - * birth : 2001-03-07 22:56 - * version : 2001-03-07 22:56 - * - * content : the function to calculate the frame rate - */ - -#include "goom_config.h" -#include "frame_rate_tester.h" -#include "gmtimer.h" -#include - -pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER; - -/************** data ******************/ - -#define NUMBER_OF_FRAMES_IN_BUFFER 20 - -static float endlessTable[NUMBER_OF_FRAMES_IN_BUFFER]; -static guint32 currentPosInET; - -static GMTimer *timer = 0; - -/************** functions **************/ - -/* initialize the tester. do nothing if it has ever been initialized */ -void -framerate_tester_init () -{ - float curTime; - guint32 i; - - pthread_mutex_lock (&mut); - - if (!timer) { - timer = gmtimer_new (); - } - curTime = gmtimer_getvalue (timer); - for (i = 0; i < NUMBER_OF_FRAMES_IN_BUFFER; i++) - endlessTable[i] = curTime; - currentPosInET = 0; - - pthread_mutex_unlock (&mut); -} - -/* close the tester. do nothing if it hasn't been initialized */ -void -framerate_tester_close () -{ - pthread_mutex_lock (&mut); - gmtimer_delete (&timer); - timer = 0; - pthread_mutex_unlock (&mut); -} - -/* return the frame displayed by seconds */ -float -framerate_tester_getvalue () -{ - guint32 oldPos; - int ret; - - pthread_mutex_lock (&mut); - oldPos = (currentPosInET + 1) % NUMBER_OF_FRAMES_IN_BUFFER; - - ret = (float) NUMBER_OF_FRAMES_IN_BUFFER - / (endlessTable[currentPosInET] - endlessTable[oldPos]); - pthread_mutex_unlock (&mut); - return ret; -} - -/* inform the tester that a new frame has been displayed */ -void -framerate_tester_newframe () -{ - pthread_mutex_lock (&mut); - currentPosInET = (currentPosInET + 1) % NUMBER_OF_FRAMES_IN_BUFFER; - endlessTable[currentPosInET] = gmtimer_getvalue (timer); - pthread_mutex_unlock (&mut); -} diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/sdl-goom/frame_rate_tester.h kodi-visualization-goom-2.1.0/lib/goom2k4-0/sdl-goom/frame_rate_tester.h --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/sdl-goom/frame_rate_tester.h 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/sdl-goom/frame_rate_tester.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,30 +0,0 @@ -/* - * file : frame_rate_tester.h - * author : JC Hoelt - * - * birth : 2001-03-07 22:56 - * version : 2001-03-07 22:56 - * - * content : the function to calculate the frame rate - */ - -#ifndef _FRAME_RATE_TESTER_H -#define _FRAME_RATE_TESTER_H - -#include "goom_config.h" - -/************** functions **************/ - -/* initialize the tester. do nothing if it has ever been initialized */ -void framerate_tester_init (); - -/* close the tester. do nothing if it hasn't been initialized */ -void framerate_tester_close (); - -/* return the frame displayed per seconds */ -float framerate_tester_getvalue (); - -/* inform the tester that a new frame has been displayed */ -void framerate_tester_newframe (); - -#endif diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/sdl-goom/gmtimer.c kodi-visualization-goom-2.1.0/lib/goom2k4-0/sdl-goom/gmtimer.c --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/sdl-goom/gmtimer.c 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/sdl-goom/gmtimer.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,42 +0,0 @@ -/* - * file : linux/glibfunc.c - * author : JC Hoelt - * - * birth : 2001-03-03 13:42 - * version : 2001-03-03 14:10 - * - * content : the function to manipulate the time, etc. - */ - -#include -#include "gmtimer.h" - -/************** functions **************/ - -/* initialize the timer. do nothing if the timer has ever been initialized */ -GMTimer * -gmtimer_new () -{ - GTimer *goom_timer = g_timer_new (); - - g_timer_start (goom_timer); - return (void *) goom_timer; -} - -/* close the timer. do nothing if the timer hasn't been initialized */ -void -gmtimer_delete (GMTimer ** t) -{ - GTimer *goom_timer = *(GTimer **) t; - - g_timer_stop (goom_timer); - g_free (goom_timer); - *t = 0; -} - -/* return the number of seconds since the initialization of the timer */ -float -gmtimer_getvalue (GMTimer * t) -{ - return g_timer_elapsed ((GTimer *) t, NULL); -} diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/sdl-goom/gmtimer.h kodi-visualization-goom-2.1.0/lib/goom2k4-0/sdl-goom/gmtimer.h --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/sdl-goom/gmtimer.h 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/sdl-goom/gmtimer.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -/* - * file : timer.h - * author : JC Hoelt - * - * birth : 2001-03-03 13:42 - * version : 2001-03-03 13:42 - * - * content : the function to manipulate the time. - * - * this functions are implemented on an os-dependant directory. - */ - -#ifndef _GMTIMER_H -#define _GMTIMER_H - -#include "goom_config.h" - -typedef void GMTimer; - -/************** functions **************/ - -/* initialize the timer. do nothing if the timer has ever been initialized */ -GMTimer *gmtimer_new (); - -/* close the timer. do nothing if the timer hasn't been initialized */ -void gmtimer_delete (GMTimer ** t); - -/* return the number of seconds since the initialization of the timer */ -float gmtimer_getvalue (GMTimer *); - -#endif /* _GMTIMER_H */ diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/sdl-goom/gtk-callbacks.c kodi-visualization-goom-2.1.0/lib/goom2k4-0/sdl-goom/gtk-callbacks.c --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/sdl-goom/gtk-callbacks.c 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/sdl-goom/gtk-callbacks.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,416 +0,0 @@ -#ifdef HAVE_CONFIG_H -# include -#endif - -#include - -#include "gtk-callbacks.h" -#include "gtk-interface.h" -#include "gtk-support.h" - -#define WINSIZE_COMBO "combo_winsize" - -#include "sdl_goom.h" -#include "goom_config_param.h" - -#include -#include -#include - -static SdlGoom *sdlGoom; -static GtkObject *owin; - -static GdkColor color_blue; -static GdkColor color_red; - -void highlight_buffer(GtkText *editable) -{ - static int last_len = 0; - int i, len; - int next_add = 0; - - return; - - gint save_pos = gtk_editable_get_position(GTK_EDITABLE(editable)); /* save current pos */ - gchar *txt = gtk_editable_get_chars (GTK_EDITABLE(editable),0,-1); - len = strlen(txt); - if (len == 0) return; - - if (len == last_len) return; - last_len = len; - - gtk_text_freeze(editable); - - gtk_text_set_point(editable,0); - gtk_text_forward_delete(editable,len); - - for (i=0;inext_add) { - gtk_text_insert (editable, 0, 0, 0, txt+next_add, i-next_add); - next_add = i; - } - } - if ((txt[i]=='*')&&(txt[i+1]=='/')) { - if (i>next_add) { - gtk_text_insert (editable, 0, &color_blue, 0, txt+next_add, i-next_add+2); - next_add = i + 2; - } - } - } - if (next_add < len) { - gtk_text_insert (editable, 0, 0, 0, txt+next_add, len-next_add); - } - - /* gtk_editable_set_position(GTK_EDITABLE(editable),save_pos+40); - gtk_editable_set_position(GTK_EDITABLE(editable),save_pos-40); */ - - gtk_editable_set_position(GTK_EDITABLE(editable),save_pos); /* restore current pos */ - gtk_text_thaw(editable); - g_free(txt); -} - -void -on_spinbutton_int_changed (GtkEditable *editable, - gpointer user_data) -{ - PluginParam *param = (PluginParam*)gtk_object_get_data (GTK_OBJECT(editable),"param"); - IVAL(*param) = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON(editable)); - param->changed(param); -} - -void -on_adj_float_changed (GtkWidget *w, - gpointer user_data) -{ - PluginParam *param = (PluginParam*)gtk_object_get_data (GTK_OBJECT(w),"param"); - FVAL(*param) = GTK_ADJUSTMENT(w)->value; - param->changed(param); -} - -void -on_text_changed (GtkEditable *editable, - gpointer user_data) -{ - PluginParam *param = (PluginParam*)gtk_object_get_data (GTK_OBJECT(editable),"param"); - gchar *txt = gtk_editable_get_chars (editable,0,-1); - set_str_param_value(param, txt); - param->changed(param); - g_free(txt); - highlight_buffer(GTK_TEXT(editable)); -} - -void -on_list_changed (GtkEditable *editable, - gpointer user_data) -{ - PluginParam *param = (PluginParam*)gtk_object_get_data (GTK_OBJECT(editable),"param"); - gchar *txt = gtk_editable_get_chars (editable,0,-1); - set_list_param_value(param, txt); - param->changed(param); - g_free(txt); -} - -void -on_bool_toggled (GtkToggleButton *togglebutton, - gpointer user_data) -{ - PluginParam *param = (PluginParam*)gtk_object_get_data (GTK_OBJECT(togglebutton),"param"); - BVAL(*param) = gtk_toggle_button_get_active(togglebutton); - param->changed(param); -} - -void my_int_listener (PluginParam *param) { - GtkEditable *editable; - - if (sdlGoom->config_win == 0) return; - editable = GTK_EDITABLE(param->user_data); - - if (editable) { - int pos = 0; - char str[256]; - sprintf (str, "%d", IVAL(*param)); - if (strcmp(str,gtk_editable_get_chars(editable,0,-1))) { - gtk_editable_delete_text (editable,0,-1); - gtk_editable_insert_text (editable,str,strlen(str),&pos); - } - } -} - -void my_list_listener (PluginParam *param) { - GtkEntry *editable; - - if (sdlGoom->config_win == 0) return; - editable = GTK_ENTRY(param->user_data); - - if (editable) { - if (strcmp(gtk_entry_get_text(editable),LVAL(*param))) { - gtk_entry_set_text (editable, LVAL(*param)); - } - } -} - -void my_bool_listener (PluginParam *param) { - GtkCheckButton *editable; - - if (sdlGoom->config_win == 0) return; - editable = GTK_CHECK_BUTTON(param->user_data); - - if (editable) { - if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(editable)) != BVAL(*param)) - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(editable),BVAL(*param)); - } -} - -void my_float_listener_progress (PluginParam *param) { - GtkProgressBar *progress; - - if (sdlGoom->config_win == 0) return; - progress = GTK_PROGRESS_BAR(param->user_data); - - if (progress) { - if (FVAL(*param)FMAX(*param)) - FVAL(*param) = FMAX(*param); - gtk_progress_bar_update (progress, FVAL(*param)); - } -} - -void my_float_listener_scale (PluginParam *param) { - GtkRange *range; - - if (sdlGoom->config_win == 0) return; - range = GTK_RANGE(param->user_data); - - if (range) { - GtkAdjustment *adj; - if (FVAL(*param) < FMIN(*param)) - FVAL(*param) = FMIN(*param); - if (FVAL(*param) > FMAX(*param)) - FVAL(*param) = FMAX(*param); - - adj = gtk_range_get_adjustment(range); - adj->value = FVAL(*param); - gtk_adjustment_value_changed(adj); -// gtk_range_set_adjustment(range, adj); - } -} - -void addParams (GtkNotebook *notebook, PluginParameters *params) { - int n; - GtkWidget *table = gtk_table_new (params->nbParams, 2, FALSE); - gtk_container_set_border_width (GTK_CONTAINER (table), 11); - gtk_table_set_row_spacings (GTK_TABLE (table), 6); - gtk_table_set_col_spacings (GTK_TABLE (table), 6); - - for (n=0;nnbParams;++n) { - if (params->params[n] == 0) { - GtkWidget *hseparator = gtk_hseparator_new (); - gtk_widget_show (hseparator); - gtk_table_attach (GTK_TABLE (table), hseparator, 0, 2, n, n+1, - (GtkAttachOptions) (GTK_FILL), - (GtkAttachOptions) (GTK_FILL), 0, 5); - } else { - PluginParam *p = params->params[n]; - int type = p->type; - - if (type != PARAM_BOOLVAL) { - GtkWidget *label4 = gtk_label_new (p->name); - gtk_widget_show (label4); - gtk_table_attach (GTK_TABLE (table), label4, 0, 1, n, n+1, - (GtkAttachOptions) (GTK_FILL), - (GtkAttachOptions) (0), 0, 0); - gtk_label_set_justify (GTK_LABEL (label4), GTK_JUSTIFY_RIGHT); - gtk_misc_set_alignment (GTK_MISC (label4), 0, 0.5); - } - - switch (type) { - case PARAM_INTVAL: { - GtkWidget *spinbutton_adj,*spinbutton; - - spinbutton_adj = (GtkWidget*)gtk_adjustment_new ( - p->param.ival.value, - p->param.ival.min, p->param.ival.max, - p->param.ival.step, p->param.ival.step*10, - p->param.ival.step*10); - spinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (spinbutton_adj), 1, 0); - gtk_widget_show (spinbutton); - gtk_table_attach (GTK_TABLE (table), spinbutton, 1, 2, n, n+1, - (GtkAttachOptions) (GTK_FILL), - (GtkAttachOptions) (0), 0, 1); - gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbutton), TRUE); - gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (spinbutton), - GTK_UPDATE_IF_VALID); - p->user_data = spinbutton; - gtk_object_set_data (GTK_OBJECT(spinbutton),"param",(void*)p); - p->change_listener = my_int_listener; - gtk_signal_connect (GTK_OBJECT (spinbutton), "changed", - GTK_SIGNAL_FUNC (on_spinbutton_int_changed), - NULL); - break; - } - - case PARAM_FLOATVAL: { - GtkWidget *progress,*prog_adj; - - prog_adj = (GtkWidget*)gtk_adjustment_new ( - p->param.fval.value, - p->param.fval.min, p->param.fval.max, - p->param.fval.step, p->param.fval.step*10, - p->param.fval.step*10); - - if (p->rw) - progress = gtk_hscale_new(GTK_ADJUSTMENT(prog_adj)); - else - progress = gtk_progress_bar_new_with_adjustment(GTK_ADJUSTMENT(prog_adj)); - gtk_widget_show(progress); - gtk_table_attach (GTK_TABLE (table), progress, 1, 2, n, n+1, - (GtkAttachOptions) (GTK_FILL), - (GtkAttachOptions) (0), 0, 1); - - p->user_data = progress; - if (p->rw) { - p->change_listener = my_float_listener_scale; - gtk_object_set_data (GTK_OBJECT(prog_adj),"param",(void*)p); - gtk_signal_connect (GTK_OBJECT (prog_adj), "value-changed", - GTK_SIGNAL_FUNC (on_adj_float_changed), - NULL); - } - else - p->change_listener = my_float_listener_progress; - break; - } - - case PARAM_STRVAL: { - GtkWidget *vscrollbar = 0; - GtkWidget *text_winsize = gtk_text_new (0,0); - gtk_widget_show (text_winsize); - gtk_table_attach (GTK_TABLE (table), text_winsize, 1, 2, n, n+1, - (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), - (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); - gtk_text_insert (GTK_TEXT(text_winsize), 0, 0, 0, p->param.sval.value, strlen(p->param.sval.value)); - gtk_text_set_editable(GTK_TEXT(text_winsize), p->rw); - /* Add a vertical scrollbar to the GtkText widget */ - vscrollbar = gtk_vscrollbar_new (GTK_TEXT (text_winsize)->vadj); - gtk_table_attach (GTK_TABLE (table), vscrollbar, 2, 3, n, n+1, - GTK_FILL, GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0); - gtk_widget_show (vscrollbar); - -/* combo_entry_winsize = GTK_COMBO (combo_winsize)->entry; - gtk_widget_show (combo_entry_winsize); - gtk_entry_set_editable (GTK_ENTRY (combo_entry_winsize), FALSE); - gtk_entry_set_text (GTK_ENTRY (combo_entry_winsize), LVAL(*p)); - p->change_listener = my_list_listener;*/ - p->user_data = text_winsize; - gtk_object_set_data (GTK_OBJECT(text_winsize),"param",(void*)p); - gtk_signal_connect (GTK_OBJECT (text_winsize), "changed", - GTK_SIGNAL_FUNC (on_text_changed), - NULL); - break; - } - - case PARAM_LISTVAL: { - int i; - GList *combo_winsize_items = NULL; - GtkWidget *combo_entry_winsize = NULL; - GtkWidget *combo_winsize = gtk_combo_new (); - gtk_widget_show (combo_winsize); - gtk_table_attach (GTK_TABLE (table), combo_winsize, 1, 2, n, n+1, - (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), - (GtkAttachOptions) (0), 0, 0); - gtk_combo_set_value_in_list (GTK_COMBO (combo_winsize), TRUE, TRUE); - for (i=0;iparam.slist.nbChoices;++i) - combo_winsize_items = g_list_append (combo_winsize_items, - p->param.slist.choices[i]); - gtk_combo_set_popdown_strings (GTK_COMBO (combo_winsize), combo_winsize_items); - g_list_free (combo_winsize_items); - - combo_entry_winsize = GTK_COMBO (combo_winsize)->entry; - gtk_widget_show (combo_entry_winsize); - gtk_entry_set_editable (GTK_ENTRY (combo_entry_winsize), FALSE); - gtk_entry_set_text (GTK_ENTRY (combo_entry_winsize), LVAL(*p)); - p->change_listener = my_list_listener; - p->user_data = combo_entry_winsize; - gtk_object_set_data (GTK_OBJECT(combo_entry_winsize),"param",(void*)p); - gtk_signal_connect (GTK_OBJECT (combo_entry_winsize), "changed", - GTK_SIGNAL_FUNC (on_list_changed), - NULL); - break; - } - - case PARAM_BOOLVAL: { - GtkWidget *checkbutton_double = - gtk_check_button_new_with_label (p->name); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton_double),BVAL(*p)); - gtk_widget_show (checkbutton_double); - gtk_table_attach (GTK_TABLE (table), checkbutton_double, 1, 2, n, n+1, - (GtkAttachOptions) (GTK_FILL), - (GtkAttachOptions) (0), 0, 0); - gtk_signal_connect (GTK_OBJECT (checkbutton_double), "toggled", - GTK_SIGNAL_FUNC (on_bool_toggled), - NULL); - gtk_object_set_data (GTK_OBJECT(checkbutton_double),"param",(void*)p); - p->user_data = checkbutton_double; - p->change_listener = my_bool_listener; - break; - } - } - } - } - - gtk_widget_show_all(GTK_WIDGET(table)); - gtk_container_add(GTK_CONTAINER(notebook),table); - gtk_notebook_set_tab_label_text(notebook,GTK_WIDGET(table),params->name); -} - -void gtk_data_init(SdlGoom *sg) { - - sdlGoom = sg; - if (sdlGoom->config_win) { - int i; - GtkNotebook *notebook; - GdkColormap *cmap; - - cmap = gdk_colormap_get_system(); - color_blue.red = 0; - color_blue.blue = 0xffff; - color_blue.green = 0; - color_red.red = 0xffff; - color_red.blue = 0; - color_red.green = 0; - if ((!gdk_color_alloc(cmap, &color_blue))||(!gdk_color_alloc(cmap, &color_red))) { - g_error("couldn't allocate color"); - } - - owin = GTK_OBJECT(sdlGoom->config_win); - notebook = GTK_NOTEBOOK(gtk_object_get_data (owin, "notebook1")); - addParams (notebook, &sdlGoom->screen); - for (i = 0; i < sdlGoom->plugin->nbParams; ++i) { - addParams (notebook, &sdlGoom->plugin->params[i]); - } - } - -} - -gboolean -on_config_window_destroy_event (GtkWidget *widget, - GdkEvent *event, - gpointer user_data) -{ - sdlGoom->config_win = 0; - owin = 0; - return FALSE; -} - - -gboolean -on_config_window_delete_event (GtkWidget *widget, - GdkEvent *event, - gpointer user_data) -{ - sdlGoom->config_win = 0; - owin = 0; - return FALSE; -} - diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/sdl-goom/gtk-callbacks.h kodi-visualization-goom-2.1.0/lib/goom2k4-0/sdl-goom/gtk-callbacks.h --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/sdl-goom/gtk-callbacks.h 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/sdl-goom/gtk-callbacks.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,24 +0,0 @@ -#include - - -void -on_checkbutton_double_toggled (GtkToggleButton *togglebutton, - gpointer user_data); - -void -on_spinbutton_fps_changed (GtkEditable *editable, - gpointer user_data); - -void -on_combo_entry_winsize_changed (GtkEditable *editable, - gpointer user_data); - -gboolean -on_config_window_destroy_event (GtkWidget *widget, - GdkEvent *event, - gpointer user_data); - -gboolean -on_config_window_delete_event (GtkWidget *widget, - GdkEvent *event, - gpointer user_data); diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/sdl-goom/gtk-interface.c kodi-visualization-goom-2.1.0/lib/goom2k4-0/sdl-goom/gtk-interface.c --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/sdl-goom/gtk-interface.c 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/sdl-goom/gtk-interface.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,138 +0,0 @@ -/* - * DO NOT EDIT THIS FILE - it is generated by Glade. - */ - -#ifdef HAVE_CONFIG_H -# include -#endif - -#include -#include -#include -#include - -#include -#include - -#include "gtk-callbacks.h" -#include "gtk-interface.h" -#include "gtk-support.h" - -GtkWidget* -create_config_window (void) -{ - GtkWidget *config_window; - GtkWidget *vbox1; - GtkWidget *toolbar1; - GtkWidget *b_open_config; - GtkWidget *b_save_config; - GtkWidget *notebook1; - GtkWidget *scrolledwindow1; - GtkWidget *text1; - GtkWidget *goom_control; - GtkWidget *statusbar1; - - config_window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_widget_set_name (config_window, "config_window"); - gtk_object_set_data (GTK_OBJECT (config_window), "config_window", config_window); - gtk_window_set_title (GTK_WINDOW (config_window), _("Goom Control Center")); - - vbox1 = gtk_vbox_new (FALSE, 0); - gtk_widget_set_name (vbox1, "vbox1"); - gtk_widget_ref (vbox1); - gtk_object_set_data_full (GTK_OBJECT (config_window), "vbox1", vbox1, - (GtkDestroyNotify) gtk_widget_unref); - gtk_widget_show (vbox1); - gtk_container_add (GTK_CONTAINER (config_window), vbox1); - - toolbar1 = gtk_toolbar_new (GTK_ORIENTATION_HORIZONTAL, GTK_TOOLBAR_TEXT); - gtk_widget_set_name (toolbar1, "toolbar1"); - gtk_widget_ref (toolbar1); - gtk_object_set_data_full (GTK_OBJECT (config_window), "toolbar1", toolbar1, - (GtkDestroyNotify) gtk_widget_unref); - gtk_widget_show (toolbar1); - gtk_box_pack_start (GTK_BOX (vbox1), toolbar1, FALSE, FALSE, 0); - gtk_container_set_border_width (GTK_CONTAINER (toolbar1), 3); - gtk_toolbar_set_space_size (GTK_TOOLBAR (toolbar1), 8); - gtk_toolbar_set_space_style (GTK_TOOLBAR (toolbar1), GTK_TOOLBAR_SPACE_LINE); - - b_open_config = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar1), - GTK_TOOLBAR_CHILD_BUTTON, - NULL, - _("Open..."), - NULL, NULL, - NULL, NULL, NULL); - gtk_widget_set_name (b_open_config, "b_open_config"); - gtk_widget_ref (b_open_config); - gtk_object_set_data_full (GTK_OBJECT (config_window), "b_open_config", b_open_config, - (GtkDestroyNotify) gtk_widget_unref); - gtk_widget_show (b_open_config); - - b_save_config = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar1), - GTK_TOOLBAR_CHILD_BUTTON, - NULL, - _("Save..."), - NULL, NULL, - NULL, NULL, NULL); - gtk_widget_set_name (b_save_config, "b_save_config"); - gtk_widget_ref (b_save_config); - gtk_object_set_data_full (GTK_OBJECT (config_window), "b_save_config", b_save_config, - (GtkDestroyNotify) gtk_widget_unref); - gtk_widget_show (b_save_config); - - notebook1 = gtk_notebook_new (); - gtk_widget_set_name (notebook1, "notebook1"); - gtk_widget_ref (notebook1); - gtk_object_set_data_full (GTK_OBJECT (config_window), "notebook1", notebook1, - (GtkDestroyNotify) gtk_widget_unref); - gtk_widget_show (notebook1); - gtk_box_pack_start (GTK_BOX (vbox1), notebook1, TRUE, TRUE, 0); - gtk_notebook_set_tab_pos (GTK_NOTEBOOK (notebook1), GTK_POS_LEFT); - - scrolledwindow1 = gtk_scrolled_window_new (NULL, NULL); - gtk_widget_set_name (scrolledwindow1, "scrolledwindow1"); - gtk_widget_ref (scrolledwindow1); - gtk_object_set_data_full (GTK_OBJECT (config_window), "scrolledwindow1", scrolledwindow1, - (GtkDestroyNotify) gtk_widget_unref); - gtk_widget_show (scrolledwindow1); - gtk_container_add (GTK_CONTAINER (notebook1), scrolledwindow1); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow1), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS); - - text1 = gtk_text_new (NULL, NULL); - gtk_widget_set_name (text1, "text1"); - gtk_widget_ref (text1); - gtk_object_set_data_full (GTK_OBJECT (config_window), "text1", text1, - (GtkDestroyNotify) gtk_widget_unref); - gtk_widget_show (text1); - gtk_container_add (GTK_CONTAINER (scrolledwindow1), text1); - gtk_widget_set_usize (text1, 400, 300); - { char *str = _("What a GOOM!!\n\nCopyright (c)2000-2004, by Jean-Christophe Hoelt \n\nThis is my first visual plugins for XMMS, and I\nthink that it's the best I have ever done!\nYou can grab our last version and help us with a donation at\nhttp://www.ios-software.com/\nThanks and enjoy!\n\n\tJeko"); - gtk_text_insert (GTK_TEXT (text1), NULL, NULL, NULL, str, strlen(str)); - } - - goom_control = gtk_label_new (_("About goom...")); - gtk_widget_set_name (goom_control, "goom_control"); - gtk_widget_ref (goom_control); - gtk_object_set_data_full (GTK_OBJECT (config_window), "goom_control", goom_control, - (GtkDestroyNotify) gtk_widget_unref); - gtk_widget_show (goom_control); - gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook1), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook1), 0), goom_control); - - statusbar1 = gtk_statusbar_new (); - gtk_widget_set_name (statusbar1, "statusbar1"); - gtk_widget_ref (statusbar1); - gtk_object_set_data_full (GTK_OBJECT (config_window), "statusbar1", statusbar1, - (GtkDestroyNotify) gtk_widget_unref); - gtk_widget_show (statusbar1); - gtk_box_pack_start (GTK_BOX (vbox1), statusbar1, FALSE, FALSE, 0); - - gtk_signal_connect (GTK_OBJECT (config_window), "destroy_event", - GTK_SIGNAL_FUNC (on_config_window_destroy_event), - NULL); - gtk_signal_connect (GTK_OBJECT (config_window), "delete_event", - GTK_SIGNAL_FUNC (on_config_window_delete_event), - NULL); - - return config_window; -} - diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/sdl-goom/gtk-interface.h kodi-visualization-goom-2.1.0/lib/goom2k4-0/sdl-goom/gtk-interface.h --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/sdl-goom/gtk-interface.h 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/sdl-goom/gtk-interface.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ -/* - * DO NOT EDIT THIS FILE - it is generated by Glade. - */ - -GtkWidget* create_config_window (void); diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/sdl-goom/gtk-support.c kodi-visualization-goom-2.1.0/lib/goom2k4-0/sdl-goom/gtk-support.c --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/sdl-goom/gtk-support.c 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/sdl-goom/gtk-support.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,162 +0,0 @@ -/* - * DO NOT EDIT THIS FILE - it is generated by Glade. - */ - -#ifdef HAVE_CONFIG_H -# include -#endif - -#include -#include -#include -#include - -#include - -#include "gtk-support.h" - -/* This is an internally used function to check if a pixmap file exists. */ -static gchar* check_file_exists (const gchar *directory, - const gchar *filename); - -/* This is an internally used function to create pixmaps. */ -static GtkWidget* create_dummy_pixmap (GtkWidget *widget); - -GtkWidget* -lookup_widget (GtkWidget *widget, - const gchar *widget_name) -{ - GtkWidget *parent, *found_widget; - - for (;;) - { - if (GTK_IS_MENU (widget)) - parent = gtk_menu_get_attach_widget (GTK_MENU (widget)); - else - parent = widget->parent; - if (parent == NULL) - break; - widget = parent; - } - - found_widget = (GtkWidget*) gtk_object_get_data (GTK_OBJECT (widget), - widget_name); - if (!found_widget) - g_warning ("Widget not found: %s", widget_name); - return found_widget; -} - -/* This is a dummy pixmap we use when a pixmap can't be found. */ -static char *dummy_pixmap_xpm[] = { -/* columns rows colors chars-per-pixel */ -"1 1 1 1", -" c None", -/* pixels */ -" " -}; - -/* This is an internally used function to create pixmaps. */ -static GtkWidget* -create_dummy_pixmap (GtkWidget *widget) -{ - GdkColormap *colormap; - GdkPixmap *gdkpixmap; - GdkBitmap *mask; - GtkWidget *pixmap; - - colormap = gtk_widget_get_colormap (widget); - gdkpixmap = gdk_pixmap_colormap_create_from_xpm_d (NULL, colormap, &mask, - NULL, dummy_pixmap_xpm); - if (gdkpixmap == NULL) - g_error ("Couldn't create replacement pixmap."); - pixmap = gtk_pixmap_new (gdkpixmap, mask); - gdk_pixmap_unref (gdkpixmap); - gdk_bitmap_unref (mask); - return pixmap; -} - -static GList *pixmaps_directories = NULL; - -/* Use this function to set the directory containing installed pixmaps. */ -void -add_pixmap_directory (const gchar *directory) -{ - pixmaps_directories = g_list_prepend (pixmaps_directories, - g_strdup (directory)); -} - -/* This is an internally used function to create pixmaps. */ -GtkWidget* -create_pixmap (GtkWidget *widget, - const gchar *filename) -{ - gchar *found_filename = NULL; - GdkColormap *colormap; - GdkPixmap *gdkpixmap; - GdkBitmap *mask; - GtkWidget *pixmap; - GList *elem; - - if (!filename || !filename[0]) - return create_dummy_pixmap (widget); - - /* We first try any pixmaps directories set by the application. */ - elem = pixmaps_directories; - while (elem) - { - found_filename = check_file_exists ((gchar*)elem->data, filename); - if (found_filename) - break; - elem = elem->next; - } - - /* If we haven't found the pixmap, try the source directory. */ - if (!found_filename) - { - found_filename = check_file_exists ("../pixmaps", filename); - } - - if (!found_filename) - { - g_warning (_("Couldn't find pixmap file: %s"), filename); - return create_dummy_pixmap (widget); - } - - colormap = gtk_widget_get_colormap (widget); - gdkpixmap = gdk_pixmap_colormap_create_from_xpm (NULL, colormap, &mask, - NULL, found_filename); - if (gdkpixmap == NULL) - { - g_warning (_("Error loading pixmap file: %s"), found_filename); - g_free (found_filename); - return create_dummy_pixmap (widget); - } - g_free (found_filename); - pixmap = gtk_pixmap_new (gdkpixmap, mask); - gdk_pixmap_unref (gdkpixmap); - gdk_bitmap_unref (mask); - return pixmap; -} - -/* This is an internally used function to check if a pixmap file exists. */ -gchar* -check_file_exists (const gchar *directory, - const gchar *filename) -{ - gchar *full_filename; - struct stat s; - gint status; - - full_filename = (gchar*) g_malloc (strlen (directory) + 1 - + strlen (filename) + 1); - strcpy (full_filename, directory); - strcat (full_filename, G_DIR_SEPARATOR_S); - strcat (full_filename, filename); - - status = stat (full_filename, &s); - if (status == 0 && S_ISREG (s.st_mode)) - return full_filename; - g_free (full_filename); - return NULL; -} - diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/sdl-goom/gtk-support.h kodi-visualization-goom-2.1.0/lib/goom2k4-0/sdl-goom/gtk-support.h --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/sdl-goom/gtk-support.h 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/sdl-goom/gtk-support.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,61 +0,0 @@ -/* - * DO NOT EDIT THIS FILE - it is generated by Glade. - */ - -#ifdef HAVE_CONFIG_H -# include -#endif - -#include - -/* - * Standard gettext macros. - */ -#ifdef ENABLE_NLS -# include -# undef _ -# define _(String) dgettext (PACKAGE, String) -# ifdef gettext_noop -# define N_(String) gettext_noop (String) -# else -# define N_(String) (String) -# endif -#else -# define textdomain(String) (String) -# define gettext(String) (String) -# define dgettext(Domain,Message) (Message) -# define dcgettext(Domain,Message,Type) (Message) -# define bindtextdomain(Domain,Directory) (Domain) -# define _(String) (String) -# define N_(String) (String) -#endif - - -/* - * Public Functions. - */ - -/* - * This function returns a widget in a component created by Glade. - * Call it with the toplevel widget in the component (i.e. a window/dialog), - * or alternatively any widget in the component, and the name of the widget - * you want returned. - */ -GtkWidget* lookup_widget (GtkWidget *widget, - const gchar *widget_name); - -/* get_widget() is deprecated. Use lookup_widget instead. */ -#define get_widget lookup_widget - -/* Use this function to set the directory containing installed pixmaps. */ -void add_pixmap_directory (const gchar *directory); - - -/* - * Private Functions. - */ - -/* This is used to create the pixmaps in the interface. */ -GtkWidget* create_pixmap (GtkWidget *widget, - const gchar *filename); - diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/sdl-goom/Makefile.am kodi-visualization-goom-2.1.0/lib/goom2k4-0/sdl-goom/Makefile.am --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/sdl-goom/Makefile.am 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/sdl-goom/Makefile.am 1970-01-01 00:00:00.000000000 +0000 @@ -1,11 +0,0 @@ -# the goom2 stand alone program - -if HAVE_SDL -bin_PROGRAMS = goom2 - -goom2_LDADD = $(top_builddir)/src/libgoom2.la -goom2_LDFLAGS = $(SDL_LIBS) `gtk-config --libs` -goom2_SOURCES = frame_rate_tester.c gmtimer.c gtk-callbacks.c gtk-interface.c gtk-support.c pixeldoubler.c readme.c sdl_goom.c sdl_pixeldoubler.c surface.c -INCLUDES=$(SDL_CFLAGS) `gtk-config --cflags` -I../src/ -endif - diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/sdl-goom/pixeldoubler_athlon.s kodi-visualization-goom-2.1.0/lib/goom2k4-0/sdl-goom/pixeldoubler_athlon.s --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/sdl-goom/pixeldoubler_athlon.s 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/sdl-goom/pixeldoubler_athlon.s 1970-01-01 00:00:00.000000000 +0000 @@ -1,118 +0,0 @@ -bits 32 -global pixel_doubler - -%macro twopixproc 0 -%rep 2 - movq mm0,[esi] ; -> P1P2 - movq mm2,[esi+8] ; -> P3P4 - - movq mm1,mm0 - movq mm3,mm2 - - punpckldq mm1,mm1 ; P1P2 | P1P2 -> P1P1 - punpckhdq mm0,mm0 ; P1P2 | P1P2 -> P2P2 - - movntq [edi],mm1 - punpckldq mm3,mm3 ; P3P4 | P3P4 -> P3P3 - - movntq [edi+8],mm0 - punpckhdq mm2,mm2 ; P3P4 | P3P4 -> P4P4 - - movntq [edi+16],mm3 - movq mm4,[esi+16] - - movntq [edi+24],mm2 - movq mm6,[esi+24] - - movq mm5,mm4 - movq mm7,mm6 - - punpckldq mm5,mm5 ; P1P2 | P1P2 -> P1P1 - punpckhdq mm4,mm4 ; P1P2 | P1P2 -> P2P2 - - movntq [edi+32],mm5 - punpckldq mm7,mm7 ; P3P4 | P3P4 -> P3P3 - - movntq [edi+40],mm4 - punpckhdq mm6,mm6 ; P3P4 | P3P4 -> P4P4 - - movntq [edi+48],mm7 - add esi,32 - - movntq [edi+56],mm6 - add edi,64 -%endrep -%endmacro - -%macro prefetcher 0 - prefetch [esi+128] -%endmacro - - -align 16 -pixel_doubler: - push ebp - mov ebp,esp - push edi - push esi - push ebx - push ecx - push edx - - mov ecx,[ebp+8] ; ecx <- src - mov edx,[ebp+12] ; edx <- dest - - mov esi,[ecx] ; esi <- src->buf - mov edi,[edx] ; edi <- dest->buf - - mov ebx,[ecx+4] ; ebx <- src->width - mov eax,[ecx+8] ; eax <- src->height - - shl ebx,2 ; width *= 4 (in byte) - mov edx,ebx ; edx <- width in byte - shr ebx,6 ; width in cache page - -align 16 -while_1: - prefetch [esi] ; prefetch the first cache line - prefetch [esi+64] - - mov ecx,ebx - -while_2: - prefetcher - twopixproc - - dec ecx - jnz while_2 -; end_while_2 - - sub esi,edx - mov ecx,ebx - - prefetch [esi] ; prefetch the first cache line - prefetch [esi+64] - -while_3: - prefetcher - twopixproc - - dec ecx - jnz while_3 -; end_while_3 - - dec eax ; decremente le nombre de ligne testee - jnz while_1 ; on continue si c'etait pas la derniere - -; end_while_1: - - sfence - femms - - pop edx - pop ecx - pop ebx - pop esi - pop edi - leave - ret diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/sdl-goom/pixeldoubler.c kodi-visualization-goom-2.1.0/lib/goom2k4-0/sdl-goom/pixeldoubler.c --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/sdl-goom/pixeldoubler.c 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/sdl-goom/pixeldoubler.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,44 +0,0 @@ -#include "pixeldoubler.h" -#include -#include - -void pixel_doubler (Surface *src, Surface *dest) { - register int *d; // pointeur sur le pixel courant a marquer - register int *s; // pointeur sur le pixel coutant en cours de lecture - int sw; // nombre d'octet de largeur de ligne de la surface source - int sw2; - int fd; // adresse de la fin du buffer destination - int fin; // adresse de fin d'une ligne du buffer source - - d = dest->buf; - s = src->buf; - - sw = src->width << 2; - sw2 = sw << 1; - - fin = (int)s; - fd = (int)d + (dest->size<<2); - - // tant que tout le buffer source n'est pas remplit - while ((int)d < fd) { - - // passer a la ligne suivante du buffer source - fin += sw; - - // l'afficher sur une ligne du buffer destination - while ((int)s < fin) { - register int col = *(s++); - // 2 affichage par point du buffer source (doubling horizontal) - *(d++) = col; *(d++) = col; - } - - // puis l'afficher sur une autre ligne (doubling vertical) - memcpy (d, ((char*)d) - sw2, sw2); -/* s = (int*)((int)s - sw); // retour au debut de la ligne src - while ((int)s < fin) { - register int col = *(s++); - *(d++) = col; *(d++) = col; // idem (cf plus haut) - } */ - d = (int*)((char*)d + sw2); - } -} diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/sdl-goom/pixeldoubler.h kodi-visualization-goom-2.1.0/lib/goom2k4-0/sdl-goom/pixeldoubler.h --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/sdl-goom/pixeldoubler.h 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/sdl-goom/pixeldoubler.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,58 +0,0 @@ -#ifndef _PIXELDOUBLER_H -#define _PIXELDOUBLER_H - -#include "surface.h" - -/* - * copie la surface src dans la surface dest en doublant la taille des pixels. - * - * la surface dest doit faire exactement 2 fois la taille de la surface src. - * (segfault sinon). - * - * auteur : JeKo - * - * bench : <2001-11-28|20h00> 9 cycles par pixel marqu (cpm) sur un PII 266. - * (surement limit par le debit de la memoire vive.. - * je fonce chez moi verifier) - * 11 cpm sur un Duron 800. (i.e. pas loin de 300fps) - * surement que les acces memoires sont assez penalisant. - * je tente d'aligner les donnes des surfaces pour voir. - * => pas mieux : le systeme doit deja faire ca comme il faut. - * mais pour l'alignement 64bits ca va etre utile : je passe a l'ASM - * <3h00> l'optimisation asm a permi de gagner vraiment pas grand - * chose (0.1 ms sur mon Duron).. le code en C semble suffisant. - * et je persiste a croire ke la vitesse est plafonn par la vitesse - * d'acces a la memoire.. ceci expliquerait aussi cela. - * - * <2001-12-08|1h20> Travail sur le code assembleur : - * pour reduire les temps d'acces memoire, utilisation de - * l'instruction 3Dnow! PREFETCH/W pour le prechargement des - * page de cache. pour pousser cette optimisation jusque au bout : - * j'ai droul la boucle pour qu'elle traite a chaque passage - * une page de cache complete en lecture et 2 en ecriture. - * (optimis sur un Duron=Athlon, page de cache = 64 octets) - * preformances sur mon Duron 800 : 9 CPM. - * (ce qui fait 18% de mieux que la version en C) - * ATTENTION : CETTE VERSION NE SUPPORTE DONC QUE DES TAILLES DE - * SURFACE AYANT UNE LARGEUR MULTIPLE DE 32 POUR DEST, - * DONC 16 POUR SRC. (ce qui n'est pas tres genant puisque ce sont - * des resolutions standard, mais il faut le savoir) - * explication : alignement des donnes sur la taille des pages de - * cache. - * - * <2001-12-08|14h20> Apres intense potassage de la doc de l'Athlon, - * decouverte certaines subtilits de ce FABULEUX processeur :) - * entrelacement de la copie de 2 pixel, plus utilisation de - * l'instruction de transfert rapide 3Dnow! MOVNTQ... attention les - * chiffres -> sur mon Duron 800 : 4 CPM !!!!! - * - * note : ne fonctionne que sur un systeme 32bits.. mais le faire fonctionner - * sur une machine autre ne posera aucun probleme. - * (le seul truc c'est ke j'ai considr mes pointeurs comme des entiers - * 32bits <- je sais je suis vaxiste, et alors???:) - * - * copyright (c)2001, JC Hoelt for iOS software. - */ -void pixel_doubler (Surface *src, Surface *dest) ; - -#endif diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/sdl-goom/readme.c kodi-visualization-goom-2.1.0/lib/goom2k4-0/sdl-goom/readme.c --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/sdl-goom/readme.c 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/sdl-goom/readme.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,49 +0,0 @@ -#ifndef _GOOM_README_H -#define _GOOM_README_H - -/* Automatically generated from README, via Makefile.am */ -static char goom_readme[] = -"TAB - Enter/Leave Fullscreen\n" -"Numpad +/- - Change resolution\n" -"F1-F8 - Set Background FX\n" -"\n" -"F - Display Frame Rate\n" -"Q - Quit\n"; - -static char goom_big_readme[] = -"****************************\n" -"* What a GOOM! version 2k4 *\n" -"****************************\n" -"by Jean-Christophe 'Jeko' Hoelt\n" -"\n" -"\n" -"The incredible trippy visualization plugin!!\n" -"\n" -"\n" -"\n" -"...... freely offered by iOS-Software\n" -"Wanna find the last version of goom or support\n" -"us with a donation? There you go:\n" -"\n" -"http://www.ios-software.com/\n" -"\n" -"\n" -"\n" -"...... many thanks to:\n" -"\n" -"Skal for the code of IFS\n" -"\n" -"Gyom for the iTunes version\n" -" and some of the main work\n" -"\n" -"Fred for the Windows version and a lot of\n" -" other Goom Stuff\n" -"\n" -"Dennis and guys of libvisual for their\n" -" help on the unix package\n" -"\n" -"\n" -"\n" -"Enjoy!"; - -#endif /* _GOOM_README_H */ diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/sdl-goom/sdl_goom.c kodi-visualization-goom-2.1.0/lib/goom2k4-0/sdl-goom/sdl_goom.c --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/sdl-goom/sdl_goom.c 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/sdl-goom/sdl_goom.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,746 +0,0 @@ -#include -#include -#include "goom_config.h" - -#include -#include - -#include -#include -#include -#include -#include -#include - -#include "goom_tools.h" -#include "goom.h" - -#include "frame_rate_tester.h" -#include "gmtimer.h" - -#include "pixeldoubler.h" -#include "sdl_pixeldoubler.h" - -#include "readme.c" - -#include "gtk-support.h" -#include "gtk-interface.h" - -#include "sdl_goom.h" - -static SdlGoom sdlGoom; - -//#define BENCHMARK_X86 -#ifdef BENCHMARK_X86 -#include -static uint64_t GetTick() -{ - uint64_t x; - /* __asm__ volatile (".byte 0x0f, 0x31" : "=A" (x));*/ - asm volatile ("RDTSC" : "=A" (x)); - return x; -} -#endif - -/** - * Callback des parametres - */ -static void screen_size_changed (PluginParam *); -static void fps_limit_changed (PluginParam *); -static void pix_double_changed (PluginParam *); -static void hide_cursor_changed (PluginParam *); - -/** - * Initialise les parametres de la version SDL - */ -static void init_parameters() { - - static char *resolutions[4] = {"320x240","400x300","640x480","800x600"}; - static struct ListVal reslist = { - value:0, - nbChoices:4, - choices:resolutions - }; - - sdlGoom.screen_size = secure_param (); - sdlGoom.screen_size.name = "Window's Size:"; - sdlGoom.screen_size.desc = ""; - sdlGoom.screen_size.type = PARAM_LISTVAL; - sdlGoom.screen_size.param.slist = reslist; - sdlGoom.screen_size.changed = screen_size_changed; - set_list_param_value(&sdlGoom.screen_size, "400x300"); - - sdlGoom.fps_limit = secure_param (); - sdlGoom.fps_limit.name = "Frame Rate:"; - sdlGoom.fps_limit.desc = ""; - sdlGoom.fps_limit.type = PARAM_INTVAL; - sdlGoom.fps_limit.param.ival.min = 1; - sdlGoom.fps_limit.param.ival.max = 35; - sdlGoom.fps_limit.param.ival.value = 30; - sdlGoom.fps_limit.param.ival.step = 1; - sdlGoom.fps_limit.changed = fps_limit_changed; - - sdlGoom.pix_double = secure_param (); - sdlGoom.pix_double.name = "Double Pixel"; - sdlGoom.pix_double.type = PARAM_BOOLVAL; - sdlGoom.pix_double.changed = pix_double_changed; - BVAL(sdlGoom.pix_double) = 0; - - sdlGoom.hide_cursor = secure_param (); - sdlGoom.hide_cursor.name = "Hide Cursor"; - sdlGoom.hide_cursor.type = PARAM_BOOLVAL; - sdlGoom.hide_cursor.changed = hide_cursor_changed; - BVAL(sdlGoom.hide_cursor) = 1; - - sdlGoom.display_fps = secure_param (); - sdlGoom.display_fps.name = "Display FPS"; - sdlGoom.display_fps.type = PARAM_BOOLVAL; - BVAL(sdlGoom.display_fps) = 0; - - sdlGoom.screen = plugin_parameters("Display", 7); - sdlGoom.screen.params[0]=&sdlGoom.screen_size; - sdlGoom.screen.params[1]=&sdlGoom.pix_double; - sdlGoom.screen.params[2]=0; - sdlGoom.screen.params[3]=&sdlGoom.fps_limit; - sdlGoom.screen.params[4]=&sdlGoom.display_fps; - sdlGoom.screen.params[5]=0; - sdlGoom.screen.params[6]=&sdlGoom.hide_cursor; - - sdlGoom.config_win = 0; - sdlGoom.screen_height = 300; - sdlGoom.screen_width = 400; - sdlGoom.doublepix = 0; - sdlGoom.active = 1; -} - -/* - * Methodes utilitaires - */ -char *sdl_goom_set_doublepix (int dp); -static void apply_double (); - - -static int resx = 400; -static int resy = 300; -static int doublepix = 0; -static int doubledec = 0; - -static int MAX_FRAMERATE = 32; -static double INTERPIX = 1000.0f / 32; - -static SDL_Surface *surface = NULL; -static int is_fs = 0; - -/* static void thread_func (); */ - -static void sdl_goom_init (int argc, char **argv); -static void sdl_goom_cleanup (); -static void sdl_goom_loop (); -static void sdl_goom_render_pcm (gint16 data[2][512], gchar *title); - -static Surface *gsurf2 = NULL; -static Surface gsurf; -static char *main_script = NULL; -static char *init_script = NULL; - -static int fini = 0; -static int disable = 0; -static gint16 snd_data[2][512]; - -#include - -void on_kill(int i) { - fini = 1; - disable = 1; -} - -int main (int argc, char **argv) { - - gtk_set_locale (); - gtk_init (&argc, &argv); - - sdl_goom_init(argc, argv); - signal(SIGQUIT, on_kill); - sdl_goom_loop(); - sdl_goom_cleanup(); - return 0; -} - -static char *load_file(const char *fname) -{ - FILE *f = fopen(fname, "rt"); - long size; - char *sc; - - if (!f) { - fprintf(stderr, "Could not load file %s\n", fname); - return ""; - } - - fseek(f, 0L, SEEK_END); - size = ftell(f); - rewind(f); - sc = (char*)malloc(size+1); - fread(sc,1,size,f); - sc[size] = 0; - fclose(f); - printf("%s loaded\n", fname); - return sc; -} - -static void display_help() -{ - printf("usage: goom2 \n"); -} - -static void check_arg(int argc, char *argv) -{ - static int has_init = 0; - static int has_main = 0; - - if (argv[0] == '-') { - if ((!strcmp(argv,"-h"))||(!strcmp(argv,"--help"))) { - display_help(); - exit(0); - } - } - else if (!has_init) { - init_script = load_file(argv); - has_init = 1; - } - else if (!has_main) { - main_script = load_file(argv); - has_main = 1; - } -} - -void sdl_goom_init (int argc, char **argv) -{ - gint16 data[2][512]; - int i; - int init_flags = SDL_INIT_VIDEO; - - for (i=1; i INITIALIZING GOOM\n"); -#endif - - fini = FALSE; -#ifdef THIS_MAKES_ATI_CARDS_TO_CRASH__linux__ - /* This Hack Allows Hardware Surface on Linux */ - setenv("SDL_VIDEODRIVER","dga",0); - - if (SDL_Init(init_flags) < 0) { - printf(":-( Could not use DGA. Try using goom2 as root.\n"); - setenv("SDL_VIDEODRIVER","x11",1); - if (SDL_Init(init_flags) < 0) { - fprintf(stderr, "SDL initialisation error: %s\n", SDL_GetError()); - exit(1); - } - } - else { - printf(":-) DGA Available !\n"); - SDL_WM_GrabInput(SDL_GRAB_ON); - } -#else - if ( SDL_Init(init_flags) < 0 ) { - fprintf(stderr, "SDL initialisation error: %s\n", SDL_GetError()); - exit(1); - } -#endif - surface = SDL_SetVideoMode (resx, resy, 32, - SDL_RESIZABLE|SDL_SWSURFACE); - SDL_WM_SetCaption ("What A Goom!!", NULL); - SDL_ShowCursor (0); - SDL_EnableKeyRepeat (0, 0); - atexit(SDL_Quit); - - apply_double (); - sdlGoom.plugin = goom_init (resx, resy); - - /*if (init_script != NULL) { - gsl_ex(sdlGoom.plugin, init_script); - } - - if (main_script != NULL) { - goom_set_main_script(sdlGoom.plugin, main_script); - }*/ - - for (i = 0; i < 512; i++) { - data[0][i] = 0; - data[1][i] = 0; - } - - framerate_tester_init (); -} - -/* retourne x>>s , en testant le signe de x */ -#define ShiftRight(_x,_s) ((_x<0) ? -(-_x>>_s) : (_x>>_s)) - -static void -sdl_goom_loop() -{ - static double tnext = 0; - static gint16 prev0 = 0; - static int i, j; - gchar *ptitle = NULL; - static char title[2048]; - - if (tnext < 0.01) - tnext = INTERPIX + SDL_GetTicks(); - - while (!fini) { - double t; - sdl_goom_render_pcm (snd_data, ptitle); - ptitle = NULL; - - /* load the sound data */ - { - fd_set rfds; - struct timeval tv; - int retval; - - tv.tv_sec = 0; - tv.tv_usec = 10; - - FD_ZERO(&rfds); - FD_SET(0, &rfds); - retval = select(1, &rfds, NULL, NULL, &tv); - - if (retval) { - int type; - read (0, &type, sizeof(int)); - switch (type) { - case 0: - read (0, snd_data, 512*2*2); - break; - case 1: - read (0, title, 2048); - ptitle = &title[0]; - break; - case 2: - fini = 1; - disable = TRUE; - break; - } - } - } - - if (prev0 == snd_data[0][0]) { - for (i = 0; i < 2; i++) - for (j = 0; j < 512; j++) - snd_data[i][j] = ShiftRight((snd_data[i][j] * 31),5); - } - prev0 = snd_data[0][0]; - - t = SDL_GetTicks(); - if (t < tnext) { - float t2s = (tnext-t); - while (t2s>20) { - usleep(20*1000); - gtk_main_iteration_do(FALSE); - t = SDL_GetTicks(); - t2s = tnext-t; - } - tnext += INTERPIX; - } - else { - tnext = t+INTERPIX; - } - i = 0; - while (gtk_main_iteration_do(FALSE) == TRUE) { - if (i++ > 10) - break; - } - } - /* else { - * gtk_main_quit(); - * } - */ -} - -static void -sdl_goom_cleanup (void) -{ -#ifdef VERBOSE - printf ("--> CLEANUP GOOM\n"); -#endif - - if (is_fs) { - SDL_WM_ToggleFullScreen (surface); - } - SDL_Quit (); - - goom_close (sdlGoom.plugin); - framerate_tester_close (); -} - - -/*===============================*/ - -static void apply_double () { - - if (gsurf2) surface_delete (&gsurf2); - if (!doublepix) - return; - - if (surface->format->BytesPerPixel == 4) - doublepix = 2; - else - doublepix = 1; - - if (doublepix==2) { - resx /= 2; - resy /= 2; - doubledec = 0; - } - else if (doublepix == 1) { - doubledec = resx % 32; - resx = resx - doubledec; - resx /= 2; - resy /= 2; - doubledec /= 2; - gsurf2 = surface_new (resx*2,resy*2); - } - - gsurf.width = resx; - gsurf.height = resy; - gsurf.size = resx*resy; -} - - -static char * resize_win (int w, int h, int force) { - static char s[256]; - if ((w != sdlGoom.screen_width)||(h != sdlGoom.screen_height)||force) { - static SDL_Event e; - e.resize.type = SDL_VIDEORESIZE; - e.resize.w = w; - e.resize.h = h; - SDL_PushEvent (&e); - } - sprintf (s,"%dx%d",w,h); - return s; -} - -static void -sdl_goom_render_pcm (gint16 data[2][512], gchar *title) -{ -#ifdef BENCHMARK_X86 - uint64_t t0,t1,t2; -#endif - static char *msg_tab[] = { - "What a GOOM! version " VERSION - "\n\n\n\n\n\n\n\n" - "an iOS sotfware production.\n" - "\n\n\n" - "http://www.ios-software.com/", - goom_readme, - goom_big_readme, - "Copyright (c)2000-2004, by Jeko" - }; - static int msg_pos = 0; -#define ENCORE_NUL_LOCK (32*200) - static int encore_nul = 0; - - guint32 *buf; - SDL_Surface *tmpsurf = NULL; - - /* static int spos = -1; */ - - gchar *message = NULL; - - /* TODO : Utiliser une commande dans le pipe * - * int pos = xmms_remote_get_playlist_pos (jeko_vp.xmms_session); - */ - - int forceMode = 0; - -#define NBresoli 11 - static int resoli = 7; - static int resolx[] = {320,320,400,400,512,512,640,640,640,800,800}; - static int resoly[] = {180,240,200,300,280,384,320,400,480,400,600}; - - int i; - SDL_Event event; - - /* Check for events */ - while (SDL_PollEvent (&event)) { /* Loop until there are no events left on - * the queue */ - switch (event.type) { /* Process the appropiate event type */ - case SDL_QUIT: - { - fini = 1; - disable = TRUE; - } - break; - - case SDL_ACTIVEEVENT: - if (event.active.state & SDL_APPACTIVE) - sdlGoom.active = event.active.gain; - break; - - case SDL_KEYDOWN: /* Handle a KEYDOWN event */ - if (event.key.keysym.sym == SDLK_TAB) { - SDL_WM_ToggleFullScreen (surface); - is_fs = !is_fs; - } - - if (event.key.keysym.sym == SDLK_q) { - fini = 1; - } - /* - * TODO : GERER TOUT CA AVEC XMMS REMOTE CTRL ? ou le pipe * - if (event.key.keysym.sym == SDLK_q) { - xmms_remote_quit (jeko_vp.xmms_session); - } - - if (event.key.keysym.sym == SDLK_x) - xmms_remote_play (jeko_vp.xmms_session); - if (event.key.keysym.sym == SDLK_c) - xmms_remote_pause (jeko_vp.xmms_session); - if (event.key.keysym.sym == SDLK_v) - xmms_remote_stop (jeko_vp.xmms_session); - if (event.key.keysym.sym == SDLK_b) - xmms_remote_playlist_next (jeko_vp.xmms_session); - if (event.key.keysym.sym == SDLK_z) - xmms_remote_playlist_prev (jeko_vp.xmms_session); - */ - - if (event.key.keysym.sym == SDLK_f) { - BVAL(sdlGoom.display_fps) = !BVAL(sdlGoom.display_fps); - sdlGoom.display_fps.change_listener(&sdlGoom.display_fps); - } - - if ((event.key.keysym.sym == SDLK_KP_PLUS) && (resoli+10)) { - resoli = resoli-1; - resize_win (resolx[resoli],resoly[resoli],FALSE); - } - - if (event.key.keysym.sym == SDLK_KP_MULTIPLY) { - title = sdl_goom_set_doublepix (!doublepix); - } - if (event.key.keysym.sym == SDLK_ESCAPE) { - if (is_fs) { - SDL_WM_ToggleFullScreen (surface); - is_fs = !is_fs; - } - else if (sdlGoom.config_win == 0) { - sdlGoom.config_win = create_config_window (); - gtk_data_init (&sdlGoom); - gtk_widget_show (sdlGoom.config_win); - message = ""; - } - else { - message = "Configuration Window is Already Open"; - } - } - if (event.key.keysym.sym == SDLK_SPACE) { - encore_nul = ENCORE_NUL_LOCK; - } - - if (event.key.keysym.sym == SDLK_F1) - forceMode = 1; - if (event.key.keysym.sym == SDLK_F2) - forceMode = 2; - if (event.key.keysym.sym == SDLK_F3) - forceMode = 3; - if (event.key.keysym.sym == SDLK_F4) - forceMode = 4; - if (event.key.keysym.sym == SDLK_F5) - forceMode = 5; - if (event.key.keysym.sym == SDLK_F6) - forceMode = 6; - if (event.key.keysym.sym == SDLK_F7) - forceMode = 7; - if (event.key.keysym.sym == SDLK_F8) - forceMode = 8; - if (event.key.keysym.sym == SDLK_F9) - forceMode = 9; - if (event.key.keysym.sym == SDLK_F10) - forceMode = 10; - - break; - case SDL_VIDEORESIZE: - resx = sdlGoom.screen_width = event.resize.w; - resy = sdlGoom.screen_height = event.resize.h; - sdlGoom.doublepix = doublepix; - { - static char s[512]; - sprintf (s,"%dx%d",resx,resy); - title = s; - set_list_param_value(&sdlGoom.screen_size, s); - sdlGoom.screen_size.change_listener (&sdlGoom.screen_size); - } - surface = SDL_SetVideoMode (resx, resy, 32, - SDL_RESIZABLE|SDL_SWSURFACE); - apply_double(); - goom_set_resolution (sdlGoom.plugin,resx, resy); - if (is_fs) - SDL_WM_ToggleFullScreen (surface); - break; - /* default: * Report an unhandled event */ - /* printf("I don't know what this event is!\n"); */ - } - } - - for (i=0;i<512;i++) - if (data[0][i]>2) { - if (encore_nul > ENCORE_NUL_LOCK) - encore_nul = 0; - break; - } - - if ((i == 512) && (!encore_nul)) - encore_nul = ENCORE_NUL_LOCK + 100; - - if (encore_nul == ENCORE_NUL_LOCK) { - message = msg_tab[msg_pos]; - msg_pos ++; - msg_pos %= 4; - } - - if (encore_nul) - encore_nul --; - - if (!sdlGoom.active) { - return; - } - - /* - * TODO: - * if (pos != spos) { - * title = xmms_remote_get_playlist_title (jeko_vp.xmms_session, pos); - * spos = pos; - * } - */ - -#ifdef BENCHMARK_X86 - t0 = GetTick(); -#endif - if (doublepix == 0) - goom_set_screenbuffer(sdlGoom.plugin, surface->pixels); - - buf = goom_update (sdlGoom.plugin, data, forceMode, - BVAL(sdlGoom.display_fps)?framerate_tester_getvalue ():-1, - title, message); - -#ifdef BENCHMARK_X86 - t1 = GetTick(); -#endif - - if (doublepix == 2) { - gsurf.buf = buf; - sdl_pixel_doubler (&gsurf,surface); - } else if (doublepix == 1) { - SDL_Rect rect; - gsurf.buf = buf; - pixel_doubler (&gsurf,gsurf2); - tmpsurf = - SDL_CreateRGBSurfaceFrom (gsurf2->buf, resx*2, resy*2, - 32, resx*8, - 0x00ff0000, 0x0000ff00, 0x000000ff, - 0x00000000); - rect.x = doubledec; - rect.y = 0; - rect.w = resx * 2; - rect.h = resy * 2; - SDL_BlitSurface (tmpsurf, NULL, surface, &rect); - SDL_FreeSurface (tmpsurf); - } - else { -/* tmpsurf = - SDL_CreateRGBSurfaceFrom (buf, resx, resy, 32, resx * 4, - 0x00ff0000, 0x0000ff00, 0x000000ff, - 0x00000000); - SDL_BlitSurface (tmpsurf, NULL, surface, NULL); - SDL_FreeSurface (tmpsurf); - SDL_LockSurface(surface); - memcpy(surface->pixels, buf, resx * resy * 4); - SDL_UnlockSurface(surface); -*/ - } - SDL_Flip (surface); -#ifdef BENCHMARK_X86 - t2 = GetTick(); - - t2 -= t1; - t1 -= t0; - { - double ft1, ft2; - static double min_t1 = 1000.0, - min_t2 = 1000.0; - static double moy_t1 = 150.0; - static double moy_t2 = 40.0; - - ft1 = (double)(t1 / sdlGoom.plugin->screen.size); - ft2 = (double)(t2 / sdlGoom.plugin->screen.size); - - if (ft1 < min_t1) - min_t1 = ft1; - if (ft2 < min_t2) - min_t2 = ft2; - - moy_t1 = ((moy_t1 * 15.0) + ft1) / 16.0; - moy_t2 = ((moy_t2 * 15.0) + ft2) / 16.0; - printf("UPDATE = %4.0f/%3.0f CPP ", moy_t1, min_t1); - printf("DISPLAY = %4.0f/%3.0f CPP\n", moy_t2, min_t2); - } -#endif - - framerate_tester_newframe (); -} - - -char *sdl_goom_set_doublepix (int dp) { - if (doublepix && dp) return " "; - if (!doublepix && !dp) return " "; - - doublepix = dp; - BVAL(sdlGoom.pix_double) = dp; - sdlGoom.pix_double.change_listener(&sdlGoom.pix_double); - if (doublepix) - return resize_win (resx,resy,TRUE); - else - return resize_win (resx*2,resy*2,TRUE); -} - -void sdl_goom_set_fps (int fps) { - MAX_FRAMERATE = fps; - INTERPIX = 1000.0 / MAX_FRAMERATE; -} - -void pix_double_changed (PluginParam *p) { - sdl_goom_set_doublepix (BVAL(*p)); -} - -void screen_size_changed (PluginParam *p) { - int i; - static struct Resol { char*name; int x; int y; } res[4] = { - {"320x240", 320, 240}, - {"400x300", 400, 300}, - {"640x480", 640, 480}, - {"800x600", 800, 600}}; - - for (i=4;i--;) { - if (!strcmp(LVAL(*p),res[i].name)) - resize_win (res[i].x,res[i].y,FALSE); - } -} - -void fps_limit_changed (PluginParam *p) { - MAX_FRAMERATE = IVAL(*p); - INTERPIX = 1000.0 / MAX_FRAMERATE; -} - -void hide_cursor_changed (PluginParam *p) { - SDL_ShowCursor(!BVAL(*p)); -} diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/sdl-goom/sdl_goom.h kodi-visualization-goom-2.1.0/lib/goom2k4-0/sdl-goom/sdl_goom.h --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/sdl-goom/sdl_goom.h 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/sdl-goom/sdl_goom.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,30 +0,0 @@ -#ifndef _SDL_GOOM_H -#define _SDL_GOOM_H - -#include -#include "goom_config_param.h" -#include "goom_plugin_info.h" - -typedef struct _SDL_GOOM { - GtkWidget *config_win; - - int screen_width; - int screen_height; - int doublepix; - int active; - - PluginInfo *plugin; /* infos about the plugin (see plugin_info.h) */ - - PluginParameters screen; /* contains screen_size, pix_double, fps_limit */ - - PluginParam screen_size; - PluginParam pix_double; - PluginParam fps_limit; - PluginParam display_fps; - PluginParam hide_cursor; - -} SdlGoom; - -void gtk_data_init(SdlGoom *sdlGoom); - -#endif diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/sdl-goom/sdl_pixeldoubler.c kodi-visualization-goom-2.1.0/lib/goom2k4-0/sdl-goom/sdl_pixeldoubler.c --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/sdl-goom/sdl_pixeldoubler.c 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/sdl-goom/sdl_pixeldoubler.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,51 +0,0 @@ -#include "pixeldoubler.h" -#include -#include -#include - -void sdl_pixel_doubler (Surface *src, SDL_Surface *dest) { - register int *d; // pointeur sur le pixel courant a marquer - register int *s; // pointeur sur le pixel coutant en cours de lecture - int sw; // nombre d'octet de largeur de ligne de la surface source - int sw2,swd; - int fd; // adresse de la fin du buffer destination - int fin; // adresse de fin d'une ligne du buffer source - - SDL_LockSurface (dest); - - d = dest->pixels; - s = src->buf; - - sw = src->width << 2; - sw2 = dest->pitch; - swd = sw2 - sw * 2; - - fin = (int)s; - fd = (int)d + (sw2 * src->height * 2); - - // tant que tout le buffer source n'est pas remplit - while ((int)d < fd) { - - // passer a la ligne suivante du buffer source - fin += sw; - - // l'afficher sur une ligne du buffer destination - while ((int)s < fin) { - register int col = *(s++); - // 2 affichage par point du buffer source (doubling horizontal) - *(d++) = col; *(d++) = col; - } - d = (int*)((char*)d + swd); - - // puis l'afficher sur une autre ligne (doubling vertical) - memcpy (d, ((char*)d) - sw2, sw2); -/* s = (int*)((int)s - sw); // retour au debut de la ligne src - while ((int)s < fin) { - register int col = *(s++); - *(d++) = col; *(d++) = col; // idem (cf plus haut) - } */ - d = (int*)((char*)d + sw2); - } - - SDL_UnlockSurface (dest); -} diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/sdl-goom/sdl_pixeldoubler.h kodi-visualization-goom-2.1.0/lib/goom2k4-0/sdl-goom/sdl_pixeldoubler.h --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/sdl-goom/sdl_pixeldoubler.h 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/sdl-goom/sdl_pixeldoubler.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,2 +0,0 @@ -#include -void sdl_pixel_doubler (Surface *src, SDL_Surface *dest); diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/sdl-goom/surface.c kodi-visualization-goom-2.1.0/lib/goom2k4-0/sdl-goom/surface.c --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/sdl-goom/surface.c 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/sdl-goom/surface.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -#include "surface.h" -#include - -Surface * surface_new (int w, int h) { - Surface * s = (Surface*)malloc(sizeof(Surface)); - s->realstart = (int*)malloc(w*h*4 + 128); - s->buf = (int*)((int)s->realstart + 128 - (((int)s->realstart) % 128)); - s->size = w*h; - s->width = w; - s->height = h; - return s; -} - -void surface_delete (Surface **s) { - free ((*s)->realstart); - free (*s); - *s = NULL; -} diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/sdl-goom/surface.h kodi-visualization-goom-2.1.0/lib/goom2k4-0/sdl-goom/surface.h --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/sdl-goom/surface.h 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/sdl-goom/surface.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,16 +0,0 @@ -#ifndef _SURFACE_H -#define _SURFACE_H - -typedef struct { - int * buf; - int width; - int height; - int size; - - int * realstart; -} Surface; - -Surface * surface_new (int w, int h) ; -void surface_delete (Surface **s) ; - -#endif diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/config_param.c kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/config_param.c --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/config_param.c 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/config_param.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,110 +0,0 @@ -/*---------------------------------------------------------------------------*/ -/* -** config_param.c -** Goom Project -** -** Created by Jean-Christophe Hoelt on Sat Jul 19 2003 -** Copyright (c) 2003 iOS. All rights reserved. -*/ -/*---------------------------------------------------------------------------*/ - -#include "goom_config_param.h" -#include - -/* TODO: Ajouter goom_ devant ces fonctions */ - -static void empty_fct(PluginParam *dummy) { -} - -PluginParam goom_secure_param() { - PluginParam p; - p.changed = empty_fct; - p.change_listener = empty_fct; - p.user_data = 0; - p.name = p.desc = 0; - p.rw = 1; - return p; -} - -PluginParam goom_secure_f_param(char *name) { - PluginParam p = secure_param(); - p.name = name; - p.type = PARAM_FLOATVAL; - FVAL(p) = 0.5f; - FMIN(p) = 0.0f; - FMAX(p) = 1.0f; - FSTEP(p) = 0.01f; - return p; -} - -PluginParam goom_secure_f_feedback(char *name) { - PluginParam p = secure_f_param(name); - p.rw = 0; - return p; -} - -PluginParam goom_secure_s_param(char *name) { - PluginParam p = secure_param(); - p.name = name; - p.type = PARAM_STRVAL; - SVAL(p) = 0; - return p; -} - -PluginParam goom_secure_b_param(char *name, int value) { - PluginParam p = secure_param(); - p.name = name; - p.type = PARAM_BOOLVAL; - BVAL(p) = value; - return p; -} - -PluginParam goom_secure_i_param(char *name) { - PluginParam p = secure_param(); - p.name = name; - p.type = PARAM_INTVAL; - IVAL(p) = 50; - IMIN(p) = 0; - IMAX(p) = 100; - ISTEP(p) = 1; - return p; -} - -PluginParam goom_secure_i_feedback(char *name) { - PluginParam p = secure_i_param(name); - p.rw = 0; - return p; -} - -PluginParameters goom_plugin_parameters(const char *name, int nb) { - PluginParameters p; - p.name = (char *)name; - p.desc = ""; - p.nbParams = nb; - p.params = (PluginParam**)malloc(nb*sizeof(PluginParam*)); - return p; -} - -/*---------------------------------------------------------------------------*/ - -void goom_set_str_param_value(PluginParam *p, const char *str) { - int len = strlen(str); - if (SVAL(*p)) - SVAL(*p) = (char*)realloc(SVAL(*p), len+1); - else - SVAL(*p) = (char*)malloc(len+1); - memcpy(SVAL(*p), str, len+1); -} - -void goom_set_list_param_value(PluginParam *p, const char *str) { - int len = strlen(str); -#ifdef VERBOSE - printf("%s: %d\n", str, len); -#endif - if (LVAL(*p)) - LVAL(*p) = (char*)realloc(LVAL(*p), len+1); - else - LVAL(*p) = (char*)malloc(len+1); - memcpy(LVAL(*p), str, len+1); -} - diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/convolve_fx.c kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/convolve_fx.c --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/convolve_fx.c 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/convolve_fx.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,336 +0,0 @@ -#include "goom_fx.h" -#include "goom_plugin_info.h" -#include "goomsl.h" -#include "goom_config.h" -#include -#include -#include -#include - -//#define CONV_MOTIF_W 32 -//#define CONV_MOTIF_WMASK 0x1f - -#define CONV_MOTIF_W 128 -#define CONV_MOTIF_WMASK 0x7f - -typedef char Motif[CONV_MOTIF_W][CONV_MOTIF_W]; - -#include "motif_goom1.h" -#include "motif_goom2.h" - -#define NB_THETA 512 - -#define MAX 2.0f - -typedef struct _CONV_DATA{ - PluginParam light; - PluginParam factor_adj_p; - PluginParam factor_p; - PluginParameters params; - - GoomSL *script; - - /* rotozoom */ - int theta; - float ftheta; - int h_sin[NB_THETA]; - int h_cos[NB_THETA]; - int h_height; - float visibility; - Motif conv_motif; - int inverse_motif; - -} ConvData; - -/* init rotozoom tables */ -static void compute_tables(VisualFX *_this, PluginInfo *info) -{ - ConvData *data = (ConvData*)_this->fx_data; - double screen_coef; - int i; - double h; - double radian; - - if (data->h_height == info->screen.height) return; - - screen_coef = 2.0 * 300.0 / (double)info->screen.height; - data->h_height = info->screen.height; - - for ( i=0 ; ih_cos[i] = 0x10000 * (-h * cos (radian) * cos(radian)); - data->h_sin[i] = 0x10000 * (h * sin (radian + 1.57) * sin(radian)); - } -} - -static void set_motif(ConvData *data, Motif motif) -{ - int i,j; - for (i=0;iconv_motif[i][j] = motif[CONV_MOTIF_W-i-1][CONV_MOTIF_W-j-1]; -} - -static void convolve_init(VisualFX *_this, PluginInfo *info) { - ConvData *data; - data = (ConvData*)malloc(sizeof(ConvData)); - _this->fx_data = (void*)data; - - data->light = secure_f_param("Screen Brightness"); - data->light.param.fval.max = 300.0f; - data->light.param.fval.step = 1.0f; - data->light.param.fval.value = 100.0f; - - data->factor_adj_p = secure_f_param("Flash Intensity"); - data->factor_adj_p.param.fval.max = 200.0f; - data->factor_adj_p.param.fval.step = 1.0f; - data->factor_adj_p.param.fval.value = 70.0f; - - data->factor_p = secure_f_feedback("Factor"); - - data->params = plugin_parameters ("Bright Flash", 5); - data->params.params[0] = &data->light; - data->params.params[1] = &data->factor_adj_p; - data->params.params[2] = 0; - data->params.params[3] = &data->factor_p; - data->params.params[4] = 0; - - /* init rotozoom tables */ - compute_tables(_this, info); - data->theta = 0; - data->ftheta = 0.0; - data->visibility = 1.0; - set_motif(data, CONV_MOTIF2); - data->inverse_motif = 0; - - _this->params = &data->params; -} - -static void convolve_free(VisualFX *_this) { - ConvData *data = _this->fx_data; - free (data->params.params); - free (data); -} - -static void create_output_with_brightness(VisualFX *_this, Pixel *src, Pixel *dest, - PluginInfo *info, int iff) -{ - ConvData *data = (ConvData*)_this->fx_data; - - int x,y; - int i = 0;//info->screen.height * info->screen.width - 1; - - const int c = data->h_cos [data->theta]; - const int s = data->h_sin [data->theta]; - - const int xi = -(info->screen.width/2) * c; - const int yi = (info->screen.width/2) * s; - - const int xj = -(info->screen.height/2) * s; - const int yj = -(info->screen.height/2) * c; - - int xprime = xj; - int yprime = yj; - - int ifftab[16]; - if (data->inverse_motif) { - int i; - for (i=0;i<16;++i) - ifftab[i] = (double)iff * (1.0 + data->visibility * (15.0 - i) / 15.0); - } - else { - int i; - for (i=0;i<16;++i) - ifftab[i] = (double)iff / (1.0 + data->visibility * (15.0 - i) / 15.0); - } - - for (y=info->screen.height;y--;) { - int xtex,ytex; - - xtex = xprime + xi + CONV_MOTIF_W * 0x10000 / 2; - xprime += s; - - ytex = yprime + yi + CONV_MOTIF_W * 0x10000 / 2; - yprime += c; - -#ifdef HAVE_MMX - __asm__ __volatile__ - ("\n\t pxor %%mm7, %%mm7" /* mm7 = 0 */ - "\n\t movd %[xtex], %%mm2" - "\n\t movd %[ytex], %%mm3" - "\n\t punpckldq %%mm3, %%mm2" /* mm2 = [ ytex | xtex ] */ - "\n\t movd %[c], %%mm4" - "\n\t movd %[s], %%mm6" - "\n\t pxor %%mm5, %%mm5" - "\n\t psubd %%mm6, %%mm5" - "\n\t punpckldq %%mm5, %%mm4" /* mm4 = [ -s | c ] */ - "\n\t movd %[motif], %%mm6" /* mm6 = motif */ - - ::[xtex]"g"(xtex) ,[ytex]"g"(ytex) - , [c]"g"(c), [s]"g"(s) - , [motif] "g"(&data->conv_motif[0][0])); - - for (x=info->screen.width;x--;) - { - __asm__ __volatile__ - ( - "\n\t movd %[src], %%mm0" /* mm0 = src */ - "\n\t paddd %%mm4, %%mm2" /* [ ytex | xtex ] += [ -s | s ] */ - "\n\t movd %%esi, %%mm5" /* save esi into mm5 */ - "\n\t movq %%mm2, %%mm3" - "\n\t psrld $16, %%mm3" /* mm3 = [ (ytex>>16) | (xtex>>16) ] */ - "\n\t movd %%mm3, %%eax" /* eax = xtex' */ - - "\n\t psrlq $25, %%mm3" - "\n\t movd %%mm3, %%ecx" /* ecx = ytex' << 7 */ - - "\n\t andl $127, %%eax" - "\n\t andl $16256, %%ecx" - - "\n\t addl %%ecx, %%eax" - "\n\t movd %%mm6, %%esi" /* esi = motif */ - "\n\t xorl %%ecx, %%ecx" - "\n\t movb (%%eax,%%esi), %%cl" - - "\n\t movl %[ifftab], %%eax" - "\n\t movd %%mm5, %%esi" /* restore esi from mm5 */ - "\n\t movd (%%eax,%%ecx,4), %%mm1" /* mm1 = [0|0|0|iff2] */ - - "\n\t punpcklwd %%mm1, %%mm1" - "\n\t punpcklbw %%mm7, %%mm0" - "\n\t punpckldq %%mm1, %%mm1" - "\n\t psrlw $1, %%mm0" - "\n\t psrlw $2, %%mm1" - "\n\t pmullw %%mm1, %%mm0" - "\n\t psrlw $5, %%mm0" - "\n\t packuswb %%mm7, %%mm0" - "\n\t movd %%mm0, %[dest]" - : [dest] "=g" (dest[i].val) - : [src] "g" (src[i].val) - , [ifftab]"g"(&ifftab[0]) - : "eax","ecx"); - - i++; - } -#else - for (x=info->screen.width;x--;) { - - int iff2; - unsigned int f0,f1,f2,f3; - - xtex += c; - ytex -= s; - - iff2 = ifftab[data->conv_motif[(ytex >>16) & CONV_MOTIF_WMASK][(xtex >> 16) & CONV_MOTIF_WMASK]]; - -#define sat(a) ((a)>0xFF?0xFF:(a)) - f0 = src[i].val; - f1 = ((f0 >> R_OFFSET) & 0xFF) * iff2 >> 8; - f2 = ((f0 >> G_OFFSET) & 0xFF) * iff2 >> 8; - f3 = ((f0 >> B_OFFSET) & 0xFF) * iff2 >> 8; - dest[i].val = (sat(f1) << R_OFFSET) | (sat(f2) << G_OFFSET) | (sat(f3) << B_OFFSET); -/* - f0 = (src[i].cop[0] * iff2) >> 8; - f1 = (src[i].cop[1] * iff2) >> 8; - f2 = (src[i].cop[2] * iff2) >> 8; - f3 = (src[i].cop[3] * iff2) >> 8; - - dest[i].cop[0] = (f0 & 0xffffff00) ? 0xff : (unsigned char)f0; - dest[i].cop[1] = (f1 & 0xffffff00) ? 0xff : (unsigned char)f1; - dest[i].cop[2] = (f2 & 0xffffff00) ? 0xff : (unsigned char)f2; - dest[i].cop[3] = (f3 & 0xffffff00) ? 0xff : (unsigned char)f3; -*/ - i++; - } -#endif - } -#ifdef HAVE_MMX - __asm__ __volatile__ ("\n\t emms"); -#endif - - compute_tables(_this, info); -} - - -/*#include - -static uint64_t GetTick() -{ - uint64_t x; - asm volatile ("RDTSC" : "=A" (x)); - return x; -}*/ - - -static void convolve_apply(VisualFX *_this, Pixel *src, Pixel *dest, PluginInfo *info) { - - ConvData *data = (ConvData*)_this->fx_data; - float ff; - int iff; - - ff = (FVAL(data->factor_p) * FVAL(data->factor_adj_p) + FVAL(data->light) ) / 100.0f; - iff = (unsigned int)(ff * 256); - - { - double fcycle = (double)info->cycle; - double rotate_param, rotate_coef; - float INCREASE_RATE = 1.5; - float DECAY_RATE = 0.955; - if (FVAL(info->sound.last_goom_p) > 0.8) - FVAL(data->factor_p) += FVAL(info->sound.goom_power_p) * INCREASE_RATE; - FVAL(data->factor_p) *= DECAY_RATE; - - rotate_param = FVAL(info->sound.last_goom_p); - if (rotate_param < 0.0) - rotate_param = 0.0; - rotate_param += FVAL(info->sound.goom_power_p); - - rotate_coef = 4.0 + FVAL(info->sound.goom_power_p) * 6.0; - data->ftheta = (data->ftheta + rotate_coef * sin(rotate_param * 6.3)); - data->theta = ((unsigned int)data->ftheta) % NB_THETA; - data->visibility = (cos(fcycle * 0.001 + 1.5) * sin(fcycle * 0.008) + cos(fcycle * 0.011 + 5.0) - 0.8 + info->sound.speedvar) * 1.5; - if (data->visibility < 0.0) data->visibility = 0.0; - data->factor_p.change_listener(&data->factor_p); - } - - if (data->visibility < 0.01) { - switch (goom_irand(info->gRandom, 300)) - { - case 1: - set_motif(data, CONV_MOTIF1); data->inverse_motif = 1; break; - case 2: - set_motif(data, CONV_MOTIF2); data->inverse_motif = 0; break; - } - } - - if ((ff > 0.98f) && (ff < 1.02f)) - memcpy(dest, src, info->screen.size * sizeof(Pixel)); - else - create_output_with_brightness(_this,src,dest,info,iff); -/* -// Benching suite... - { - uint64_t before, after; - double timed; - static double stimed = 10000.0; - before = GetTick(); - data->visibility = 1.0; - create_output_with_brightness(_this,src,dest,info,iff); - after = GetTick(); - timed = (double)((after-before) / info->screen.size); - if (timed < stimed) { - stimed = timed; - printf ("CLK = %3.0f CPP\n", stimed); - } - } -*/ -} - -VisualFX convolve_create(void) { - VisualFX vfx; - vfx.init = convolve_init; - vfx.free = convolve_free; - vfx.apply = convolve_apply; - vfx.fx_data = 0; - return vfx; -} diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/convolve_fx.c.jc kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/convolve_fx.c.jc --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/convolve_fx.c.jc 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/convolve_fx.c.jc 1970-01-01 00:00:00.000000000 +0000 @@ -1,333 +0,0 @@ -#include "goom_fx.h" -#include "goom_plugin_info.h" -#include "goomsl.h" -#include "goom_config.h" -#include -#include -#include -#include - -//#define CONV_MOTIF_W 32 -//#define CONV_MOTIF_WMASK 0x1f - -#define CONV_MOTIF_W 128 -#define CONV_MOTIF_WMASK 0x7f - -typedef char Motif[CONV_MOTIF_W][CONV_MOTIF_W]; - -#include "motif_goom1.h" -#include "motif_goom2.h" - -#define NB_THETA 512 - -#define MAX 2.0f - -typedef struct _CONV_DATA{ - PluginParam light; - PluginParam factor_adj_p; - PluginParam factor_p; - PluginParameters params; - - GoomSL *script; - - /* rotozoom */ - int theta; - float ftheta; - int h_sin[NB_THETA]; - int h_cos[NB_THETA]; - int h_height; - float visibility; - Motif conv_motif; - int inverse_motif; - -} ConvData; - -/* init rotozoom tables */ -static void compute_tables(VisualFX *_this, PluginInfo *info) -{ - ConvData *data = (ConvData*)_this->fx_data; - double screen_coef; - int i; - double h; - double radian; - - if (data->h_height == info->screen.height) return; - - screen_coef = 2.0 * 300.0 / (double)info->screen.height; - data->h_height = info->screen.height; - - for ( i=0 ; ih_cos[i] = 0x10000 * (-h * cos (radian) * cos(radian)); - data->h_sin[i] = 0x10000 * (h * sin (radian + 1.57) * sin(radian)); - } -} - -static void set_motif(ConvData *data, Motif motif) -{ - int i,j; - for (i=0;iconv_motif[i][j] = motif[CONV_MOTIF_W-i-1][CONV_MOTIF_W-j-1]; -} - -static void convolve_init(VisualFX *_this, PluginInfo *info) { - ConvData *data; - data = (ConvData*)malloc(sizeof(ConvData)); - _this->fx_data = (void*)data; - - data->light = secure_f_param("Screen Brightness"); - data->light.param.fval.max = 300.0f; - data->light.param.fval.step = 1.0f; - data->light.param.fval.value = 100.0f; - - data->factor_adj_p = secure_f_param("Flash Intensity"); - data->factor_adj_p.param.fval.max = 200.0f; - data->factor_adj_p.param.fval.step = 1.0f; - data->factor_adj_p.param.fval.value = 70.0f; - - data->factor_p = secure_f_feedback("Factor"); - - data->params = plugin_parameters ("Bright Flash", 5); - data->params.params[0] = &data->light; - data->params.params[1] = &data->factor_adj_p; - data->params.params[2] = 0; - data->params.params[3] = &data->factor_p; - data->params.params[4] = 0; - - /* init rotozoom tables */ - compute_tables(_this, info); - data->theta = 0; - data->ftheta = 0.0; - data->visibility = 1.0; - set_motif(data, CONV_MOTIF2); - data->inverse_motif = 0; - - _this->params = &data->params; -} - -static void convolve_free(VisualFX *_this) { - free (_this->fx_data); -} - -static void create_output_with_brightness(VisualFX *_this, Pixel *src, Pixel *dest, - PluginInfo *info, int iff) -{ - ConvData *data = (ConvData*)_this->fx_data; - - int x,y; - int i = 0;//info->screen.height * info->screen.width - 1; - - const int c = data->h_cos [data->theta]; - const int s = data->h_sin [data->theta]; - - const int xi = -(info->screen.width/2) * c; - const int yi = (info->screen.width/2) * s; - - const int xj = -(info->screen.height/2) * s; - const int yj = -(info->screen.height/2) * c; - - int xprime = xj; - int yprime = yj; - - int ifftab[16]; - if (data->inverse_motif) { - int i; - for (i=0;i<16;++i) - ifftab[i] = (double)iff * (1.0 + data->visibility * (15.0 - i) / 15.0); - } - else { - int i; - for (i=0;i<16;++i) - ifftab[i] = (double)iff / (1.0 + data->visibility * (15.0 - i) / 15.0); - } - - for (y=info->screen.height;y--;) { - int xtex,ytex; - - xtex = xprime + xi + CONV_MOTIF_W * 0x10000 / 2; - xprime += s; - - ytex = yprime + yi + CONV_MOTIF_W * 0x10000 / 2; - yprime += c; - -#ifdef HAVE_MMX - __asm__ __volatile__ - ("\n\t pxor %%mm7, %%mm7" /* mm7 = 0 */ - "\n\t movd %[xtex], %%mm2" - "\n\t movd %[ytex], %%mm3" - "\n\t punpckldq %%mm3, %%mm2" /* mm2 = [ ytex | xtex ] */ - "\n\t movd %[c], %%mm4" - "\n\t movd %[s], %%mm6" - "\n\t pxor %%mm5, %%mm5" - "\n\t psubd %%mm6, %%mm5" - "\n\t punpckldq %%mm5, %%mm4" /* mm4 = [ -s | c ] */ - "\n\t movd %[motif], %%mm6" /* mm6 = motif */ - - ::[xtex]"g"(xtex) ,[ytex]"g"(ytex) - , [c]"g"(c), [s]"g"(s) - , [motif] "g"(&data->conv_motif[0][0])); - - for (x=info->screen.width;x--;) - { - __asm__ __volatile__ - ( - "\n\t movd %[src], %%mm0" /* mm0 = src */ - "\n\t paddd %%mm4, %%mm2" /* [ ytex | xtex ] += [ -s | s ] */ - "\n\t movd %%esi, %%mm5" /* save esi into mm5 */ - "\n\t movq %%mm2, %%mm3" - "\n\t psrld $16, %%mm3" /* mm3 = [ (ytex>>16) | (xtex>>16) ] */ - "\n\t movd %%mm3, %%eax" /* eax = xtex' */ - - "\n\t psrlq $25, %%mm3" - "\n\t movd %%mm3, %%ecx" /* ecx = ytex' << 7 */ - - "\n\t andl $127, %%eax" - "\n\t andl $16256, %%ecx" - - "\n\t addl %%ecx, %%eax" - "\n\t movd %%mm6, %%esi" /* esi = motif */ - "\n\t xorl %%ecx, %%ecx" - "\n\t movb (%%eax,%%esi), %%cl" - - "\n\t movl %[ifftab], %%eax" - "\n\t movd %%mm5, %%esi" /* restore esi from mm5 */ - "\n\t movd (%%eax,%%ecx,4), %%mm1" /* mm1 = [0|0|0|iff2] */ - - "\n\t punpcklwd %%mm1, %%mm1" - "\n\t punpcklbw %%mm7, %%mm0" - "\n\t punpckldq %%mm1, %%mm1" - "\n\t psrlw $1, %%mm0" - "\n\t psrlw $1, %%mm1" - "\n\t pmullw %%mm1, %%mm0" - "\n\t psrlw $6, %%mm0" - "\n\t packuswb %%mm7, %%mm0" - "\n\t movd %%mm0, %[dest]" - : [dest] "=g" (dest[i].val) - : [src] "g" (src[i].val) - , [ifftab]"g"(&ifftab[0]) - : "eax","ecx"); - - i++; - } -#else - for (x=info->screen.width;x--;) { - - int iff2; - unsigned int f0,f1,f2,f3; - - xtex += c; - ytex -= s; - - iff2 = ifftab[data->conv_motif[(ytex >>16) & CONV_MOTIF_WMASK][(xtex >> 16) & CONV_MOTIF_WMASK]]; - -#define sat(a) ((a)>0xFF?0xFF:(a)) - f0 = src[i].val; - f1 = ((f0 >> R_OFFSET) & 0xFF) * iff2 >> 8; - f2 = ((f0 >> G_OFFSET) & 0xFF) * iff2 >> 8; - f3 = ((f0 >> B_OFFSET) & 0xFF) * iff2 >> 8; - dest[i].val = (sat(f1) << R_OFFSET) | (sat(f2) << G_OFFSET) | (sat(f3) << B_OFFSET); -/* - f0 = (src[i].cop[0] * iff2) >> 8; - f1 = (src[i].cop[1] * iff2) >> 8; - f2 = (src[i].cop[2] * iff2) >> 8; - f3 = (src[i].cop[3] * iff2) >> 8; - - dest[i].cop[0] = (f0 & 0xffffff00) ? 0xff : (unsigned char)f0; - dest[i].cop[1] = (f1 & 0xffffff00) ? 0xff : (unsigned char)f1; - dest[i].cop[2] = (f2 & 0xffffff00) ? 0xff : (unsigned char)f2; - dest[i].cop[3] = (f3 & 0xffffff00) ? 0xff : (unsigned char)f3; -*/ - i++; - } -#endif - } - __asm__ __volatile__ ("\n\t emms"); - - compute_tables(_this, info); -} - -/* -#include - -static uint64_t GetTick() -{ - uint64_t x; - asm volatile ("RDTSC" : "=A" (x)); - return x; -} -*/ - -static void convolve_apply(VisualFX *_this, Pixel *src, Pixel *dest, PluginInfo *info) { - - ConvData *data = (ConvData*)_this->fx_data; - float ff; - int iff; - - ff = (FVAL(data->factor_p) * FVAL(data->factor_adj_p) + FVAL(data->light) ) / 100.0f; - iff = (unsigned int)(ff * 256); - - { - double fcycle = (double)info->cycle; - double rotate_param, rotate_coef; - float INCREASE_RATE = 1.5; - float DECAY_RATE = 0.955; - if (FVAL(info->sound.last_goom_p) > 0.8) - FVAL(data->factor_p) += FVAL(info->sound.goom_power_p) * INCREASE_RATE; - FVAL(data->factor_p) *= DECAY_RATE; - - rotate_param = FVAL(info->sound.last_goom_p); - if (rotate_param < 0.0) - rotate_param = 0.0; - rotate_param += FVAL(info->sound.goom_power_p); - - rotate_coef = 4.0 + FVAL(info->sound.goom_power_p) * 6.0; - data->ftheta = (data->ftheta + rotate_coef * sin(rotate_param * 6.3)); - data->theta = ((unsigned int)data->ftheta) % NB_THETA; - data->visibility = (cos(fcycle * 0.001 + 1.5) * sin(fcycle * 0.008) + cos(fcycle * 0.011 + 5.0) - 0.8 + info->sound.speedvar) * 1.5; - if (data->visibility < 0.0) data->visibility = 0.0; - data->factor_p.change_listener(&data->factor_p); - } - - if (data->visibility < 0.01) { - switch (goom_irand(info->gRandom, 300)) - { - case 1: - set_motif(data, CONV_MOTIF1); data->inverse_motif = 1; break; - case 2: - set_motif(data, CONV_MOTIF2); data->inverse_motif = 0; break; - } - } - - if ((ff > 0.96f) && (ff < 1.04f)) - memcpy(dest, src, info->screen.size * sizeof(Pixel)); - else - create_output_with_brightness(_this,src,dest,info,iff); -/* - Benching suite... - { - uint64_t before, after; - double timed; - static double stimed = 10000.0; - before = GetTick(); - data->visibility = 1.0; - create_output_with_brightness(_this,src,dest,info,iff); - after = GetTick(); - timed = (double)((after-before) / info->screen.size); - if (timed < stimed) { - stimed = timed; - printf ("CLK = %3.0f CPP\n", stimed); - } - } -*/ -} - -VisualFX convolve_create(void) { - VisualFX vfx = { - init: convolve_init, - free: convolve_free, - apply: convolve_apply, - fx_data: 0 - }; - return vfx; -} diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/cpu_info.c kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/cpu_info.c --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/cpu_info.c 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/cpu_info.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,71 +0,0 @@ -/* - * cpu_info.c - * Goom - * - * Created by Guillaume Borios on Sun Dec 28 2003. - * Copyright (c) 2003 iOS. All rights reserved. - * - */ - -#include "cpu_info.h" - -#ifdef CPU_X86 -#include "mmx.h" -#endif - -#ifdef CPU_POWERPC -#include -#include -#endif - -static unsigned int CPU_FLAVOUR = 0; -static unsigned int CPU_NUMBER = 1; -static unsigned int CPU_DETECTED = 0; - -static void autoset_cpu_info (void) -{ - CPU_DETECTED = 1; - -#ifdef CPU_POWERPC - int result; - size_t size; - - result = 0; - size = 4; - if (sysctlbyname("hw.optional.altivec",&result,&size,NULL,NULL) == 0) - { - if (result != 0) CPU_FLAVOUR |= CPU_OPTION_ALTIVEC; - } - - result = 0; - size = 4; - if (sysctlbyname("hw.optional.64bitops",&result,&size,NULL,NULL) == 0) - { - if (result != 0) CPU_FLAVOUR |= CPU_OPTION_64_BITS; - } - - result = 0; - size = 4; - if (sysctlbyname("hw.ncpu",&result,&size,NULL,NULL) == 0) - { - if (result != 0) CPU_NUMBER = result; - } -#endif /* CPU_POWERPC */ - -#ifdef CPU_X86 - if (mmx_supported()) CPU_FLAVOUR |= CPU_OPTION_MMX; - if (xmmx_supported()) CPU_FLAVOUR |= CPU_OPTION_XMMX; -#endif /* CPU_X86 */ -} - -unsigned int cpu_flavour (void) -{ - if (CPU_DETECTED == 0) autoset_cpu_info(); - return CPU_FLAVOUR; -} - -unsigned int cpu_number (void) -{ - if (CPU_DETECTED == 0) autoset_cpu_info(); - return CPU_NUMBER; -} diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/cpu_info.h kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/cpu_info.h --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/cpu_info.h 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/cpu_info.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,34 +0,0 @@ -#ifndef CPU_INFO_H -#define CPU_INFO_H - -/* - * cpu_info.h - * Goom - * - * Created by Guillaume Borios on Sun Dec 28 2003. - * Copyright (c) 2003 iOS. All rights reserved. - * - */ - -#ifdef HAVE_MMX -#ifndef CPU_X86 -#define CPU_X86 -#endif -#endif - -/* Returns the CPU flavour described with the constants below */ -unsigned int cpu_flavour (void); - -#define CPU_OPTION_ALTIVEC 0x1 -#define CPU_OPTION_64_BITS 0x2 -#define CPU_OPTION_MMX 0x4 -#define CPU_OPTION_XMMX 0x8 -#define CPU_OPTION_SSE 0x10 -#define CPU_OPTION_SSE2 0x20 -#define CPU_OPTION_3DNOW 0x40 - - -/* Returns the CPU number */ -unsigned int cpu_number (void); - -#endif diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/default_script.goom kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/default_script.goom --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/default_script.goom 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/default_script.goom 1970-01-01 00:00:00.000000000 +0000 @@ -1,34 +0,0 @@ -/* - * specify here high-level properties of a flash. - */ - -flash_occurs when (Sound.Goom_Detection > 50%) and (Sound.Sound_Speed > 14%); - -max_flash = 200%; -slow_down_coef = 96%; - -/* - * Here you have the fx's state machin behaviour. - */ - -(locked) ? locked--; - -(not locked) and (flash_occurs) ? -{ - cur_power = Sound_Speed.Goom_Detection; - start flashing_up; -} - -(not locked) and (flashing_up) ? -{ - factor += cur_power * 2 * (speedvar / 4 + 0.95); - if (factor > max_flash) factor = max_flash; - - (not flash_occurs) ? - { - locked = 200; - stop flashing_up; - } -} - -factor *= slow_down_coef; diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/default_scripts.h kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/default_scripts.h --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/default_scripts.h 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/default_scripts.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,6 +0,0 @@ -#ifndef _DEFAULT_SCRIPTS_H -#define _DEFAULT_SCRIPTS_H - -#define GOOM_MAIN_SCRIPT "" - -#endif diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/DOCODE.TXT kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/DOCODE.TXT --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/DOCODE.TXT 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/DOCODE.TXT 1970-01-01 00:00:00.000000000 +0000 @@ -1,55 +0,0 @@ -Les diffrentes donnes.. ------ - -typedef struct { - int32 * buf; - int32 width; - int32 height; - int32 size; - - int32 * realstart; -} Surface; ------ - ->> taille du buffer de zoom -guint32 mmx_zoom_size; ------ - ->> les buffers bruts contiennent les px et py de chaque point ->> => brutS[0] = px0, brutS[1] = py0, brutS[2] = px1, [...] - -signed int *brutS = 0, *freebrutS = 0; // source -signed int *brutD = 0, *freebrutD = 0; // dest -signed int *brutT = 0, *freebrutT = 0; // temp (en cours de gnration) - ->> pointeur vers p1 -guint32 *expix1 = 0; ->> pointeur vers p2 -guint32 *expix2 = 0; - ->> largeur d'une ligne = prevX -guint32 zoom_width; - ->> largeur et hauteur des differents buffers. -int prevX=0,prevY=0; ------ - ->> buffratio est un fixpoint : 16,16 ->> valeur normalement comprise entre 0 et 1, ->> soit 0<=buffratio<=BUFFPOINTMASK - -int buffratio = 0; - -#define BUFFPOINTNB 16 -#define BUFFPOINTMASK 0xffff -#define BUFFINCR 0xff ------ - -#define sqrtperte 16 ->> faire : a % sqrtperte <=> a & pertemask -#define PERTEMASK 0xf ->> faire : a / sqrtperte <=> a >> PERTEDEC -#define PERTEDEC 4 ------ - -int precalCoef[16][16]; diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/drawmethods.c kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/drawmethods.c --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/drawmethods.c 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/drawmethods.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,203 +0,0 @@ -#include "drawmethods.h" - -#define DRAWMETHOD_PLUS(_out,_backbuf,_col) \ -{\ - int tra=0,i=0;\ - unsigned char *bra = (unsigned char*)&(_backbuf);\ - unsigned char *dra = (unsigned char*)&(_out);\ - unsigned char *cra = (unsigned char*)&(_col);\ - for (;i<4;i++) {\ - tra = *cra;\ - tra += *bra;\ - if (tra>255) tra=255;\ - *dra = tra;\ - ++dra;++cra;++bra;\ - }\ -} - -#define DRAWMETHOD DRAWMETHOD_PLUS(*p,*p,col) - -void draw_line (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny) -{ - int x, y, dx, dy, yy, xx; - Pixel *p; - - if ((y1 < 0) || (y2 < 0) || (x1 < 0) || (x2 < 0) || (y1 >= screeny) || (y2 >= screeny) || (x1 >= screenx) || (x2 >= screenx)) return; - - /* clip to top edge - if ((y1 < 0) && (y2 < 0)) - return; - - if (y1 < 0) { - x1 += (y1 * (x1 - x2)) / (y2 - y1); - y1 = 0; - } - if (y2 < 0) { - x2 += (y2 * (x1 - x2)) / (y2 - y1); - y2 = 0; - } - - clip to bottom edge - if ((y1 >= screeny) && (y2 >= screeny)) - return; - if (y1 >= screeny) { - x1 -= ((screeny - y1) * (x1 - x2)) / (y2 - y1); - y1 = screeny - 1; - } - if (y2 >= screeny) { - x2 -= ((screeny - y2) * (x1 - x2)) / (y2 - y1); - y2 = screeny - 1; - } - clip to left edge - if ((x1 < 0) && (x2 < 0)) - return; - if (x1 < 0) { - y1 += (x1 * (y1 - y2)) / (x2 - x1); - x1 = 0; - } - if (x2 < 0) { - y2 += (x2 * (y1 - y2)) / (x2 - x1); - x2 = 0; - } - clip to right edge - if ((x1 >= screenx) && (x2 >= screenx)) - return; - if (x1 >= screenx) { - y1 -= ((screenx - x1) * (y1 - y2)) / (x2 - x1); - x1 = screenx - 1; - } - if (x2 >= screenx) { - y2 -= ((screenx - x2) * (y1 - y2)) / (x2 - x1); - x2 = screenx - 1; - } - */ - - dx = x2 - x1; - dy = y2 - y1; - if (x1 > x2) { - int tmp; - - tmp = x1; - x1 = x2; - x2 = tmp; - tmp = y1; - y1 = y2; - y2 = tmp; - dx = x2 - x1; - dy = y2 - y1; - } - - /* vertical line */ - if (dx == 0) { - if (y1 < y2) { - p = &(data[(screenx * y1) + x1]); - for (y = y1; y <= y2; y++) { - DRAWMETHOD; - p += screenx; - } - } - else { - p = &(data[(screenx * y2) + x1]); - for (y = y2; y <= y1; y++) { - DRAWMETHOD; - p += screenx; - } - } - return; - } - /* horizontal line */ - if (dy == 0) { - if (x1 < x2) { - p = &(data[(screenx * y1) + x1]); - for (x = x1; x <= x2; x++) { - DRAWMETHOD; - p++; - } - return; - } - else { - p = &(data[(screenx * y1) + x2]); - for (x = x2; x <= x1; x++) { - DRAWMETHOD; - p++; - } - return; - } - } - /* 1 */ - /* \ */ - /* \ */ - /* 2 */ - if (y2 > y1) { - /* steep */ - if (dy > dx) { - dx = ((dx << 16) / dy); - x = x1 << 16; - for (y = y1; y <= y2; y++) { - xx = x >> 16; - p = &(data[(screenx * y) + xx]); - DRAWMETHOD; - if (xx < (screenx - 1)) { - p++; - /* DRAWMETHOD; */ - } - x += dx; - } - return; - } - /* shallow */ - else { - dy = ((dy << 16) / dx); - y = y1 << 16; - for (x = x1; x <= x2; x++) { - yy = y >> 16; - p = &(data[(screenx * yy) + x]); - DRAWMETHOD; - if (yy < (screeny - 1)) { - p += screeny; - /* DRAWMETHOD; */ - } - y += dy; - } - } - } - /* 2 */ - /* / */ - /* / */ - /* 1 */ - else { - /* steep */ - if (-dy > dx) { - dx = ((dx << 16) / -dy); - x = (x1 + 1) << 16; - for (y = y1; y >= y2; y--) { - xx = x >> 16; - p = &(data[(screenx * y) + xx]); - DRAWMETHOD; - if (xx < (screenx - 1)) { - p--; - /* DRAWMETHOD; */ - } - x += dx; - } - return; - } - /* shallow */ - else { - dy = ((dy << 16) / dx); - y = y1 << 16; - for (x = x1; x <= x2; x++) { - yy = y >> 16; - p = &(data[(screenx * yy) + x]); - DRAWMETHOD; - if (yy < (screeny - 1)) { - p += screeny; - /* DRAWMETHOD; */ - } - y += dy; - } - return; - } - } -} - diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/drawmethods.h kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/drawmethods.h --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/drawmethods.h 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/drawmethods.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,9 +0,0 @@ -#ifndef _DRAWMETHODS_H -#define _DRAWMETHODS_H - -#include "goom_config.h" -#include "goom_graphic.h" - -void draw_line (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny); - -#endif /* _DRAWMETHODS_H */ diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/filters.c kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/filters.c --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/filters.c 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/filters.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,773 +0,0 @@ -// --- CHUI EN TRAIN DE SUPPRIMER LES EXTERN RESOLX ET C_RESOLY --- - -/* filter.c version 0.7 -* contient les filtres applicable a un buffer -* creation : 01/10/2000 -* -ajout de sinFilter() -* -ajout de zoomFilter() -* -copie de zoomFilter() en zoomFilterRGB(), gerant les 3 couleurs -* -optimisation de sinFilter (utilisant une table de sin) -* -asm -* -optimisation de la procedure de generation du buffer de transformation -* la vitesse est maintenant comprise dans [0..128] au lieu de [0..100] -*/ - -/* #define _DEBUG_PIXEL */ - -#include -#include -#include -#include -#include - -#include "goom_filters.h" -#include "goom_graphic.h" -#include "goom_tools.h" -#include "goom_plugin_info.h" -#include "goom_fx.h" -#include "v3d.h" - -/* TODO : MOVE THIS AWAY !!! */ -/* jeko: j'ai essayer de le virer, mais si on veut les laisser inline c'est un peu lourdo... */ -static inline void setPixelRGB (PluginInfo *goomInfo, Pixel *buffer, Uint x, Uint y, Color c) -{ - Pixel i; - - i.channels.b = c.b; - i.channels.g = c.v; - i.channels.r = c.r; - *(buffer + (x + y * goomInfo->screen.width)) = i; -} - -static inline void setPixelRGB_ (Pixel *buffer, Uint x, Color c) -{ - buffer[x].channels.r = c.r; - buffer[x].channels.g = c.v; - buffer[x].channels.b = c.b; -} - -static inline void getPixelRGB (PluginInfo *goomInfo, Pixel *buffer, Uint x, Uint y, Color * c) -{ - Pixel i = *(buffer + (x + y * goomInfo->screen.width)); - c->b = i.channels.b; - c->v = i.channels.g; - c->r = i.channels.r; -} - -static inline void getPixelRGB_ (Pixel *buffer, Uint x, Color * c) -{ - Pixel i = *(buffer + x); - c->b = i.channels.b; - c->v = i.channels.g; - c->r = i.channels.r; -} -/* END TODO */ - - -/* DEPRECATED */ -// retourne x>>s , en testant le signe de x -//#define ShiftRight(_x,_s) (((_x)<0) ? -(-(_x)>>(_s)) : ((_x)>>(_s))) -//#define EFFECT_DISTORS 4 -//#define EFFECT_DISTORS_SL 2 -//#define INTERLACE_ADD 9 -//#define INTERLACE_AND 0xf -/* END DEPRECATED */ - -#define BUFFPOINTNB 16 -#define BUFFPOINTNBF 16.0f -#define BUFFPOINTMASK 0xffff - -#define sqrtperte 16 -/* faire : a % sqrtperte <=> a & pertemask */ -#define PERTEMASK 0xf -/* faire : a / sqrtperte <=> a >> PERTEDEC */ -#define PERTEDEC 4 - -/* pure c version of the zoom filter */ -static void c_zoom (Pixel *expix1, Pixel *expix2, unsigned int prevX, unsigned int prevY, signed int *brutS, signed int *brutD, int buffratio, int precalCoef[BUFFPOINTNB][BUFFPOINTNB]); - -/* simple wrapper to give it the same proto than the others */ -void zoom_filter_c (int sizeX, int sizeY, Pixel *src, Pixel *dest, int *brutS, int *brutD, int buffratio, int precalCoef[16][16]) { - c_zoom(src, dest, sizeX, sizeY, brutS, brutD, buffratio, precalCoef); -} - -static void generatePrecalCoef (int precalCoef[BUFFPOINTNB][BUFFPOINTNB]); - - -typedef struct _ZOOM_FILTER_FX_WRAPPER_DATA { - - PluginParam enabled_bp; - PluginParameters params; - - unsigned int *coeffs, *freecoeffs; - - signed int *brutS, *freebrutS; /* source */ - signed int *brutD, *freebrutD; /* dest */ - signed int *brutT, *freebrutT; /* temp (en cours de generation) */ - - guint32 zoom_width; - - unsigned int prevX, prevY; - - float general_speed; - int reverse; /* reverse the speed */ - char theMode; - int waveEffect; - int hypercosEffect; - int vPlaneEffect; - int hPlaneEffect; - char noisify; - int middleX, middleY; - - int mustInitBuffers; - int interlace_start; - - /** modif by jeko : fixedpoint : buffration = (16:16) (donc 0<=buffration<=2^16) */ - int buffratio; - int *firedec; - - /** modif d'optim by Jeko : precalcul des 4 coefs resultant des 2 pos */ - int precalCoef[BUFFPOINTNB][BUFFPOINTNB]; - - /** calculatePXandPY statics */ - int wave; - int wavesp; - -} ZoomFilterFXWrapperData; - - - - -static inline v2g zoomVector(ZoomFilterFXWrapperData *data, float X, float Y) -{ - v2g vecteur; - float vx, vy; - float sq_dist = X*X + Y*Y; - - /* sx = (X < 0.0f) ? -1.0f : 1.0f; - sy = (Y < 0.0f) ? -1.0f : 1.0f; - */ - float coefVitesse = (1.0f+ data->general_speed) / 50.0f; - - // Effects - - /* Centralized FX */ - - switch (data->theMode) { - case CRYSTAL_BALL_MODE: - coefVitesse -= (sq_dist-0.3f)/15.0f; - break; - case AMULETTE_MODE: - coefVitesse += sq_dist * 3.5f; - break; - case WAVE_MODE: - coefVitesse += sin(sq_dist*20.0f) / 100.0f; - break; - case SCRUNCH_MODE: - coefVitesse += sq_dist / 10.0f; - break; - //case HYPERCOS1_MODE: - break; - //case HYPERCOS2_MODE: - break; - //case YONLY_MODE: - break; - case SPEEDWAY_MODE: - coefVitesse *= 4.0f * Y; - break; - default: - break; - } - - if (coefVitesse < -2.01f) - coefVitesse = -2.01f; - if (coefVitesse > 2.01f) - coefVitesse = 2.01f; - - vx = coefVitesse * X; - vy = coefVitesse * Y; - - /* Amulette 2 */ - // vx = X * tan(dist); - // vy = Y * tan(dist); - - /* Rotate */ - //vx = (X+Y)*0.1; - //vy = (Y-X)*0.1; - - - // Effects adds-on - - /* Noise */ - if (data->noisify) - { - vx += (((float)random()) / ((float)RAND_MAX) - 0.5f) / 50.0f; - vy += (((float)random()) / ((float)RAND_MAX) - 0.5f) / 50.0f; - } - - /* Hypercos */ - if (data->hypercosEffect) - { - vx += sin(Y*10.0f)/120.0f; - vy += sin(X*10.0f)/120.0f; - } - - /* H Plane */ - if (data->hPlaneEffect) vx += Y * 0.0025f * data->hPlaneEffect; - - /* V Plane */ - if (data->vPlaneEffect) vy += X * 0.0025f * data->vPlaneEffect; - - /* TODO : Water Mode */ - // if (data->waveEffect) - - vecteur.x = vx; - vecteur.y = vy; - - return vecteur; -} - - -/* - * Makes a stripe of a transform buffer (brutT) - * - * The transform is (in order) : - * Translation (-data->middleX, -data->middleY) - * Homothetie (Center : 0,0 Coeff : 2/data->prevX) - */ -static void makeZoomBufferStripe(ZoomFilterFXWrapperData * data, int INTERLACE_INCR) -{ - // Position of the pixel to compute in pixmap coordinates - Uint x, y; - // Where (verticaly) to stop generating the buffer stripe - int maxEnd = (data->interlace_start + INTERLACE_INCR); - // Ratio from pixmap to normalized coordinates - float ratio = 2.0f/((float)data->prevX); - // Ratio from normalized to virtual pixmap coordinates - float inv_ratio = BUFFPOINTNBF/ratio; - float min = ratio/BUFFPOINTNBF; - // Y position of the pixel to compute in normalized coordinates - float Y = ((float)(data->interlace_start - data->middleY)) * ratio; - - maxEnd = data->prevY; - if (maxEnd > (data->interlace_start + INTERLACE_INCR)) - maxEnd = (data->interlace_start + INTERLACE_INCR); - - for (y = data->interlace_start; (y < data->prevY) && ((signed int)yprevX * 2; - float X = - ((float)data->middleX) * ratio; - for (x = 0; x < data->prevX; x++) - { - v2g vector = zoomVector (data, X, Y); - - /* Finish and avoid null displacement */ - if (fabs(vector.x) < min) vector.x = (vector.x < 0.0f) ? -min : min; - if (fabs(vector.y) < min) vector.y = (vector.y < 0.0f) ? -min : min; - - data->brutT[premul_y_prevX] = ((int)((X-vector.x)*inv_ratio)+((int)(data->middleX*BUFFPOINTNB))); - data->brutT[premul_y_prevX+1] = ((int)((Y-vector.y)*inv_ratio)+((int)(data->middleY*BUFFPOINTNB))); - premul_y_prevX += 2; - X += ratio; - } - Y += ratio; - } - data->interlace_start += INTERLACE_INCR; - if (y >= data->prevY-1) data->interlace_start = -1; -} - - -/* - * calculer px et py en fonction de x,y,middleX,middleY et theMode - * px et py indique la nouvelle position (en sqrtperte ieme de pixel) - * (valeur * 16) - - inline void calculatePXandPY (PluginInfo *goomInfo, ZoomFilterFXWrapperData *data, int x, int y, int *px, int *py) - { - if (data->theMode == WATER_MODE) { - int yy; - - yy = y + goom_irand(goomInfo->gRandom, 4) - goom_irand(goomInfo->gRandom, 4) + data->wave / 10; - if (yy < 0) - yy = 0; - if (yy >= (signed int)goomInfo->screen.height) - yy = goomInfo->screen.height - 1; - - *px = (x << 4) + data->firedec[yy] + (data->wave / 10); - *py = (y << 4) + 132 - ((data->vitesse < 131) ? data->vitesse : 130); - - data->wavesp += goom_irand(goomInfo->gRandom, 3) - goom_irand(goomInfo->gRandom, 3); - if (data->wave < -10) - data->wavesp += 2; - if (data->wave > 10) - data->wavesp -= 2; - data->wave += (data->wavesp / 10) + goom_irand(goomInfo->gRandom, 3) - goom_irand(goomInfo->gRandom, 3); - if (data->wavesp > 100) - data->wavesp = (data->wavesp * 9) / 10; - } - else { - int dist = 0, vx9, vy9; - int vx, vy; - int ppx, ppy; - int fvitesse = data->vitesse << 4; - - if (data->noisify) { - x += goom_irand(goomInfo->gRandom, data->noisify) - goom_irand(goomInfo->gRandom, data->noisify); - y += goom_irand(goomInfo->gRandom, data->noisify) - goom_irand(goomInfo->gRandom, data->noisify); - } - vx = (x - data->middleX) << 9; - vy = (y - data->middleY) << 9; - - if (data->hPlaneEffect) - vx += data->hPlaneEffect * (y - data->middleY); - - if (data->vPlaneEffect) - vy += data->vPlaneEffect * (x - data->middleX); - - if (data->waveEffect) { - fvitesse *= - 1024 + - ShiftRight (goomInfo->sintable - [(unsigned short) (dist * 0xffff + EFFECT_DISTORS)], 6); - fvitesse /= 1024; - } - - if (data->hypercosEffect) { - vx += ShiftRight (goomInfo->sintable[(-vy + dist) & 0xffff], 1); - vy += ShiftRight (goomInfo->sintable[(vx + dist) & 0xffff], 1); - } - - vx9 = ShiftRight (vx, 9); - vy9 = ShiftRight (vy, 9); - dist = vx9 * vx9 + vy9 * vy9; - - switch (data->theMode) { - case WAVE_MODE: - fvitesse *= - 1024 + - ShiftRight (goomInfo->sintable - [(unsigned short) (dist * 0xffff * EFFECT_DISTORS)], 6); - fvitesse>>=10; - break; - case CRYSTAL_BALL_MODE: - fvitesse += (dist >> (10-EFFECT_DISTORS_SL)); - break; - case AMULETTE_MODE: - fvitesse -= (dist >> (4 - EFFECT_DISTORS_SL)); - break; - case SCRUNCH_MODE: - fvitesse -= (dist >> (10 - EFFECT_DISTORS_SL)); - break; - case HYPERCOS1_MODE: - vx = vx + ShiftRight (goomInfo->sintable[(-vy + dist) & 0xffff], 1); - vy = vy + ShiftRight (goomInfo->sintable[(vx + dist) & 0xffff], 1); - break; - case HYPERCOS2_MODE: - vx = - vx + ShiftRight (goomInfo->sintable[(-ShiftRight (vy, 1) + dist) & 0xffff], 0); - vy = - vy + ShiftRight (goomInfo->sintable[(ShiftRight (vx, 1) + dist) & 0xffff], 0); - fvitesse = 128 << 4; - break; - case YONLY_MODE: - fvitesse *= 1024 + ShiftRight (goomInfo->sintable[vy & 0xffff], 6); - fvitesse >>= 10; - break; - case SPEEDWAY_MODE: - fvitesse -= (ShiftRight(vy,10-EFFECT_DISTORS_SL)); - break; - } - - if (fvitesse < -3024) - fvitesse = -3024; - - if (vx < 0) // pb avec decalage sur nb negatif - ppx = -(-(vx * fvitesse) >> 16); - // 16 = 9 + 7 (7 = nb chiffre virgule de vitesse * (v = 128 => immobile) - // * * * * * 9 = nb chiffre virgule de vx) - else - ppx = ((vx * fvitesse) >> 16); - - if (vy < 0) - ppy = -(-(vy * fvitesse) >> 16); - else - ppy = ((vy * fvitesse) >> 16); - - *px = (data->middleX << 4) + ppx; - *py = (data->middleY << 4) + ppy; - } - } - */ - - - -static void c_zoom (Pixel *expix1, Pixel *expix2, unsigned int prevX, unsigned int prevY, signed int *brutS, signed int *brutD, - int buffratio, int precalCoef[16][16]) -{ - int myPos, myPos2; - Color couleur; - - unsigned int ax = (prevX - 1) << PERTEDEC, ay = (prevY - 1) << PERTEDEC; - - int bufsize = prevX * prevY * 2; - int bufwidth = prevX; - - expix1[0].val=expix1[prevX-1].val=expix1[prevX*prevY-1].val=expix1[prevX*prevY-prevX].val=0; - - for (myPos = 0; myPos < bufsize; myPos += 2) { - Color col1, col2, col3, col4; - int c1, c2, c3, c4, px, py; - int pos; - int coeffs; - - int brutSmypos = brutS[myPos]; - - myPos2 = myPos + 1; - - px = brutSmypos + (((brutD[myPos] - brutSmypos) * buffratio) >> BUFFPOINTNB); - brutSmypos = brutS[myPos2]; - py = brutSmypos + (((brutD[myPos2] - brutSmypos) * buffratio) >> BUFFPOINTNB); - - if ((py >= ay) || (px >= ax)) { - pos = coeffs = 0; - } else { - pos = ((px >> PERTEDEC) + prevX * (py >> PERTEDEC)); - /* coef en modulo 15 */ - coeffs = precalCoef[px & PERTEMASK][py & PERTEMASK]; - } - getPixelRGB_ (expix1, pos, &col1); - getPixelRGB_ (expix1, pos + 1, &col2); - getPixelRGB_ (expix1, pos + bufwidth, &col3); - getPixelRGB_ (expix1, pos + bufwidth + 1, &col4); - - c1 = coeffs; - c2 = (c1 >> 8) & 0xFF; - c3 = (c1 >> 16) & 0xFF; - c4 = (c1 >> 24) & 0xFF; - c1 = c1 & 0xff; - - couleur.r = col1.r * c1 + col2.r * c2 + col3.r * c3 + col4.r * c4; - if (couleur.r > 5) - couleur.r -= 5; - couleur.r >>= 8; - - couleur.v = col1.v * c1 + col2.v * c2 + col3.v * c3 + col4.v * c4; - if (couleur.v > 5) - couleur.v -= 5; - couleur.v >>= 8; - - couleur.b = col1.b * c1 + col2.b * c2 + col3.b * c3 + col4.b * c4; - if (couleur.b > 5) - couleur.b -= 5; - couleur.b >>= 8; - - setPixelRGB_ (expix2, myPos >> 1, couleur); - } -} - -/** generate the water fx horizontal direction buffer */ -static void generateTheWaterFXHorizontalDirectionBuffer(PluginInfo *goomInfo, ZoomFilterFXWrapperData *data) { - - int loopv; - int decc = goom_irand(goomInfo->gRandom, 8) - 4; - int spdc = goom_irand(goomInfo->gRandom, 8) - 4; - int accel = goom_irand(goomInfo->gRandom, 8) - 4; - - for (loopv = data->prevY; loopv != 0;) { - - loopv--; - data->firedec[loopv] = decc; - decc += spdc / 10; - spdc += goom_irand(goomInfo->gRandom, 3) - goom_irand(goomInfo->gRandom, 3); - - if (decc > 4) - spdc -= 1; - if (decc < -4) - spdc += 1; - - if (spdc > 30) - spdc = spdc - goom_irand(goomInfo->gRandom, 3) + accel / 10; - if (spdc < -30) - spdc = spdc + goom_irand(goomInfo->gRandom, 3) + accel / 10; - - if (decc > 8 && spdc > 1) - spdc -= goom_irand(goomInfo->gRandom, 3) - 2; - - if (decc < -8 && spdc < -1) - spdc += goom_irand(goomInfo->gRandom, 3) + 2; - - if (decc > 8 || decc < -8) - decc = decc * 8 / 9; - - accel += goom_irand(goomInfo->gRandom, 2) - goom_irand(goomInfo->gRandom, 2); - if (accel > 20) - accel -= 2; - if (accel < -20) - accel += 2; - } -} - - - -/** -* Main work for the dynamic displacement map. - * - * Reads data from pix1, write to pix2. - * - * Useful datas for this FX are stored in ZoomFilterData. - * - * If you think that this is a strange function name, let me say that a long time ago, - * there has been a slow version and a gray-level only one. Then came these function, - * fast and workin in RGB colorspace ! nice but it only was applying a zoom to the image. - * So that is why you have this name, for the nostalgy of the first days of goom - * when it was just a tiny program writen in Turbo Pascal on my i486... - */ -void zoomFilterFastRGB (PluginInfo *goomInfo, Pixel * pix1, Pixel * pix2, ZoomFilterData * zf, Uint resx, Uint resy, int switchIncr, float switchMult) -{ - Uint x, y; - - ZoomFilterFXWrapperData *data = (ZoomFilterFXWrapperData*)goomInfo->zoomFilter_fx.fx_data; - - if (!BVAL(data->enabled_bp)) return; - - /** changement de taille **/ - if ((data->prevX != resx) || (data->prevY != resy)) { - data->prevX = resx; - data->prevY = resy; - - if (data->brutS) free (data->freebrutS); - data->brutS = 0; - if (data->brutD) free (data->freebrutD); - data->brutD = 0; - if (data->brutT) free (data->freebrutT); - data->brutT = 0; - - data->middleX = resx / 2; - data->middleY = resy / 2; - data->mustInitBuffers = 1; - if (data->firedec) free (data->firedec); - data->firedec = 0; - } - - if (data->interlace_start != -2) - zf = NULL; - - /** changement de config **/ - if (zf) { - data->reverse = zf->reverse; - data->general_speed = (float)(zf->vitesse-128)/128.0f; - if (data->reverse) data->general_speed = -data->general_speed; - data->middleX = zf->middleX; - data->middleY = zf->middleY; - data->theMode = zf->mode; - data->hPlaneEffect = zf->hPlaneEffect; - data->vPlaneEffect = zf->vPlaneEffect; - data->waveEffect = zf->waveEffect; - data->hypercosEffect = zf->hypercosEffect; - data->noisify = zf->noisify; - data->interlace_start = 0; - } - - - if (data->mustInitBuffers) { - - data->mustInitBuffers = 0; - data->freebrutS = (signed int *) calloc (resx * resy * 2 + 128, sizeof(unsigned int)); - data->brutS = (gint32 *) ((1 + ((uintptr_t) (data->freebrutS)) / 128) * 128); - - data->freebrutD = (signed int *) calloc (resx * resy * 2 + 128, sizeof(unsigned int)); - data->brutD = (gint32 *) ((1 + ((uintptr_t) (data->freebrutD)) / 128) * 128); - - data->freebrutT = (signed int *) calloc (resx * resy * 2 + 128, sizeof(unsigned int)); - data->brutT = (gint32 *) ((1 + ((uintptr_t) (data->freebrutT)) / 128) * 128); - - data->buffratio = 0; - - data->firedec = (int *) malloc (data->prevY * sizeof (int)); - generateTheWaterFXHorizontalDirectionBuffer(goomInfo, data); - - data->interlace_start = 0; - makeZoomBufferStripe(data,resy); - - /* Copy the data from temp to dest and source */ - memcpy(data->brutS,data->brutT,resx * resy * 2 * sizeof(int)); - memcpy(data->brutD,data->brutT,resx * resy * 2 * sizeof(int)); - } - - /* generation du buffer de trans */ - if (data->interlace_start == -1) { - - /* sauvegarde de l'etat actuel dans la nouvelle source - * TODO: write that in MMX (has been done in previous version, but did not follow some new fonctionnalities) */ - y = data->prevX * data->prevY * 2; - for (x = 0; x < y; x += 2) { - int brutSmypos = data->brutS[x]; - int x2 = x + 1; - - data->brutS[x] = brutSmypos + (((data->brutD[x] - brutSmypos) * data->buffratio) >> BUFFPOINTNB); - brutSmypos = data->brutS[x2]; - data->brutS[x2] = brutSmypos + (((data->brutD[x2] - brutSmypos) * data->buffratio) >> BUFFPOINTNB); - } - data->buffratio = 0; - } - - if (data->interlace_start == -1) { - signed int * tmp; - tmp = data->brutD; - data->brutD=data->brutT; - data->brutT=tmp; - tmp = data->freebrutD; - data->freebrutD=data->freebrutT; - data->freebrutT=tmp; - data->interlace_start = -2; - } - - if (data->interlace_start>=0) - { - /* creation de la nouvelle destination */ - makeZoomBufferStripe(data,resy/16); - } - - if (switchIncr != 0) { - data->buffratio += switchIncr; - if (data->buffratio > BUFFPOINTMASK) - data->buffratio = BUFFPOINTMASK; - } - - if (switchMult != 1.0f) { - data->buffratio = (int) ((float) BUFFPOINTMASK * (1.0f - switchMult) + - (float) data->buffratio * switchMult); - } - - data->zoom_width = data->prevX; - - goomInfo->methods.zoom_filter (data->prevX, data->prevY, pix1, pix2, - data->brutS, data->brutD, data->buffratio, data->precalCoef); -} - -static void generatePrecalCoef (int precalCoef[16][16]) -{ - int coefh, coefv; - - for (coefh = 0; coefh < 16; coefh++) { - for (coefv = 0; coefv < 16; coefv++) { - - int i; - int diffcoeffh; - int diffcoeffv; - - diffcoeffh = sqrtperte - coefh; - diffcoeffv = sqrtperte - coefv; - - if (!(coefh || coefv)) { - i = 255; - } - else { - int i1, i2, i3, i4; - - i1 = diffcoeffh * diffcoeffv; - i2 = coefh * diffcoeffv; - i3 = diffcoeffh * coefv; - i4 = coefh * coefv; - - // TODO: faire mieux... - if (i1) i1--; - if (i2) i2--; - if (i3) i3--; - if (i4) i4--; - - i = (i1) | (i2 << 8) | (i3 << 16) | (i4 << 24); - } - precalCoef[coefh][coefv] = i; - } - } -} - -/* VisualFX Wrapper */ - -static void zoomFilterVisualFXWrapper_init (struct _VISUAL_FX *_this, PluginInfo *info) -{ - ZoomFilterFXWrapperData *data = (ZoomFilterFXWrapperData*)malloc(sizeof(ZoomFilterFXWrapperData)); - - data->coeffs = 0; - data->freecoeffs = 0; - data->brutS = 0; - data->freebrutS = 0; - data->brutD = 0; - data->freebrutD = 0; - data->brutT = 0; - data->freebrutT = 0; - data->prevX = 0; - data->prevY = 0; - - data->mustInitBuffers = 1; - data->interlace_start = -2; - - data->general_speed = 0.0f; - data->reverse = 0; - data->theMode = AMULETTE_MODE; - data->waveEffect = 0; - data->hypercosEffect = 0; - data->vPlaneEffect = 0; - data->hPlaneEffect = 0; - data->noisify = 2; - - /** modif by jeko : fixedpoint : buffration = (16:16) (donc 0<=buffration<=2^16) */ - data->buffratio = 0; - data->firedec = 0; - - data->wave = data->wavesp = 0; - - data->enabled_bp = secure_b_param("Enabled", 1); - - data->params = plugin_parameters ("Zoom Filter", 1); - data->params.params[0] = &data->enabled_bp; - - _this->params = &data->params; - _this->fx_data = (void*)data; - - /** modif d'optim by Jeko : precalcul des 4 coefs resultant des 2 pos */ - generatePrecalCoef(data->precalCoef); -} - -static void zoomFilterVisualFXWrapper_free (struct _VISUAL_FX *_this) -{ - ZoomFilterFXWrapperData *data = (ZoomFilterFXWrapperData*)_this->fx_data; - free (data->freebrutS); - free (data->freebrutD); - free (data->freebrutT); - free (data->firedec); - free (data->params.params); - free(_this->fx_data); -} - -static void zoomFilterVisualFXWrapper_apply (struct _VISUAL_FX *_this, Pixel *src, Pixel *dest, PluginInfo *info) -{ -} - -VisualFX zoomFilterVisualFXWrapper_create(void) -{ - VisualFX fx; - fx.init = zoomFilterVisualFXWrapper_init; - fx.free = zoomFilterVisualFXWrapper_free; - fx.apply = zoomFilterVisualFXWrapper_apply; - return fx; -} - - -/* TODO : MOVE THIS AWAY */ - -void pointFilter (PluginInfo *goomInfo, Pixel * pix1, Color c, float t1, float t2, float t3, float t4, Uint cycle) -{ - Uint x = (Uint) ((int) (goomInfo->screen.width / 2) - + (int) (t1 * cos ((float) cycle / t3))); - Uint y = (Uint) ((int) (goomInfo->screen.height/2) - + (int) (t2 * sin ((float) cycle / t4))); - - if ((x > 1) && (y > 1) && (x < goomInfo->screen.width - 2) && (y < goomInfo->screen.height - 2)) { - setPixelRGB (goomInfo, pix1, x + 1, y, c); - setPixelRGB (goomInfo, pix1, x, y + 1, c); - setPixelRGB (goomInfo, pix1, x + 1, y + 1, WHITE); - setPixelRGB (goomInfo, pix1, x + 2, y + 1, c); - setPixelRGB (goomInfo, pix1, x + 1, y + 2, c); - } -} diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/filters_mmx.s kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/filters_mmx.s --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/filters_mmx.s 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/filters_mmx.s 1970-01-01 00:00:00.000000000 +0000 @@ -1,200 +0,0 @@ -;// file : mmx_zoom.s -;// author : JC Hoelt -;// -;// history -;// 07/01/2001 : Changing FEMMS to EMMS : slower... but run on intel machines -;// 03/01/2001 : WIDTH and HEIGHT are now variable -;// 28/12/2000 : adding comments to the code, suppress some useless lines -;// 27/12/2000 : reducing memory access... improving performance by 20% -;// coefficients are now on 1 byte -;// 22/12/2000 : Changing data structure -;// 16/12/2000 : AT&T version -;// 14/12/2000 : unrolling loop -;// 12/12/2000 : 64 bits memory access - - -.data - -chaine: - .string "pos = %d\n\0" - .long 0x0 - -thezero: - .long 0x00000000 - .long 0x00000000 - -.text - -.globl mmx_zoom ;// name of the function to call by C program -/* .extern coeffs ;// the transformation buffer */ -.extern expix1,expix2 ;// the source and destination buffer -.extern mmx_zoom_size, zoom_width ;// size of the buffers - -.extern brutS,brutD,buffratio,precalCoef,prevX,prevY - -#define PERTEMASK 15 -/* faire : a / sqrtperte <=> a >> PERTEDEC*/ -#define PERTEDEC 4 - -.align 16 -mmx_zoom: - - pushl %ebp - movl %esp,%ebp - subl $12,%esp - - movl prevX,%eax - decl %eax - sarl $4,%eax - movl %eax,-4(%ebp) - - movl prevY,%eax - decl %eax - sarl $4,%eax - movl %eax,-8(%ebp) - -;// initialisation du mm7 zero - movq (thezero), %mm7 - -movl mmx_zoom_size, %ecx -decl %ecx - -.while: - ;// esi <- nouvelle position - movl brutS, %eax - leal (%eax, %ecx, 8),%eax - - movl (%eax),%edx /* = brutS.px (brutSmypos) */ - movl 4(%eax),%eax /* = brutS.py */ - - movl brutD,%ebx - leal (%ebx, %ecx, 8),%ebx - movl (%ebx),%esi - subl %edx, %esi - imull buffratio,%esi - sarl $16,%esi - addl %edx,%esi /* esi = px */ - - /* eax contient deja brutS.py = le nouveau brutSmypos*/ - /* ebx pointe sur brutD[myPos] */ - movl 4(%ebx),%edi - subl %eax,%edi - imull buffratio,%edi - sarl $16,%edi - addl %eax,%edi /* edi = py */ - -/* pushl %eax - pushl %ebx*/ -/* popl %ebx - popl %eax*/ - - movl %esi,%eax - andl $15,%eax /* eax = coefh */ - movl %edi,%ebx - andl $15,%ebx /* ebx = coefv */ - - leal 0(,%ebx,4),%ebx - sall $6,%eax - addl %ebx,%eax - movl $precalCoef,%ebx -/* movd (%eax,%ebx),%mm6*/ /* mm6 = coeffs */ - - cmpl -8(%ebp),%edi - jge .then1 - cmpl -4(%ebp),%esi - jge .then1 - - sarl $4,%esi - sarl $4,%edi - imull zoom_width,%edi - leal (%esi,%edi),%esi - jmp .finsi1 - -.then1: - movl $0,%esi -.finsi1: - - /** apres ce calcul, %esi = pos, %mm6 = coeffs **/ -/* pushl %esi - pushl $chaine - call printf - addl $8,%esp*/ - - movl expix1,%eax - - ;// recuperation des deux premiers pixels dans mm0 et mm1 -/* movq (%eax,%esi,4), %mm0 /* b1-v1-r1-a1-b2-v2-r2-a2 */ - movq %mm0, %mm1 /* b1-v1-r1-a1-b2-v2-r2-a2 */ - - ;// depackage du premier pixel - punpcklbw %mm7, %mm0 /* 00-b2-00-v2-00-r2-00-a2 */ - - movq %mm6, %mm5 /* ??-??-??-??-c4-c3-c2-c1 */ - ;// depackage du 2ieme pixel - punpckhbw %mm7, %mm1 /* 00-b1-00-v1-00-r1-00-a1 */ - - ;// extraction des coefficients... - punpcklbw %mm5, %mm6 /* c4-c4-c3-c3-c2-c2-c1-c1 */ - movq %mm6, %mm4 /* c4-c4-c3-c3-c2-c2-c1-c1 */ - movq %mm6, %mm5 /* c4-c4-c3-c3-c2-c2-c1-c1 */ - - punpcklbw %mm5, %mm6 /* c2-c2-c2-c2-c1-c1-c1-c1 */ - punpckhbw %mm5, %mm4 /* c4-c4-c4-c4-c3-c3-c3-c3 */ - - movq %mm6, %mm3 /* c2-c2-c2-c2-c1-c1-c1-c1 */ - punpcklbw %mm7, %mm6 /* 00-c1-00-c1-00-c1-00-c1 */ - punpckhbw %mm7, %mm3 /* 00-c2-00-c2-00-c2-00-c2 */ - - ;// multiplication des pixels par les coefficients - pmullw %mm6, %mm0 /* c1*b2-c1*v2-c1*r2-c1*a2 */ - pmullw %mm3, %mm1 /* c2*b1-c2*v1-c2*r1-c2*a1 */ - paddw %mm1, %mm0 - - ;// ...extraction des 2 derniers coefficients - movq %mm4, %mm5 /* c4-c4-c4-c4-c3-c3-c3-c3 */ - punpcklbw %mm7, %mm4 /* 00-c3-00-c3-00-c3-00-c3 */ - punpckhbw %mm7, %mm5 /* 00-c4-00-c4-00-c4-00-c4 */ - - /* ajouter la longueur de ligne a esi */ - addl prevX,%esi - - ;// recuperation des 2 derniers pixels -/* movq (%eax,%esi,4), %mm1*/ - movq %mm1, %mm2 - - ;// depackage des pixels - punpcklbw %mm7, %mm1 - punpckhbw %mm7, %mm2 - - ;// multiplication pas les coeffs - pmullw %mm4, %mm1 - pmullw %mm5, %mm2 - - ;// ajout des valeurs obtenues la valeur finale - paddw %mm1, %mm0 - paddw %mm2, %mm0 - - ;// division par 256 = 16+16+16+16, puis repackage du pixel final - psrlw $8, %mm0 - packuswb %mm7, %mm0 - - ;// passage au suivant - - ;// enregistrement du resultat - movl expix2,%eax -/* movd %mm0,(%eax,%ecx,4)*/ - - decl %ecx - ;// test de fin du tantque - cmpl $0, %ecx ;// 400x300 - - jz .fin_while - jmp .while - -.fin_while: - emms - - movl %ebp,%esp - popl %ebp - - ret ;//The End diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/filter_test/mmx.h kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/filter_test/mmx.h --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/filter_test/mmx.h 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/filter_test/mmx.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,705 +0,0 @@ -/* mmx.h - - MultiMedia eXtensions GCC interface library for IA32. - - To use this library, simply include this header file - and compile with GCC. You MUST have inlining enabled - in order for mmx_ok() to work; this can be done by - simply using -O on the GCC command line. - - Compiling with -DMMX_TRACE will cause detailed trace - output to be sent to stderr for each mmx operation. - This adds lots of code, and obviously slows execution to - a crawl, but can be very useful for debugging. - - THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY - EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT - LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY - AND FITNESS FOR ANY PARTICULAR PURPOSE. - - 1997-99 by H. Dietz and R. Fisher - - Notes: - It appears that the latest gas has the pand problem fixed, therefore - I'll undefine BROKEN_PAND by default. -*/ - -#ifndef _MMX_H -#define _MMX_H - -/* Warning: at this writing, the version of GAS packaged - with most Linux distributions does not handle the - parallel AND operation mnemonic correctly. If the - symbol BROKEN_PAND is defined, a slower alternative - coding will be used. If execution of mmxtest results - in an illegal instruction fault, define this symbol. -*/ -#undef BROKEN_PAND - - -/* The type of an value that fits in an MMX register - (note that long long constant values MUST be suffixed - by LL and unsigned long long values by ULL, lest - they be truncated by the compiler) -*/ -typedef union { - long long q; /* Quadword (64-bit) value */ - unsigned long long uq; /* Unsigned Quadword */ - int d[2]; /* 2 Doubleword (32-bit) values */ - unsigned int ud[2]; /* 2 Unsigned Doubleword */ - short w[4]; /* 4 Word (16-bit) values */ - unsigned short uw[4]; /* 4 Unsigned Word */ - char b[8]; /* 8 Byte (8-bit) values */ - unsigned char ub[8]; /* 8 Unsigned Byte */ - float s[2]; /* Single-precision (32-bit) value */ -} __attribute__ ((aligned (8))) mmx_t; /* On an 8-byte (64-bit) boundary */ - - - -/* Function to test if multimedia instructions are supported... -*/ -inline extern int -mm_support(void) -{ - /* Returns 1 if MMX instructions are supported, - 3 if Cyrix MMX and Extended MMX instructions are supported - 5 if AMD MMX and 3DNow! instructions are supported - 0 if hardware does not support any of these - */ - register int rval = 0; - - __asm__ __volatile__ ( - /* See if CPUID instruction is supported ... */ - /* ... Get copies of EFLAGS into eax and ecx */ - "pushf\n\t" - "popl %%eax\n\t" - "movl %%eax, %%ecx\n\t" - - /* ... Toggle the ID bit in one copy and store */ - /* to the EFLAGS reg */ - "xorl $0x200000, %%eax\n\t" - "push %%eax\n\t" - "popf\n\t" - - /* ... Get the (hopefully modified) EFLAGS */ - "pushf\n\t" - "popl %%eax\n\t" - - /* ... Compare and test result */ - "xorl %%eax, %%ecx\n\t" - "testl $0x200000, %%ecx\n\t" - "jz NotSupported1\n\t" /* CPUID not supported */ - - - /* Get standard CPUID information, and - go to a specific vendor section */ - "movl $0, %%eax\n\t" - "cpuid\n\t" - - /* Check for Intel */ - "cmpl $0x756e6547, %%ebx\n\t" - "jne TryAMD\n\t" - "cmpl $0x49656e69, %%edx\n\t" - "jne TryAMD\n\t" - "cmpl $0x6c65746e, %%ecx\n" - "jne TryAMD\n\t" - "jmp Intel\n\t" - - /* Check for AMD */ - "\nTryAMD:\n\t" - "cmpl $0x68747541, %%ebx\n\t" - "jne TryCyrix\n\t" - "cmpl $0x69746e65, %%edx\n\t" - "jne TryCyrix\n\t" - "cmpl $0x444d4163, %%ecx\n" - "jne TryCyrix\n\t" - "jmp AMD\n\t" - - /* Check for Cyrix */ - "\nTryCyrix:\n\t" - "cmpl $0x69727943, %%ebx\n\t" - "jne NotSupported2\n\t" - "cmpl $0x736e4978, %%edx\n\t" - "jne NotSupported3\n\t" - "cmpl $0x64616574, %%ecx\n\t" - "jne NotSupported4\n\t" - /* Drop through to Cyrix... */ - - - /* Cyrix Section */ - /* See if extended CPUID level 80000001 is supported */ - /* The value of CPUID/80000001 for the 6x86MX is undefined - according to the Cyrix CPU Detection Guide (Preliminary - Rev. 1.01 table 1), so we'll check the value of eax for - CPUID/0 to see if standard CPUID level 2 is supported. - According to the table, the only CPU which supports level - 2 is also the only one which supports extended CPUID levels. - */ - "cmpl $0x2, %%eax\n\t" - "jne MMXtest\n\t" /* Use standard CPUID instead */ - - /* Extended CPUID supported (in theory), so get extended - features */ - "movl $0x80000001, %%eax\n\t" - "cpuid\n\t" - "testl $0x00800000, %%eax\n\t" /* Test for MMX */ - "jz NotSupported5\n\t" /* MMX not supported */ - "testl $0x01000000, %%eax\n\t" /* Test for Ext'd MMX */ - "jnz EMMXSupported\n\t" - "movl $1, %0:\n\n\t" /* MMX Supported */ - "jmp Return\n\n" - "EMMXSupported:\n\t" - "movl $3, %0:\n\n\t" /* EMMX and MMX Supported */ - "jmp Return\n\t" - - - /* AMD Section */ - "AMD:\n\t" - - /* See if extended CPUID is supported */ - "movl $0x80000000, %%eax\n\t" - "cpuid\n\t" - "cmpl $0x80000000, %%eax\n\t" - "jl MMXtest\n\t" /* Use standard CPUID instead */ - - /* Extended CPUID supported, so get extended features */ - "movl $0x80000001, %%eax\n\t" - "cpuid\n\t" - "testl $0x00800000, %%edx\n\t" /* Test for MMX */ - "jz NotSupported6\n\t" /* MMX not supported */ - "testl $0x80000000, %%edx\n\t" /* Test for 3DNow! */ - "jnz ThreeDNowSupported\n\t" - "movl $1, %0:\n\n\t" /* MMX Supported */ - "jmp Return\n\n" - "ThreeDNowSupported:\n\t" - "movl $5, %0:\n\n\t" /* 3DNow! and MMX Supported */ - "jmp Return\n\t" - - - /* Intel Section */ - "Intel:\n\t" - - /* Check for MMX */ - "MMXtest:\n\t" - "movl $1, %%eax\n\t" - "cpuid\n\t" - "testl $0x00800000, %%edx\n\t" /* Test for MMX */ - "jz NotSupported7\n\t" /* MMX Not supported */ - "movl $1, %0:\n\n\t" /* MMX Supported */ - "jmp Return\n\t" - - /* Nothing supported */ - "\nNotSupported1:\n\t" - "#movl $101, %0:\n\n\t" - "\nNotSupported2:\n\t" - "#movl $102, %0:\n\n\t" - "\nNotSupported3:\n\t" - "#movl $103, %0:\n\n\t" - "\nNotSupported4:\n\t" - "#movl $104, %0:\n\n\t" - "\nNotSupported5:\n\t" - "#movl $105, %0:\n\n\t" - "\nNotSupported6:\n\t" - "#movl $106, %0:\n\n\t" - "\nNotSupported7:\n\t" - "#movl $107, %0:\n\n\t" - "movl $0, %0:\n\n\t" - - "Return:\n\t" - : "=a" (rval) - : /* no input */ - : "eax", "ebx", "ecx", "edx" - ); - - /* Return */ - return(rval); -} - -/* Function to test if mmx instructions are supported... -*/ -inline extern int -mmx_ok(void) -{ - /* Returns 1 if MMX instructions are supported, 0 otherwise */ - return ( mm_support() & 0x1 ); -} - - -/* Helper functions for the instruction macros that follow... - (note that memory-to-register, m2r, instructions are nearly - as efficient as register-to-register, r2r, instructions; - however, memory-to-memory instructions are really simulated - as a convenience, and are only 1/3 as efficient) -*/ -#ifdef MMX_TRACE - -/* Include the stuff for printing a trace to stderr... -*/ - -#include - -#define mmx_i2r(op, imm, reg) \ - { \ - mmx_t mmx_trace; \ - mmx_trace.uq = (imm); \ - printf(#op "_i2r(" #imm "=0x%08x%08x, ", \ - mmx_trace.d[1], mmx_trace.d[0]); \ - __asm__ __volatile__ ("movq %%" #reg ", %0" \ - : "=X" (mmx_trace) \ - : /* nothing */ ); \ - printf(#reg "=0x%08x%08x) => ", \ - mmx_trace.d[1], mmx_trace.d[0]); \ - __asm__ __volatile__ (#op " %0, %%" #reg \ - : /* nothing */ \ - : "X" (imm)); \ - __asm__ __volatile__ ("movq %%" #reg ", %0" \ - : "=X" (mmx_trace) \ - : /* nothing */ ); \ - printf(#reg "=0x%08x%08x\n", \ - mmx_trace.d[1], mmx_trace.d[0]); \ - } - -#define mmx_m2r(op, mem, reg) \ - { \ - mmx_t mmx_trace; \ - mmx_trace = (mem); \ - printf(#op "_m2r(" #mem "=0x%08x%08x, ", \ - mmx_trace.d[1], mmx_trace.d[0]); \ - __asm__ __volatile__ ("movq %%" #reg ", %0" \ - : "=X" (mmx_trace) \ - : /* nothing */ ); \ - printf(#reg "=0x%08x%08x) => ", \ - mmx_trace.d[1], mmx_trace.d[0]); \ - __asm__ __volatile__ (#op " %0, %%" #reg \ - : /* nothing */ \ - : "X" (mem)); \ - __asm__ __volatile__ ("movq %%" #reg ", %0" \ - : "=X" (mmx_trace) \ - : /* nothing */ ); \ - printf(#reg "=0x%08x%08x\n", \ - mmx_trace.d[1], mmx_trace.d[0]); \ - } - -#define mmx_r2m(op, reg, mem) \ - { \ - mmx_t mmx_trace; \ - __asm__ __volatile__ ("movq %%" #reg ", %0" \ - : "=X" (mmx_trace) \ - : /* nothing */ ); \ - printf(#op "_r2m(" #reg "=0x%08x%08x, ", \ - mmx_trace.d[1], mmx_trace.d[0]); \ - mmx_trace = (mem); \ - printf(#mem "=0x%08x%08x) => ", \ - mmx_trace.d[1], mmx_trace.d[0]); \ - __asm__ __volatile__ (#op " %%" #reg ", %0" \ - : "=X" (mem) \ - : /* nothing */ ); \ - mmx_trace = (mem); \ - printf(#mem "=0x%08x%08x\n", \ - mmx_trace.d[1], mmx_trace.d[0]); \ - } - -#define mmx_r2r(op, regs, regd) \ - { \ - mmx_t mmx_trace; \ - __asm__ __volatile__ ("movq %%" #regs ", %0" \ - : "=X" (mmx_trace) \ - : /* nothing */ ); \ - printf(#op "_r2r(" #regs "=0x%08x%08x, ", \ - mmx_trace.d[1], mmx_trace.d[0]); \ - __asm__ __volatile__ ("movq %%" #regd ", %0" \ - : "=X" (mmx_trace) \ - : /* nothing */ ); \ - printf(#regd "=0x%08x%08x) => ", \ - mmx_trace.d[1], mmx_trace.d[0]); \ - __asm__ __volatile__ (#op " %" #regs ", %" #regd); \ - __asm__ __volatile__ ("movq %%" #regd ", %0" \ - : "=X" (mmx_trace) \ - : /* nothing */ ); \ - printf(#regd "=0x%08x%08x\n", \ - mmx_trace.d[1], mmx_trace.d[0]); \ - } - -#define mmx_m2m(op, mems, memd) \ - { \ - mmx_t mmx_trace; \ - mmx_trace = (mems); \ - printf(#op "_m2m(" #mems "=0x%08x%08x, ", \ - mmx_trace.d[1], mmx_trace.d[0]); \ - mmx_trace = (memd); \ - printf(#memd "=0x%08x%08x) => ", \ - mmx_trace.d[1], mmx_trace.d[0]); \ - __asm__ __volatile__ ("movq %0, %%mm0\n\t" \ - #op " %1, %%mm0\n\t" \ - "movq %%mm0, %0" \ - : "=X" (memd) \ - : "X" (mems)); \ - mmx_trace = (memd); \ - printf(#memd "=0x%08x%08x\n", \ - mmx_trace.d[1], mmx_trace.d[0]); \ - } - -#else - -/* These macros are a lot simpler without the tracing... -*/ - -#define mmx_i2r(op, imm, reg) \ - __asm__ __volatile__ (#op " %0, %%" #reg \ - : /* nothing */ \ - : "X" (imm) ) - -#define mmx_m2r(op, mem, reg) \ - __asm__ __volatile__ (#op " %0, %%" #reg \ - : /* nothing */ \ - : "X" (mem)) - -#define mmx_r2m(op, reg, mem) \ - __asm__ __volatile__ (#op " %%" #reg ", %0" \ - : "=X" (mem) \ - : /* nothing */ ) - -#define mmx_r2r(op, regs, regd) \ - __asm__ __volatile__ (#op " %" #regs ", %" #regd) - -#define mmx_m2m(op, mems, memd) \ - __asm__ __volatile__ ("movq %0, %%mm0\n\t" \ - #op " %1, %%mm0\n\t" \ - "movq %%mm0, %0" \ - : "=X" (memd) \ - : "X" (mems)) - -#endif - - -/* 1x64 MOVe Quadword - (this is both a load and a store... - in fact, it is the only way to store) -*/ -#define movq_m2r(var, reg) mmx_m2r(movq, var, reg) -#define movq_r2m(reg, var) mmx_r2m(movq, reg, var) -#define movq_r2r(regs, regd) mmx_r2r(movq, regs, regd) -#define movq(vars, vard) \ - __asm__ __volatile__ ("movq %1, %%mm0\n\t" \ - "movq %%mm0, %0" \ - : "=X" (vard) \ - : "X" (vars)) - - -/* 1x32 MOVe Doubleword - (like movq, this is both load and store... - but is most useful for moving things between - mmx registers and ordinary registers) -*/ -#define movd_m2r(var, reg) mmx_m2r(movd, var, reg) -#define movd_r2m(reg, var) mmx_r2m(movd, reg, var) -#define movd_r2r(regs, regd) mmx_r2r(movd, regs, regd) -#define movd(vars, vard) \ - __asm__ __volatile__ ("movd %1, %%mm0\n\t" \ - "movd %%mm0, %0" \ - : "=X" (vard) \ - : "X" (vars)) - - -/* 2x32, 4x16, and 8x8 Parallel ADDs -*/ -#define paddd_m2r(var, reg) mmx_m2r(paddd, var, reg) -#define paddd_r2r(regs, regd) mmx_r2r(paddd, regs, regd) -#define paddd(vars, vard) mmx_m2m(paddd, vars, vard) - -#define paddw_m2r(var, reg) mmx_m2r(paddw, var, reg) -#define paddw_r2r(regs, regd) mmx_r2r(paddw, regs, regd) -#define paddw(vars, vard) mmx_m2m(paddw, vars, vard) - -#define paddb_m2r(var, reg) mmx_m2r(paddb, var, reg) -#define paddb_r2r(regs, regd) mmx_r2r(paddb, regs, regd) -#define paddb(vars, vard) mmx_m2m(paddb, vars, vard) - - -/* 4x16 and 8x8 Parallel ADDs using Saturation arithmetic -*/ -#define paddsw_m2r(var, reg) mmx_m2r(paddsw, var, reg) -#define paddsw_r2r(regs, regd) mmx_r2r(paddsw, regs, regd) -#define paddsw(vars, vard) mmx_m2m(paddsw, vars, vard) - -#define paddsb_m2r(var, reg) mmx_m2r(paddsb, var, reg) -#define paddsb_r2r(regs, regd) mmx_r2r(paddsb, regs, regd) -#define paddsb(vars, vard) mmx_m2m(paddsb, vars, vard) - - -/* 4x16 and 8x8 Parallel ADDs using Unsigned Saturation arithmetic -*/ -#define paddusw_m2r(var, reg) mmx_m2r(paddusw, var, reg) -#define paddusw_r2r(regs, regd) mmx_r2r(paddusw, regs, regd) -#define paddusw(vars, vard) mmx_m2m(paddusw, vars, vard) - -#define paddusb_m2r(var, reg) mmx_m2r(paddusb, var, reg) -#define paddusb_r2r(regs, regd) mmx_r2r(paddusb, regs, regd) -#define paddusb(vars, vard) mmx_m2m(paddusb, vars, vard) - - -/* 2x32, 4x16, and 8x8 Parallel SUBs -*/ -#define psubd_m2r(var, reg) mmx_m2r(psubd, var, reg) -#define psubd_r2r(regs, regd) mmx_r2r(psubd, regs, regd) -#define psubd(vars, vard) mmx_m2m(psubd, vars, vard) - -#define psubw_m2r(var, reg) mmx_m2r(psubw, var, reg) -#define psubw_r2r(regs, regd) mmx_r2r(psubw, regs, regd) -#define psubw(vars, vard) mmx_m2m(psubw, vars, vard) - -#define psubb_m2r(var, reg) mmx_m2r(psubb, var, reg) -#define psubb_r2r(regs, regd) mmx_r2r(psubb, regs, regd) -#define psubb(vars, vard) mmx_m2m(psubb, vars, vard) - - -/* 4x16 and 8x8 Parallel SUBs using Saturation arithmetic -*/ -#define psubsw_m2r(var, reg) mmx_m2r(psubsw, var, reg) -#define psubsw_r2r(regs, regd) mmx_r2r(psubsw, regs, regd) -#define psubsw(vars, vard) mmx_m2m(psubsw, vars, vard) - -#define psubsb_m2r(var, reg) mmx_m2r(psubsb, var, reg) -#define psubsb_r2r(regs, regd) mmx_r2r(psubsb, regs, regd) -#define psubsb(vars, vard) mmx_m2m(psubsb, vars, vard) - - -/* 4x16 and 8x8 Parallel SUBs using Unsigned Saturation arithmetic -*/ -#define psubusw_m2r(var, reg) mmx_m2r(psubusw, var, reg) -#define psubusw_r2r(regs, regd) mmx_r2r(psubusw, regs, regd) -#define psubusw(vars, vard) mmx_m2m(psubusw, vars, vard) - -#define psubusb_m2r(var, reg) mmx_m2r(psubusb, var, reg) -#define psubusb_r2r(regs, regd) mmx_r2r(psubusb, regs, regd) -#define psubusb(vars, vard) mmx_m2m(psubusb, vars, vard) - - -/* 4x16 Parallel MULs giving Low 4x16 portions of results -*/ -#define pmullw_m2r(var, reg) mmx_m2r(pmullw, var, reg) -#define pmullw_r2r(regs, regd) mmx_r2r(pmullw, regs, regd) -#define pmullw(vars, vard) mmx_m2m(pmullw, vars, vard) - - -/* 4x16 Parallel MULs giving High 4x16 portions of results -*/ -#define pmulhw_m2r(var, reg) mmx_m2r(pmulhw, var, reg) -#define pmulhw_r2r(regs, regd) mmx_r2r(pmulhw, regs, regd) -#define pmulhw(vars, vard) mmx_m2m(pmulhw, vars, vard) - - -/* 4x16->2x32 Parallel Mul-ADD - (muls like pmullw, then adds adjacent 16-bit fields - in the multiply result to make the final 2x32 result) -*/ -#define pmaddwd_m2r(var, reg) mmx_m2r(pmaddwd, var, reg) -#define pmaddwd_r2r(regs, regd) mmx_r2r(pmaddwd, regs, regd) -#define pmaddwd(vars, vard) mmx_m2m(pmaddwd, vars, vard) - - -/* 1x64 bitwise AND -*/ -#ifdef BROKEN_PAND -#define pand_m2r(var, reg) \ - { \ - mmx_m2r(pandn, (mmx_t) -1LL, reg); \ - mmx_m2r(pandn, var, reg); \ - } -#define pand_r2r(regs, regd) \ - { \ - mmx_m2r(pandn, (mmx_t) -1LL, regd); \ - mmx_r2r(pandn, regs, regd) \ - } -#define pand(vars, vard) \ - { \ - movq_m2r(vard, mm0); \ - mmx_m2r(pandn, (mmx_t) -1LL, mm0); \ - mmx_m2r(pandn, vars, mm0); \ - movq_r2m(mm0, vard); \ - } -#else -#define pand_m2r(var, reg) mmx_m2r(pand, var, reg) -#define pand_r2r(regs, regd) mmx_r2r(pand, regs, regd) -#define pand(vars, vard) mmx_m2m(pand, vars, vard) -#endif - - -/* 1x64 bitwise AND with Not the destination -*/ -#define pandn_m2r(var, reg) mmx_m2r(pandn, var, reg) -#define pandn_r2r(regs, regd) mmx_r2r(pandn, regs, regd) -#define pandn(vars, vard) mmx_m2m(pandn, vars, vard) - - -/* 1x64 bitwise OR -*/ -#define por_m2r(var, reg) mmx_m2r(por, var, reg) -#define por_r2r(regs, regd) mmx_r2r(por, regs, regd) -#define por(vars, vard) mmx_m2m(por, vars, vard) - - -/* 1x64 bitwise eXclusive OR -*/ -#define pxor_m2r(var, reg) mmx_m2r(pxor, var, reg) -#define pxor_r2r(regs, regd) mmx_r2r(pxor, regs, regd) -#define pxor(vars, vard) mmx_m2m(pxor, vars, vard) - - -/* 2x32, 4x16, and 8x8 Parallel CoMPare for EQuality - (resulting fields are either 0 or -1) -*/ -#define pcmpeqd_m2r(var, reg) mmx_m2r(pcmpeqd, var, reg) -#define pcmpeqd_r2r(regs, regd) mmx_r2r(pcmpeqd, regs, regd) -#define pcmpeqd(vars, vard) mmx_m2m(pcmpeqd, vars, vard) - -#define pcmpeqw_m2r(var, reg) mmx_m2r(pcmpeqw, var, reg) -#define pcmpeqw_r2r(regs, regd) mmx_r2r(pcmpeqw, regs, regd) -#define pcmpeqw(vars, vard) mmx_m2m(pcmpeqw, vars, vard) - -#define pcmpeqb_m2r(var, reg) mmx_m2r(pcmpeqb, var, reg) -#define pcmpeqb_r2r(regs, regd) mmx_r2r(pcmpeqb, regs, regd) -#define pcmpeqb(vars, vard) mmx_m2m(pcmpeqb, vars, vard) - - -/* 2x32, 4x16, and 8x8 Parallel CoMPare for Greater Than - (resulting fields are either 0 or -1) -*/ -#define pcmpgtd_m2r(var, reg) mmx_m2r(pcmpgtd, var, reg) -#define pcmpgtd_r2r(regs, regd) mmx_r2r(pcmpgtd, regs, regd) -#define pcmpgtd(vars, vard) mmx_m2m(pcmpgtd, vars, vard) - -#define pcmpgtw_m2r(var, reg) mmx_m2r(pcmpgtw, var, reg) -#define pcmpgtw_r2r(regs, regd) mmx_r2r(pcmpgtw, regs, regd) -#define pcmpgtw(vars, vard) mmx_m2m(pcmpgtw, vars, vard) - -#define pcmpgtb_m2r(var, reg) mmx_m2r(pcmpgtb, var, reg) -#define pcmpgtb_r2r(regs, regd) mmx_r2r(pcmpgtb, regs, regd) -#define pcmpgtb(vars, vard) mmx_m2m(pcmpgtb, vars, vard) - - -/* 1x64, 2x32, and 4x16 Parallel Shift Left Logical -*/ -#define psllq_i2r(imm, reg) mmx_i2r(psllq, imm, reg) -#define psllq_m2r(var, reg) mmx_m2r(psllq, var, reg) -#define psllq_r2r(regs, regd) mmx_r2r(psllq, regs, regd) -#define psllq(vars, vard) mmx_m2m(psllq, vars, vard) - -#define pslld_i2r(imm, reg) mmx_i2r(pslld, imm, reg) -#define pslld_m2r(var, reg) mmx_m2r(pslld, var, reg) -#define pslld_r2r(regs, regd) mmx_r2r(pslld, regs, regd) -#define pslld(vars, vard) mmx_m2m(pslld, vars, vard) - -#define psllw_i2r(imm, reg) mmx_i2r(psllw, imm, reg) -#define psllw_m2r(var, reg) mmx_m2r(psllw, var, reg) -#define psllw_r2r(regs, regd) mmx_r2r(psllw, regs, regd) -#define psllw(vars, vard) mmx_m2m(psllw, vars, vard) - - -/* 1x64, 2x32, and 4x16 Parallel Shift Right Logical -*/ -#define psrlq_i2r(imm, reg) mmx_i2r(psrlq, imm, reg) -#define psrlq_m2r(var, reg) mmx_m2r(psrlq, var, reg) -#define psrlq_r2r(regs, regd) mmx_r2r(psrlq, regs, regd) -#define psrlq(vars, vard) mmx_m2m(psrlq, vars, vard) - -#define psrld_i2r(imm, reg) mmx_i2r(psrld, imm, reg) -#define psrld_m2r(var, reg) mmx_m2r(psrld, var, reg) -#define psrld_r2r(regs, regd) mmx_r2r(psrld, regs, regd) -#define psrld(vars, vard) mmx_m2m(psrld, vars, vard) - -#define psrlw_i2r(imm, reg) mmx_i2r(psrlw, imm, reg) -#define psrlw_m2r(var, reg) mmx_m2r(psrlw, var, reg) -#define psrlw_r2r(regs, regd) mmx_r2r(psrlw, regs, regd) -#define psrlw(vars, vard) mmx_m2m(psrlw, vars, vard) - - -/* 2x32 and 4x16 Parallel Shift Right Arithmetic -*/ -#define psrad_i2r(imm, reg) mmx_i2r(psrad, imm, reg) -#define psrad_m2r(var, reg) mmx_m2r(psrad, var, reg) -#define psrad_r2r(regs, regd) mmx_r2r(psrad, regs, regd) -#define psrad(vars, vard) mmx_m2m(psrad, vars, vard) - -#define psraw_i2r(imm, reg) mmx_i2r(psraw, imm, reg) -#define psraw_m2r(var, reg) mmx_m2r(psraw, var, reg) -#define psraw_r2r(regs, regd) mmx_r2r(psraw, regs, regd) -#define psraw(vars, vard) mmx_m2m(psraw, vars, vard) - - -/* 2x32->4x16 and 4x16->8x8 PACK and Signed Saturate - (packs source and dest fields into dest in that order) -*/ -#define packssdw_m2r(var, reg) mmx_m2r(packssdw, var, reg) -#define packssdw_r2r(regs, regd) mmx_r2r(packssdw, regs, regd) -#define packssdw(vars, vard) mmx_m2m(packssdw, vars, vard) - -#define packsswb_m2r(var, reg) mmx_m2r(packsswb, var, reg) -#define packsswb_r2r(regs, regd) mmx_r2r(packsswb, regs, regd) -#define packsswb(vars, vard) mmx_m2m(packsswb, vars, vard) - - -/* 4x16->8x8 PACK and Unsigned Saturate - (packs source and dest fields into dest in that order) -*/ -#define packuswb_m2r(var, reg) mmx_m2r(packuswb, var, reg) -#define packuswb_r2r(regs, regd) mmx_r2r(packuswb, regs, regd) -#define packuswb(vars, vard) mmx_m2m(packuswb, vars, vard) - - -/* 2x32->1x64, 4x16->2x32, and 8x8->4x16 UNPaCK Low - (interleaves low half of dest with low half of source - as padding in each result field) -*/ -#define punpckldq_m2r(var, reg) mmx_m2r(punpckldq, var, reg) -#define punpckldq_r2r(regs, regd) mmx_r2r(punpckldq, regs, regd) -#define punpckldq(vars, vard) mmx_m2m(punpckldq, vars, vard) - -#define punpcklwd_m2r(var, reg) mmx_m2r(punpcklwd, var, reg) -#define punpcklwd_r2r(regs, regd) mmx_r2r(punpcklwd, regs, regd) -#define punpcklwd(vars, vard) mmx_m2m(punpcklwd, vars, vard) - -#define punpcklbw_m2r(var, reg) mmx_m2r(punpcklbw, var, reg) -#define punpcklbw_r2r(regs, regd) mmx_r2r(punpcklbw, regs, regd) -#define punpcklbw(vars, vard) mmx_m2m(punpcklbw, vars, vard) - - -/* 2x32->1x64, 4x16->2x32, and 8x8->4x16 UNPaCK High - (interleaves high half of dest with high half of source - as padding in each result field) -*/ -#define punpckhdq_m2r(var, reg) mmx_m2r(punpckhdq, var, reg) -#define punpckhdq_r2r(regs, regd) mmx_r2r(punpckhdq, regs, regd) -#define punpckhdq(vars, vard) mmx_m2m(punpckhdq, vars, vard) - -#define punpckhwd_m2r(var, reg) mmx_m2r(punpckhwd, var, reg) -#define punpckhwd_r2r(regs, regd) mmx_r2r(punpckhwd, regs, regd) -#define punpckhwd(vars, vard) mmx_m2m(punpckhwd, vars, vard) - -#define punpckhbw_m2r(var, reg) mmx_m2r(punpckhbw, var, reg) -#define punpckhbw_r2r(regs, regd) mmx_r2r(punpckhbw, regs, regd) -#define punpckhbw(vars, vard) mmx_m2m(punpckhbw, vars, vard) - - -/* Empty MMx State - (used to clean-up when going from mmx to float use - of the registers that are shared by both; note that - there is no float-to-mmx operation needed, because - only the float tag word info is corruptible) -*/ -#ifdef MMX_TRACE - -#define emms() \ - { \ - printf("emms()\n"); \ - __asm__ __volatile__ ("emms"); \ - } - -#else - -#define emms() __asm__ __volatile__ ("emms") - -#endif - -#endif - diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/filter_test/px_py_calc.c kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/filter_test/px_py_calc.c --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/filter_test/px_py_calc.c 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/filter_test/px_py_calc.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,94 +0,0 @@ -#include "mmx.h" - -int testD [] = {0x1200, 0x2011, 0, 0x12, 0x5331, 0x8000}; -int testS [] = {0x1205, 0x11, 0x4210, 0x412, 0x121, 0x1211}; - -int ratios [] = {0x8000, 0x4000, 0x1234, 0x6141, 0xffff, 0}; - -int main () { - int nbERROR = 0; - int i,j; - volatile mmx_t ratiox; - - volatile mmx_t sortie; - - /* creation des variables de test */ - volatile int buffratio = 0x8000; - volatile int loop = 0; - volatile int *buffS; - volatile int *buffD; - buffS = malloc (256); - buffD = malloc (256); - - buffS = buffS + (unsigned)buffS % 64; - buffD = buffD + (unsigned)buffD % 64; - - for (j=0;j<6;j++) - for (i=0;i<3;i++) { - - buffratio = ratios[j]; - - buffS[0] = testS[i<<1]; - buffS[1] = testS[(i<<1)+1]; - - buffD[0] = testD[i*2]; - buffD[1] = testD[i*2+1]; - - /* code */ - - ratiox.d[0] = buffratio; - ratiox.d[1] = buffratio; - movq_m2r (ratiox, mm6); - pslld_i2r (16,mm6); - - /* |0hhhhhhh|llllvvvv| - x |00000000|bbbbbbbb| - ================= - |.bl.high|..bl.low| - + |..bh.low|00000000| - ================= - result1 - */ - - /* - * pre : mm6 = [buffratio<<16|buffratio<<16] - */ - - movq_m2r (buffS[loop],mm0); /* mm0 = S */ - movq_m2r (buffD[loop],mm1); /* mm1 = D */ - psubd_r2r (mm0,mm1); /* mm1 = D - S */ - movq_r2r (mm1, mm2); /* mm2 = D - S */ - - pslld_i2r (16,mm1); - mmx_r2r (pmulhuw, mm6, mm1); /* mm1 = ?? */ - pmullw_r2r (mm6, mm2); - - paddd_r2r (mm2, mm1); /* mm1 = (D - S) * buffratio >> 16 */ - pslld_i2r (16,mm0); - - paddd_r2r (mm1, mm0); /* mm0 = S + mm1 */ - psrld_i2r (16, mm0); - movq_r2m (mm0, sortie); - - /* - * post : mm0 = S + ((D-S)*buffratio)>>16 - * modified = mm0,mm1,mm2 - */ - - if ( - (buffS[0] + (((buffD[0]-buffS[0]) * buffratio)>>16) != sortie.d[0]) - | (buffS[1] + (((buffD[1]-buffS[1]) * buffratio)>>16) != sortie.d[1])) - { - nbERROR++; - printf ("\ns : (0x%08x,0x%08x)\n", buffS[0], buffS[1]); - printf ("d : (0x%08x,0x%08x)\n", buffD[0], buffD[1]); - printf ("ratio : (0x%08x,0x%08x)\n", buffratio, buffratio); - - printf ("en mmx : (0x%08x,0x%08x)\n", sortie.d[0], sortie.d[1]); - printf ("en c : (0x%08x,0x%08x)\n", - buffS[0] + (((buffD[0]-buffS[0]) * buffratio)>>16), - buffS[1] + (((buffD[1]-buffS[1]) * buffratio)>>16)); - } - } - printf ("%d errors\n",nbERROR); -} diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/filter_test/zoom_filter_mmx.c kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/filter_test/zoom_filter_mmx.c --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/filter_test/zoom_filter_mmx.c 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/filter_test/zoom_filter_mmx.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,186 +0,0 @@ - -#define BUFFPOINTNB 16 -#define BUFFPOINTMASK 0xffff -#define BUFFINCR 0xff - -#define sqrtperte 16 -// faire : a % sqrtperte <=> a & pertemask -#define PERTEMASK 0xf -// faire : a / sqrtperte <=> a >> PERTEDEC -#define PERTEDEC 4 - -//#define MMX_TRACE -#include "mmx.h" - -void zoom_filter_mmx (int prevX, int prevY, - unsigned int *expix1, unsigned int *expix2, - int *lbruS, int *lbruD, int buffratio, - int precalCoef[16][16]) -{ - int bufsize = prevX * prevY; /* taille du buffer */ - volatile int loop; /* variable de boucle */ - - mmx_t *brutS = (mmx_t*)lbruS; /* buffer de transformation source */ - mmx_t *brutD = (mmx_t*)lbruD; /* buffer de transformation dest */ - - int pos; - - volatile mmx_t prevXY; - volatile mmx_t ratiox; - volatile mmx_t interpix; - - volatile mmx_t mask; /* masque des nombres a virgules */ - mask.ud[0] = BUFFPOINTMASK; - mask.ud[1] = BUFFPOINTMASK; - - prevXY.ud[0] = (prevX-1)<>16 format [X|Y] - * modified = mm0,mm1,mm2 - */ - - movq_m2r (brutS[loop],mm0); /* mm0 = S */ - movq_m2r (brutD[loop],mm1); /* mm1 = D */ - psubd_r2r (mm0,mm1); /* mm1 = D - S */ - movq_r2r (mm1, mm2); /* mm2 = D - S */ - - pslld_i2r (16,mm1); - mmx_r2r (pmulhuw, mm6, mm1); /* mm1 = ?? */ - pmullw_r2r (mm6, mm2); - - paddd_r2r (mm2, mm1); /* mm1 = (D - S) * buffratio >> 16 */ - pslld_i2r (16,mm0); - - paddd_r2r (mm1, mm0); /* mm0 = S + mm1 */ - psrld_i2r (16, mm0); - - /* - * pre : mm0 : position vector on screen - * prevXY : coordinate of the lower-right point on screen - * post : clipped mm0 - * modified : mm0,mm1 - */ - movq_m2r (prevXY,mm1); - pcmpgtd_r2r (mm0, mm1); /* mm0 en X contient : - 1111 si prevXY > px - 0000 si prevXY <= px - (idem pour y) */ - pand_r2r (mm1, mm0); /* on met a zero la partie qui deborde */ - - - /* - * pre : mm0 : clipped position on screen - * post : mm6 : coefs for this position - * mm1 : X vector [0|X] - * modif : eax,ebx - */ - __asm__ __volatile__ ( - "movq %%mm0,%%mm1\n" - "movd %%mm0,%%eax\n" - "psrlq $32,%%mm1\n" - "movd %%mm1,%%ebx\n" - "and $15,%%eax\n" - "and $15,%%ebx\n" - "add %0,%%eax\n" - "movd (%%eax,%%ebx,$16),%%mm6\n" - ::"X"(precalCoef):"eax","ebx"); - - /* - * pre : mm0 : Y pos [*|Y] - * mm1 : X pos [*|X] - * post : eax : absolute position of the source pixel. - * modif : ebx - */ - psrld_i2r (PERTEDEC,mm0); - psrld_i2r (PERTEDEC,mm1); - __asm__ __volatile__ ( - "movd %%mm1,%%eax\n" -// "movl %1,%%ebx\n" - "mull %1\n" - "movd %%mm0,%%ebx\n" - "addl %%ebx,%%eax\n" - "movl %%eax,%0\n" - :"=X"(pos):"X"(prevX):"eax","ebx" - ); - - expix2[loop] = expix1[pos]; - /* - * coeffs = precalCoef [px & PERTEMASK][py & PERTEMASK]; - * coef en modulo 15 * - * pos = ((px>>PERTEMASK) + prevX * (py>>PERTEMASK)); - */ -// precal + eax + ebx * 16 - -// movd_m2r (precalCoef[interpix.d[0]][interpix.d[1]],mm6); - - /* recuperation des deux premiers pixels dans mm0 et mm1 */ -// movq_m2r (/*expix1[pos]*/a, mm0); /* b1-v1-r1-a1-b2-v2-r2-a2 */ -// movq_r2r (mm0, mm1); /* b1-v1-r1-a1-b2-v2-r2-a2 */ - - /* depackage du premier pixel */ -// punpcklbw_r2r (mm7, mm0); /* 00-b2-00-v2-00-r2-00-a2 */ - -// movq_r2r (mm6, mm5); /* ??-??-??-??-c4-c3-c2-c1 */ - /* depackage du 2ieme pixel */ -// punpckhbw_r2r (mm7, mm1); /* 00-b1-00-v1-00-r1-00-a1 */ - - /* extraction des coefficients... */ -// punpcklbw_r2r (mm5, mm6); /* c4-c4-c3-c3-c2-c2-c1-c1 */ -// movq_r2r (mm6, mm4); /* c4-c4-c3-c3-c2-c2-c1-c1 */ -// movq_r2r (mm6, mm5); /* c4-c4-c3-c3-c2-c2-c1-c1 */ - -// punpcklbw_r2r (mm5, mm6); /* c2-c2-c2-c2-c1-c1-c1-c1 */ -// punpckhbw_r2r (mm5, mm4); /* c4-c4-c4-c4-c3-c3-c3-c3 */ - -// movq_r2r (mm6, mm3); /* c2-c2-c2-c2-c1-c1-c1-c1 */ -// punpcklbw_r2r (mm7, mm6); /* 00-c1-00-c1-00-c1-00-c1 */ -// punpckhbw_r2r (mm7, mm3); /* 00-c2-00-c2-00-c2-00-c2 */ - - /* multiplication des pixels par les coefficients */ -// pmullw_r2r (mm6, mm0); /* c1*b2-c1*v2-c1*r2-c1*a2 */ -// pmullw_r2r (mm3, mm1); /* c2*b1-c2*v1-c2*r1-c2*a1 */ -// paddw_r2r (mm1, mm0); - - /* ...extraction des 2 derniers coefficients */ -// movq_r2r (mm4, mm5); /* c4-c4-c4-c4-c3-c3-c3-c3 */ -// punpcklbw_r2r (mm7, mm4); /* 00-c3-00-c3-00-c3-00-c3 */ -// punpckhbw_r2r (mm7, mm5); /* 00-c4-00-c4-00-c4-00-c4 */ - - /* recuperation des 2 derniers pixels */ -// movq_m2r (a/*expix1[pos+largeur]*/, mm1); -// movq_r2r (mm1, mm2); - - /* depackage des pixels */ -// punpcklbw_r2r (mm7, mm1); -// punpckhbw_r2r (mm7, mm2); - - /* multiplication pas les coeffs */ -// pmullw_r2r (mm4, mm1); -// pmullw_r2r (mm5, mm2); - - /* ajout des valeurs obtenues la valeur finale */ -// paddw_r2r (mm1, mm0); -// paddw_r2r (mm2, mm0); - - /* division par 256 = 16+16+16+16, puis repackage du pixel final */ -// psrlw_i2r (8, mm0); -// packuswb_r2r (mm7, mm0); - -// movd_r2m (mm0,expix2[loop]); - - // expix2[loop] = couleur; - } - emms(); /* __asm__ __volatile__ ("emms"); */ -} diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/filter_test/zoom_filter_mmx-v0.c kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/filter_test/zoom_filter_mmx-v0.c --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/filter_test/zoom_filter_mmx-v0.c 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/filter_test/zoom_filter_mmx-v0.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,202 +0,0 @@ - -#define BUFFPOINTNB 16 -#define BUFFPOINTMASK 0xffff -#define BUFFINCR 0xff - -#define sqrtperte 16 -// faire : a % sqrtperte <=> a & pertemask -#define PERTEMASK 0xf -// faire : a / sqrtperte <=> a >> PERTEDEC -#define PERTEDEC 4 - -//#define MMX_TRACE -#include "mmx.h" - -void zoom_filter_mmx (int prevX, int prevY, - unsigned int *expix1, unsigned int *expix2, - int *lbruS, int *lbruD, int buffratio, - int precalCoef[16][16]) -{ - int bufsize = prevX * prevY; /* taille du buffer */ - volatile int loop; /* variable de boucle */ - - mmx_t *brutS = (mmx_t*)lbruS; /* buffer de transformation source */ - mmx_t *brutD = (mmx_t*)lbruD; /* buffer de transformation dest */ - - volatile mmx_t prevXY; - volatile mmx_t ratiox; - volatile mmx_t interpix; - - volatile mmx_t mask; /* masque des nombres a virgules */ - mask.ud[0] = BUFFPOINTMASK; - mask.ud[1] = BUFFPOINTMASK; - - prevXY.ud[0] = (prevX-1)<>16 format [X|Y] - * modified = mm0,mm1,mm2 - */ - - __asm__ __volatile__ ( - "movq %0,%%mm0\n" - "movq %1,%%mm1\n" - : :"X"(brutS[loop]),"X"(brutD[loop]) - ); /* mm0 = S */ - - psubd_r2r (mm0,mm1); /* mm1 = D - S */ - movq_r2r (mm1, mm2); /* mm2 = D - S */ - - pslld_i2r (16,mm1); - mmx_r2r (pmulhuw, mm6, mm1); /* mm1 = ?? */ - pmullw_r2r (mm6, mm2); - - paddd_r2r (mm2, mm1); /* mm1 = (D - S) * buffratio >> 16 */ - pslld_i2r (16,mm0); - - paddd_r2r (mm1, mm0); /* mm0 = S + mm1 */ - psrld_i2r (16, mm0); - - /* - * pre : mm0 : position vector on screen - * prevXY : coordinate of the lower-right point on screen - * post : clipped mm0 - * modified : mm0,mm1,mm2 - */ - movq_m2r (prevXY,mm1); - pcmpgtd_r2r (mm0, mm1); /* mm0 en X contient : - 1111 si prevXY > px - 0000 si prevXY <= px - (idem pour y) */ - movq_r2r (mm1,mm2); - punpckldq_r2r (mm1,mm1); - punpckhdq_r2r (mm2,mm2); - pand_r2r (mm1, mm0); /* on met a zero la partie qui deborde */ - pand_r2r (mm2, mm0); /* on met a zero la partie qui deborde */ - - /* - * pre : mm0 : clipped position on screen - * post : mm6 : coefs for this position - * mm1 : X vector [0|X] - * modif : eax,ebx - */ - __asm__ __volatile__ ( - "movq %%mm0,%%mm1\n" - "movd %%mm0,%%ebx\n" - "psrlq $32,%%mm1\n" - "movd %%mm1,%%eax\n" - "andl $15,%%eax\n" - "andl $15,%%ebx\n" - - "shll $2,%%eax\n" - "shll $3,%%ebx\n" - - "addl %0,%%eax\n" - - "movd (%%eax,%%ebx,8),%%mm6\n" - ::"X"(precalCoef):"eax","ebx"); - - /* - * pre : mm0 : Y pos [*|Y] - * mm1 : X pos [*|X] - * post : eax : absolute position of the source pixel. - * modif : ebx - */ - psrld_i2r (PERTEDEC,mm0); - psrld_i2r (PERTEDEC,mm1); - __asm__ __volatile__ ( - "movd %%mm1,%%eax\n" - "mull %1\n" - "movd %%mm0,%%ebx\n" - "addl %%ebx,%%eax\n" - "movl %0,%%ebx\n" - "movq (%%ebx,%%eax,4),%%mm0\n" - "addl %1,%%eax\n" - "movq (%%ebx,%%eax,4),%%mm2\n" - - : : "X"(expix1), "X"(prevX):"eax","ebx" - ); - - /* - * coeffs = precalCoef [px & PERTEMASK][py & PERTEMASK]; - * coef en modulo 15 * - * pos = ((px>>PERTEMASK) + prevX * (py>>PERTEMASK)); - */ - - /* recuperation des deux premiers pixels dans mm0 et mm1 */ -// movq_m2r (expix1[pos], mm0); /* b1-v1-r1-a1-b2-v2-r2-a2 */ - movq_r2r (mm0, mm1); /* b1-v1-r1-a1-b2-v2-r2-a2 */ - - /* recuperation des 2 derniers pixels */ -// movq_m2r (expix1[pos+prevX], mm2); - - /* depackage du premier pixel */ - punpcklbw_r2r (mm7, mm0); /* 00-b2-00-v2-00-r2-00-a2 */ - - movq_r2r (mm6, mm5); /* ??-??-??-??-c4-c3-c2-c1 */ - /* depackage du 2ieme pixel */ - punpckhbw_r2r (mm7, mm1); /* 00-b1-00-v1-00-r1-00-a1 */ - - /* extraction des coefficients... */ - punpcklbw_r2r (mm5, mm6); /* c4-c4-c3-c3-c2-c2-c1-c1 */ - movq_r2r (mm6, mm4); /* c4-c4-c3-c3-c2-c2-c1-c1 */ - movq_r2r (mm6, mm5); /* c4-c4-c3-c3-c2-c2-c1-c1 */ - - punpcklbw_r2r (mm5, mm6); /* c2-c2-c2-c2-c1-c1-c1-c1 */ - punpckhbw_r2r (mm5, mm4); /* c4-c4-c4-c4-c3-c3-c3-c3 */ - - movq_r2r (mm6, mm3); /* c2-c2-c2-c2-c1-c1-c1-c1 */ - punpcklbw_r2r (mm7, mm6); /* 00-c1-00-c1-00-c1-00-c1 */ - punpckhbw_r2r (mm7, mm3); /* 00-c2-00-c2-00-c2-00-c2 */ - - /* multiplication des pixels par les coefficients */ - pmullw_r2r (mm6, mm0); /* c1*b2-c1*v2-c1*r2-c1*a2 */ - pmullw_r2r (mm3, mm1); /* c2*b1-c2*v1-c2*r1-c2*a1 */ - paddw_r2r (mm1, mm0); - - /* ...extraction des 2 derniers coefficients */ - movq_r2r (mm4, mm5); /* c4-c4-c4-c4-c3-c3-c3-c3 */ - punpcklbw_r2r (mm7, mm4); /* 00-c3-00-c3-00-c3-00-c3 */ - punpckhbw_r2r (mm7, mm5); /* 00-c4-00-c4-00-c4-00-c4 */ - - /* recuperation des 2 derniers pixels */ - movq_r2r (mm2, mm1); - - /* depackage des pixels */ - punpcklbw_r2r (mm7, mm1); - punpckhbw_r2r (mm7, mm2); - - /* multiplication pas les coeffs */ - pmullw_r2r (mm4, mm1); - pmullw_r2r (mm5, mm2); - - /* ajout des valeurs obtenues la valeur finale */ - paddw_r2r (mm1, mm0); - paddw_r2r (mm2, mm0); - - /* division par 256 = 16+16+16+16, puis repackage du pixel final */ - psrlw_i2r (8, mm0); - packuswb_r2r (mm7, mm0); - - movd_r2m (mm0,expix2[loop]); - - // expix2[loop] = couleur; - ++loop; - } - emms(); /* __asm__ __volatile__ ("emms"); */ -} diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/flying_stars_fx.c kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/flying_stars_fx.c --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/flying_stars_fx.c 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/flying_stars_fx.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,316 +0,0 @@ -#include "goom_fx.h" -#include "goom_plugin_info.h" -#include "goom_tools.h" - -#include "mathtools.h" - -/* TODO:-- FAIRE PROPREMENT... BOAH... */ -#define NCOL 15 - -/*static const int colval[] = { -0xfdf6f5, -0xfae4e4, -0xf7d1d1, -0xf3b6b5, -0xefa2a2, -0xec9190, -0xea8282, -0xe87575, -0xe46060, -0xe14b4c, -0xde3b3b, -0xdc2d2f, -0xd92726, -0xd81619, -0xd50c09, -0 -}; -*/ -static const int colval[] = { - 0x1416181a, - 0x1419181a, - 0x141f181a, - 0x1426181a, - 0x142a181a, - 0x142f181a, - 0x1436181a, - 0x142f1819, - 0x14261615, - 0x13201411, - 0x111a100a, - 0x0c180508, - 0x08100304, - 0x00050101, - 0x0 -}; - - -/* The different modes of the visual FX. - * Put this values on fx_mode */ -#define FIREWORKS_FX 0 -#define RAIN_FX 1 -#define FOUNTAIN_FX 2 -#define LAST_FX 3 - -typedef struct _FS_STAR { - float x,y; - float vx,vy; - float ax,ay; - float age,vage; -} Star; - -typedef struct _FS_DATA{ - - int fx_mode; - int nbStars; - - int maxStars; - Star *stars; - - float min_age; - float max_age; - - PluginParam min_age_p; - PluginParam max_age_p; - PluginParam nbStars_p; - PluginParam nbStars_limit_p; - PluginParam fx_mode_p; - - PluginParameters params; -} FSData; - -static void fs_init(VisualFX *_this, PluginInfo *info) { - - FSData *data; - data = (FSData*)malloc(sizeof(FSData)); - - data->fx_mode = FIREWORKS_FX; - data->maxStars = 4096; - data->stars = (Star*)malloc(data->maxStars * sizeof(Star)); - data->nbStars = 0; - - data->max_age_p = secure_i_param ("Fireworks Smallest Bombs"); - IVAL(data->max_age_p) = 80; - IMIN(data->max_age_p) = 0; - IMAX(data->max_age_p) = 100; - ISTEP(data->max_age_p) = 1; - - data->min_age_p = secure_i_param ("Fireworks Largest Bombs"); - IVAL(data->min_age_p) = 99; - IMIN(data->min_age_p) = 0; - IMAX(data->min_age_p) = 100; - ISTEP(data->min_age_p) = 1; - - data->nbStars_limit_p = secure_i_param ("Max Number of Particules"); - IVAL(data->nbStars_limit_p) = 512; - IMIN(data->nbStars_limit_p) = 0; - IMAX(data->nbStars_limit_p) = data->maxStars; - ISTEP(data->nbStars_limit_p) = 64; - - data->fx_mode_p = secure_i_param ("FX Mode"); - IVAL(data->fx_mode_p) = data->fx_mode; - IMIN(data->fx_mode_p) = 1; - IMAX(data->fx_mode_p) = 3; - ISTEP(data->fx_mode_p) = 1; - - data->nbStars_p = secure_f_feedback ("Number of Particules (% of Max)"); - - data->params = plugin_parameters ("Particule System", 7); - data->params.params[0] = &data->fx_mode_p; - data->params.params[1] = &data->nbStars_limit_p; - data->params.params[2] = 0; - data->params.params[3] = &data->min_age_p; - data->params.params[4] = &data->max_age_p; - data->params.params[5] = 0; - data->params.params[6] = &data->nbStars_p; - - _this->params = &data->params; - _this->fx_data = (void*)data; -} - -static void fs_free(VisualFX *_this) { - FSData *data = (FSData*)_this->fx_data; - free (data->stars); - free (data->params.params); - free (data); -} - - -/** - * Cree une nouvelle 'bombe', c'est a dire une particule appartenant a une fusee d'artifice. - */ -static void addABomb (FSData *fs, int mx, int my, float radius, float vage, float gravity, PluginInfo *info) { - - int i = fs->nbStars; - float ro; - int theta; - - if (fs->nbStars >= fs->maxStars) - return; - fs->nbStars++; - - fs->stars[i].x = mx; - fs->stars[i].y = my; - - ro = radius * (float)goom_irand(info->gRandom,100) / 100.0f; - ro *= (float)goom_irand(info->gRandom,100)/100.0f + 1.0f; - theta = goom_irand(info->gRandom,256); - - fs->stars[i].vx = ro * cos256[theta]; - fs->stars[i].vy = -0.2f + ro * sin256[theta]; - - fs->stars[i].ax = 0; - fs->stars[i].ay = gravity; - - fs->stars[i].age = 0; - if (vage < fs->min_age) - vage=fs->min_age; - fs->stars[i].vage = vage; -} - - -/** - * Met a jour la position et vitesse d'une particule. - */ -static void updateStar (Star *s) { - s->x+=s->vx; - s->y+=s->vy; - s->vx+=s->ax; - s->vy+=s->ay; - s->age+=s->vage; -} - - -/** - * Ajoute de nouvelles particules au moment d'un evenement sonore. - */ -static void fs_sound_event_occured(VisualFX *_this, PluginInfo *info) { - - FSData *data = (FSData*)_this->fx_data; - int i; - - int max = (int)((1.0f+info->sound.goomPower)*goom_irand(info->gRandom,150)) + 100; - float radius = (1.0f+info->sound.goomPower) * (float)(goom_irand(info->gRandom,150)+50)/300; - int mx; - int my; - float vage, gravity = 0.02f; - - switch (data->fx_mode) { - case FIREWORKS_FX: - { - double dx,dy; - do { - mx = goom_irand(info->gRandom,info->screen.width); - my = goom_irand(info->gRandom,info->screen.height); - dx = (mx - info->screen.width/2); - dy = (my - info->screen.height/2); - } while (dx*dx + dy*dy < (info->screen.height/2)*(info->screen.height/2)); - vage = data->max_age * (1.0f - info->sound.goomPower); - } - break; - case RAIN_FX: - mx = goom_irand(info->gRandom,info->screen.width); - if (mx > info->screen.width/2) - mx = info->screen.width; - else - mx = 0; - my = -(info->screen.height/3)-goom_irand(info->gRandom,info->screen.width/3); - radius *= 1.5; - vage = 0.002f; - break; - case FOUNTAIN_FX: - my = info->screen.height+2; - vage = 0.001f; - radius += 1.0f; - mx = info->screen.width / 2; - gravity = 0.04f; - break; - default: - return; - /* my = i R A N D (info->screen.height); vage = 0.01f; */ - } - - radius *= info->screen.height / 200.0f; /* why 200 ? because the FX was developped on 320x200 */ - max *= info->screen.height / 200.0f; - - if (info->sound.timeSinceLastBigGoom < 1) { - radius *= 1.5; - max *= 2; - } - for (i=0;ifx_data; - - /* Get the new parameters values */ - data->min_age = 1.0f - (float)IVAL(data->min_age_p)/100.0f; - data->max_age = 1.0f - (float)IVAL(data->max_age_p)/100.0f; - FVAL(data->nbStars_p) = (float)data->nbStars / (float)data->maxStars; - data->nbStars_p.change_listener(&data->nbStars_p); - data->maxStars = IVAL(data->nbStars_limit_p); - data->fx_mode = IVAL(data->fx_mode_p); - - /* look for events */ - if (info->sound.timeSinceLastGoom < 1) { - fs_sound_event_occured(_this, info); - if (goom_irand(info->gRandom,20)==1) { - IVAL(data->fx_mode_p) = goom_irand(info->gRandom,(LAST_FX*3)); - data->fx_mode_p.change_listener(&data->fx_mode_p); - } - } - - /* update particules */ - for (i=0;inbStars;++i) { - updateStar(&data->stars[i]); - - /* dead particule */ - if (data->stars[i].age>=NCOL) - continue; - - /* choose the color of the particule */ - col = colval[(int)data->stars[i].age]; - - /* draws the particule */ - info->methods.draw_line(dest,(int)data->stars[i].x,(int)data->stars[i].y, - (int)(data->stars[i].x-data->stars[i].vx*6), - (int)(data->stars[i].y-data->stars[i].vy*6), - col, - (int)info->screen.width, (int)info->screen.height); - info->methods.draw_line(dest,(int)data->stars[i].x,(int)data->stars[i].y, - (int)(data->stars[i].x-data->stars[i].vx*2), - (int)(data->stars[i].y-data->stars[i].vy*2), - col, - (int)info->screen.width, (int)info->screen.height); - } - - /* look for dead particules */ - for (i=0;inbStars;) { - - if ((data->stars[i].x > info->screen.width + 64) - ||((data->stars[i].vy>=0)&&(data->stars[i].y - 16*data->stars[i].vy > info->screen.height)) - ||(data->stars[i].x < -64) - ||(data->stars[i].age>=NCOL)) { - data->stars[i] = data->stars[data->nbStars-1]; - data->nbStars--; - } - else ++i; - } -} - -VisualFX flying_star_create(void) { - VisualFX vfx; - vfx.init = fs_init; - vfx.free = fs_free; - vfx.apply = fs_apply; - vfx.fx_data = 0; - return vfx; -} diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/gfontlib.c kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/gfontlib.c --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/gfontlib.c 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/gfontlib.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,231 +0,0 @@ -#include "goom_config.h" -#include "gfontrle.h" -#include "gfontlib.h" -#include -#include - -static Pixel ***font_chars; -static int *font_width; -static int *font_height; -static Pixel ***small_font_chars; -static int *small_font_width; -static int *small_font_height; - -void gfont_load (void) { - unsigned char *gfont; - unsigned int i = 0, j = 0; - unsigned int nba = 0; - unsigned int current = 32; - int *font_pos; - /* decompress le rle */ - - - - gfont = malloc (the_font.width*the_font.height*the_font.bytes_per_pixel); - while (i>2)<<(ROUGE*8))| - (((g1 + g2 + g3 + g4)>>2)<<(VERT*8))| - (((b1 + b2 + b3 + b4)>>2)<<(BLEU*8))| - (((a1 + a2 + a3 + a4)>>2)<<(ALPHA*8)); - } - } - } - - /* definir les lettres restantes */ - - for (i=0;i<256;i++) { - if (font_chars[i]==0) { - font_chars[i]=font_chars[42]; - small_font_chars[i]=small_font_chars[42]; - font_width[i]=font_width[42]; - font_pos[i]=font_pos[42]; - font_height[i]=font_height[42]; - small_font_width[i]=small_font_width[42]; - small_font_height[i]=small_font_height[42]; - } - } - - font_width [32] = (the_font.height / 2) - 1; - small_font_width [32] = font_width [32]/2; - font_chars [32] = 0; - small_font_chars [32] = 0; - free( gfont ); - free( font_pos ); -} - -void goom_draw_text (Pixel * buf,int resolx,int resoly, - int x, int y, - const char *str, float charspace, int center) { - float fx = (float) x; - int fin = 0; - - Pixel ***cur_font_chars; - int *cur_font_width; - int *cur_font_height; - - if (resolx>320) - { - /* printf("use big\n"); */ - cur_font_chars = font_chars; - cur_font_width = font_width; - cur_font_height = font_height; - } - else - { - /* printf ("use small\n"); */ - cur_font_chars = small_font_chars; - cur_font_width = small_font_width; - cur_font_height = small_font_height; - } - - if (cur_font_chars == NULL) - return ; - - if (center) { - unsigned char *tmp = (unsigned char*)str; - float lg = -charspace; - - while (*tmp != '\0') - lg += cur_font_width[*(tmp++)] + charspace; - - fx -= lg / 2; - } - - while (!fin) { - unsigned char c = *str; - - x = (int) fx; - - if (c == '\0') - fin = 1; - else if (cur_font_chars[c]==0) { - fx += cur_font_width[c] + charspace; - } - else { - int xx, yy; - int xmin = x; - int xmax = x + cur_font_width[c]; - int ymin = y - cur_font_height[c]; - int ymax = y; - - yy = ymin; - - if (xmin < 0) - xmin = 0; - - if (xmin >= resolx - 1) - return; - - if (xmax >= (int) resolx) - xmax = resolx - 1; - - if (yy < 0) - yy = 0; - - if (yy <= (int) resoly - 1) { - if (ymax >= (int) resoly - 1) - ymax = resoly - 1; - - for (; yy < ymax; yy++) - for (xx = xmin; xx < xmax; xx++) - { - Pixel color = cur_font_chars[c][yy - ymin][xx - x]; - Pixel transparency; - transparency.val = color.val & A_CHANNEL; - if (transparency.val) - { - if (transparency.val==A_CHANNEL) buf[yy * resolx + xx] = color; - else - { - Pixel back = buf[yy * resolx + xx]; - unsigned int a1 = color.channels.a; - unsigned int a2 = 255 - a1; - buf[yy * resolx + xx].channels.r = (unsigned char)((((unsigned int)color.channels.r * a1) + ((unsigned int)back.channels.r * a2)) >> 8); - buf[yy * resolx + xx].channels.g = (unsigned char)((((unsigned int)color.channels.g * a1) + ((unsigned int)back.channels.g * a2)) >> 8); - buf[yy * resolx + xx].channels.b = (unsigned char)((((unsigned int)color.channels.b * a1) + ((unsigned int)back.channels.b * a2)) >> 8); - } - } - } - } - fx += cur_font_width[c] + charspace; - } - str++; - } -} diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/gfontlib.h kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/gfontlib.h --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/gfontlib.h 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/gfontlib.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,10 +0,0 @@ -#ifndef _GFONTLIB_H -#define _GFONTLIB_H - -#include "goom_graphic.h" - -void gfont_load (void); -void goom_draw_text (Pixel * buf,int resolx,int resoly, int x, int y, - const char *str, float chspace, int center); - -#endif diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/gfontrle.c kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/gfontrle.c --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/gfontrle.c 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/gfontrle.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,2500 +0,0 @@ -/* RGBA C-Source image dump (with zRLE compression) */ - -const struct { - unsigned int width; - unsigned int height; - unsigned int bytes_per_pixel; - unsigned int rle_size; - unsigned char rle_pixel [49725]; -} the_font = { -1277, 21, 4, 49725, { -121,17,164,255,121,17,164,255,121,17,164,255,121,17,164,255,0,8,121,17, -164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,36,121,17,164, -0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,52,121,17,164,0, -1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1, -121,17,164,255,121,17,164,255,121,17,164,255,0,52,121,17,164,0,1,121, -17,164,255,121,17,164,255,121,17,164,255,0,52,121,17,164,0,1,121,17, -164,255,121,17,164,255,121,17,164,255,0,12,121,17,164,0,1,121,17,164, -255,121,17,164,255,121,17,164,255,0,20,121,17,164,0,1,121,17,164,255, -121,17,164,255,121,17,164,255,0,20,121,17,164,0,1,121,17,164,255,121, -17,164,255,121,17,164,255,0,52,121,17,164,0,1,121,17,164,255,121,17, -164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164, -255,121,17,164,255,0,12,121,17,164,0,1,121,17,164,255,121,17,164,255, -121,17,164,255,0,36,121,17,164,0,1,121,17,164,255,121,17,164,255,121, -17,164,255,0,12,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17, -164,255,0,36,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164, -255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255, -0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0, -44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44, -121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121, -17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17, -164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164, -0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0, -1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1, -121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121, -17,164,255,121,17,164,255,121,17,164,255,0,12,121,17,164,0,1,121,17, -164,255,121,17,164,255,121,17,164,255,0,12,121,17,164,0,1,121,17,164, -255,121,17,164,255,121,17,164,255,0,36,121,17,164,0,1,121,17,164,255, -121,17,164,255,121,17,164,255,0,36,121,17,164,0,1,121,17,164,255,121, -17,164,255,121,17,164,255,0,36,121,17,164,0,1,121,17,164,255,121,17, -164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164, -255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255, -121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121, -17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17, -164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164, -255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255, -0,36,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0, -36,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44, -121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121, -17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,12,121,17, -164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164, -0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0, -1,121,17,164,255,121,17,164,255,121,17,164,255,0,36,121,17,164,0,1, -121,17,164,255,121,17,164,255,121,17,164,255,0,52,121,17,164,0,1,121, -17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17, -164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164, -255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255, -121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121, -17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17, -164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164, -255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255, -121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121, -17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17, -164,255,0,52,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164, -255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255, -0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0, -44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,20, -121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,36,121, -17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,20,121,17, -164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,36,121,17,164, -0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,36,121,17,164,0, -1,121,17,164,255,121,17,164,255,121,17,164,255,0,12,121,17,164,0,1, -121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121, -17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17, -164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164, -255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255, -121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121, -17,164,255,121,17,164,255,0,28,121,17,164,0,1,121,17,164,255,121,17, -164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164, -255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255, -121,17,164,255,0,12,121,17,164,0,1,121,17,164,255,121,17,164,255,121, -17,164,255,0,28,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17, -164,255,0,44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164, -255,0,12,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255, -0,52,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0, -44,121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44, -121,17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121, -17,164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17, -164,0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164, -0,1,121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0, -1,121,17,164,255,121,17,164,255,121,17,164,255,0,28,121,17,164,0,1, -121,17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121, -17,164,255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17, -164,255,121,17,164,255,121,17,164,255,0,52,121,17,164,0,1,121,17,164, -255,121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255, -121,17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121, -17,164,255,121,17,164,255,0,44,121,17,164,0,1,121,17,164,255,121,17, -164,255,121,17,164,255,0,28,121,17,164,0,1,121,17,164,255,121,17,164, -255,121,17,164,255,0,12,121,17,164,0,1,121,17,164,255,121,17,164,255, -121,17,164,255,0,28,121,17,164,0,1,121,17,164,255,121,17,164,255,121, -17,164,255,121,17,164,255,121,17,164,255,0,56,121,17,164,0,1,121,17, -164,255,121,17,164,255,13,4,17,0,1,13,4,17,0,1,13,4,17,0, -1,16,5,22,0,13,16,5,22,0,1,14,4,19,0,1,16,5,22,0, -41,16,5,22,0,1,14,4,19,0,1,16,5,22,0,57,16,5,22,0, -1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, -1,16,5,22,0,57,16,5,22,0,1,14,4,19,0,1,16,5,22,0, -57,16,5,22,0,1,14,4,19,0,1,16,5,22,0,17,16,5,22,0, -1,14,4,19,0,1,16,5,22,0,25,16,5,22,0,1,14,4,19,0, -1,16,5,22,0,25,16,5,22,0,1,14,4,19,0,1,16,5,22,0, -57,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, -1,14,4,19,0,1,16,5,22,0,17,16,5,22,0,1,14,4,19,0, -1,16,5,22,0,41,16,5,22,0,1,14,4,19,0,1,16,5,22,0, -17,16,5,22,0,1,14,4,19,0,1,16,5,22,0,41,16,5,22,0, -1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, -1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, -49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, -1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, -1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, -49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, -1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, -1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, -17,16,5,22,0,1,14,4,19,0,1,16,5,22,0,17,16,5,22,0, -1,14,4,19,0,1,16,5,22,0,41,16,5,22,0,1,14,4,19,0, -1,16,5,22,0,41,16,5,22,0,1,14,4,19,0,1,16,5,22,0, -41,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, -1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, -1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, -49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, -1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, -1,16,5,22,0,41,16,5,22,0,1,14,4,19,0,1,16,5,22,0, -41,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, -1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, -1,16,5,22,0,17,16,5,22,0,1,14,4,19,0,1,16,5,22,0, -49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, -1,14,4,19,0,1,16,5,22,0,41,16,5,22,0,1,14,4,19,0, -1,16,5,22,0,57,16,5,22,0,1,14,4,19,0,1,16,5,22,0, -49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, -1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, -1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, -49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, -1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, -1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, -49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,57,16,5,22,0, -1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, -1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, -49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,25,16,5,22,0, -1,14,4,19,0,1,16,5,22,0,41,16,5,22,0,1,14,4,19,0, -1,16,5,22,0,25,16,5,22,0,1,14,4,19,0,1,16,5,22,0, -41,16,5,22,0,1,14,4,19,0,1,16,5,22,0,41,16,5,22,0, -1,14,4,19,0,1,16,5,22,0,17,16,5,22,0,1,14,4,19,0, -1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, -49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, -1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, -1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, -33,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, -1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, -1,16,5,22,0,17,16,5,22,0,1,14,4,19,0,1,16,5,22,0, -33,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, -1,14,4,19,0,1,16,5,22,0,17,16,5,22,0,1,14,4,19,0, -1,16,5,22,0,57,16,5,22,0,1,14,4,19,0,1,16,5,22,0, -49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, -1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, -1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, -49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,49,16,5,22,0, -1,14,4,19,0,1,16,5,22,0,33,16,5,22,0,1,14,4,19,0, -1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, -49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,57,16,5,22,0, -1,14,4,19,0,1,16,5,22,0,49,16,5,22,0,1,14,4,19,0, -1,16,5,22,0,49,16,5,22,0,1,14,4,19,0,1,16,5,22,0, -49,16,5,22,0,1,14,4,19,0,1,16,5,22,0,33,16,5,22,0, -1,14,4,19,0,1,16,5,22,0,17,16,5,22,0,1,14,4,19,0, -1,16,5,22,0,33,16,5,22,0,1,14,4,19,0,1,13,4,17,0, -1,13,4,17,0,1,16,5,22,0,61,16,5,22,0,1,14,4,19,0, -255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0, -255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0, -25,8,6,3,57,10,8,5,85,9,7,4,76,0,12,8,6,3,54,9, -8,4,96,9,7,4,85,0,12,8,6,3,57,9,8,4,96,9,7,4, -85,0,24,8,6,3,57,11,8,4,85,9,7,4,79,0,12,8,6,3, -51,10,8,5,85,8,6,3,85,0,40,8,6,3,57,11,8,4,85,8, -6,3,85,0,32,8,6,3,57,10,8,5,85,9,7,4,85,0,28,5, -4,2,14,8,6,3,85,9,7,4,85,0,24,8,6,3,74,9,7,4, -113,8,6,3,167,8,6,3,139,9,7,4,85,5,4,2,14,0,36,8, -6,3,57,9,8,4,110,9,7,4,85,0,24,5,4,2,20,9,7,4, -85,9,8,4,85,0,16,9,8,4,57,9,8,4,85,6,5,3,48,0, -255,0,29,5,4,2,17,8,6,3,85,9,7,4,82,0,20,5,4,2, -3,8,6,3,85,9,7,4,93,8,6,3,153,8,6,3,161,8,6,3, -110,9,8,4,85,8,6,3,85,6,5,3,31,0,32,5,4,2,3,8, -6,3,85,10,8,5,85,10,7,5,85,0,36,5,4,2,57,8,6,3, -85,9,7,4,91,8,6,3,153,8,6,3,170,8,6,3,164,8,6,3, -108,8,6,3,85,6,5,3,71,0,24,5,4,2,42,8,6,3,85,9, -7,4,91,8,6,3,153,8,6,3,170,8,6,3,164,8,6,3,108,8, -6,3,85,6,5,3,71,0,48,5,4,2,3,8,6,3,85,9,8,4, -85,9,7,4,74,0,16,8,6,3,42,9,7,4,85,8,6,3,85,9, -7,4,85,8,6,3,125,8,6,3,170,7,6,4,170,9,7,4,170,12, -9,7,170,19,14,10,170,19,13,10,142,8,6,5,28,0,16,5,4,2, -51,8,6,3,85,9,7,4,91,8,6,3,153,8,6,3,170,8,6,3, -164,8,6,3,108,8,6,3,85,6,5,3,71,0,20,10,8,5,57,9, -7,4,170,8,6,3,170,8,6,3,170,8,6,3,161,8,6,3,142,9, -7,4,96,9,7,4,85,8,6,3,85,9,7,4,85,9,7,4,74,0, -20,5,4,2,42,8,6,3,85,9,7,4,91,8,6,3,153,8,6,3, -170,8,6,3,164,8,6,3,108,8,6,3,85,6,5,3,76,0,24,8, -6,5,82,10,8,7,133,12,9,7,170,15,11,8,170,15,11,8,170,15, -11,8,170,13,10,8,170,10,8,7,161,10,8,7,85,6,5,5,28,0, -96,8,6,3,74,9,8,4,85,8,6,3,57,0,68,7,6,4,28,9, -7,4,85,9,7,4,85,5,4,2,17,0,40,5,4,2,42,8,6,3, -85,9,7,4,91,8,6,3,153,8,6,3,170,8,6,3,164,8,6,3, -108,8,6,3,85,6,5,3,85,0,24,8,6,5,85,10,8,7,133,12, -9,7,170,15,10,8,170,15,11,8,170,15,11,8,170,13,10,8,170,10, -8,7,150,8,6,5,62,0,24,8,6,5,82,10,8,7,133,12,9,7, -170,15,10,8,170,14,10,7,170,9,7,4,170,8,6,5,147,10,8,5, -85,7,6,4,85,5,4,4,3,0,16,12,9,7,57,11,8,6,161,9, -7,6,170,10,8,7,170,13,10,8,170,14,10,7,170,13,10,8,170,12, -9,7,170,10,8,7,156,10,8,7,85,6,5,5,25,0,20,6,5,3, -57,8,7,5,85,9,7,4,110,9,7,4,170,10,8,5,170,10,8,5, -170,11,8,6,170,10,8,7,150,10,8,7,85,6,5,5,25,0,16,15, -11,8,57,11,8,6,170,9,7,6,170,10,8,7,170,13,10,8,170,15, -11,8,170,15,11,8,170,13,10,8,170,10,8,7,159,10,8,7,85,6, -5,5,25,0,16,15,11,8,59,11,9,6,170,9,7,4,125,10,8,5, -85,8,6,3,133,8,6,3,167,8,6,3,170,8,6,3,170,9,8,4, -113,0,16,8,6,3,42,10,8,5,85,10,7,5,85,9,7,4,125,10, -8,5,170,12,10,7,170,14,11,7,170,19,14,10,170,19,14,10,142,8, -6,5,28,0,16,8,6,5,82,10,8,7,133,12,9,7,170,15,11,8, -170,15,11,8,170,15,11,8,170,13,10,8,170,10,8,7,161,10,8,7, -85,6,5,5,25,0,16,12,10,7,74,14,10,7,170,12,9,7,139,7, -6,4,28,0,16,10,8,7,110,14,10,7,170,13,10,8,125,0,16,13, -10,8,71,15,11,8,170,13,10,8,130,5,5,4,8,0,44,11,8,6, -85,9,7,4,170,10,8,5,93,0,16,12,9,7,57,10,8,5,167,11, -8,6,110,6,5,3,8,0,16,11,8,6,57,10,7,5,159,11,8,6, -102,0,16,8,6,3,51,10,8,5,85,9,7,4,85,0,40,10,7,5, -57,11,9,6,85,7,6,4,57,0,28,7,5,4,28,10,8,5,85,11, -8,6,85,0,16,8,6,3,48,10,8,5,85,8,6,3,85,0,20,8, -6,3,57,11,8,4,85,9,7,4,79,0,20,5,4,2,45,8,6,3, -85,9,7,4,85,9,7,4,88,9,7,4,108,9,8,4,93,9,7,4, -85,8,6,3,85,6,5,3,74,0,20,8,6,3,45,9,7,4,85,8, -6,3,85,9,7,4,85,8,6,3,125,8,6,3,170,8,6,3,164,8, -6,3,108,8,6,3,85,6,5,3,74,0,24,6,5,3,57,8,7,5, -85,10,8,5,85,9,7,4,119,8,6,3,142,9,7,4,130,10,8,5, -91,10,7,5,85,6,5,3,85,0,20,9,7,4,57,10,8,5,85,10, -7,5,85,10,8,5,85,8,6,3,144,8,6,3,170,8,6,3,164,8, -6,3,108,8,6,3,85,6,5,3,71,0,24,5,4,2,45,8,6,3, -85,9,7,4,91,8,6,3,153,8,6,3,170,8,6,3,164,9,7,4, -105,8,6,3,85,6,5,3,74,0,20,11,8,4,59,9,7,4,170,8, -6,3,164,9,7,4,91,8,6,3,85,8,6,3,85,8,6,3,85,9, -7,4,85,8,6,3,142,9,6,4,170,9,8,4,116,0,16,8,6,3, -48,10,8,5,85,9,7,4,85,0,20,8,6,3,57,11,8,4,85,9, -7,4,76,0,16,8,6,3,48,10,8,5,85,9,7,4,85,0,20,8, -6,3,57,11,8,4,85,9,7,4,76,0,16,8,6,3,48,10,8,5, -85,9,7,4,85,0,28,8,6,3,57,11,8,4,85,9,7,4,76,0, -16,8,6,3,54,9,8,4,96,9,7,4,85,0,20,8,6,3,57,9, -8,4,96,9,7,4,85,0,16,10,8,5,57,10,7,5,153,10,8,5, -93,0,20,10,8,7,93,14,11,7,170,13,10,8,136,0,16,11,8,6, -91,11,8,6,170,9,7,4,170,9,7,4,170,8,6,5,170,8,6,3, -119,9,7,4,85,8,6,3,85,8,6,3,85,9,7,4,85,9,7,4, -76,0,16,8,6,3,42,9,7,4,85,8,6,3,85,8,6,3,122,9, -8,4,102,0,16,8,6,3,51,9,7,4,85,6,5,3,45,0,40,12, -8,5,57,8,6,3,156,10,7,5,93,11,8,6,85,11,8,6,85,0, -28,6,5,5,14,13,10,8,85,8,7,5,45,0,80,10,8,5,57,10, -7,5,156,10,8,5,96,0,76,9,7,4,57,10,8,5,93,10,8,5, -85,0,140,10,8,7,110,13,10,8,170,12,9,7,133,5,5,4,6,0, -84,8,6,5,79,10,8,7,127,13,10,8,170,16,12,9,142,8,7,5, -28,0,72,8,6,3,57,10,8,5,85,9,6,4,85,0,48,15,11,8, -113,25,18,12,170,20,15,11,142,8,7,5,28,0,28,15,11,8,130,22, -16,11,170,20,15,11,142,7,6,6,23,0,12,13,10,8,68,12,9,7, -170,11,8,6,116,6,5,3,8,0,44,12,9,7,82,15,10,8,170,13, -10,8,130,5,5,4,8,0,255,0,197,6,5,3,57,8,6,3,85,0, -255,0,149,5,4,2,6,8,6,3,85,8,6,3,156,9,8,4,113,0, -16,8,6,3,48,9,8,4,91,9,7,4,76,0,16,10,8,5,57,9, -6,4,170,8,6,3,99,5,4,2,34,0,36,8,6,3,71,9,8,4, -93,9,8,4,96,8,6,3,85,6,5,3,45,0,12,8,6,3,76,0, -44,8,6,3,57,58,31,9,255,93,50,12,255,88,45,11,255,12,10,5, -113,0,4,7,6,4,28,54,29,9,255,93,46,12,255,88,45,11,255,12, -9,5,122,0,4,7,5,4,37,54,29,9,255,93,46,12,255,88,45,11, -255,14,10,5,142,0,16,8,6,3,85,58,31,9,255,93,50,12,255,88, -44,11,255,9,7,4,170,0,4,5,4,2,85,52,28,9,255,93,48,12, -255,88,44,11,255,12,10,5,170,0,32,7,6,4,85,58,31,9,255,93, -50,12,255,88,45,11,255,12,9,5,170,0,24,8,6,3,57,58,31,9, -255,93,50,12,255,88,45,11,255,14,10,5,142,0,20,6,5,3,28,19, -12,6,227,76,37,11,255,88,45,11,255,14,10,5,139,0,16,9,8,4, -170,69,35,10,255,92,47,11,255,92,47,11,255,88,45,11,255,88,45,11, -255,16,11,5,227,7,5,4,28,0,28,8,6,3,57,58,31,9,255,93, -46,12,255,88,45,11,255,14,10,5,142,0,16,6,5,3,28,19,12,6, -227,82,39,11,255,92,47,11,255,14,10,5,105,0,8,7,5,4,20,54, -29,9,255,100,50,13,255,30,19,7,255,8,6,3,85,0,255,0,21,6, -5,3,28,19,12,6,227,76,37,11,255,88,45,11,255,14,10,5,130,0, -12,7,6,4,65,17,11,6,227,71,37,10,255,88,45,11,255,92,47,11, -255,92,47,11,255,88,45,11,255,88,44,11,255,88,44,11,255,25,16,6, -255,8,6,3,142,0,24,7,5,4,85,17,12,6,229,77,39,12,255,107, -51,14,255,113,55,16,255,20,14,9,178,0,28,14,11,7,170,29,18,8, -255,74,39,11,255,88,45,11,255,88,45,11,255,92,47,11,255,92,47,11, -255,88,45,11,255,88,44,11,255,41,23,8,255,12,9,5,227,5,5,4, -23,0,12,9,7,4,170,26,17,6,255,74,39,11,255,88,45,11,255,88, -45,11,255,92,47,11,255,92,47,11,255,88,45,11,255,88,44,11,255,41, -24,8,255,12,9,5,227,6,5,3,28,0,36,6,5,3,85,16,11,5, -227,71,37,10,255,88,45,11,255,88,44,11,255,12,10,5,113,0,8,8, -6,3,28,54,29,9,255,92,47,11,255,88,44,11,255,88,45,11,255,92, -46,13,255,100,52,13,255,109,53,16,255,121,63,20,255,158,74,23,255,180, -88,27,255,183,90,28,255,26,17,11,142,0,12,10,7,5,170,26,17,6, -255,74,39,11,255,88,45,11,255,92,47,11,255,92,47,11,255,92,47,11, -255,88,45,11,255,88,45,11,255,41,24,8,255,12,9,5,227,6,5,3, -28,0,8,7,6,4,8,61,32,10,255,102,51,13,255,92,46,13,255,92, -46,13,255,92,46,13,255,92,46,13,255,92,46,13,255,90,45,11,255,84, -44,11,255,88,45,11,255,88,44,11,255,14,10,5,119,0,12,9,7,4, -153,26,17,6,255,74,39,11,255,88,45,11,255,92,47,11,255,92,47,11, -255,92,47,11,255,88,45,11,255,88,44,11,255,45,25,8,255,13,10,6, -227,7,6,4,28,0,12,17,13,10,170,64,39,21,255,155,78,26,255,169, -83,26,255,165,80,24,255,161,79,24,255,145,71,22,255,136,70,21,255,134, -69,21,255,88,50,23,255,22,17,11,232,9,8,6,31,0,84,4,4,3, -23,12,9,5,173,71,34,10,255,92,43,13,255,33,20,8,255,10,8,5, -57,0,64,20,14,7,227,83,42,12,255,92,46,13,255,19,13,6,227,6, -5,3,34,0,32,10,8,5,170,26,17,6,255,76,37,11,255,90,46,11, -255,92,46,13,255,92,46,13,255,90,45,11,255,90,45,11,255,88,44,11, -255,46,26,9,255,18,13,9,227,8,7,5,28,0,12,15,12,8,170,58, -35,19,255,134,73,23,255,153,76,24,255,142,69,21,255,131,64,20,255,121, -59,18,255,121,59,18,255,121,62,18,255,43,27,12,255,11,9,6,170,0, -16,17,13,10,170,64,39,21,255,164,85,27,255,177,86,26,255,154,75,23, -255,121,62,18,255,115,56,16,255,119,61,18,255,123,61,20,255,80,45,19, -255,22,16,11,227,8,7,5,28,0,8,13,10,8,57,96,48,19,255,165, -80,24,255,159,78,24,255,159,78,24,255,165,80,24,255,165,80,24,255,165, -80,24,255,159,78,24,255,164,81,25,255,91,52,24,255,22,17,11,227,8, -7,5,28,0,12,13,10,8,170,38,24,11,255,99,47,16,255,116,59,17, -255,126,65,21,255,142,69,21,255,153,76,24,255,157,74,24,255,155,76,24, -255,91,52,24,255,23,18,12,227,8,7,5,28,0,8,13,10,8,57,104, -52,21,255,171,84,26,255,155,76,24,255,164,81,25,255,173,81,26,255,180, -88,27,255,180,88,27,255,177,86,26,255,169,80,26,255,92,55,25,255,22, -17,11,227,8,7,5,28,0,8,13,10,8,57,114,63,25,255,177,86,26, -255,114,56,17,255,92,46,13,255,92,47,11,255,93,46,12,255,92,46,13, -255,96,48,13,255,92,46,13,255,18,12,5,91,0,8,8,6,3,40,55, -29,10,255,108,50,15,255,114,56,17,255,130,67,21,255,153,76,24,255,161, -82,24,255,171,84,26,255,179,84,26,255,179,84,26,255,25,17,10,142,0, -12,15,12,8,170,64,39,21,255,162,84,27,255,179,88,28,255,183,90,28, -255,181,89,28,255,181,89,28,255,172,88,27,255,156,77,25,255,88,50,23, -255,22,17,11,227,8,7,5,28,0,8,13,9,6,57,96,48,19,255,153, -71,22,255,134,69,21,255,20,14,9,193,0,12,11,8,6,113,124,62,25, -255,185,91,28,255,169,80,26,255,22,15,9,142,0,8,11,8,6,57,111, -61,24,255,184,90,27,255,177,86,26,255,23,16,10,173,0,40,11,8,6, -113,114,59,23,255,144,73,21,255,126,63,21,255,20,14,9,142,0,8,11, -9,6,57,97,51,20,255,152,71,23,255,134,69,21,255,20,14,9,187,0, -12,12,9,7,96,97,48,18,255,140,71,21,255,138,71,21,255,20,15,9, -142,0,8,8,6,3,40,52,28,9,255,93,50,12,255,88,45,11,255,14, -10,5,142,0,32,13,10,8,82,91,48,16,255,132,71,21,255,63,36,18, -255,10,8,7,136,0,20,7,6,6,62,31,21,12,244,124,66,23,255,134, -69,21,255,20,15,9,142,0,8,8,6,3,28,54,29,9,255,93,46,12, -255,80,39,11,255,14,10,5,142,0,12,8,6,3,57,58,31,9,255,93, -50,12,255,88,44,11,255,14,10,5,116,0,12,9,7,4,153,26,17,6, -255,74,39,11,255,88,45,11,255,88,45,11,255,88,45,11,255,88,45,11, -255,88,44,11,255,88,44,11,255,41,23,8,255,12,9,5,227,5,4,4, -17,0,8,8,6,3,34,54,29,9,255,92,43,11,255,88,44,11,255,88, -45,11,255,92,43,11,255,92,47,11,255,92,47,11,255,88,45,11,255,88, -44,11,255,45,25,8,255,12,10,5,227,6,5,3,28,0,12,13,10,6, -170,40,24,11,255,97,48,16,255,113,55,16,255,115,56,16,255,116,57,17, -255,116,57,17,255,113,55,16,255,113,55,16,255,60,33,13,255,18,14,9, -227,8,6,5,28,0,8,12,9,7,57,77,38,14,255,118,57,17,255,116, -59,17,255,118,60,17,255,109,53,16,255,98,47,13,255,92,47,11,255,88, -45,11,255,88,44,11,255,41,23,8,255,12,9,5,227,6,5,3,28,0, -12,10,8,5,170,28,18,7,255,76,37,11,255,90,45,11,255,92,46,13, -255,94,45,13,255,94,45,13,255,92,46,13,255,92,46,13,255,46,26,9, -255,13,10,6,227,6,5,5,28,0,8,7,6,4,8,61,32,10,255,100, -50,13,255,92,46,13,255,92,46,13,255,92,46,13,255,92,46,13,255,92, -46,13,255,92,46,13,255,94,47,13,255,98,49,13,255,94,47,13,255,18, -12,5,93,0,8,8,6,3,42,60,32,9,255,96,48,13,255,88,45,11, -255,14,10,5,142,0,12,8,6,3,57,58,31,9,255,93,50,12,255,88, -44,11,255,12,10,5,113,0,8,8,6,3,28,54,29,9,255,93,50,12, -255,88,44,11,255,14,10,5,142,0,12,8,6,3,57,58,31,9,255,93, -50,12,255,88,44,11,255,12,10,5,113,0,8,8,6,3,28,54,29,9, -255,93,50,12,255,88,44,11,255,14,10,5,142,0,20,8,6,3,57,58, -31,9,255,93,50,12,255,88,44,11,255,12,10,5,113,0,8,7,6,4, -28,54,29,9,255,93,50,12,255,88,45,11,255,14,10,5,142,0,12,8, -7,3,57,60,31,9,255,96,48,13,255,92,46,13,255,14,10,5,127,0, -8,10,8,5,57,82,42,15,255,135,66,20,255,121,60,20,255,20,15,9, -176,0,12,11,9,6,108,107,56,22,255,172,84,25,255,158,74,23,255,22, -15,9,142,0,8,11,8,6,54,98,51,19,255,142,72,21,255,136,70,21, -255,138,71,21,255,121,59,18,255,100,52,13,255,90,46,11,255,88,44,11, -255,88,44,11,255,88,44,11,255,88,45,11,255,12,10,5,113,0,8,8, -6,3,28,54,29,9,255,92,47,11,255,88,44,11,255,92,47,11,255,92, -47,11,255,18,12,5,85,0,8,7,6,4,45,54,30,9,255,94,47,13, -255,31,20,8,255,9,7,4,85,0,32,8,6,3,48,65,33,10,255,114, -55,15,255,119,58,18,255,126,63,21,255,128,66,21,255,22,15,9,164,0, -20,5,5,4,28,19,14,10,227,141,72,26,255,43,27,16,255,7,6,6, -85,0,72,14,10,7,71,96,49,17,255,138,71,21,255,130,67,21,255,22, -15,9,164,0,68,12,9,7,76,77,39,14,255,118,57,17,255,109,53,16, -255,22,15,9,153,0,132,11,8,6,96,103,53,20,255,144,73,21,255,121, -60,20,255,24,16,9,153,0,80,15,12,8,184,61,36,20,255,141,68,24, -255,168,82,25,255,171,84,26,255,26,18,11,159,0,68,9,7,4,57,60, -32,9,255,96,48,13,255,92,46,13,255,19,12,6,142,0,40,14,10,7, -76,129,67,26,255,190,97,29,255,180,88,27,255,26,17,11,161,0,24,14, -10,7,85,129,67,26,255,190,97,29,255,180,88,27,255,25,17,10,125,0, -8,11,8,6,57,109,60,24,255,175,86,26,255,142,73,23,255,20,14,9, -187,0,40,12,9,7,93,121,65,24,255,183,89,26,255,168,82,25,255,21, -15,10,178,0,255,0,193,10,8,5,170,39,23,8,255,78,41,11,255,16, -11,5,142,0,255,0,141,6,5,3,85,16,11,5,227,71,37,10,255,92, -47,11,255,92,47,11,255,18,12,5,85,0,8,8,6,3,28,54,29,9, -255,93,46,12,255,88,45,11,255,12,10,5,113,0,12,58,31,9,255,93, -50,12,255,88,45,11,255,25,17,6,255,8,6,3,142,0,24,4,4,3, -25,10,8,5,173,65,33,10,255,92,46,13,255,92,46,13,255,67,34,10, -255,27,18,8,255,9,7,4,156,3,3,2,85,10,8,5,184,69,35,10, -255,19,13,6,147,0,40,9,7,4,113,112,55,13,255,141,69,16,255,141, -75,16,255,18,13,5,170,0,4,8,6,3,85,110,54,13,255,143,76,16, -255,139,68,16,255,19,13,6,170,0,4,8,6,3,85,110,54,13,255,143, -76,16,255,141,72,16,255,23,15,6,170,0,12,10,9,5,110,35,21,8, -255,129,63,14,255,141,69,16,255,139,68,16,255,52,27,9,255,9,7,4, -255,27,17,8,255,135,66,16,255,154,75,17,255,155,79,18,255,91,50,16, -255,20,15,9,207,10,9,7,28,0,16,5,4,4,20,8,6,3,127,31, -20,8,255,130,66,15,255,143,76,16,255,143,76,16,255,67,34,10,255,10, -8,5,215,10,8,5,170,13,10,6,142,7,5,4,23,0,8,12,9,5, -85,115,59,14,255,149,72,16,255,143,76,16,255,18,12,5,235,0,16,7, -6,4,28,14,10,5,227,92,46,13,255,143,73,16,255,143,70,16,255,18, -13,5,170,0,12,14,10,5,170,53,28,10,255,114,56,13,255,56,29,9, -255,16,11,5,255,34,20,7,255,112,55,13,255,87,42,12,255,19,13,6, -235,8,7,5,40,0,24,10,8,5,85,114,56,13,255,143,70,16,255,141, -72,16,255,23,15,6,170,0,12,7,6,4,28,14,10,5,227,90,44,13, -255,112,57,13,255,47,26,8,255,11,8,4,57,0,12,25,16,6,227,96, -48,13,255,112,57,13,255,26,16,7,255,8,6,5,85,0,24,13,10,6, -85,8,7,5,57,0,20,6,5,3,28,15,11,6,85,9,7,4,28,0, -36,9,7,4,105,10,8,5,170,10,8,5,130,6,5,3,23,0,156,8, -6,3,136,77,39,12,255,143,73,16,255,139,74,16,255,18,12,5,170,0, -12,21,14,6,227,112,57,13,255,141,69,16,255,80,40,11,255,16,11,5, -255,14,10,5,227,18,13,5,255,72,35,11,255,136,69,15,255,130,66,15, -255,46,26,9,255,8,6,3,105,0,16,8,7,5,57,42,27,13,255,150, -79,21,255,184,94,21,255,195,99,22,255,199,106,24,255,26,18,11,255,0, -24,10,8,7,99,83,45,18,255,144,74,17,255,143,70,16,255,94,47,13, -255,18,13,5,255,16,11,5,173,14,10,5,227,52,27,9,255,132,67,15, -255,139,68,16,255,75,39,12,255,10,7,5,116,0,8,6,5,3,57,52, -27,9,255,137,73,16,255,143,76,16,255,94,47,13,255,18,13,5,255,16, -11,5,173,14,10,5,227,52,27,9,255,132,67,15,255,139,74,16,255,75, -39,12,255,10,8,5,142,0,32,8,6,5,85,22,15,7,255,102,51,13, -255,137,67,16,255,140,71,15,255,141,75,16,255,20,13,5,170,0,8,9, -6,4,85,108,55,13,255,141,69,16,255,139,74,16,255,74,36,11,255,18, -12,7,255,20,13,7,181,22,15,9,207,20,13,9,238,18,13,9,252,23, -16,10,255,31,21,12,218,14,11,7,42,0,8,7,6,4,57,40,22,9, -255,130,66,15,255,141,75,16,255,84,42,11,255,18,12,5,255,16,12,5, -181,14,10,5,241,69,35,10,255,140,69,17,255,154,78,17,255,117,60,18, -255,17,13,8,142,0,12,21,14,8,190,28,18,9,255,23,15,8,255,21, -14,8,255,21,14,8,255,23,15,8,255,38,24,11,255,98,53,17,255,151, -74,18,255,150,76,17,255,141,75,16,255,21,15,6,170,0,8,5,4,2, -28,33,20,8,255,130,66,15,255,141,72,16,255,84,42,11,255,18,12,5, -255,18,12,5,176,14,10,5,235,57,29,10,255,140,72,17,255,165,85,20, -255,121,67,24,255,14,11,7,142,0,8,8,6,5,57,72,46,23,255,198, -113,29,255,200,102,23,255,131,68,22,255,33,21,12,255,17,13,8,255,21, -14,8,255,88,47,19,255,192,99,23,255,203,113,26,255,146,87,29,255,13, -11,8,164,0,12,10,8,5,85,13,10,6,170,11,9,6,142,7,6,4, -28,0,12,13,10,8,113,18,14,9,170,16,13,9,147,10,8,7,28,0, -24,10,8,7,28,20,15,11,227,104,62,21,255,184,94,21,255,117,62,22, -255,17,12,8,227,7,5,4,28,0,64,11,8,6,170,67,35,16,255,164, -85,21,255,115,58,16,255,20,14,7,252,8,6,5,85,0,24,9,7,4, -82,66,37,13,255,145,75,18,255,154,78,17,255,115,58,16,255,29,18,8, -255,14,10,7,255,16,11,7,255,65,34,12,255,150,74,19,255,189,97,22, -255,138,79,27,255,14,12,9,142,0,8,7,6,6,57,55,33,16,255,158, -81,19,255,162,80,19,255,102,53,17,255,24,15,7,255,19,12,6,170,14, -10,5,204,46,26,9,255,137,67,16,255,139,71,16,255,49,27,10,255,7, -6,4,105,0,8,7,6,6,62,72,46,23,255,199,115,32,255,205,111,28, -255,155,84,26,255,41,24,14,255,18,13,9,255,25,16,10,255,110,61,25, -255,199,100,28,255,205,112,30,255,146,87,29,255,13,11,8,142,0,8,10, -8,7,147,180,87,25,255,206,111,27,255,203,105,26,255,164,85,27,255,40, -24,15,255,20,14,9,255,26,17,11,255,121,64,26,255,201,101,28,255,205, -112,30,255,146,87,29,255,14,11,7,142,0,8,8,6,5,57,71,44,22, -255,192,108,25,255,198,101,23,255,150,78,25,255,41,24,14,255,32,21,13, -255,74,41,21,255,184,105,27,255,202,104,25,255,202,118,27,255,174,102,31, -255,17,14,10,142,0,8,11,9,6,136,182,92,25,255,206,112,29,255,205, -111,28,255,166,79,27,255,43,25,16,255,21,15,10,255,29,19,12,255,116, -67,27,255,202,107,31,255,206,113,31,255,146,87,29,255,12,10,7,142,0, -8,11,8,6,144,185,93,26,255,202,103,23,255,157,77,18,255,83,42,12, -255,19,13,6,255,13,10,6,255,20,13,7,255,27,17,8,255,28,18,9, -227,10,8,5,45,0,8,11,9,6,142,139,73,20,255,198,96,21,255,199, -106,24,255,155,78,26,255,41,25,14,255,21,15,10,255,28,18,11,255,38, -24,15,255,40,24,15,227,14,10,7,62,0,8,8,7,5,57,65,41,20, -255,197,108,28,255,205,111,28,255,170,88,27,255,43,27,16,255,19,14,10, -255,29,19,12,255,123,66,24,255,181,84,20,255,170,87,19,255,114,60,17, -255,11,10,6,142,0,8,11,9,6,85,119,60,15,255,154,75,17,255,154, -78,17,255,18,13,7,255,0,12,13,10,8,170,191,102,30,255,209,118,30, -255,207,113,30,255,28,19,11,201,0,8,13,10,8,105,166,87,23,255,198, -101,23,255,198,97,23,255,26,18,11,255,0,40,13,10,8,170,189,100,28, -255,206,111,27,255,204,102,27,255,28,20,11,201,0,8,12,10,7,116,184, -93,27,255,206,107,27,255,203,113,26,255,23,17,10,255,0,8,6,5,5, -28,25,18,12,244,192,105,27,255,206,112,29,255,207,117,30,255,32,22,13, -170,0,8,11,9,6,88,112,57,13,255,143,70,16,255,141,69,16,255,17, -12,6,227,0,32,14,11,9,170,184,92,25,255,206,111,27,255,192,111,31, -255,49,33,18,255,10,8,7,122,0,12,7,7,6,59,22,16,11,232,167, -100,28,255,205,112,30,255,205,116,30,255,26,18,11,210,0,8,8,7,3, -85,110,54,13,255,141,69,16,255,141,75,16,255,25,16,6,255,5,4,4, -40,0,8,10,8,5,85,112,55,13,255,141,75,16,255,141,75,16,255,20, -13,5,170,0,8,5,4,2,28,33,20,8,255,130,66,15,255,141,72,16, -255,112,55,13,255,45,25,8,255,26,17,6,255,33,20,8,255,94,47,13, -255,141,69,16,255,144,71,17,255,80,40,13,255,9,7,4,125,0,8,10, -8,5,85,112,57,13,255,148,79,17,255,141,75,16,255,87,42,12,255,19, -13,6,255,14,10,5,215,15,10,6,255,60,31,11,255,143,71,18,255,160, -82,19,255,96,54,17,255,12,9,7,142,0,8,8,6,5,57,71,44,22, -255,192,100,25,255,199,106,24,255,185,93,26,255,91,50,22,255,58,33,17, -255,72,41,19,255,158,81,25,255,199,106,24,255,199,106,24,255,138,79,27, -255,13,11,8,142,0,8,10,8,7,147,166,87,23,255,203,108,24,255,202, -108,25,255,153,77,26,255,38,22,13,255,15,11,6,255,14,10,5,255,52, -28,9,255,132,70,15,255,141,75,16,255,80,41,13,255,10,8,5,139,0, -8,7,6,6,57,48,29,13,255,154,79,19,255,160,85,19,255,108,56,17, -255,30,18,9,255,16,11,7,255,24,15,9,255,96,51,17,255,167,86,20, -255,181,88,20,255,140,75,23,255,18,14,9,144,0,12,22,14,7,193,22, -13,7,255,20,13,7,255,78,40,15,255,165,81,20,255,177,90,20,255,177, -90,20,255,115,58,20,255,32,20,11,255,24,15,9,255,30,19,9,227,11, -8,6,54,0,8,11,9,6,142,139,68,20,255,166,78,19,255,144,71,17, -255,19,12,6,215,0,12,9,7,4,136,114,56,13,255,143,70,16,255,139, -68,16,255,19,13,6,170,0,8,10,7,5,85,112,55,13,255,143,70,16, -255,139,74,16,255,17,11,6,221,0,12,9,7,4,136,114,56,13,255,143, -70,16,255,141,75,16,255,20,13,5,170,0,8,9,6,4,85,110,54,13, -255,141,69,16,255,141,72,16,255,17,11,6,221,0,20,9,7,4,136,114, -56,13,255,143,73,16,255,139,74,16,255,19,13,6,170,0,8,8,6,3, -85,110,54,13,255,143,76,16,255,141,69,16,255,18,12,5,252,0,12,11, -9,6,170,131,69,18,255,170,87,19,255,168,86,19,255,28,19,9,170,0, -8,11,8,6,85,145,74,26,255,204,102,27,255,203,105,26,255,52,33,17, -255,6,5,5,57,0,8,17,14,10,227,190,107,25,255,204,113,25,255,174, -86,27,255,18,13,9,170,0,12,28,18,11,198,37,23,14,255,32,21,13, -255,21,15,10,255,20,14,9,255,38,23,11,255,87,44,12,255,137,70,16, -255,141,72,16,255,143,70,16,255,141,72,16,255,18,12,5,170,0,8,9, -6,4,85,110,54,13,255,145,74,16,255,141,69,16,255,94,47,13,255,27, -17,8,227,12,8,5,28,0,8,14,10,7,85,121,62,18,255,172,87,19, -255,139,69,18,255,20,15,9,227,0,36,21,14,8,227,117,61,24,255,199, -100,28,255,205,106,26,255,204,110,27,255,26,18,11,255,0,16,8,7,5, -28,20,15,11,227,135,73,22,255,192,97,21,255,165,83,22,255,33,22,12, -255,10,9,7,85,0,68,11,9,6,170,184,97,27,255,206,112,29,255,204, -110,27,255,28,19,11,255,0,68,14,11,7,170,179,93,24,255,202,103,23, -255,198,97,23,255,22,15,9,255,0,132,9,7,6,170,125,63,18,255,158, -77,17,255,146,75,17,255,17,12,6,255,0,76,8,6,5,76,72,46,23, -255,197,108,28,255,201,107,24,255,164,85,27,255,37,22,14,227,13,9,6, -48,0,68,12,9,7,170,138,67,19,255,170,79,19,255,168,86,19,255,20, -14,9,255,0,40,8,7,5,20,21,15,10,184,26,17,11,255,26,17,11, -215,12,9,7,74,0,24,8,7,5,20,21,15,10,184,26,17,11,255,31, -21,12,207,18,13,9,28,0,8,11,9,8,156,184,93,27,255,208,105,29, -255,205,111,28,255,28,19,11,255,0,40,14,11,7,170,184,92,25,255,203, -104,24,255,200,98,23,255,26,18,11,255,0,255,0,189,8,7,5,57,51, -29,12,255,152,75,19,255,162,86,19,255,19,13,8,246,0,255,0,137,6, -5,3,28,19,13,6,249,92,46,13,255,123,63,14,255,78,39,11,255,21, -15,6,227,9,8,4,28,0,8,9,8,4,85,110,59,13,255,141,69,16, -255,141,75,16,255,21,14,6,170,0,12,16,11,5,170,52,28,9,255,115, -59,14,255,116,60,15,255,43,26,10,255,9,7,6,125,0,16,8,7,5, -28,21,17,10,227,109,59,18,255,160,82,19,255,121,64,18,255,62,34,13, -255,94,53,17,255,149,78,20,255,102,54,19,255,32,22,11,255,72,39,15, -255,121,62,18,255,24,17,9,187,0,40,8,6,3,167,128,66,15,255,161, -85,17,255,159,81,18,255,24,15,7,178,0,4,6,5,3,37,48,28,11, -255,173,92,20,255,181,96,20,255,21,15,8,221,0,4,6,5,3,28,40, -24,9,255,143,74,18,255,158,80,17,255,21,15,6,181,0,8,10,8,5, -54,107,51,14,255,157,83,18,255,164,84,19,255,176,89,19,255,189,92,20, -255,191,98,22,255,190,106,23,255,197,110,26,255,203,108,24,255,203,117,24, -255,205,119,26,255,207,122,30,255,199,118,32,255,32,23,13,170,0,12,7, -6,4,85,22,15,7,232,113,54,14,255,146,75,17,255,158,80,17,255,154, -78,17,255,158,80,17,255,148,76,17,255,139,71,16,255,135,66,16,255,135, -66,16,255,21,14,6,136,0,8,10,8,5,85,128,66,15,255,161,85,17, -255,158,80,17,255,25,16,6,204,0,12,7,6,4,28,25,16,8,227,102, -50,15,255,148,76,17,255,142,73,17,255,84,45,13,255,10,8,5,113,0, -8,9,7,4,82,107,53,14,255,146,75,17,255,84,41,13,255,8,7,5, -198,3,2,2,23,5,4,4,136,38,23,9,255,136,70,17,255,140,72,17, -255,21,15,6,178,0,24,7,6,4,57,45,26,10,255,143,74,18,255,158, -80,17,255,26,17,6,170,0,12,24,16,7,227,115,58,16,255,148,76,17, -255,46,26,9,255,7,6,4,156,0,16,5,4,4,71,19,13,6,255,139, -71,16,255,140,72,17,255,43,26,10,255,9,8,4,85,0,16,14,10,5, -85,109,52,14,255,38,23,9,255,6,5,3,85,0,12,4,4,3,28,15, -12,6,227,115,56,16,255,29,19,8,170,0,32,13,10,6,113,122,64,21, -255,164,85,21,255,138,71,17,255,21,15,6,161,0,156,13,10,6,227,137, -67,16,255,154,75,17,255,84,45,13,255,10,8,5,116,0,8,9,7,4, -85,111,55,14,255,158,87,17,255,158,80,17,255,19,13,6,255,4,4,3, -28,0,4,3,3,2,113,17,12,6,255,139,71,16,255,161,85,17,255,146, -75,17,255,20,14,7,210,0,16,16,13,9,110,184,105,27,255,209,123,30, -255,210,124,31,255,208,123,31,255,207,122,30,255,27,20,12,255,0,24,13, -11,8,147,143,75,20,255,161,85,17,255,158,80,17,255,27,18,8,227,5, -4,2,28,0,8,10,7,5,198,131,65,16,255,161,85,17,255,150,76,17, -255,21,14,6,170,0,8,10,8,5,85,123,61,16,255,163,83,18,255,158, -80,17,255,27,18,8,227,5,4,2,28,0,8,9,7,4,198,130,66,15, -255,163,83,18,255,148,76,17,255,21,14,6,193,0,28,7,6,4,85,22, -15,7,255,131,65,16,255,154,78,17,255,154,78,17,255,154,78,17,255,154, -78,17,255,21,15,6,170,0,8,10,8,5,85,129,64,16,255,163,86,18, -255,180,91,19,255,29,20,10,255,3,3,2,93,0,36,10,8,5,122,121, -60,16,255,161,85,17,255,159,81,18,255,24,15,7,255,4,4,3,34,0, -4,2,2,1,6,17,13,8,181,181,93,22,255,203,108,24,255,205,114,26, -255,32,23,13,210,0,36,5,4,4,161,30,22,13,255,198,116,29,255,206, -106,25,255,191,96,20,255,26,17,7,170,0,8,9,7,4,85,116,60,15, -255,161,85,17,255,158,80,17,255,21,14,6,255,5,4,2,28,0,4,2, -2,1,3,12,9,7,215,190,107,25,255,211,124,30,255,208,134,37,255,32, -22,13,178,0,8,13,11,8,96,187,112,32,255,209,123,30,255,191,96,20, -255,28,19,9,255,4,3,3,74,0,4,3,2,2,28,13,10,8,227,196, -120,31,255,211,124,30,255,199,106,24,255,27,19,10,170,0,8,13,10,6, -57,114,61,19,255,178,91,21,255,182,102,23,255,23,17,10,173,0,8,11, -9,6,91,146,85,25,255,198,113,29,255,196,120,31,255,27,20,12,207,0, -20,5,5,4,28,21,17,12,227,190,118,33,255,209,131,40,255,161,100,34, -255,17,14,10,227,5,5,4,28,0,72,9,8,6,170,91,59,28,255,189, -94,24,255,162,83,19,255,39,25,12,255,7,7,6,85,0,20,13,11,8, -142,183,103,24,255,203,112,24,255,203,112,24,255,42,26,13,249,5,4,4, -62,0,4,3,2,2,25,12,9,7,227,195,115,30,255,212,127,35,255,211, -132,38,255,32,22,13,181,0,8,12,10,7,85,124,65,17,255,161,85,17, -255,159,78,18,255,21,14,6,255,5,4,2,28,0,8,7,6,4,224,133, -68,16,255,159,81,18,255,146,72,17,255,22,14,7,170,0,8,13,11,8, -91,185,111,32,255,210,125,33,255,205,114,26,255,37,26,14,255,4,4,3, -85,0,4,4,4,4,28,13,10,8,227,193,105,26,255,206,111,27,255,202, -118,27,255,32,22,13,170,0,8,11,9,6,127,174,91,23,255,202,102,21, -255,200,105,21,255,36,23,13,255,4,4,3,85,0,4,3,3,2,28,13, -11,8,227,198,118,33,255,212,127,35,255,208,128,33,255,31,22,12,181,0, -8,13,11,8,91,185,114,30,255,211,124,30,255,208,122,29,255,34,24,13, -255,4,4,3,85,0,4,7,6,6,113,32,24,13,255,185,95,22,255,202, -98,21,255,198,97,23,255,33,22,12,170,0,8,10,8,7,156,190,108,27, -255,212,126,33,255,211,127,36,255,40,26,15,255,4,4,3,85,0,4,3, -3,2,28,13,11,8,227,198,118,33,255,214,129,37,255,211,132,38,255,32, -23,13,173,0,8,10,8,7,144,167,87,22,255,185,94,20,255,165,87,18, -255,25,17,8,255,3,3,2,57,0,28,13,11,8,170,195,112,30,255,210, -125,33,255,208,117,29,255,39,26,14,255,4,4,3,85,0,28,12,10,7, -150,184,108,27,255,211,124,30,255,211,127,36,255,40,27,15,255,4,4,3, -85,0,4,3,3,2,28,17,13,8,178,138,71,17,255,161,85,17,255,155, -79,18,255,21,14,6,170,0,8,10,8,5,85,124,61,15,255,169,89,18, -255,180,91,19,255,25,18,10,255,0,12,13,11,8,170,196,113,31,255,211, -124,30,255,205,119,26,255,26,18,11,204,0,8,11,9,6,88,134,70,19, -255,173,87,18,255,168,86,19,255,20,13,7,255,0,40,13,11,8,170,196, -113,31,255,210,125,33,255,207,122,30,255,24,18,11,212,0,8,11,9,6, -119,180,93,23,255,203,108,24,255,202,103,23,255,20,15,9,255,0,8,15, -13,10,195,101,63,26,255,202,117,25,255,206,128,35,255,160,106,35,255,15, -13,10,142,0,8,10,8,5,147,139,70,20,255,191,96,20,255,200,105,21, -255,25,18,10,255,0,32,13,10,8,170,189,99,26,255,206,115,27,255,205, -106,26,255,185,106,28,255,79,52,26,255,10,9,7,122,0,4,7,6,6, -42,36,27,17,244,172,106,35,255,207,128,34,255,211,126,34,255,211,127,36, -255,24,18,11,227,0,8,10,8,5,85,124,64,15,255,159,81,18,255,158, -80,17,255,76,40,13,255,11,8,6,210,0,8,12,9,5,85,129,64,16, -255,161,85,17,255,158,80,17,255,26,16,7,170,0,8,9,7,4,85,115, -56,16,255,161,85,17,255,159,81,18,255,49,27,10,255,7,6,4,170,5, -4,4,85,6,5,3,113,26,19,11,255,185,95,22,255,202,102,21,255,197, -104,22,255,28,20,11,173,0,8,13,10,6,102,167,87,22,255,200,101,21, -255,201,102,22,255,32,21,11,255,4,3,3,65,0,4,2,2,1,17,12, -10,7,221,190,98,23,255,208,116,27,255,204,110,27,255,30,21,11,181,0, -8,13,11,8,91,185,114,30,255,211,124,30,255,209,123,30,255,86,55,25, -255,9,8,6,187,6,6,5,85,7,6,6,130,32,24,15,255,200,122,31, -255,209,123,30,255,206,122,31,255,32,23,13,173,0,8,10,8,7,144,191, -113,30,255,212,127,35,255,210,126,35,255,40,27,15,255,4,4,3,85,0, -4,2,2,1,8,11,9,6,212,157,81,20,255,189,92,20,255,190,97,21, -255,27,19,10,178,0,8,12,10,7,96,183,105,28,255,209,123,30,255,205, -114,26,255,36,24,13,255,4,4,3,85,0,4,4,4,4,28,18,14,9, -187,195,115,30,255,211,124,30,255,210,130,35,255,35,26,14,210,0,20,3, -2,2,28,12,10,7,227,195,115,30,255,211,124,30,255,209,123,30,255,38, -25,15,255,4,4,3,85,0,20,13,11,8,170,194,115,31,255,209,122,28, -255,196,99,21,255,21,15,8,255,0,12,11,9,6,170,153,79,20,255,187, -91,20,255,181,96,20,255,30,20,9,178,0,8,13,10,6,96,151,79,20, -255,187,91,20,255,181,96,20,255,22,16,9,255,0,12,12,9,7,170,146, -76,19,255,167,88,18,255,158,77,17,255,23,15,6,170,0,8,10,8,5, -85,133,66,16,255,167,88,18,255,168,86,19,255,22,16,9,255,0,20,12, -9,7,170,155,80,20,255,185,94,20,255,181,96,20,255,22,16,9,221,0, -8,6,6,5,42,51,29,12,255,150,81,19,255,165,87,18,255,42,26,11, -255,5,5,4,108,0,4,5,5,4,28,18,15,11,255,195,114,28,255,207, -123,32,255,158,94,31,255,17,13,10,142,0,8,6,5,5,57,50,34,19, -255,191,111,32,255,208,117,29,255,113,73,30,255,10,10,9,227,6,6,5, -125,7,7,6,198,42,29,17,255,187,96,22,255,166,87,23,255,42,27,15, -255,8,6,5,110,0,32,5,5,4,184,21,16,8,255,106,54,15,255,154, -78,17,255,151,77,18,255,92,48,15,255,11,9,6,119,0,8,10,8,5, -93,131,69,18,255,189,92,20,255,200,105,21,255,33,22,12,255,5,4,4, -54,0,12,9,8,6,85,76,53,25,255,200,118,31,255,204,114,27,255,65, -43,22,255,6,6,5,113,0,32,4,3,3,17,14,11,9,227,195,111,28, -255,206,115,27,255,204,105,25,255,24,17,11,255,0,12,5,5,4,28,13, -10,6,227,125,66,18,255,165,84,18,255,161,85,17,255,161,85,17,255,155, -79,18,255,28,19,9,255,6,5,3,85,0,64,11,9,8,68,86,56,27, -255,204,126,33,255,210,125,33,255,30,21,13,255,0,68,13,11,8,170,195, -115,30,255,209,123,30,255,207,122,30,255,27,19,12,255,3,3,2,28,0, -128,7,6,4,184,131,65,16,255,161,85,17,255,154,78,17,255,15,11,6, -249,0,76,10,8,7,173,166,87,23,255,198,104,21,255,196,99,21,255,35, -23,12,255,3,3,2,85,0,72,13,11,8,170,194,115,31,255,211,124,30, -255,207,122,30,255,27,19,12,255,3,3,2,28,0,108,13,11,8,170,196, -113,31,255,213,132,36,255,211,127,36,255,30,21,13,255,0,40,11,9,6, -170,155,80,20,255,185,94,20,255,180,91,19,255,21,15,8,255,0,255,0, -189,10,8,7,184,183,100,26,255,208,116,27,255,204,114,27,255,26,18,11, -255,4,4,4,28,0,255,0,133,10,8,5,127,119,60,15,255,160,85,19, -255,91,48,16,255,10,8,5,227,4,4,3,28,0,12,9,7,4,161,131, -67,16,255,159,81,18,255,159,78,18,255,18,13,7,249,0,16,7,6,4, -170,57,34,14,255,176,90,21,255,195,95,22,255,26,19,11,232,0,16,17, -14,10,99,179,106,28,255,207,122,30,255,180,109,33,255,25,20,12,255,7, -6,6,170,20,17,11,255,196,114,27,255,208,117,29,255,203,124,30,255,172, -106,35,255,53,36,20,255,10,9,7,108,0,40,9,8,6,170,159,82,20, -255,202,103,23,255,206,111,27,255,22,17,11,255,0,8,10,9,7,139,115, -74,30,255,213,133,48,255,39,28,16,255,0,8,9,8,4,113,67,39,14, -255,181,92,20,255,24,18,9,255,0,12,28,19,9,227,139,79,26,255,206, -117,31,255,212,123,37,255,214,126,41,255,172,106,35,255,53,34,18,255,122, -78,31,255,211,127,44,255,217,136,50,255,216,135,49,255,190,122,41,255,65, -43,22,255,14,11,7,85,0,8,7,6,4,28,29,21,10,249,153,79,20, -255,174,85,19,255,103,53,16,255,17,12,6,244,19,13,6,170,21,14,6, -170,27,17,6,170,21,14,6,212,21,14,6,255,25,17,6,224,12,9,5, -45,0,12,24,16,7,153,22,15,7,255,26,16,7,210,12,9,5,40,0, -8,8,7,5,28,17,13,8,227,114,61,19,255,174,85,19,255,154,79,19, -255,60,33,13,255,11,9,6,170,0,12,10,8,5,170,146,79,19,255,180, -87,19,255,67,39,14,255,8,6,5,85,0,8,24,17,9,255,143,75,20, -255,162,80,19,255,22,15,7,215,0,28,8,7,5,110,60,33,13,255,166, -78,19,255,22,15,7,227,0,8,7,6,4,85,91,51,16,255,174,88,19, -255,169,78,18,255,25,17,8,255,3,3,2,8,0,20,11,9,6,178,143, -74,18,255,177,89,18,255,138,75,19,255,18,13,7,176,0,16,9,7,4, -28,29,19,8,232,41,25,10,255,17,13,8,255,9,8,6,116,0,4,7, -6,4,59,14,11,7,227,32,21,9,255,40,24,9,255,12,9,5,105,0, -32,14,11,9,170,199,124,36,255,213,119,36,255,202,102,21,255,20,14,7, -246,0,152,8,7,5,142,53,31,12,255,162,86,19,255,121,64,18,255,19, -14,8,252,6,5,3,28,0,8,10,8,5,125,142,74,19,255,180,91,19, -255,183,89,19,255,19,14,8,255,0,4,5,5,4,6,15,13,10,193,69, -42,18,255,171,91,20,255,189,88,20,255,200,101,21,255,31,21,12,255,0, -16,10,8,7,28,30,21,13,227,150,92,35,255,208,121,37,255,211,115,30, -255,208,117,29,255,28,21,13,255,0,24,10,8,7,28,22,15,7,198,26, -17,7,255,24,15,7,221,9,7,4,57,0,12,8,7,5,156,171,89,22, -255,202,107,23,255,202,103,23,255,23,18,10,249,0,12,26,18,9,198,29, -19,8,255,24,16,7,215,10,8,5,51,0,12,10,8,5,85,134,70,19, -255,175,88,18,255,173,87,18,255,20,14,7,255,0,24,10,8,5,85,26, -19,9,255,107,58,18,255,154,83,19,255,168,79,19,255,169,78,18,255,173, -87,18,255,172,80,19,255,26,17,7,170,0,8,11,10,8,136,189,99,26, -255,210,115,31,255,216,129,45,255,143,96,40,255,15,13,10,227,12,12,11, -170,15,13,12,170,13,12,10,170,13,12,10,136,9,8,8,85,0,16,11, -9,6,170,169,91,22,255,202,103,23,255,203,108,24,255,18,15,9,255,0, -12,6,5,5,23,28,19,11,156,31,22,12,255,34,24,13,227,14,11,7, -85,0,36,9,8,8,142,72,54,31,255,215,147,60,255,218,146,61,255,174, -100,35,255,14,11,7,142,0,8,11,8,6,102,142,74,19,255,185,86,20, -255,195,98,20,255,18,14,9,249,0,12,10,8,7,170,202,131,47,255,220, -152,63,255,220,151,61,255,22,19,13,252,0,8,11,9,8,167,203,135,46, -255,217,139,48,255,210,120,33,255,18,14,9,255,0,12,9,8,6,170,198, -117,37,255,211,115,30,255,202,102,21,255,34,22,11,176,0,8,13,11,8, -170,202,122,37,255,218,144,49,255,217,144,50,255,28,21,13,255,0,8,12, -11,9,170,204,122,41,255,217,135,46,255,215,136,42,255,46,33,19,255,0, -16,10,9,7,28,21,19,14,227,153,104,46,255,214,149,55,255,158,103,39, -255,16,14,11,221,7,6,6,28,0,20,20,18,13,142,31,26,18,170,25, -21,16,170,24,20,15,170,24,20,15,170,24,20,15,170,24,21,15,170,31, -26,18,170,25,21,16,170,14,12,9,31,0,20,10,9,7,167,75,51,26, -255,202,117,33,255,186,120,43,255,41,32,20,255,12,11,9,85,0,16,11, -9,8,28,31,22,12,215,49,33,18,255,41,27,16,227,12,10,7,85,0, -12,14,12,9,170,204,137,51,255,220,152,63,255,220,151,61,255,23,19,12, -252,0,8,11,10,6,85,136,70,17,255,175,88,18,255,169,78,18,255,15, -11,6,255,0,8,9,8,6,85,26,19,9,255,153,82,18,255,177,89,18, -255,180,84,19,255,24,17,9,218,0,8,11,9,8,147,196,115,35,255,215, -125,38,255,214,125,39,255,20,16,11,255,0,12,9,8,6,159,165,86,22, -255,197,99,20,255,195,90,20,255,32,21,11,170,0,8,12,10,7,85,145, -76,20,255,189,92,20,255,191,96,20,255,18,14,9,255,0,12,9,8,6, -170,199,126,39,255,217,133,50,255,217,144,50,255,23,18,12,252,0,8,11, -10,8,142,191,105,28,255,206,111,27,255,203,104,24,255,19,15,10,255,0, -12,9,8,6,57,21,15,8,198,28,19,9,255,32,21,11,227,11,9,6, -76,0,8,11,9,8,170,203,125,42,255,220,146,59,255,219,146,60,255,24, -19,13,255,0,12,11,10,8,170,204,136,47,255,220,146,59,255,218,147,55, -255,25,19,12,232,0,8,11,10,8,119,161,87,22,255,195,98,20,255,202, -103,23,255,18,15,9,255,0,32,14,12,9,170,200,125,37,255,214,124,37, -255,205,106,26,255,20,16,9,221,0,32,16,13,9,170,205,130,42,255,219, -144,56,255,219,146,60,255,24,19,13,255,0,12,6,5,3,23,21,14,6, -170,26,16,7,255,26,17,7,224,14,10,5,31,0,8,11,9,6,125,170, -89,23,255,211,115,30,255,214,126,41,255,23,19,12,255,0,12,11,10,8, -170,195,112,30,255,206,106,25,255,200,105,21,255,29,20,10,170,0,8,11, -9,6,85,134,70,19,255,177,85,18,255,172,80,19,255,18,13,7,255,0, -40,14,12,9,170,195,112,30,255,206,111,27,255,202,103,23,255,31,22,10, -170,0,8,13,10,6,85,151,79,20,255,189,92,20,255,183,89,19,255,17, -13,8,255,0,4,8,7,5,59,57,34,16,255,184,97,27,255,198,115,33, -255,114,77,33,255,16,14,11,210,6,5,5,8,0,8,12,10,7,170,195, -113,32,255,215,123,42,255,217,133,50,255,32,24,15,255,0,32,12,11,7, -170,175,90,22,255,198,104,21,255,189,92,20,255,192,97,21,255,189,97,22, -255,45,29,14,255,10,9,7,210,22,17,11,255,183,102,30,255,212,121,41, -255,216,135,49,255,217,137,52,255,214,125,39,255,29,21,12,204,0,8,11, -9,6,85,143,75,20,255,193,97,20,255,195,98,20,255,180,93,23,255,88, -54,23,255,11,10,8,113,0,4,14,12,7,85,170,89,23,255,202,103,23, -255,202,102,21,255,32,22,11,178,0,8,12,10,7,113,176,91,23,255,205, -105,24,255,209,117,28,255,39,28,16,255,5,5,5,28,0,8,15,14,10, -198,206,132,45,255,217,133,50,255,215,133,44,255,25,19,12,232,0,8,11, -10,8,125,198,118,39,255,218,145,51,255,218,146,53,255,20,17,11,255,0, -12,9,8,6,170,198,124,37,255,216,134,45,255,214,139,41,255,22,18,11, -255,0,8,11,10,8,136,191,105,28,255,206,111,27,255,206,106,25,255,36, -26,15,255,5,5,4,28,0,8,15,13,10,198,192,105,27,255,206,106,25, -255,204,105,25,255,23,17,10,232,0,8,12,10,7,125,196,119,37,255,218, -141,51,255,218,139,55,255,20,16,11,255,0,12,9,8,6,170,196,110,33, -255,215,126,40,255,214,125,39,255,23,18,12,252,0,8,11,9,8,167,201, -123,40,255,217,133,50,255,214,136,43,255,20,16,11,255,0,12,6,5,5, -23,29,21,12,153,32,22,13,255,35,25,14,227,15,12,8,85,0,24,12, -10,9,170,198,124,37,255,215,125,38,255,213,124,38,255,23,18,12,255,0, -24,14,12,9,170,204,132,47,255,219,144,56,255,211,127,36,255,28,21,13, -255,0,12,14,12,9,170,198,117,37,255,215,123,42,255,214,125,39,255,25, -20,12,215,0,8,11,10,8,130,198,119,35,255,215,126,40,255,212,123,37, -255,30,22,13,255,0,12,14,12,9,170,196,114,33,255,206,106,25,255,200, -105,21,255,30,21,11,184,0,8,13,11,8,99,184,100,25,255,209,117,28, -255,210,115,31,255,28,21,13,255,0,20,14,12,9,170,198,117,37,255,215, -126,40,255,214,126,41,255,25,19,12,255,0,12,10,9,7,125,61,42,22, -255,190,107,33,255,153,98,38,255,29,23,16,255,13,12,10,255,17,15,10, -255,108,74,37,255,210,144,59,255,153,98,38,255,16,14,11,224,6,6,5, -17,0,12,15,13,8,227,115,67,24,255,197,100,22,255,150,81,25,255,32, -24,13,255,15,13,8,255,19,15,10,255,85,48,18,255,178,95,21,255,115, -65,20,255,15,12,8,255,5,5,4,34,0,32,10,9,7,198,69,46,22, -255,186,103,29,255,195,111,28,255,92,58,25,255,15,12,8,198,0,12,10, -9,7,170,194,112,31,255,215,125,38,255,218,146,53,255,24,19,13,255,0, -20,15,14,10,227,159,103,42,255,212,127,43,255,177,118,48,255,19,17,12, -227,6,6,5,28,0,32,11,10,8,170,182,98,23,255,202,106,21,255,195, -98,20,255,24,17,9,212,0,12,18,14,9,227,102,54,19,255,157,83,18, -255,85,46,14,255,19,13,6,255,47,27,10,255,150,81,19,255,131,67,20, -255,39,26,14,255,12,11,9,85,0,64,10,9,7,170,118,75,33,255,215, -141,54,255,44,33,19,255,0,16,9,9,8,108,19,17,12,170,27,23,16, -170,23,21,16,170,23,21,16,170,24,20,15,170,20,18,13,170,15,14,10, -170,10,9,7,113,7,6,6,28,0,12,12,11,9,170,189,99,26,255,209, -110,30,255,211,118,36,255,141,88,36,255,19,17,12,227,20,18,13,170,24, -20,15,170,21,19,14,170,16,14,11,170,10,9,7,113,6,6,5,28,0, -20,8,7,5,65,11,10,8,142,16,14,11,170,24,21,15,170,25,22,16, -170,23,21,16,170,21,19,14,170,16,14,11,170,11,10,8,113,7,7,6, -28,0,20,8,7,5,62,10,9,5,136,12,10,7,170,14,11,7,170,13, -10,6,170,11,9,6,198,31,21,10,255,153,82,18,255,177,85,18,255,169, -78,18,255,22,15,7,204,0,16,8,7,5,57,11,10,6,142,19,17,12, -170,23,21,16,170,25,22,16,170,23,21,16,170,21,19,14,170,15,14,10, -170,10,10,9,113,7,6,6,28,0,16,12,10,7,153,55,32,14,255,175, -93,20,255,185,94,20,255,183,89,19,255,80,44,17,255,13,11,8,187,7, -6,6,25,0,16,8,7,5,62,11,10,6,142,16,14,11,170,23,19,14, -170,25,22,16,170,23,21,16,170,19,17,12,170,15,14,10,170,17,15,10, -170,19,17,12,142,9,8,8,28,0,8,12,10,9,170,204,137,49,255,220, -146,59,255,218,146,53,255,141,91,38,255,19,17,12,227,19,17,12,170,24, -20,15,170,21,19,14,170,15,14,10,170,10,10,9,113,7,6,6,28,0, -16,12,10,7,57,14,12,7,102,14,11,7,85,0,32,12,10,7,57,13, -11,8,105,15,13,8,85,0,12,12,11,9,170,204,136,47,255,220,146,59, -255,218,153,59,255,24,19,13,255,0,12,8,7,5,82,11,10,6,156,11, -9,6,170,10,9,7,91,0,12,10,8,5,127,144,78,19,255,180,87,19, -255,174,81,19,255,24,15,7,210,0,12,14,11,7,68,12,10,7,170,12, -10,7,170,17,15,10,170,24,20,15,170,19,17,12,170,15,14,10,170,18, -15,11,170,24,21,15,170,21,19,14,170,15,14,10,170,11,10,8,113,7, -7,6,28,0,16,15,13,10,119,17,15,12,170,15,13,10,170,16,14,11, -170,19,17,12,170,21,18,12,170,18,15,11,170,15,13,8,170,11,9,6, -170,10,8,7,88,6,5,5,23,0,20,10,9,7,85,14,12,9,170,19, -17,12,170,21,19,14,170,21,19,14,170,21,19,14,170,19,17,12,170,15, -14,10,170,11,10,8,116,7,7,6,28,0,16,15,14,10,119,18,15,11, -170,15,14,10,170,18,15,11,170,21,19,14,170,25,22,16,170,23,21,16, -170,21,19,14,170,16,14,11,170,11,10,8,113,7,7,6,28,0,20,10, -9,7,85,14,12,9,170,19,17,12,170,20,18,13,170,20,18,13,170,23, -19,14,170,19,17,12,170,15,14,10,170,17,14,10,170,19,17,12,142,10, -9,7,28,0,12,15,13,10,113,18,15,11,170,15,14,10,170,18,15,11, -170,21,19,14,170,25,22,16,170,23,21,16,170,20,18,13,170,16,14,11, -170,11,10,8,113,7,7,6,28,0,20,7,7,6,82,11,10,6,142,16, -13,9,170,19,17,12,170,21,19,14,170,24,21,15,170,25,22,16,170,25, -22,16,170,15,13,10,170,12,11,9,57,0,16,15,13,10,170,97,65,34, -255,209,132,42,255,214,136,43,255,214,127,43,255,159,103,42,255,21,19,14, -227,11,10,8,28,0,12,16,14,11,113,21,19,14,170,18,15,11,153,11, -10,8,28,0,16,15,14,10,125,21,19,14,170,19,17,12,142,10,9,7, -28,0,12,15,14,10,113,21,19,14,170,18,16,11,153,11,10,8,28,0, -16,15,13,10,125,21,19,14,170,19,17,12,142,10,9,7,28,0,12,15, -14,10,113,21,19,14,170,18,16,11,153,11,10,8,28,0,24,15,14,10, -125,21,19,14,170,19,17,12,142,9,9,8,28,0,12,17,14,10,130,27, -24,16,170,21,19,14,142,10,9,7,28,0,16,16,14,11,113,28,24,17, -170,24,21,15,161,12,11,9,28,0,12,16,14,11,113,21,19,14,170,18, -15,11,153,11,10,8,28,0,16,15,13,10,125,21,19,14,170,19,17,12, -142,9,8,6,28,0,12,18,15,11,136,19,16,10,170,16,13,9,170,16, -14,9,170,15,13,8,170,13,11,8,170,12,11,9,170,13,12,8,170,15, -14,10,170,14,13,11,170,11,11,10,113,0,20,13,11,8,170,190,98,23, -255,204,116,31,255,74,52,27,255,9,8,8,113,0,16,13,11,8,170,192, -106,29,255,208,112,27,255,208,117,29,255,27,21,12,255,0,16,5,5,4, -28,27,23,16,255,199,121,44,255,214,139,41,255,31,23,14,255,0,16,13, -11,8,28,32,24,13,227,36,26,15,255,19,16,12,198,8,8,7,51,0, -4,8,8,7,57,29,21,12,218,48,32,17,255,45,30,16,255,20,16,11, -218,10,9,7,105,0,44,14,12,9,170,204,130,51,255,224,153,77,255,225, -169,88,255,33,27,18,255,0,12,21,19,14,215,217,163,86,255,61,46,28, -255,0,12,19,16,12,201,203,121,40,255,51,38,22,255,0,12,4,4,3, -25,16,14,11,227,212,147,71,255,224,160,77,255,223,161,80,255,31,25,16, -255,4,4,4,102,10,10,9,215,206,133,55,255,223,156,70,255,224,164,85, -255,51,39,24,255,5,5,4,82,0,12,15,12,8,110,178,98,27,255,211, -115,30,255,211,121,34,255,36,26,15,255,3,3,2,85,0,60,8,8,5, -28,27,20,10,232,125,73,22,255,190,97,21,255,180,92,21,255,97,56,20, -255,14,11,7,170,0,16,12,10,7,142,165,89,22,255,198,104,21,255,84, -50,19,255,7,6,4,159,0,4,5,5,4,82,32,23,11,255,121,69,22, -255,97,56,20,255,15,13,8,142,0,32,14,12,7,198,172,92,21,255,28, -19,9,207,0,8,11,10,6,85,148,78,21,255,198,104,21,255,192,97,21, -255,21,15,8,255,0,24,10,9,5,170,167,90,22,255,202,93,21,255,202, -103,23,255,21,16,10,255,0,20,4,3,3,133,20,16,9,255,151,80,22, -255,75,42,16,255,10,8,7,255,32,22,11,255,164,86,23,255,60,39,17, -255,5,5,4,252,0,36,12,11,9,198,213,155,80,255,224,166,83,255,211, -121,34,255,20,16,9,255,3,3,2,28,0,144,6,6,5,51,27,20,10, -255,160,84,23,255,198,104,21,255,67,40,16,255,8,7,5,125,0,12,12, -10,9,170,195,112,30,255,215,125,38,255,217,133,50,255,49,35,22,255,5, -5,4,133,13,12,10,210,189,119,50,255,211,127,44,255,212,121,41,255,218, -135,53,255,220,148,63,255,34,27,17,255,0,20,4,4,4,17,13,12,10, -227,196,113,31,255,212,118,35,255,214,123,43,255,33,26,16,255,0,56,12, -11,9,187,208,134,55,255,223,146,70,255,221,152,70,255,34,26,17,255,0, -40,8,7,5,164,165,86,22,255,202,98,21,255,198,96,21,255,22,16,9, -255,0,20,8,8,5,85,32,22,11,255,167,87,22,255,160,84,23,255,93, -54,20,255,120,65,21,255,188,96,21,255,196,99,21,255,200,105,21,255,24, -19,11,207,0,8,15,14,10,110,208,152,71,255,227,174,98,255,228,179,103, -255,225,176,98,255,217,169,94,255,213,166,92,255,215,167,92,255,213,155,80, -255,204,136,55,255,138,89,37,255,25,22,16,227,9,9,8,28,0,8,11, -10,8,170,203,129,50,255,223,149,70,255,222,158,75,255,31,25,16,255,4, -4,4,28,0,60,8,8,7,57,49,40,26,255,206,152,83,255,224,169,91, -255,194,140,71,255,31,27,20,255,9,8,8,28,0,8,12,10,9,161,196, -110,33,255,218,130,51,255,222,158,75,255,31,25,16,255,4,4,4,28,0, -8,11,10,8,198,213,160,84,255,228,180,105,255,227,175,100,255,33,28,18, -207,0,8,12,11,9,130,210,155,77,255,228,169,99,255,226,172,95,255,30, -25,17,255,4,4,4,28,0,8,11,10,8,198,204,129,49,255,214,127,43, -255,213,125,40,255,23,19,12,232,0,8,14,13,9,125,208,152,71,255,223, -159,76,255,218,153,59,255,33,26,16,210,0,8,13,12,10,127,198,118,39, -255,215,127,42,255,213,126,42,255,41,31,18,227,0,12,6,6,5,28,25, -21,16,227,204,150,79,255,223,171,98,255,175,122,60,255,18,15,11,218,5, -4,4,17,0,20,20,18,13,85,177,101,34,255,204,123,37,255,199,117,36, -255,199,117,36,255,202,122,37,255,199,117,36,255,198,114,31,255,198,110,31, -255,202,118,35,255,46,33,21,170,0,24,10,9,7,153,110,78,37,255,213, -162,82,255,218,164,87,255,67,51,30,255,9,8,8,85,0,40,6,5,5, -28,21,19,14,255,217,166,92,255,227,175,100,255,224,169,91,255,31,25,16, -215,0,8,12,10,7,85,154,80,21,255,197,99,20,255,192,97,21,255,28, -20,9,255,4,3,3,110,11,9,6,170,117,63,20,255,184,94,21,255,198, -104,21,255,203,104,24,255,210,122,37,255,21,17,12,252,0,8,10,9,7, -161,203,129,50,255,224,160,77,255,225,169,88,255,30,25,17,255,4,4,4, -28,0,8,8,7,5,190,165,86,22,255,198,104,21,255,196,99,21,255,28, -19,9,170,0,8,13,11,8,85,176,91,23,255,208,112,27,255,210,121,35, -255,27,22,14,255,4,4,4,28,0,8,11,10,8,198,211,149,76,255,224, -168,87,255,224,162,81,255,32,26,17,210,0,8,12,10,7,113,176,91,23, -255,202,107,23,255,202,95,23,255,20,16,9,255,0,40,15,13,10,170,213, -160,84,255,228,180,105,255,227,174,98,255,33,26,18,255,0,12,15,13,10, -170,213,155,80,255,226,172,95,255,224,167,85,255,23,20,14,244,0,8,11, -10,8,127,189,104,28,255,214,127,43,255,221,148,70,255,31,25,16,255,4, -4,4,28,0,28,14,12,9,170,195,113,32,255,209,117,28,255,202,103,23, -255,20,15,9,252,3,3,3,14,0,28,15,14,10,170,213,155,80,255,226, -172,95,255,221,152,70,255,28,24,15,255,0,40,14,12,9,170,208,141,61, -255,225,162,88,255,227,174,98,255,33,26,18,255,4,4,4,28,0,8,10, -8,7,198,182,98,23,255,202,103,23,255,198,104,21,255,28,19,9,170,0, -8,11,10,6,85,154,80,21,255,202,98,21,255,202,103,23,255,25,20,12, -255,0,40,12,10,7,170,186,100,23,255,202,99,23,255,200,105,21,255,30, -21,9,170,0,8,12,9,7,85,154,80,21,255,198,104,21,255,196,99,21, -255,28,20,9,255,4,4,3,113,11,10,6,227,183,100,26,255,212,127,43, -255,167,117,52,255,17,15,12,215,5,5,5,14,0,12,15,13,10,170,211, -149,76,255,224,166,83,255,223,161,80,255,34,26,17,255,0,32,10,9,7, -170,167,87,22,255,198,92,21,255,196,99,21,255,196,95,21,255,198,92,21, -255,195,99,22,255,192,106,29,255,206,127,43,255,217,141,60,255,223,146,70, -255,224,165,81,255,220,148,63,255,212,124,39,255,25,19,12,215,0,8,12, -11,9,116,196,116,37,255,218,141,51,255,218,139,55,255,218,142,61,255,215, -143,58,255,24,19,13,212,0,4,10,9,7,156,203,129,50,255,221,150,66, -255,220,148,63,255,25,21,14,227,0,8,10,10,7,159,204,134,59,255,225, -160,84,255,225,169,88,255,36,29,19,255,0,12,15,14,10,170,204,130,51, -255,220,142,59,255,218,139,55,255,21,18,12,249,0,8,11,10,8,142,206, -145,67,255,226,172,95,255,227,174,98,255,32,26,17,255,4,4,4,28,0, -8,11,10,8,198,198,117,37,255,215,125,38,255,211,122,36,255,28,21,13, -215,0,8,13,11,8,96,174,91,23,255,202,107,23,255,202,103,23,255,22, -17,9,255,0,12,11,10,6,170,176,91,23,255,202,103,23,255,203,108,24, -255,21,15,10,238,0,8,11,10,8,142,206,145,67,255,226,170,91,255,224, -160,85,255,30,24,17,255,4,4,4,28,0,8,11,10,8,198,209,149,70, -255,224,160,77,255,222,158,75,255,31,25,16,212,0,8,12,11,9,127,198, -116,35,255,215,125,38,255,211,122,36,255,28,21,13,255,4,4,4,28,0, -52,13,12,8,170,195,112,30,255,209,110,30,255,207,105,30,255,25,20,12, -255,0,24,15,14,10,170,213,158,80,255,226,172,95,255,224,164,85,255,33, -27,18,255,0,12,15,14,10,170,210,143,65,255,224,168,87,255,224,165,81, -255,25,21,14,232,0,8,10,10,9,153,208,147,67,255,224,166,83,255,222, -158,75,255,34,26,17,255,0,12,15,14,10,170,211,149,76,255,223,149,70, -255,219,146,60,255,25,20,14,235,0,8,10,10,9,150,204,134,59,255,224, -156,83,255,224,165,81,255,33,27,18,255,0,20,15,14,10,170,211,150,70, -255,226,170,91,255,226,172,95,255,33,26,18,255,0,16,9,9,8,150,101, -74,38,255,198,145,77,255,206,157,87,255,202,151,79,255,197,141,74,255,200, -146,75,255,180,126,57,255,21,19,14,227,5,5,4,28,0,16,8,7,5, -113,43,28,14,255,187,96,22,255,181,93,22,255,98,55,21,255,68,42,17, -255,77,46,18,255,129,72,22,255,174,89,21,255,83,47,18,255,11,9,6, -221,0,28,6,6,5,28,16,14,11,195,108,76,35,255,210,141,59,255,218, -162,81,255,167,118,54,255,16,14,11,221,5,5,5,14,0,12,15,13,10, -170,211,149,76,255,224,168,87,255,223,154,80,255,31,25,16,255,0,20,6, -6,5,57,34,27,17,255,203,122,36,255,208,124,41,255,109,76,34,255,13, -12,10,142,0,32,13,11,8,170,176,91,23,255,202,93,21,255,196,99,21, -255,28,19,9,170,0,8,11,9,6,85,132,71,21,255,195,99,22,255,103, -59,20,255,11,10,6,170,3,3,2,25,6,6,5,110,55,35,16,255,198, -113,29,255,212,134,51,255,41,32,20,210,0,68,21,19,14,215,217,163,86, -255,49,38,24,255,0,12,11,10,8,82,54,43,27,255,200,135,59,255,210, -137,59,255,207,131,50,255,205,127,44,255,199,117,36,255,195,111,28,255,187, -101,24,255,93,54,22,255,19,15,10,227,7,6,6,28,0,8,10,9,7, -170,195,109,32,255,218,138,53,255,224,158,81,255,223,173,95,255,219,167,94, -255,217,169,94,255,218,171,97,255,217,166,92,255,208,136,59,255,110,68,27, -255,19,15,10,227,6,6,5,28,0,12,12,11,7,170,61,42,20,255,188, -106,33,255,208,134,55,255,215,163,82,255,217,166,92,255,216,167,88,255,216, -167,89,255,211,150,70,255,146,94,39,255,26,21,15,229,9,8,6,28,0, -12,12,10,7,170,51,32,14,255,151,80,22,255,169,91,22,255,173,86,22, -255,169,88,22,255,173,86,22,255,180,92,21,255,194,98,21,255,196,95,21, -255,192,97,21,255,31,21,10,170,0,12,12,10,7,170,57,37,18,255,189, -107,34,255,212,149,67,255,217,166,92,255,217,166,92,255,218,171,97,255,215, -163,82,255,205,126,48,255,116,72,29,255,20,16,11,227,6,6,5,28,0, -8,11,9,6,68,126,68,21,255,191,98,22,255,194,98,21,255,192,97,21, -255,192,97,21,255,191,98,22,255,177,91,22,255,26,19,9,142,0,12,12, -10,7,170,58,37,17,255,185,107,30,255,208,134,55,255,216,167,88,255,218, -171,97,255,217,166,92,255,213,148,72,255,204,130,51,255,209,141,60,255,211, -159,76,255,30,25,17,170,0,8,10,10,7,167,210,155,77,255,228,178,99, -255,224,165,81,255,221,165,86,255,217,166,92,255,218,169,93,255,217,166,92, -255,214,156,81,255,206,135,51,255,116,72,29,255,20,16,11,227,6,6,5, -28,0,8,13,10,6,57,115,62,20,255,169,91,22,255,165,86,22,255,24, -18,9,167,0,24,12,10,7,88,117,63,20,255,186,100,23,255,191,107,32, -255,35,27,16,144,0,8,10,10,7,170,210,155,77,255,228,178,99,255,221, -152,70,255,24,19,13,255,0,8,12,10,7,170,58,36,15,255,157,79,22, -255,151,80,22,255,58,35,15,255,11,9,6,57,0,8,12,10,7,85,157, -81,20,255,197,99,20,255,192,97,21,255,28,20,9,170,0,8,11,9,6, -57,115,62,20,255,189,94,24,255,198,117,37,255,213,157,76,255,218,171,97, -255,217,169,94,255,214,161,85,255,213,157,76,255,212,149,67,255,208,134,55, -255,205,126,48,255,143,96,40,255,28,26,19,229,8,8,7,28,0,8,13, -12,8,85,141,74,24,255,190,94,23,255,183,95,24,255,183,95,24,255,187, -93,24,255,189,97,22,255,181,93,22,255,177,91,22,255,169,88,22,255,89, -52,20,255,21,18,12,227,9,9,8,28,0,12,18,17,13,181,103,74,40, -255,207,146,74,255,214,156,81,255,210,144,67,255,208,138,55,255,207,129,52, -255,205,133,48,255,205,126,48,255,151,101,42,255,28,26,19,232,9,8,8, -28,0,8,13,12,10,110,186,127,63,255,214,156,81,255,213,158,80,255,213, -155,80,255,214,156,81,255,214,153,75,255,213,148,72,255,213,148,72,255,211, -150,70,255,159,111,54,255,28,25,19,241,9,8,8,31,0,12,18,17,13, -181,103,74,40,255,208,156,81,255,214,156,81,255,208,138,55,255,209,137,60, -255,213,158,80,255,213,155,80,255,213,160,84,255,215,160,88,255,213,163,84, -255,30,24,17,178,0,8,12,11,9,93,178,121,53,255,213,158,80,255,210, -143,65,255,211,146,62,255,213,148,72,255,215,163,82,255,213,158,80,255,212, -149,67,255,209,141,60,255,153,106,49,255,28,25,19,235,9,9,8,31,0, -12,18,15,11,173,66,43,21,255,187,101,32,255,207,132,52,255,210,144,67, -255,213,148,72,255,214,156,81,255,216,167,88,255,214,156,81,255,176,128,65, -255,46,39,27,255,0,12,15,14,10,85,181,111,42,255,215,136,52,255,213, -125,40,255,211,122,36,255,212,123,37,255,210,123,39,255,202,122,37,255,31, -24,14,170,0,8,12,11,9,88,164,89,29,255,203,122,36,255,199,117,36, -255,30,23,15,212,0,12,15,13,10,127,187,133,62,255,213,148,72,255,208, -138,55,255,31,24,16,170,0,8,13,12,10,85,172,104,37,255,209,134,54, -255,206,135,51,255,32,25,17,212,0,12,15,13,10,127,181,116,46,255,211, -143,62,255,210,153,71,255,29,24,16,178,0,8,13,12,10,91,178,121,53, -255,213,154,70,255,208,134,55,255,31,25,16,210,0,20,15,14,10,125,179, -110,42,255,210,135,55,255,208,139,65,255,26,21,15,184,0,8,14,13,9, -85,179,117,44,255,217,165,82,255,213,163,84,255,27,23,16,221,0,12,14, -12,9,136,174,103,39,255,206,127,43,255,199,117,36,255,31,24,14,170,0, -8,12,11,9,88,164,89,29,255,202,118,35,255,196,114,33,255,29,22,14, -210,0,12,14,12,9,125,169,95,30,255,202,119,37,255,199,119,39,255,24, -19,13,190,0,8,14,12,9,85,170,95,29,255,198,113,29,255,199,116,34, -255,204,128,47,255,206,135,51,255,204,129,49,255,204,129,49,255,208,134,55, -255,211,149,76,255,192,140,73,255,95,74,39,255,17,15,12,85,0,16,14, -12,9,198,211,150,70,255,206,152,81,255,31,26,20,255,7,7,6,48,0, -16,15,13,10,170,211,149,76,255,226,170,91,255,226,172,95,255,35,28,18, -255,0,20,15,14,12,218,171,120,60,255,219,154,70,255,41,31,20,255,4, -4,3,28,0,104,17,16,12,170,219,179,116,255,232,193,137,255,232,199,135, -255,40,33,23,255,0,12,10,10,9,76,62,50,31,255,20,18,13,167,0, -12,11,10,8,76,58,46,29,255,20,18,13,167,0,16,13,12,10,170,210, -150,71,255,223,147,72,255,221,150,66,255,26,21,15,210,0,4,11,10,8, -119,211,159,84,255,229,184,114,255,230,186,123,255,30,26,19,255,0,16,12, -11,9,93,137,90,40,255,223,167,94,255,228,180,111,255,167,133,80,255,17, -16,14,227,11,11,10,170,12,11,9,170,12,11,9,170,12,11,9,119,7, -7,6,57,0,36,7,7,6,62,21,18,12,227,157,92,28,255,203,105,26, -255,197,106,26,255,82,48,21,255,14,12,7,173,5,5,4,8,0,16,8, -7,5,28,26,19,11,227,103,68,25,255,158,96,29,255,57,41,22,255,13, -12,10,241,33,26,16,255,146,88,31,255,66,47,23,255,12,10,9,201,6, -5,5,14,0,32,8,7,5,57,30,22,11,255,15,12,8,96,0,8,10, -10,7,130,190,104,27,255,209,118,30,255,211,117,34,255,27,21,14,255,0, -24,13,12,10,170,199,122,39,255,218,130,51,255,223,146,70,255,30,24,17, -255,0,12,23,22,18,139,30,27,21,170,16,15,11,255,89,59,26,255,203, -110,28,255,196,113,31,255,122,81,33,255,186,117,43,255,216,129,51,255,184, -126,57,255,38,34,25,255,24,22,19,221,33,30,24,170,15,15,12,28,0, -12,24,22,19,142,32,31,25,170,21,20,16,198,90,71,45,255,223,179,110, -255,226,172,95,255,221,150,66,255,143,100,44,255,22,21,17,227,28,27,21, -170,29,28,22,170,13,13,12,42,0,36,8,8,8,11,25,24,20,142,39, -35,28,170,30,28,23,170,29,27,22,170,29,27,22,170,29,27,22,170,29, -27,22,170,29,27,20,170,23,21,16,170,14,13,11,34,0,52,13,12,10, -159,142,86,31,255,208,116,35,255,201,119,38,255,32,26,17,255,5,5,4, -28,0,12,14,13,11,170,216,167,97,255,231,184,124,255,231,193,128,255,181, -146,92,255,52,44,33,255,90,71,45,255,201,155,88,255,223,173,102,255,228, -179,115,255,230,183,123,255,230,184,119,255,39,32,22,255,0,24,12,12,11, -170,206,139,61,255,226,164,91,255,228,174,103,255,39,32,22,255,0,48,6, -6,5,28,9,9,8,142,56,46,31,255,222,180,113,255,230,187,119,255,222, -180,113,255,23,21,16,255,0,36,15,14,12,164,79,59,30,255,209,128,42, -255,211,127,44,255,171,117,46,255,18,15,11,170,0,16,9,9,8,116,33, -28,16,255,161,94,28,255,199,107,26,255,65,40,18,255,8,7,5,255,25, -20,12,255,198,113,29,255,210,120,33,255,217,133,50,255,27,23,16,255,0, -8,7,7,6,23,34,28,19,198,46,36,25,255,39,31,22,255,41,33,22, -255,59,46,28,255,51,40,26,255,61,47,28,255,180,133,71,255,227,175,100, -255,226,175,103,255,181,143,88,255,17,16,12,142,0,8,11,11,10,170,214, -166,97,255,229,179,114,255,228,185,111,255,161,121,68,255,23,21,16,227,23, -22,18,170,22,21,17,170,16,15,13,170,11,11,8,147,8,8,7,85,0, -40,14,13,11,170,181,143,88,255,228,185,123,255,218,168,97,255,70,54,35, -255,9,9,8,113,0,12,11,10,8,85,120,87,45,255,223,183,120,255,231, -190,132,255,167,135,80,255,24,22,19,227,19,18,16,170,19,18,16,198,95, -80,46,255,226,193,129,255,228,187,129,255,186,148,87,255,15,14,12,170,0, -8,10,10,9,85,155,113,64,255,229,196,132,255,232,191,133,255,179,142,90, -255,27,25,20,227,18,18,15,170,19,18,16,198,90,71,45,255,222,175,101, -255,227,174,98,255,228,185,111,255,28,25,19,255,0,8,7,7,6,23,34, -28,19,198,49,35,22,255,39,29,18,227,12,11,9,85,0,8,8,7,7, -28,33,26,16,198,52,39,23,255,47,35,22,227,13,12,8,85,0,8,8, -8,7,28,33,30,24,227,201,157,100,255,230,186,123,255,181,137,74,255,16, -15,11,207,6,6,5,23,0,24,11,10,8,28,27,21,12,193,26,19,11, -255,23,18,10,255,23,18,10,255,24,18,11,255,24,18,11,255,26,20,11, -255,35,27,16,255,42,31,19,241,17,14,10,85,0,28,9,9,8,144,91, -67,36,255,217,154,72,255,211,150,70,255,69,55,34,255,15,14,12,85,0, -28,6,6,5,11,11,11,10,142,24,22,19,255,167,135,80,255,225,172,104, -255,224,166,83,255,193,126,54,255,16,14,11,170,0,8,13,12,8,85,185, -97,26,255,207,112,28,255,204,110,27,255,71,46,22,255,8,8,7,255,28, -22,13,255,198,107,27,255,193,111,30,255,126,78,31,255,199,139,62,255,226, -184,111,255,27,24,18,255,0,8,11,10,8,170,214,166,97,255,230,187,119, -255,228,179,103,255,143,102,48,255,17,16,12,227,12,12,9,170,13,12,10, -198,46,33,17,255,199,112,28,255,206,111,27,255,204,110,27,255,32,23,13, -176,0,8,12,11,9,136,204,134,59,255,226,172,95,255,228,181,107,255,162, -125,73,255,24,22,19,227,19,18,16,170,19,18,16,198,95,80,46,255,224, -179,109,255,223,173,95,255,173,117,50,255,15,13,10,156,0,8,12,11,7, -99,185,97,26,255,208,112,27,255,204,110,27,255,22,18,11,255,0,40,16, -15,13,170,219,179,116,255,232,194,133,255,231,193,128,255,40,33,23,255,0, -12,16,15,13,170,219,177,112,255,230,187,119,255,224,159,83,255,24,21,15, -255,0,8,11,10,8,164,211,158,82,255,229,184,114,255,230,191,123,255,166, -127,77,255,22,21,17,227,22,21,17,170,20,19,13,170,14,13,11,28,0, -16,12,11,9,170,195,112,30,255,209,106,30,255,206,111,27,255,101,63,26, -255,16,14,11,227,23,21,16,170,29,27,22,170,13,13,12,42,0,16,16, -15,13,170,216,167,97,255,224,158,87,255,216,125,45,255,24,20,13,255,0, -40,17,16,12,170,219,177,112,255,232,195,137,255,231,189,128,255,162,125,73, -255,22,21,17,227,14,14,11,170,13,12,10,198,50,35,19,255,199,112,28, -255,206,111,27,255,204,110,27,255,32,24,13,170,0,8,13,12,8,93,194, -109,33,255,219,139,54,255,224,158,81,255,39,32,22,255,0,40,11,10,8, -170,190,104,27,255,208,112,27,255,204,110,27,255,32,24,13,170,0,8,13, -12,8,85,184,96,25,255,207,112,28,255,204,102,27,255,129,78,28,255,31, -26,16,255,127,84,34,255,219,147,70,255,173,122,62,255,15,14,12,212,6, -6,5,25,0,16,16,15,13,170,213,155,80,255,221,144,68,255,217,130,52, -255,31,25,16,255,0,32,10,9,7,170,189,99,26,255,208,112,27,255,204, -110,27,255,155,87,26,255,72,46,21,255,179,103,36,255,223,156,76,255,216, -170,97,255,134,96,47,255,174,127,71,255,221,167,90,255,223,147,72,255,222, -158,75,255,23,19,14,252,0,8,11,10,8,170,214,166,97,255,231,187,124, -255,230,191,123,255,228,182,117,255,222,175,101,255,64,50,33,255,7,7,6, -229,26,23,19,255,220,175,105,255,228,183,113,255,228,188,117,255,25,21,16, -255,0,8,11,10,8,170,217,176,112,255,232,197,137,255,232,199,135,255,37, -31,22,255,0,12,13,12,10,170,198,117,37,255,215,127,42,255,217,130,52, -255,21,19,14,255,0,8,11,10,8,167,215,172,104,255,232,191,133,255,231, -190,132,255,166,127,77,255,23,21,16,227,18,17,15,170,17,16,12,198,74, -52,27,255,204,117,33,255,211,111,30,255,173,93,28,255,15,12,8,164,0, -8,13,12,8,88,185,97,26,255,208,112,27,255,204,110,27,255,19,16,10, -255,0,12,10,9,7,170,190,104,27,255,212,118,35,255,216,136,51,255,21, -19,14,252,0,8,11,10,8,167,215,172,104,255,232,194,127,255,231,193,128, -255,166,129,77,255,23,21,16,227,19,18,16,170,19,18,14,198,81,59,34, -255,213,144,62,255,215,140,60,255,165,108,40,255,13,12,10,167,0,8,8, -8,7,85,101,63,26,255,206,114,33,255,212,121,33,255,155,92,36,255,23, -21,16,227,22,21,17,170,28,26,21,170,21,20,18,170,13,13,12,164,10, -10,9,85,6,6,6,6,0,28,12,11,9,170,194,112,31,255,212,119,37, -255,216,134,45,255,35,28,18,255,0,24,16,15,13,170,217,171,106,255,231, -187,124,255,228,181,107,255,39,32,22,255,0,12,16,15,11,170,208,134,55, -255,223,156,70,255,221,148,70,255,23,20,14,238,0,8,11,10,8,170,204, -136,55,255,223,156,70,255,222,158,75,255,34,28,19,255,0,12,14,13,11, -170,217,171,106,255,232,189,127,255,230,186,123,255,25,22,16,255,0,8,10, -10,9,167,210,155,77,255,226,172,95,255,224,165,81,255,31,26,18,255,0, -20,15,13,12,170,217,173,104,255,232,191,133,255,231,195,132,255,40,33,23, -255,0,20,10,9,9,133,73,58,36,255,225,184,120,255,231,193,128,255,228, -180,111,255,147,102,48,255,15,13,10,227,8,7,7,28,0,24,12,11,7, -198,100,59,23,255,169,93,26,255,156,91,27,255,174,96,27,255,180,99,27, -255,168,97,27,255,105,62,24,255,18,15,9,255,7,6,6,48,0,24,7, -7,7,28,15,15,12,227,144,114,67,255,219,177,112,255,223,176,102,255,153, -113,62,255,17,16,12,227,7,7,6,28,0,16,16,15,13,170,213,155,80, -255,223,146,70,255,217,129,50,255,27,22,14,255,0,24,12,10,9,195,161, -94,28,255,207,114,32,255,193,114,36,255,23,20,16,255,0,32,12,11,9, -170,191,105,28,255,207,100,28,255,204,110,27,255,26,20,11,204,0,8,6, -5,5,3,26,19,9,198,24,18,9,246,15,12,8,142,0,12,15,13,10, -91,31,24,16,244,51,39,24,255,21,19,14,91,0,68,10,10,9,76,61, -49,30,255,20,18,13,156,0,16,17,15,12,142,27,22,14,232,30,22,13, -255,25,20,12,255,22,18,11,238,21,16,10,255,99,58,22,255,203,113,26, -255,205,111,28,255,131,80,30,255,12,11,9,142,0,8,11,10,8,170,212, -160,85,255,232,191,127,255,231,195,132,255,196,155,91,255,81,59,34,255,41, -32,20,255,54,43,27,255,180,133,71,255,216,144,59,255,208,115,33,255,129, -78,28,255,12,11,7,142,0,8,8,7,7,57,72,52,29,255,215,155,78, -255,227,174,98,255,207,158,94,255,85,63,34,255,36,29,19,255,57,43,26, -255,189,130,66,255,219,149,66,255,212,121,41,255,172,105,33,255,17,15,10, -147,0,8,7,6,6,54,58,40,21,255,198,113,29,255,206,103,27,255,165, -87,24,255,42,28,13,255,21,16,8,255,27,20,10,255,95,60,22,255,202, -105,27,255,206,100,29,255,204,110,27,255,35,24,12,170,0,8,7,7,6, -54,70,50,27,255,212,145,65,255,227,174,98,255,201,155,88,255,59,44,28, -255,23,20,14,255,34,28,19,255,157,104,48,255,211,126,42,255,208,115,33, -255,132,82,29,255,13,11,8,142,0,12,24,18,9,221,108,61,23,255,201, -112,26,255,207,112,28,255,204,110,27,255,158,91,25,255,46,29,13,249,11, -10,6,57,0,8,8,8,7,57,70,50,27,255,212,142,59,255,226,172,95, -255,207,158,94,255,85,63,34,255,41,32,20,255,57,43,26,255,174,124,59, -255,224,170,93,255,229,184,114,255,231,196,128,255,28,25,19,255,0,8,10, -10,9,167,215,169,102,255,232,191,127,255,231,193,128,255,196,154,87,255,77, -59,34,255,41,31,20,255,54,43,27,255,168,113,49,255,212,121,41,255,206, -114,33,255,132,82,29,255,12,11,9,130,0,8,12,11,7,110,188,98,25, -255,206,111,27,255,206,106,25,255,26,19,11,255,0,24,14,12,9,170,199, -117,36,255,221,148,62,255,227,174,98,255,28,26,19,255,0,8,10,10,9, -167,212,161,89,255,224,166,83,255,217,129,50,255,32,24,15,255,5,5,4, -31,7,7,6,136,65,44,22,255,192,106,29,255,203,108,24,255,114,66,23, -255,17,13,8,221,0,12,10,9,7,139,185,97,26,255,208,112,27,255,208, -117,29,255,32,24,13,170,0,8,15,13,8,91,189,99,26,255,215,123,42, -255,226,172,95,255,198,152,87,255,81,58,34,255,176,133,71,255,224,168,95, -255,197,138,62,255,65,47,26,255,133,81,30,255,208,121,37,255,212,115,37, -255,152,98,35,255,12,11,9,142,0,8,10,9,7,147,190,107,25,255,206, -111,27,255,206,106,25,255,158,91,25,255,42,28,13,255,21,15,8,255,26, -19,9,255,114,66,23,255,204,113,25,255,208,115,33,255,173,122,62,255,16, -15,13,150,0,8,8,8,7,71,110,87,51,255,222,180,113,255,224,166,83, -255,209,137,60,255,133,84,32,255,77,50,24,255,89,59,26,255,181,109,32, -255,210,121,35,255,212,121,41,255,171,116,52,255,15,14,12,142,0,8,14, -13,11,170,219,177,112,255,231,187,124,255,228,180,111,255,205,158,90,255,79, -58,32,255,38,29,19,255,49,35,22,255,167,114,46,255,217,146,62,255,219, -154,70,255,169,117,56,255,15,13,12,156,0,8,8,8,7,71,104,80,45, -255,224,183,119,255,232,191,127,255,210,166,97,255,81,60,32,255,39,30,18, -255,52,40,25,255,175,128,66,255,225,173,98,255,228,180,105,255,226,175,95, -255,29,25,18,255,0,8,12,12,11,170,208,138,55,255,222,145,63,255,220, -139,59,255,193,121,50,255,68,50,29,255,38,28,19,255,48,35,23,255,175, -112,44,255,217,142,54,255,217,144,66,255,191,137,66,255,19,16,12,170,0, -8,9,8,8,74,111,82,40,255,216,155,75,255,226,172,95,255,200,151,81, -255,57,41,26,255,27,23,16,255,35,28,18,255,41,32,20,255,39,30,20, -255,25,22,16,227,15,14,10,142,0,12,10,9,7,28,33,24,14,227,135, -81,28,255,206,117,31,255,210,108,33,255,208,110,31,255,171,92,28,255,49, -33,16,252,13,11,8,68,0,8,11,10,8,170,195,108,30,255,212,118,35, -255,217,137,52,255,42,33,23,255,0,12,20,18,15,170,214,156,81,255,221, -148,62,255,214,127,43,255,23,19,12,238,0,8,10,10,7,159,196,109,31, -255,213,119,36,255,212,123,37,255,31,24,14,255,0,12,15,14,10,170,209, -137,60,255,228,172,99,255,230,189,119,255,28,26,19,255,0,8,12,12,11, -170,208,134,55,255,218,137,51,255,214,127,43,255,35,27,16,255,0,20,16, -14,11,170,199,116,34,255,217,132,48,255,224,166,83,255,32,26,19,255,0, -8,10,10,7,34,81,58,34,255,224,178,105,255,226,172,95,255,129,92,40, -255,9,9,8,170,6,6,6,85,6,6,5,113,35,27,16,255,204,117,33, -255,208,117,29,255,110,69,25,255,14,12,7,108,0,8,10,10,7,170,195, -112,30,255,211,115,30,255,211,115,30,255,30,23,13,255,0,12,14,12,9, -170,196,113,31,255,211,120,32,255,214,126,41,255,33,26,18,255,0,8,9, -8,6,28,44,33,19,212,60,42,23,255,46,35,21,255,74,53,31,255,156, -109,53,255,216,167,97,255,228,179,109,255,229,177,110,255,227,184,108,255,168, -123,69,255,23,21,16,227,9,8,8,28,0,12,17,16,14,170,134,98,51, -255,223,166,92,255,132,100,53,255,9,9,8,133,0,20,16,15,13,170,219, -177,112,255,232,191,133,255,231,195,132,255,40,33,23,255,0,20,6,6,5, -45,39,32,22,255,210,129,49,255,172,106,35,255,20,17,13,227,11,11,8, -28,0,100,17,17,14,170,221,189,132,255,235,205,154,255,234,205,155,255,42, -39,29,255,0,16,9,9,8,25,0,20,9,8,8,25,0,20,14,14,11, -170,208,141,61,255,224,168,87,255,228,174,103,255,31,26,20,221,0,4,13, -12,12,130,218,185,127,255,234,202,147,255,232,198,139,255,40,33,25,255,0, -20,17,17,14,176,140,115,71,255,230,202,147,255,232,202,149,255,218,170,101, -255,200,124,43,255,198,117,37,255,198,117,37,255,196,116,37,255,72,52,27, -255,12,11,9,170,0,28,8,8,7,85,37,31,20,255,174,110,41,255,210, -123,39,255,204,120,37,255,130,87,31,255,15,13,10,190,0,28,5,5,4, -113,28,26,19,255,210,143,65,255,220,163,81,255,217,166,92,255,222,173,97, -255,225,176,98,255,42,37,25,255,4,4,4,74,0,56,13,12,10,170,208, -141,61,255,226,172,95,255,228,183,111,255,40,34,25,255,0,24,17,16,14, -170,219,177,112,255,232,194,133,255,233,202,148,255,27,24,20,255,0,8,16, -15,13,85,199,161,102,255,220,166,89,255,211,143,62,255,217,154,72,255,223, -161,80,255,224,169,91,255,225,185,114,255,229,188,124,255,231,190,132,255,231, -200,143,255,227,195,140,255,227,196,138,255,225,195,136,255,44,37,27,170,0, -8,17,16,14,85,200,165,109,255,227,198,142,255,225,191,132,255,227,195,134, -255,231,199,136,255,231,197,132,255,231,194,124,255,229,191,130,255,225,195,136, -255,225,195,136,255,225,191,132,255,49,42,30,198,0,36,18,17,13,105,193, -135,66,255,221,175,102,255,222,186,123,255,223,190,132,255,224,192,135,255,223, -190,132,255,222,186,123,255,221,178,110,255,218,172,105,255,46,39,27,195,0, -48,6,6,6,28,27,26,20,255,216,170,97,255,225,178,104,255,176,136,83, -255,16,15,13,198,0,16,17,17,14,170,221,188,130,255,235,205,154,255,234, -205,155,255,232,204,149,255,228,199,143,255,171,144,96,255,64,57,41,255,154, -126,81,255,227,189,122,255,230,184,119,255,227,171,98,255,34,30,21,255,0, -24,17,16,14,170,221,186,126,255,234,202,147,255,232,192,135,255,44,39,27, -255,0,44,9,9,8,142,25,24,20,255,114,95,53,255,207,169,102,255,227, -187,118,255,226,188,123,255,178,148,95,255,19,18,16,170,0,32,24,22,19, -85,197,145,84,255,227,187,118,255,231,194,124,255,207,173,114,255,61,55,38, -255,8,8,8,136,0,12,10,10,9,108,45,36,21,255,195,116,38,255,207, -122,38,255,139,90,32,255,13,12,8,170,0,4,10,10,9,198,208,140,59, -255,226,170,91,255,231,193,128,255,40,35,27,255,0,36,4,4,3,28,18, -17,13,227,222,189,131,255,234,201,143,255,229,191,130,255,34,30,23,204,0, -8,11,11,10,170,211,158,82,255,226,170,91,255,224,165,81,255,219,154,70, -255,208,132,51,255,206,128,45,255,204,122,41,255,201,120,40,255,196,116,37, -255,111,74,30,255,20,18,13,227,8,8,7,28,0,28,6,6,6,28,28, -26,21,255,222,186,123,255,229,196,132,255,181,144,92,255,16,15,13,212,0, -16,6,6,6,85,25,24,20,255,180,149,101,255,231,205,154,255,232,204,149, -255,227,198,142,255,223,192,138,255,223,193,136,255,230,199,139,255,232,197,141, -255,211,176,122,255,64,57,41,255,8,8,7,113,0,8,6,6,5,14,33, -31,24,227,186,155,107,255,232,204,149,255,233,205,152,255,227,197,140,255,221, -189,132,255,224,192,135,255,228,198,141,255,232,201,141,255,232,192,135,255,231, -197,132,255,41,35,26,255,0,64,17,16,14,139,211,178,120,255,233,202,148, -255,233,202,148,255,56,48,33,255,4,4,4,85,0,104,11,11,10,255,216, -164,89,255,230,191,123,255,227,195,134,255,40,35,27,227,0,28,16,15,13, -227,126,105,69,255,217,176,112,255,225,175,104,255,223,159,76,255,189,124,49, -255,43,35,20,255,9,8,8,57,0,8,10,10,9,133,194,109,33,255,215, -125,38,255,212,124,39,255,144,93,33,255,29,24,16,255,68,53,29,255,186, -123,49,255,128,95,47,255,25,24,20,255,143,119,78,255,230,201,145,255,33, -30,24,255,0,8,11,11,10,170,217,176,112,255,228,182,109,255,222,158,75, -255,212,134,51,255,204,122,41,255,198,117,37,255,200,118,37,255,208,123,39, -255,212,123,37,255,214,121,39,255,217,133,50,255,24,21,15,244,0,8,11, -11,10,170,218,185,127,255,235,203,148,255,233,202,148,255,230,201,145,255,227, -197,140,255,221,187,128,255,221,184,120,255,224,178,105,255,224,164,85,255,189, -129,58,255,39,32,20,255,7,7,6,85,0,8,11,10,8,125,194,109,33, -255,215,125,38,255,213,125,40,255,29,24,16,255,0,40,17,17,14,170,221, -188,130,255,235,201,152,255,232,201,141,255,42,36,27,255,0,12,17,17,14, -170,219,179,116,255,231,187,124,255,228,183,111,255,24,22,17,255,0,8,11, -11,10,170,218,185,127,255,232,197,137,255,227,179,104,255,219,155,72,255,208, -132,51,255,204,122,41,255,202,120,39,255,38,31,19,170,0,16,12,11,9, -170,196,110,33,255,215,113,38,255,213,122,42,255,215,143,58,255,217,166,92, -255,222,186,123,255,225,195,136,255,52,44,33,198,0,16,17,16,14,170,211, -150,70,255,219,140,56,255,213,126,42,255,25,21,14,255,0,40,17,17,14, -170,221,187,128,255,232,199,141,255,228,180,111,255,219,155,72,255,207,128,44, -255,199,119,39,255,200,118,37,255,208,123,39,255,212,123,37,255,214,125,39, -255,212,124,39,255,34,26,15,181,0,8,11,10,10,161,215,172,104,255,234, -201,143,255,234,206,151,255,42,39,29,255,0,40,12,11,9,170,196,110,33, -255,215,125,38,255,212,124,39,255,36,28,17,170,0,8,15,14,10,85,194, -109,33,255,215,125,38,255,212,124,39,255,210,128,41,255,211,135,54,255,225, -176,98,255,231,197,132,255,56,48,33,255,4,4,4,85,0,20,17,16,14, -170,206,135,51,255,217,133,50,255,213,122,42,255,25,21,14,255,0,32,12, -11,9,170,196,110,33,255,215,125,38,255,213,122,42,255,67,51,28,255,6, -6,5,255,40,34,25,255,226,190,127,255,138,110,69,255,7,7,7,255,25, -24,20,255,221,179,112,255,232,191,127,255,232,201,141,255,26,23,19,255,0, -8,11,11,10,170,214,168,101,255,230,187,119,255,228,188,117,255,212,173,105, -255,150,118,67,255,102,86,47,255,111,90,50,255,185,145,88,255,227,187,118, -255,231,195,132,255,232,201,141,255,26,23,19,255,0,8,11,11,10,170,219, -184,128,255,235,205,154,255,234,206,151,255,42,36,27,255,0,12,15,15,12, -170,213,158,80,255,228,182,109,255,230,191,123,255,27,23,18,255,0,8,11, -11,10,170,219,189,132,255,235,205,154,255,232,197,141,255,225,185,114,255,215, -155,78,255,206,135,51,255,205,126,42,255,209,128,42,255,212,121,41,255,181, -111,36,255,39,30,18,255,8,8,7,57,0,8,10,10,9,136,194,109,33, -255,215,125,38,255,212,124,39,255,24,20,13,255,0,12,15,14,12,170,210, -146,71,255,229,183,110,255,231,197,132,255,26,23,19,255,0,8,11,11,10, -170,218,189,127,255,234,199,143,255,231,197,132,255,225,176,106,255,214,153,75, -255,208,138,55,255,205,133,48,255,210,127,45,255,214,134,49,255,179,119,42, -255,37,30,18,255,7,7,6,85,0,12,23,20,14,227,161,115,50,255,222, -167,89,255,227,186,114,255,225,190,130,255,223,198,136,255,227,198,142,255,224, -196,141,255,221,191,134,255,161,130,86,255,33,30,24,229,10,10,9,42,0, -24,15,15,12,170,211,149,76,255,228,182,109,255,231,189,128,255,44,39,27, -255,0,24,17,17,14,170,216,170,97,255,226,172,95,255,224,165,81,255,31, -26,18,255,0,12,13,12,10,170,201,120,40,255,217,133,50,255,216,125,45, -255,25,21,14,212,0,8,11,10,8,144,203,130,52,255,224,166,83,255,228, -174,103,255,40,34,25,255,0,12,17,16,14,170,221,187,128,255,234,201,143, -255,230,191,123,255,28,25,19,244,0,8,10,10,9,164,203,122,50,255,220, -148,63,255,217,141,52,255,23,20,14,255,0,8,14,13,11,108,10,10,9, -28,0,4,13,13,12,170,221,189,134,255,235,205,154,255,234,206,151,255,42, -37,27,255,0,24,11,11,10,255,222,189,131,255,232,195,131,255,224,162,81, -255,36,29,19,255,4,4,4,54,0,28,7,7,6,28,19,17,12,232,93, -66,30,255,183,112,36,255,209,122,38,255,212,120,39,255,159,102,34,255,22, -19,13,255,7,7,6,85,0,24,6,6,5,28,17,16,14,227,149,122,84, -255,227,195,140,255,227,191,134,255,179,142,90,255,17,16,14,227,5,5,4, -25,0,20,15,14,12,170,204,129,49,255,218,141,51,255,213,126,42,255,25, -21,14,255,0,24,8,7,7,91,68,48,25,255,205,127,44,255,220,153,75, -255,99,78,44,255,8,8,7,113,0,28,12,11,9,170,196,110,33,255,215, -125,38,255,212,124,39,255,24,20,13,255,0,124,9,9,8,25,0,40,2, -2,1,23,9,8,6,255,199,116,34,255,215,125,38,255,212,128,45,255,27, -24,16,207,0,8,11,11,10,170,219,184,128,255,235,205,154,255,234,205,155, -255,58,49,35,255,5,5,4,85,0,4,4,4,3,28,16,15,11,227,204, -122,41,255,215,126,40,255,210,123,39,255,32,25,15,170,0,8,13,13,12, -122,208,168,99,255,234,199,143,255,234,204,151,255,63,54,38,255,5,5,4, -85,0,4,4,4,3,28,18,17,13,215,204,127,45,255,214,125,39,255,212, -121,41,255,34,27,15,170,0,8,13,12,10,85,185,112,34,255,215,125,38, -255,212,123,37,255,35,28,16,255,4,4,3,85,0,4,3,3,2,28,12, -10,9,224,198,117,37,255,215,125,38,255,212,124,39,255,34,27,15,178,0, -8,14,13,11,113,206,162,94,255,232,199,141,255,234,207,155,255,63,53,36, -255,4,4,3,113,0,4,3,3,3,28,10,10,9,255,200,118,37,255,215, -125,38,255,210,123,39,255,27,22,14,227,0,12,3,3,2,6,13,11,8, -221,199,116,34,255,215,125,38,255,212,124,39,255,35,27,16,255,5,4,4, -57,0,12,15,14,12,147,206,154,87,255,232,195,137,255,234,204,151,255,63, -54,38,255,5,5,4,85,0,4,4,4,3,28,18,16,13,227,222,189,131, -255,235,205,152,255,234,205,155,255,27,24,20,255,0,8,11,11,10,170,219, -184,130,255,235,205,152,255,234,205,155,255,58,49,35,255,5,5,4,85,0, -4,4,4,3,28,14,12,9,227,199,117,36,255,215,113,38,255,210,123,39, -255,32,25,15,170,0,8,12,12,9,102,194,109,33,255,215,125,38,255,212, -124,39,255,27,22,14,255,0,24,18,16,13,170,217,176,110,255,234,196,143, -255,234,204,151,255,27,24,20,255,0,8,11,10,10,170,204,134,59,255,219, -136,54,255,213,122,42,255,72,50,27,255,8,8,7,255,25,22,14,255,195, -116,38,255,208,123,39,255,142,91,31,255,16,14,9,193,4,4,3,17,0, -12,11,11,8,170,198,117,37,255,219,133,56,255,221,152,70,255,27,23,16, -221,0,8,13,12,10,99,193,113,34,255,223,156,70,255,231,193,128,255,40, -34,25,255,4,3,3,113,17,16,12,227,208,136,59,255,45,36,21,255,4, -3,3,113,10,9,7,207,196,110,33,255,215,125,38,255,210,128,41,255,32, -25,15,170,0,8,12,11,9,108,194,109,33,255,215,125,38,255,212,124,39, -255,35,27,16,255,4,4,3,85,0,4,3,3,2,28,12,11,9,227,199, -117,36,255,221,150,66,255,229,191,126,255,32,29,23,210,0,8,13,13,12, -122,204,150,79,255,223,159,76,255,217,141,52,255,84,57,29,255,9,8,6, -170,5,5,4,85,6,6,5,113,27,22,14,255,207,128,44,255,223,147,72, -255,227,187,118,255,34,30,23,207,0,8,12,11,11,170,218,180,119,255,229, -184,114,255,224,167,85,255,50,40,25,255,5,5,4,85,0,4,4,4,3, -28,14,12,9,227,203,125,42,255,217,128,48,255,213,128,45,255,35,27,16, -173,0,8,12,12,11,130,209,163,98,255,235,203,148,255,233,202,148,255,63, -54,36,255,5,5,4,85,0,4,4,4,3,28,15,15,12,227,209,137,60, -255,221,151,68,255,219,147,62,255,23,20,14,238,0,8,10,10,9,150,196, -121,41,255,217,128,48,255,215,133,44,255,40,31,19,255,5,5,5,85,0, -4,4,4,3,28,16,14,11,207,201,120,40,255,217,133,50,255,221,161,76, -255,57,44,28,170,0,8,15,14,12,105,211,165,98,255,232,197,137,255,232, -199,141,255,58,49,35,255,4,4,3,113,0,40,3,3,2,17,12,11,9, -227,199,116,34,255,215,125,38,255,212,124,39,255,35,27,16,255,4,4,3, -62,0,12,12,11,9,170,200,120,41,255,223,159,76,255,230,191,123,255,44, -37,27,255,0,12,18,17,15,170,208,140,59,255,217,133,50,255,213,125,40, -255,27,23,14,195,0,8,12,11,9,108,194,109,33,255,215,125,38,255,212, -124,39,255,25,21,14,255,0,12,17,16,14,170,219,179,116,255,235,201,152, -255,234,204,151,255,27,24,20,255,0,8,10,10,9,170,198,122,41,255,215, -127,42,255,213,125,40,255,27,22,14,255,0,20,12,11,9,170,201,120,40, -255,224,156,83,255,231,190,132,255,40,33,25,255,0,12,10,10,9,85,52, -42,29,255,200,142,59,255,183,119,44,255,72,52,27,255,39,30,18,255,49, -37,22,255,150,99,33,255,196,116,37,255,77,50,24,255,10,9,7,144,0, -12,10,10,9,170,196,115,35,255,215,125,38,255,212,124,39,255,25,21,14, -255,0,12,12,11,9,170,196,110,33,255,214,127,43,255,222,158,75,255,41, -34,24,255,0,24,5,5,4,85,11,11,10,255,130,101,59,255,223,176,102, -255,224,176,101,255,177,137,74,255,18,17,13,227,6,5,5,28,0,12,20, -19,15,85,186,120,49,255,217,142,62,255,217,139,56,255,34,29,19,255,4, -4,3,17,0,20,17,17,14,170,221,188,130,255,235,205,152,255,234,205,155, -255,42,39,29,255,0,24,13,13,10,181,199,119,39,255,212,121,41,255,203, -121,40,255,35,29,17,170,0,100,20,18,15,170,222,186,123,255,234,201,143, -255,232,197,135,255,47,40,28,255,0,64,14,13,11,170,213,160,84,255,230, -187,119,255,231,197,132,255,35,30,22,198,0,4,14,13,11,108,217,176,112, -255,232,193,137,255,231,197,132,255,33,28,22,255,0,24,12,12,11,113,31, -29,22,210,40,35,27,255,41,34,24,255,29,24,16,255,32,26,17,255,146, -92,35,255,214,134,49,255,212,128,45,255,123,81,36,255,15,13,10,142,0, -20,7,7,6,85,28,26,19,252,194,140,71,255,212,127,43,255,202,118,35, -255,97,66,30,255,15,14,10,207,6,6,5,25,0,24,6,6,5,8,15, -13,12,227,111,86,50,255,209,168,102,255,176,136,83,255,85,67,44,255,163, -129,80,255,221,186,126,255,83,69,44,255,7,7,6,170,5,5,5,8,0, -4,9,9,8,108,20,18,13,170,13,12,10,51,0,36,16,15,13,170,217, -176,110,255,232,194,133,255,232,198,139,255,36,33,25,255,0,24,15,15,12, -170,219,179,116,255,232,193,137,255,232,199,135,255,31,26,20,255,0,8,11, -11,10,28,56,48,33,227,98,76,45,255,104,80,45,255,195,154,96,255,227, -186,114,255,226,189,125,255,207,173,114,255,222,188,123,255,231,190,132,255,217, -188,124,255,137,109,70,255,99,86,54,255,78,64,43,255,21,20,16,85,0, -8,12,12,11,28,54,48,35,227,86,72,47,255,74,63,43,255,171,137,84, -255,229,191,130,255,230,191,123,255,230,186,123,255,202,164,105,255,97,80,50, -255,75,64,44,255,72,61,39,255,22,21,17,102,0,36,12,11,11,45,55, -45,30,227,90,71,45,255,78,63,41,255,72,61,39,255,74,63,43,255,72, -61,39,255,72,61,39,255,91,74,46,255,78,63,41,255,22,20,17,102,0, -48,12,12,11,176,132,106,61,255,228,188,125,255,210,172,113,255,42,37,29, -255,9,9,8,62,0,16,17,16,14,170,221,186,124,255,234,199,143,255,232, -201,141,255,232,201,141,255,221,189,134,255,52,46,33,255,6,7,6,227,24, -23,17,255,208,132,51,255,215,133,44,255,212,124,39,255,24,20,13,255,0, -24,17,16,12,170,219,177,112,255,231,187,124,255,228,182,109,255,40,33,23, -255,0,36,9,9,8,74,17,15,12,227,67,51,28,255,162,107,43,255,200, -142,67,255,204,157,91,255,177,140,86,255,74,63,43,255,19,17,16,198,9, -9,8,28,0,32,14,14,11,31,56,46,31,227,192,157,103,255,229,194,128, -255,225,188,124,255,146,112,67,255,11,10,8,164,0,8,7,7,6,28,34, -27,17,255,190,107,33,255,210,121,35,255,146,95,35,255,16,14,11,187,0, -8,9,9,8,170,214,164,93,255,232,194,127,255,231,195,132,255,40,34,25, -255,0,40,13,13,10,170,213,157,84,255,224,166,83,255,221,150,66,255,23, -20,14,246,0,8,12,11,9,113,194,109,33,255,212,119,37,255,210,113,35, -255,168,103,33,255,56,42,23,255,27,23,14,255,38,31,19,255,149,92,30, -255,207,118,32,255,207,113,30,255,124,75,27,255,13,11,8,161,0,28,12, -12,11,176,130,99,59,255,229,191,126,255,211,174,116,255,43,37,28,255,9, -9,8,59,0,16,8,8,7,85,68,58,37,255,214,177,119,255,231,196,136, -255,207,171,114,255,97,80,50,255,54,47,35,255,66,59,41,255,178,148,95, -255,228,189,121,255,224,187,123,255,146,112,67,255,12,12,11,170,0,12,10, -10,9,28,16,15,13,147,29,28,22,221,48,42,31,255,70,61,41,255,66, -57,39,255,70,61,41,255,171,140,92,255,224,170,101,255,224,168,87,255,224, -165,81,255,39,32,22,255,0,64,14,13,11,57,100,82,51,255,222,186,123, -255,226,172,95,255,113,82,38,255,9,8,8,127,0,32,11,9,6,102,11, -10,6,170,11,10,8,170,12,11,9,170,15,13,10,170,15,13,10,170,15, -14,10,170,18,15,11,170,18,15,11,156,12,11,9,28,0,28,6,6,5, -65,40,34,25,255,224,183,119,255,229,195,136,255,171,140,92,255,21,20,18, -142,0,24,11,10,8,102,131,92,46,255,213,145,56,255,214,119,43,255,210, -128,41,255,151,94,32,255,23,21,14,255,10,10,9,85,0,12,10,9,7, -170,191,106,30,255,211,115,30,255,208,114,31,255,141,87,30,255,36,31,19, -255,121,90,42,255,217,168,92,255,205,163,102,255,132,102,59,255,213,172,108, -255,231,193,128,255,35,30,22,255,0,8,11,11,10,164,203,129,50,255,215, -127,42,255,211,117,34,255,166,97,29,255,54,40,21,255,29,23,14,255,38, -31,19,255,120,78,29,255,206,118,33,255,214,127,43,255,224,155,81,255,23, -21,16,255,0,8,11,10,10,170,217,183,116,255,234,201,143,255,232,198,139, -255,202,166,109,255,97,78,50,255,52,46,33,255,58,50,33,255,150,96,39, -255,208,121,37,255,195,112,30,255,83,53,24,255,9,8,6,113,0,8,13, -12,8,96,189,104,28,255,210,120,33,255,214,132,45,255,34,29,19,255,0, -40,17,16,12,170,217,172,102,255,228,180,105,255,228,181,107,255,40,33,23, -255,0,12,17,15,12,170,216,171,101,255,232,191,127,255,231,197,132,255,24, -22,17,255,0,8,11,11,10,167,209,146,72,255,221,151,68,255,213,126,42, -255,172,106,35,255,57,41,22,255,42,32,19,255,43,33,20,252,18,15,11, -85,0,16,11,10,8,170,193,111,30,255,215,113,38,255,220,144,63,255,197, -145,84,255,91,71,44,255,75,62,42,255,75,64,44,255,22,21,17,99,0, -16,14,13,11,170,196,110,33,255,210,115,31,255,210,115,31,255,22,19,11, -227,0,8,16,13,9,113,24,21,15,170,17,15,12,170,18,15,13,170,19, -17,12,142,9,8,8,28,0,8,14,13,11,170,210,146,71,255,220,142,59, -255,213,125,40,255,168,103,33,255,54,40,21,255,29,23,14,255,38,31,19, -255,119,78,30,255,204,116,31,255,210,119,31,255,210,115,31,255,26,20,13, -210,0,8,11,11,10,170,217,179,120,255,234,202,147,255,232,201,141,255,40, -35,25,255,0,40,11,10,8,170,193,111,30,255,211,115,30,255,210,115,31, -255,36,25,13,170,0,8,14,12,9,85,190,105,29,255,210,107,31,255,208, -114,31,255,187,124,42,255,143,111,56,255,210,171,109,255,229,187,128,255,131, -99,54,255,8,8,7,156,0,20,13,12,10,170,194,112,31,255,210,107,31, -255,210,115,31,255,22,19,11,255,0,32,11,10,8,170,193,111,30,255,215, -125,38,255,218,141,59,255,39,33,22,255,5,5,5,28,12,12,11,170,156, -126,83,255,27,24,20,227,5,5,5,23,14,13,11,198,219,177,112,255,232, -191,127,255,230,191,123,255,25,22,16,249,0,8,11,10,8,153,200,120,41, -255,214,127,43,255,213,126,42,255,93,66,32,255,11,11,10,255,34,31,23, -255,206,152,81,255,226,179,111,255,231,189,128,255,232,192,135,255,232,201,141, -255,25,22,18,255,0,8,11,10,10,170,215,171,102,255,228,174,105,255,222, -158,75,255,27,24,16,255,0,12,15,15,12,170,219,177,112,255,232,193,137, -255,232,201,141,255,25,22,18,255,0,8,11,10,10,170,215,172,104,255,228, -182,109,255,221,155,70,255,177,114,46,255,55,42,24,255,35,28,18,255,41, -31,18,255,35,28,17,255,27,22,14,255,17,16,12,187,9,9,8,79,0, -12,10,9,7,170,191,106,30,255,211,115,30,255,210,115,31,255,33,25,14, -255,0,12,21,20,16,170,221,180,116,255,232,193,137,255,232,201,141,255,25, -22,18,255,0,8,11,11,10,170,212,160,85,255,224,156,83,255,218,141,59, -255,175,115,44,255,55,42,24,255,31,25,16,255,38,30,19,255,127,82,30, -255,204,116,31,255,195,112,30,255,82,55,25,255,11,10,8,150,0,12,9, -9,8,28,15,14,12,142,28,25,19,221,46,40,29,255,71,60,38,255,66, -57,39,255,70,61,41,255,193,159,106,255,227,184,108,255,221,153,72,255,155, -98,36,255,13,12,10,170,0,24,17,15,12,170,219,180,112,255,232,197,137, -255,232,201,141,255,40,35,25,255,0,24,14,13,11,170,198,117,37,255,213, -124,38,255,210,121,35,255,23,19,12,255,0,12,11,10,8,170,193,111,30, -255,211,115,30,255,208,114,31,255,23,19,12,207,0,8,14,13,11,85,181, -132,68,255,228,185,117,255,231,193,128,255,54,46,31,255,5,5,4,8,0, -8,21,20,16,178,215,160,88,255,223,147,72,255,206,135,51,255,23,20,14, -170,0,8,12,11,9,102,192,111,31,255,210,108,33,255,208,114,31,255,22, -18,11,255,0,4,10,10,9,113,79,61,38,255,17,16,12,198,0,4,16, -15,13,170,219,179,116,255,231,187,124,255,224,169,91,255,33,28,20,255,0, -20,9,8,8,85,39,33,24,255,217,166,92,255,219,140,56,255,210,121,35, -255,66,44,21,255,7,7,6,133,0,32,6,6,5,74,19,18,12,255,183, -102,30,255,207,105,30,255,210,111,31,255,73,51,24,255,8,8,7,116,0, -24,6,6,6,28,15,13,12,227,144,112,61,255,221,180,116,255,224,178,113, -255,152,116,65,255,18,17,13,221,8,8,7,28,0,24,12,10,9,170,193, -111,30,255,210,107,31,255,210,115,31,255,22,19,11,255,0,28,16,15,13, -227,164,122,63,255,225,185,114,255,192,153,97,255,21,19,16,232,7,7,6, -28,0,24,11,10,8,170,193,111,30,255,211,115,30,255,210,115,31,255,23, -19,12,255,0,148,6,6,5,51,11,9,6,85,12,10,7,102,10,8,5, -156,10,8,5,127,8,7,5,184,27,22,12,255,198,105,29,255,211,122,36, -255,220,136,61,255,25,22,16,255,0,8,10,10,9,170,218,181,123,255,234, -202,147,255,232,197,141,255,30,27,21,255,0,12,9,8,6,170,191,106,30, -255,211,115,30,255,210,111,31,255,39,27,14,170,0,8,12,11,11,170,218, -180,119,255,234,196,143,255,232,201,141,255,29,26,20,255,0,12,7,7,6, -28,27,22,14,156,25,22,14,255,32,25,15,210,22,18,11,28,0,8,10, -9,7,150,195,112,30,255,211,115,30,255,210,115,31,255,19,15,10,252,0, -12,9,9,8,170,191,106,30,255,211,111,30,255,208,114,31,255,25,20,12, -204,0,8,12,11,11,170,218,180,119,255,234,202,147,255,232,201,141,255,142, -111,63,255,14,12,9,227,10,9,7,127,8,7,5,181,35,25,14,255,199, -112,28,255,209,118,30,255,209,117,28,255,30,22,13,255,0,16,9,8,6, -167,191,106,30,255,211,115,30,255,210,115,31,255,19,15,10,252,0,16,21, -19,16,170,220,178,113,255,232,197,137,255,232,201,141,255,26,23,19,255,0, -12,11,11,10,170,218,181,123,255,234,201,143,255,231,197,132,255,24,22,17, -255,0,8,11,10,10,170,218,181,123,255,234,201,143,255,231,197,132,255,30, -26,21,255,0,12,9,8,6,167,191,106,30,255,211,115,30,255,210,111,31, -255,39,27,14,170,0,8,13,12,8,85,190,105,29,255,213,119,36,255,214, -132,45,255,32,26,17,255,0,24,17,16,14,170,221,186,124,255,234,202,147, -255,232,199,135,255,25,22,18,252,0,8,11,10,8,127,192,111,31,255,210, -107,31,255,208,114,31,255,161,94,28,255,65,43,20,255,145,85,26,255,207, -117,30,255,122,75,29,255,15,14,10,170,5,5,4,8,0,16,11,10,8, -170,196,115,35,255,223,146,70,255,228,183,111,255,25,22,16,252,0,8,14, -12,9,85,190,105,29,255,215,125,38,255,218,141,59,255,30,24,17,195,0, -4,10,10,7,170,193,111,30,255,20,17,11,252,0,4,11,10,8,85,188, -103,27,255,211,115,30,255,209,106,30,255,39,27,14,170,0,8,13,12,8, -85,190,105,29,255,211,115,30,255,210,115,31,255,19,15,10,255,0,12,9, -8,6,167,192,111,31,255,218,137,51,255,227,175,100,255,27,24,18,255,0, -8,11,10,8,147,196,106,33,255,210,108,33,255,210,115,31,255,30,23,13, -255,4,4,3,14,0,8,15,14,12,195,211,149,76,255,229,184,114,255,232, -199,135,255,28,25,19,255,0,8,11,10,8,167,203,129,50,255,215,127,42, -255,210,121,35,255,20,17,11,232,0,12,9,8,6,139,190,105,29,255,211, -111,30,255,209,114,30,255,30,22,13,198,0,8,13,12,10,170,217,173,104, -255,232,193,137,255,232,194,139,255,25,22,18,255,0,12,9,8,8,156,192, -111,31,255,210,108,33,255,210,115,31,255,32,24,13,173,0,8,13,12,8, -88,190,105,29,255,211,115,30,255,208,114,31,255,19,15,10,255,0,12,7, -7,6,28,27,22,14,198,45,36,21,255,52,43,29,244,14,13,11,85,0, -8,13,13,12,88,177,143,90,255,230,194,131,255,226,172,95,255,137,91,36, -255,10,9,7,227,8,8,5,161,10,9,7,167,10,9,7,136,13,10,6, -85,7,6,6,74,0,24,9,8,6,167,191,106,30,255,211,115,30,255,210, -115,31,255,19,15,10,252,0,16,12,11,9,170,208,141,61,255,230,187,119, -255,232,201,141,255,40,34,25,255,0,12,14,12,9,170,196,109,31,255,210, -107,31,255,210,115,31,255,36,25,13,170,0,8,10,9,7,85,155,91,28, -255,208,114,31,255,209,106,30,255,30,22,13,255,0,12,22,21,17,176,222, -186,123,255,234,199,143,255,226,195,135,255,35,29,22,178,0,8,12,11,9, -105,190,105,29,255,211,115,30,255,208,114,31,255,23,19,12,210,0,8,15, -12,8,59,7,6,4,3,0,4,9,9,8,159,204,134,59,255,230,182,119, -255,232,198,139,255,39,33,24,255,0,16,10,10,9,34,15,14,10,198,52, -40,21,255,165,96,28,255,198,113,29,255,185,102,28,255,80,53,25,255,19, -17,12,227,10,9,7,76,0,16,11,10,8,170,195,112,30,255,211,115,30, -255,210,115,31,255,20,16,11,255,0,12,10,9,7,170,192,111,31,255,215, -125,38,255,224,159,83,255,41,33,24,255,0,24,7,7,6,108,24,20,13, -255,146,88,31,255,195,127,38,255,113,77,34,255,15,14,12,210,7,7,6, -28,0,16,12,12,11,28,37,30,18,227,168,99,31,255,206,114,33,255,51, -34,18,255,6,5,5,71,0,20,17,16,14,170,221,186,124,255,234,202,147, -255,232,201,141,255,40,35,25,255,0,24,17,15,10,227,198,105,29,255,194, -109,33,255,62,44,23,255,16,14,11,85,0,100,19,17,12,142,214,171,97, -255,228,183,113,255,227,186,108,255,50,40,25,227,0,64,12,11,9,198,214, -158,85,255,229,183,110,255,228,181,107,255,21,19,14,249,2,2,1,20,8, -8,7,181,210,156,79,255,226,169,95,255,224,155,81,255,33,26,18,255,4, -4,4,28,0,40,3,3,2,28,11,10,8,255,209,138,62,255,223,154,72, -255,221,164,82,255,27,23,16,249,0,16,7,7,6,79,46,38,25,255,197, -151,84,255,222,161,89,255,209,128,42,255,141,91,32,255,15,13,10,218,5, -5,5,11,0,28,15,13,10,139,191,131,60,255,220,168,93,255,168,123,69, -255,14,13,11,227,5,5,5,85,9,9,8,170,105,78,40,255,162,116,61, -255,88,66,37,255,23,21,16,255,11,11,10,255,78,58,35,255,208,150,75, -255,61,46,28,181,0,36,15,13,10,170,216,170,97,255,230,187,119,255,228, -178,113,255,34,28,19,255,0,24,15,13,10,170,215,167,92,255,229,179,114, -255,228,181,107,255,32,27,19,255,0,16,6,6,6,25,5,5,4,198,52, -42,27,255,220,169,97,255,189,142,76,255,35,31,22,255,134,96,51,255,225, -176,106,255,140,106,53,255,6,6,5,255,6,6,6,51,0,28,5,5,5, -28,15,13,10,227,208,136,59,255,218,138,53,255,213,122,42,255,43,31,18, -255,5,5,4,85,0,136,9,8,8,57,57,47,30,255,212,163,93,255,224, -157,85,255,124,90,45,255,10,10,9,147,0,20,15,13,10,170,216,170,97, -255,228,181,107,255,224,165,81,255,194,136,61,255,58,46,29,255,12,12,11, -85,0,4,10,9,7,156,174,91,23,255,202,103,23,255,202,102,21,255,20, -16,9,255,0,24,15,13,10,170,213,155,80,255,227,175,100,255,227,171,98, -255,35,29,20,255,0,32,7,7,6,85,49,33,18,255,183,108,34,255,209, -128,42,255,209,137,60,255,186,134,67,255,95,74,39,255,22,20,15,229,8, -8,7,105,0,44,5,4,4,28,17,15,12,227,216,167,89,255,228,181,107, -255,223,176,102,255,34,28,19,184,0,8,12,11,9,108,180,106,33,255,214, -125,39,255,217,141,52,255,42,33,21,255,4,4,4,85,0,8,11,10,8, -198,211,149,76,255,224,160,77,255,220,144,63,255,34,27,17,255,0,40,12, -10,7,170,189,99,26,255,206,102,25,255,203,100,24,255,30,21,11,176,0, -8,12,10,7,85,167,87,22,255,202,103,23,255,202,102,21,255,27,20,10, -255,4,4,3,68,0,4,4,4,4,28,12,10,7,215,176,91,23,255,203, -104,24,255,202,105,27,255,28,21,13,249,0,24,9,8,8,57,57,47,30, -255,213,167,94,255,228,184,115,255,126,92,47,255,9,9,8,147,0,20,13, -12,10,167,199,131,58,255,220,148,63,255,219,147,62,255,49,38,24,255,6, -6,6,85,0,4,5,5,5,28,15,14,12,227,217,169,94,255,228,183,111, -255,225,174,102,255,31,25,18,241,0,36,5,5,5,28,15,13,10,227,204, -127,45,255,219,133,56,255,221,150,66,255,35,28,18,255,0,68,10,9,9, -85,45,34,21,255,201,110,30,255,192,100,25,255,57,35,16,255,12,10,7, -85,0,24,13,11,6,79,126,68,21,255,191,100,26,255,198,117,37,255,208, -139,65,255,213,155,80,255,214,161,85,255,215,167,92,255,216,167,89,255,215, -160,88,255,49,38,24,170,0,24,7,7,6,76,45,36,24,249,207,164,90, -255,228,183,111,255,143,111,56,255,13,12,10,170,0,28,13,12,8,142,182, -99,25,255,203,108,24,255,202,102,21,255,112,65,23,255,15,13,8,227,6, -6,5,45,0,16,10,8,7,170,171,89,22,255,202,95,23,255,202,103,23, -255,103,64,26,255,20,18,13,255,79,61,36,255,222,173,97,255,227,179,104, -255,224,172,97,255,226,171,99,255,224,176,93,255,36,29,19,207,0,8,12, -10,7,113,176,91,23,255,202,95,23,255,202,102,21,255,27,20,10,255,4, -4,3,74,0,4,4,4,4,28,11,9,6,215,187,101,24,255,216,134,45, -255,226,172,95,255,23,21,16,241,0,8,10,10,9,161,212,160,85,255,226, -172,95,255,222,158,75,255,51,39,24,255,6,6,6,85,0,4,4,4,3, -28,11,10,6,215,176,91,23,255,202,102,21,255,191,102,22,255,22,17,9, -170,0,8,12,10,7,85,167,87,22,255,204,105,25,255,217,133,50,255,35, -28,18,255,0,40,15,13,10,170,199,116,34,255,212,114,35,255,218,139,55, -255,33,27,18,255,0,12,15,13,10,170,213,160,84,255,227,175,100,255,224, -165,81,255,25,21,14,235,0,8,13,11,8,108,184,96,25,255,203,96,24, -255,202,95,23,255,27,20,10,255,4,4,3,71,0,28,10,9,7,170,187, -101,24,255,216,134,45,255,224,167,85,255,54,42,27,255,6,6,6,85,0, -28,10,9,7,170,171,89,22,255,202,103,23,255,202,102,21,255,29,21,10, -170,0,4,11,9,6,42,137,77,24,255,211,136,56,255,215,167,92,255,216, -166,95,255,213,163,84,255,33,28,18,161,0,8,11,10,8,130,184,100,25, -255,203,100,24,255,202,102,21,255,27,20,10,255,4,4,3,74,0,4,4, -4,4,28,11,9,6,215,176,91,23,255,202,103,23,255,202,95,23,255,28, -21,11,190,0,8,10,10,9,161,212,161,89,255,228,174,105,255,223,161,80, -255,33,28,18,255,0,40,10,9,7,167,171,89,22,255,202,103,23,255,202, -102,21,255,29,21,10,170,0,8,12,10,7,85,167,87,22,255,202,103,23, -255,203,108,24,255,68,47,25,255,6,6,5,255,31,26,20,255,220,168,93, -255,220,177,101,255,110,80,41,255,12,11,9,150,0,16,10,9,7,170,171, -89,22,255,202,103,23,255,202,102,21,255,20,16,9,255,0,32,10,9,7, -170,193,111,30,255,219,136,54,255,224,165,81,255,27,24,16,255,0,4,7, -7,7,28,21,20,16,181,10,10,9,85,0,4,12,11,9,170,204,130,51, -255,218,141,51,255,211,122,36,255,32,23,13,187,0,8,13,11,8,85,167, -87,22,255,203,100,24,255,208,105,29,255,23,19,12,255,4,4,3,28,11, -10,8,181,211,158,82,255,229,183,110,255,228,183,111,255,228,183,113,255,228, -181,107,255,27,23,16,229,0,8,10,10,9,150,192,111,31,255,208,112,27, -255,203,108,24,255,21,17,10,255,0,12,15,13,10,170,216,170,97,255,229, -183,110,255,228,181,107,255,25,21,16,235,0,8,11,10,8,142,194,116,33, -255,209,106,30,255,203,108,24,255,27,20,10,255,4,4,3,74,0,36,10, -8,7,170,171,89,22,255,202,103,23,255,202,102,21,255,42,28,13,255,6, -5,5,48,0,4,6,6,6,28,21,19,14,255,221,175,102,255,229,179,114, -255,228,181,107,255,24,20,15,246,0,8,12,11,9,127,190,104,27,255,206, -106,25,255,202,103,23,255,27,20,10,255,4,4,3,74,0,4,4,4,4, -28,11,10,6,215,176,91,23,255,204,105,25,255,207,122,38,255,28,22,15, -238,0,36,5,5,5,28,15,13,10,227,195,111,28,255,204,105,25,255,197, -100,22,255,22,17,9,224,0,24,15,13,10,170,216,170,97,255,229,184,114, -255,228,181,107,255,34,28,19,255,0,24,10,9,7,170,174,91,23,255,202, -103,23,255,202,102,21,255,20,16,9,252,0,12,10,9,7,170,171,89,22, -255,202,107,23,255,206,111,27,255,22,17,11,252,0,8,8,7,7,45,73, -59,36,255,218,174,105,255,228,178,107,255,89,67,36,255,7,7,6,113,0, -4,5,5,4,28,20,18,13,255,199,110,30,255,202,105,27,255,88,54,23, -255,10,9,7,113,0,8,13,11,6,85,167,87,22,255,202,95,23,255,202, -90,23,255,32,24,13,255,4,4,3,178,19,16,12,238,212,163,93,255,66, -52,31,255,5,5,5,184,14,13,11,255,205,133,48,255,212,114,35,255,208, -117,29,255,29,22,14,255,0,16,12,11,9,85,101,74,38,255,189,121,49, -255,185,104,32,255,180,98,25,255,180,93,23,255,154,82,23,255,75,44,18, -255,11,9,6,144,0,32,10,9,7,170,157,79,22,255,202,102,21,255,202, -102,21,255,22,17,9,255,0,28,14,13,11,224,136,98,53,255,217,165,82, -255,213,145,56,255,150,92,35,255,19,16,12,173,5,5,5,8,0,28,10, -8,7,170,171,89,22,255,202,103,23,255,202,102,21,255,20,16,9,252,0, -28,7,7,6,59,43,35,24,255,221,175,102,255,223,178,106,255,134,98,51, -255,14,13,11,142,0,24,10,9,7,167,171,89,22,255,202,103,23,255,202, -102,21,255,20,16,9,255,0,144,12,10,7,170,46,29,13,255,140,74,21, -255,165,86,22,255,167,87,22,255,165,86,22,255,167,87,22,255,185,95,22, -255,198,97,23,255,206,111,27,255,221,146,66,255,23,19,14,249,0,8,10, -10,9,153,212,161,89,255,229,183,110,255,224,165,81,255,28,23,15,255,0, -12,10,8,7,156,171,89,22,255,202,103,23,255,202,102,21,255,31,21,10, -170,0,8,10,10,9,167,212,160,85,255,228,177,105,255,222,158,75,255,27, -23,16,255,0,40,10,8,7,170,167,87,22,255,202,103,23,255,202,102,21, -255,20,16,9,238,0,12,10,8,7,164,171,89,22,255,202,103,23,255,203, -100,24,255,22,18,11,235,0,8,10,10,9,167,214,164,93,255,228,182,109, -255,223,154,80,255,207,120,36,255,189,94,24,255,167,87,22,255,167,87,22, -255,187,96,22,255,198,93,23,255,202,93,21,255,198,96,21,255,26,19,9, -227,0,16,10,8,7,167,171,89,22,255,202,103,23,255,202,102,21,255,20, -15,9,252,0,16,17,15,12,170,216,170,97,255,229,183,110,255,224,164,85, -255,29,24,16,255,3,3,2,28,0,8,12,11,9,198,211,149,76,255,221, -151,68,255,219,146,60,255,22,19,13,246,0,8,10,10,9,161,210,155,77, -255,223,147,72,255,213,122,42,255,23,18,12,255,0,12,10,8,7,167,171, -89,22,255,202,103,23,255,202,102,21,255,29,21,10,170,0,8,12,10,7, -85,166,87,23,255,209,118,30,255,218,139,55,255,33,27,18,255,0,24,15, -13,10,170,215,159,92,255,226,169,95,255,218,141,59,255,34,26,15,190,0, -8,13,10,6,85,167,87,22,255,202,103,23,255,198,96,21,255,197,96,22, -255,189,97,22,255,198,96,21,255,198,96,21,255,25,19,10,255,4,4,3, -28,0,20,10,9,7,170,178,92,23,255,210,107,31,255,215,128,44,255,33, -24,14,193,0,8,12,10,7,85,167,87,22,255,202,95,23,255,202,103,23, -255,32,22,11,170,0,4,10,8,7,170,171,89,22,255,24,17,9,249,0, -4,12,10,7,85,163,82,22,255,202,103,23,255,202,102,21,255,29,21,10, -170,0,8,12,10,7,85,166,87,23,255,202,103,23,255,202,102,21,255,20, -15,9,255,0,12,10,8,7,167,170,89,23,255,206,106,25,255,208,115,33, -255,28,21,13,207,0,8,13,10,6,85,167,87,22,255,202,95,23,255,202, -102,21,255,20,16,9,255,0,12,15,13,10,170,214,158,85,255,229,183,110, -255,228,185,111,255,24,20,15,249,0,8,12,11,9,108,176,91,23,255,202, -95,23,255,202,102,21,255,18,15,9,255,2,2,1,8,0,8,8,7,5, -184,171,89,22,255,202,95,23,255,202,102,21,255,34,23,11,173,0,8,12, -11,9,136,212,160,85,255,228,180,105,255,225,165,88,255,31,25,18,255,3, -3,2,28,0,8,8,7,5,178,171,89,22,255,202,103,23,255,202,102,21, -255,30,21,11,170,0,8,12,10,7,85,167,87,22,255,202,103,23,255,202, -102,21,255,20,15,9,255,0,40,7,7,6,28,30,27,21,238,167,111,50, -255,206,110,33,255,199,102,24,255,175,90,22,255,165,86,22,255,167,87,22, -255,167,87,22,255,161,87,22,255,84,48,19,255,18,15,9,227,8,7,5, -28,0,16,10,8,7,167,171,89,22,255,202,103,23,255,202,102,21,255,20, -15,9,252,0,16,15,13,10,170,211,159,76,255,229,180,110,255,228,182,109, -255,34,28,19,255,0,12,10,9,7,170,171,89,22,255,202,103,23,255,202, -102,21,255,31,22,10,170,0,8,7,6,6,28,48,31,15,255,189,93,22, -255,202,102,21,255,45,29,14,255,5,5,4,113,0,4,5,5,4,28,22, -20,15,255,220,169,97,255,226,178,103,255,167,118,54,255,15,13,10,133,0, -8,13,11,6,85,167,87,22,255,202,103,23,255,202,102,21,255,19,15,8, -215,0,4,11,9,6,105,121,65,20,255,26,18,9,190,0,4,9,9,8, -167,208,150,75,255,229,183,110,255,228,181,113,255,37,29,20,255,0,24,8, -8,5,218,167,87,22,255,202,93,21,255,198,104,21,255,23,18,10,255,3, -3,2,51,0,20,10,9,7,153,171,89,22,255,202,95,23,255,202,102,21, -255,20,15,9,255,2,2,1,17,0,8,8,7,5,181,184,100,25,255,215, -119,42,255,224,160,85,255,34,28,19,255,0,20,9,8,6,85,31,22,12, -255,166,87,23,255,189,97,22,255,99,60,22,255,15,13,8,170,0,28,4, -3,3,23,13,11,8,227,182,94,23,255,149,87,26,255,19,17,12,227,7, -7,7,23,0,16,15,13,10,170,216,170,97,255,229,179,114,255,228,182,109, -255,34,28,19,255,0,20,9,8,6,130,69,42,18,255,195,95,22,255,35, -24,12,255,5,5,4,76,0,104,10,9,7,28,27,24,16,184,32,27,19, -255,39,29,20,212,13,12,10,85,0,60,13,11,8,170,81,54,28,255,216, -148,67,255,223,161,72,255,220,147,61,255,117,76,32,255,13,11,8,255,44, -33,19,255,207,123,40,255,217,136,50,255,218,142,53,255,156,100,39,255,18, -15,11,227,10,8,7,28,0,12,15,13,8,125,19,14,10,170,14,11,7, -170,10,8,7,170,11,9,6,122,13,10,8,85,8,7,5,153,46,33,21, -255,212,138,51,255,221,151,68,255,191,132,62,255,19,17,12,176,0,12,7, -7,6,76,26,22,15,241,189,129,58,255,219,152,72,255,217,154,72,255,133, -87,38,255,15,13,10,221,6,6,5,28,0,8,15,12,8,113,20,16,11, -170,17,14,10,142,7,6,6,28,0,8,19,16,12,170,200,117,35,255,212, -123,37,255,115,74,30,255,9,8,6,113,0,8,12,11,9,178,104,73,37, -255,206,147,63,255,178,121,53,255,58,46,29,255,46,36,25,255,40,32,21, -252,19,17,12,85,0,36,12,10,9,164,191,131,60,255,223,161,80,255,221, -151,68,255,46,34,21,255,4,4,3,3,0,20,19,16,12,173,208,134,55, -255,223,156,70,255,216,160,81,255,21,19,14,255,0,16,6,5,5,25,17, -14,10,227,67,48,28,255,94,67,35,255,20,17,13,227,6,6,5,113,12, -11,9,198,67,51,30,255,85,62,32,255,25,20,14,255,9,8,6,82,0, -32,10,8,5,170,161,87,22,255,195,90,20,255,187,91,20,255,19,14,8, -255,0,28,15,12,8,119,20,16,11,170,17,14,10,156,10,8,7,28,0, -64,15,12,8,122,18,15,11,170,17,14,10,144,10,8,7,28,0,16,13, -12,10,170,157,96,36,255,211,123,38,255,199,116,34,255,31,24,16,255,6, -6,6,28,0,20,16,13,11,170,197,110,32,255,209,110,30,255,202,103,23, -255,58,36,15,255,8,7,5,113,0,8,10,8,5,85,137,68,18,255,185, -86,20,255,174,88,19,255,18,13,7,255,0,24,12,10,9,170,204,129,49, -255,220,144,63,255,217,133,50,255,26,20,13,255,0,28,7,6,6,76,23, -19,12,244,185,113,36,255,207,129,52,255,173,117,50,255,59,46,28,255,18, -15,13,198,9,9,8,113,6,6,6,11,0,24,15,12,8,133,22,17,11, -170,17,14,10,142,8,7,5,28,0,12,9,8,6,170,202,128,49,255,220, -148,63,255,219,140,56,255,22,19,13,255,0,8,12,10,9,170,200,125,37, -255,218,141,51,255,220,147,61,255,138,86,35,255,13,10,8,227,11,9,6, -170,13,11,8,198,61,41,22,255,202,111,31,255,204,105,25,255,200,105,21, -255,22,17,9,221,0,12,11,9,6,108,14,11,7,170,11,9,6,139,6, -5,3,17,0,12,9,7,6,133,144,75,19,255,185,86,20,255,178,86,19, -255,27,18,8,170,0,8,11,9,6,85,134,70,19,255,181,88,20,255,180, -87,19,255,24,15,7,178,0,12,10,8,5,99,165,86,22,255,206,111,27, -255,213,124,38,255,36,27,17,255,0,24,10,10,9,133,167,112,48,255,222, -166,77,255,223,157,72,255,54,39,23,255,5,5,4,37,0,20,13,11,8, -170,181,93,22,255,206,111,27,255,214,127,43,255,20,16,11,255,0,12,9, -8,8,170,203,129,50,255,222,145,63,255,220,147,61,255,33,26,16,255,0, -12,12,10,7,113,15,12,8,170,13,10,8,122,0,16,10,8,7,170,200, -120,41,255,220,142,59,255,219,146,60,255,27,21,14,255,0,12,13,11,8, -113,18,15,11,170,17,14,10,142,8,7,5,28,0,12,14,12,9,113,20, -15,11,170,17,14,10,153,10,8,7,28,0,16,9,8,6,85,29,21,10, -255,119,62,20,255,153,79,20,255,40,25,11,255,9,8,6,85,0,20,10, -8,7,28,32,24,13,218,68,47,25,255,61,43,24,255,61,46,28,255,61, -47,28,255,61,47,28,255,66,50,29,255,73,55,32,255,66,48,29,255,24, -20,15,85,0,20,7,6,6,79,32,26,17,244,199,132,54,255,208,150,75, -255,122,87,41,255,17,15,10,170,0,32,10,9,7,28,32,23,11,227,53, -33,14,255,34,23,11,255,12,10,7,190,6,5,5,28,0,20,9,7,4, -170,146,76,19,255,197,99,20,255,204,110,27,255,59,41,22,255,6,6,6, -170,10,9,9,113,31,26,18,184,30,25,17,255,29,25,18,255,34,27,19, -255,37,28,18,221,13,11,8,57,0,8,13,10,6,88,144,75,19,255,185, -86,20,255,178,90,19,255,20,14,7,212,0,12,9,7,4,125,157,81,20, -255,212,117,33,255,220,148,63,255,27,21,14,218,0,8,12,10,9,127,192, -111,31,255,208,112,27,255,202,103,23,255,22,16,9,204,0,12,10,8,5, -93,137,68,18,255,185,94,20,255,180,91,19,255,30,20,9,170,0,8,11, -9,6,85,140,67,19,255,202,106,21,255,214,125,39,255,25,20,14,255,0, -12,6,6,5,28,13,11,8,139,20,16,11,170,19,15,10,142,8,7,5, -28,0,8,10,9,5,142,153,79,20,255,195,90,20,255,206,111,27,255,24, -20,13,255,0,12,12,10,9,170,195,113,32,255,211,115,30,255,203,108,24, -255,31,21,10,173,0,8,11,9,6,85,140,70,19,255,185,86,20,255,180, -87,19,255,24,15,7,181,0,32,9,8,6,170,174,91,23,255,215,123,42, -255,221,150,66,255,25,20,14,255,0,32,9,7,4,170,148,77,19,255,181, -92,20,255,180,87,19,255,25,17,8,170,0,8,34,24,13,170,161,102,38, -255,219,154,70,255,220,142,59,255,213,124,38,255,32,24,13,198,0,8,11, -9,6,85,140,70,19,255,185,86,20,255,178,90,19,255,20,14,7,212,0, -12,8,7,5,127,144,78,19,255,185,86,20,255,180,87,19,255,29,19,10, -170,0,8,13,11,8,116,194,116,33,255,209,110,30,255,202,95,23,255,22, -17,9,221,0,12,10,8,5,85,12,9,5,170,10,8,5,130,6,5,3, -8,0,12,10,8,5,110,144,78,19,255,185,86,20,255,178,86,19,255,27, -18,8,170,0,8,11,8,6,85,137,68,18,255,185,86,20,255,200,105,21, -255,29,21,12,255,4,4,4,25,10,9,7,139,154,100,47,255,215,148,70, -255,198,131,45,255,46,34,19,255,11,9,6,88,0,12,10,8,5,119,144, -78,19,255,185,86,20,255,180,87,19,255,21,15,8,210,0,32,13,11,8, -170,199,119,39,255,220,144,63,255,221,155,70,255,27,21,14,255,0,20,10, -9,7,170,171,89,22,255,195,98,20,255,183,89,19,255,29,20,8,170,0, -8,11,9,6,85,139,70,20,255,202,103,23,255,211,118,36,255,28,21,13, -201,0,4,8,8,7,57,118,84,39,255,215,159,86,255,219,149,66,255,216, -129,45,255,211,121,34,255,34,25,13,178,0,8,11,10,6,88,146,76,19, -255,185,94,20,255,178,90,19,255,24,18,9,255,0,12,18,15,11,170,203, -122,42,255,215,126,40,255,209,106,30,255,32,22,13,184,0,8,12,10,7, -85,143,72,20,255,185,94,20,255,178,90,19,255,20,14,7,210,0,40,9, -7,4,170,148,77,19,255,180,87,19,255,178,86,19,255,30,21,9,255,5, -5,4,37,8,7,5,28,20,17,13,227,133,89,38,255,215,142,56,255,216, -129,45,255,209,115,32,255,26,19,11,210,0,8,11,9,6,85,142,74,19, -255,185,86,20,255,178,90,19,255,20,14,7,210,0,12,9,7,4,122,143, -75,20,255,203,108,24,255,216,129,45,255,30,23,15,255,0,12,12,10,7, -110,16,13,9,170,13,10,8,122,0,16,9,8,6,105,142,74,19,255,185, -86,20,255,180,87,19,255,23,16,8,255,0,24,15,13,10,170,203,122,42, -255,215,126,40,255,209,118,30,255,24,17,11,255,0,24,9,8,4,170,148, -77,19,255,181,92,20,255,180,87,19,255,23,16,8,198,0,12,9,7,6, -139,159,82,20,255,203,100,24,255,212,121,33,255,28,21,13,255,0,12,12, -11,9,119,81,59,34,255,216,153,71,255,173,117,50,255,21,18,14,255,10, -10,9,244,11,10,8,255,60,35,15,255,173,85,20,255,84,49,17,255,13, -10,6,170,0,12,10,8,5,130,146,79,19,255,193,89,20,255,203,104,24, -255,120,77,31,255,19,17,12,255,117,80,36,255,219,154,70,255,178,121,53, -255,20,17,13,255,45,33,18,255,184,94,21,255,195,90,20,255,205,106,26, -255,30,22,13,255,0,12,7,7,6,82,35,28,18,255,196,114,33,255,148, -80,25,255,32,22,11,255,20,15,9,255,26,18,9,255,88,49,17,255,149, -78,20,255,40,26,11,255,9,7,4,85,0,28,9,7,4,127,140,70,19, -255,181,88,20,255,180,87,19,255,18,13,7,235,0,24,10,9,7,93,104, -69,35,255,201,131,48,255,194,109,33,255,65,42,20,255,12,10,7,170,0, -36,9,7,4,170,146,79,19,255,181,88,20,255,180,87,19,255,23,16,8, -198,0,32,15,14,10,198,188,133,61,255,219,149,66,255,194,115,37,255,17, -15,10,244,0,24,10,8,5,113,144,78,19,255,185,86,20,255,180,87,19, -255,18,13,7,255,0,140,7,6,4,65,53,31,12,255,162,83,19,255,185, -94,20,255,130,70,21,255,31,22,10,255,25,19,10,198,22,17,9,246,70, -40,15,255,169,87,20,255,200,105,21,255,212,123,37,255,28,21,13,221,0, -8,12,10,9,133,200,127,41,255,210,120,33,255,202,95,23,255,19,14,8, -238,0,12,10,8,5,110,144,78,19,255,185,86,20,255,178,86,19,255,28, -19,9,170,0,8,12,10,9,133,194,112,31,255,209,110,30,255,202,102,21, -255,21,15,8,235,0,16,9,7,4,57,12,10,5,88,10,8,5,85,0, -12,10,8,5,125,146,79,19,255,181,88,20,255,180,87,19,255,25,17,8, -195,0,12,10,8,5,119,144,78,19,255,185,94,20,255,200,105,21,255,23, -18,10,221,0,8,11,9,8,153,200,123,41,255,212,117,33,255,202,103,23, -255,111,63,20,255,27,20,10,255,20,16,9,246,22,17,9,249,28,20,9, -198,30,21,9,170,24,17,9,215,28,20,9,201,10,8,5,85,0,16,9, -7,4,170,146,79,19,255,181,88,20,255,180,87,19,255,18,13,7,255,0, -16,11,10,8,113,152,104,47,255,214,134,49,255,204,105,25,255,98,54,19, -255,18,13,9,227,13,10,8,170,14,12,9,198,60,41,21,255,199,112,28, -255,202,102,21,255,202,103,23,255,26,19,11,204,0,8,12,11,9,116,187, -101,24,255,202,93,21,255,187,91,20,255,18,13,7,255,0,12,9,7,4, -170,146,79,19,255,181,88,20,255,178,90,19,255,27,17,8,170,0,8,11, -9,6,85,139,70,20,255,202,103,23,255,212,123,37,255,32,24,15,255,0, -24,13,12,10,170,196,114,33,255,206,106,25,255,196,99,21,255,28,19,9, -170,0,8,11,8,6,85,137,68,18,255,181,88,20,255,178,86,19,255,164, -85,21,255,138,73,21,255,175,93,20,255,178,86,19,255,46,28,11,255,6, -5,3,108,0,20,9,7,4,170,146,76,19,255,189,88,20,255,189,88,20, -255,28,19,9,170,0,8,11,9,6,85,137,68,18,255,185,86,20,255,178, -90,19,255,27,17,8,170,0,4,9,7,4,167,146,79,19,255,20,14,7, -252,0,4,11,9,6,85,137,68,18,255,185,94,20,255,178,90,19,255,27, -17,8,170,0,8,11,9,6,85,137,68,18,255,185,86,20,255,180,87,19, -255,18,13,7,255,0,12,9,7,4,170,146,79,19,255,185,94,20,255,183, -85,19,255,27,19,8,170,0,8,11,9,6,85,140,73,19,255,181,88,20, -255,178,90,19,255,20,15,7,255,0,12,16,14,11,170,208,143,59,255,223, -156,70,255,216,135,49,255,28,22,13,210,0,8,11,9,6,85,140,70,19, -255,185,94,20,255,178,90,19,255,72,39,13,255,10,8,5,218,8,6,3, -170,9,7,4,193,39,24,10,255,160,82,19,255,185,94,20,255,144,74,23, -255,16,13,9,170,0,8,10,9,7,85,145,101,48,255,218,149,67,255,210, -115,31,255,99,57,19,255,10,8,5,227,8,6,3,170,9,7,4,190,30, -20,9,255,158,81,19,255,185,94,20,255,178,90,19,255,27,17,8,170,0, -8,11,8,6,85,137,68,18,255,185,86,20,255,180,87,19,255,18,13,7, -255,0,44,9,9,8,28,13,12,8,142,27,20,10,170,29,21,10,193,24, -17,9,252,22,17,9,232,22,17,9,255,87,49,18,255,181,88,20,255,178, -90,19,255,100,54,17,255,11,10,6,150,0,16,9,7,4,170,146,79,19, -255,181,88,20,255,180,87,19,255,18,13,7,255,0,16,15,13,10,170,208, -141,55,255,223,156,70,255,217,133,50,255,23,19,12,255,0,12,10,8,5, -122,144,78,19,255,185,86,20,255,180,87,19,255,30,20,9,176,0,12,12, -10,7,85,39,26,12,255,155,80,20,255,99,55,19,255,19,16,12,255,12, -11,9,255,18,15,11,255,119,84,38,255,209,137,60,255,138,86,35,255,18, -15,11,178,0,12,10,8,5,130,144,78,19,255,181,92,20,255,178,90,19, -255,39,24,10,255,6,5,3,210,29,20,8,255,169,87,20,255,97,53,18, -255,8,7,5,255,26,21,15,255,212,142,59,255,221,151,68,255,218,142,53, -255,34,25,15,255,0,20,5,5,4,82,16,12,7,255,160,82,19,255,185, -86,20,255,185,86,20,255,52,29,11,255,7,6,4,170,0,20,8,7,5, -85,83,46,16,255,181,92,20,255,178,86,19,255,87,47,14,255,10,8,5, -224,8,6,3,170,9,7,4,190,29,20,8,255,195,104,24,255,217,136,50, -255,221,155,70,255,30,23,15,255,0,16,8,7,5,85,26,18,9,255,107, -59,20,255,151,80,22,255,60,34,15,255,11,9,6,170,0,36,8,7,5, -170,159,82,20,255,202,118,35,255,66,51,29,255,9,9,8,96,0,16,15, -13,10,170,208,140,59,255,223,156,70,255,215,133,44,255,27,20,12,255,0, -20,14,12,7,244,131,67,20,255,176,89,19,255,17,12,6,255,0,184,17, -14,10,85,171,95,28,255,206,123,33,255,208,123,31,255,207,112,28,255,202, -107,23,255,191,98,22,255,170,91,21,255,195,107,22,255,209,123,30,255,212, -132,37,255,214,134,39,255,211,133,40,255,202,121,35,255,29,21,12,164,0, -8,12,10,7,82,168,98,29,255,202,121,35,255,196,120,31,255,194,115,31, -255,190,115,27,255,185,101,26,255,184,100,25,255,199,107,26,255,208,123,31, -255,168,105,37,255,25,21,14,227,9,8,8,28,0,8,8,8,7,28,39, -30,18,249,183,122,42,255,211,133,40,255,210,133,43,255,161,106,41,255,15, -13,10,221,5,4,4,17,0,8,14,11,7,113,148,83,25,255,193,108,24, -255,180,93,23,255,27,18,10,153,0,8,12,9,7,122,144,78,19,255,180, -91,19,255,83,46,16,255,7,6,4,184,0,8,4,4,3,85,28,21,13, -255,202,121,35,255,209,132,42,255,131,87,36,255,10,9,7,255,5,5,5, -28,0,40,10,9,7,68,86,62,31,255,206,131,43,255,214,130,39,255,76, -50,25,255,7,6,6,113,0,16,5,5,4,28,21,17,12,255,202,121,35, -255,210,135,37,255,157,100,38,255,18,15,11,150,0,16,18,15,9,91,161, -88,24,255,105,64,28,255,11,10,8,170,0,12,8,7,7,85,40,28,17, -255,174,91,23,255,42,27,13,173,0,32,10,8,5,116,133,66,16,255,161, -85,17,255,161,78,17,255,25,16,8,221,0,24,15,12,8,119,170,99,29, -255,203,126,36,255,199,127,34,255,27,20,12,210,0,60,13,11,8,122,170, -99,29,255,204,127,37,255,199,119,34,255,27,20,12,198,0,12,4,4,3, -11,18,13,9,255,154,79,19,255,174,88,19,255,92,51,17,255,12,10,7, -198,0,24,11,9,6,147,142,74,19,255,171,90,18,255,159,81,18,255,17, -12,6,255,0,12,8,7,5,142,133,66,16,255,161,85,17,255,161,85,17, -255,21,14,6,215,0,24,10,9,7,198,190,107,25,255,203,104,24,255,196, -99,21,255,21,15,8,255,2,2,1,14,0,20,9,8,6,37,35,28,18, -255,183,112,36,255,212,132,37,255,178,118,41,255,27,23,16,255,5,5,4, -198,0,32,15,12,8,105,142,79,23,255,189,97,22,255,160,83,21,255,18, -13,7,218,0,12,10,8,7,198,196,114,33,255,214,129,37,255,212,132,37, -255,27,21,12,210,0,8,13,11,8,116,192,114,31,255,210,125,33,255,209, -123,30,255,203,113,26,255,177,91,22,255,159,82,20,255,160,83,21,255,165, -85,20,255,168,89,19,255,163,86,18,255,161,78,17,255,23,15,6,170,0, -8,9,7,4,57,99,48,14,255,142,73,17,255,133,66,16,255,19,13,6, -190,0,12,7,6,4,164,135,66,16,255,161,85,17,255,161,85,17,255,25, -16,6,170,0,8,10,8,5,85,131,65,16,255,161,85,17,255,161,85,17, -255,19,13,6,227,0,12,10,8,5,176,190,107,25,255,212,127,35,255,214, -134,39,255,30,21,13,255,0,24,12,10,7,170,194,109,33,255,213,132,36, -255,208,122,29,255,28,20,11,255,0,24,9,7,4,147,136,70,17,255,202, -98,21,255,211,126,34,255,27,20,12,255,3,3,2,28,0,8,10,8,7, -195,180,93,23,255,202,102,21,255,202,102,21,255,25,17,10,221,0,8,13, -11,8,65,129,70,22,255,172,88,21,255,144,78,19,255,22,15,7,176,0, -12,10,8,7,198,198,124,37,255,215,136,42,255,214,134,39,255,27,21,12, -212,0,8,12,10,7,79,151,88,26,255,198,116,29,255,192,109,27,255,25, -18,10,167,0,8,12,9,7,82,119,62,20,255,174,89,21,255,154,79,19, -255,22,15,7,181,0,20,5,5,4,68,20,14,7,249,142,73,17,255,143, -74,18,255,45,26,10,255,10,8,5,85,0,76,7,6,6,85,39,30,18, -255,196,121,41,255,213,135,42,255,115,72,30,255,10,9,7,170,0,40,5, -5,4,17,6,5,5,85,5,5,4,45,0,28,9,7,4,142,146,79,19, -255,204,108,23,255,212,126,33,255,30,22,13,255,3,3,3,40,0,36,10, -8,5,125,133,66,16,255,161,85,17,255,161,85,17,255,19,13,6,212,0, -12,10,8,5,127,136,70,17,255,193,97,20,255,203,108,24,255,30,21,11, -193,0,8,13,10,6,85,134,70,19,255,171,90,18,255,159,81,18,255,17, -12,6,238,0,12,8,6,5,144,135,66,16,255,161,85,17,255,161,85,17, -255,23,15,6,170,0,8,10,7,5,85,133,66,16,255,185,94,20,255,209, -123,30,255,23,18,12,255,3,3,2,28,0,4,5,5,4,28,18,15,11, -227,134,72,21,255,158,81,19,255,143,74,18,255,22,15,7,142,0,8,10, -8,5,85,131,65,16,255,163,79,18,255,178,90,19,255,22,16,9,255,3, -2,2,20,0,8,9,7,6,176,144,78,19,255,175,88,18,255,163,79,18, -255,26,16,7,170,0,8,10,8,5,85,129,64,16,255,161,85,17,255,161, -78,17,255,19,13,6,229,0,32,8,7,5,156,144,78,19,255,202,102,21, -255,206,111,27,255,27,20,12,255,0,32,10,8,5,133,135,66,16,255,161, -85,17,255,161,85,17,255,19,13,6,227,0,12,8,7,5,255,172,85,21, -255,189,92,20,255,172,87,19,255,24,16,7,170,0,8,10,8,5,85,129, -64,16,255,161,85,17,255,161,85,17,255,19,13,6,212,0,12,10,8,5, -127,135,66,16,255,161,85,17,255,161,85,17,255,26,16,7,170,0,8,11, -9,6,85,134,70,19,255,171,90,18,255,159,78,18,255,23,15,6,170,0, -8,9,7,4,57,98,49,13,255,139,71,16,255,133,66,16,255,19,13,6, -193,0,12,7,6,4,176,133,66,16,255,161,85,17,255,161,85,17,255,23, -15,6,170,0,8,10,8,5,85,129,64,16,255,165,87,18,255,180,91,19, -255,20,15,9,255,0,4,5,5,4,17,26,21,15,227,126,75,25,255,178, -95,21,255,142,74,19,255,46,28,11,255,10,8,5,57,0,8,10,8,5, -85,131,65,16,255,161,85,17,255,161,85,17,255,17,12,6,252,2,1,1, -8,0,28,13,11,8,170,199,119,34,255,215,136,42,255,214,139,41,255,28, -20,13,255,0,20,8,7,5,170,135,66,16,255,161,85,17,255,161,85,17, -255,23,15,6,170,0,8,10,8,5,85,131,67,16,255,202,102,21,255,211, -127,36,255,22,17,11,249,0,8,16,14,11,201,101,67,28,255,191,98,22, -255,185,94,20,255,172,87,19,255,26,17,7,170,0,8,10,8,5,85,129, -64,16,255,161,85,17,255,161,85,17,255,31,20,8,255,5,5,4,102,0, -4,5,4,4,28,16,13,9,255,164,85,21,255,180,91,19,255,165,87,18, -255,26,17,7,170,0,8,10,8,5,85,129,64,16,255,161,85,17,255,161, -85,17,255,19,13,6,212,0,40,10,8,5,133,135,66,16,255,161,85,17, -255,161,85,17,255,26,17,7,255,3,3,2,136,9,7,4,227,131,67,20, -255,197,104,22,255,198,104,21,255,183,93,19,255,172,87,19,255,26,17,7, -170,0,8,10,8,5,85,129,64,16,255,161,85,17,255,161,85,17,255,19, -13,6,212,0,12,10,8,5,127,135,66,16,255,193,97,20,255,209,123,30, -255,19,15,10,252,0,8,13,11,8,65,125,68,22,255,174,86,21,255,146, -76,19,255,22,14,7,178,0,12,8,6,5,144,135,66,16,255,161,85,17, -255,161,85,17,255,19,14,6,238,0,24,13,11,8,170,163,87,20,255,180, -91,19,255,165,87,18,255,17,12,6,255,0,24,9,7,4,139,135,66,16, -255,161,85,17,255,161,85,17,255,15,11,6,246,0,12,9,7,6,184,180, -93,23,255,211,115,30,255,213,133,38,255,28,20,13,255,0,16,12,11,9, -170,152,91,31,255,188,105,31,255,115,66,22,255,91,50,16,255,84,46,15, -255,116,59,17,255,118,62,17,255,15,11,6,221,0,16,10,8,5,116,146, -79,19,255,202,103,23,255,209,128,32,255,200,127,41,255,167,106,40,255,197, -122,42,255,210,130,35,255,186,106,27,255,88,51,19,255,102,55,17,255,157, -83,18,255,189,92,20,255,209,123,30,255,29,21,12,224,0,8,7,6,6, -28,41,31,18,235,160,84,23,255,170,87,19,255,45,26,10,255,5,5,4, -170,4,4,4,8,4,4,3,99,15,12,6,255,140,72,17,255,138,71,17, -255,45,26,10,255,10,8,5,85,0,24,8,7,5,142,133,66,16,255,161, -85,17,255,161,85,17,255,19,13,6,229,0,24,13,11,8,170,160,86,21, -255,185,90,20,255,91,50,16,255,7,6,4,255,0,40,8,7,5,150,133, -66,16,255,161,85,17,255,161,85,17,255,15,11,6,246,0,32,8,8,7, -110,74,52,27,255,191,103,24,255,176,89,19,255,34,22,9,255,6,5,3, -57,0,20,8,6,5,161,133,66,16,255,161,85,17,255,161,78,17,255,15, -11,6,252,0,140,12,10,5,85,123,61,16,255,161,85,17,255,161,85,17, -255,22,15,7,255,2,2,1,85,0,8,7,6,4,244,133,66,16,255,167, -88,18,255,189,92,20,255,27,19,10,195,0,8,12,10,7,110,160,83,21, -255,177,85,18,255,161,78,17,255,15,11,6,252,0,12,7,6,4,161,133, -66,16,255,161,85,17,255,161,85,17,255,23,15,6,170,0,8,11,9,6, -85,134,70,19,255,171,90,18,255,159,78,18,255,15,11,6,249,0,12,10, -8,5,85,98,49,13,255,135,72,16,255,133,66,16,255,19,13,6,139,0, -8,10,8,5,85,131,65,16,255,161,85,17,255,161,85,17,255,15,11,6, -246,0,12,7,6,4,164,133,66,16,255,165,87,18,255,178,90,19,255,24, -17,9,212,0,8,13,11,8,105,165,86,22,255,180,91,19,255,159,81,18, -255,19,14,6,255,2,2,1,79,0,44,8,6,5,167,133,66,16,255,161, -85,17,255,161,85,17,255,15,11,6,252,0,16,7,6,6,28,24,19,13, -227,103,59,20,255,157,83,18,255,154,78,17,255,150,81,19,255,154,79,19, -255,158,81,19,255,162,83,19,255,161,85,17,255,159,81,18,255,163,86,18, -255,27,18,8,170,0,8,11,9,6,85,131,67,16,255,165,87,18,255,161, -85,17,255,15,11,6,252,0,12,8,6,5,167,133,66,16,255,161,85,17, -255,161,85,17,255,23,15,6,170,0,8,10,8,5,85,131,65,16,255,175, -88,18,255,191,96,20,255,25,18,10,255,0,24,11,9,6,170,148,77,19, -255,169,82,18,255,161,85,17,255,23,15,6,170,0,8,10,8,5,85,129, -64,16,255,161,85,17,255,161,85,17,255,87,47,14,255,23,17,8,255,65, -34,12,255,150,76,17,255,132,68,17,255,41,25,10,255,10,8,5,85,0, -16,8,7,5,150,133,66,16,255,161,85,17,255,161,78,17,255,23,15,6, -170,0,8,10,8,5,85,129,64,16,255,161,85,17,255,161,85,17,255,23, -15,6,170,0,4,8,7,5,153,133,66,16,255,19,13,6,238,0,4,10, -8,5,85,129,64,16,255,161,85,17,255,161,85,17,255,23,15,6,170,0, -8,10,8,5,85,129,64,16,255,161,85,17,255,161,85,17,255,15,11,6, -252,0,12,8,6,5,167,133,66,16,255,161,85,17,255,161,85,17,255,23, -15,6,170,0,8,10,8,5,85,129,64,16,255,161,85,17,255,161,85,17, -255,31,20,8,255,5,4,4,85,0,4,5,4,4,40,17,14,10,255,200, -120,35,255,207,112,28,255,195,98,20,255,29,20,8,170,0,8,10,8,5, -85,131,65,16,255,163,86,18,255,159,81,18,255,150,76,17,255,137,70,16, -255,135,72,16,255,135,66,16,255,146,75,17,255,159,81,18,255,131,67,20, -255,42,31,17,255,10,9,7,62,0,8,5,5,4,8,26,21,15,227,137, -79,28,255,174,88,19,255,158,83,17,255,137,70,16,255,135,72,16,255,135, -66,16,255,146,75,17,255,159,81,18,255,161,85,17,255,161,85,17,255,23, -15,6,170,0,8,10,8,5,85,131,67,16,255,163,86,18,255,159,81,18, -255,17,12,6,255,0,68,2,1,1,8,7,6,4,249,137,67,16,255,165, -80,18,255,154,78,17,255,27,18,8,170,0,16,8,6,5,167,133,66,16, -255,161,85,17,255,161,85,17,255,15,11,6,252,0,16,13,11,8,170,199, -124,36,255,211,125,32,255,200,105,21,255,18,13,7,255,0,12,7,6,4, -164,133,66,16,255,161,85,17,255,161,78,17,255,19,13,6,227,0,16,8, -7,5,122,68,38,13,255,150,83,23,255,174,107,35,255,181,112,38,255,190, -117,39,255,193,114,36,255,143,84,26,255,15,12,8,212,4,4,3,6,0, -12,10,8,5,108,135,66,16,255,161,85,17,255,161,85,17,255,125,65,16, -255,90,47,13,255,121,60,16,255,164,84,19,255,189,97,22,255,177,104,32, -255,194,123,39,255,212,134,41,255,210,124,31,255,200,105,21,255,23,17,8, -218,0,16,10,8,5,167,56,31,11,255,110,55,15,255,118,62,17,255,115, -58,16,255,115,58,16,255,120,63,17,255,95,46,14,255,17,13,6,227,7, -6,4,28,0,16,14,12,7,227,87,43,14,255,154,78,17,255,152,77,17, -255,139,71,16,255,135,72,16,255,135,66,16,255,146,75,17,255,200,105,21, -255,211,127,36,255,214,134,39,255,23,18,12,255,0,12,7,6,4,85,26, -16,7,255,131,67,16,255,145,75,18,255,78,43,15,255,7,6,4,255,0, -40,10,8,5,136,157,81,20,255,210,129,33,255,139,89,36,255,10,9,7, -198,0,16,13,11,8,170,196,113,31,255,206,114,25,255,189,92,20,255,18, -13,7,244,0,16,5,4,4,88,27,19,8,255,141,73,18,255,161,85,17, -255,21,14,6,218,0,112,12,9,7,99,11,8,6,170,10,8,5,91,0, -60,11,10,8,28,32,23,13,227,108,57,19,255,153,82,18,255,154,78,17, -255,146,75,17,255,97,47,14,255,36,24,11,255,108,64,25,255,203,111,30, -255,207,118,32,255,207,118,32,255,189,110,32,255,63,41,20,255,15,12,8, -76,0,8,9,8,6,28,38,27,15,218,51,33,18,255,48,32,17,255,131, -74,24,255,182,97,21,255,176,89,19,255,170,87,19,255,134,72,21,255,37, -25,14,255,15,13,8,144,7,7,6,28,0,12,11,9,8,127,171,99,28, -255,208,123,31,255,203,124,30,255,104,63,27,255,15,13,10,212,7,6,6, -28,0,12,14,11,7,170,142,74,19,255,161,85,17,255,159,81,18,255,27, -18,8,184,0,8,6,5,3,28,27,17,8,227,92,46,13,255,111,55,14, -255,31,20,8,255,8,6,3,198,9,7,4,170,10,8,5,227,22,16,9, -255,61,39,18,255,107,64,26,255,108,66,25,255,32,22,11,255,9,7,6, -170,0,44,10,9,7,156,56,36,19,255,191,114,32,255,175,98,30,255,41, -27,16,255,11,9,6,57,0,12,21,15,10,227,100,56,21,255,160,83,21, -255,80,44,17,255,14,12,7,190,7,6,6,28,0,16,13,10,6,28,29, -20,10,212,21,15,10,144,0,20,12,9,7,85,39,24,10,173,16,12,7, -85,0,32,6,5,3,20,19,13,6,173,21,14,6,255,21,15,6,215,10, -8,5,85,0,24,15,12,8,170,190,98,23,255,203,108,24,255,202,111,23, -255,23,17,10,255,0,60,17,13,10,170,195,112,30,255,211,124,30,255,205, -106,26,255,31,21,12,255,0,12,8,6,5,139,44,25,9,255,135,72,16, -255,104,54,13,255,15,11,6,249,7,6,4,28,0,24,7,6,4,57,44, -25,9,255,137,73,16,255,143,70,16,255,49,25,8,255,8,6,3,184,8, -6,3,85,8,6,3,142,23,16,6,255,130,66,15,255,145,77,16,255,87, -44,12,255,10,8,5,142,0,20,11,9,8,164,53,31,14,255,150,74,19, -255,154,78,17,255,148,76,17,255,65,33,10,255,10,8,5,184,6,5,5, -28,0,16,11,9,6,142,175,102,30,255,207,123,32,255,208,114,31,255,196, -114,33,255,89,56,26,255,17,13,10,255,11,8,6,170,9,7,6,170,11, -8,6,170,15,11,8,170,18,13,9,142,8,6,5,28,0,8,10,8,5, -93,102,53,17,255,159,81,18,255,154,78,17,255,72,37,11,255,11,8,6, -227,9,7,6,170,11,8,6,198,61,36,20,255,196,107,27,255,204,114,27, -255,182,102,31,255,19,14,10,170,0,8,6,6,5,20,26,19,11,198,28, -20,11,255,22,16,9,255,23,16,8,255,27,18,8,255,24,16,7,255,24, -16,7,255,74,39,11,255,139,68,16,255,143,70,16,255,143,70,16,255,20, -13,5,170,0,8,7,6,4,74,87,44,12,255,155,79,18,255,151,73,16, -255,67,34,10,255,9,7,4,198,9,7,4,96,8,6,5,159,27,17,8, -255,137,67,16,255,158,80,17,255,112,56,15,255,10,8,5,167,0,8,7, -5,4,85,74,36,11,255,150,83,17,255,145,77,16,255,55,29,10,255,8, -6,3,198,8,6,3,88,7,6,4,153,39,24,12,255,199,112,28,255,210, -115,31,255,184,108,33,255,17,14,10,198,0,24,11,9,6,170,139,69,18, -255,168,86,19,255,154,78,17,255,17,12,6,235,0,24,7,6,4,85,64, -32,11,255,162,80,19,255,198,96,21,255,109,63,26,255,15,11,8,227,10, -8,7,170,8,7,5,195,29,18,8,255,137,67,16,255,154,78,17,255,114, -59,15,255,11,10,6,164,0,8,9,7,6,85,97,50,16,255,159,81,18, -255,152,77,17,255,74,36,11,255,10,8,5,198,7,6,4,125,10,8,5, -198,61,36,20,255,200,105,29,255,209,122,28,255,180,104,29,255,16,12,9, -170,0,8,12,10,7,170,160,83,21,255,183,89,19,255,174,88,19,255,28, -19,9,187,0,8,14,10,7,85,143,75,20,255,195,98,20,255,189,92,20, -255,21,15,8,224,0,24,7,6,4,85,26,16,7,255,111,55,14,255,132, -67,15,255,39,23,8,255,8,6,3,113,0,68,9,7,6,85,32,22,13, -255,188,112,31,255,193,114,30,255,94,57,25,255,17,13,10,170,0,44,9, -7,4,142,10,8,5,255,10,8,5,198,6,5,3,28,0,24,8,7,5, -85,88,48,19,255,204,114,27,255,208,118,31,255,111,62,26,255,11,8,6, -227,8,7,5,150,10,8,5,116,10,8,5,88,9,7,4,85,6,5,3, -74,0,16,10,8,5,99,114,56,13,255,143,70,16,255,143,70,16,255,18, -12,5,215,0,12,8,7,3,130,118,60,13,255,148,76,17,255,150,76,17, -255,24,16,7,170,0,8,9,7,4,85,114,56,13,255,145,74,16,255,143, -70,16,255,52,28,9,255,8,6,3,198,8,6,3,88,8,6,3,144,23, -15,6,255,130,66,15,255,151,80,16,255,111,55,14,255,10,8,5,144,0, -8,6,5,3,59,59,32,10,255,157,83,18,255,185,90,20,255,97,54,22, -255,14,10,7,227,13,10,6,170,13,10,6,255,84,41,13,255,148,76,17, -255,155,82,18,255,135,66,16,255,14,10,5,159,0,8,9,7,4,85,114, -56,13,255,145,77,16,255,145,74,16,255,55,28,10,255,9,7,4,198,8, -6,3,93,8,6,3,147,25,16,6,255,130,64,15,255,151,80,16,255,111, -55,14,255,10,8,5,142,0,8,9,7,4,85,114,56,13,255,145,77,16, -255,143,70,16,255,52,28,9,255,8,6,3,198,8,6,3,102,8,6,3, -139,8,6,3,170,9,8,4,113,0,12,10,8,5,91,114,56,13,255,150, -76,17,255,150,76,17,255,17,12,6,252,0,32,7,6,4,85,64,33,11, -255,145,77,16,255,143,70,16,255,56,29,9,255,8,6,3,198,8,6,3, -85,6,5,3,119,14,11,5,255,128,66,15,255,151,73,16,255,143,76,16, -255,20,13,5,170,0,8,9,7,4,85,114,56,13,255,143,70,16,255,143, -70,16,255,18,12,5,215,0,12,8,7,3,130,114,56,13,255,143,70,16, -255,143,70,16,255,20,13,5,170,0,8,9,7,4,85,114,56,13,255,143, -70,16,255,143,70,16,255,20,13,5,170,0,8,7,6,4,71,87,44,12, -255,158,87,17,255,161,85,17,255,103,53,20,255,15,11,8,227,10,8,7, -170,10,8,7,195,33,20,10,255,137,67,16,255,151,73,16,255,111,55,14, -255,10,8,5,142,0,8,9,7,4,85,114,56,13,255,143,70,16,255,146, -75,17,255,18,13,7,255,0,8,7,6,6,74,24,16,7,255,132,67,15, -255,145,77,16,255,135,72,16,255,14,10,5,170,0,8,9,7,4,85,114, -56,13,255,145,77,16,255,143,70,16,255,58,31,11,255,11,8,6,227,11, -9,6,170,11,8,6,170,10,7,5,170,9,8,4,113,0,12,11,9,6, -161,175,92,24,255,203,108,24,255,198,101,23,255,25,18,10,255,0,20,8, -6,3,147,114,56,13,255,143,70,16,255,143,70,16,255,20,13,5,170,0, -8,9,7,4,85,114,56,13,255,170,87,19,255,199,106,24,255,24,17,11, -255,0,8,6,6,5,28,15,12,6,255,128,66,15,255,145,74,16,255,143, -70,16,255,20,13,5,170,0,8,6,5,3,57,57,31,10,255,145,77,16, -255,143,70,16,255,90,44,13,255,19,13,6,255,10,8,5,255,13,10,6, -255,62,33,11,255,135,72,16,255,151,73,16,255,108,53,13,255,10,8,5, -142,0,8,9,7,4,85,114,56,13,255,143,70,16,255,143,70,16,255,18, -12,5,215,0,40,7,6,4,85,64,33,11,255,145,77,16,255,143,70,16, -255,67,34,10,255,14,10,5,255,49,27,9,255,140,72,17,255,160,85,19, -255,160,85,19,255,110,55,15,255,31,20,8,255,9,7,4,57,0,8,9, -8,4,85,114,56,13,255,143,70,16,255,143,70,16,255,18,12,5,215,0, -12,8,7,3,136,118,60,13,255,154,75,17,255,172,87,19,255,24,17,9, -204,0,8,8,7,5,85,95,49,16,255,161,85,17,255,152,77,17,255,71, -34,10,255,9,7,4,198,8,6,3,88,8,6,3,142,23,15,6,255,130, -66,15,255,151,80,16,255,111,55,14,255,14,10,5,170,0,24,9,7,4, -164,118,56,15,255,145,74,16,255,143,70,16,255,16,12,5,224,0,24,9, -7,4,85,85,43,12,255,151,80,16,255,143,70,16,255,55,29,10,255,8, -6,3,198,8,6,3,93,8,6,5,173,45,27,14,255,199,112,28,255,210, -124,31,255,199,119,34,255,19,15,10,221,0,20,13,11,8,170,46,28,11, -255,131,65,16,255,145,74,16,255,137,67,16,255,70,35,11,255,12,10,5, -224,7,6,4,28,0,16,8,6,5,34,37,25,14,255,181,100,28,255,206, -113,31,255,207,123,32,255,199,119,34,255,107,67,28,255,28,20,11,255,28, -19,9,255,84,41,13,255,141,75,16,255,145,74,16,255,159,82,20,255,88, -53,25,255,13,11,8,99,0,8,13,10,6,85,114,60,17,255,148,76,17, -255,143,70,16,255,21,14,6,255,0,12,10,8,5,170,119,61,14,255,145, -77,16,255,135,72,16,255,19,13,6,170,0,24,8,7,3,142,114,56,13, -255,143,70,16,255,143,70,16,255,16,12,5,218,0,24,11,8,6,170,126, -62,15,255,151,80,16,255,112,57,13,255,19,13,6,255,8,6,3,144,8, -6,3,85,9,7,4,113,8,6,3,167,8,6,3,170,8,6,3,170,9, -8,4,113,0,12,10,8,5,91,114,56,13,255,145,74,16,255,143,70,16, -255,61,32,10,255,9,8,4,170,0,32,12,10,7,207,74,36,11,255,139, -74,16,255,79,40,12,255,10,8,5,210,0,16,9,7,4,85,27,17,6, -255,130,66,15,255,143,70,16,255,143,76,16,255,16,12,5,221,0,140,8, -6,3,85,74,39,11,255,145,77,16,255,143,70,16,255,41,23,8,255,7, -6,4,173,5,5,2,85,6,5,3,113,14,10,5,255,129,65,14,255,145, -74,16,255,145,74,16,255,24,16,7,170,0,8,10,8,5,85,112,57,13, -255,145,77,16,255,143,70,16,255,52,28,9,255,8,6,3,198,8,6,3, -88,8,6,3,144,23,15,6,255,130,66,15,255,151,80,16,255,111,55,14, -255,10,8,5,144,0,8,6,5,3,59,63,34,10,255,145,77,16,255,143, -70,16,255,55,29,10,255,8,6,3,198,8,6,3,85,8,6,3,144,32, -19,7,255,139,74,16,255,155,79,18,255,135,66,16,255,14,10,5,170,0, -8,6,5,3,57,57,31,10,255,145,77,16,255,143,70,16,255,55,29,10, -255,8,6,3,198,8,6,3,88,8,6,3,144,21,15,6,255,130,66,15, -255,143,76,16,255,146,75,17,255,24,15,7,184,0,8,7,6,4,71,66, -33,11,255,148,79,17,255,143,70,16,255,45,25,8,255,7,5,4,176,7, -5,4,85,8,6,3,85,9,7,4,85,8,6,3,82,0,28,8,7,3, -136,114,56,13,255,143,70,16,255,143,70,16,255,16,12,5,221,0,20,7, -6,4,28,10,8,5,130,19,13,6,170,29,19,8,173,24,16,7,212,27, -18,8,193,20,13,7,246,55,29,10,255,139,74,16,255,143,70,16,255,143, -70,16,255,18,13,5,170,0,8,9,7,4,85,115,54,14,255,143,70,16, -255,143,70,16,255,16,12,5,221,0,12,8,7,3,136,114,56,13,255,143, -70,16,255,143,70,16,255,20,13,5,170,0,8,9,7,4,85,114,56,13, -255,145,74,16,255,145,74,16,255,17,11,6,252,0,24,10,8,5,170,119, -61,14,255,145,74,16,255,143,70,16,255,18,13,5,170,0,8,9,7,4, -85,114,56,13,255,143,70,16,255,143,70,16,255,33,20,8,255,5,4,4, -195,8,6,5,198,46,26,9,255,126,62,15,255,132,67,15,255,35,22,8, -255,9,7,4,93,0,12,10,8,5,93,114,56,13,255,143,70,16,255,143, -70,16,255,20,13,5,170,0,8,9,7,4,85,114,56,13,255,143,70,16, -255,143,70,16,255,20,13,5,170,0,4,9,7,4,125,114,56,13,255,21, -13,6,210,0,4,9,7,4,85,114,56,13,255,143,70,16,255,143,70,16, -255,20,13,5,170,0,8,9,7,4,85,114,56,13,255,143,70,16,255,143, -70,16,255,16,12,5,221,0,12,8,7,3,136,114,56,13,255,143,70,16, -255,143,70,16,255,20,13,5,170,0,8,6,5,3,57,57,31,10,255,145, -77,16,255,143,70,16,255,90,44,13,255,17,12,6,255,12,9,5,255,20, -15,9,255,97,51,20,255,169,87,20,255,161,85,17,255,112,54,15,255,10, -8,5,142,0,8,9,7,4,85,121,60,16,255,174,88,19,255,176,89,19, -255,112,59,17,255,37,23,10,255,26,16,7,255,25,18,8,255,24,15,7, -255,23,16,8,255,18,13,9,198,10,9,7,99,0,16,9,8,6,34,12, -10,7,167,20,14,7,210,21,15,6,255,26,17,7,255,24,16,7,255,26, -17,7,255,70,35,11,255,142,73,17,255,148,76,17,255,152,77,17,255,24, -15,7,170,0,8,13,10,6,96,129,65,18,255,170,87,19,255,170,87,19, -255,24,16,9,255,0,48,5,4,2,76,8,6,3,85,8,6,3,85,8, -6,3,85,7,5,4,85,6,5,3,119,16,11,5,255,129,65,14,255,151, -73,16,255,118,61,15,255,14,10,5,170,0,16,8,7,3,136,114,56,13, -255,143,70,16,255,143,70,16,255,16,12,5,221,0,16,10,8,7,113,109, -67,26,255,184,90,21,255,148,76,17,255,52,28,9,255,8,6,3,198,8, -6,3,88,8,6,3,144,21,15,6,255,130,66,15,255,143,76,16,255,143, -76,16,255,16,12,5,227,0,20,9,8,6,170,67,42,20,255,202,124,31, -255,208,128,33,255,205,106,26,255,104,58,21,255,14,11,7,218,6,5,5, -28,0,16,7,6,4,28,27,17,8,229,102,51,13,255,139,68,16,255,143, -73,16,255,145,74,16,255,71,37,12,255,26,18,9,255,80,50,23,255,204, -122,33,255,208,115,33,255,202,104,25,255,149,78,20,255,52,30,11,255,10, -8,5,85,0,12,14,10,5,170,85,43,12,255,137,73,16,255,77,39,12, -255,14,10,5,227,10,8,5,170,10,8,5,198,46,26,9,255,137,73,16, -255,115,59,14,255,25,16,6,232,8,6,3,31,0,12,6,5,3,28,10, -8,5,119,19,13,6,170,29,19,8,173,26,16,7,210,27,18,8,187,17, -12,6,246,58,30,11,255,151,77,18,255,192,97,21,255,192,97,21,255,24, -16,9,207,0,8,4,4,3,3,25,16,6,235,115,59,14,255,143,73,16, -255,145,77,16,255,108,53,13,255,21,14,6,255,7,6,4,164,10,7,5, -85,8,7,5,147,9,7,4,136,8,6,5,76,0,20,8,6,5,57,58, -33,13,255,188,107,27,255,192,111,31,255,85,51,24,255,18,13,9,187,6, -5,5,20,0,8,11,9,6,156,139,69,18,255,158,83,17,255,148,76,17, -255,23,15,6,170,0,12,9,7,4,85,19,13,6,255,102,51,13,255,128, -66,15,255,81,41,12,255,12,9,5,142,0,108,13,10,8,85,115,60,24, -255,162,75,23,255,121,60,20,255,23,15,8,142,0,60,3,3,2,6,10, -8,5,170,93,48,12,255,123,65,14,255,123,60,14,255,14,10,5,227,3, -3,2,85,12,10,7,170,163,83,24,255,199,99,26,255,193,96,24,255,41, -26,14,227,6,6,5,45,0,24,3,3,2,28,11,8,6,170,106,50,13, -255,129,63,14,255,129,63,14,255,29,18,8,227,6,5,5,31,0,20,13, -10,8,136,144,73,21,255,182,89,21,255,99,55,19,255,14,11,7,187,4, -4,3,3,0,16,9,7,4,113,93,46,12,255,131,66,14,255,121,62,14, -255,16,11,5,170,0,12,7,6,4,28,14,10,5,227,100,50,13,255,110, -59,13,255,103,52,14,255,121,59,18,255,134,69,21,255,32,21,11,255,6, -5,5,198,10,8,7,227,46,28,13,255,104,51,15,255,96,46,13,255,14, -10,5,139,0,44,10,8,7,108,63,37,18,255,176,88,23,255,160,80,21, -255,20,14,9,170,0,8,8,6,5,79,85,41,12,255,131,65,16,255,66, -34,11,255,10,8,5,170,0,144,9,7,4,167,115,56,16,255,165,85,20, -255,112,65,23,255,18,13,9,142,0,60,13,10,8,142,132,68,21,255,162, -80,19,255,141,70,18,255,17,12,6,181,0,12,17,12,6,255,103,54,14, -255,130,66,15,255,31,20,8,255,6,5,3,113,0,32,8,6,3,156,35, -22,8,255,114,58,13,255,110,59,13,255,88,45,11,255,88,42,11,255,92, -47,11,255,104,54,13,255,119,58,14,255,61,32,10,255,10,8,5,224,5, -4,4,20,0,16,11,8,6,85,113,58,22,255,180,90,23,255,140,69,17, -255,123,63,14,255,123,60,14,255,119,56,14,255,120,61,17,255,24,15,9, -167,0,16,12,10,7,133,180,88,27,255,203,107,30,255,199,100,28,255,197, -104,28,255,191,93,28,255,167,78,24,255,132,68,21,255,121,62,18,255,117, -60,18,255,118,57,17,255,108,50,15,255,17,12,6,113,0,12,14,10,5, -227,65,33,10,255,115,59,14,255,115,59,14,255,109,52,14,255,116,57,17, -255,121,59,18,255,139,68,20,255,154,73,19,255,115,62,20,255,33,23,12, -255,9,8,6,71,0,36,2,2,1,8,8,6,3,170,93,50,12,255,125, -64,14,255,123,60,14,255,14,10,5,159,0,12,14,10,5,224,65,33,10, -255,115,59,14,255,115,59,14,255,109,52,14,255,119,61,18,255,129,66,20, -255,148,75,21,255,170,84,21,255,129,67,22,255,37,25,14,255,8,7,5, -57,0,8,5,5,4,23,24,17,9,255,103,54,18,255,132,63,17,255,120, -62,15,255,98,49,13,255,90,45,11,255,94,45,13,255,124,60,17,255,172, -81,21,255,150,78,25,255,44,29,17,255,9,8,6,91,0,24,8,7,3, -102,93,46,12,255,125,64,14,255,121,62,14,255,18,12,5,170,0,28,12, -10,5,227,64,33,11,255,132,66,17,255,158,79,21,255,151,70,22,255,130, -67,21,255,110,53,15,255,108,53,13,255,118,60,13,255,85,43,12,255,21, -14,6,255,7,6,4,57,0,12,14,10,5,227,65,33,10,255,131,65,16, -255,149,72,20,255,133,68,20,255,111,54,16,255,110,53,15,255,138,72,19, -255,163,81,20,255,112,58,19,255,28,20,9,255,8,7,5,57,0,8,9, -7,4,91,96,48,13,255,132,70,15,255,123,60,14,255,14,10,5,161,0, -8,13,10,6,85,148,73,23,255,202,101,27,255,129,67,26,255,18,13,9, -142,0,28,6,5,3,48,17,12,6,227,108,55,13,255,112,55,13,255,35, -22,8,255,9,7,4,57,0,64,32,22,13,255,137,68,22,255,154,73,19, -255,45,26,10,255,8,6,5,144,0,44,8,6,3,68,67,34,10,255,115, -56,16,255,109,52,14,255,16,11,5,147,0,24,5,4,4,11,22,17,11, -227,129,76,28,255,195,95,28,255,186,84,23,255,121,59,18,255,107,51,14, -255,96,46,13,255,90,45,11,255,88,45,11,255,41,24,8,255,12,10,5, -176,0,12,8,6,3,76,88,44,11,255,125,66,14,255,123,60,14,255,18, -12,5,170,0,12,9,7,4,85,92,47,11,255,125,64,14,255,123,60,14, -255,16,11,5,150,0,8,8,6,3,62,88,45,11,255,125,64,14,255,123, -60,14,255,114,58,13,255,93,50,12,255,88,44,11,255,92,47,11,255,104, -54,13,255,119,58,14,255,85,43,12,255,21,15,6,255,7,6,4,51,0, -12,12,10,5,221,61,32,10,255,120,62,15,255,123,61,16,255,109,52,14, -255,96,46,13,255,102,51,13,255,115,59,14,255,123,65,14,255,85,43,12, -255,25,16,6,255,7,6,4,51,0,8,8,6,3,74,88,45,11,255,125, -64,14,255,123,60,14,255,114,58,13,255,93,50,12,255,88,45,11,255,92, -47,11,255,104,52,13,255,118,60,13,255,85,43,12,255,21,15,6,255,7, -5,4,40,0,8,8,6,3,74,88,45,11,255,125,64,14,255,123,60,14, -255,114,58,13,255,93,50,12,255,88,45,11,255,92,43,11,255,93,50,12, -255,93,50,12,255,20,13,5,85,0,8,8,6,3,65,88,45,11,255,125, -64,14,255,121,62,14,255,18,13,5,170,0,36,12,10,5,227,59,31,10, -255,115,62,14,255,114,58,13,255,93,50,12,255,88,44,11,255,88,44,11, -255,104,54,13,255,118,60,13,255,123,60,14,255,123,60,14,255,14,10,5, -150,0,8,8,6,3,65,88,45,11,255,125,66,14,255,123,60,14,255,18, -12,5,170,0,12,9,7,4,85,92,47,11,255,125,66,14,255,123,65,14, -255,14,10,5,150,0,8,8,6,3,65,88,45,11,255,125,66,14,255,123, -65,14,255,14,10,5,159,0,12,14,10,5,221,70,35,11,255,155,74,20, -255,193,89,26,255,185,91,28,255,172,85,27,255,165,80,24,255,155,78,22, -255,132,66,17,255,90,44,13,255,21,15,6,255,7,5,4,40,0,8,8, -6,3,74,88,45,11,255,125,64,14,255,121,62,14,255,19,13,6,176,0, -12,9,6,4,133,93,50,12,255,131,66,14,255,123,65,14,255,14,11,5, -150,0,8,8,6,3,62,88,45,11,255,125,64,14,255,123,60,14,255,118, -56,15,255,120,61,17,255,136,67,21,255,118,57,17,255,96,48,13,255,92, -47,11,255,18,12,5,85,0,8,9,7,4,79,104,51,15,255,140,66,17, -255,135,66,16,255,17,12,6,198,0,20,9,7,4,85,92,47,11,255,125, -66,14,255,123,65,14,255,14,10,5,150,0,8,8,6,3,65,88,45,11, -255,135,66,16,255,136,67,17,255,22,14,7,198,0,12,8,6,3,119,88, -45,11,255,125,64,14,255,123,60,14,255,14,10,5,159,0,12,12,10,5, -210,59,31,10,255,115,62,14,255,118,60,13,255,104,54,13,255,100,50,13, -255,100,50,13,255,114,58,13,255,119,63,14,255,85,43,12,255,21,15,6, -255,7,5,4,40,0,8,8,6,3,74,88,45,11,255,125,66,14,255,123, -60,14,255,18,12,5,170,0,44,12,10,5,227,59,31,10,255,115,62,14, -255,114,58,13,255,100,50,13,255,114,56,13,255,133,66,16,255,160,80,21, -255,176,83,21,255,45,27,12,255,6,5,3,170,0,12,8,6,3,82,88, -45,11,255,125,66,14,255,123,60,14,255,18,12,5,170,0,12,9,7,4, -85,92,47,11,255,131,61,14,255,126,62,15,255,17,11,6,170,0,12,14, -10,5,227,65,33,10,255,115,59,14,255,115,62,14,255,93,50,12,255,88, -44,11,255,92,47,11,255,104,54,13,255,119,58,14,255,85,43,12,255,21, -15,6,255,7,6,4,57,0,24,9,7,4,85,92,47,11,255,125,66,14, -255,123,60,14,255,18,12,5,170,0,24,5,5,4,28,19,13,6,255,84, -42,11,255,115,62,14,255,110,59,13,255,93,50,12,255,84,44,11,255,106, -54,15,255,176,84,23,255,199,100,28,255,188,101,31,255,90,54,25,255,13, -10,8,142,0,24,8,6,3,164,72,37,11,255,131,66,14,255,110,54,13, -255,12,9,5,224,3,3,2,17,0,24,7,6,6,85,30,20,13,255,190, -96,27,255,199,98,24,255,121,69,22,255,13,10,6,190,4,3,3,28,5, -4,2,105,27,17,6,255,114,56,13,255,125,64,14,255,45,26,10,255,8, -7,5,153,0,12,10,7,5,85,96,48,13,255,125,64,14,255,123,60,14, -255,16,11,5,195,0,12,8,6,3,110,92,47,11,255,131,66,14,255,123, -65,14,255,18,13,5,170,0,24,9,7,4,85,92,47,11,255,125,66,14, -255,123,60,14,255,18,12,5,170,0,24,8,7,3,99,93,50,12,255,125, -66,14,255,115,59,14,255,104,54,13,255,88,45,11,255,88,44,11,255,92, -43,11,255,92,43,11,255,92,43,11,255,93,50,12,255,93,50,12,255,20, -13,5,85,0,8,8,6,3,65,88,45,11,255,125,64,14,255,123,60,14, -255,115,62,14,255,93,46,12,255,16,11,5,127,0,28,5,4,4,28,12, -10,5,246,104,54,13,255,115,59,14,255,39,23,8,255,8,6,3,82,0, -12,58,31,9,255,114,58,13,255,119,63,14,255,123,60,14,255,123,65,14, -255,18,12,5,170,0,144,14,10,5,227,59,31,10,255,115,62,14,255,110, -59,13,255,88,44,11,255,80,42,11,255,88,44,11,255,104,54,13,255,115, -59,14,255,123,60,14,255,123,60,14,255,16,11,5,150,0,8,8,6,3, -65,88,44,11,255,125,64,14,255,123,60,14,255,114,58,13,255,93,50,12, -255,88,44,11,255,92,47,11,255,104,54,13,255,119,58,14,255,85,43,12, -255,21,15,6,255,7,6,4,51,0,12,12,9,5,224,63,32,10,255,115, -62,14,255,114,56,13,255,93,50,12,255,88,44,11,255,88,45,11,255,110, -59,13,255,119,61,14,255,85,43,12,255,25,16,6,255,7,6,4,57,0, -12,12,10,5,221,59,31,10,255,115,62,14,255,114,56,13,255,93,50,12, -255,88,44,11,255,92,47,11,255,104,54,13,255,115,59,14,255,123,60,14, -255,121,62,14,255,16,11,5,167,0,12,12,10,5,218,59,31,10,255,115, -62,14,255,110,59,13,255,88,44,11,255,80,42,11,255,88,44,11,255,88, -45,11,255,88,44,11,255,16,11,5,105,0,24,9,7,4,85,92,47,11, -255,125,66,14,255,123,60,14,255,18,12,5,170,0,48,7,5,4,198,93, -50,12,255,125,66,14,255,123,60,14,255,12,10,5,170,0,8,8,6,3, -65,88,45,11,255,125,66,14,255,123,65,14,255,18,12,5,170,0,12,9, -7,4,85,92,47,11,255,125,66,14,255,123,65,14,255,14,10,5,150,0, -8,8,6,3,65,88,45,11,255,125,66,14,255,123,60,14,255,18,13,5, -170,0,20,3,3,2,11,9,7,4,227,100,50,13,255,123,60,14,255,123, -60,14,255,12,10,5,170,0,8,8,6,3,62,88,45,11,255,125,66,14, -255,123,60,14,255,14,10,5,198,0,8,8,6,3,170,35,22,8,255,115, -59,14,255,112,55,13,255,33,21,8,255,8,6,3,37,0,8,8,6,3, -74,88,45,11,255,125,66,14,255,123,65,14,255,14,10,5,150,0,8,8, -6,3,65,88,45,11,255,125,66,14,255,123,65,14,255,14,11,5,147,0, -4,9,7,4,85,92,47,11,255,20,13,5,170,0,4,8,6,3,62,88, -45,11,255,125,66,14,255,123,65,14,255,14,10,5,150,0,8,8,6,3, -65,88,45,11,255,125,66,14,255,123,60,14,255,18,12,5,170,0,12,9, -7,4,85,92,47,11,255,125,66,14,255,123,60,14,255,14,10,5,159,0, -12,12,10,5,210,59,31,10,255,115,59,14,255,118,60,13,255,104,54,13, -255,102,51,13,255,112,53,13,255,122,63,15,255,123,58,14,255,85,43,12, -255,21,15,6,255,7,5,4,45,0,8,8,6,3,85,113,55,16,255,196, -92,23,255,195,96,24,255,25,17,10,255,4,3,3,79,0,64,3,2,2, -28,10,8,5,227,138,71,21,255,177,87,20,255,174,86,21,255,24,16,9, -170,0,8,13,10,8,85,142,73,23,255,195,96,24,255,194,91,23,255,24, -17,11,227,0,44,12,9,5,150,35,22,8,255,80,42,11,255,84,44,11, -255,88,44,11,255,80,42,11,255,88,44,11,255,97,50,12,255,118,60,13, -255,85,43,12,255,21,15,6,255,8,6,3,57,0,16,9,7,4,85,92, -47,11,255,125,66,14,255,123,60,14,255,18,12,5,170,0,16,6,5,5, -28,17,13,8,227,68,34,11,255,115,59,14,255,110,59,13,255,93,50,12, -255,88,44,11,255,92,47,11,255,104,54,13,255,115,59,14,255,123,60,14, -255,123,65,14,255,18,12,5,170,0,24,12,9,7,170,131,69,24,255,191, -90,22,255,136,71,19,255,15,11,6,227,4,3,3,17,0,24,7,6,4, -31,16,11,5,227,104,52,13,255,131,66,14,255,98,49,13,255,10,8,5, -193,3,2,2,68,8,7,5,170,121,66,26,255,195,96,24,255,156,74,19, -255,34,21,9,255,9,7,4,85,0,12,8,6,3,51,69,35,10,255,121, -62,14,255,123,60,14,255,16,11,5,227,4,3,3,28,0,8,8,6,3, -170,92,47,11,255,125,64,14,255,108,55,13,255,14,10,5,164,0,40,7, -5,4,198,96,48,13,255,134,65,15,255,133,66,16,255,15,11,6,170,0, -8,7,5,4,85,78,39,11,255,130,64,15,255,130,64,15,255,134,65,15, -255,136,67,17,255,124,62,17,255,114,56,17,255,113,55,16,255,118,60,17, -255,107,55,20,255,48,29,15,255,12,10,7,85,0,20,9,8,6,170,45, -27,12,255,139,70,20,255,131,66,18,255,107,53,14,255,19,13,6,99,0, -8,8,6,5,85,92,46,13,255,131,61,14,255,125,64,14,255,14,10,5, -170,0,12,58,31,9,255,110,59,13,255,115,59,14,255,56,29,9,255,10, -8,5,227,5,4,4,23,0,108,10,8,7,28,28,18,11,212,49,28,16, -255,35,21,12,241,13,10,6,85,0,68,14,10,5,142,20,14,5,170,16, -12,5,164,8,6,3,28,0,8,24,16,9,142,21,15,8,252,23,15,8, -184,11,8,6,34,0,36,14,10,5,142,20,14,5,170,16,11,5,170,10, -8,5,28,0,24,7,6,4,25,20,13,7,147,22,15,7,170,10,8,5, -142,5,4,4,3,0,24,14,10,5,142,20,13,5,170,16,11,5,170,9, -7,4,28,0,16,7,5,4,28,14,10,5,156,14,10,5,229,24,15,9, -255,32,20,11,255,28,18,11,244,12,9,7,108,0,8,10,8,5,142,19, -13,8,235,24,15,7,227,10,8,5,59,0,48,10,8,5,93,23,15,8, -170,28,18,9,173,15,11,6,28,0,12,18,12,5,142,21,14,6,170,9, -7,4,133,0,148,8,6,5,113,89,44,14,255,100,51,21,255,13,10,8, -227,6,5,5,28,0,60,6,5,5,8,17,12,6,142,26,16,7,170,18, -12,5,170,9,7,4,28,0,8,6,5,3,85,54,28,11,255,136,66,19, -255,121,59,18,255,15,10,6,241,0,40,8,6,3,57,12,9,5,170,18, -13,5,178,14,10,5,241,14,10,5,255,14,10,5,252,16,11,5,195,16, -11,5,170,8,6,3,113,0,24,8,6,5,28,24,16,9,204,24,17,9, -255,17,12,6,210,14,10,5,170,16,11,5,170,17,11,6,246,27,17,10, -246,14,10,7,85,0,16,8,6,5,28,21,14,10,195,22,15,11,255,18, -13,9,255,18,13,9,255,22,15,9,255,19,13,8,255,17,12,6,255,17, -11,6,255,15,11,6,255,17,12,6,255,19,13,6,204,12,9,5,28,0, -12,5,4,2,25,8,6,3,122,14,10,5,170,18,13,5,176,14,10,5, -235,15,11,6,255,15,11,6,255,19,12,6,204,19,13,6,170,10,8,5, -170,8,6,5,57,0,48,14,10,5,142,21,13,6,170,16,11,5,170,9, -7,4,28,0,12,5,4,2,25,8,6,3,125,14,10,5,170,14,10,5, -210,23,15,8,255,30,20,11,255,30,20,11,255,23,17,10,255,20,14,9, -244,16,12,9,170,9,8,6,79,0,16,9,7,6,65,15,11,8,170,17, -12,8,232,21,14,8,255,26,16,9,255,23,15,8,255,21,14,8,255,15, -11,6,255,22,15,7,178,11,9,6,170,10,8,7,57,0,32,12,10,5, -142,20,13,5,170,16,11,5,170,9,7,4,28,0,28,5,5,4,28,8, -6,3,133,15,11,6,193,20,15,9,255,28,18,11,255,30,20,11,255,26, -16,9,255,14,10,5,238,16,11,5,170,9,7,4,153,7,5,4,57,0, -16,5,4,2,28,8,6,3,142,18,12,7,207,22,15,9,255,28,18,11, -255,27,18,10,255,18,13,7,255,15,11,6,227,21,13,6,170,10,7,5, -164,7,6,4,57,0,16,14,10,5,142,20,13,5,170,16,12,5,170,9, -7,4,28,0,8,10,8,7,119,149,64,26,255,131,63,26,255,14,11,7, -227,6,5,5,28,0,32,7,5,4,28,14,10,5,156,20,13,5,170,12, -9,5,142,6,5,3,6,0,64,12,10,7,142,24,15,7,170,21,13,6, -170,8,6,3,76,0,48,9,7,6,85,83,43,16,255,176,88,23,255,130, -62,21,255,16,11,7,170,0,28,9,8,6,28,13,10,8,164,23,16,10, -190,16,11,7,252,15,11,6,255,14,10,5,255,14,10,5,255,14,10,5, -255,16,11,5,232,14,10,5,170,8,6,3,85,0,16,14,10,5,142,21, -13,6,170,16,11,5,170,9,7,4,28,0,16,14,10,5,142,20,13,5, -170,16,11,5,170,9,7,4,28,0,12,14,10,5,136,16,12,5,170,16, -11,5,170,18,12,5,170,16,11,5,210,14,10,5,255,14,10,5,249,16, -12,5,193,16,11,5,170,9,7,4,153,7,5,4,57,0,16,5,5,4, -28,8,6,3,125,14,10,5,170,18,12,5,176,14,10,5,238,14,10,5, -246,16,12,5,195,18,13,5,170,16,11,5,170,9,7,4,150,7,5,4, -54,0,16,14,10,5,142,16,12,5,170,16,11,5,170,18,12,5,170,16, -11,5,210,14,10,5,255,14,10,5,249,16,12,5,193,16,11,5,170,9, -7,4,153,7,6,4,57,0,16,14,10,5,142,16,12,5,170,16,11,5, -170,18,12,5,170,16,11,5,210,14,10,5,252,12,9,5,255,16,11,5, -255,20,13,5,201,11,9,4,28,0,12,14,10,5,139,20,13,5,170,16, -11,5,170,9,7,4,28,0,36,5,5,4,28,8,6,3,125,14,10,5, -170,18,13,5,176,14,10,5,238,14,10,5,255,16,11,5,235,18,13,5, -173,16,11,5,170,16,12,5,170,16,11,5,164,9,7,4,28,0,12,12, -9,5,142,21,13,6,170,16,11,5,170,9,7,4,28,0,16,14,10,5, -142,20,13,5,170,16,11,5,170,9,7,4,28,0,12,12,9,5,142,21, -13,6,170,16,11,5,170,9,7,4,28,0,12,6,5,3,28,8,7,5, -139,19,13,8,193,21,15,10,255,31,21,12,255,32,21,13,255,31,20,12, -255,23,17,10,255,18,12,7,212,10,8,5,159,7,6,4,57,0,16,14, -10,5,142,21,13,6,170,16,11,5,170,9,7,4,28,0,16,14,10,5, -142,21,13,6,170,16,12,5,170,9,7,4,28,0,12,14,10,5,136,16, -12,5,170,16,11,5,170,18,12,5,176,17,12,6,252,21,14,8,255,17, -12,6,255,16,11,5,255,20,13,5,204,11,9,4,28,0,12,14,10,5, -142,21,14,6,170,18,12,5,170,9,8,4,28,0,24,14,10,5,142,20, -13,5,170,16,11,5,170,9,7,4,28,0,12,12,9,5,142,21,13,6, -170,16,12,5,170,10,8,5,28,0,16,12,9,5,142,20,13,5,170,16, -11,5,170,9,7,4,28,0,12,5,5,4,28,8,6,3,125,14,10,5, -170,18,12,5,170,20,14,5,173,16,12,5,193,20,13,5,178,20,13,5, -170,16,11,5,170,9,7,4,153,7,6,4,57,0,16,14,10,5,142,21, -13,6,170,16,11,5,170,9,7,4,28,0,44,5,5,4,28,8,6,3, -125,14,10,5,170,18,13,5,170,20,14,5,170,18,12,5,170,13,10,6, -227,72,38,19,255,185,86,32,255,144,64,29,255,20,15,11,232,8,7,7, -28,0,12,14,10,5,142,21,13,6,170,16,11,5,170,9,7,4,28,0, -16,14,10,5,142,20,13,5,170,16,11,5,170,9,7,4,28,0,12,5, -4,2,25,8,6,3,122,14,10,5,170,18,13,5,176,14,10,5,238,14, -10,5,255,14,10,5,249,16,12,5,193,16,11,5,170,9,7,4,153,7, -5,4,57,0,32,14,10,5,142,21,13,6,170,16,11,5,170,9,7,4, -28,0,28,8,6,3,57,9,7,4,164,14,10,5,170,18,13,5,173,14, -10,5,229,14,10,5,255,17,12,6,255,22,15,9,255,20,14,9,252,21, -15,10,176,11,9,6,139,0,32,11,8,4,122,18,12,5,170,14,10,5, -150,7,5,4,28,0,32,8,7,7,57,24,16,11,173,26,18,9,190,13, -10,6,142,5,4,4,11,0,8,8,7,3,68,14,10,5,170,16,11,5, -170,9,7,4,74,0,20,14,10,5,142,20,14,5,170,16,11,5,170,9, -7,4,28,0,16,14,10,5,142,20,14,5,170,16,11,5,170,9,8,4, -28,0,28,14,10,5,142,20,13,5,170,16,11,5,170,9,7,4,28,0, -28,14,10,5,142,18,13,5,170,16,12,5,170,18,13,5,173,14,10,5, -227,14,10,5,255,14,10,5,252,12,9,5,255,12,9,5,255,16,11,5, -255,20,13,5,201,11,9,4,28,0,12,12,10,5,136,16,12,5,170,16, -11,5,170,16,11,5,193,21,15,6,184,14,10,5,31,0,32,8,6,3, -139,54,30,9,255,107,50,12,255,78,39,11,255,9,7,4,161,0,12,20, -13,5,142,18,12,5,210,16,11,5,170,16,11,5,170,16,11,5,170,9, -7,4,28,0,64,13,10,8,57,9,7,6,159,8,6,5,159,10,8,7, -130,10,8,7,119,9,7,6,133,9,7,6,167,10,8,7,170,11,9,8, -113,0,44,5,4,2,28,8,6,3,125,14,10,5,170,18,13,5,176,14, -10,5,238,14,10,5,255,16,11,5,235,18,13,5,173,16,11,5,170,16, -12,5,170,16,11,5,164,9,7,4,28,0,12,14,10,5,136,16,12,5, -170,16,11,5,170,18,12,5,170,16,11,5,210,14,10,5,255,14,10,5, -249,16,12,5,193,16,11,5,170,9,7,4,153,7,5,4,57,0,16,5, -5,4,28,8,6,3,125,14,10,5,170,18,13,5,176,14,10,5,238,14, -10,5,255,14,10,5,249,16,11,5,193,16,11,5,170,9,7,4,150,7, -5,4,57,0,16,5,5,4,28,8,6,3,125,14,10,5,170,18,13,5, -176,14,10,5,238,14,10,5,255,14,10,5,235,18,13,5,173,16,11,5, -170,16,12,5,170,16,11,5,170,9,7,4,28,0,12,5,5,4,28,8, -6,3,125,14,10,5,170,18,13,5,176,14,10,5,235,14,10,5,255,14, -10,5,255,16,11,5,255,20,13,5,207,12,9,5,34,0,28,14,10,5, -142,20,13,5,170,16,11,5,170,9,7,4,28,0,28,6,5,3,85,7, -5,4,85,6,5,3,85,5,4,4,85,5,4,4,105,9,8,4,241,72, -37,11,255,110,54,13,255,67,34,10,255,8,6,3,144,0,12,14,10,5, -142,21,14,6,170,16,12,5,170,9,8,4,28,0,16,14,10,5,142,21, -13,6,170,16,11,5,170,9,7,4,28,0,12,12,9,5,142,21,13,6, -170,16,11,5,170,9,7,4,28,0,12,7,5,2,37,8,6,3,142,8, -6,3,227,25,15,6,255,75,36,10,255,99,51,12,255,66,33,9,255,8, -6,3,130,0,12,14,10,5,139,21,13,6,170,16,11,5,170,9,7,4, -28,0,12,8,6,3,79,14,10,5,170,18,13,5,170,12,9,5,142,0, -16,14,10,5,142,21,13,6,170,16,11,5,170,9,7,4,28,0,12,12, -9,5,142,21,13,6,170,16,11,5,170,9,7,4,28,0,8,20,13,5, -85,11,8,4,28,0,8,12,9,5,142,21,13,6,170,16,11,5,170,9, -7,4,28,0,12,12,9,5,142,21,13,6,170,16,11,5,170,9,7,4, -28,0,16,14,10,5,142,20,13,5,170,16,11,5,170,9,7,4,28,0, -12,5,5,4,28,8,6,3,125,14,10,5,170,18,12,5,170,20,14,5, -173,16,12,5,193,20,13,5,178,20,13,5,170,16,11,5,170,9,7,4, -161,7,6,4,57,0,12,8,6,3,85,84,40,13,255,164,73,23,255,184, -79,27,255,15,11,8,246,0,72,11,10,10,170,176,83,37,255,196,87,33, -255,192,88,31,255,22,15,11,193,0,12,21,15,10,159,26,17,11,255,24, -17,11,221,10,8,7,85,0,44,8,7,3,59,12,9,5,170,16,11,5, -210,14,10,5,255,14,10,5,255,14,10,5,255,14,10,5,246,16,12,5, -193,16,11,5,170,9,7,4,153,6,5,3,57,0,24,14,10,5,142,20, -13,5,170,16,11,5,170,9,7,4,28,0,20,6,5,3,28,8,6,3, -127,14,10,5,170,18,13,5,176,14,10,5,238,14,10,5,255,14,10,5, -235,18,13,5,173,16,11,5,170,16,12,5,170,16,11,5,170,9,7,4, -28,0,28,14,11,7,142,29,19,8,170,17,11,6,159,8,6,3,28,0, -32,7,5,4,28,14,10,5,150,20,13,5,170,12,9,5,142,5,4,2, -14,0,8,15,11,8,142,26,18,9,178,19,13,6,170,8,6,3,68,0, -20,18,12,5,142,16,11,5,238,16,11,5,170,9,7,4,28,0,16,12, -9,5,142,16,11,5,215,18,13,5,187,11,9,4,28,0,16,4,4,3, -6,5,4,2,82,5,4,2,85,5,4,2,85,5,4,2,85,5,4,2, -99,9,7,4,241,72,37,11,255,112,53,13,255,77,39,12,255,10,8,5, -170,0,12,19,13,8,184,20,14,9,255,16,11,7,255,14,11,7,255,17, -12,8,255,22,15,9,255,27,17,10,255,30,19,11,255,28,18,11,255,21, -15,10,255,15,12,8,198,9,7,6,28,0,24,8,6,5,91,15,11,6, -170,14,11,5,238,19,13,6,198,12,9,5,28,0,8,6,5,3,85,54, -29,9,255,100,48,13,255,109,52,14,255,15,11,6,170,0,12,19,13,6, -144,14,10,5,255,16,11,5,178,8,6,3,119,0,255,0,255,0,174,12, -9,7,88,99,44,20,255,26,16,11,232,5,4,4,28,0,92,6,5,3, -57,60,28,11,255,158,67,23,255,88,44,23,255,11,9,6,142,0,255,0, -255,0,150,12,9,7,110,126,51,25,255,25,17,12,232,5,4,4,28,0, -184,6,5,5,28,19,14,10,227,52,29,17,255,30,20,13,255,9,8,6, -82,0,255,0,255,0,255,0,255,0,8,12,10,9,170,172,81,49,255,213, -125,94,255,185,88,58,255,23,16,14,159,0,255,0,255,0,106,5,4,2, -28,16,11,5,244,68,34,9,255,62,33,9,255,9,8,4,139,0,96,10, -8,7,48,71,33,18,255,108,47,23,255,107,48,22,255,113,51,24,255,109, -50,24,255,104,45,21,255,104,45,21,255,113,49,24,255,115,50,24,255,18, -13,9,136,0,255,0,129,9,7,6,34,18,13,9,244,66,31,15,255,84, -37,17,255,83,36,16,255,75,34,14,255,73,35,14,255,91,41,16,255,110, -47,19,255,79,40,16,255,24,16,9,255,8,6,5,57,0,100,22,14,5, -244,40,23,7,255,42,23,7,255,54,28,9,255,60,31,9,255,36,22,7, -255,12,9,5,244,6,5,3,28,0,255,0,29,9,7,6,85,72,34,13, -255,126,56,21,255,148,63,25,255,25,17,14,190,0,72,15,12,12,133,178, -86,57,255,200,89,55,255,194,82,47,255,30,20,17,187,0,255,0,169,9, -7,4,99,17,12,6,255,42,22,9,255,49,25,9,255,54,26,11,255,52, -26,11,255,59,28,12,255,82,37,15,255,111,49,18,255,84,39,17,255,25, -17,10,255,8,7,5,57,0,112,6,5,3,57,38,22,7,255,85,39,12, -255,124,52,21,255,20,13,9,170,0,255,0,255,0,202,8,6,5,28,26, -16,11,170,11,8,6,85,0,100,12,8,5,119,20,14,9,170,12,9,7, -142,0,255,0,255,0,154,9,7,6,28,27,17,12,170,11,9,8,85,0, -192,7,6,6,28,8,7,5,85,8,6,5,57,0,255,0,255,0,255,0, -255,0,16,25,17,16,161,41,27,26,255,40,26,23,235,14,12,11,82,0, -255,0,255,0,110,8,6,3,37,9,7,4,142,9,7,4,136,6,5,3, -6,0,100,23,15,10,153,19,13,10,255,16,11,9,255,16,11,9,255,16, -11,9,255,16,11,9,255,16,11,9,255,18,13,9,255,24,16,11,204,16, -11,9,31,0,255,0,133,10,8,7,142,18,12,9,207,18,13,9,255,16, -11,9,255,15,11,8,255,15,11,8,252,18,13,9,195,18,12,9,170,11, -8,6,167,8,7,5,57,0,104,9,8,4,142,14,10,5,170,13,10,6, -170,13,9,6,170,11,8,6,170,7,6,4,130,6,5,3,28,0,255,0, -37,14,10,7,142,21,14,10,170,19,13,10,170,14,11,9,31,0,72,8, -7,8,14,25,17,16,142,27,18,16,193,26,18,15,170,15,11,10,34,0, -255,0,169,9,7,4,28,11,8,6,170,14,10,7,232,15,10,8,255,15, -10,8,255,15,10,8,255,15,10,8,252,18,12,9,195,18,12,9,170,11, -8,6,167,9,7,6,57,0,120,9,7,4,91,16,11,7,170,20,13,9, -170,13,10,8,28,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0, -255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0, -255,0,255,0,255}}; - /* Created by MiniCompress.. an iOS RLE compressor. - * Compress Rate : 46.36 % - */ diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/gfontrle.h kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/gfontrle.h --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/gfontrle.h 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/gfontrle.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ -extern const struct { - unsigned int width; - unsigned int height; - unsigned int bytes_per_pixel; - unsigned int rle_size; - unsigned char rle_pixel [49725]; -} the_font ; diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/goom_config.h kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/goom_config.h --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/goom_config.h 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/goom_config.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,28 +0,0 @@ -#if WORDS_BIGENDIAN -#define COLOR_ARGB -#else -#define COLOR_BGRA -#endif - -#if 1 -/* ndef COLOR_BGRA */ -/** position des composantes **/ - #define BLEU 2 - #define VERT 1 - #define ROUGE 0 - #define ALPHA 3 -#else - #define ROUGE 1 - #define BLEU 3 - #define VERT 2 - #define ALPHA 0 -#endif - -#ifndef guint32 -#define guint8 unsigned char -#define guin16 unsigned short -#define guint32 unsigned int -#define gint8 signed char -#define gint16 signed short int -#define gint32 signed int -#endif diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/goom_config_param.h kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/goom_config_param.h --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/goom_config_param.h 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/goom_config_param.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,115 +0,0 @@ -#ifndef _CONFIG_PARAM_H -#define _CONFIG_PARAM_H - -#include - -/** - * File created on 2003-05-24 by Jeko. - * (c)2003, JC Hoelt for iOS-software. - * - * LGPL Licence. - */ - -typedef enum { - PARAM_INTVAL, - PARAM_FLOATVAL, - PARAM_BOOLVAL, - PARAM_STRVAL, - PARAM_LISTVAL, -} ParamType; - -struct IntVal { - int value; - int min; - int max; - int step; -}; -struct FloatVal { - float value; - float min; - float max; - float step; -}; -struct StrVal { - char *value; -}; -struct ListVal { - char *value; - int nbChoices; - char **choices; -}; -struct BoolVal { - int value; -}; - - -typedef struct _PARAM { - char *name; - char *desc; - char rw; - ParamType type; - union { - struct IntVal ival; - struct FloatVal fval; - struct StrVal sval; - struct ListVal slist; - struct BoolVal bval; - } param; - - /* used by the core to inform the GUI of a change */ - void (*change_listener)(struct _PARAM *_this); - - /* used by the GUI to inform the core of a change */ - void (*changed)(struct _PARAM *_this); - - void *user_data; /* can be used by the GUI */ -} PluginParam; - -#define IVAL(p) ((p).param.ival.value) -#define SVAL(p) ((p).param.sval.value) -#define FVAL(p) ((p).param.fval.value) -#define BVAL(p) ((p).param.bval.value) -#define LVAL(p) ((p).param.slist.value) - -#define FMIN(p) ((p).param.fval.min) -#define FMAX(p) ((p).param.fval.max) -#define FSTEP(p) ((p).param.fval.step) - -#define IMIN(p) ((p).param.ival.min) -#define IMAX(p) ((p).param.ival.max) -#define ISTEP(p) ((p).param.ival.step) - -PluginParam goom_secure_param(void); - -PluginParam goom_secure_f_param(char *name); -PluginParam goom_secure_i_param(char *name); -PluginParam goom_secure_b_param(char *name, int value); -PluginParam goom_secure_s_param(char *name); - -PluginParam goom_secure_f_feedback(char *name); -PluginParam goom_secure_i_feedback(char *name); - -void goom_set_str_param_value(PluginParam *p, const char *str); -void goom_set_list_param_value(PluginParam *p, const char *str); - -typedef struct _PARAMETERS { - char *name; - char *desc; - int nbParams; - PluginParam **params; -} PluginParameters; - -PluginParameters goom_plugin_parameters(const char *name, int nb); - -#define secure_param goom_secure_param -#define secure_f_param goom_secure_f_param -#define secure_i_param goom_secure_i_param -#define secure_b_param goom_secure_b_param -#define secure_s_param goom_secure_s_param -#define secure_f_feedback goom_secure_f_feedback -#define secure_i_feedback goom_secure_i_feedback -#define set_list_param_value goom_set_list_param_value -#define set_str_param_value goom_set_str_param_value -#define plugin_parameters goom_plugin_parameters - -#endif diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/goom_core.c kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/goom_core.c --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/goom_core.c 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/goom_core.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,895 +0,0 @@ -/** -* file: goom_core.c - * author: Jean-Christophe Hoelt (which is not so proud of it) - * - * Contains the core of goom's work. - * - * (c)2000-2003, by iOS-software. - */ - -#include -#include -#include -#include -#include - -#include "goom.h" -#include "goom_tools.h" -#include "goom_filters.h" -#include "lines.h" -#include "ifs.h" -#include "tentacle3d.h" -#include "gfontlib.h" - -#include "sound_tester.h" -#include "goom_plugin_info.h" -#include "goom_fx.h" -#include "goomsl.h" - -/* #define VERBOSE */ - -#define STOP_SPEED 128 -/* TODO: put that as variable in PluginInfo */ -#define TIME_BTW_CHG 300 - -static void choose_a_goom_line (PluginInfo *goomInfo, float *param1, float *param2, int *couleur, - int *mode, float *amplitude, int far); - -static void update_message (PluginInfo *goomInfo, char *message); - -static void init_buffers(PluginInfo *goomInfo, int buffsize) -{ - goomInfo->pixel = (guint32 *) malloc (buffsize * sizeof (guint32) + 128); - bzero (goomInfo->pixel, buffsize * sizeof (guint32) + 128); - goomInfo->back = (guint32 *) malloc (buffsize * sizeof (guint32) + 128); - bzero (goomInfo->back, buffsize * sizeof (guint32) + 128); - goomInfo->conv = (Pixel *) malloc (buffsize * sizeof (guint32) + 128); - bzero (goomInfo->conv, buffsize * sizeof (guint32) + 128); - - goomInfo->outputBuf = goomInfo->conv; - - goomInfo->p1 = (Pixel *) ((1 + ((uintptr_t) (goomInfo->pixel)) / 128) * 128); - goomInfo->p2 = (Pixel *) ((1 + ((uintptr_t) (goomInfo->back)) / 128) * 128); -} - -/************************** -* INIT * -**************************/ -PluginInfo *goom_init (guint32 resx, guint32 resy) -{ - PluginInfo *goomInfo = (PluginInfo*)malloc(sizeof(PluginInfo)); - -#ifdef VERBOSE - printf ("GOOM: init (%d, %d);\n", resx, resy); -#endif - - plugin_info_init(goomInfo,4); - - goomInfo->star_fx = flying_star_create(); - goomInfo->star_fx.init(&goomInfo->star_fx, goomInfo); - - goomInfo->zoomFilter_fx = zoomFilterVisualFXWrapper_create (); - goomInfo->zoomFilter_fx.init(&goomInfo->zoomFilter_fx, goomInfo); - - goomInfo->tentacles_fx = tentacle_fx_create(); - goomInfo->tentacles_fx.init(&goomInfo->tentacles_fx, goomInfo); - - goomInfo->convolve_fx = convolve_create(); - goomInfo->convolve_fx.init(&goomInfo->convolve_fx, goomInfo); - - plugin_info_add_visual (goomInfo, 0, &goomInfo->zoomFilter_fx); - plugin_info_add_visual (goomInfo, 1, &goomInfo->tentacles_fx); - plugin_info_add_visual (goomInfo, 2, &goomInfo->star_fx); - plugin_info_add_visual (goomInfo, 3, &goomInfo->convolve_fx); - - goomInfo->screen.width = resx; - goomInfo->screen.height = resy; - goomInfo->screen.size = resx * resy; - - init_buffers(goomInfo, goomInfo->screen.size); - goomInfo->gRandom = goom_random_init((uintptr_t)goomInfo->pixel); - - goomInfo->cycle = 0; - - goomInfo->ifs_fx = ifs_visualfx_create(); - goomInfo->ifs_fx.init(&goomInfo->ifs_fx, goomInfo); - - goomInfo->gmline1 = goom_lines_init (goomInfo, resx, goomInfo->screen.height, - GML_HLINE, goomInfo->screen.height, GML_BLACK, - GML_CIRCLE, 0.4f * (float) goomInfo->screen.height, GML_VERT); - goomInfo->gmline2 = goom_lines_init (goomInfo, resx, goomInfo->screen.height, - GML_HLINE, 0, GML_BLACK, - GML_CIRCLE, 0.2f * (float) goomInfo->screen.height, GML_RED); - - gfont_load (); - - /* goom_set_main_script(goomInfo, goomInfo->main_script_str); */ - - return goomInfo; -} - - - -void goom_set_resolution (PluginInfo *goomInfo, guint32 resx, guint32 resy) -{ - free (goomInfo->pixel); - free (goomInfo->back); - free (goomInfo->conv); - - goomInfo->screen.width = resx; - goomInfo->screen.height = resy; - goomInfo->screen.size = resx * resy; - - init_buffers(goomInfo, goomInfo->screen.size); - - /* init_ifs (goomInfo, resx, goomInfo->screen.height); */ - goomInfo->ifs_fx.free(&goomInfo->ifs_fx); - goomInfo->ifs_fx.init(&goomInfo->ifs_fx, goomInfo); - - goom_lines_set_res (goomInfo->gmline1, resx, goomInfo->screen.height); - goom_lines_set_res (goomInfo->gmline2, resx, goomInfo->screen.height); -} - -int goom_set_screenbuffer(PluginInfo *goomInfo, void *buffer) -{ - goomInfo->outputBuf = (Pixel*)buffer; - return 1; -} - -/******************************************** -* UPDATE * -******************************************** - -* WARNING: this is a 600 lines function ! (21-11-2003) -*/ -guint32 *goom_update (PluginInfo *goomInfo, gint16 data[2][512], - int forceMode, float fps, char *songTitle, char *message) -{ - Pixel *return_val; - guint32 pointWidth; - guint32 pointHeight; - int i; - float largfactor; /* elargissement de l'intervalle d'volution des points */ - Pixel *tmp; - - ZoomFilterData *pzfd; - - /* test if the config has changed, update it if so */ - pointWidth = (goomInfo->screen.width * 2) / 5; - pointHeight = ((goomInfo->screen.height) * 2) / 5; - - /* ! etude du signal ... */ - evaluate_sound (data, &(goomInfo->sound)); - - /* goom_execute_main_script(goomInfo); */ - - /* ! calcul du deplacement des petits points ... */ - largfactor = goomInfo->sound.speedvar / 150.0f + goomInfo->sound.volume / 1.5f; - - if (largfactor > 1.5f) - largfactor = 1.5f; - - goomInfo->update.decay_ifs--; - if (goomInfo->update.decay_ifs > 0) - goomInfo->update.ifs_incr += 2; - if (goomInfo->update.decay_ifs == 0) - goomInfo->update.ifs_incr = 0; - - if (goomInfo->update.recay_ifs) { - goomInfo->update.ifs_incr -= 2; - goomInfo->update.recay_ifs--; - if ((goomInfo->update.recay_ifs == 0)&&(goomInfo->update.ifs_incr<=0)) - goomInfo->update.ifs_incr = 1; - } - - if (goomInfo->update.ifs_incr > 0) - goomInfo->ifs_fx.apply(&goomInfo->ifs_fx, goomInfo->p2, goomInfo->p1, goomInfo); - - if (goomInfo->curGState->drawPoints) { - for (i = 1; i * 15 <= goomInfo->sound.speedvar*80.0f + 15; i++) { - goomInfo->update.loopvar += goomInfo->sound.speedvar*50 + 1; - - pointFilter (goomInfo, goomInfo->p1, - YELLOW, - ((pointWidth - 6.0f) * largfactor + 5.0f), - ((pointHeight - 6.0f) * largfactor + 5.0f), - i * 152.0f, 128.0f, goomInfo->update.loopvar + i * 2032); - pointFilter (goomInfo, goomInfo->p1, ORANGE, - ((pointWidth / 2) * largfactor) / i + 10.0f * i, - ((pointHeight / 2) * largfactor) / i + 10.0f * i, - 96.0f, i * 80.0f, goomInfo->update.loopvar / i); - pointFilter (goomInfo, goomInfo->p1, VIOLET, - ((pointHeight / 3 + 5.0f) * largfactor) / i + 10.0f * i, - ((pointHeight / 3 + 5.0f) * largfactor) / i + 10.0f * i, - i + 122.0f, 134.0f, goomInfo->update.loopvar / i); - pointFilter (goomInfo, goomInfo->p1, BLACK, - ((pointHeight / 3) * largfactor + 20.0f), - ((pointHeight / 3) * largfactor + 20.0f), - 58.0f, i * 66.0f, goomInfo->update.loopvar / i); - pointFilter (goomInfo, goomInfo->p1, WHITE, - (pointHeight * largfactor + 10.0f * i) / i, - (pointHeight * largfactor + 10.0f * i) / i, - 66.0f, 74.0f, goomInfo->update.loopvar + i * 500); - } - } - - /* par dfaut pas de changement de zoom */ - pzfd = NULL; - - /* - * Test forceMode - */ -#ifdef VERBOSE - if (forceMode != 0) { - printf ("forcemode = %d\n", forceMode); - } -#endif - - - /* diminuer de 1 le temps de lockage */ - /* note pour ceux qui n'ont pas suivis : le lockvar permet d'empecher un */ - /* changement d'etat du plugin juste apres un autre changement d'etat. oki */ - if (--goomInfo->update.lockvar < 0) - goomInfo->update.lockvar = 0; - - /* on verifie qu'il ne se pas un truc interressant avec le son. */ - if ((goomInfo->sound.timeSinceLastGoom == 0) - || (forceMode > 0) - || (goomInfo->update.cyclesSinceLastChange > TIME_BTW_CHG)) { - - /* changement eventuel de mode */ - if (goom_irand(goomInfo->gRandom,16) == 0) - switch (goom_irand(goomInfo->gRandom,34)) { - case 0: - case 10: - goomInfo->update.zoomFilterData.hypercosEffect = goom_irand(goomInfo->gRandom,2); - case 13: - case 20: - case 21: - goomInfo->update.zoomFilterData.mode = WAVE_MODE; - goomInfo->update.zoomFilterData.reverse = 0; - goomInfo->update.zoomFilterData.waveEffect = (goom_irand(goomInfo->gRandom,3) == 0); - if (goom_irand(goomInfo->gRandom,2)) - goomInfo->update.zoomFilterData.vitesse = (goomInfo->update.zoomFilterData.vitesse + 127) >> 1; - break; - case 1: - case 11: - goomInfo->update.zoomFilterData.mode = CRYSTAL_BALL_MODE; - goomInfo->update.zoomFilterData.waveEffect = 0; - goomInfo->update.zoomFilterData.hypercosEffect = 0; - break; - case 2: - case 12: - goomInfo->update.zoomFilterData.mode = AMULETTE_MODE; - goomInfo->update.zoomFilterData.waveEffect = 0; - goomInfo->update.zoomFilterData.hypercosEffect = 0; - break; - case 3: - goomInfo->update.zoomFilterData.mode = WATER_MODE; - goomInfo->update.zoomFilterData.waveEffect = 0; - goomInfo->update.zoomFilterData.hypercosEffect = 0; - break; - case 4: - case 14: - goomInfo->update.zoomFilterData.mode = SCRUNCH_MODE; - goomInfo->update.zoomFilterData.waveEffect = 0; - goomInfo->update.zoomFilterData.hypercosEffect = 0; - break; - case 5: - case 15: - case 22: - goomInfo->update.zoomFilterData.mode = HYPERCOS1_MODE; - goomInfo->update.zoomFilterData.waveEffect = 0; - goomInfo->update.zoomFilterData.hypercosEffect = (goom_irand(goomInfo->gRandom,3) == 0); - break; - case 6: - case 16: - goomInfo->update.zoomFilterData.mode = HYPERCOS2_MODE; - goomInfo->update.zoomFilterData.waveEffect = 0; - goomInfo->update.zoomFilterData.hypercosEffect = 0; - break; - case 7: - case 17: - goomInfo->update.zoomFilterData.mode = CRYSTAL_BALL_MODE; - goomInfo->update.zoomFilterData.waveEffect = (goom_irand(goomInfo->gRandom,4) == 0); - goomInfo->update.zoomFilterData.hypercosEffect = goom_irand(goomInfo->gRandom,2); - break; - case 8: - case 18: - case 19: - goomInfo->update.zoomFilterData.mode = SCRUNCH_MODE; - goomInfo->update.zoomFilterData.waveEffect = 1; - goomInfo->update.zoomFilterData.hypercosEffect = 1; - break; - case 29: - case 30: - goomInfo->update.zoomFilterData.mode = YONLY_MODE; - break; - case 31: - case 32: - case 33: - goomInfo->update.zoomFilterData.mode = SPEEDWAY_MODE; - break; - default: - goomInfo->update.zoomFilterData.mode = NORMAL_MODE; - goomInfo->update.zoomFilterData.waveEffect = 0; - goomInfo->update.zoomFilterData.hypercosEffect = 0; - } - } - - /* tout ceci ne sera fait qu'en cas de non-blocage */ - if (goomInfo->update.lockvar == 0) { - /* reperage de goom (acceleration forte de l'acceleration du volume) */ - /* -> coup de boost de la vitesse si besoin.. */ - if (goomInfo->sound.timeSinceLastGoom == 0) { - - int i; - goomInfo->update.goomvar++; - - /* SELECTION OF THE GOOM STATE */ - if ((!goomInfo->update.stateSelectionBlocker)&&(goom_irand(goomInfo->gRandom,3))) { - goomInfo->update.stateSelectionRnd = goom_irand(goomInfo->gRandom,goomInfo->statesRangeMax); - goomInfo->update.stateSelectionBlocker = 3; - } - else if (goomInfo->update.stateSelectionBlocker) goomInfo->update.stateSelectionBlocker--; - - for (i=0;istatesNumber;i++) - if ((goomInfo->update.stateSelectionRnd >= goomInfo->states[i].rangemin) - && (goomInfo->update.stateSelectionRnd <= goomInfo->states[i].rangemax)) - goomInfo->curGState = &(goomInfo->states[i]); - - if ((goomInfo->curGState->drawIFS) && (goomInfo->update.ifs_incr<=0)) { - goomInfo->update.recay_ifs = 5; - goomInfo->update.ifs_incr = 11; - } - - if ((!goomInfo->curGState->drawIFS) && (goomInfo->update.ifs_incr>0) && (goomInfo->update.decay_ifs<=0)) - goomInfo->update.decay_ifs = 100; - - if (!goomInfo->curGState->drawScope) - goomInfo->update.stop_lines = 0xf000 & 5; - - if (!goomInfo->curGState->drawScope) { - goomInfo->update.stop_lines = 0; - goomInfo->update.lineMode = goomInfo->update.drawLinesDuration; - } - - /* if (goomInfo->update.goomvar % 1 == 0) */ - { - guint32 vtmp; - guint32 newvit; - - goomInfo->update.lockvar = 50; - newvit = STOP_SPEED + 1 - ((float)3.5f * log10(goomInfo->sound.speedvar * 60 + 1)); - /* retablir le zoom avant.. */ - if ((goomInfo->update.zoomFilterData.reverse) && (!(goomInfo->cycle % 13)) && (rand () % 5 == 0)) { - goomInfo->update.zoomFilterData.reverse = 0; - goomInfo->update.zoomFilterData.vitesse = STOP_SPEED - 2; - goomInfo->update.lockvar = 75; - } - if (goom_irand(goomInfo->gRandom,10) == 0) { - goomInfo->update.zoomFilterData.reverse = 1; - goomInfo->update.lockvar = 100; - } - - if (goom_irand(goomInfo->gRandom,10) == 0) - goomInfo->update.zoomFilterData.vitesse = STOP_SPEED - 1; - if (goom_irand(goomInfo->gRandom,12) == 0) - goomInfo->update.zoomFilterData.vitesse = STOP_SPEED + 1; - - /* changement de milieu.. */ - switch (goom_irand(goomInfo->gRandom,25)) { - case 0: - case 3: - case 6: - goomInfo->update.zoomFilterData.middleY = goomInfo->screen.height - 1; - goomInfo->update.zoomFilterData.middleX = goomInfo->screen.width / 2; - break; - case 1: - case 4: - goomInfo->update.zoomFilterData.middleX = goomInfo->screen.width - 1; - break; - case 2: - case 5: - goomInfo->update.zoomFilterData.middleX = 1; - break; - default: - goomInfo->update.zoomFilterData.middleY = goomInfo->screen.height / 2; - goomInfo->update.zoomFilterData.middleX = goomInfo->screen.width / 2; - } - - if ((goomInfo->update.zoomFilterData.mode == WATER_MODE) - || (goomInfo->update.zoomFilterData.mode == YONLY_MODE) - || (goomInfo->update.zoomFilterData.mode == AMULETTE_MODE)) { - goomInfo->update.zoomFilterData.middleX = goomInfo->screen.width / 2; - goomInfo->update.zoomFilterData.middleY = goomInfo->screen.height / 2; - } - - switch (vtmp = (goom_irand(goomInfo->gRandom,15))) { - case 0: - goomInfo->update.zoomFilterData.vPlaneEffect = goom_irand(goomInfo->gRandom,3) - - goom_irand(goomInfo->gRandom,3); - goomInfo->update.zoomFilterData.hPlaneEffect = goom_irand(goomInfo->gRandom,3) - - goom_irand(goomInfo->gRandom,3); - break; - case 3: - goomInfo->update.zoomFilterData.vPlaneEffect = 0; - goomInfo->update.zoomFilterData.hPlaneEffect = goom_irand(goomInfo->gRandom,8) - - goom_irand(goomInfo->gRandom,8); - break; - case 4: - case 5: - case 6: - case 7: - goomInfo->update.zoomFilterData.vPlaneEffect = goom_irand(goomInfo->gRandom,5) - - goom_irand(goomInfo->gRandom,5); - goomInfo->update.zoomFilterData.hPlaneEffect = -goomInfo->update.zoomFilterData.vPlaneEffect; - break; - case 8: - goomInfo->update.zoomFilterData.hPlaneEffect = 5 + goom_irand(goomInfo->gRandom,8); - goomInfo->update.zoomFilterData.vPlaneEffect = -goomInfo->update.zoomFilterData.hPlaneEffect; - break; - case 9: - goomInfo->update.zoomFilterData.vPlaneEffect = 5 + goom_irand(goomInfo->gRandom,8); - goomInfo->update.zoomFilterData.hPlaneEffect = -goomInfo->update.zoomFilterData.hPlaneEffect; - break; - case 13: - goomInfo->update.zoomFilterData.hPlaneEffect = 0; - goomInfo->update.zoomFilterData.vPlaneEffect = goom_irand(goomInfo->gRandom,10) - - goom_irand(goomInfo->gRandom,10); - break; - case 14: - goomInfo->update.zoomFilterData.hPlaneEffect = goom_irand(goomInfo->gRandom,10) - - goom_irand(goomInfo->gRandom,10); - goomInfo->update.zoomFilterData.vPlaneEffect = goom_irand(goomInfo->gRandom,10) - - goom_irand(goomInfo->gRandom,10); - break; - default: - if (vtmp < 10) { - goomInfo->update.zoomFilterData.vPlaneEffect = 0; - goomInfo->update.zoomFilterData.hPlaneEffect = 0; - } - } - - if (goom_irand(goomInfo->gRandom,5) != 0) - goomInfo->update.zoomFilterData.noisify = 0; - else { - goomInfo->update.zoomFilterData.noisify = goom_irand(goomInfo->gRandom,2) + 1; - goomInfo->update.lockvar *= 2; - } - - if (goomInfo->update.zoomFilterData.mode == AMULETTE_MODE) { - goomInfo->update.zoomFilterData.vPlaneEffect = 0; - goomInfo->update.zoomFilterData.hPlaneEffect = 0; - goomInfo->update.zoomFilterData.noisify = 0; - } - - if ((goomInfo->update.zoomFilterData.middleX == 1) || (goomInfo->update.zoomFilterData.middleX == (signed int)goomInfo->screen.width - 1)) { - goomInfo->update.zoomFilterData.vPlaneEffect = 0; - if (goom_irand(goomInfo->gRandom,2)) - goomInfo->update.zoomFilterData.hPlaneEffect = 0; - } - - if ((signed int)newvit < goomInfo->update.zoomFilterData.vitesse) /* on accelere */ - { - pzfd = &goomInfo->update.zoomFilterData; - if (((newvit < STOP_SPEED - 7) && - (goomInfo->update.zoomFilterData.vitesse < STOP_SPEED - 6) && - (goomInfo->cycle % 3 == 0)) || (goom_irand(goomInfo->gRandom,40) == 0)) { - goomInfo->update.zoomFilterData.vitesse = STOP_SPEED - goom_irand(goomInfo->gRandom,2) - + goom_irand(goomInfo->gRandom,2); - goomInfo->update.zoomFilterData.reverse = !goomInfo->update.zoomFilterData.reverse; - } - else { - goomInfo->update.zoomFilterData.vitesse = (newvit + goomInfo->update.zoomFilterData.vitesse * 7) / 8; - } - goomInfo->update.lockvar += 50; - } - } - - if (goomInfo->update.lockvar > 150) { - goomInfo->update.switchIncr = goomInfo->update.switchIncrAmount; - goomInfo->update.switchMult = 1.0f; - } - } - /* mode mega-lent */ - if (goom_irand(goomInfo->gRandom,700) == 0) { - /* - * printf ("coup du sort...\n") ; - */ - pzfd = &goomInfo->update.zoomFilterData; - goomInfo->update.zoomFilterData.vitesse = STOP_SPEED - 1; - goomInfo->update.zoomFilterData.pertedec = 8; - goomInfo->update.zoomFilterData.sqrtperte = 16; - goomInfo->update.goomvar = 1; - goomInfo->update.lockvar += 50; - goomInfo->update.switchIncr = goomInfo->update.switchIncrAmount; - goomInfo->update.switchMult = 1.0f; - } - } - - /* - * gros frein si la musique est calme - */ - if ((goomInfo->sound.speedvar < 0.01f) - && (goomInfo->update.zoomFilterData.vitesse < STOP_SPEED - 4) - && (goomInfo->cycle % 16 == 0)) { - pzfd = &goomInfo->update.zoomFilterData; - goomInfo->update.zoomFilterData.vitesse += 3; - goomInfo->update.zoomFilterData.pertedec = 8; - goomInfo->update.zoomFilterData.sqrtperte = 16; - goomInfo->update.goomvar = 0; - } - - /* - * baisser regulierement la vitesse... - */ - if ((goomInfo->cycle % 73 == 0) && (goomInfo->update.zoomFilterData.vitesse < STOP_SPEED - 5)) { - pzfd = &goomInfo->update.zoomFilterData; - goomInfo->update.zoomFilterData.vitesse++; - } - - /* - * arreter de decrmenter au bout d'un certain temps - */ - if ((goomInfo->cycle % 101 == 0) && (goomInfo->update.zoomFilterData.pertedec == 7)) { - pzfd = &goomInfo->update.zoomFilterData; - goomInfo->update.zoomFilterData.pertedec = 8; - goomInfo->update.zoomFilterData.sqrtperte = 16; - } - - /* - * Permet de forcer un effet. - */ - if ((forceMode > 0) && (forceMode <= NB_FX)) { - pzfd = &goomInfo->update.zoomFilterData; - pzfd->mode = forceMode - 1; - } - - if (forceMode == -1) { - pzfd = NULL; - } - - /* - * Changement d'effet de zoom ! - */ - if (pzfd != NULL) { - int dif; - - goomInfo->update.cyclesSinceLastChange = 0; - - goomInfo->update.switchIncr = goomInfo->update.switchIncrAmount; - - dif = goomInfo->update.zoomFilterData.vitesse - goomInfo->update.previousZoomSpeed; - if (dif < 0) - dif = -dif; - - if (dif > 2) { - goomInfo->update.switchIncr *= (dif + 2) / 2; - } - goomInfo->update.previousZoomSpeed = goomInfo->update.zoomFilterData.vitesse; - goomInfo->update.switchMult = 1.0f; - - if (((goomInfo->sound.timeSinceLastGoom == 0) - && (goomInfo->sound.totalgoom < 2)) || (forceMode > 0)) { - goomInfo->update.switchIncr = 0; - goomInfo->update.switchMult = goomInfo->update.switchMultAmount; - } - } - else { - if (goomInfo->update.cyclesSinceLastChange > TIME_BTW_CHG) { - pzfd = &goomInfo->update.zoomFilterData; - goomInfo->update.cyclesSinceLastChange = 0; - } - else - goomInfo->update.cyclesSinceLastChange++; - } - -#ifdef VERBOSE - if (pzfd) { - printf ("GOOM: pzfd->mode = %d\n", pzfd->mode); - } -#endif - - /* Zoom here ! */ - zoomFilterFastRGB (goomInfo, goomInfo->p1, goomInfo->p2, pzfd, goomInfo->screen.width, goomInfo->screen.height, - goomInfo->update.switchIncr, goomInfo->update.switchMult); - - /* - * Affichage tentacule - */ - - goomInfo->tentacles_fx.apply(&goomInfo->tentacles_fx, goomInfo->p1, goomInfo->p2, goomInfo); - goomInfo->star_fx.apply (&goomInfo->star_fx,goomInfo->p2,goomInfo->p1,goomInfo); - - /* - * Affichage de texte - */ - { - /*char title[1024];*/ - char text[64]; - - /* - * Le message - */ - update_message (goomInfo, message); - - if (fps > 0) { - sprintf (text, "%2.0f fps", fps); - goom_draw_text (goomInfo->p1,goomInfo->screen.width,goomInfo->screen.height, - 10, 24, text, 1, 0); - } - - /* - * Le titre - */ - if (songTitle != NULL) { - strncpy (goomInfo->update.titleText, songTitle, 1023); - goomInfo->update.titleText[1023]=0; - goomInfo->update.timeOfTitleDisplay = 200; - } - - if (goomInfo->update.timeOfTitleDisplay) { - goom_draw_text (goomInfo->p1,goomInfo->screen.width,goomInfo->screen.height, - goomInfo->screen.width / 2, goomInfo->screen.height / 2 + 7, goomInfo->update.titleText, - ((float) (190 - goomInfo->update.timeOfTitleDisplay) / 10.0f), 1); - goomInfo->update.timeOfTitleDisplay--; - if (goomInfo->update.timeOfTitleDisplay < 4) - goom_draw_text (goomInfo->p2,goomInfo->screen.width,goomInfo->screen.height, - goomInfo->screen.width / 2, goomInfo->screen.height / 2 + 7, goomInfo->update.titleText, - ((float) (190 - goomInfo->update.timeOfTitleDisplay) / 10.0f), 1); - } - } - - /* - * Gestion du Scope - */ - - /* - * arret demande - */ - if ((goomInfo->update.stop_lines & 0xf000)||(!goomInfo->curGState->drawScope)) { - float param1, param2, amplitude; - int couleur; - int mode; - - choose_a_goom_line (goomInfo, ¶m1, ¶m2, &couleur, &mode, &litude,1); - couleur = GML_BLACK; - - goom_lines_switch_to (goomInfo->gmline1, mode, param1, amplitude, couleur); - goom_lines_switch_to (goomInfo->gmline2, mode, param2, amplitude, couleur); - goomInfo->update.stop_lines &= 0x0fff; - } - - /* - * arret aleatore.. changement de mode de ligne.. - */ - if (goomInfo->update.lineMode != goomInfo->update.drawLinesDuration) { - goomInfo->update.lineMode--; - if (goomInfo->update.lineMode == -1) - goomInfo->update.lineMode = 0; - } - else - if ((goomInfo->cycle%80==0)&&(goom_irand(goomInfo->gRandom,5)==0)&&goomInfo->update.lineMode) - goomInfo->update.lineMode--; - - if ((goomInfo->cycle % 120 == 0) - && (goom_irand(goomInfo->gRandom,4) == 0) - && (goomInfo->curGState->drawScope)) { - if (goomInfo->update.lineMode == 0) - goomInfo->update.lineMode = goomInfo->update.drawLinesDuration; - else if (goomInfo->update.lineMode == goomInfo->update.drawLinesDuration) { - float param1, param2, amplitude; - int couleur1,couleur2; - int mode; - - goomInfo->update.lineMode--; - choose_a_goom_line (goomInfo, ¶m1, ¶m2, &couleur1, - &mode, &litude,goomInfo->update.stop_lines); - - couleur2 = 5-couleur1; - if (goomInfo->update.stop_lines) { - goomInfo->update.stop_lines--; - if (goom_irand(goomInfo->gRandom,2)) - couleur2=couleur1 = GML_BLACK; - } - - goom_lines_switch_to (goomInfo->gmline1, mode, param1, amplitude, couleur1); - goom_lines_switch_to (goomInfo->gmline2, mode, param2, amplitude, couleur2); - } - } - - /* - * si on est dans un goom : afficher les lignes... - */ - if ((goomInfo->update.lineMode != 0) || (goomInfo->sound.timeSinceLastGoom < 5)) { - goomInfo->gmline2->power = goomInfo->gmline1->power; - - goom_lines_draw (goomInfo, goomInfo->gmline1, data[0], goomInfo->p2); - goom_lines_draw (goomInfo, goomInfo->gmline2, data[1], goomInfo->p2); - - if (((goomInfo->cycle % 121) == 9) && (goom_irand(goomInfo->gRandom,3) == 1) - && ((goomInfo->update.lineMode == 0) || (goomInfo->update.lineMode == goomInfo->update.drawLinesDuration))) { - float param1, param2, amplitude; - int couleur1,couleur2; - int mode; - - choose_a_goom_line (goomInfo, ¶m1, ¶m2, &couleur1, - &mode, &litude, goomInfo->update.stop_lines); - couleur2 = 5-couleur1; - - if (goomInfo->update.stop_lines) { - goomInfo->update.stop_lines--; - if (goom_irand(goomInfo->gRandom,2)) - couleur2=couleur1 = GML_BLACK; - } - goom_lines_switch_to (goomInfo->gmline1, mode, param1, amplitude, couleur1); - goom_lines_switch_to (goomInfo->gmline2, mode, param2, amplitude, couleur2); - } - } - - return_val = goomInfo->p1; - tmp = goomInfo->p1; - goomInfo->p1 = goomInfo->p2; - goomInfo->p2 = tmp; - - /* affichage et swappage des buffers.. */ - goomInfo->cycle++; - - goomInfo->convolve_fx.apply(&goomInfo->convolve_fx,return_val,goomInfo->outputBuf,goomInfo); - - return (guint32*)goomInfo->outputBuf; -} - -/**************************************** -* CLOSE * -****************************************/ -void goom_close (PluginInfo *goomInfo) -{ - if (goomInfo->pixel != NULL) - free (goomInfo->pixel); - if (goomInfo->back != NULL) - free (goomInfo->back); - if (goomInfo->conv != NULL) - free (goomInfo->conv); - - goomInfo->pixel = goomInfo->back = NULL; - goomInfo->conv = NULL; - goom_random_free(goomInfo->gRandom); - goom_lines_free (&goomInfo->gmline1); - goom_lines_free (&goomInfo->gmline2); - - /* release_ifs (); */ - goomInfo->ifs_fx.free(&goomInfo->ifs_fx); - goomInfo->convolve_fx.free(&goomInfo->convolve_fx); - goomInfo->star_fx.free(&goomInfo->star_fx); - goomInfo->tentacles_fx.free(&goomInfo->tentacles_fx); - goomInfo->zoomFilter_fx.free(&goomInfo->zoomFilter_fx); - - // Release info visual - free (goomInfo->params); - free (goomInfo->sound.params.params); - - // Release PluginInfo - free (goomInfo->visuals); - gsl_free (goomInfo->scanner); - gsl_free (goomInfo->main_scanner); - - free(goomInfo); -} - - -/* *** */ -void -choose_a_goom_line (PluginInfo *goomInfo, float *param1, float *param2, int *couleur, int *mode, - float *amplitude, int far) -{ - *mode = goom_irand(goomInfo->gRandom,3); - *amplitude = 1.0f; - switch (*mode) { - case GML_CIRCLE: - if (far) { - *param1 = *param2 = 0.47f; - *amplitude = 0.8f; - break; - } - if (goom_irand(goomInfo->gRandom,3) == 0) { - *param1 = *param2 = 0; - *amplitude = 3.0f; - } - else if (goom_irand(goomInfo->gRandom,2)) { - *param1 = 0.40f * goomInfo->screen.height; - *param2 = 0.22f * goomInfo->screen.height; - } - else { - *param1 = *param2 = goomInfo->screen.height * 0.35; - } - break; - case GML_HLINE: - if (goom_irand(goomInfo->gRandom,4) || far) { - *param1 = goomInfo->screen.height / 7; - *param2 = 6.0f * goomInfo->screen.height / 7.0f; - } - else { - *param1 = *param2 = goomInfo->screen.height / 2.0f; - *amplitude = 2.0f; - } - break; - case GML_VLINE: - if (goom_irand(goomInfo->gRandom,3) || far) { - *param1 = goomInfo->screen.width / 7.0f; - *param2 = 6.0f * goomInfo->screen.width / 7.0f; - } - else { - *param1 = *param2 = goomInfo->screen.width / 2.0f; - *amplitude = 1.5f; - } - break; - } - - *couleur = goom_irand(goomInfo->gRandom,6); -} - -#define ECART_VARIATION 1.5 -#define POS_VARIATION 3.0 -#define SCROLLING_SPEED 80 - -/* - * Met a jour l'affichage du message defilant - */ -void update_message (PluginInfo *goomInfo, char *message) { - - int fin = 0; - - if (message) { - int i=1,j=0; - strcpy (goomInfo->update_message.message, message); - for (j=0;goomInfo->update_message.message[j];j++) - if (goomInfo->update_message.message[j]=='\n') - i++; - goomInfo->update_message.numberOfLinesInMessage = i; - goomInfo->update_message.affiche = goomInfo->screen.height + goomInfo->update_message.numberOfLinesInMessage * 25 + 105; - goomInfo->update_message.longueur = strlen(goomInfo->update_message.message); - } - if (goomInfo->update_message.affiche) { - int i = 0; - char *msg = malloc(goomInfo->update_message.longueur + 1); - char *ptr = msg; - int pos; - float ecart; - message = msg; - strcpy (msg, goomInfo->update_message.message); - - while (!fin) { - while (1) { - if (*ptr == 0) { - fin = 1; - break; - } - if (*ptr == '\n') { - *ptr = 0; - break; - } - ++ptr; - } - pos = goomInfo->update_message.affiche - (goomInfo->update_message.numberOfLinesInMessage - i)*25; - pos += POS_VARIATION * (cos((double)pos / 20.0)); - pos -= SCROLLING_SPEED; - ecart = (ECART_VARIATION * sin((double)pos / 20.0)); - if ((fin) && (2 * pos < (int)goomInfo->screen.height)) - pos = (int)goomInfo->screen.height / 2; - pos += 7; - - goom_draw_text(goomInfo->p1,goomInfo->screen.width,goomInfo->screen.height, - goomInfo->screen.width/2, pos, - message, - ecart, - 1); - message = ++ptr; - i++; - } - goomInfo->update_message.affiche --; - free (msg); - } -} - diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/goom_filters.h kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/goom_filters.h --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/goom_filters.h 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/goom_filters.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,52 +0,0 @@ -#ifndef FILTERS_H -#define FILTERS_H - -#include "goom_config.h" -#include "goom_typedefs.h" -#include "goom_visual_fx.h" -#include "goom_graphic.h" - -VisualFX zoomFilterVisualFXWrapper_create(void); - -struct _ZOOM_FILTER_DATA -{ - int vitesse; /* 128 = vitesse nule... * * 256 = en arriere - * hyper vite.. * * 0 = en avant hype vite. */ - unsigned char pertedec; - unsigned char sqrtperte; - int middleX, middleY; /* milieu de l'effet */ - char reverse; /* inverse la vitesse */ - char mode; /* type d'effet appliquer (cf les #define) */ - /** @since June 2001 */ - int hPlaneEffect; /* deviation horitontale */ - int vPlaneEffect; /* deviation verticale */ - /** @since April 2002 */ - int waveEffect; /* applique une "surcouche" de wave effect */ - int hypercosEffect; /* applique une "surcouche de hypercos effect */ - - char noisify; /* ajoute un bruit a la transformation */ -}; - -#define NORMAL_MODE 0 -#define WAVE_MODE 1 -#define CRYSTAL_BALL_MODE 2 -#define SCRUNCH_MODE 3 -#define AMULETTE_MODE 4 -#define WATER_MODE 5 -#define HYPERCOS1_MODE 6 -#define HYPERCOS2_MODE 7 -#define YONLY_MODE 8 -#define SPEEDWAY_MODE 9 - -void pointFilter (PluginInfo *goomInfo, Pixel * pix1, Color c, - float t1, float t2, float t3, float t4, guint32 cycle); - -/* filtre de zoom : - * le contenu de pix1 est copie dans pix2. - * zf : si non NULL, configure l'effet. - * resx,resy : taille des buffers. - */ -void zoomFilterFastRGB (PluginInfo *goomInfo, Pixel * pix1, Pixel * pix2, ZoomFilterData * zf, guint32 resx, - guint32 resy, int switchIncr, float switchMult); - -#endif diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/goom_fx.h kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/goom_fx.h --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/goom_fx.h 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/goom_fx.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,12 +0,0 @@ -#ifndef _GOOM_FX_H -#define _GOOM_FX_H - -#include "goom_visual_fx.h" -#include "goom_plugin_info.h" - -VisualFX convolve_create (); -VisualFX flying_star_create (void); - -void zoom_filter_c(int sizeX, int sizeY, Pixel *src, Pixel *dest, int *brutS, int *brutD, int buffratio, int precalCoef[16][16]); - -#endif diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/goom_graphic.h kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/goom_graphic.h --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/goom_graphic.h 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/goom_graphic.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,74 +0,0 @@ -#ifndef GRAPHIC_H -#define GRAPHIC_H - -typedef unsigned int Uint; - -typedef struct -{ - unsigned short r, v, b; -} -Color; - -extern const Color BLACK; -extern const Color WHITE; -extern const Color RED; -extern const Color BLUE; -extern const Color GREEN; -extern const Color YELLOW; -extern const Color ORANGE; -extern const Color VIOLET; - - -#ifdef COLOR_BGRA - -#define R_CHANNEL 0xFF000000 -#define G_CHANNEL 0x00FF0000 -#define B_CHANNEL 0x0000FF00 -#define A_CHANNEL 0x000000FF -#define R_OFFSET 24 -#define G_OFFSET 16 -#define B_OFFSET 8 -#define A_OFFSET 0 - -typedef union _PIXEL { - struct { - unsigned char r; - unsigned char g; - unsigned char b; - unsigned char a; - } channels; - unsigned int val; - unsigned char cop[4]; -} Pixel; - -#else - -#define A_CHANNEL 0xFF000000 -#define R_CHANNEL 0x00FF0000 -#define G_CHANNEL 0x0000FF00 -#define B_CHANNEL 0x000000FF -#define A_OFFSET 24 -#define R_OFFSET 16 -#define G_OFFSET 8 -#define B_OFFSET 0 - -typedef union _PIXEL { - struct { - unsigned char a; - unsigned char r; - unsigned char g; - unsigned char b; - } channels; - unsigned int val; - unsigned char cop[4]; -} Pixel; - -#endif /* COLOR_BGRA */ - -/* -inline void setPixelRGB (Pixel * buffer, Uint x, Uint y, Color c); -inline void getPixelRGB (Pixel * buffer, Uint x, Uint y, Color * c); -*/ - - -#endif /* GRAPHIC_H */ diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/goom.h kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/goom.h --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/goom.h 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/goom.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,30 +0,0 @@ -#ifndef _GOOMCORE_H -#define _GOOMCORE_H - -#include "goom_config.h" -#include "goom_plugin_info.h" -#include "goomsl.h" - -#define NB_FX 10 - -PluginInfo *goom_init (guint32 resx, guint32 resy); -void goom_set_resolution (PluginInfo *goomInfo, guint32 resx, guint32 resy); - -/* - * forceMode == 0 : do nothing - * forceMode == -1 : lock the FX - * forceMode == 1..NB_FX : force a switch to FX n# forceMode - * - * songTitle = pointer to the title of the song... - * - NULL if it is not the start of the song - * - only have a value at the start of the song - */ -guint32 *goom_update (PluginInfo *goomInfo, gint16 data[2][512], int forceMode, float fps, - char *songTitle, char *message); - -/* returns 0 if the buffer wasn't accepted */ -int goom_set_screenbuffer(PluginInfo *goomInfo, void *buffer); - -void goom_close (PluginInfo *goomInfo); - -#endif diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/goom_hash.c kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/goom_hash.c --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/goom_hash.c 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/goom_hash.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,100 +0,0 @@ -#include "goom_hash.h" -#include -#include - -static GoomHashEntry *entry_new(const char *key, HashValue value) { - - GoomHashEntry *entry = (GoomHashEntry*)malloc(sizeof(GoomHashEntry)); - - entry->key = (char *)malloc(strlen(key)+1); - strcpy(entry->key,key); - entry->value = value; - entry->lower = NULL; - entry->upper = NULL; - - return entry; -} - -static void entry_free(GoomHashEntry *entry) { - if (entry!=NULL) { - entry_free(entry->lower); - entry_free(entry->upper); - free(entry->key); - free(entry); - } -} - -static void entry_put(GoomHashEntry *entry, const char *key, HashValue value) { - int cmp = strcmp(key,entry->key); - if (cmp==0) { - entry->value = value; - } - else if (cmp > 0) { - if (entry->upper == NULL) - entry->upper = entry_new(key,value); - else - entry_put(entry->upper, key, value); - } - else { - if (entry->lower == NULL) - entry->lower = entry_new(key,value); - else - entry_put(entry->lower, key, value); - } -} - -static HashValue *entry_get(GoomHashEntry *entry, const char *key) { - - int cmp; - if (entry==NULL) - return NULL; - cmp = strcmp(key,entry->key); - if (cmp > 0) - return entry_get(entry->upper, key); - else if (cmp < 0) - return entry_get(entry->lower, key); - else - return &(entry->value); -} - -GoomHash *goom_hash_new(void) { - GoomHash *_this = (GoomHash*)malloc(sizeof(GoomHash)); - _this->root = NULL; - return _this; -} - -void goom_hash_free(GoomHash *_this) { - entry_free(_this->root); - free(_this); -} - -void goom_hash_put(GoomHash *_this, const char *key, HashValue value) { - if (_this->root == NULL) - _this->root = entry_new(key,value); - else - entry_put(_this->root,key,value); -} - -HashValue *goom_hash_get(GoomHash *_this, const char *key) { - return entry_get(_this->root,key); -} - -void goom_hash_put_int(GoomHash *_this, const char *key, int i) { - HashValue value; - value.i = i; - goom_hash_put(_this,key,value); -} - -void goom_hash_put_float(GoomHash *_this, const char *key, float f) { - HashValue value; - value.f = f; - goom_hash_put(_this,key,value); -} - -void goom_hash_put_ptr(GoomHash *_this, const char *key, void *ptr) { - HashValue value; - value.ptr = ptr; - goom_hash_put(_this,key,value); -} - - diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/goom_hash.h kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/goom_hash.h --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/goom_hash.h 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/goom_hash.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,34 +0,0 @@ -#ifndef _GOOM_HASH_H -#define _GOOM_HASH_H - -typedef struct GOOM_HASH_ENTRY GoomHashEntry; -typedef struct GOOM_HASH GoomHash; - -typedef union { - void *ptr; - int i; - float f; -} HashValue; - -struct GOOM_HASH_ENTRY { - char *key; - HashValue value; - GoomHashEntry *lower; - GoomHashEntry *upper; -}; - -struct GOOM_HASH { - GoomHashEntry *root; -}; - -GoomHash *goom_hash_new(void); -void goom_hash_free(GoomHash *gh); - -void goom_hash_put(GoomHash *gh, const char *key, HashValue value); -HashValue *goom_hash_get(GoomHash *gh, const char *key); - -void goom_hash_put_int(GoomHash *_this, const char *key, int i); -void goom_hash_put_float(GoomHash *_this, const char *key, float f); -void goom_hash_put_ptr(GoomHash *_this, const char *key, void *ptr); - -#endif /* _GOOM_HASH_H */ diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/goom_plugin_info.h kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/goom_plugin_info.h --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/goom_plugin_info.h 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/goom_plugin_info.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,176 +0,0 @@ -#ifndef _PLUGIN_INFO_H -#define _PLUGIN_INFO_H - -#include "goom_typedefs.h" - -#include "goom_config.h" - -#include "goom_graphic.h" -#include "goom_config_param.h" -#include "goom_visual_fx.h" -#include "goom_filters.h" -#include "goom_tools.h" -#include "goomsl.h" - -typedef struct { - char drawIFS; - char drawPoints; - char drawTentacle; - - char drawScope; - int farScope; - - int rangemin; - int rangemax; -} GoomState; - -#define STATES_MAX_NB 128 - -/** - * Gives informations about the sound. - */ -struct _SOUND_INFO { - - /* nota : a Goom is just a sound event... */ - - int timeSinceLastGoom; /* >= 0 */ - float goomPower; /* power of the last Goom [0..1] */ - - int timeSinceLastBigGoom; /* >= 0 */ - - float volume; /* [0..1] */ - short samples[2][512]; - - /* other "internal" datas for the sound_tester */ - float goom_limit; /* auto-updated limit of goom_detection */ - float bigGoomLimit; - float accelvar; /* acceleration of the sound - [0..1] */ - float speedvar; /* speed of the sound - [0..100] */ - int allTimesMax; - int totalgoom; /* number of goom since last reset - * (a reset every 64 cycles) */ - - float prov_max; /* accel max since last reset */ - - int cycle; - - /* private */ - PluginParam volume_p; - PluginParam speed_p; - PluginParam accel_p; - PluginParam goom_limit_p; - PluginParam goom_power_p; - PluginParam last_goom_p; - PluginParam last_biggoom_p; - PluginParam biggoom_speed_limit_p; - PluginParam biggoom_factor_p; - - PluginParameters params; /* contains the previously defined parameters. */ -}; - - -/** - * Allows FXs to know the current state of the plugin. - */ -struct _PLUGIN_INFO { - - /* public datas */ - - int nbParams; - PluginParameters *params; - - /* private datas */ - - struct _SIZE_TYPE { - int width; - int height; - int size; /* == screen.height * screen.width. */ - } screen; - - SoundInfo sound; - - int nbVisuals; - VisualFX **visuals; /* pointers on all the visual fx */ - - /** The known FX */ - VisualFX convolve_fx; - VisualFX star_fx; - VisualFX zoomFilter_fx; - VisualFX tentacles_fx; - VisualFX ifs_fx; - - /** image buffers */ - guint32 *pixel; - guint32 *back; - Pixel *p1, *p2; - Pixel *conv; - Pixel *outputBuf; - - /** state of goom */ - guint32 cycle; - GoomState states[STATES_MAX_NB]; - int statesNumber; - int statesRangeMax; - - GoomState *curGState; - - /** effet de ligne.. */ - GMLine *gmline1; - GMLine *gmline2; - - /** sinus table */ - int sintable[0x10000]; - - /* INTERNALS */ - - /** goom_update internals. - * I took all static variables from goom_update and put them here.. for the moment. - */ - struct { - int lockvar; /* pour empecher de nouveaux changements */ - int goomvar; /* boucle des gooms */ - int loopvar; /* mouvement des points */ - int stop_lines; - int ifs_incr; /* dessiner l'ifs (0 = non: > = increment) */ - int decay_ifs; /* disparition de l'ifs */ - int recay_ifs; /* dedisparition de l'ifs */ - int cyclesSinceLastChange; /* nombre de Cycle Depuis Dernier Changement */ - int drawLinesDuration; /* duree de la transition entre afficher les lignes ou pas */ - int lineMode; /* l'effet lineaire a dessiner */ - float switchMultAmount; /* SWITCHMULT (29.0f/30.0f) */ - int switchIncrAmount; /* 0x7f */ - float switchMult; /* 1.0f */ - int switchIncr; /* = SWITCHINCR; */ - int stateSelectionRnd; - int stateSelectionBlocker; - int previousZoomSpeed; - int timeOfTitleDisplay; - char titleText[1024]; - ZoomFilterData zoomFilterData; - } update; - - struct { - int numberOfLinesInMessage; - char message[0x800]; - int affiche; - int longueur; - } update_message; - - struct { - void (*draw_line) (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny); - void (*zoom_filter) (int sizeX, int sizeY, Pixel *src, Pixel *dest, int *brutS, int *brutD, int buffratio, int precalCoef[16][16]); - } methods; - - GoomRandom *gRandom; - - GoomSL *scanner; - GoomSL *main_scanner; - const char *main_script_str; -}; - -void plugin_info_init(PluginInfo *p, int nbVisual); - -/* i = [0..p->nbVisual-1] */ -void plugin_info_add_visual(PluginInfo *p, int i, VisualFX *visual); - -#endif diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/goomsl.c kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/goomsl.c --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/goomsl.c 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/goomsl.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,1514 +0,0 @@ -#include -#include -#include -#include -#include "goomsl.h" -#include "goomsl_private.h" -#include "goomsl_yacc.h" - -/*#define TRACE_SCRIPT*/ - - /* {{{ definition of the instructions number */ -#define INSTR_SETI_VAR_INTEGER 1 -#define INSTR_SETI_VAR_VAR 2 -#define INSTR_SETF_VAR_FLOAT 3 -#define INSTR_SETF_VAR_VAR 4 -#define INSTR_NOP 5 -/* #define INSTR_JUMP 6 */ -#define INSTR_SETP_VAR_PTR 7 -#define INSTR_SETP_VAR_VAR 8 -#define INSTR_SUBI_VAR_INTEGER 9 -#define INSTR_SUBI_VAR_VAR 10 -#define INSTR_SUBF_VAR_FLOAT 11 -#define INSTR_SUBF_VAR_VAR 12 -#define INSTR_ISLOWERF_VAR_VAR 13 -#define INSTR_ISLOWERF_VAR_FLOAT 14 -#define INSTR_ISLOWERI_VAR_VAR 15 -#define INSTR_ISLOWERI_VAR_INTEGER 16 -#define INSTR_ADDI_VAR_INTEGER 17 -#define INSTR_ADDI_VAR_VAR 18 -#define INSTR_ADDF_VAR_FLOAT 19 -#define INSTR_ADDF_VAR_VAR 20 -#define INSTR_MULI_VAR_INTEGER 21 -#define INSTR_MULI_VAR_VAR 22 -#define INSTR_MULF_VAR_FLOAT 23 -#define INSTR_MULF_VAR_VAR 24 -#define INSTR_DIVI_VAR_INTEGER 25 -#define INSTR_DIVI_VAR_VAR 26 -#define INSTR_DIVF_VAR_FLOAT 27 -#define INSTR_DIVF_VAR_VAR 28 -/* #define INSTR_JZERO 29 */ -#define INSTR_ISEQUALP_VAR_VAR 30 -#define INSTR_ISEQUALP_VAR_PTR 31 -#define INSTR_ISEQUALI_VAR_VAR 32 -#define INSTR_ISEQUALI_VAR_INTEGER 33 -#define INSTR_ISEQUALF_VAR_VAR 34 -#define INSTR_ISEQUALF_VAR_FLOAT 35 -/* #define INSTR_CALL 36 */ -/* #define INSTR_RET 37 */ -/* #define INSTR_EXT_CALL 38 */ -#define INSTR_NOT_VAR 39 -/* #define INSTR_JNZERO 40 */ -#define INSTR_SETS_VAR_VAR 41 -#define INSTR_ISEQUALS_VAR_VAR 42 -#define INSTR_ADDS_VAR_VAR 43 -#define INSTR_SUBS_VAR_VAR 44 -#define INSTR_MULS_VAR_VAR 45 -#define INSTR_DIVS_VAR_VAR 46 - - /* }}} */ -/* {{{ definition of the validation error types */ -static const char *VALIDATE_OK = "ok"; -#define VALIDATE_ERROR "error while validating " -#define VALIDATE_TODO "todo" -#define VALIDATE_SYNTHAX_ERROR "synthax error" -#define VALIDATE_NO_SUCH_INT "no such integer variable" -#define VALIDATE_NO_SUCH_VAR "no such variable" -#define VALIDATE_NO_SUCH_DEST_VAR "no such destination variable" -#define VALIDATE_NO_SUCH_SRC_VAR "no such src variable" -/* }}} */ - - /***********************************/ - /* PROTOTYPE OF INTERNAL FUNCTIONS */ -/***********************************/ - -/* {{{ */ -static void gsl_instr_free(Instruction *_this); -static const char *gsl_instr_validate(Instruction *_this); -static void gsl_instr_display(Instruction *_this); - -static InstructionFlow *iflow_new(void); -static void iflow_add_instr(InstructionFlow *_this, Instruction *instr); -static void iflow_clean(InstructionFlow *_this); -static void iflow_free(InstructionFlow *_this); -static void iflow_execute(FastInstructionFlow *_this, GoomSL *gsl); -/* }}} */ - - /************************************/ - /* DEFINITION OF INTERNAL FUNCTIONS */ -/************************************/ - -void iflow_free(InstructionFlow *_this) -{ /* {{{ */ - free(_this->instr); - goom_hash_free(_this->labels); - free(_this); /*TODO: finir cette fonction */ -} /* }}} */ - -void iflow_clean(InstructionFlow *_this) -{ /* {{{ */ - /* TODO: clean chaque instruction du flot */ - _this->number = 0; - goom_hash_free(_this->labels); - _this->labels = goom_hash_new(); -} /* }}} */ - -InstructionFlow *iflow_new(void) -{ /* {{{ */ - InstructionFlow *_this = (InstructionFlow*)malloc(sizeof(InstructionFlow)); - _this->number = 0; - _this->tabsize = 6; - _this->instr = (Instruction**)malloc(_this->tabsize * sizeof(Instruction*)); - _this->labels = goom_hash_new(); - - return _this; -} /* }}} */ - -void iflow_add_instr(InstructionFlow *_this, Instruction *instr) -{ /* {{{ */ - if (_this->number == _this->tabsize) { - _this->tabsize *= 2; - _this->instr = (Instruction**)realloc(_this->instr, _this->tabsize * sizeof(Instruction*)); - } - _this->instr[_this->number] = instr; - instr->address = _this->number; - _this->number++; -} /* }}} */ - -void gsl_instr_set_namespace(Instruction *_this, GoomHash *ns) -{ /* {{{ */ - if (_this->cur_param <= 0) { - fprintf(stderr, "ERROR: Line %d, No more params to instructions\n", _this->line_number); - exit(1); - } - _this->vnamespace[_this->cur_param-1] = ns; -} /* }}} */ - -void gsl_instr_add_param(Instruction *instr, char *param, int type) -{ /* {{{ */ - int len; - if (instr==NULL) - return; - if (instr->cur_param==0) - return; - --instr->cur_param; - len = strlen(param); - instr->params[instr->cur_param] = (char*)malloc(len+1); - strcpy(instr->params[instr->cur_param], param); - instr->types[instr->cur_param] = type; - if (instr->cur_param == 0) { - - const char *result = gsl_instr_validate(instr); - if (result != VALIDATE_OK) { - printf("ERROR: Line %d: ", instr->parent->num_lines + 1); - gsl_instr_display(instr); - printf("... %s\n", result); - instr->parent->compilationOK = 0; - exit(1); - } - -#if USE_JITC_X86 - iflow_add_instr(instr->parent->iflow, instr); -#else - if (instr->id != INSTR_NOP) - iflow_add_instr(instr->parent->iflow, instr); - else - gsl_instr_free(instr); -#endif - } -} /* }}} */ - -Instruction *gsl_instr_init(GoomSL *parent, const char *name, int id, int nb_param, int line_number) -{ /* {{{ */ - Instruction *instr = (Instruction*)malloc(sizeof(Instruction)); - instr->params = (char**)malloc(nb_param*sizeof(char*)); - instr->vnamespace = (GoomHash**)malloc(nb_param*sizeof(GoomHash*)); - instr->types = (int*)malloc(nb_param*sizeof(int)); - instr->cur_param = instr->nb_param = nb_param; - instr->parent = parent; - instr->id = id; - instr->name = name; - instr->jump_label = NULL; - instr->line_number = line_number; - return instr; -} /* }}} */ - -void gsl_instr_free(Instruction *_this) -{ /* {{{ */ - int i; - free(_this->types); - for (i=_this->cur_param; i<_this->nb_param; ++i) - free(_this->params[i]); - free(_this->params); - free(_this); -} /* }}} */ - -void gsl_instr_display(Instruction *_this) -{ /* {{{ */ - int i=_this->nb_param-1; - printf("%s", _this->name); - while(i>=_this->cur_param) { - printf(" %s", _this->params[i]); - --i; - } -} /* }}} */ - - /****************************************/ - /* VALIDATION OF INSTRUCTION PARAMETERS */ -/****************************************/ - -static const char *validate_v_v(Instruction *_this) -{ /* {{{ */ - HashValue *dest = goom_hash_get(_this->vnamespace[1], _this->params[1]); - HashValue *src = goom_hash_get(_this->vnamespace[0], _this->params[0]); - - if (dest == NULL) { - return VALIDATE_NO_SUCH_DEST_VAR; - } - if (src == NULL) { - return VALIDATE_NO_SUCH_SRC_VAR; - } - _this->data.udest.var = dest->ptr; - _this->data.usrc.var = src->ptr; - return VALIDATE_OK; -} /* }}} */ - -static const char *validate_v_i(Instruction *_this) -{ /* {{{ */ - HashValue *dest = goom_hash_get(_this->vnamespace[1], _this->params[1]); - _this->data.usrc.value_int = strtol(_this->params[0],NULL,0); - - if (dest == NULL) { - return VALIDATE_NO_SUCH_INT; - } - _this->data.udest.var = dest->ptr; - return VALIDATE_OK; -} /* }}} */ - -static const char *validate_v_p(Instruction *_this) -{ /* {{{ */ - HashValue *dest = goom_hash_get(_this->vnamespace[1], _this->params[1]); - _this->data.usrc.value_ptr = strtol(_this->params[0],NULL,0); - - if (dest == NULL) { - return VALIDATE_NO_SUCH_INT; - } - _this->data.udest.var = dest->ptr; - return VALIDATE_OK; -} /* }}} */ - -static const char *validate_v_f(Instruction *_this) -{ /* {{{ */ - HashValue *dest = goom_hash_get(_this->vnamespace[1], _this->params[1]); - _this->data.usrc.value_float = atof(_this->params[0]); - - if (dest == NULL) { - return VALIDATE_NO_SUCH_VAR; - } - _this->data.udest.var = dest->ptr; - return VALIDATE_OK; -} /* }}} */ - -static const char *validate(Instruction *_this, - int vf_f_id, int vf_v_id, - int vi_i_id, int vi_v_id, - int vp_p_id, int vp_v_id, - int vs_v_id) -{ /* {{{ */ - if ((_this->types[1] == TYPE_FVAR) && (_this->types[0] == TYPE_FLOAT)) { - _this->id = vf_f_id; - return validate_v_f(_this); - } - else if ((_this->types[1] == TYPE_FVAR) && (_this->types[0] == TYPE_FVAR)) { - _this->id = vf_v_id; - return validate_v_v(_this); - } - else if ((_this->types[1] == TYPE_IVAR) && (_this->types[0] == TYPE_INTEGER)) { - _this->id = vi_i_id; - return validate_v_i(_this); - } - else if ((_this->types[1] == TYPE_IVAR) && (_this->types[0] == TYPE_IVAR)) { - _this->id = vi_v_id; - return validate_v_v(_this); - } - else if ((_this->types[1] == TYPE_PVAR) && (_this->types[0] == TYPE_PTR)) { - if (vp_p_id == INSTR_NOP) return VALIDATE_ERROR; - _this->id = vp_p_id; - return validate_v_p(_this); - } - else if ((_this->types[1] == TYPE_PVAR) && (_this->types[0] == TYPE_PVAR)) { - _this->id = vp_v_id; - if (vp_v_id == INSTR_NOP) return VALIDATE_ERROR; - return validate_v_v(_this); - } - else if ((_this->types[1] < FIRST_RESERVED) && (_this->types[1] >= 0) && (_this->types[0] == _this->types[1])) { - _this->id = vs_v_id; - if (vs_v_id == INSTR_NOP) return "Impossible operation to perform between two structs"; - return validate_v_v(_this); - } - return VALIDATE_ERROR; -} /* }}} */ - -const char *gsl_instr_validate(Instruction *_this) -{ /* {{{ */ - if (_this->id != INSTR_EXT_CALL) { - int i = _this->nb_param; - while (i>0) - { - i--; - if (_this->types[i] == TYPE_VAR) { - int type = gsl_type_of_var(_this->vnamespace[i], _this->params[i]); - - if (type == INSTR_INT) - _this->types[i] = TYPE_IVAR; - else if (type == INSTR_FLOAT) - _this->types[i] = TYPE_FVAR; - else if (type == INSTR_PTR) - _this->types[i] = TYPE_PVAR; - else if ((type >= 0) && (type < FIRST_RESERVED)) - _this->types[i] = type; - else fprintf(stderr,"WARNING: Line %d, %s has no namespace\n", _this->line_number, _this->params[i]); - } - } - } - - switch (_this->id) { - - /* set */ - case INSTR_SET: - return validate(_this, - INSTR_SETF_VAR_FLOAT, INSTR_SETF_VAR_VAR, - INSTR_SETI_VAR_INTEGER, INSTR_SETI_VAR_VAR, - INSTR_SETP_VAR_PTR, INSTR_SETP_VAR_VAR, - INSTR_SETS_VAR_VAR); - - /* extcall */ - case INSTR_EXT_CALL: - if (_this->types[0] == TYPE_VAR) { - HashValue *fval = goom_hash_get(_this->parent->functions, _this->params[0]); - if (fval) { - _this->data.udest.external_function = (struct _ExternalFunctionStruct*)fval->ptr; - return VALIDATE_OK; - } - } - return VALIDATE_ERROR; - - /* call */ - case INSTR_CALL: - if (_this->types[0] == TYPE_LABEL) { - _this->jump_label = _this->params[0]; - return VALIDATE_OK; - } - return VALIDATE_ERROR; - - /* ret */ - case INSTR_RET: - return VALIDATE_OK; - - /* jump */ - case INSTR_JUMP: - - if (_this->types[0] == TYPE_LABEL) { - _this->jump_label = _this->params[0]; - return VALIDATE_OK; - } - return VALIDATE_ERROR; - - /* jzero / jnzero */ - case INSTR_JZERO: - case INSTR_JNZERO: - - if (_this->types[0] == TYPE_LABEL) { - _this->jump_label = _this->params[0]; - return VALIDATE_OK; - } - return VALIDATE_ERROR; - - /* label */ - case INSTR_LABEL: - - if (_this->types[0] == TYPE_LABEL) { - _this->id = INSTR_NOP; - _this->nop_label = _this->params[0]; - goom_hash_put_int(_this->parent->iflow->labels, _this->params[0], _this->parent->iflow->number); - return VALIDATE_OK; - } - return VALIDATE_ERROR; - - /* isequal */ - case INSTR_ISEQUAL: - return validate(_this, - INSTR_ISEQUALF_VAR_FLOAT, INSTR_ISEQUALF_VAR_VAR, - INSTR_ISEQUALI_VAR_INTEGER, INSTR_ISEQUALI_VAR_VAR, - INSTR_ISEQUALP_VAR_PTR, INSTR_ISEQUALP_VAR_VAR, - INSTR_ISEQUALS_VAR_VAR); - - /* not */ - case INSTR_NOT: - _this->id = INSTR_NOT_VAR; - return VALIDATE_OK; - - /* islower */ - case INSTR_ISLOWER: - return validate(_this, - INSTR_ISLOWERF_VAR_FLOAT, INSTR_ISLOWERF_VAR_VAR, - INSTR_ISLOWERI_VAR_INTEGER, INSTR_ISLOWERI_VAR_VAR, - INSTR_NOP, INSTR_NOP, INSTR_NOP); - - /* add */ - case INSTR_ADD: - return validate(_this, - INSTR_ADDF_VAR_FLOAT, INSTR_ADDF_VAR_VAR, - INSTR_ADDI_VAR_INTEGER, INSTR_ADDI_VAR_VAR, - INSTR_NOP, INSTR_NOP, - INSTR_ADDS_VAR_VAR); - - /* mul */ - case INSTR_MUL: - return validate(_this, - INSTR_MULF_VAR_FLOAT, INSTR_MULF_VAR_VAR, - INSTR_MULI_VAR_INTEGER, INSTR_MULI_VAR_VAR, - INSTR_NOP, INSTR_NOP, - INSTR_MULS_VAR_VAR); - - /* sub */ - case INSTR_SUB: - return validate(_this, - INSTR_SUBF_VAR_FLOAT, INSTR_SUBF_VAR_VAR, - INSTR_SUBI_VAR_INTEGER, INSTR_SUBI_VAR_VAR, - INSTR_NOP, INSTR_NOP, - INSTR_SUBS_VAR_VAR); - - /* div */ - case INSTR_DIV: - return validate(_this, - INSTR_DIVF_VAR_FLOAT, INSTR_DIVF_VAR_VAR, - INSTR_DIVI_VAR_INTEGER, INSTR_DIVI_VAR_VAR, - INSTR_NOP,INSTR_NOP, - INSTR_DIVS_VAR_VAR); - - default: - return VALIDATE_TODO; - } - return VALIDATE_ERROR; -} /* }}} */ - - /*************/ - /* EXECUTION */ -/*************/ -void iflow_execute(FastInstructionFlow *_this, GoomSL *gsl) -{ /* {{{ */ - int flag = 0; - int ip = 0; - FastInstruction *instr = _this->instr; - int stack[0x10000]; - int stack_pointer = 0; - - stack[stack_pointer++] = -1; - - /* Quelques Macro pour rendre le code plus lisible */ -#define pSRC_VAR instr[ip].data.usrc.var -#define SRC_VAR_INT *instr[ip].data.usrc.var_int -#define SRC_VAR_FLOAT *instr[ip].data.usrc.var_float -#define SRC_VAR_PTR *instr[ip].data.usrc.var_ptr - -#define pDEST_VAR instr[ip].data.udest.var -#define DEST_VAR_INT *instr[ip].data.udest.var_int -#define DEST_VAR_FLOAT *instr[ip].data.udest.var_float -#define DEST_VAR_PTR *instr[ip].data.udest.var_ptr - -#define VALUE_INT instr[ip].data.usrc.value_int -#define VALUE_FLOAT instr[ip].data.usrc.value_float -#define VALUE_PTR instr[ip].data.usrc.value_ptr - -#define JUMP_OFFSET instr[ip].data.udest.jump_offset - -#define SRC_STRUCT_ID instr[ip].data.usrc.var_int[-1] -#define DEST_STRUCT_ID instr[ip].data.udest.var_int[-1] -#define SRC_STRUCT_IBLOCK(i) gsl->gsl_struct[SRC_STRUCT_ID]->iBlock[i] -#define SRC_STRUCT_FBLOCK(i) gsl->gsl_struct[SRC_STRUCT_ID]->fBlock[i] -#define DEST_STRUCT_IBLOCK(i) gsl->gsl_struct[DEST_STRUCT_ID]->iBlock[i] -#define DEST_STRUCT_FBLOCK(i) gsl->gsl_struct[DEST_STRUCT_ID]->fBlock[i] -#define DEST_STRUCT_IBLOCK_VAR(i,j) \ - ((int*)((char*)pDEST_VAR + gsl->gsl_struct[DEST_STRUCT_ID]->iBlock[i].data))[j] -#define DEST_STRUCT_FBLOCK_VAR(i,j) \ - ((float*)((char*)pDEST_VAR + gsl->gsl_struct[DEST_STRUCT_ID]->fBlock[i].data))[j] -#define SRC_STRUCT_IBLOCK_VAR(i,j) \ - ((int*)((char*)pSRC_VAR + gsl->gsl_struct[SRC_STRUCT_ID]->iBlock[i].data))[j] -#define SRC_STRUCT_FBLOCK_VAR(i,j) \ - ((float*)((char*)pSRC_VAR + gsl->gsl_struct[SRC_STRUCT_ID]->fBlock[i].data))[j] -#define DEST_STRUCT_SIZE gsl->gsl_struct[DEST_STRUCT_ID]->size - - while (1) - { - int i; -#ifdef TRACE_SCRIPT - printf("execute "); gsl_instr_display(instr[ip].proto); printf("\n"); -#endif - switch (instr[ip].id) { - - /* SET.I */ - case INSTR_SETI_VAR_INTEGER: - DEST_VAR_INT = VALUE_INT; - ++ip; break; - - case INSTR_SETI_VAR_VAR: - DEST_VAR_INT = SRC_VAR_INT; - ++ip; break; - - /* SET.F */ - case INSTR_SETF_VAR_FLOAT: - DEST_VAR_FLOAT = VALUE_FLOAT; - ++ip; break; - - case INSTR_SETF_VAR_VAR: - DEST_VAR_FLOAT = SRC_VAR_FLOAT; - ++ip; break; - - /* SET.P */ - case INSTR_SETP_VAR_VAR: - DEST_VAR_PTR = SRC_VAR_PTR; - ++ip; break; - - case INSTR_SETP_VAR_PTR: - DEST_VAR_PTR = VALUE_PTR; - ++ip; break; - - /* JUMP */ - case INSTR_JUMP: - ip += JUMP_OFFSET; break; - - /* JZERO */ - case INSTR_JZERO: - ip += (flag ? 1 : JUMP_OFFSET); break; - - case INSTR_NOP: - ++ip; break; - - /* ISEQUAL.P */ - case INSTR_ISEQUALP_VAR_VAR: - flag = (DEST_VAR_PTR == SRC_VAR_PTR); - ++ip; break; - - case INSTR_ISEQUALP_VAR_PTR: - flag = (DEST_VAR_PTR == VALUE_PTR); - ++ip; break; - - /* ISEQUAL.I */ - case INSTR_ISEQUALI_VAR_VAR: - flag = (DEST_VAR_INT == SRC_VAR_INT); - ++ip; break; - - case INSTR_ISEQUALI_VAR_INTEGER: - flag = (DEST_VAR_INT == VALUE_INT); - ++ip; break; - - /* ISEQUAL.F */ - case INSTR_ISEQUALF_VAR_VAR: - flag = (DEST_VAR_FLOAT == SRC_VAR_FLOAT); - ++ip; break; - - case INSTR_ISEQUALF_VAR_FLOAT: - flag = (DEST_VAR_FLOAT == VALUE_FLOAT); - ++ip; break; - - /* ISLOWER.I */ - case INSTR_ISLOWERI_VAR_VAR: - flag = (DEST_VAR_INT < SRC_VAR_INT); - ++ip; break; - - case INSTR_ISLOWERI_VAR_INTEGER: - flag = (DEST_VAR_INT < VALUE_INT); - ++ip; break; - - /* ISLOWER.F */ - case INSTR_ISLOWERF_VAR_VAR: - flag = (DEST_VAR_FLOAT < SRC_VAR_FLOAT); - ++ip; break; - - case INSTR_ISLOWERF_VAR_FLOAT: - flag = (DEST_VAR_FLOAT < VALUE_FLOAT); - ++ip; break; - - /* ADD.I */ - case INSTR_ADDI_VAR_VAR: - DEST_VAR_INT += SRC_VAR_INT; - ++ip; break; - - case INSTR_ADDI_VAR_INTEGER: - DEST_VAR_INT += VALUE_INT; - ++ip; break; - - /* ADD.F */ - case INSTR_ADDF_VAR_VAR: - DEST_VAR_FLOAT += SRC_VAR_FLOAT; - ++ip; break; - - case INSTR_ADDF_VAR_FLOAT: - DEST_VAR_FLOAT += VALUE_FLOAT; - ++ip; break; - - /* MUL.I */ - case INSTR_MULI_VAR_VAR: - DEST_VAR_INT *= SRC_VAR_INT; - ++ip; break; - - case INSTR_MULI_VAR_INTEGER: - DEST_VAR_INT *= VALUE_INT; - ++ip; break; - - /* MUL.F */ - case INSTR_MULF_VAR_FLOAT: - DEST_VAR_FLOAT *= VALUE_FLOAT; - ++ip; break; - - case INSTR_MULF_VAR_VAR: - DEST_VAR_FLOAT *= SRC_VAR_FLOAT; - ++ip; break; - - /* DIV.I */ - case INSTR_DIVI_VAR_VAR: - DEST_VAR_INT /= SRC_VAR_INT; - ++ip; break; - - case INSTR_DIVI_VAR_INTEGER: - DEST_VAR_INT /= VALUE_INT; - ++ip; break; - - /* DIV.F */ - case INSTR_DIVF_VAR_FLOAT: - DEST_VAR_FLOAT /= VALUE_FLOAT; - ++ip; break; - - case INSTR_DIVF_VAR_VAR: - DEST_VAR_FLOAT /= SRC_VAR_FLOAT; - ++ip; break; - - /* SUB.I */ - case INSTR_SUBI_VAR_VAR: - DEST_VAR_INT -= SRC_VAR_INT; - ++ip; break; - - case INSTR_SUBI_VAR_INTEGER: - DEST_VAR_INT -= VALUE_INT; - ++ip; break; - - /* SUB.F */ - case INSTR_SUBF_VAR_FLOAT: - DEST_VAR_FLOAT -= VALUE_FLOAT; - ++ip; break; - - case INSTR_SUBF_VAR_VAR: - DEST_VAR_FLOAT -= SRC_VAR_FLOAT; - ++ip; break; - - /* CALL */ - case INSTR_CALL: - stack[stack_pointer++] = ip + 1; - ip += JUMP_OFFSET; break; - - /* RET */ - case INSTR_RET: - ip = stack[--stack_pointer]; - if (ip<0) return; - break; - - /* EXT_CALL */ - case INSTR_EXT_CALL: - instr[ip].data.udest.external_function->function(gsl, gsl->vars, instr[ip].data.udest.external_function->vars); - ++ip; break; - - /* NOT */ - case INSTR_NOT_VAR: - flag = !flag; - ++ip; break; - - /* JNZERO */ - case INSTR_JNZERO: - ip += (flag ? JUMP_OFFSET : 1); break; - - case INSTR_SETS_VAR_VAR: - memcpy(pDEST_VAR, pSRC_VAR, DEST_STRUCT_SIZE); - ++ip; break; - - case INSTR_ISEQUALS_VAR_VAR: - break; - - case INSTR_ADDS_VAR_VAR: - /* process integers */ - i=0; - while (DEST_STRUCT_IBLOCK(i).size > 0) { - int j=DEST_STRUCT_IBLOCK(i).size; - while (j--) { - DEST_STRUCT_IBLOCK_VAR(i,j) += SRC_STRUCT_IBLOCK_VAR(i,j); - } - ++i; - } - /* process floats */ - i=0; - while (DEST_STRUCT_FBLOCK(i).size > 0) { - int j=DEST_STRUCT_FBLOCK(i).size; - while (j--) { - DEST_STRUCT_FBLOCK_VAR(i,j) += SRC_STRUCT_FBLOCK_VAR(i,j); - } - ++i; - } - ++ip; break; - - case INSTR_SUBS_VAR_VAR: - /* process integers */ - i=0; - while (DEST_STRUCT_IBLOCK(i).size > 0) { - int j=DEST_STRUCT_IBLOCK(i).size; - while (j--) { - DEST_STRUCT_IBLOCK_VAR(i,j) -= SRC_STRUCT_IBLOCK_VAR(i,j); - } - ++i; - } - /* process floats */ - i=0; - while (DEST_STRUCT_FBLOCK(i).size > 0) { - int j=DEST_STRUCT_FBLOCK(i).size; - while (j--) { - DEST_STRUCT_FBLOCK_VAR(i,j) -= SRC_STRUCT_FBLOCK_VAR(i,j); - } - ++i; - } - ++ip; break; - - case INSTR_MULS_VAR_VAR: - /* process integers */ - i=0; - while (DEST_STRUCT_IBLOCK(i).size > 0) { - int j=DEST_STRUCT_IBLOCK(i).size; - while (j--) { - DEST_STRUCT_IBLOCK_VAR(i,j) *= SRC_STRUCT_IBLOCK_VAR(i,j); - } - ++i; - } - /* process floats */ - i=0; - while (DEST_STRUCT_FBLOCK(i).size > 0) { - int j=DEST_STRUCT_FBLOCK(i).size; - while (j--) { - DEST_STRUCT_FBLOCK_VAR(i,j) *= SRC_STRUCT_FBLOCK_VAR(i,j); - } - ++i; - } - ++ip; break; - - case INSTR_DIVS_VAR_VAR: - /* process integers */ - i=0; - while (DEST_STRUCT_IBLOCK(i).size > 0) { - int j=DEST_STRUCT_IBLOCK(i).size; - while (j--) { - DEST_STRUCT_IBLOCK_VAR(i,j) /= SRC_STRUCT_IBLOCK_VAR(i,j); - } - ++i; - } - /* process floats */ - i=0; - while (DEST_STRUCT_FBLOCK(i).size > 0) { - int j=DEST_STRUCT_FBLOCK(i).size; - while (j--) { - DEST_STRUCT_FBLOCK_VAR(i,j) /= SRC_STRUCT_FBLOCK_VAR(i,j); - } - ++i; - } - ++ip; break; - - default: - printf("NOT IMPLEMENTED : %d\n", instr[ip].id); - ++ip; - exit(1); - } - } -} /* }}} */ - -int gsl_malloc(GoomSL *_this, int size) -{ /* {{{ */ - if (_this->nbPtr >= _this->ptrArraySize) { - _this->ptrArraySize *= 2; - _this->ptrArray = (void**)realloc(_this->ptrArray, sizeof(void*) * _this->ptrArraySize); - } - _this->ptrArray[_this->nbPtr] = malloc(size); - return _this->nbPtr++; -} /* }}} */ - -void *gsl_get_ptr(GoomSL *_this, int id) -{ /* {{{ */ - if ((id>=0)&&(id<_this->nbPtr)) - return _this->ptrArray[id]; - fprintf(stderr,"INVALID GET PTR 0x%08x\n", id); - return NULL; -} /* }}} */ - -void gsl_free_ptr(GoomSL *_this, int id) -{ /* {{{ */ - if ((id>=0)&&(id<_this->nbPtr)) { - free(_this->ptrArray[id]); - _this->ptrArray[id] = 0; - } -} /* }}} */ - -void gsl_enternamespace(const char *name) -{ /* {{{ */ - HashValue *val = goom_hash_get(currentGoomSL->functions, name); - if (val) { - ExternalFunctionStruct *function = (ExternalFunctionStruct*)val->ptr; - currentGoomSL->currentNS++; - currentGoomSL->namespaces[currentGoomSL->currentNS] = function->vars; - } - else { - fprintf(stderr, "ERROR: Line %d, Could not find namespace: %s\n", currentGoomSL->num_lines, name); - exit(1); - } -} /* }}} */ - -void gsl_reenternamespace(GoomHash *nsinfo) { - currentGoomSL->currentNS++; - currentGoomSL->namespaces[currentGoomSL->currentNS] = nsinfo; -} - -GoomHash *gsl_leavenamespace(void) -{ /* {{{ */ - currentGoomSL->currentNS--; - return currentGoomSL->namespaces[currentGoomSL->currentNS+1]; -} /* }}} */ - -GoomHash *gsl_find_namespace(const char *name) -{ /* {{{ */ - int i; - for (i=currentGoomSL->currentNS;i>=0;--i) { - if (goom_hash_get(currentGoomSL->namespaces[i], name)) - return currentGoomSL->namespaces[i]; - } - return NULL; -} /* }}} */ - -void gsl_declare_task(const char *name) -{ /* {{{ */ - if (goom_hash_get(currentGoomSL->functions, name)) { - return; - } - else { - ExternalFunctionStruct *gef = (ExternalFunctionStruct*)malloc(sizeof(ExternalFunctionStruct)); - gef->function = 0; - gef->vars = goom_hash_new(); - gef->is_extern = 0; - goom_hash_put_ptr(currentGoomSL->functions, name, (void*)gef); - } -} /* }}} */ - -void gsl_declare_external_task(const char *name) -{ /* {{{ */ - if (goom_hash_get(currentGoomSL->functions, name)) { - fprintf(stderr, "ERROR: Line %d, Duplicate declaration of %s\n", currentGoomSL->num_lines, name); - return; - } - else { - ExternalFunctionStruct *gef = (ExternalFunctionStruct*)malloc(sizeof(ExternalFunctionStruct)); - gef->function = 0; - gef->vars = goom_hash_new(); - gef->is_extern = 1; - goom_hash_put_ptr(currentGoomSL->functions, name, (void*)gef); - } -} /* }}} */ - -static void reset_scanner(GoomSL *gss) -{ /* {{{ */ - gss->num_lines = 0; - gss->instr = NULL; - iflow_clean(gss->iflow); - - /* reset variables */ - goom_hash_free(gss->vars); - gss->vars = goom_hash_new(); - gss->currentNS = 0; - gss->namespaces[0] = gss->vars; - - goom_hash_free(gss->structIDS); - gss->structIDS = goom_hash_new(); - - while (gss->nbStructID > 0) { - int i; - gss->nbStructID--; - for(i=0;igsl_struct[gss->nbStructID]->nbFields;++i) - free(gss->gsl_struct[gss->nbStructID]->fields[i]); - free(gss->gsl_struct[gss->nbStructID]); - } - - gss->compilationOK = 1; - - goom_heap_delete(gss->data_heap); - gss->data_heap = goom_heap_new(); -} /* }}} */ - -static void calculate_labels(InstructionFlow *iflow) -{ /* {{{ */ - int i = 0; - while (i < iflow->number) { - Instruction *instr = iflow->instr[i]; - if (instr->jump_label) { - HashValue *label = goom_hash_get(iflow->labels,instr->jump_label); - if (label) { - instr->data.udest.jump_offset = -instr->address + label->i; - } - else { - fprintf(stderr, "ERROR: Line %d, Could not find label %s\n", instr->line_number, instr->jump_label); - instr->id = INSTR_NOP; - instr->nop_label = 0; - exit(1); - } - } - ++i; - } -} /* }}} */ - -static int powerOfTwo(int i) -{ - int b; - for (b=0;b<31;b++) - if (i == (1<iflow->number; - int i; -#ifdef USE_JITC_X86 - - /* pour compatibilite avec les MACROS servant a execution */ - int ip = 0; - GoomSL *gsl = currentGoomSL; - - JitcX86Env *jitc; - - if (currentGoomSL->jitc != NULL) - jitc_x86_delete(currentGoomSL->jitc); - jitc = currentGoomSL->jitc = jitc_x86_env_new(0xffff); - currentGoomSL->jitc_func = jitc_prepare_func(jitc); - -#if 0 -#define SRC_STRUCT_ID instr[ip].data.usrc.var_int[-1] -#define DEST_STRUCT_ID instr[ip].data.udest.var_int[-1] -#define SRC_STRUCT_IBLOCK(i) gsl->gsl_struct[SRC_STRUCT_ID]->iBlock[i] -#define SRC_STRUCT_FBLOCK(i) gsl->gsl_struct[SRC_STRUCT_ID]->fBlock[i] -#define DEST_STRUCT_IBLOCK(i) gsl->gsl_struct[DEST_STRUCT_ID]->iBlock[i] -#define DEST_STRUCT_FBLOCK(i) gsl->gsl_struct[DEST_STRUCT_ID]->fBlock[i] -#define DEST_STRUCT_IBLOCK_VAR(i,j) \ - ((int*)((char*)pDEST_VAR + gsl->gsl_struct[DEST_STRUCT_ID]->iBlock[i].data))[j] -#define DEST_STRUCT_FBLOCK_VAR(i,j) \ - ((float*)((char*)pDEST_VAR + gsl->gsl_struct[DEST_STRUCT_ID]->fBlock[i].data))[j] -#define SRC_STRUCT_IBLOCK_VAR(i,j) \ - ((int*)((char*)pSRC_VAR + gsl->gsl_struct[SRC_STRUCT_ID]->iBlock[i].data))[j] -#define SRC_STRUCT_FBLOCK_VAR(i,j) \ - ((float*)((char*)pSRC_VAR + gsl->gsl_struct[SRC_STRUCT_ID]->fBlock[i].data))[j] -#define DEST_STRUCT_SIZE gsl->gsl_struct[DEST_STRUCT_ID]->size -#endif - - JITC_JUMP_LABEL(jitc, "__very_end__"); - JITC_ADD_LABEL (jitc, "__very_start__"); - - for (i=0;iiflow->instr[i]; - switch (instr->id) { - case INSTR_SETI_VAR_INTEGER : - jitc_add(jitc, "mov [$d], $d", instr->data.udest.var_int, instr->data.usrc.value_int); - break; - case INSTR_SETI_VAR_VAR : - jitc_add(jitc, "mov eax, [$d]", instr->data.usrc.var_int); - jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int); - break; - /* SET.F */ - case INSTR_SETF_VAR_FLOAT : - jitc_add(jitc, "mov [$d], $d", instr->data.udest.var_float, *(int*)(&instr->data.usrc.value_float)); - break; - case INSTR_SETF_VAR_VAR : - jitc_add(jitc, "mov eax, [$d]", instr->data.usrc.var_float); - jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_float); - break; - case INSTR_NOP : - if (instr->nop_label != 0) - JITC_ADD_LABEL(jitc, instr->nop_label); - break; - case INSTR_JUMP : - JITC_JUMP_LABEL(jitc,instr->jump_label); - break; - case INSTR_SETP_VAR_PTR : - jitc_add(jitc, "mov [$d], $d", instr->data.udest.var_ptr, instr->data.usrc.value_ptr); - break; - case INSTR_SETP_VAR_VAR : - jitc_add(jitc, "mov eax, [$d]", instr->data.usrc.var_ptr); - jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_ptr); - break; - case INSTR_SUBI_VAR_INTEGER : - jitc_add(jitc, "add [$d], $d", instr->data.udest.var_int, -instr->data.usrc.value_int); - break; - case INSTR_SUBI_VAR_VAR : - jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int); - jitc_add(jitc, "sub eax, [$d]", instr->data.usrc.var_int); - jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int); - break; - case INSTR_SUBF_VAR_FLOAT : - printf("NOT IMPLEMENTED : %d\n", instr->id); - break; - case INSTR_SUBF_VAR_VAR : - printf("NOT IMPLEMENTED : %d\n", instr->id); - break; - case INSTR_ISLOWERF_VAR_VAR: - printf("NOT IMPLEMENTED : %d\n", instr->id); - break; - case INSTR_ISLOWERF_VAR_FLOAT: - printf("NOT IMPLEMENTED : %d\n", instr->id); - break; - case INSTR_ISLOWERI_VAR_VAR: - jitc_add(jitc,"mov edx, [$d]", instr->data.udest.var_int); - jitc_add(jitc,"sub edx, [$d]", instr->data.usrc.var_int); - jitc_add(jitc,"shr edx, $d", 31); - break; - case INSTR_ISLOWERI_VAR_INTEGER: - jitc_add(jitc,"mov edx, [$d]", instr->data.udest.var_int); - jitc_add(jitc,"sub edx, $d", instr->data.usrc.value_int); - jitc_add(jitc,"shr edx, $d", 31); - break; - case INSTR_ADDI_VAR_INTEGER: - jitc_add(jitc, "add [$d], $d", instr->data.udest.var_int, instr->data.usrc.value_int); - break; - case INSTR_ADDI_VAR_VAR: - jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int); - jitc_add(jitc, "add eax, [$d]", instr->data.usrc.var_int); - jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int); - break; - case INSTR_ADDF_VAR_FLOAT: - printf("NOT IMPLEMENTED : %d\n", instr->id); - break; - case INSTR_ADDF_VAR_VAR: - printf("NOT IMPLEMENTED : %d\n", instr->id); - break; - case INSTR_MULI_VAR_INTEGER: - if (instr->data.usrc.value_int != 1) - { - int po2 = powerOfTwo(instr->data.usrc.value_int); - if (po2) { - /* performs (V / 2^n) by doing V >> n */ - jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int); - jitc_add(jitc, "sal eax, $d", po2); - jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int); - } - else { - jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int); - jitc_add(jitc, "imul eax, $d", instr->data.usrc.value_int); - jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int); - } - } - break; - case INSTR_MULI_VAR_VAR: - jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int); - jitc_add(jitc, "imul eax, [$d]", instr->data.usrc.var_int); - jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int); - break; - case INSTR_MULF_VAR_FLOAT: - printf("NOT IMPLEMENTED : %d\n", instr->id); - break; - case INSTR_MULF_VAR_VAR: - printf("NOT IMPLEMENTED : %d\n", instr->id); - break; - case INSTR_DIVI_VAR_INTEGER: - if ((instr->data.usrc.value_int != 1) && (instr->data.usrc.value_int != 0)) - { - int po2 = powerOfTwo(instr->data.usrc.value_int); - if (po2) { - /* performs (V / 2^n) by doing V >> n */ - jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int); - jitc_add(jitc, "sar eax, $d", po2); - jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int); - } - else { - /* performs (V/n) by doing (V*(32^2/n)) */ - long coef; - double dcoef = (double)4294967296.0 / (double)instr->data.usrc.value_int; - if (dcoef < 0.0) dcoef = -dcoef; - coef = (long)floor(dcoef); - dcoef -= floor(dcoef); - if (dcoef < 0.5) coef += 1; - - jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int); - jitc_add(jitc, "mov edx, $d", coef); - jitc_add(jitc, "imul edx"); - if (instr->data.usrc.value_int < 0) - jitc_add(jitc, "neg edx"); - jitc_add(jitc, "mov [$d], edx", instr->data.udest.var_int); - } - } - break; - case INSTR_DIVI_VAR_VAR : - jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int); - jitc_add(jitc, "cdq"); /* sign extend eax into edx */ - jitc_add(jitc, "idiv [$d]", instr->data.usrc.var_int); - jitc_add(jitc, "mov [$d], eax", instr->data.udest.var_int); - break; - case INSTR_DIVF_VAR_FLOAT: - printf("NOT IMPLEMENTED : %d\n", instr->id); - break; - case INSTR_DIVF_VAR_VAR: - printf("NOT IMPLEMENTED : %d\n", instr->id); - break; - case INSTR_JZERO: - jitc_add(jitc, "cmp edx, $d", 0); - jitc_add(jitc, "je $s", instr->jump_label); - break; - case INSTR_ISEQUALP_VAR_VAR : - jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_ptr); - jitc_add(jitc, "mov edx, $d", 0); - jitc_add(jitc, "cmp eax, [$d]", instr->data.usrc.var_ptr); - jitc_add(jitc, "jne $d", 1); - jitc_add(jitc, "inc edx"); - break; - case INSTR_ISEQUALP_VAR_PTR : - jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_ptr); - jitc_add(jitc, "mov edx, $d", 0); - jitc_add(jitc, "cmp eax, $d", instr->data.usrc.value_ptr); - jitc_add(jitc, "jne $d", 1); - jitc_add(jitc, "inc edx"); - break; - case INSTR_ISEQUALI_VAR_VAR : - jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int); - jitc_add(jitc, "mov edx, $d", 0); - jitc_add(jitc, "cmp eax, [$d]", instr->data.usrc.var_int); - jitc_add(jitc, "jne $d", 1); - jitc_add(jitc, "inc edx"); - break; - case INSTR_ISEQUALI_VAR_INTEGER : - jitc_add(jitc, "mov eax, [$d]", instr->data.udest.var_int); - jitc_add(jitc, "mov edx, $d", 0); - jitc_add(jitc, "cmp eax, $d", instr->data.usrc.value_int); - jitc_add(jitc, "jne $d", 1); - jitc_add(jitc, "inc edx"); - break; - case INSTR_ISEQUALF_VAR_VAR : - printf("NOT IMPLEMENTED : %d\n", instr->id); - break; - case INSTR_ISEQUALF_VAR_FLOAT : - printf("NOT IMPLEMENTED : %d\n", instr->id); - break; - case INSTR_CALL: - jitc_add(jitc, "call $s", instr->jump_label); - break; - case INSTR_RET: - jitc_add(jitc, "ret"); - break; - case INSTR_EXT_CALL: - jitc_add(jitc, "mov eax, [$d]", &(instr->data.udest.external_function->vars)); - jitc_add(jitc, "push eax"); - jitc_add(jitc, "mov edx, [$d]", &(currentGoomSL->vars)); - jitc_add(jitc, "push edx"); - jitc_add(jitc, "mov eax, [$d]", &(currentGoomSL)); - jitc_add(jitc, "push eax"); - - jitc_add(jitc, "mov eax, [$d]", &(instr->data.udest.external_function)); - jitc_add(jitc, "mov eax, [eax]"); - jitc_add(jitc, "call [eax]"); - jitc_add(jitc, "add esp, $d", 12); - break; - case INSTR_NOT_VAR: - jitc_add(jitc, "mov eax, edx"); - jitc_add(jitc, "mov edx, $d", 1); - jitc_add(jitc, "sub edx, eax"); - break; - case INSTR_JNZERO: - jitc_add(jitc, "cmp edx, $d", 0); - jitc_add(jitc, "jne $s", instr->jump_label); - break; - case INSTR_SETS_VAR_VAR: - { - int loop = DEST_STRUCT_SIZE / sizeof(int); - int dst = (int)pDEST_VAR; - int src = (int)pSRC_VAR; - - while (loop--) { - jitc_add(jitc,"mov eax, [$d]", src); - jitc_add(jitc,"mov [$d], eax", dst); - src += 4; - dst += 4; - } - } - break; - case INSTR_ISEQUALS_VAR_VAR: - break; - case INSTR_ADDS_VAR_VAR: - { - /* process integers */ - int i=0; - while (DEST_STRUCT_IBLOCK(i).size > 0) { - int j=DEST_STRUCT_IBLOCK(i).size; - while (j--) { /* TODO interlace 2 */ - jitc_add(jitc, "mov eax, [$d]", &DEST_STRUCT_IBLOCK_VAR(i,j)); - jitc_add(jitc, "add eax, [$d]", &SRC_STRUCT_IBLOCK_VAR(i,j)); - jitc_add(jitc, "mov [$d], eax", &DEST_STRUCT_IBLOCK_VAR(i,j)); - } - ++i; - } - /* process floats */ - i=0; - while (DEST_STRUCT_FBLOCK(i).size > 0) { - int j=DEST_STRUCT_FBLOCK(i).size; - while (j--) { - /* DEST_STRUCT_FBLOCK_VAR(i,j) += SRC_STRUCT_FBLOCK_VAR(i,j); */ - /* TODO */ - } - ++i; - } - break; - } - case INSTR_SUBS_VAR_VAR: - { - /* process integers */ - int i=0; - while (DEST_STRUCT_IBLOCK(i).size > 0) { - int j=DEST_STRUCT_IBLOCK(i).size; - while (j--) { - jitc_add(jitc, "mov eax, [$d]", &DEST_STRUCT_IBLOCK_VAR(i,j)); - jitc_add(jitc, "sub eax, [$d]", &SRC_STRUCT_IBLOCK_VAR(i,j)); - jitc_add(jitc, "mov [$d], eax", &DEST_STRUCT_IBLOCK_VAR(i,j)); - } - ++i; - } - break; - } - case INSTR_MULS_VAR_VAR: - { - /* process integers */ - int i=0; - while (DEST_STRUCT_IBLOCK(i).size > 0) { - int j=DEST_STRUCT_IBLOCK(i).size; - while (j--) { - jitc_add(jitc, "mov eax, [$d]", &DEST_STRUCT_IBLOCK_VAR(i,j)); - jitc_add(jitc, "imul eax, [$d]", &SRC_STRUCT_IBLOCK_VAR(i,j)); - jitc_add(jitc, "mov [$d], eax", &DEST_STRUCT_IBLOCK_VAR(i,j)); - } - ++i; - } - break; - } - case INSTR_DIVS_VAR_VAR: - { - /* process integers */ - int i=0; - while (DEST_STRUCT_IBLOCK(i).size > 0) { - int j=DEST_STRUCT_IBLOCK(i).size; - while (j--) { - jitc_add(jitc, "mov eax, [$d]", &DEST_STRUCT_IBLOCK_VAR(i,j)); - jitc_add(jitc, "cdq"); - jitc_add(jitc, "idiv [$d]", &SRC_STRUCT_IBLOCK_VAR(i,j)); - jitc_add(jitc, "mov [$d], eax", &DEST_STRUCT_IBLOCK_VAR(i,j)); - } - ++i; - } - break; - } - } - } - - JITC_ADD_LABEL (jitc, "__very_end__"); - jitc_add(jitc, "call $s", "__very_start__"); - jitc_add(jitc, "mov eax, $d", 0); - jitc_validate_func(jitc); -#else - InstructionFlow *iflow = currentGoomSL->iflow; - FastInstructionFlow *fastiflow = (FastInstructionFlow*)malloc(sizeof(FastInstructionFlow)); - fastiflow->mallocedInstr = calloc(number*16, sizeof(FastInstruction)); - /* fastiflow->instr = (FastInstruction*)(((int)fastiflow->mallocedInstr) + 16 - (((int)fastiflow->mallocedInstr)%16)); */ - fastiflow->instr = (FastInstruction*)fastiflow->mallocedInstr; - fastiflow->number = number; - for(i=0;iinstr[i].id = iflow->instr[i]->id; - fastiflow->instr[i].data = iflow->instr[i]->data; - fastiflow->instr[i].proto = iflow->instr[i]; - } - currentGoomSL->fastiflow = fastiflow; -#endif -} /* }}} */ - -void yy_scan_string(const char *str); -void yyparse(void); - -GoomHash *gsl_globals(GoomSL *_this) -{ - return _this->vars; -} - - -/** - * Some native external functions - */ -static void ext_charAt(GoomSL *gsl, GoomHash *global, GoomHash *local) -{ - char *string = GSL_LOCAL_PTR(gsl, local, "value"); - int index = GSL_LOCAL_INT(gsl, local, "index"); - GSL_GLOBAL_INT(gsl, "charAt") = 0; - if (string == NULL) { - return; - } - if (index < strlen(string)) - GSL_GLOBAL_INT(gsl, "charAt") = string[index]; -} - -static void ext_i2f(GoomSL *gsl, GoomHash *global, GoomHash *local) -{ - int i = GSL_LOCAL_INT(gsl, local, "value"); - GSL_GLOBAL_FLOAT(gsl, "i2f") = i; -} - -static void ext_f2i(GoomSL *gsl, GoomHash *global, GoomHash *local) -{ - float f = GSL_LOCAL_FLOAT(gsl, local, "value"); - GSL_GLOBAL_INT(gsl, "f2i") = f; -} - -/** - * - */ -void gsl_compile(GoomSL *_currentGoomSL, const char *script) -{ /* {{{ */ - char *script_and_externals; - static const char *sBinds = - "external : int\n" - "external : int\n" - "external : float\n"; - -#ifdef VERBOSE - printf("\n=== Starting Compilation ===\n"); -#endif - - script_and_externals = malloc(strlen(script) + strlen(sBinds) + 2); - strcpy(script_and_externals, sBinds); - strcat(script_and_externals, script); - - /* 0- reset */ - currentGoomSL = _currentGoomSL; - reset_scanner(currentGoomSL); - - /* 1- create the syntaxic tree */ - yy_scan_string(script_and_externals); - yyparse(); - - /* 2- generate code */ - gsl_commit_compilation(); - - /* 3- resolve symbols */ - calculate_labels(currentGoomSL->iflow); - - /* 4- optimize code */ - gsl_create_fast_iflow(); - - /* 5- bind a few internal functions */ - gsl_bind_function(currentGoomSL, "charAt", ext_charAt); - gsl_bind_function(currentGoomSL, "f2i", ext_f2i); - gsl_bind_function(currentGoomSL, "i2f", ext_i2f); - free(script_and_externals); - -#ifdef VERBOSE - printf("=== Compilation done. # of lines: %d. # of instr: %d ===\n", currentGoomSL->num_lines, currentGoomSL->iflow->number); -#endif -} /* }}} */ - -void gsl_execute(GoomSL *scanner) -{ /* {{{ */ - if (scanner->compilationOK) { -#if USE_JITC_X86 - scanner->jitc_func(); -#else - iflow_execute(scanner->fastiflow, scanner); -#endif - } -} /* }}} */ - -GoomSL *gsl_new(void) -{ /* {{{ */ - GoomSL *gss = (GoomSL*)malloc(sizeof(GoomSL)); - - gss->iflow = iflow_new(); - gss->vars = goom_hash_new(); - gss->functions = goom_hash_new(); - gss->nbStructID = 0; - gss->structIDS = goom_hash_new(); - gss->gsl_struct_size = 32; - gss->gsl_struct = (GSL_Struct**)malloc(gss->gsl_struct_size * sizeof(GSL_Struct*)); - gss->currentNS = 0; - gss->namespaces[0] = gss->vars; - gss->data_heap = goom_heap_new(); - - reset_scanner(gss); - - gss->compilationOK = 0; - gss->nbPtr=0; - gss->ptrArraySize=256; - gss->ptrArray = (void**)malloc(gss->ptrArraySize * sizeof(void*)); -#ifdef USE_JITC_X86 - gss->jitc = NULL; -#endif - return gss; -} /* }}} */ - -void gsl_bind_function(GoomSL *gss, const char *fname, GoomSL_ExternalFunction func) -{ /* {{{ */ - HashValue *val = goom_hash_get(gss->functions, fname); - if (val) { - ExternalFunctionStruct *gef = (ExternalFunctionStruct*)val->ptr; - gef->function = func; - } - else fprintf(stderr, "Unable to bind function %s\n", fname); -} /* }}} */ - -int gsl_is_compiled(GoomSL *gss) -{ /* {{{ */ - return gss->compilationOK; -} /* }}} */ - -void gsl_free(GoomSL *gss) -{ /* {{{ */ - iflow_free(gss->iflow); - goom_hash_free(gss->vars); - goom_hash_free(gss->functions); - goom_hash_free(gss->structIDS); - free(gss->gsl_struct); - goom_heap_delete(gss->data_heap); - free(gss->ptrArray); - free(gss); -} /* }}} */ - - -static int gsl_nb_import; -static char gsl_already_imported[256][256]; - -char *gsl_init_buffer(const char *fname) -{ - char *fbuffer; - fbuffer = (char*)malloc(512); - fbuffer[0]=0; - gsl_nb_import = 0; - if (fname) - gsl_append_file_to_buffer(fname,&fbuffer); - return fbuffer; -} - -static char *gsl_read_file(const char *fname) -{ - FILE *f; - char *buffer; - int fsize; - f = fopen(fname,"rt"); - if (!f) { - fprintf(stderr, "ERROR: Could not load file %s\n", fname); - exit(1); - } - fseek(f,0,SEEK_END); - fsize = ftell(f); - rewind(f); - buffer = (char*)malloc(fsize+512); - fread(buffer,1,fsize,f); - fclose(f); - buffer[fsize]=0; - return buffer; -} - -void gsl_append_file_to_buffer(const char *fname, char **buffer) -{ - char *fbuffer; - int size,fsize,i=0; - char reset_msg[256]; - - /* look if the file have not been already imported */ - for (i=0;iptr) -#define GSL_LOCAL_INT(gsl,local,name) (*(int*)goom_hash_get(local,name)->ptr) -#define GSL_LOCAL_FLOAT(gsl,local,name) (*(float*)goom_hash_get(local,name)->ptr) - -#define GSL_GLOBAL_PTR(gsl,name) gsl_get_ptr(gsl, *(int*)goom_hash_get(gsl_globals(gsl),name)->ptr) -#define GSL_GLOBAL_INT(gsl,name) (*(int*)goom_hash_get(gsl_globals(gsl),name)->ptr) -#define GSL_GLOBAL_FLOAT(gsl,name) (*(float*)goom_hash_get(gsl_globals(gsl),name)->ptr) - -#endif diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/goomsl_hash.c kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/goomsl_hash.c --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/goomsl_hash.c 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/goomsl_hash.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,120 +0,0 @@ -#include "goomsl_hash.h" -#include -#include - -static GoomHashEntry *entry_new(const char *key, HashValue value) { - - int len = strlen(key); - GoomHashEntry *entry = (GoomHashEntry*)malloc(sizeof(GoomHashEntry)); - - entry->key = (char *)malloc(len+1); - memcpy(entry->key,key,len+1); - entry->value = value; - entry->lower = NULL; - entry->upper = NULL; - - return entry; -} - -static void entry_free(GoomHashEntry *entry) { - if (entry!=NULL) { - entry_free(entry->lower); - entry_free(entry->upper); - free(entry->key); - free(entry); - } -} - -static void entry_put(GoomHashEntry *entry, const char *key, HashValue value) { - int cmp = strcmp(key,entry->key); - if (cmp==0) { - entry->value = value; - } - else if (cmp > 0) { - if (entry->upper == NULL) - entry->upper = entry_new(key,value); - else - entry_put(entry->upper, key, value); - } - else { - if (entry->lower == NULL) - entry->lower = entry_new(key,value); - else - entry_put(entry->lower, key, value); - } -} - -static HashValue *entry_get(GoomHashEntry *entry, const char *key) { - - int cmp; - if (entry==NULL) - return NULL; - cmp = strcmp(key,entry->key); - if (cmp > 0) - return entry_get(entry->upper, key); - else if (cmp < 0) - return entry_get(entry->lower, key); - else - return &(entry->value); -} - -GoomHash *goom_hash_new() { - GoomHash *_this = (GoomHash*)malloc(sizeof(GoomHash)); - _this->root = NULL; - _this->number_of_puts = 0; - return _this; -} - -void goom_hash_free(GoomHash *_this) { - entry_free(_this->root); - free(_this); -} - -void goom_hash_put(GoomHash *_this, const char *key, HashValue value) { - _this->number_of_puts += 1; - if (_this->root == NULL) - _this->root = entry_new(key,value); - else - entry_put(_this->root,key,value); -} - -HashValue *goom_hash_get(GoomHash *_this, const char *key) { - if (_this == NULL) return NULL; - return entry_get(_this->root,key); -} - -void goom_hash_put_int(GoomHash *_this, const char *key, int i) { - HashValue value; - value.i = i; - goom_hash_put(_this,key,value); -} - -void goom_hash_put_float(GoomHash *_this, const char *key, float f) { - HashValue value; - value.f = f; - goom_hash_put(_this,key,value); -} - -void goom_hash_put_ptr(GoomHash *_this, const char *key, void *ptr) { - HashValue value; - value.ptr = ptr; - goom_hash_put(_this,key,value); -} - -/* FOR EACH */ - -static void _goom_hash_for_each(GoomHash *_this, GoomHashEntry *entry, GH_Func func) -{ - if (entry == NULL) return; - func(_this, entry->key, &(entry->value)); - _goom_hash_for_each(_this, entry->lower, func); - _goom_hash_for_each(_this, entry->upper, func); -} - -void goom_hash_for_each(GoomHash *_this, GH_Func func) { - _goom_hash_for_each(_this, _this->root, func); -} - -int goom_hash_number_of_puts(GoomHash *_this) { - return _this->number_of_puts; -} diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/goomsl_hash.h kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/goomsl_hash.h --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/goomsl_hash.h 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/goomsl_hash.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,40 +0,0 @@ -#ifndef _GOOMSL_HASH_H -#define _GOOMSL_HASH_H - -typedef struct GOOM_HASH_ENTRY GoomHashEntry; -typedef struct GOOM_HASH GoomHash; - -typedef union { - void *ptr; - int i; - float f; -} HashValue; - -struct GOOM_HASH_ENTRY { - char *key; - HashValue value; - GoomHashEntry *lower; - GoomHashEntry *upper; -}; - -struct GOOM_HASH { - GoomHashEntry *root; - int number_of_puts; -}; - -GoomHash *goom_hash_new(); -void goom_hash_free(GoomHash *gh); - -void goom_hash_put(GoomHash *gh, const char *key, HashValue value); -HashValue *goom_hash_get(GoomHash *gh, const char *key); - -void goom_hash_put_int (GoomHash *_this, const char *key, int i); -void goom_hash_put_float(GoomHash *_this, const char *key, float f); -void goom_hash_put_ptr (GoomHash *_this, const char *key, void *ptr); - -typedef void (*GH_Func)(GoomHash *caller, const char *key, HashValue *value); - -void goom_hash_for_each(GoomHash *_this, GH_Func func); -int goom_hash_number_of_puts(GoomHash *_this); - -#endif /* _GOOM_HASH_H */ diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/goomsl_heap.c kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/goomsl_heap.c --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/goomsl_heap.c 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/goomsl_heap.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,105 +0,0 @@ -#include "goomsl_heap.h" -#include - -struct _GOOM_HEAP { - void **arrays; - int number_of_arrays; - int size_of_each_array; - int consumed_in_last_array; -}; - -/* Constructors / Destructor */ -GoomHeap *goom_heap_new(void) -{ - return goom_heap_new_with_granularity(4096); -} - -GoomHeap *goom_heap_new_with_granularity(int granularity) -{ - GoomHeap *_this; - _this = (GoomHeap*)malloc(sizeof(GoomHeap)); - _this->number_of_arrays = 0; - _this->size_of_each_array = granularity; - _this->consumed_in_last_array = 0; - _this->arrays = (void**)malloc(sizeof(void*)); - return _this; -} - -void goom_heap_delete(GoomHeap *_this) -{ - int i; - for (i=0;i<_this->number_of_arrays;++i) { - free(_this->arrays[i]); - } - free(_this->arrays); - free(_this); -} - -static void align_it(GoomHeap *_this, int alignment) -{ - if ((alignment > 1) && (_this->number_of_arrays>0)) { - void *last_array = _this->arrays[_this->number_of_arrays - 1]; - int last_address = (int)last_array + _this->consumed_in_last_array; - int decal = (last_address % alignment); - if (decal != 0) { - _this->consumed_in_last_array += alignment - decal; - } - } -} - -void *goom_heap_malloc_with_alignment_prefixed(GoomHeap *_this, int nb_bytes, - int alignment, int prefix_bytes) -{ - void *retval = NULL; - - /* d'abord on gere les problemes d'alignement */ - _this->consumed_in_last_array += prefix_bytes; - align_it(_this, alignment); - - /* ensuite on verifie que la quantite de memoire demandee tient dans le buffer */ - if ((_this->consumed_in_last_array + nb_bytes >= _this->size_of_each_array) - || (_this->number_of_arrays == 0)) { - - if (prefix_bytes + nb_bytes + alignment >= _this->size_of_each_array) { - - /* Si la zone demandee est plus grosse que la granularitee */ - /* On alloue un buffer plus gros que les autres */ - _this->arrays = (void**)realloc(_this->arrays, sizeof(void*) * (_this->number_of_arrays+2)); - - _this->number_of_arrays += 1; - _this->consumed_in_last_array = prefix_bytes; - - _this->arrays[_this->number_of_arrays - 1] = malloc(prefix_bytes + nb_bytes + alignment); - align_it(_this,alignment); - retval = (void*)((char*)_this->arrays[_this->number_of_arrays - 1] + _this->consumed_in_last_array); - - /* puis on repart sur un nouveau buffer vide */ - _this->number_of_arrays += 1; - _this->consumed_in_last_array = 0; - _this->arrays[_this->number_of_arrays - 1] = malloc(_this->size_of_each_array); - return retval; - } - else { - _this->number_of_arrays += 1; - _this->consumed_in_last_array = prefix_bytes; - _this->arrays = (void**)realloc(_this->arrays, sizeof(void*) * _this->number_of_arrays); - - _this->arrays[_this->number_of_arrays - 1] = malloc(_this->size_of_each_array); - align_it(_this,alignment); - } - } - retval = (void*)((char*)_this->arrays[_this->number_of_arrays - 1] + _this->consumed_in_last_array); - _this->consumed_in_last_array += nb_bytes; - return retval; -} - -void *goom_heap_malloc_with_alignment(GoomHeap *_this, int nb_bytes, int alignment) -{ - return goom_heap_malloc_with_alignment_prefixed(_this, nb_bytes, alignment, 0); -} - -void *goom_heap_malloc(GoomHeap *_this, int nb_bytes) -{ - return goom_heap_malloc_with_alignment(_this,nb_bytes,1); -} - diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/goomsl_heap.h kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/goomsl_heap.h --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/goomsl_heap.h 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/goomsl_heap.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,29 +0,0 @@ -#ifndef GOOMSL_HEAP -#define GOOMSL_HEAP - -/** - * Resizable Array that guarranty that resizes don't change address of - * the stored datas. - * - * This is implemented as an array of arrays... granularity is the size - * of each arrays. - */ - -typedef struct _GOOM_HEAP GoomHeap; - -/* Constructors / Destructor */ -GoomHeap *goom_heap_new(void); -GoomHeap *goom_heap_new_with_granularity(int granularity); -void goom_heap_delete(GoomHeap *_this); - -/* This method behaves like malloc. */ -void *goom_heap_malloc(GoomHeap *_this, int nb_bytes); -/* This adds an alignment constraint. */ -void *goom_heap_malloc_with_alignment(GoomHeap *_this, int nb_bytes, int alignment); - -/* Returns a pointeur on the bytes... prefix is before */ -void *goom_heap_malloc_with_alignment_prefixed(GoomHeap *_this, int nb_bytes, - int alignment, int prefix_bytes); - -#endif - diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/goomsl_lex.c kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/goomsl_lex.c --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/goomsl_lex.c 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/goomsl_lex.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,2110 +0,0 @@ -#line 2 "goomsl_lex.c" - -#line 4 "goomsl_lex.c" - -#define YY_INT_ALIGNED short int - -/* A lexical scanner generated by flex */ - -#define FLEX_SCANNER -#define YY_FLEX_MAJOR_VERSION 2 -#define YY_FLEX_MINOR_VERSION 5 -#define YY_FLEX_SUBMINOR_VERSION 31 -#if YY_FLEX_SUBMINOR_VERSION > 0 -#define FLEX_BETA -#endif - -/* First, we deal with platform-specific or compiler-specific issues. */ - -/* begin standard C headers. */ -#include -#include -#include -#include - -/* end standard C headers. */ - -/* flex integer type definitions */ - -#ifndef FLEXINT_H -#define FLEXINT_H - -/* C99 systems have . Non-C99 systems may or may not. */ - -#if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L -#include -typedef int8_t flex_int8_t; -typedef uint8_t flex_uint8_t; -typedef int16_t flex_int16_t; -typedef uint16_t flex_uint16_t; -typedef int32_t flex_int32_t; -typedef uint32_t flex_uint32_t; -#else -typedef signed char flex_int8_t; -typedef short int flex_int16_t; -typedef int flex_int32_t; -typedef unsigned char flex_uint8_t; -typedef unsigned short int flex_uint16_t; -typedef unsigned int flex_uint32_t; -#endif /* ! C99 */ - -/* Limits of integral types. */ -#ifndef INT8_MIN -#define INT8_MIN (-128) -#endif -#ifndef INT16_MIN -#define INT16_MIN (-32767-1) -#endif -#ifndef INT32_MIN -#define INT32_MIN (-2147483647-1) -#endif -#ifndef INT8_MAX -#define INT8_MAX (127) -#endif -#ifndef INT16_MAX -#define INT16_MAX (32767) -#endif -#ifndef INT32_MAX -#define INT32_MAX (2147483647) -#endif -#ifndef UINT8_MAX -#define UINT8_MAX (255U) -#endif -#ifndef UINT16_MAX -#define UINT16_MAX (65535U) -#endif -#ifndef UINT32_MAX -#define UINT32_MAX (4294967295U) -#endif - -#endif /* ! FLEXINT_H */ - -#ifdef __cplusplus - -/* The "const" storage-class-modifier is valid. */ -#define YY_USE_CONST - -#else /* ! __cplusplus */ - -#if __STDC__ - -#define YY_USE_CONST - -#endif /* __STDC__ */ -#endif /* ! __cplusplus */ - -#ifdef YY_USE_CONST -#define yyconst const -#else -#define yyconst -#endif - -/* Returned upon end-of-file. */ -#define YY_NULL 0 - -/* Promotes a possibly negative, possibly signed char to an unsigned - * integer for use as an array index. If the signed char is negative, - * we want to instead treat it as an 8-bit unsigned char, hence the - * double cast. - */ -#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) - -/* Enter a start condition. This macro really ought to take a parameter, - * but we do it the disgusting crufty way forced on us by the ()-less - * definition of BEGIN. - */ -#define BEGIN (yy_start) = 1 + 2 * - -/* Translate the current start state into a value that can be later handed - * to BEGIN to return to the state. The YYSTATE alias is for lex - * compatibility. - */ -#define YY_START (((yy_start) - 1) / 2) -#define YYSTATE YY_START - -/* Action number for EOF rule of a given start state. */ -#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) - -/* Special action meaning "start processing a new file". */ -#define YY_NEW_FILE yyrestart(yyin ) - -#define YY_END_OF_BUFFER_CHAR 0 - -/* Size of default input buffer. */ -#ifndef YY_BUF_SIZE -#define YY_BUF_SIZE 16384 -#endif - -#ifndef YY_TYPEDEF_YY_BUFFER_STATE -#define YY_TYPEDEF_YY_BUFFER_STATE -typedef struct yy_buffer_state *YY_BUFFER_STATE; -#endif - -extern int yyleng; - -extern FILE *yyin, *yyout; - -#define EOB_ACT_CONTINUE_SCAN 0 -#define EOB_ACT_END_OF_FILE 1 -#define EOB_ACT_LAST_MATCH 2 - - /* Note: We specifically omit the test for yy_rule_can_match_eol because it requires - * access to the local variable yy_act. Since yyless() is a macro, it would break - * existing scanners that call yyless() from OUTSIDE yylex. - * One obvious solution it to make yy_act a global. I tried that, and saw - * a 5% performance hit in a non-yylineno scanner, because yy_act is - * normally declared as a register variable-- so it is not worth it. - */ - #define YY_LESS_LINENO(n) \ - do { \ - int yyl;\ - for ( yyl = n; yyl < yyleng; ++yyl )\ - if ( yytext[yyl] == '\n' )\ - --yylineno;\ - }while(0) - -/* Return all but the first "n" matched characters back to the input stream. */ -#define yyless(n) \ - do \ - { \ - /* Undo effects of setting up yytext. */ \ - int yyless_macro_arg = (n); \ - YY_LESS_LINENO(yyless_macro_arg);\ - *yy_cp = (yy_hold_char); \ - YY_RESTORE_YY_MORE_OFFSET \ - (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ - YY_DO_BEFORE_ACTION; /* set up yytext again */ \ - } \ - while ( 0 ) - -#define unput(c) yyunput( c, (yytext_ptr) ) - -/* The following is because we cannot portably get our hands on size_t - * (without autoconf's help, which isn't available because we want - * flex-generated scanners to compile on their own). - */ - -#ifndef YY_TYPEDEF_YY_SIZE_T -#define YY_TYPEDEF_YY_SIZE_T -typedef unsigned int yy_size_t; -#endif - -#ifndef YY_STRUCT_YY_BUFFER_STATE -#define YY_STRUCT_YY_BUFFER_STATE -struct yy_buffer_state - { - FILE *yy_input_file; - - char *yy_ch_buf; /* input buffer */ - char *yy_buf_pos; /* current position in input buffer */ - - /* Size of input buffer in bytes, not including room for EOB - * characters. - */ - yy_size_t yy_buf_size; - - /* Number of characters read into yy_ch_buf, not including EOB - * characters. - */ - int yy_n_chars; - - /* Whether we "own" the buffer - i.e., we know we created it, - * and can realloc() it to grow it, and should free() it to - * delete it. - */ - int yy_is_our_buffer; - - /* Whether this is an "interactive" input source; if so, and - * if we're using stdio for input, then we want to use getc() - * instead of fread(), to make sure we stop fetching input after - * each newline. - */ - int yy_is_interactive; - - /* Whether we're considered to be at the beginning of a line. - * If so, '^' rules will be active on the next match, otherwise - * not. - */ - int yy_at_bol; - - int yy_bs_lineno; /**< The line count. */ - int yy_bs_column; /**< The column count. */ - - /* Whether to try to fill the input buffer when we reach the - * end of it. - */ - int yy_fill_buffer; - - int yy_buffer_status; - -#define YY_BUFFER_NEW 0 -#define YY_BUFFER_NORMAL 1 - /* When an EOF's been seen but there's still some text to process - * then we mark the buffer as YY_EOF_PENDING, to indicate that we - * shouldn't try reading from the input source any more. We might - * still have a bunch of tokens to match, though, because of - * possible backing-up. - * - * When we actually see the EOF, we change the status to "new" - * (via yyrestart()), so that the user can continue scanning by - * just pointing yyin at a new input file. - */ -#define YY_BUFFER_EOF_PENDING 2 - - }; -#endif /* !YY_STRUCT_YY_BUFFER_STATE */ - -/* Stack of input buffers. */ -static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */ -static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */ -static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */ - -/* We provide macros for accessing buffer states in case in the - * future we want to put the buffer states in a more general - * "scanner state". - * - * Returns the top of the stack, or NULL. - */ -#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ - ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ - : NULL) - -/* Same as previous macro, but useful when we know that the buffer stack is not - * NULL or when we need an lvalue. For internal use only. - */ -#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] - -/* yy_hold_char holds the character lost when yytext is formed. */ -static char yy_hold_char; -static int yy_n_chars; /* number of characters read into yy_ch_buf */ -int yyleng; - -/* Points to current character in buffer. */ -static char *yy_c_buf_p = (char *) 0; -static int yy_init = 1; /* whether we need to initialize */ -static int yy_start = 0; /* start state number */ - -/* Flag which is used to allow yywrap()'s to do buffer switches - * instead of setting up a fresh yyin. A bit of a hack ... - */ -static int yy_did_buffer_switch_on_eof; - -void yyrestart (FILE *input_file ); -void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ); -YY_BUFFER_STATE yy_create_buffer (FILE *file,int size ); -void yy_delete_buffer (YY_BUFFER_STATE b ); -void yy_flush_buffer (YY_BUFFER_STATE b ); -void yypush_buffer_state (YY_BUFFER_STATE new_buffer ); -void yypop_buffer_state (void ); - -static void yyensure_buffer_stack (void ); -static void yy_load_buffer_state (void ); -static void yy_init_buffer (YY_BUFFER_STATE b,FILE *file ); - -#define YY_FLUSH_BUFFER yy_flush_buffer(YY_CURRENT_BUFFER ) - -YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size ); -YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str ); -YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,int len ); - -void *yyalloc (yy_size_t ); -void *yyrealloc (void *,yy_size_t ); -void yyfree (void * ); - -#define yy_new_buffer yy_create_buffer - -#define yy_set_interactive(is_interactive) \ - { \ - if ( ! YY_CURRENT_BUFFER ){ \ - yyensure_buffer_stack (); \ - YY_CURRENT_BUFFER_LVALUE = \ - yy_create_buffer(yyin,YY_BUF_SIZE ); \ - } \ - YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ - } - -#define yy_set_bol(at_bol) \ - { \ - if ( ! YY_CURRENT_BUFFER ){\ - yyensure_buffer_stack (); \ - YY_CURRENT_BUFFER_LVALUE = \ - yy_create_buffer(yyin,YY_BUF_SIZE ); \ - } \ - YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ - } - -#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) - -/* Begin user sect3 */ - -typedef unsigned char YY_CHAR; - -FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; - -typedef int yy_state_type; - -#define YY_FLEX_LEX_COMPAT -extern int yylineno; - -int yylineno = 1; - -extern char yytext[]; - -static yy_state_type yy_get_previous_state (void ); -static yy_state_type yy_try_NUL_trans (yy_state_type current_state ); -static int yy_get_next_buffer (void ); -static void yy_fatal_error (yyconst char msg[] ); - -/* Done after the current pattern has been matched and before the - * corresponding action - sets up yytext. - */ -#define YY_DO_BEFORE_ACTION \ - (yytext_ptr) = yy_bp; \ - yyleng = (size_t) (yy_cp - yy_bp); \ - (yy_hold_char) = *yy_cp; \ - *yy_cp = '\0'; \ - if ( yyleng + (yy_more_offset) >= YYLMAX ) \ - YY_FATAL_ERROR( "token too large, exceeds YYLMAX" ); \ - yy_flex_strncpy( &yytext[(yy_more_offset)], (yytext_ptr), yyleng + 1 ); \ - yyleng += (yy_more_offset); \ - (yy_prev_more_offset) = (yy_more_offset); \ - (yy_more_offset) = 0; \ - (yy_c_buf_p) = yy_cp; - -#define YY_NUM_RULES 49 -#define YY_END_OF_BUFFER 50 -/* This struct is not used in this scanner, - but its presence is necessary. */ -struct yy_trans_info - { - flex_int32_t yy_verify; - flex_int32_t yy_nxt; - }; -static yyconst flex_int16_t yy_acclist[214] = - { 0, - 50, 48, 49, 47, 48, 49, 4, 49, 48, 49, - 13, 48, 49, 10, 48, 49, 33, 48, 49, 48, - 49, 48, 49, 48, 49, 48, 49, 48, 49, 34, - 48, 49, 34, 48, 49, 48, 49, 48, 49, 33, - 48, 49, 33, 48, 49, 33, 48, 49, 33, 48, - 49, 33, 48, 49, 33, 48, 49, 33, 48, 49, - 33, 48, 49, 33, 48, 49, 33, 48, 49, 47, - 48, 49, 1, 4, 49, 48, 49, 7, 49, 6, - 49, 7, 49, 7, 49, 1, 6, 49, 7, 49, - 3, 49, 1, 3, 49, 17, 49, 49, 16, 17, - - 49, 17, 49, 47, 45, 10, 10, 10, 33, 40, - 39, 41, 11, 12, 42, 38, 37, 34, 43, 46, - 44, 33, 33, 28, 33, 33, 33, 33, 33, 30, - 33, 33, 33, 33, 33, 33, 47, 1, 12, 5, - 15, 14, 10, 10, 35, 37, 36, 33, 33, 33, - 33, 33, 29, 33, 19, 33, 26, 33, 21, 33, - 33, 33, 33, 2, 10, 10, 33, 33, 33, 33, - 33, 33, 33, 31, 33, 33, 10, 10, 33, 33, - 33, 32, 33, 18, 33, 33, 33, 27, 33, 10, - 10, 33, 33, 33, 22, 33, 25, 33, 10, 9, - - 10, 10, 20, 33, 23, 33, 33, 10, 24, 33, - 10, 8, 10 - } ; - -static yyconst flex_int16_t yy_accept[152] = - { 0, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, - 4, 7, 9, 11, 14, 17, 20, 22, 24, 26, - 28, 30, 33, 36, 38, 40, 43, 46, 49, 52, - 55, 58, 61, 64, 67, 70, 73, 76, 78, 80, - 82, 84, 86, 89, 91, 93, 96, 98, 99, 102, - 104, 105, 106, 107, 108, 109, 110, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 119, 120, 121, - 122, 123, 124, 126, 127, 128, 129, 130, 132, 133, - 134, 135, 136, 137, 138, 139, 139, 140, 141, 141, - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, - - 151, 152, 153, 155, 157, 159, 161, 162, 163, 164, - 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, - 174, 176, 177, 178, 179, 180, 181, 182, 184, 186, - 187, 188, 190, 191, 192, 193, 194, 195, 197, 199, - 200, 202, 203, 205, 207, 208, 209, 211, 212, 214, - 214 - } ; - -static yyconst flex_int32_t yy_ec[256] = - { 0, - 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 4, 5, 6, 7, 1, 8, 9, 10, 1, - 1, 11, 12, 1, 13, 14, 15, 16, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 1, 1, 18, - 19, 20, 1, 9, 21, 21, 21, 21, 22, 23, - 21, 21, 24, 21, 21, 25, 21, 26, 21, 21, - 21, 27, 28, 29, 21, 21, 21, 21, 21, 21, - 1, 30, 1, 1, 31, 1, 32, 33, 34, 35, - - 36, 37, 38, 39, 40, 21, 21, 41, 21, 42, - 43, 44, 21, 45, 46, 47, 48, 21, 49, 50, - 21, 21, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1 - } ; - -static yyconst flex_int32_t yy_meta[51] = - { 0, - 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 3, 1, 4, 4, 1, 1, 1, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, - 3, 4, 4, 4, 4, 4, 4, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 - } ; - -static yyconst flex_int16_t yy_base[159] = - { 0, - 0, 49, 51, 54, 221, 57, 60, 64, 223, 225, - 69, 225, 203, 225, 51, 0, 0, 202, 201, 200, - 64, 68, 72, 72, 199, 174, 57, 166, 55, 173, - 171, 166, 165, 166, 171, 99, 225, 93, 225, 225, - 194, 107, 225, 193, 225, 225, 225, 225, 225, 71, - 93, 225, 0, 183, 178, 0, 195, 225, 225, 225, - 225, 225, 225, 225, 89, 107, 0, 225, 225, 225, - 161, 169, 0, 155, 160, 157, 154, 151, 150, 151, - 150, 146, 153, 123, 225, 177, 188, 225, 126, 187, - 225, 225, 164, 159, 225, 100, 0, 146, 145, 149, - - 138, 151, 0, 0, 0, 0, 59, 146, 140, 177, - 225, 157, 147, 141, 144, 130, 138, 126, 130, 137, - 0, 134, 165, 143, 133, 112, 109, 0, 0, 102, - 92, 0, 130, 112, 93, 98, 101, 0, 0, 125, - 124, 94, 0, 0, 78, 59, 0, 61, 0, 225, - 141, 145, 149, 151, 155, 51, 159, 163 - } ; - -static yyconst flex_int16_t yy_def[159] = - { 0, - 150, 1, 151, 151, 151, 151, 152, 152, 150, 150, - 150, 150, 150, 150, 153, 154, 155, 150, 150, 150, - 150, 150, 150, 150, 150, 154, 154, 154, 154, 154, - 154, 154, 154, 154, 154, 150, 150, 150, 150, 150, - 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, - 150, 150, 153, 153, 153, 154, 150, 150, 150, 150, - 150, 150, 150, 150, 150, 150, 156, 150, 150, 150, - 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, - 154, 154, 154, 150, 150, 150, 157, 150, 150, 157, - 150, 150, 153, 153, 150, 150, 156, 154, 154, 154, - - 154, 154, 154, 154, 154, 154, 154, 154, 154, 157, - 150, 153, 153, 154, 154, 154, 154, 154, 154, 154, - 154, 154, 153, 153, 154, 154, 154, 154, 154, 154, - 154, 154, 158, 153, 154, 154, 154, 154, 154, 158, - 158, 153, 154, 154, 154, 153, 154, 153, 153, 0, - 150, 150, 150, 150, 150, 150, 150, 150 - } ; - -static yyconst flex_int16_t yy_nxt[276] = - { 0, - 10, 11, 12, 11, 13, 14, 15, 10, 16, 17, - 18, 19, 20, 10, 21, 22, 23, 24, 10, 25, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 10, - 16, 16, 26, 16, 27, 28, 29, 16, 16, 30, - 16, 31, 16, 32, 16, 33, 34, 16, 35, 16, - 36, 37, 36, 40, 97, 42, 43, 42, 42, 46, - 42, 41, 48, 38, 41, 49, 48, 149, 44, 49, - 51, 44, 51, 54, 61, 64, 91, 55, 62, 64, - 148, 65, 63, 66, 66, 65, 75, 66, 66, 50, - 68, 69, 72, 50, 51, 76, 51, 77, 119, 73, - - 84, 85, 84, 61, 96, 96, 120, 87, 89, 85, - 89, 63, 92, 86, 64, 96, 96, 67, 147, 146, - 65, 86, 66, 66, 84, 85, 84, 89, 85, 89, - 141, 141, 145, 144, 143, 142, 141, 86, 139, 138, - 86, 39, 39, 39, 39, 47, 47, 47, 47, 53, - 137, 53, 53, 56, 56, 57, 136, 57, 57, 110, - 110, 110, 110, 140, 135, 140, 140, 134, 133, 132, - 131, 130, 129, 128, 127, 126, 125, 124, 123, 111, - 122, 121, 118, 117, 116, 115, 114, 113, 112, 111, - 111, 90, 109, 108, 107, 106, 105, 104, 103, 102, - - 101, 100, 99, 98, 95, 94, 93, 90, 88, 83, - 82, 81, 80, 79, 78, 74, 71, 70, 60, 59, - 58, 52, 150, 45, 9, 150, 150, 150, 150, 150, - 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, - 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, - 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, - 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, - 150, 150, 150, 150, 150 - } ; - -static yyconst flex_int16_t yy_chk[276] = - { 0, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 2, 2, 2, 3, 156, 4, 4, 4, 6, 6, - 6, 3, 7, 2, 4, 7, 8, 148, 4, 8, - 11, 6, 11, 15, 21, 22, 50, 15, 21, 23, - 146, 22, 21, 22, 22, 23, 29, 23, 23, 7, - 24, 24, 27, 8, 51, 29, 51, 29, 107, 27, - - 36, 36, 36, 38, 65, 65, 107, 38, 42, 42, - 42, 38, 50, 36, 66, 96, 96, 22, 145, 142, - 66, 42, 66, 66, 84, 84, 84, 89, 89, 89, - 141, 140, 137, 136, 135, 134, 133, 84, 131, 130, - 89, 151, 151, 151, 151, 152, 152, 152, 152, 153, - 127, 153, 153, 154, 154, 155, 126, 155, 155, 157, - 157, 157, 157, 158, 125, 158, 158, 124, 123, 122, - 120, 119, 118, 117, 116, 115, 114, 113, 112, 110, - 109, 108, 102, 101, 100, 99, 98, 94, 93, 90, - 87, 86, 83, 82, 81, 80, 79, 78, 77, 76, - - 75, 74, 72, 71, 57, 55, 54, 44, 41, 35, - 34, 33, 32, 31, 30, 28, 26, 25, 20, 19, - 18, 13, 9, 5, 150, 150, 150, 150, 150, 150, - 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, - 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, - 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, - 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, - 150, 150, 150, 150, 150 - } ; - -/* Table of booleans, true if rule could match eol. */ -static yyconst flex_int32_t yy_rule_can_match_eol[50] = - { 0, -1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; - -extern int yy_flex_debug; -int yy_flex_debug = 0; - -static yy_state_type *yy_state_buf=0, *yy_state_ptr=0; -static char *yy_full_match; -static int yy_lp; -#define REJECT \ -{ \ -*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */ \ -yy_cp = (yy_full_match); /* restore poss. backed-over text */ \ -++(yy_lp); \ -goto find_rule; \ -} - -static int yy_more_offset = 0; -static int yy_prev_more_offset = 0; -#define yymore() ((yy_more_offset) = yy_flex_strlen( yytext )) -#define YY_NEED_STRLEN -#define YY_MORE_ADJ 0 -#define YY_RESTORE_YY_MORE_OFFSET \ - { \ - (yy_more_offset) = (yy_prev_more_offset); \ - yyleng -= (yy_more_offset); \ - } -#ifndef YYLMAX -#define YYLMAX 8192 -#endif - -char yytext[YYLMAX]; -char *yytext_ptr; -#line 1 "goomsl_lex.l" -#line 2 "goomsl_lex.l" - -#include -#include -#include -#include "goomsl.h" -#include "goomsl_private.h" -#include "goomsl_yacc.h" -void yyerror(char *); -void yyparse(void); - -GoomSL *currentGoomSL; -static int string_size; -static char string[1024]; - - - -#line 639 "goomsl_lex.c" - -#define INITIAL 0 -#define C_COMMENT 1 -#define LINE_COMMENT 2 -#define STRING 3 - -/* Special case for "unistd.h", since it is non-ANSI. We include it way - * down here because we want the user's section 1 to have been scanned first. - * The user has a chance to override it with an option. - */ -#ifndef _WIN32PC -#include -#endif - -#ifndef YY_EXTRA_TYPE -#define YY_EXTRA_TYPE void * -#endif - -/* Macros after this point can all be overridden by user definitions in - * section 1. - */ - -#ifndef YY_SKIP_YYWRAP -#ifdef __cplusplus -extern "C" int yywrap (void ); -#else -extern int yywrap (void ); -#endif -#endif - - static void yyunput (int c,char *buf_ptr ); - -#ifndef yytext_ptr -static void yy_flex_strncpy (char *,yyconst char *,int ); -#endif - -#ifdef YY_NEED_STRLEN -static int yy_flex_strlen (yyconst char * ); -#endif - -#ifndef YY_NO_INPUT - -#ifdef __cplusplus -static int yyinput (void ); -#else -static int input (void ); -#endif - -#endif - -/* Amount of stuff to slurp up with each read. */ -#ifndef YY_READ_BUF_SIZE -#define YY_READ_BUF_SIZE 8192 -#endif - -/* Copy whatever the last rule matched to the standard output. */ -#ifndef ECHO -/* This used to be an fputs(), but since the string might contain NUL's, - * we now use fwrite(). - */ -#define ECHO (void) fwrite( yytext, yyleng, 1, yyout ) -#endif - -/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, - * is returned in "result". - */ -#ifndef YY_INPUT -#define YY_INPUT(buf,result,max_size) \ - if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ - { \ - int c = '*'; \ - size_t n; \ - for ( n = 0; n < max_size && \ - (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ - buf[n] = (char) c; \ - if ( c == '\n' ) \ - buf[n++] = (char) c; \ - if ( c == EOF && ferror( yyin ) ) \ - YY_FATAL_ERROR( "input in flex scanner failed" ); \ - result = n; \ - } \ - else \ - { \ - errno=0; \ - while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \ - { \ - if( errno != EINTR) \ - { \ - YY_FATAL_ERROR( "input in flex scanner failed" ); \ - break; \ - } \ - errno=0; \ - clearerr(yyin); \ - } \ - }\ -\ - -#endif - -/* No semi-colon after return; correct usage is to write "yyterminate();" - - * we don't want an extra ';' after the "return" because that will cause - * some compilers to complain about unreachable statements. - */ -#ifndef yyterminate -#define yyterminate() return YY_NULL -#endif - -/* Number of entries by which start-condition stack grows. */ -#ifndef YY_START_STACK_INCR -#define YY_START_STACK_INCR 25 -#endif - -/* Report a fatal error. */ -#ifndef YY_FATAL_ERROR -#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) -#endif - -/* end tables serialization structures and prototypes */ - -/* Default declaration of generated scanner - a define so the user can - * easily add parameters. - */ -#ifndef YY_DECL -#define YY_DECL_IS_OURS 1 - -extern int yylex (void); - -#define YY_DECL int yylex (void) -#endif /* !YY_DECL */ - -/* Code executed at the beginning of each rule, after yytext and yyleng - * have been set up. - */ -#ifndef YY_USER_ACTION -#define YY_USER_ACTION -#endif - -/* Code executed at the end of each rule. */ -#ifndef YY_BREAK -#define YY_BREAK break; -#endif - -#define YY_RULE_SETUP \ - if ( yyleng > 0 ) \ - YY_CURRENT_BUFFER_LVALUE->yy_at_bol = \ - (yytext[yyleng - 1] == '\n'); \ - YY_USER_ACTION - -/** The main scanner function which does all the work. - */ -YY_DECL -{ - register yy_state_type yy_current_state; - register char *yy_cp, *yy_bp; - register int yy_act; - -#line 25 "goomsl_lex.l" - - -#line 797 "goomsl_lex.c" - - if ( (yy_init) ) - { - (yy_init) = 0; - -#ifdef YY_USER_INIT - YY_USER_INIT; -#endif - - if ( ! (yy_state_buf) ) - (yy_state_buf) = (yy_state_type *)yyalloc(YY_BUF_SIZE + 2 ); - - if ( ! (yy_start) ) - (yy_start) = 1; /* first start state */ - - if ( ! yyin ) - yyin = stdin; - - if ( ! yyout ) - yyout = stdout; - - if ( ! YY_CURRENT_BUFFER ) { - yyensure_buffer_stack (); - YY_CURRENT_BUFFER_LVALUE = - yy_create_buffer(yyin,YY_BUF_SIZE ); - } - - yy_load_buffer_state( ); - } - - while ( 1 ) /* loops until end-of-file is reached */ - { - yy_cp = (yy_c_buf_p); - - /* Support of yytext. */ - *yy_cp = (yy_hold_char); - - /* yy_bp points to the position in yy_ch_buf of the start of - * the current run. - */ - yy_bp = yy_cp; - - yy_current_state = (yy_start); - yy_current_state += YY_AT_BOL(); - - (yy_state_ptr) = (yy_state_buf); - *(yy_state_ptr)++ = yy_current_state; - -yy_match: - do - { - register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; - while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) - { - yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 151 ) - yy_c = yy_meta[(unsigned int) yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - *(yy_state_ptr)++ = yy_current_state; - ++yy_cp; - } - while ( yy_base[yy_current_state] != 225 ); - -yy_find_action: - yy_current_state = *--(yy_state_ptr); - (yy_lp) = yy_accept[yy_current_state]; -find_rule: /* we branch to this label when backing up */ - for ( ; ; ) /* until we find what rule we matched */ - { - if ( (yy_lp) && (yy_lp) < yy_accept[yy_current_state + 1] ) - { - yy_act = yy_acclist[(yy_lp)]; - { - (yy_full_match) = yy_cp; - break; - } - } - --yy_cp; - yy_current_state = *--(yy_state_ptr); - (yy_lp) = yy_accept[yy_current_state]; - } - - YY_DO_BEFORE_ACTION; - - if ( yy_act != YY_END_OF_BUFFER && yy_rule_can_match_eol[yy_act] ) - { - int yyl; - for ( yyl = (yy_prev_more_offset); yyl < yyleng; ++yyl ) - if ( yytext[yyl] == '\n' ) - - yylineno++; -; - } - -do_action: /* This label is used only to access EOF actions. */ - - switch ( yy_act ) - { /* beginning of action switch */ -case 1: -/* rule 1 can match eol */ -YY_RULE_SETUP -#line 27 "goomsl_lex.l" -{ ++currentGoomSL->num_lines; /* Ignore empty lines */ } - YY_BREAK -case 2: -/* rule 2 can match eol */ -YY_RULE_SETUP -#line 28 "goomsl_lex.l" -{ ++currentGoomSL->num_lines; /* Ignore empty lines */ } - YY_BREAK -case 3: -/* rule 3 can match eol */ -YY_RULE_SETUP -#line 30 "goomsl_lex.l" -{ ++currentGoomSL->num_lines; yylval.charValue=*yytext; BEGIN INITIAL; return '\n'; } - YY_BREAK -case 4: -/* rule 4 can match eol */ -YY_RULE_SETUP -#line 31 "goomsl_lex.l" -{ ++currentGoomSL->num_lines; yylval.charValue=*yytext; return '\n'; } - YY_BREAK -case 5: -YY_RULE_SETUP -#line 33 "goomsl_lex.l" -{ BEGIN INITIAL; } - YY_BREAK -case 6: -/* rule 6 can match eol */ -YY_RULE_SETUP -#line 34 "goomsl_lex.l" -{ ++currentGoomSL->num_lines; } - YY_BREAK -case 7: -YY_RULE_SETUP -#line 35 "goomsl_lex.l" -{ /* eat up comment */ } - YY_BREAK -case 8: -YY_RULE_SETUP -#line 37 "goomsl_lex.l" -{ currentGoomSL->num_lines = 0; } - YY_BREAK -case 9: -YY_RULE_SETUP -#line 38 "goomsl_lex.l" -{ currentGoomSL->num_lines = 0; printf("%s\n", yytext); } - YY_BREAK -case 10: -YY_RULE_SETUP -#line 39 "goomsl_lex.l" -{ /* ignore preprocessor lines */ } - YY_BREAK -case 11: -YY_RULE_SETUP -#line 41 "goomsl_lex.l" -{ BEGIN C_COMMENT; } - YY_BREAK -case 12: -YY_RULE_SETUP -#line 42 "goomsl_lex.l" -{ BEGIN LINE_COMMENT; } - YY_BREAK -case 13: -YY_RULE_SETUP -#line 43 "goomsl_lex.l" -{ BEGIN STRING; string_size=0; } - YY_BREAK -case 14: -YY_RULE_SETUP -#line 45 "goomsl_lex.l" -{ string[string_size++] = '\n'; } - YY_BREAK -case 15: -YY_RULE_SETUP -#line 46 "goomsl_lex.l" -{ string[string_size++] = '\"'; } - YY_BREAK -case 16: -YY_RULE_SETUP -#line 47 "goomsl_lex.l" -{ /* fin de la chaine: on cree le pointeur qui va bien */ - unsigned int tmp; - BEGIN INITIAL; - string[string_size]=0; - tmp = gsl_malloc(currentGoomSL, string_size+1); - strcpy((char*)currentGoomSL->ptrArray[tmp],string); - sprintf(yylval.strValue, "0x%08x", tmp); - return LTYPE_PTR; - } - YY_BREAK -case 17: -YY_RULE_SETUP -#line 56 "goomsl_lex.l" -{ string[string_size++] = *yytext; } - YY_BREAK -case 18: -YY_RULE_SETUP -#line 58 "goomsl_lex.l" -{ return FLOAT_TK; } - YY_BREAK -case 19: -YY_RULE_SETUP -#line 59 "goomsl_lex.l" -{ return INT_TK; } - YY_BREAK -case 20: -YY_RULE_SETUP -#line 60 "goomsl_lex.l" -{ return INT_TK; } - YY_BREAK -case 21: -YY_RULE_SETUP -#line 61 "goomsl_lex.l" -{ return PTR_TK; } - YY_BREAK -case 22: -YY_RULE_SETUP -#line 62 "goomsl_lex.l" -{ return PTR_TK; } - YY_BREAK -case 23: -YY_RULE_SETUP -#line 63 "goomsl_lex.l" -{ return DECLARE; } - YY_BREAK -case 24: -YY_RULE_SETUP -#line 64 "goomsl_lex.l" -{ return EXTERNAL; } - YY_BREAK -case 25: -YY_RULE_SETUP -#line 65 "goomsl_lex.l" -{ return STRUCT; } - YY_BREAK -case 26: -YY_RULE_SETUP -#line 66 "goomsl_lex.l" -{ return NOT; } - YY_BREAK -case 27: -YY_RULE_SETUP -#line 67 "goomsl_lex.l" -{ return WHILE; } - YY_BREAK -case 28: -YY_RULE_SETUP -#line 68 "goomsl_lex.l" -{ return DO; } - YY_BREAK -case 29: -YY_RULE_SETUP -#line 69 "goomsl_lex.l" -{ return FOR; } - YY_BREAK -case 30: -YY_RULE_SETUP -#line 70 "goomsl_lex.l" -{ return IN; } - YY_BREAK -case 31: -YY_RULE_SETUP -#line 71 "goomsl_lex.l" -{ strncpy(yylval.strValue, "1", 2047); return LTYPE_INTEGER; } - YY_BREAK -case 32: -YY_RULE_SETUP -#line 72 "goomsl_lex.l" -{ strncpy(yylval.strValue, "0", 2047); return LTYPE_INTEGER; } - YY_BREAK -case 33: -YY_RULE_SETUP -#line 73 "goomsl_lex.l" -{ strncpy(yylval.strValue, yytext, 2047); return LTYPE_VAR; } - YY_BREAK -case 34: -YY_RULE_SETUP -#line 74 "goomsl_lex.l" -{ strncpy(yylval.strValue, yytext, 2047); return LTYPE_INTEGER; } - YY_BREAK -case 35: -YY_RULE_SETUP -#line 75 "goomsl_lex.l" -{ sprintf(yylval.strValue, "%d", (int)yytext[1]); return LTYPE_INTEGER; } - YY_BREAK -case 36: -YY_RULE_SETUP -#line 76 "goomsl_lex.l" -{ strncpy(yylval.strValue, yytext, 2047); return LTYPE_INTEGER; } - YY_BREAK -case 37: -YY_RULE_SETUP -#line 77 "goomsl_lex.l" -{ strncpy(yylval.strValue, yytext, 2047); return LTYPE_FLOAT; } - YY_BREAK -case 38: -YY_RULE_SETUP -#line 78 "goomsl_lex.l" -{ sprintf(yylval.strValue, "%3.2f", atof(yytext)/100.0f); return LTYPE_FLOAT; } - YY_BREAK -case 39: -YY_RULE_SETUP -#line 79 "goomsl_lex.l" -{ return PLUS_EQ; } - YY_BREAK -case 40: -YY_RULE_SETUP -#line 80 "goomsl_lex.l" -{ return MUL_EQ; } - YY_BREAK -case 41: -YY_RULE_SETUP -#line 81 "goomsl_lex.l" -{ return SUB_EQ; } - YY_BREAK -case 42: -YY_RULE_SETUP -#line 82 "goomsl_lex.l" -{ return DIV_EQ; } - YY_BREAK -case 43: -YY_RULE_SETUP -#line 83 "goomsl_lex.l" -{ return LOW_EQ; } - YY_BREAK -case 44: -YY_RULE_SETUP -#line 84 "goomsl_lex.l" -{ return SUP_EQ; } - YY_BREAK -case 45: -YY_RULE_SETUP -#line 85 "goomsl_lex.l" -{ return NOT_EQ; } - YY_BREAK -case 46: -YY_RULE_SETUP -#line 86 "goomsl_lex.l" -{ return NOT_EQ; } - YY_BREAK -case 47: -YY_RULE_SETUP -#line 87 "goomsl_lex.l" -/* eat up whitespace */ - YY_BREAK -case 48: -YY_RULE_SETUP -#line 88 "goomsl_lex.l" -{ yylval.charValue = *yytext; return *yytext; } - YY_BREAK -case 49: -YY_RULE_SETUP -#line 90 "goomsl_lex.l" -ECHO; - YY_BREAK -#line 1155 "goomsl_lex.c" - case YY_STATE_EOF(INITIAL): - case YY_STATE_EOF(C_COMMENT): - case YY_STATE_EOF(LINE_COMMENT): - case YY_STATE_EOF(STRING): - yyterminate(); - - case YY_END_OF_BUFFER: - { - /* Amount of text matched not including the EOB char. */ - int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; - - /* Undo the effects of YY_DO_BEFORE_ACTION. */ - *yy_cp = (yy_hold_char); - YY_RESTORE_YY_MORE_OFFSET - - if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) - { - /* We're scanning a new file or input source. It's - * possible that this happened because the user - * just pointed yyin at a new source and called - * yylex(). If so, then we have to assure - * consistency between YY_CURRENT_BUFFER and our - * globals. Here is the right place to do so, because - * this is the first action (other than possibly a - * back-up) that will match for the new input source. - */ - (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; - YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; - YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; - } - - /* Note that here we test for yy_c_buf_p "<=" to the position - * of the first EOB in the buffer, since yy_c_buf_p will - * already have been incremented past the NUL character - * (since all states make transitions on EOB to the - * end-of-buffer state). Contrast this with the test - * in input(). - */ - if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) - { /* This was really a NUL. */ - yy_state_type yy_next_state; - - (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; - - yy_current_state = yy_get_previous_state( ); - - /* Okay, we're now positioned to make the NUL - * transition. We couldn't have - * yy_get_previous_state() go ahead and do it - * for us because it doesn't know how to deal - * with the possibility of jamming (and we don't - * want to build jamming into it because then it - * will run more slowly). - */ - - yy_next_state = yy_try_NUL_trans( yy_current_state ); - - yy_bp = (yytext_ptr) + YY_MORE_ADJ; - - if ( yy_next_state ) - { - /* Consume the NUL. */ - yy_cp = ++(yy_c_buf_p); - yy_current_state = yy_next_state; - goto yy_match; - } - - else - { - yy_cp = (yy_c_buf_p); - goto yy_find_action; - } - } - - else switch ( yy_get_next_buffer( ) ) - { - case EOB_ACT_END_OF_FILE: - { - (yy_did_buffer_switch_on_eof) = 0; - - if ( yywrap( ) ) - { - /* Note: because we've taken care in - * yy_get_next_buffer() to have set up - * yytext, we can now set up - * yy_c_buf_p so that if some total - * hoser (like flex itself) wants to - * call the scanner after we return the - * YY_NULL, it'll still work - another - * YY_NULL will get returned. - */ - (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; - - yy_act = YY_STATE_EOF(YY_START); - goto do_action; - } - - else - { - if ( ! (yy_did_buffer_switch_on_eof) ) - YY_NEW_FILE; - } - break; - } - - case EOB_ACT_CONTINUE_SCAN: - (yy_c_buf_p) = - (yytext_ptr) + yy_amount_of_matched_text; - - yy_current_state = yy_get_previous_state( ); - - yy_cp = (yy_c_buf_p); - yy_bp = (yytext_ptr) + YY_MORE_ADJ; - goto yy_match; - - case EOB_ACT_LAST_MATCH: - (yy_c_buf_p) = - &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; - - yy_current_state = yy_get_previous_state( ); - - yy_cp = (yy_c_buf_p); - yy_bp = (yytext_ptr) + YY_MORE_ADJ; - goto yy_find_action; - } - break; - } - - default: - YY_FATAL_ERROR( - "fatal flex scanner internal error--no action found" ); - } /* end of action switch */ - } /* end of scanning one token */ -} /* end of yylex */ - -/* yy_get_next_buffer - try to read in a new buffer - * - * Returns a code representing an action: - * EOB_ACT_LAST_MATCH - - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position - * EOB_ACT_END_OF_FILE - end of file - */ -static int yy_get_next_buffer (void) -{ - register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; - register char *source = (yytext_ptr); - register int number_to_move, i; - int ret_val; - - if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) - YY_FATAL_ERROR( - "fatal flex scanner internal error--end of buffer missed" ); - - if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) - { /* Don't try to fill the buffer, so this is an EOF. */ - if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) - { - /* We matched a single character, the EOB, so - * treat this as a final EOF. - */ - return EOB_ACT_END_OF_FILE; - } - - else - { - /* We matched some text prior to the EOB, first - * process it. - */ - return EOB_ACT_LAST_MATCH; - } - } - - /* Try to read more data. */ - - /* First move last chars to start of buffer. */ - number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; - - for ( i = 0; i < number_to_move; ++i ) - *(dest++) = *(source++); - - if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) - /* don't do the read, it's not guaranteed to return an EOF, - * just force an EOF - */ - YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; - - else - { - size_t num_to_read = - YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; - - while ( num_to_read <= 0 ) - { /* Not enough room in the buffer - grow it. */ - - YY_FATAL_ERROR( -"input buffer overflow, can't enlarge buffer because scanner uses REJECT" ); - - } - - if ( num_to_read > YY_READ_BUF_SIZE ) - num_to_read = YY_READ_BUF_SIZE; - - /* Read in more data. */ - YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), - (yy_n_chars), num_to_read ); - - YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); - } - - if ( (yy_n_chars) == 0 ) - { - if ( number_to_move == YY_MORE_ADJ ) - { - ret_val = EOB_ACT_END_OF_FILE; - yyrestart(yyin ); - } - - else - { - ret_val = EOB_ACT_LAST_MATCH; - YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = - YY_BUFFER_EOF_PENDING; - } - } - - else - ret_val = EOB_ACT_CONTINUE_SCAN; - - (yy_n_chars) += number_to_move; - YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; - YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; - - (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; - - return ret_val; -} - -/* yy_get_previous_state - get the state just before the EOB char was reached */ - - static yy_state_type yy_get_previous_state (void) -{ - register yy_state_type yy_current_state; - register char *yy_cp; - - yy_current_state = (yy_start); - yy_current_state += YY_AT_BOL(); - - (yy_state_ptr) = (yy_state_buf); - *(yy_state_ptr)++ = yy_current_state; - - for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) - { - register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); - while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) - { - yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 151 ) - yy_c = yy_meta[(unsigned int) yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - *(yy_state_ptr)++ = yy_current_state; - } - - return yy_current_state; -} - -/* yy_try_NUL_trans - try to make a transition on the NUL character - * - * synopsis - * next_state = yy_try_NUL_trans( current_state ); - */ - static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state ) -{ - register int yy_is_jam; - - register YY_CHAR yy_c = 1; - while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) - { - yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 151 ) - yy_c = yy_meta[(unsigned int) yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - yy_is_jam = (yy_current_state == 150); - if ( ! yy_is_jam ) - *(yy_state_ptr)++ = yy_current_state; - - return yy_is_jam ? 0 : yy_current_state; -} - - static void yyunput (int c, register char * yy_bp ) -{ - register char *yy_cp; - - yy_cp = (yy_c_buf_p); - - /* undo effects of setting up yytext */ - *yy_cp = (yy_hold_char); - - if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) - { /* need to shift things up to make room */ - /* +2 for EOB chars. */ - register int number_to_move = (yy_n_chars) + 2; - register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ - YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; - register char *source = - &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; - - while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) - *--dest = *--source; - - yy_cp += (int) (dest - source); - yy_bp += (int) (dest - source); - YY_CURRENT_BUFFER_LVALUE->yy_n_chars = - (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size; - - if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) - YY_FATAL_ERROR( "flex scanner push-back overflow" ); - } - - *--yy_cp = (char) c; - - if ( c == '\n' ){ - --yylineno; - } - - (yytext_ptr) = yy_bp; - (yy_hold_char) = *yy_cp; - (yy_c_buf_p) = yy_cp; -} - -#ifndef YY_NO_INPUT -#ifdef __cplusplus - static int yyinput (void) -#else - static int input (void) -#endif - -{ - int c; - - *(yy_c_buf_p) = (yy_hold_char); - - if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) - { - /* yy_c_buf_p now points to the character we want to return. - * If this occurs *before* the EOB characters, then it's a - * valid NUL; if not, then we've hit the end of the buffer. - */ - if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) - /* This was really a NUL. */ - *(yy_c_buf_p) = '\0'; - - else - { /* need more input */ - int offset = (yy_c_buf_p) - (yytext_ptr); - ++(yy_c_buf_p); - - switch ( yy_get_next_buffer( ) ) - { - case EOB_ACT_LAST_MATCH: - /* This happens because yy_g_n_b() - * sees that we've accumulated a - * token and flags that we need to - * try matching the token before - * proceeding. But for input(), - * there's no matching to consider. - * So convert the EOB_ACT_LAST_MATCH - * to EOB_ACT_END_OF_FILE. - */ - - /* Reset buffer status. */ - yyrestart(yyin ); - - /*FALLTHROUGH*/ - - case EOB_ACT_END_OF_FILE: - { - if ( yywrap( ) ) - return EOF; - - if ( ! (yy_did_buffer_switch_on_eof) ) - YY_NEW_FILE; -#ifdef __cplusplus - return yyinput(); -#else - return input(); -#endif - } - - case EOB_ACT_CONTINUE_SCAN: - (yy_c_buf_p) = (yytext_ptr) + offset; - break; - } - } - } - - c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ - *(yy_c_buf_p) = '\0'; /* preserve yytext */ - (yy_hold_char) = *++(yy_c_buf_p); - - YY_CURRENT_BUFFER_LVALUE->yy_at_bol = (c == '\n'); - if ( YY_CURRENT_BUFFER_LVALUE->yy_at_bol ) - - yylineno++; -; - - return c; -} -#endif /* ifndef YY_NO_INPUT */ - -/** Immediately switch to a different input stream. - * @param input_file A readable stream. - * - * @note This function does not reset the start condition to @c INITIAL . - */ - void yyrestart (FILE * input_file ) -{ - - if ( ! YY_CURRENT_BUFFER ){ - yyensure_buffer_stack (); - YY_CURRENT_BUFFER_LVALUE = - yy_create_buffer(yyin,YY_BUF_SIZE ); - } - - yy_init_buffer(YY_CURRENT_BUFFER,input_file ); - yy_load_buffer_state( ); -} - -/** Switch to a different input buffer. - * @param new_buffer The new input buffer. - * - */ - void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ) -{ - - /* TODO. We should be able to replace this entire function body - * with - * yypop_buffer_state(); - * yypush_buffer_state(new_buffer); - */ - yyensure_buffer_stack (); - if ( YY_CURRENT_BUFFER == new_buffer ) - return; - - if ( YY_CURRENT_BUFFER ) - { - /* Flush out information for old buffer. */ - *(yy_c_buf_p) = (yy_hold_char); - YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); - YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); - } - - YY_CURRENT_BUFFER_LVALUE = new_buffer; - yy_load_buffer_state( ); - - /* We don't actually know whether we did this switch during - * EOF (yywrap()) processing, but the only time this flag - * is looked at is after yywrap() is called, so it's safe - * to go ahead and always set it. - */ - (yy_did_buffer_switch_on_eof) = 1; -} - -static void yy_load_buffer_state (void) -{ - (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; - (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; - yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; - (yy_hold_char) = *(yy_c_buf_p); -} - -/** Allocate and initialize an input buffer state. - * @param file A readable stream. - * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. - * - * @return the allocated buffer state. - */ - YY_BUFFER_STATE yy_create_buffer (FILE * file, int size ) -{ - YY_BUFFER_STATE b; - - b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); - if ( ! b ) - YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); - - b->yy_buf_size = size; - - /* yy_ch_buf has to be 2 characters longer than the size given because - * we need to put in 2 end-of-buffer characters. - */ - b->yy_ch_buf = (char *) yyalloc(b->yy_buf_size + 2 ); - if ( ! b->yy_ch_buf ) - YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); - - b->yy_is_our_buffer = 1; - - yy_init_buffer(b,file ); - - return b; -} - -/** Destroy the buffer. - * @param b a buffer created with yy_create_buffer() - * - */ - void yy_delete_buffer (YY_BUFFER_STATE b ) -{ - - if ( ! b ) - return; - - if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ - YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; - - if ( b->yy_is_our_buffer ) - yyfree((void *) b->yy_ch_buf ); - - yyfree((void *) b ); -} - -#ifndef __cplusplus -extern int isatty (int ); -#endif /* __cplusplus */ - -/* Initializes or reinitializes a buffer. - * This function is sometimes called more than once on the same buffer, - * such as during a yyrestart() or at EOF. - */ - static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file ) - -{ - int oerrno = errno; - - yy_flush_buffer(b ); - - b->yy_input_file = file; - b->yy_fill_buffer = 1; - - /* If b is the current buffer, then yy_init_buffer was _probably_ - * called from yyrestart() or through yy_get_next_buffer. - * In that case, we don't want to reset the lineno or column. - */ - if (b != YY_CURRENT_BUFFER){ - b->yy_bs_lineno = 1; - b->yy_bs_column = 0; - } - - b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; - - errno = oerrno; -} - -/** Discard all buffered characters. On the next scan, YY_INPUT will be called. - * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. - * - */ - void yy_flush_buffer (YY_BUFFER_STATE b ) -{ - if ( ! b ) - return; - - b->yy_n_chars = 0; - - /* We always need two end-of-buffer characters. The first causes - * a transition to the end-of-buffer state. The second causes - * a jam in that state. - */ - b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; - b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; - - b->yy_buf_pos = &b->yy_ch_buf[0]; - - b->yy_at_bol = 1; - b->yy_buffer_status = YY_BUFFER_NEW; - - if ( b == YY_CURRENT_BUFFER ) - yy_load_buffer_state( ); -} - -/** Pushes the new state onto the stack. The new state becomes - * the current state. This function will allocate the stack - * if necessary. - * @param new_buffer The new state. - * - */ -void yypush_buffer_state (YY_BUFFER_STATE new_buffer ) -{ - if (new_buffer == NULL) - return; - - yyensure_buffer_stack(); - - /* This block is copied from yy_switch_to_buffer. */ - if ( YY_CURRENT_BUFFER ) - { - /* Flush out information for old buffer. */ - *(yy_c_buf_p) = (yy_hold_char); - YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); - YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); - } - - /* Only push if top exists. Otherwise, replace top. */ - if (YY_CURRENT_BUFFER) - (yy_buffer_stack_top)++; - YY_CURRENT_BUFFER_LVALUE = new_buffer; - - /* copied from yy_switch_to_buffer. */ - yy_load_buffer_state( ); - (yy_did_buffer_switch_on_eof) = 1; -} - -/** Removes and deletes the top of the stack, if present. - * The next element becomes the new top. - * - */ -void yypop_buffer_state (void) -{ - if (!YY_CURRENT_BUFFER) - return; - - yy_delete_buffer(YY_CURRENT_BUFFER ); - YY_CURRENT_BUFFER_LVALUE = NULL; - if ((yy_buffer_stack_top) > 0) - --(yy_buffer_stack_top); - - if (YY_CURRENT_BUFFER) { - yy_load_buffer_state( ); - (yy_did_buffer_switch_on_eof) = 1; - } -} - -/* Allocates the stack if it does not exist. - * Guarantees space for at least one push. - */ -static void yyensure_buffer_stack (void) -{ - int num_to_alloc; - - if (!(yy_buffer_stack)) { - - /* First allocation is just for 2 elements, since we don't know if this - * scanner will even need a stack. We use 2 instead of 1 to avoid an - * immediate realloc on the next call. - */ - num_to_alloc = 1; - (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc - (num_to_alloc * sizeof(struct yy_buffer_state*) - ); - - memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); - - (yy_buffer_stack_max) = num_to_alloc; - (yy_buffer_stack_top) = 0; - return; - } - - if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ - - /* Increase the buffer to prepare for a possible push. */ - int grow_size = 8 /* arbitrary grow size */; - - num_to_alloc = (yy_buffer_stack_max) + grow_size; - (yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc - ((yy_buffer_stack), - num_to_alloc * sizeof(struct yy_buffer_state*) - ); - - /* zero only the new slots.*/ - memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); - (yy_buffer_stack_max) = num_to_alloc; - } -} - -/** Setup the input buffer state to scan directly from a user-specified character buffer. - * @param base the character buffer - * @param size the size in bytes of the character buffer - * - * @return the newly allocated buffer state object. - */ -YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size ) -{ - YY_BUFFER_STATE b; - - if ( size < 2 || - base[size-2] != YY_END_OF_BUFFER_CHAR || - base[size-1] != YY_END_OF_BUFFER_CHAR ) - /* They forgot to leave room for the EOB's. */ - return 0; - - b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); - if ( ! b ) - YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); - - b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ - b->yy_buf_pos = b->yy_ch_buf = base; - b->yy_is_our_buffer = 0; - b->yy_input_file = 0; - b->yy_n_chars = b->yy_buf_size; - b->yy_is_interactive = 0; - b->yy_at_bol = 1; - b->yy_fill_buffer = 0; - b->yy_buffer_status = YY_BUFFER_NEW; - - yy_switch_to_buffer(b ); - - return b; -} - -/** Setup the input buffer state to scan a string. The next call to yylex() will - * scan from a @e copy of @a str. - * @param str a NUL-terminated string to scan - * - * @return the newly allocated buffer state object. - * @note If you want to scan bytes that may contain NUL values, then use - * yy_scan_bytes() instead. - */ -YY_BUFFER_STATE yy_scan_string (yyconst char * str ) -{ - - return yy_scan_bytes(str,strlen(str) ); -} - -/** Setup the input buffer state to scan the given bytes. The next call to yylex() will - * scan from a @e copy of @a bytes. - * @param bytes the byte buffer to scan - * @param len the number of bytes in the buffer pointed to by @a bytes. - * - * @return the newly allocated buffer state object. - */ -YY_BUFFER_STATE yy_scan_bytes (yyconst char * bytes, int len ) -{ - YY_BUFFER_STATE b; - char *buf; - yy_size_t n; - int i; - - /* Get memory for full buffer, including space for trailing EOB's. */ - n = len + 2; - buf = (char *) yyalloc(n ); - if ( ! buf ) - YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); - - for ( i = 0; i < len; ++i ) - buf[i] = bytes[i]; - - buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR; - - b = yy_scan_buffer(buf,n ); - if ( ! b ) - YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); - - /* It's okay to grow etc. this buffer, and we should throw it - * away when we're done. - */ - b->yy_is_our_buffer = 1; - - return b; -} - -#ifndef YY_EXIT_FAILURE -#define YY_EXIT_FAILURE 2 -#endif - -static void yy_fatal_error (yyconst char* msg ) -{ - (void) fprintf( stderr, "%s\n", msg ); - exit( YY_EXIT_FAILURE ); -} - -/* Redefine yyless() so it works in section 3 code. */ - -#undef yyless -#define yyless(n) \ - do \ - { \ - /* Undo effects of setting up yytext. */ \ - int yyless_macro_arg = (n); \ - YY_LESS_LINENO(yyless_macro_arg);\ - yytext[yyleng] = (yy_hold_char); \ - (yy_c_buf_p) = yytext + yyless_macro_arg; \ - (yy_hold_char) = *(yy_c_buf_p); \ - *(yy_c_buf_p) = '\0'; \ - yyleng = yyless_macro_arg; \ - } \ - while ( 0 ) - -/* Accessor methods (get/set functions) to struct members. */ - -/** Get the current line number. - * - */ -int yyget_lineno (void) -{ - - return yylineno; -} - -/** Get the input stream. - * - */ -FILE *yyget_in (void) -{ - return yyin; -} - -/** Get the output stream. - * - */ -FILE *yyget_out (void) -{ - return yyout; -} - -/** Get the length of the current token. - * - */ -int yyget_leng (void) -{ - return yyleng; -} - -/** Get the current token. - * - */ - -char *yyget_text (void) -{ - return yytext; -} - -/** Set the current line number. - * @param line_number - * - */ -void yyset_lineno (int line_number ) -{ - - yylineno = line_number; -} - -/** Set the input stream. This does not discard the current - * input buffer. - * @param in_str A readable stream. - * - * @see yy_switch_to_buffer - */ -void yyset_in (FILE * in_str ) -{ - yyin = in_str ; -} - -void yyset_out (FILE * out_str ) -{ - yyout = out_str ; -} - -int yyget_debug (void) -{ - return yy_flex_debug; -} - -void yyset_debug (int bdebug ) -{ - yy_flex_debug = bdebug ; -} - -/* yylex_destroy is for both reentrant and non-reentrant scanners. */ -int yylex_destroy (void) -{ - - /* Pop the buffer stack, destroying each element. */ - while(YY_CURRENT_BUFFER){ - yy_delete_buffer(YY_CURRENT_BUFFER ); - YY_CURRENT_BUFFER_LVALUE = NULL; - yypop_buffer_state(); - } - - /* Destroy the stack itself. */ - yyfree((yy_buffer_stack) ); - (yy_buffer_stack) = NULL; - - yyfree ( (yy_state_buf) ); - - return 0; -} - -/* - * Internal utility routines. - */ - -#ifndef yytext_ptr -static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) -{ - register int i; - for ( i = 0; i < n; ++i ) - s1[i] = s2[i]; -} -#endif - -#ifdef YY_NEED_STRLEN -static int yy_flex_strlen (yyconst char * s ) -{ - register int n; - for ( n = 0; s[n]; ++n ) - ; - - return n; -} -#endif - -void *yyalloc (yy_size_t size ) -{ - return (void *) malloc( size ); -} - -void *yyrealloc (void * ptr, yy_size_t size ) -{ - /* The cast to (char *) in the following accommodates both - * implementations that use char* generic pointers, and those - * that use void* generic pointers. It works with the latter - * because both ANSI C and C++ allow castless assignment from - * any pointer type to void*, and deal with argument conversions - * as though doing an assignment. - */ - return (void *) realloc( (char *) ptr, size ); -} - -void yyfree (void * ptr ) -{ - free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ -} - -#define YYTABLES_NAME "yytables" - -#undef YY_NEW_FILE -#undef YY_FLUSH_BUFFER -#undef yy_set_bol -#undef yy_new_buffer -#undef yy_set_interactive -#undef YY_DO_BEFORE_ACTION - -#ifdef YY_DECL_IS_OURS -#undef YY_DECL_IS_OURS -#undef YY_DECL -#endif -#line 90 "goomsl_lex.l" - - - - -int yywrap(void) { return 1; yyunput(0,0); } - - diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/goomsl_lex.l kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/goomsl_lex.l --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/goomsl_lex.l 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/goomsl_lex.l 1970-01-01 00:00:00.000000000 +0000 @@ -1,94 +0,0 @@ -%{ - -#include -#include -#include -#include "goomsl.h" -#include "goomsl_private.h" -#include "goomsl_yacc.h" -void yyerror(char *); -void yyparse(void); - -GoomSL *currentGoomSL; -static int string_size; -static char string[1024]; -%} - -DIGIT [0-9] -XDIGIT [0-9a-f] -ID [a-zA-Z_@&][a-zA-Z0-9_\.]* - -%S C_COMMENT -%S LINE_COMMENT -%S STRING - -%% - -^[ \t]*\n { ++currentGoomSL->num_lines; /* Ignore empty lines */ } -^[ \t]*"//"[^\n]*\n { ++currentGoomSL->num_lines; /* Ignore empty lines */ } - -\n { ++currentGoomSL->num_lines; yylval.charValue=*yytext; BEGIN INITIAL; return '\n'; } -\n { ++currentGoomSL->num_lines; yylval.charValue=*yytext; return '\n'; } - -"*/" { BEGIN INITIAL; } -\n { ++currentGoomSL->num_lines; } -. { /* eat up comment */ } - -"#RST_LINE#" { currentGoomSL->num_lines = 0; } -"#FILE ".*"#" { currentGoomSL->num_lines = 0; printf("%s\n", yytext); } -"#"[^\n]* { /* ignore preprocessor lines */ } - -"/*" { BEGIN C_COMMENT; } -"//" { BEGIN LINE_COMMENT; } -\" { BEGIN STRING; string_size=0; } - -"\\n" { string[string_size++] = '\n'; } -"\\\"" { string[string_size++] = '\"'; } -\" { /* fin de la chaine: on cree le pointeur qui va bien */ - unsigned int tmp; - BEGIN INITIAL; - string[string_size]=0; - tmp = gsl_malloc(currentGoomSL, string_size+1); - strcpy((char*)currentGoomSL->ptrArray[tmp],string); - sprintf(yylval.strValue, "0x%08x", tmp); - return LTYPE_PTR; - } -. { string[string_size++] = *yytext; } - -"float" { return FLOAT_TK; } -"int" { return INT_TK; } -"boolean" { return INT_TK; } -"ptr" { return PTR_TK; } -"string" { return PTR_TK; } -"declare" { return DECLARE; } -"external" { return EXTERNAL; } -"struct" { return STRUCT; } -"not" { return NOT; } -"while" { return WHILE; } -"do" { return DO; } -"for" { return FOR; } -"in" { return IN; } -"true" { strncpy(yylval.strValue, "1", 2047); return LTYPE_INTEGER; } -"false" { strncpy(yylval.strValue, "0", 2047); return LTYPE_INTEGER; } -{ID} { strncpy(yylval.strValue, yytext, 2047); return LTYPE_VAR; } -{DIGIT}+ { strncpy(yylval.strValue, yytext, 2047); return LTYPE_INTEGER; } -\'.\' { sprintf(yylval.strValue, "%d", (int)yytext[1]); return LTYPE_INTEGER; } -"0x"{XDIGIT}+ { strncpy(yylval.strValue, yytext, 2047); return LTYPE_INTEGER; } -{DIGIT}+"."{DIGIT}* { strncpy(yylval.strValue, yytext, 2047); return LTYPE_FLOAT; } -{DIGIT}+"%" { sprintf(yylval.strValue, "%3.2f", atof(yytext)/100.0f); return LTYPE_FLOAT; } -"+=" { return PLUS_EQ; } -"*=" { return MUL_EQ; } -"-=" { return SUB_EQ; } -"/=" { return DIV_EQ; } -"<=" { return LOW_EQ; } -">=" { return SUP_EQ; } -"!=" { return NOT_EQ; } -"<>" { return NOT_EQ; } -[ \t]+ /* eat up whitespace */ -. { yylval.charValue = *yytext; return *yytext; } - -%% - - -int yywrap(void) { return 1; yyunput(0,0); } - diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/goomsl_private.h kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/goomsl_private.h --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/goomsl_private.h 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/goomsl_private.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,251 +0,0 @@ -#ifndef _GSL_PRIVATE_H -#define _GSL_PRIVATE_H - -/* -- internal use -- */ - -#include "goomsl.h" - -#ifdef USE_JITC_X86 -#include "jitc_x86.h" -#endif - -#include "goomsl_heap.h" - -/* {{{ type of nodes */ -#define EMPTY_NODE 0 -#define CONST_INT_NODE 1 -#define CONST_FLOAT_NODE 2 -#define CONST_PTR_NODE 3 -#define VAR_NODE 4 -#define PARAM_NODE 5 -#define READ_PARAM_NODE 6 -#define OPR_NODE 7 -/* }}} */ -/* {{{ type of operations */ -#define OPR_SET 1 -#define OPR_IF 2 -#define OPR_WHILE 3 -#define OPR_BLOCK 4 -#define OPR_ADD 5 -#define OPR_MUL 6 -#define OPR_EQU 7 -#define OPR_NOT 8 -#define OPR_LOW 9 -#define OPR_DIV 10 -#define OPR_SUB 11 -#define OPR_FUNC_INTRO 12 -#define OPR_FUNC_OUTRO 13 -#define OPR_CALL 14 -#define OPR_EXT_CALL 15 -#define OPR_PLUS_EQ 16 -#define OPR_SUB_EQ 17 -#define OPR_MUL_EQ 18 -#define OPR_DIV_EQ 19 -#define OPR_CALL_EXPR 20 -#define OPR_AFFECT_LIST 21 -#define OPR_FOREACH 22 -#define OPR_VAR_LIST 23 - -/* }}} */ - -typedef struct _ConstIntNodeType { /* {{{ */ - int val; -} ConstIntNodeType; /* }}} */ -typedef struct _ConstFloatNodeType { /* {{{ */ - float val; -} ConstFloatNodeType; /* }}} */ -typedef struct _ConstPtrNodeType { /* {{{ */ - int id; -} ConstPtrNodeType; /* }}} */ -typedef struct _OprNodeType { /* {{{ */ - int type; - int nbOp; - struct _NODE_TYPE *op[3]; /* maximal number of operand needed */ - struct _NODE_TYPE *next; -} OprNodeType; /* }}} */ -typedef struct _NODE_TYPE { /* {{{ */ - int type; - char *str; - GoomHash *vnamespace; - int line_number; - union { - ConstIntNodeType constInt; - ConstFloatNodeType constFloat; - ConstPtrNodeType constPtr; - OprNodeType opr; - } unode; -} NodeType; /* }}} */ -typedef struct _INSTRUCTION_DATA { /* {{{ */ - - union { - void *var; - int *var_int; - int *var_ptr; - float *var_float; - int jump_offset; - struct _ExternalFunctionStruct *external_function; - } udest; - - union { - void *var; - int *var_int; - int *var_ptr; - float *var_float; - int value_int; - int value_ptr; - float value_float; - } usrc; -} InstructionData; -/* }}} */ -typedef struct _INSTRUCTION { /* {{{ */ - - int id; - InstructionData data; - GoomSL *parent; - const char *name; /* name of the instruction */ - - char **params; /* parametres de l'instruction */ - GoomHash **vnamespace; - int *types; /* type des parametres de l'instruction */ - int cur_param; - int nb_param; - - int address; - char *jump_label; - char *nop_label; - - int line_number; - -} Instruction; -/* }}} */ -typedef struct _INSTRUCTION_FLOW { /* {{{ */ - - Instruction **instr; - int number; - int tabsize; - GoomHash *labels; -} InstructionFlow; -/* }}} */ -typedef struct _FAST_INSTRUCTION { /* {{{ */ - int id; - InstructionData data; - Instruction *proto; -} FastInstruction; -/* }}} */ -typedef struct _FastInstructionFlow { /* {{{ */ - int number; - FastInstruction *instr; - void *mallocedInstr; -} FastInstructionFlow; -/* }}} */ -typedef struct _ExternalFunctionStruct { /* {{{ */ - GoomSL_ExternalFunction function; - GoomHash *vars; - int is_extern; -} ExternalFunctionStruct; -/* }}} */ -typedef struct _Block { - int data; - int size; -} Block; -typedef struct _GSL_StructField { /* {{{ */ - int type; - char name[256]; - int offsetInStruct; /* Where this field is stored... */ -} GSL_StructField; - /* }}} */ -typedef struct _GSL_Struct { /* {{{ */ - int nbFields; - GSL_StructField *fields[64]; - int size; - Block iBlock[64]; - Block fBlock[64]; -} GSL_Struct; - /* }}} */ -struct _GoomSL { /* {{{ */ - int num_lines; - Instruction *instr; /* instruction en cours de construction */ - - InstructionFlow *iflow; /* flow d'instruction 'normal' */ - FastInstructionFlow *fastiflow; /* flow d'instruction optimise */ - - GoomHash *vars; /* table de variables */ - int currentNS; - GoomHash *namespaces[16]; - - GoomHash *functions; /* table des fonctions externes */ - - GoomHeap *data_heap; /* GSL Heap-like memory space */ - - int nbStructID; - GoomHash *structIDS; - GSL_Struct **gsl_struct; - int gsl_struct_size; - - int nbPtr; - int ptrArraySize; - void **ptrArray; - - int compilationOK; -#ifdef USE_JITC_X86 - JitcX86Env *jitc; - JitcFunc jitc_func; -#endif -}; /* }}} */ - -extern GoomSL *currentGoomSL; - -Instruction *gsl_instr_init(GoomSL *parent, const char *name, int id, int nb_param, int line_number); -void gsl_instr_add_param(Instruction *_this, char *param, int type); -void gsl_instr_set_namespace(Instruction *_this, GoomHash *ns); - -void gsl_declare_task(const char *name); -void gsl_declare_external_task(const char *name); - -int gsl_type_of_var(GoomHash *namespace, const char *name); - -void gsl_enternamespace(const char *name); -void gsl_reenternamespace(GoomHash *ns); -GoomHash *gsl_leavenamespace(void); -GoomHash *gsl_find_namespace(const char *name); - -void gsl_commit_compilation(void); - -/* #define TYPE_PARAM 1 */ - -#define FIRST_RESERVED 0x80000 - -#define TYPE_INTEGER 0x90001 -#define TYPE_FLOAT 0x90002 -#define TYPE_VAR 0x90003 -#define TYPE_PTR 0x90004 -#define TYPE_LABEL 0x90005 - -#define TYPE_OP_EQUAL 6 -#define TYPE_IVAR 0xa0001 -#define TYPE_FVAR 0xa0002 -#define TYPE_PVAR 0xa0003 -#define TYPE_SVAR 0xa0004 - -#define INSTR_JUMP 6 -#define INSTR_JZERO 29 -#define INSTR_CALL 36 -#define INSTR_RET 37 -#define INSTR_EXT_CALL 38 -#define INSTR_JNZERO 40 - -#define INSTR_SET 0x80001 -#define INSTR_INT 0x80002 -#define INSTR_FLOAT 0x80003 -#define INSTR_PTR 0x80004 -#define INSTR_LABEL 0x80005 -#define INSTR_ISLOWER 0x80006 -#define INSTR_ADD 0x80007 -#define INSTR_MUL 0x80008 -#define INSTR_DIV 0x80009 -#define INSTR_SUB 0x80010 -#define INSTR_ISEQUAL 0x80011 -#define INSTR_NOT 0x80012 - - -#endif diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/goomsl_yacc.c kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/goomsl_yacc.c --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/goomsl_yacc.c 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/goomsl_yacc.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,3524 +0,0 @@ - -/* A Bison parser, made by GNU Bison 2.4.1. */ - -/* Skeleton implementation for Bison's Yacc-like parsers in C - - Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 - Free Software Foundation, Inc. - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . */ - -/* As a special exception, you may create a larger work that contains - part or all of the Bison parser skeleton and distribute that work - under terms of your choice, so long as that work isn't itself a - parser generator using the skeleton or a modified version thereof - as a parser skeleton. Alternatively, if you modify or redistribute - the parser skeleton itself, you may (at your option) remove this - special exception, which will cause the skeleton and the resulting - Bison output files to be licensed under the GNU General Public - License without this special exception. - - This special exception was added by the Free Software Foundation in - version 2.2 of Bison. */ - -/* C LALR(1) parser skeleton written by Richard Stallman, by - simplifying the original so-called "semantic" parser. */ - -/* All symbols defined below should begin with yy or YY, to avoid - infringing on user name space. This should be done even for local - variables, as they might otherwise be expanded by user macros. - There are some unavoidable exceptions within include files to - define necessary library symbols; they are noted "INFRINGES ON - USER NAME SPACE" below. */ - -/* Identify Bison output. */ -#define YYBISON 1 - -/* Bison version. */ -#define YYBISON_VERSION "2.4.1" - -/* Skeleton name. */ -#define YYSKELETON_NAME "yacc.c" - -/* Pure parsers. */ -#define YYPURE 0 - -/* Push parsers. */ -#define YYPUSH 0 - -/* Pull parsers. */ -#define YYPULL 1 - -/* Using locations. */ -#define YYLSP_NEEDED 0 - - - -/* Copy the first part of user declarations. */ - -/* Line 189 of yacc.c */ -#line 6 "goomsl_yacc.y" - - #include - #include - #include - #include "goomsl.h" - #include "goomsl_private.h" - #include "goomsl_yacc.h" - -#define STRUCT_ALIGNMENT 16 -/* #define VERBOSE */ - - int yylex(void); - void yyerror(char *); - extern GoomSL *currentGoomSL; - - static NodeType *nodeNew(const char *str, int type, int line_number); - static NodeType *nodeClone(NodeType *node); - static void nodeFreeInternals(NodeType *node); - static void nodeFree(NodeType *node); - - static void commit_node(NodeType *node, int releaseIfTemp); - static void precommit_node(NodeType *node); - - static NodeType *new_constInt(const char *str, int line_number); - static NodeType *new_constFloat(const char *str, int line_number); - static NodeType *new_constPtr(const char *str, int line_number); - static NodeType *new_var(const char *str, int line_number); - static NodeType *new_nop(const char *str); - static NodeType *new_op(const char *str, int type, int nbOp); - - static int allocateLabel(); - static int allocateTemp(); - static void releaseTemp(int n); - static void releaseAllTemps(); - - static int is_tmp_expr(NodeType *node) { - if (node->str) { - return (!strncmp(node->str,"_i_tmp_",7)) - || (!strncmp(node->str,"_f_tmp_",7)) - || (!strncmp(node->str,"_p_tmp",7)); - } - return 0; - } - /* pre: is_tmp_expr(node); */ - static int get_tmp_id(NodeType *node) { return atoi((node->str)+5); } - - static int is_commutative_expr(int itype) - { /* {{{ */ - return (itype == INSTR_ADD) - || (itype == INSTR_MUL) - || (itype == INSTR_ISEQUAL); - } /* }}} */ - - static void GSL_PUT_LABEL(char *name, int line_number) - { /* {{{ */ -#ifdef VERBOSE - printf("label %s\n", name); -#endif - currentGoomSL->instr = gsl_instr_init(currentGoomSL, "label", INSTR_LABEL, 1, line_number); - gsl_instr_add_param(currentGoomSL->instr, name, TYPE_LABEL); - } /* }}} */ - static void GSL_PUT_JUMP(char *name, int line_number) - { /* {{{ */ -#ifdef VERBOSE - printf("jump %s\n", name); -#endif - currentGoomSL->instr = gsl_instr_init(currentGoomSL, "jump", INSTR_JUMP, 1, line_number); - gsl_instr_add_param(currentGoomSL->instr, name, TYPE_LABEL); - } /* }}} */ - - static void GSL_PUT_JXXX(char *name, char *iname, int instr_id, int line_number) - { /* {{{ */ -#ifdef VERBOSE - printf("%s %s\n", iname, name); -#endif - currentGoomSL->instr = gsl_instr_init(currentGoomSL, iname, instr_id, 1, line_number); - gsl_instr_add_param(currentGoomSL->instr, name, TYPE_LABEL); - } /* }}} */ - static void GSL_PUT_JZERO(char *name,int line_number) - { /* {{{ */ - GSL_PUT_JXXX(name,"jzero.i",INSTR_JZERO,line_number); - } /* }}} */ - static void GSL_PUT_JNZERO(char *name, int line_number) - { /* {{{ */ - GSL_PUT_JXXX(name,"jnzero.i",INSTR_JNZERO,line_number); - } /* }}} */ - - /* Structures Management */ - -#define ALIGN_ADDR(_addr,_align) {\ - if (_align>1) {\ - int _dec = (_addr%_align);\ - if (_dec != 0) _addr += _align - _dec;\ - }} - - /* */ - void gsl_prepare_struct(GSL_Struct *s, int s_align, int i_align, int f_align) - { - int i; - int consumed = 0; - int iblk=0, fblk=0; - - s->iBlock[0].size = 0; - s->iBlock[0].data = 0; - s->fBlock[0].size = 0; - s->fBlock[0].data = 0; - - /* Prepare sub-struct and calculate space needed for their storage */ - for (i = 0; i < s->nbFields; ++i) - { - if (s->fields[i]->type < FIRST_RESERVED) - { - int j=0; - GSL_Struct *substruct = currentGoomSL->gsl_struct[s->fields[i]->type]; - consumed += sizeof(int); /* stocke le prefix */ - ALIGN_ADDR(consumed, s_align); - s->fields[i]->offsetInStruct = consumed; - gsl_prepare_struct(substruct, s_align, i_align, f_align); - for(j=0;substruct->iBlock[j].size>0;++j) { - s->iBlock[iblk].data = consumed + substruct->iBlock[j].data; - s->iBlock[iblk].size = substruct->iBlock[j].size; - iblk++; - } - for(j=0;substruct->fBlock[j].size>0;++j) { - s->fBlock[fblk].data = consumed + substruct->fBlock[j].data; - s->fBlock[fblk].size = substruct->fBlock[j].size; - fblk++; - } - consumed += substruct->size; - } - } - - /* Then prepare integers */ - ALIGN_ADDR(consumed, i_align); - for (i = 0; i < s->nbFields; ++i) - { - if (s->fields[i]->type == INSTR_INT) - { - if (s->iBlock[iblk].size == 0) { - s->iBlock[iblk].size = 1; - s->iBlock[iblk].data = consumed; - } else { - s->iBlock[iblk].size += 1; - } - s->fields[i]->offsetInStruct = consumed; - consumed += sizeof(int); - } - } - - iblk++; - s->iBlock[iblk].size = 0; - s->iBlock[iblk].data = 0; - - /* Then prepare floats */ - ALIGN_ADDR(consumed, f_align); - for (i = 0; i < s->nbFields; ++i) - { - if (s->fields[i]->type == INSTR_FLOAT) - { - if (s->fBlock[fblk].size == 0) { - s->fBlock[fblk].size = 1; - s->fBlock[fblk].data = consumed; - } else { - s->fBlock[fblk].size += 1; - } - s->fields[i]->offsetInStruct = consumed; - consumed += sizeof(int); - } - } - - fblk++; - s->fBlock[fblk].size = 0; - s->fBlock[fblk].data = 0; - - /* Finally prepare pointers */ - ALIGN_ADDR(consumed, i_align); - for (i = 0; i < s->nbFields; ++i) - { - if (s->fields[i]->type == INSTR_PTR) - { - s->fields[i]->offsetInStruct = consumed; - consumed += sizeof(int); - } - } - s->size = consumed; - } - - /* Returns the ID of a struct from its name */ - int gsl_get_struct_id(const char *name) /* {{{ */ - { - HashValue *ret = goom_hash_get(currentGoomSL->structIDS, name); - if (ret != NULL) return ret->i; - return -1; - } /* }}} */ - - /* Adds the definition of a struct */ - void gsl_add_struct(const char *name, GSL_Struct *gsl_struct) /* {{{ */ - { - /* Prepare the struct: ie calculate internal storage format */ - gsl_prepare_struct(gsl_struct, STRUCT_ALIGNMENT, STRUCT_ALIGNMENT, STRUCT_ALIGNMENT); - - /* If the struct does not already exists */ - if (gsl_get_struct_id(name) < 0) - { - /* adds it */ - int id = currentGoomSL->nbStructID++; - goom_hash_put_int(currentGoomSL->structIDS, name, id); - if (currentGoomSL->gsl_struct_size <= id) { - currentGoomSL->gsl_struct_size *= 2; - currentGoomSL->gsl_struct = (GSL_Struct**)realloc(currentGoomSL->gsl_struct, - sizeof(GSL_Struct*) * currentGoomSL->gsl_struct_size); - } - currentGoomSL->gsl_struct[id] = gsl_struct; - } - } /* }}} */ - - /* Creates a field for a struct */ - GSL_StructField *gsl_new_struct_field(const char *name, int type) - { - GSL_StructField *field = (GSL_StructField*)malloc(sizeof(GSL_StructField)); - strcpy(field->name, name); - field->type = type; - return field; - } - - /* Create as field for a struct which will be a struct itself */ - GSL_StructField *gsl_new_struct_field_struct(const char *name, const char *type) - { - GSL_StructField *field = gsl_new_struct_field(name, gsl_get_struct_id(type)); - if (field->type < 0) { - fprintf(stderr, "ERROR: Line %d, Unknown structure: '%s'\n", - currentGoomSL->num_lines, type); - exit(1); - } - return field; - } - - /* Creates a Struct */ - GSL_Struct *gsl_new_struct(GSL_StructField *field) - { - GSL_Struct *s = (GSL_Struct*)malloc(sizeof(GSL_Struct)); - s->nbFields = 1; - s->fields[0] = field; - return s; - } - - /* Adds a field to a struct */ - void gsl_add_struct_field(GSL_Struct *s, GSL_StructField *field) - { - s->fields[s->nbFields++] = field; - } - - int gsl_type_of_var(GoomHash *ns, const char *name) - { - char type_of[256]; - HashValue *hv; - sprintf(type_of, "__type_of_%s", name); - hv = goom_hash_get(ns, type_of); - if (hv != NULL) - return hv->i; - fprintf(stderr, "ERROR: Unknown variable type: '%s'\n", name); - return -1; - } - - static void gsl_declare_var(GoomHash *ns, const char *name, int type, void *space) - { - char type_of[256]; - if (name[0] == '@') { ns = currentGoomSL->vars; } - - if (space == NULL) { - switch (type) { - case INSTR_INT: - case INSTR_FLOAT: - case INSTR_PTR: - space = goom_heap_malloc_with_alignment(currentGoomSL->data_heap, - sizeof(int), sizeof(int)); - break; - case -1: - fprintf(stderr, "What the fuck!\n"); - exit(1); - default: /* On a un struct_id */ - space = goom_heap_malloc_with_alignment_prefixed(currentGoomSL->data_heap, - currentGoomSL->gsl_struct[type]->size, STRUCT_ALIGNMENT, sizeof(int)); - } - } - goom_hash_put_ptr(ns, name, (void*)space); - sprintf(type_of, "__type_of_%s", name); - goom_hash_put_int(ns, type_of, type); - - /* Ensuite le hack: on ajoute les champs en tant que variables. */ - if (type < FIRST_RESERVED) - { - int i; - GSL_Struct *gsl_struct = currentGoomSL->gsl_struct[type]; - ((int*)space)[-1] = type; /* stockage du type dans le prefixe de structure */ - for (i = 0; i < gsl_struct->nbFields; ++i) - { - char full_name[256]; - char *cspace = (char*)space + gsl_struct->fields[i]->offsetInStruct; - sprintf(full_name, "%s.%s", name, gsl_struct->fields[i]->name); - gsl_declare_var(ns, full_name, gsl_struct->fields[i]->type, cspace); - } - } - } - - /* Declare a variable which will be a struct */ - static void gsl_struct_decl(GoomHash *namespace, const char *struct_name, const char *name) - { - int struct_id = gsl_get_struct_id(struct_name); - gsl_declare_var(namespace, name, struct_id, NULL); - } - - static void gsl_float_decl_global(const char *name) - { - gsl_declare_var(currentGoomSL->vars, name, INSTR_FLOAT, NULL); - } - static void gsl_int_decl_global(const char *name) - { - gsl_declare_var(currentGoomSL->vars, name, INSTR_INT, NULL); - } - static void gsl_ptr_decl_global(const char *name) - { - gsl_declare_var(currentGoomSL->vars, name, INSTR_PTR, NULL); - } - static void gsl_struct_decl_global_from_id(const char *name, int id) - { - gsl_declare_var(currentGoomSL->vars, name, id, NULL); - } - - /* FLOAT */ - static void gsl_float_decl_local(const char *name) - { - gsl_declare_var(currentGoomSL->namespaces[currentGoomSL->currentNS], name, INSTR_FLOAT, NULL); - } - /* INT */ - static void gsl_int_decl_local(const char *name) - { - gsl_declare_var(currentGoomSL->namespaces[currentGoomSL->currentNS], name, INSTR_INT, NULL); - } - /* PTR */ - static void gsl_ptr_decl_local(const char *name) - { - gsl_declare_var(currentGoomSL->namespaces[currentGoomSL->currentNS], name, INSTR_PTR, NULL); - } - /* STRUCT */ - static void gsl_struct_decl_local(const char *struct_name, const char *name) - { - gsl_struct_decl(currentGoomSL->namespaces[currentGoomSL->currentNS],struct_name,name); - } - - - static void commit_test2(NodeType *set,const char *type, int instr); - static NodeType *new_call(const char *name, NodeType *affect_list); - - /* SETTER */ - static NodeType *new_set(NodeType *lvalue, NodeType *expression) - { /* {{{ */ - NodeType *set = new_op("set", OPR_SET, 2); - set->unode.opr.op[0] = lvalue; - set->unode.opr.op[1] = expression; - return set; - } /* }}} */ - static void commit_set(NodeType *set) - { /* {{{ */ - commit_test2(set,"set",INSTR_SET); - } /* }}} */ - - /* PLUS_EQ */ - static NodeType *new_plus_eq(NodeType *lvalue, NodeType *expression) /* {{{ */ - { - NodeType *set = new_op("plus_eq", OPR_PLUS_EQ, 2); - set->unode.opr.op[0] = lvalue; - set->unode.opr.op[1] = expression; - return set; - } - static void commit_plus_eq(NodeType *set) - { - precommit_node(set->unode.opr.op[1]); -#ifdef VERBOSE - printf("add %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str); -#endif - currentGoomSL->instr = gsl_instr_init(currentGoomSL, "add", INSTR_ADD, 2, set->line_number); - commit_node(set->unode.opr.op[0],0); - commit_node(set->unode.opr.op[1],1); - } /* }}} */ - - /* SUB_EQ */ - static NodeType *new_sub_eq(NodeType *lvalue, NodeType *expression) /* {{{ */ - { - NodeType *set = new_op("sub_eq", OPR_SUB_EQ, 2); - set->unode.opr.op[0] = lvalue; - set->unode.opr.op[1] = expression; - return set; - } - static void commit_sub_eq(NodeType *set) - { - precommit_node(set->unode.opr.op[1]); -#ifdef VERBOSE - printf("sub %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str); -#endif - currentGoomSL->instr = gsl_instr_init(currentGoomSL, "sub", INSTR_SUB, 2, set->line_number); - commit_node(set->unode.opr.op[0],0); - commit_node(set->unode.opr.op[1],1); - } /* }}} */ - - /* MUL_EQ */ - static NodeType *new_mul_eq(NodeType *lvalue, NodeType *expression) /* {{{ */ - { - NodeType *set = new_op("mul_eq", OPR_MUL_EQ, 2); - set->unode.opr.op[0] = lvalue; - set->unode.opr.op[1] = expression; - return set; - } - static void commit_mul_eq(NodeType *set) - { - precommit_node(set->unode.opr.op[1]); -#ifdef VERBOSE - printf("mul %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str); -#endif - currentGoomSL->instr = gsl_instr_init(currentGoomSL, "mul", INSTR_MUL, 2, set->line_number); - commit_node(set->unode.opr.op[0],0); - commit_node(set->unode.opr.op[1],1); - } /* }}} */ - - /* DIV_EQ */ - static NodeType *new_div_eq(NodeType *lvalue, NodeType *expression) /* {{{ */ - { - NodeType *set = new_op("div_eq", OPR_DIV_EQ, 2); - set->unode.opr.op[0] = lvalue; - set->unode.opr.op[1] = expression; - return set; - } - static void commit_div_eq(NodeType *set) - { - precommit_node(set->unode.opr.op[1]); -#ifdef VERBOSE - printf("div %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str); -#endif - currentGoomSL->instr = gsl_instr_init(currentGoomSL, "div", INSTR_DIV, 2, set->line_number); - commit_node(set->unode.opr.op[0],0); - commit_node(set->unode.opr.op[1],1); - } /* }}} */ - - /* commodity method for add, mult, ... */ - - static void precommit_expr(NodeType *expr, const char *type, int instr_id) - { /* {{{ */ - NodeType *tmp, *tmpcpy; - int toAdd; - - /* compute "left" and "right" */ - switch (expr->unode.opr.nbOp) { - case 2: - precommit_node(expr->unode.opr.op[1]); - case 1: - precommit_node(expr->unode.opr.op[0]); - } - - if (is_tmp_expr(expr->unode.opr.op[0])) { - tmp = expr->unode.opr.op[0]; - toAdd = 1; - } - else if (is_commutative_expr(instr_id) && (expr->unode.opr.nbOp==2) && is_tmp_expr(expr->unode.opr.op[1])) { - tmp = expr->unode.opr.op[1]; - toAdd = 0; - } - else { - char stmp[256]; - /* declare a temporary variable to store the result */ - if (expr->unode.opr.op[0]->type == CONST_INT_NODE) { - sprintf(stmp,"_i_tmp_%i",allocateTemp()); - gsl_int_decl_global(stmp); - } - else if (expr->unode.opr.op[0]->type == CONST_FLOAT_NODE) { - sprintf(stmp,"_f_tmp%i",allocateTemp()); - gsl_float_decl_global(stmp); - } - else if (expr->unode.opr.op[0]->type == CONST_PTR_NODE) { - sprintf(stmp,"_p_tmp%i",allocateTemp()); - gsl_ptr_decl_global(stmp); - } - else { - int type = gsl_type_of_var(expr->unode.opr.op[0]->vnamespace, expr->unode.opr.op[0]->str); - if (type == INSTR_FLOAT) { - sprintf(stmp,"_f_tmp_%i",allocateTemp()); - gsl_float_decl_global(stmp); - } - else if (type == INSTR_PTR) { - sprintf(stmp,"_p_tmp_%i",allocateTemp()); - gsl_ptr_decl_global(stmp); - } - else if (type == INSTR_INT) { - sprintf(stmp,"_i_tmp_%i",allocateTemp()); - gsl_int_decl_global(stmp); - } - else if (type == -1) { - fprintf(stderr, "ERROR: Line %d, Could not find variable '%s'\n", - expr->line_number, expr->unode.opr.op[0]->str); - exit(1); - } - else { /* type is a struct_id */ - sprintf(stmp,"_s_tmp_%i",allocateTemp()); - gsl_struct_decl_global_from_id(stmp,type); - } - } - tmp = new_var(stmp,expr->line_number); - - /* set the tmp to the value of "op1" */ - tmpcpy = nodeClone(tmp); - commit_node(new_set(tmp,expr->unode.opr.op[0]),0); - toAdd = 1; - - tmp = tmpcpy; - } - - /* add op2 to tmp */ -#ifdef VERBOSE - if (expr->unode.opr.nbOp == 2) - printf("%s %s %s\n", type, tmp->str, expr->unode.opr.op[toAdd]->str); - else - printf("%s %s\n", type, tmp->str); -#endif - currentGoomSL->instr = gsl_instr_init(currentGoomSL, type, instr_id, expr->unode.opr.nbOp, expr->line_number); - tmpcpy = nodeClone(tmp); - commit_node(tmp,0); - if (expr->unode.opr.nbOp == 2) { - commit_node(expr->unode.opr.op[toAdd],1); - } - - /* redefine the ADD node now as the computed variable */ - nodeFreeInternals(expr); - *expr = *tmpcpy; - free(tmpcpy); - } /* }}} */ - - static NodeType *new_expr1(const char *name, int id, NodeType *expr1) - { /* {{{ */ - NodeType *add = new_op(name, id, 1); - add->unode.opr.op[0] = expr1; - return add; - } /* }}} */ - - static NodeType *new_expr2(const char *name, int id, NodeType *expr1, NodeType *expr2) - { /* {{{ */ - NodeType *add = new_op(name, id, 2); - add->unode.opr.op[0] = expr1; - add->unode.opr.op[1] = expr2; - return add; - } /* }}} */ - - /* ADD */ - static NodeType *new_add(NodeType *expr1, NodeType *expr2) { /* {{{ */ - return new_expr2("add", OPR_ADD, expr1, expr2); - } - static void precommit_add(NodeType *add) { - precommit_expr(add,"add",INSTR_ADD); - } /* }}} */ - - /* SUB */ - static NodeType *new_sub(NodeType *expr1, NodeType *expr2) { /* {{{ */ - return new_expr2("sub", OPR_SUB, expr1, expr2); - } - static void precommit_sub(NodeType *sub) { - precommit_expr(sub,"sub",INSTR_SUB); - } /* }}} */ - - /* NEG */ - static NodeType *new_neg(NodeType *expr) { /* {{{ */ - NodeType *zeroConst = NULL; - if (expr->type == CONST_INT_NODE) - zeroConst = new_constInt("0", currentGoomSL->num_lines); - else if (expr->type == CONST_FLOAT_NODE) - zeroConst = new_constFloat("0.0", currentGoomSL->num_lines); - else if (expr->type == CONST_PTR_NODE) { - fprintf(stderr, "ERROR: Line %d, Could not negate const pointer.\n", - currentGoomSL->num_lines); - exit(1); - } - else { - int type = gsl_type_of_var(expr->vnamespace, expr->str); - if (type == INSTR_FLOAT) - zeroConst = new_constFloat("0.0", currentGoomSL->num_lines); - else if (type == INSTR_PTR) { - fprintf(stderr, "ERROR: Line %d, Could not negate pointer.\n", - currentGoomSL->num_lines); - exit(1); - } - else if (type == INSTR_INT) - zeroConst = new_constInt("0", currentGoomSL->num_lines); - else if (type == -1) { - fprintf(stderr, "ERROR: Line %d, Could not find variable '%s'\n", - expr->line_number, expr->unode.opr.op[0]->str); - exit(1); - } - else { /* type is a struct_id */ - fprintf(stderr, "ERROR: Line %d, Could not negate struct '%s'\n", - expr->line_number, expr->str); - exit(1); - } - } - return new_expr2("sub", OPR_SUB, zeroConst, expr); - } - /* }}} */ - - /* MUL */ - static NodeType *new_mul(NodeType *expr1, NodeType *expr2) { /* {{{ */ - return new_expr2("mul", OPR_MUL, expr1, expr2); - } - static void precommit_mul(NodeType *mul) { - precommit_expr(mul,"mul",INSTR_MUL); - } /* }}} */ - - /* DIV */ - static NodeType *new_div(NodeType *expr1, NodeType *expr2) { /* {{{ */ - return new_expr2("div", OPR_DIV, expr1, expr2); - } - static void precommit_div(NodeType *mul) { - precommit_expr(mul,"div",INSTR_DIV); - } /* }}} */ - - /* CALL EXPRESSION */ - static NodeType *new_call_expr(const char *name, NodeType *affect_list) { /* {{{ */ - NodeType *call = new_call(name,affect_list); - NodeType *node = new_expr1(name, OPR_CALL_EXPR, call); - node->vnamespace = gsl_find_namespace(name); - if (node->vnamespace == NULL) - fprintf(stderr, "ERROR: Line %d, No return type for: '%s'\n", currentGoomSL->num_lines, name); - return node; - } - static void precommit_call_expr(NodeType *call) { - char stmp[256]; - NodeType *tmp,*tmpcpy; - int type = gsl_type_of_var(call->vnamespace, call->str); - if (type == INSTR_FLOAT) { - sprintf(stmp,"_f_tmp_%i",allocateTemp()); - gsl_float_decl_global(stmp); - } - else if (type == INSTR_PTR) { - sprintf(stmp,"_p_tmp_%i",allocateTemp()); - gsl_ptr_decl_global(stmp); - } - else if (type == INSTR_INT) { - sprintf(stmp,"_i_tmp_%i",allocateTemp()); - gsl_int_decl_global(stmp); - } - else if (type == -1) { - fprintf(stderr, "ERROR: Line %d, Could not find variable '%s'\n", - call->line_number, call->str); - exit(1); - } - else { /* type is a struct_id */ - sprintf(stmp,"_s_tmp_%i",allocateTemp()); - gsl_struct_decl_global_from_id(stmp,type); - } - tmp = new_var(stmp,call->line_number); - commit_node(call->unode.opr.op[0],0); - tmpcpy = nodeClone(tmp); - commit_node(new_set(tmp,new_var(call->str,call->line_number)),0); - - nodeFreeInternals(call); - *call = *tmpcpy; - free(tmpcpy); - } /* }}} */ - - static void commit_test2(NodeType *set,const char *type, int instr) - { /* {{{ */ - NodeType *tmp; - char stmp[256]; - precommit_node(set->unode.opr.op[0]); - precommit_node(set->unode.opr.op[1]); - tmp = set->unode.opr.op[0]; - - stmp[0] = 0; - if (set->unode.opr.op[0]->type == CONST_INT_NODE) { - sprintf(stmp,"_i_tmp_%i",allocateTemp()); - gsl_int_decl_global(stmp); - } - else if (set->unode.opr.op[0]->type == CONST_FLOAT_NODE) { - sprintf(stmp,"_f_tmp%i",allocateTemp()); - gsl_float_decl_global(stmp); - } - else if (set->unode.opr.op[0]->type == CONST_PTR_NODE) { - sprintf(stmp,"_p_tmp%i",allocateTemp()); - gsl_ptr_decl_global(stmp); - } - if (stmp[0]) { - NodeType *tmpcpy; - tmp = new_var(stmp, set->line_number); - tmpcpy = nodeClone(tmp); - commit_node(new_set(tmp,set->unode.opr.op[0]),0); - tmp = tmpcpy; - } - -#ifdef VERBOSE - printf("%s %s %s\n", type, tmp->str, set->unode.opr.op[1]->str); -#endif - currentGoomSL->instr = gsl_instr_init(currentGoomSL, type, instr, 2, set->line_number); - commit_node(tmp,instr!=INSTR_SET); - commit_node(set->unode.opr.op[1],1); - } /* }}} */ - - /* NOT */ - static NodeType *new_not(NodeType *expr1) { /* {{{ */ - return new_expr1("not", OPR_NOT, expr1); - } - static void commit_not(NodeType *set) - { - commit_node(set->unode.opr.op[0],0); -#ifdef VERBOSE - printf("not\n"); -#endif - currentGoomSL->instr = gsl_instr_init(currentGoomSL, "not", INSTR_NOT, 1, set->line_number); - gsl_instr_add_param(currentGoomSL->instr, "|dummy|", TYPE_LABEL); - } /* }}} */ - - /* EQU */ - static NodeType *new_equ(NodeType *expr1, NodeType *expr2) { /* {{{ */ - return new_expr2("isequal", OPR_EQU, expr1, expr2); - } - static void commit_equ(NodeType *mul) { - commit_test2(mul,"isequal",INSTR_ISEQUAL); - } /* }}} */ - - /* INF */ - static NodeType *new_low(NodeType *expr1, NodeType *expr2) { /* {{{ */ - return new_expr2("islower", OPR_LOW, expr1, expr2); - } - static void commit_low(NodeType *mul) { - commit_test2(mul,"islower",INSTR_ISLOWER); - } /* }}} */ - - /* WHILE */ - static NodeType *new_while(NodeType *expression, NodeType *instr) { /* {{{ */ - NodeType *node = new_op("while", OPR_WHILE, 2); - node->unode.opr.op[0] = expression; - node->unode.opr.op[1] = instr; - return node; - } - - static void commit_while(NodeType *node) - { - int lbl = allocateLabel(); - char start_while[1024], test_while[1024]; - sprintf(start_while, "|start_while_%d|", lbl); - sprintf(test_while, "|test_while_%d|", lbl); - - GSL_PUT_JUMP(test_while,node->line_number); - GSL_PUT_LABEL(start_while,node->line_number); - - /* code */ - commit_node(node->unode.opr.op[1],0); - - GSL_PUT_LABEL(test_while,node->line_number); - commit_node(node->unode.opr.op[0],0); - GSL_PUT_JNZERO(start_while,node->line_number); - } /* }}} */ - - /* FOR EACH */ - static NodeType *new_static_foreach(NodeType *var, NodeType *var_list, NodeType *instr) { /* {{{ */ - NodeType *node = new_op("for", OPR_FOREACH, 3); - node->unode.opr.op[0] = var; - node->unode.opr.op[1] = var_list; - node->unode.opr.op[2] = instr; - node->line_number = currentGoomSL->num_lines; - return node; - } - static void commit_foreach(NodeType *node) - { - NodeType *cur = node->unode.opr.op[1]; - char tmp_func[256], tmp_loop[256]; - int lbl = allocateLabel(); - sprintf(tmp_func, "|foreach_func_%d|", lbl); - sprintf(tmp_loop, "|foreach_loop_%d|", lbl); - - GSL_PUT_JUMP(tmp_loop, node->line_number); - GSL_PUT_LABEL(tmp_func, node->line_number); - - precommit_node(node->unode.opr.op[2]); - commit_node(node->unode.opr.op[2], 0); - - currentGoomSL->instr = gsl_instr_init(currentGoomSL, "ret", INSTR_RET, 1, node->line_number); - gsl_instr_add_param(currentGoomSL->instr, "|dummy|", TYPE_LABEL); -#ifdef VERBOSE - printf("ret\n"); -#endif - - GSL_PUT_LABEL(tmp_loop, node->line_number); - - while (cur != NULL) - { - NodeType *x, *var; - - /* 1: x=var */ - x = nodeClone(node->unode.opr.op[0]); - var = nodeClone(cur->unode.opr.op[0]); - commit_node(new_set(x, var),0); - - /* 2: instr */ - currentGoomSL->instr = gsl_instr_init(currentGoomSL, "call", INSTR_CALL, 1, node->line_number); - gsl_instr_add_param(currentGoomSL->instr, tmp_func, TYPE_LABEL); -#ifdef VERBOSE - printf("call %s\n", tmp_func); -#endif - - /* 3: var=x */ - x = nodeClone(node->unode.opr.op[0]); - var = cur->unode.opr.op[0]; - commit_node(new_set(var, x),0); - cur = cur->unode.opr.op[1]; - } - nodeFree(node->unode.opr.op[0]); - } /* }}} */ - - /* IF */ - static NodeType *new_if(NodeType *expression, NodeType *instr) { /* {{{ */ - NodeType *node = new_op("if", OPR_IF, 2); - node->unode.opr.op[0] = expression; - node->unode.opr.op[1] = instr; - return node; - } - static void commit_if(NodeType *node) { - - char slab[1024]; - sprintf(slab, "|eif%d|", allocateLabel()); - commit_node(node->unode.opr.op[0],0); - GSL_PUT_JZERO(slab,node->line_number); - /* code */ - commit_node(node->unode.opr.op[1],0); - GSL_PUT_LABEL(slab,node->line_number); - } /* }}} */ - - /* BLOCK */ - static NodeType *new_block(NodeType *lastNode) { /* {{{ */ - NodeType *blk = new_op("block", OPR_BLOCK, 2); - blk->unode.opr.op[0] = new_nop("start_of_block"); - blk->unode.opr.op[1] = lastNode; - return blk; - } - static void commit_block(NodeType *node) { - commit_node(node->unode.opr.op[0]->unode.opr.next,0); - } /* }}} */ - - /* FUNCTION INTRO */ - static NodeType *new_function_intro(const char *name) { /* {{{ */ - char stmp[256]; - if (strlen(name) < 200) { - sprintf(stmp, "|__func_%s|", name); - } - return new_op(stmp, OPR_FUNC_INTRO, 0); - } - static void commit_function_intro(NodeType *node) { - currentGoomSL->instr = gsl_instr_init(currentGoomSL, "label", INSTR_LABEL, 1, node->line_number); - gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_LABEL); -#ifdef VERBOSE - printf("label %s\n", node->str); -#endif - } /* }}} */ - - /* FUNCTION OUTRO */ - static NodeType *new_function_outro() { /* {{{ */ - return new_op("ret", OPR_FUNC_OUTRO, 0); - } - static void commit_function_outro(NodeType *node) { - currentGoomSL->instr = gsl_instr_init(currentGoomSL, "ret", INSTR_RET, 1, node->line_number); - gsl_instr_add_param(currentGoomSL->instr, "|dummy|", TYPE_LABEL); - releaseAllTemps(); -#ifdef VERBOSE - printf("ret\n"); -#endif - } /* }}} */ - - /* AFFECTATION LIST */ - static NodeType *new_affec_list(NodeType *set, NodeType *next) /* {{{ */ - { - NodeType *node = new_op("affect_list", OPR_AFFECT_LIST, 2); - node->unode.opr.op[0] = set; - node->unode.opr.op[1] = next; - return node; - } - static NodeType *new_affect_list_after(NodeType *affect_list) - { - NodeType *ret = NULL; - NodeType *cur = affect_list; - while(cur != NULL) { - NodeType *set = cur->unode.opr.op[0]; - NodeType *next = cur->unode.opr.op[1]; - NodeType *lvalue = set->unode.opr.op[0]; - NodeType *expression = set->unode.opr.op[1]; - if ((lvalue->str[0] == '&') && (expression->type == VAR_NODE)) { - NodeType *nset = new_set(nodeClone(expression), nodeClone(lvalue)); - ret = new_affec_list(nset, ret); - } - cur = next; - } - return ret; - } - static void commit_affect_list(NodeType *node) - { - NodeType *cur = node; - while(cur != NULL) { - NodeType *set = cur->unode.opr.op[0]; - precommit_node(set->unode.opr.op[0]); - precommit_node(set->unode.opr.op[1]); - cur = cur->unode.opr.op[1]; - } - cur = node; - while(cur != NULL) { - NodeType *set = cur->unode.opr.op[0]; - commit_node(set,0); - cur = cur->unode.opr.op[1]; - } - } /* }}} */ - - /* VAR LIST */ - static NodeType *new_var_list(NodeType *var, NodeType *next) /* {{{ */ - { - NodeType *node = new_op("var_list", OPR_VAR_LIST, 2); - node->unode.opr.op[0] = var; - node->unode.opr.op[1] = next; - return node; - } - static void commit_var_list(NodeType *node) - { - } /* }}} */ - - /* FUNCTION CALL */ - static NodeType *new_call(const char *name, NodeType *affect_list) { /* {{{ */ - HashValue *fval; - fval = goom_hash_get(currentGoomSL->functions, name); - if (!fval) { - gsl_declare_task(name); - fval = goom_hash_get(currentGoomSL->functions, name); - } - if (!fval) { - fprintf(stderr, "ERROR: Line %d, Could not find function %s\n", currentGoomSL->num_lines, name); - exit(1); - return NULL; - } - else { - ExternalFunctionStruct *gef = (ExternalFunctionStruct*)fval->ptr; - if (gef->is_extern) { - NodeType *node = new_op(name, OPR_EXT_CALL, 1); - node->unode.opr.op[0] = affect_list; - return node; - } - else { - NodeType *node; - char stmp[256]; - if (strlen(name) < 200) { - sprintf(stmp, "|__func_%s|", name); - } - node = new_op(stmp, OPR_CALL, 1); - node->unode.opr.op[0] = affect_list; - return node; - } - } - } - static void commit_ext_call(NodeType *node) { - NodeType *alafter = new_affect_list_after(node->unode.opr.op[0]); - commit_node(node->unode.opr.op[0],0); - currentGoomSL->instr = gsl_instr_init(currentGoomSL, "extcall", INSTR_EXT_CALL, 1, node->line_number); - gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_VAR); -#ifdef VERBOSE - printf("extcall %s\n", node->str); -#endif - commit_node(alafter,0); - } - static void commit_call(NodeType *node) { - NodeType *alafter = new_affect_list_after(node->unode.opr.op[0]); - commit_node(node->unode.opr.op[0],0); - currentGoomSL->instr = gsl_instr_init(currentGoomSL, "call", INSTR_CALL, 1, node->line_number); - gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_LABEL); -#ifdef VERBOSE - printf("call %s\n", node->str); -#endif - commit_node(alafter,0); - } /* }}} */ - - /** **/ - - static NodeType *rootNode = 0; /* TODO: reinitialiser a chaque compilation. */ - static NodeType *lastNode = 0; - static NodeType *gsl_append(NodeType *curNode) { - if (curNode == 0) return 0; /* {{{ */ - if (lastNode) - lastNode->unode.opr.next = curNode; - lastNode = curNode; - while(lastNode->unode.opr.next) lastNode = lastNode->unode.opr.next; - if (rootNode == 0) - rootNode = curNode; - return curNode; - } /* }}} */ - -#if 1 - int allocateTemp() { - return allocateLabel(); - } - void releaseAllTemps() {} - void releaseTemp(int n) {} -#else - static int nbTemp = 0; - static int *tempArray = 0; - static int tempArraySize = 0; - int allocateTemp() { /* TODO: allocateITemp, allocateFTemp */ - int i = 0; /* {{{ */ - if (tempArray == 0) { - tempArraySize = 256; - tempArray = (int*)malloc(tempArraySize * sizeof(int)); - } - while (1) { - int j; - for (j=0;jtype == OPR_NODE) - switch(node->unode.opr.type) { - case OPR_ADD: precommit_add(node); break; - case OPR_SUB: precommit_sub(node); break; - case OPR_MUL: precommit_mul(node); break; - case OPR_DIV: precommit_div(node); break; - case OPR_CALL_EXPR: precommit_call_expr(node); break; - } - } /* }}} */ - - void commit_node(NodeType *node, int releaseIfTmp) - { /* {{{ */ - if (node == 0) return; - - switch(node->type) { - case OPR_NODE: - switch(node->unode.opr.type) { - case OPR_SET: commit_set(node); break; - case OPR_PLUS_EQ: commit_plus_eq(node); break; - case OPR_SUB_EQ: commit_sub_eq(node); break; - case OPR_MUL_EQ: commit_mul_eq(node); break; - case OPR_DIV_EQ: commit_div_eq(node); break; - case OPR_IF: commit_if(node); break; - case OPR_WHILE: commit_while(node); break; - case OPR_BLOCK: commit_block(node); break; - case OPR_FUNC_INTRO: commit_function_intro(node); break; - case OPR_FUNC_OUTRO: commit_function_outro(node); break; - case OPR_CALL: commit_call(node); break; - case OPR_EXT_CALL: commit_ext_call(node); break; - case OPR_EQU: commit_equ(node); break; - case OPR_LOW: commit_low(node); break; - case OPR_NOT: commit_not(node); break; - case OPR_AFFECT_LIST: commit_affect_list(node); break; - case OPR_FOREACH: commit_foreach(node); break; - case OPR_VAR_LIST: commit_var_list(node); break; -#ifdef VERBOSE - case EMPTY_NODE: printf("NOP\n"); break; -#endif - } - - commit_node(node->unode.opr.next,0); /* recursive for the moment, maybe better to do something iterative? */ - break; - - case VAR_NODE: gsl_instr_set_namespace(currentGoomSL->instr, node->vnamespace); - gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_VAR); break; - case CONST_INT_NODE: gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_INTEGER); break; - case CONST_FLOAT_NODE: gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_FLOAT); break; - case CONST_PTR_NODE: gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_PTR); break; - } - if (releaseIfTmp && is_tmp_expr(node)) - releaseTemp(get_tmp_id(node)); - - nodeFree(node); - } /* }}} */ - - NodeType *nodeNew(const char *str, int type, int line_number) { - NodeType *node = (NodeType*)malloc(sizeof(NodeType)); /* {{{ */ - node->type = type; - node->str = (char*)malloc(strlen(str)+1); - node->vnamespace = NULL; - node->line_number = line_number; - strcpy(node->str, str); - return node; - } /* }}} */ - static NodeType *nodeClone(NodeType *node) { - NodeType *ret = nodeNew(node->str, node->type, node->line_number); /* {{{ */ - ret->vnamespace = node->vnamespace; - ret->unode = node->unode; - return ret; - } /* }}} */ - - void nodeFreeInternals(NodeType *node) { - free(node->str); /* {{{ */ - } /* }}} */ - - void nodeFree(NodeType *node) { - nodeFreeInternals(node); /* {{{ */ - free(node); - } /* }}} */ - - NodeType *new_constInt(const char *str, int line_number) { - NodeType *node = nodeNew(str, CONST_INT_NODE, line_number); /* {{{ */ - node->unode.constInt.val = atoi(str); - return node; - } /* }}} */ - - NodeType *new_constPtr(const char *str, int line_number) { - NodeType *node = nodeNew(str, CONST_PTR_NODE, line_number); /* {{{ */ - node->unode.constPtr.id = strtol(str,NULL,0); - return node; - } /* }}} */ - - NodeType *new_constFloat(const char *str, int line_number) { - NodeType *node = nodeNew(str, CONST_FLOAT_NODE, line_number); /* {{{ */ - node->unode.constFloat.val = atof(str); - return node; - } /* }}} */ - - NodeType *new_var(const char *str, int line_number) { - NodeType *node = nodeNew(str, VAR_NODE, line_number); /* {{{ */ - node->vnamespace = gsl_find_namespace(str); - if (node->vnamespace == 0) { - fprintf(stderr, "ERROR: Line %d, Variable not found: '%s'\n", line_number, str); - exit(1); - } - return node; - } /* }}} */ - - NodeType *new_nop(const char *str) { - NodeType *node = new_op(str, EMPTY_NODE, 0); /* {{{ */ - return node; - } /* }}} */ - - NodeType *new_op(const char *str, int type, int nbOp) { - int i; /* {{{ */ - NodeType *node = nodeNew(str, OPR_NODE, currentGoomSL->num_lines); - node->unode.opr.next = 0; - node->unode.opr.type = type; - node->unode.opr.nbOp = nbOp; - for (i=0;iunode.opr.op[i] = 0; - return node; - } /* }}} */ - - - void gsl_declare_global_variable(int type, char *name) { - switch(type){ - case -1: break; - case FLOAT_TK:gsl_float_decl_global(name);break; - case INT_TK: gsl_int_decl_global(name);break; - case PTR_TK: gsl_ptr_decl_global(name);break; - default: - { - int id = type - 1000; - gsl_struct_decl_global_from_id(name,id); - } - } - } - - - -/* Line 189 of yacc.c */ -#line 1268 "goomsl_yacc.c" - -/* Enabling traces. */ -#ifndef YYDEBUG -# define YYDEBUG 0 -#endif - -/* Enabling verbose error messages. */ -#ifdef YYERROR_VERBOSE -# undef YYERROR_VERBOSE -# define YYERROR_VERBOSE 1 -#else -# define YYERROR_VERBOSE 0 -#endif - -/* Enabling the token table. */ -#ifndef YYTOKEN_TABLE -# define YYTOKEN_TABLE 0 -#endif - - -/* Tokens. */ -#ifndef YYTOKENTYPE -# define YYTOKENTYPE - /* Put the tokens into the symbol table, so that GDB and other debuggers - know about them. */ - enum yytokentype { - LTYPE_INTEGER = 258, - LTYPE_FLOAT = 259, - LTYPE_VAR = 260, - LTYPE_PTR = 261, - PTR_TK = 262, - INT_TK = 263, - FLOAT_TK = 264, - DECLARE = 265, - EXTERNAL = 266, - WHILE = 267, - DO = 268, - NOT = 269, - PLUS_EQ = 270, - SUB_EQ = 271, - DIV_EQ = 272, - MUL_EQ = 273, - SUP_EQ = 274, - LOW_EQ = 275, - NOT_EQ = 276, - STRUCT = 277, - FOR = 278, - IN = 279 - }; -#endif -/* Tokens. */ -#define LTYPE_INTEGER 258 -#define LTYPE_FLOAT 259 -#define LTYPE_VAR 260 -#define LTYPE_PTR 261 -#define PTR_TK 262 -#define INT_TK 263 -#define FLOAT_TK 264 -#define DECLARE 265 -#define EXTERNAL 266 -#define WHILE 267 -#define DO 268 -#define NOT 269 -#define PLUS_EQ 270 -#define SUB_EQ 271 -#define DIV_EQ 272 -#define MUL_EQ 273 -#define SUP_EQ 274 -#define LOW_EQ 275 -#define NOT_EQ 276 -#define STRUCT 277 -#define FOR 278 -#define IN 279 - - - - -#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED -typedef union YYSTYPE -{ - -/* Line 214 of yacc.c */ -#line 1200 "goomsl_yacc.y" - - int intValue; - float floatValue; - char charValue; - char strValue[2048]; - NodeType *nPtr; - GoomHash *namespace; - GSL_Struct *gsl_struct; - GSL_StructField *gsl_struct_field; - - - -/* Line 214 of yacc.c */ -#line 1365 "goomsl_yacc.c" -} YYSTYPE; -# define YYSTYPE_IS_TRIVIAL 1 -# define yystype YYSTYPE /* obsolescent; will be withdrawn */ -# define YYSTYPE_IS_DECLARED 1 -#endif - - -/* Copy the second part of user declarations. */ - - -/* Line 264 of yacc.c */ -#line 1377 "goomsl_yacc.c" - -#ifdef short -# undef short -#endif - -#ifdef YYTYPE_UINT8 -typedef YYTYPE_UINT8 yytype_uint8; -#else -typedef unsigned char yytype_uint8; -#endif - -#ifdef YYTYPE_INT8 -typedef YYTYPE_INT8 yytype_int8; -#elif (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -typedef signed char yytype_int8; -#else -typedef short int yytype_int8; -#endif - -#ifdef YYTYPE_UINT16 -typedef YYTYPE_UINT16 yytype_uint16; -#else -typedef unsigned short int yytype_uint16; -#endif - -#ifdef YYTYPE_INT16 -typedef YYTYPE_INT16 yytype_int16; -#else -typedef short int yytype_int16; -#endif - -#ifndef YYSIZE_T -# ifdef __SIZE_TYPE__ -# define YYSIZE_T __SIZE_TYPE__ -# elif defined size_t -# define YYSIZE_T size_t -# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -# include /* INFRINGES ON USER NAME SPACE */ -# define YYSIZE_T size_t -# else -# define YYSIZE_T unsigned int -# endif -#endif - -#define YYSIZE_MAXIMUM ((YYSIZE_T) -1) - -#ifndef YY_ -# if YYENABLE_NLS -# if ENABLE_NLS -# include /* INFRINGES ON USER NAME SPACE */ -# define YY_(msgid) dgettext ("bison-runtime", msgid) -# endif -# endif -# ifndef YY_ -# define YY_(msgid) msgid -# endif -#endif - -/* Suppress unused-variable warnings by "using" E. */ -#if ! defined lint || defined __GNUC__ -# define YYUSE(e) ((void) (e)) -#else -# define YYUSE(e) /* empty */ -#endif - -/* Identity function, used to suppress warnings about constant conditions. */ -#ifndef lint -# define YYID(n) (n) -#else -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static int -YYID (int yyi) -#else -static int -YYID (yyi) - int yyi; -#endif -{ - return yyi; -} -#endif - -#if ! defined yyoverflow || YYERROR_VERBOSE - -/* The parser invokes alloca or malloc; define the necessary symbols. */ - -# ifdef YYSTACK_USE_ALLOCA -# if YYSTACK_USE_ALLOCA -# ifdef __GNUC__ -# define YYSTACK_ALLOC __builtin_alloca -# elif defined __BUILTIN_VA_ARG_INCR -# include /* INFRINGES ON USER NAME SPACE */ -# elif defined _AIX -# define YYSTACK_ALLOC __alloca -# elif defined _MSC_VER -# include /* INFRINGES ON USER NAME SPACE */ -# define alloca _alloca -# else -# define YYSTACK_ALLOC alloca -# if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -# include /* INFRINGES ON USER NAME SPACE */ -# ifndef _STDLIB_H -# define _STDLIB_H 1 -# endif -# endif -# endif -# endif -# endif - -# ifdef YYSTACK_ALLOC - /* Pacify GCC's `empty if-body' warning. */ -# define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) -# ifndef YYSTACK_ALLOC_MAXIMUM - /* The OS might guarantee only one guard page at the bottom of the stack, - and a page size can be as small as 4096 bytes. So we cannot safely - invoke alloca (N) if N exceeds 4096. Use a slightly smaller number - to allow for a few compiler-allocated temporary stack slots. */ -# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ -# endif -# else -# define YYSTACK_ALLOC YYMALLOC -# define YYSTACK_FREE YYFREE -# ifndef YYSTACK_ALLOC_MAXIMUM -# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM -# endif -# if (defined __cplusplus && ! defined _STDLIB_H \ - && ! ((defined YYMALLOC || defined malloc) \ - && (defined YYFREE || defined free))) -# include /* INFRINGES ON USER NAME SPACE */ -# ifndef _STDLIB_H -# define _STDLIB_H 1 -# endif -# endif -# ifndef YYMALLOC -# define YYMALLOC malloc -# if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ -# endif -# endif -# ifndef YYFREE -# define YYFREE free -# if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -void free (void *); /* INFRINGES ON USER NAME SPACE */ -# endif -# endif -# endif -#endif /* ! defined yyoverflow || YYERROR_VERBOSE */ - - -#if (! defined yyoverflow \ - && (! defined __cplusplus \ - || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) - -/* A type that is properly aligned for any stack member. */ -union yyalloc -{ - yytype_int16 yyss_alloc; - YYSTYPE yyvs_alloc; -}; - -/* The size of the maximum gap between one aligned stack and the next. */ -# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) - -/* The size of an array large to enough to hold all stacks, each with - N elements. */ -# define YYSTACK_BYTES(N) \ - ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ - + YYSTACK_GAP_MAXIMUM) - -/* Copy COUNT objects from FROM to TO. The source and destination do - not overlap. */ -# ifndef YYCOPY -# if defined __GNUC__ && 1 < __GNUC__ -# define YYCOPY(To, From, Count) \ - __builtin_memcpy (To, From, (Count) * sizeof (*(From))) -# else -# define YYCOPY(To, From, Count) \ - do \ - { \ - YYSIZE_T yyi; \ - for (yyi = 0; yyi < (Count); yyi++) \ - (To)[yyi] = (From)[yyi]; \ - } \ - while (YYID (0)) -# endif -# endif - -/* Relocate STACK from its old location to the new one. The - local variables YYSIZE and YYSTACKSIZE give the old and new number of - elements in the stack, and YYPTR gives the new location of the - stack. Advance YYPTR to a properly aligned location for the next - stack. */ -# define YYSTACK_RELOCATE(Stack_alloc, Stack) \ - do \ - { \ - YYSIZE_T yynewbytes; \ - YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ - Stack = &yyptr->Stack_alloc; \ - yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ - yyptr += yynewbytes / sizeof (*yyptr); \ - } \ - while (YYID (0)) - -#endif - -/* YYFINAL -- State number of the termination state. */ -#define YYFINAL 3 -/* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 229 - -/* YYNTOKENS -- Number of terminals. */ -#define YYNTOKENS 42 -/* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 30 -/* YYNRULES -- Number of rules. */ -#define YYNRULES 89 -/* YYNRULES -- Number of states. */ -#define YYNSTATES 217 - -/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ -#define YYUNDEFTOK 2 -#define YYMAXUTOK 279 - -#define YYTRANSLATE(YYX) \ - ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) - -/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ -static const yytype_uint8 yytranslate[] = -{ - 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 25, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 35, 36, 32, 29, 34, 30, 2, 31, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 33, 2, - 27, 26, 28, 37, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 40, 2, 41, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 38, 2, 39, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, - 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24 -}; - -#if YYDEBUG -/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in - YYRHS. */ -static const yytype_uint16 yyprhs[] = -{ - 0, 0, 3, 7, 10, 19, 30, 39, 50, 53, - 56, 57, 65, 68, 73, 76, 79, 82, 85, 87, - 89, 90, 93, 96, 99, 102, 104, 108, 111, 112, - 116, 122, 130, 131, 132, 137, 142, 147, 152, 154, - 157, 160, 163, 166, 169, 172, 179, 186, 193, 195, - 199, 203, 207, 211, 218, 222, 224, 227, 231, 232, - 234, 236, 240, 244, 248, 252, 255, 259, 261, 265, - 269, 273, 277, 281, 285, 288, 290, 292, 294, 298, - 304, 310, 318, 323, 330, 333, 335, 340, 344, 346 -}; - -/* YYRHS -- A `-1'-separated list of the rules' RHS. */ -static const yytype_int8 yyrhs[] = -{ - 43, 0, -1, 44, 55, 52, -1, 44, 59, -1, - 44, 11, 27, 48, 28, 50, 25, 56, -1, 44, - 11, 27, 48, 33, 51, 28, 50, 25, 56, -1, - 44, 10, 27, 49, 28, 50, 25, 56, -1, 44, - 10, 27, 49, 33, 51, 28, 50, 25, 56, -1, - 44, 45, -1, 44, 25, -1, -1, 22, 27, 5, - 33, 46, 28, 25, -1, 71, 47, -1, 46, 34, - 71, 47, -1, 8, 5, -1, 9, 5, -1, 7, - 5, -1, 5, 5, -1, 5, -1, 5, -1, -1, - 33, 8, -1, 33, 9, -1, 33, 7, -1, 33, - 5, -1, 58, -1, 58, 34, 51, -1, 52, 53, - -1, -1, 54, 44, 55, -1, 27, 49, 28, 50, - 25, -1, 27, 49, 33, 51, 28, 50, 25, -1, - -1, -1, 9, 5, 26, 64, -1, 8, 5, 26, - 64, -1, 7, 5, 26, 64, -1, 5, 5, 26, - 64, -1, 58, -1, 9, 5, -1, 8, 5, -1, - 7, 5, -1, 5, 5, -1, 62, 25, -1, 57, - 25, -1, 35, 65, 36, 37, 71, 59, -1, 12, - 65, 71, 13, 71, 59, -1, 38, 25, 63, 44, - 39, 25, -1, 67, -1, 5, 15, 64, -1, 5, - 16, 64, -1, 5, 18, 64, -1, 5, 17, 64, - -1, 23, 5, 24, 60, 13, 59, -1, 35, 61, - 36, -1, 5, -1, 5, 61, -1, 5, 26, 64, - -1, -1, 5, -1, 66, -1, 64, 32, 64, -1, - 64, 31, 64, -1, 64, 29, 64, -1, 64, 30, - 64, -1, 30, 64, -1, 35, 64, 36, -1, 68, - -1, 64, 26, 64, -1, 64, 27, 64, -1, 64, - 28, 64, -1, 64, 19, 64, -1, 64, 20, 64, - -1, 64, 21, 64, -1, 14, 65, -1, 4, -1, - 3, -1, 6, -1, 49, 25, 56, -1, 49, 33, - 69, 25, 56, -1, 40, 49, 41, 25, 56, -1, - 40, 49, 33, 69, 41, 25, 56, -1, 40, 49, - 56, 41, -1, 40, 49, 33, 69, 41, 56, -1, - 70, 69, -1, 70, -1, 5, 26, 56, 64, -1, - 33, 56, 64, -1, 25, -1, -1 -}; - -/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ -static const yytype_uint16 yyrline[] = -{ - 0, 1237, 1237, 1239, 1240, 1241, 1242, 1243, 1244, 1245, - 1246, 1251, 1254, 1255, 1258, 1259, 1260, 1261, 1266, 1268, - 1271, 1272, 1273, 1274, 1275, 1278, 1279, 1284, 1285, 1288, - 1290, 1292, 1295, 1297, 1301, 1302, 1303, 1304, 1305, 1308, - 1309, 1310, 1311, 1316, 1317, 1318, 1319, 1320, 1321, 1322, - 1323, 1324, 1325, 1326, 1329, 1331, 1332, 1335, 1337, 1340, - 1341, 1342, 1343, 1344, 1345, 1346, 1347, 1348, 1351, 1352, - 1353, 1354, 1355, 1356, 1357, 1360, 1361, 1362, 1367, 1368, - 1369, 1370, 1374, 1375, 1378, 1379, 1381, 1385, 1394, 1394 -}; -#endif - -#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE -/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. - First, the terminals, then, starting at YYNTOKENS, nonterminals. */ -static const char *const yytname[] = -{ - "$end", "error", "$undefined", "LTYPE_INTEGER", "LTYPE_FLOAT", - "LTYPE_VAR", "LTYPE_PTR", "PTR_TK", "INT_TK", "FLOAT_TK", "DECLARE", - "EXTERNAL", "WHILE", "DO", "NOT", "PLUS_EQ", "SUB_EQ", "DIV_EQ", - "MUL_EQ", "SUP_EQ", "LOW_EQ", "NOT_EQ", "STRUCT", "FOR", "IN", "'\\n'", - "'='", "'<'", "'>'", "'+'", "'-'", "'/'", "'*'", "':'", "','", "'('", - "')'", "'?'", "'{'", "'}'", "'['", "']'", "$accept", "gsl", "gsl_code", - "struct_declaration", "struct_members", "struct_member", "ext_task_name", - "task_name", "return_type", "arglist", "gsl_def_functions", "function", - "function_intro", "function_outro", "leave_namespace", "declaration", - "empty_declaration", "instruction", "var_list", "var_list_content", - "affectation", "start_block", "expression", "test", "constValue", - "func_call", "func_call_expression", "affectation_list", - "affectation_in_list", "opt_nl", 0 -}; -#endif - -# ifdef YYPRINT -/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to - token YYLEX-NUM. */ -static const yytype_uint16 yytoknum[] = -{ - 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, - 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, - 275, 276, 277, 278, 279, 10, 61, 60, 62, 43, - 45, 47, 42, 58, 44, 40, 41, 63, 123, 125, - 91, 93 -}; -# endif - -/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ -static const yytype_uint8 yyr1[] = -{ - 0, 42, 43, 44, 44, 44, 44, 44, 44, 44, - 44, 45, 46, 46, 47, 47, 47, 47, 48, 49, - 50, 50, 50, 50, 50, 51, 51, 52, 52, 53, - 54, 54, 55, 56, 57, 57, 57, 57, 57, 58, - 58, 58, 58, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 60, 61, 61, 62, 63, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 65, 65, - 65, 65, 65, 65, 65, 66, 66, 66, 67, 67, - 67, 67, 68, 68, 69, 69, 70, 70, 71, 71 -}; - -/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ -static const yytype_uint8 yyr2[] = -{ - 0, 2, 3, 2, 8, 10, 8, 10, 2, 2, - 0, 7, 2, 4, 2, 2, 2, 2, 1, 1, - 0, 2, 2, 2, 2, 1, 3, 2, 0, 3, - 5, 7, 0, 0, 4, 4, 4, 4, 1, 2, - 2, 2, 2, 2, 2, 6, 6, 6, 1, 3, - 3, 3, 3, 6, 3, 1, 2, 3, 0, 1, - 1, 3, 3, 3, 3, 2, 3, 1, 3, 3, - 3, 3, 3, 3, 2, 1, 1, 1, 3, 5, - 5, 7, 4, 6, 2, 1, 4, 3, 1, 0 -}; - -/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state - STATE-NUM when YYTABLE doesn't specify something else to do. Zero - means the default is an error. */ -static const yytype_uint8 yydefact[] = -{ - 10, 0, 32, 1, 19, 0, 0, 0, 0, 0, - 0, 0, 0, 9, 0, 0, 0, 8, 0, 28, - 0, 38, 3, 0, 48, 42, 0, 0, 0, 0, - 0, 41, 40, 39, 0, 0, 76, 75, 59, 77, - 0, 0, 0, 0, 0, 89, 60, 67, 0, 0, - 0, 58, 19, 0, 33, 0, 2, 44, 43, 0, - 49, 50, 52, 51, 57, 0, 0, 0, 0, 18, - 0, 74, 65, 0, 33, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 88, 0, 0, 0, 0, - 10, 0, 0, 78, 0, 33, 0, 85, 0, 27, - 10, 37, 36, 35, 34, 20, 0, 20, 0, 66, - 0, 0, 71, 72, 73, 68, 69, 70, 63, 64, - 62, 61, 89, 89, 0, 0, 89, 0, 0, 33, - 33, 0, 33, 84, 0, 32, 0, 0, 0, 0, - 0, 0, 0, 25, 0, 0, 0, 82, 0, 0, - 0, 55, 0, 0, 0, 0, 0, 80, 0, 87, - 79, 20, 0, 29, 24, 23, 21, 22, 33, 42, - 41, 40, 39, 20, 0, 33, 20, 33, 46, 0, - 89, 0, 0, 0, 0, 12, 56, 54, 53, 45, - 47, 33, 86, 0, 0, 6, 0, 26, 4, 0, - 83, 11, 0, 17, 16, 14, 15, 81, 30, 20, - 33, 33, 13, 0, 7, 5, 31 -}; - -/* YYDEFGOTO[NTERM-NUM]. */ -static const yytype_int16 yydefgoto[] = -{ - -1, 1, 2, 17, 149, 185, 70, 18, 137, 142, - 56, 99, 100, 19, 93, 20, 21, 22, 125, 152, - 23, 90, 44, 45, 46, 24, 47, 96, 97, 86 -}; - -/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing - STATE-NUM. */ -#define YYPACT_NINF -116 -static const yytype_int16 yypact[] = -{ - -116, 40, 136, -116, 103, 39, 66, 68, 61, 65, - 1, 77, 101, -116, 1, 84, 109, -116, 12, -116, - 91, -116, -116, 97, -116, 98, 72, 72, 72, 72, - 72, 99, 104, 113, 109, 130, -116, -116, -116, -116, - 1, 72, 72, 109, 166, 115, -116, -116, 145, 131, - 118, -116, -116, -24, -116, -3, 138, -116, -116, 72, - 159, 159, 159, 159, 159, 72, 72, 72, 14, -116, - 51, -116, 22, 102, 124, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 72, -116, 160, 139, 140, 141, - -116, -3, 152, -116, 154, -116, 156, -3, 109, -116, - -116, 159, 159, 159, 159, 150, 82, 150, 82, -116, - -3, 158, 159, 159, 159, 159, 159, 159, 22, 22, - -116, -116, 115, 115, 195, 188, 115, 88, 162, -116, - -116, 72, -116, -116, 52, 136, 155, 177, 199, 200, - 201, 202, 180, 175, 185, 183, 171, -116, 144, 18, - 161, 195, 178, 144, 144, 190, 191, -116, 72, 159, - -116, 150, 82, -116, -116, -116, -116, -116, -116, -116, - -116, -116, -116, 150, 82, -116, 150, -116, -116, 192, - 115, 208, 213, 214, 215, -116, -116, -116, -116, -116, - -116, -116, 159, 196, 194, -116, 198, -116, -116, 203, - -116, -116, 161, -116, -116, -116, -116, -116, -116, 150, - -116, -116, -116, 204, -116, -116, -116 -}; - -/* YYPGOTO[NTERM-NUM]. */ -static const yytype_int8 yypgoto[] = -{ - -116, -116, -68, -116, -116, 23, -116, -15, -104, -92, - -116, -116, -116, 89, -74, -116, -88, -115, -116, 75, - -116, -116, -16, -6, -116, -116, -116, -62, -116, -99 -}; - -/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If - positive, shift that token. If negative, reduce the rule which - number is the opposite. If zero, do what YYDEFACT says. - If YYTABLE_NINF, syntax error. */ -#define YYTABLE_NINF -1 -static const yytype_uint8 yytable[] = -{ - 111, 53, 94, 144, 36, 37, 38, 39, 50, 91, - 60, 61, 62, 63, 64, 40, 145, 92, 143, 68, - 143, 131, 127, 148, 150, 72, 73, 154, 74, 128, - 95, 41, 135, 178, 71, 133, 42, 54, 188, 189, - 3, 43, 105, 101, 31, 55, 179, 106, 146, 102, - 103, 104, 180, 83, 84, 157, 158, 193, 160, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 196, - 194, 32, 199, 33, 143, 36, 37, 38, 39, 107, - 161, 202, 197, 134, 108, 162, 143, 138, 34, 139, - 140, 141, 35, 4, 195, 5, 6, 7, 8, 9, - 10, 198, 41, 200, 48, 213, 49, 42, 25, 51, - 11, 12, 43, 13, 52, 159, 57, 207, 26, 27, - 28, 29, 58, 14, 59, 65, 15, 155, 16, 30, - 66, 81, 82, 83, 84, 69, 214, 215, 109, 67, - 85, 4, 192, 5, 6, 7, 8, 9, 10, 4, - 87, 5, 6, 7, 89, 88, 10, 110, 11, 12, - 164, 13, 165, 166, 167, 98, 181, 12, 182, 183, - 184, 14, 123, 122, 15, 124, 16, 129, 126, 14, - 130, 132, 15, 136, 16, 75, 76, 77, 81, 82, - 83, 84, 78, 79, 80, 81, 82, 83, 84, 147, - 151, 153, 168, 156, 169, 170, 171, 172, 173, 174, - 175, 176, 177, 203, 187, 190, 191, 201, 204, 205, - 206, 208, 209, 210, 163, 212, 186, 0, 211, 216 -}; - -static const yytype_int16 yycheck[] = -{ - 74, 16, 5, 107, 3, 4, 5, 6, 14, 33, - 26, 27, 28, 29, 30, 14, 108, 41, 106, 34, - 108, 95, 90, 122, 123, 41, 42, 126, 43, 91, - 33, 30, 100, 148, 40, 97, 35, 25, 153, 154, - 0, 40, 28, 59, 5, 33, 28, 33, 110, 65, - 66, 67, 34, 31, 32, 129, 130, 161, 132, 75, - 76, 77, 78, 79, 80, 81, 82, 83, 84, 173, - 162, 5, 176, 5, 162, 3, 4, 5, 6, 28, - 28, 180, 174, 98, 33, 33, 174, 5, 27, 7, - 8, 9, 27, 5, 168, 7, 8, 9, 10, 11, - 12, 175, 30, 177, 27, 209, 5, 35, 5, 25, - 22, 23, 40, 25, 5, 131, 25, 191, 15, 16, - 17, 18, 25, 35, 26, 26, 38, 39, 40, 26, - 26, 29, 30, 31, 32, 5, 210, 211, 36, 26, - 25, 5, 158, 7, 8, 9, 10, 11, 12, 5, - 5, 7, 8, 9, 36, 24, 12, 33, 22, 23, - 5, 25, 7, 8, 9, 27, 5, 23, 7, 8, - 9, 35, 33, 13, 38, 35, 40, 25, 37, 35, - 26, 25, 38, 33, 40, 19, 20, 21, 29, 30, - 31, 32, 26, 27, 28, 29, 30, 31, 32, 41, - 5, 13, 25, 41, 5, 5, 5, 5, 28, 34, - 25, 28, 41, 5, 36, 25, 25, 25, 5, 5, - 5, 25, 28, 25, 135, 202, 151, -1, 25, 25 -}; - -/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing - symbol of state STATE-NUM. */ -static const yytype_uint8 yystos[] = -{ - 0, 43, 44, 0, 5, 7, 8, 9, 10, 11, - 12, 22, 23, 25, 35, 38, 40, 45, 49, 55, - 57, 58, 59, 62, 67, 5, 15, 16, 17, 18, - 26, 5, 5, 5, 27, 27, 3, 4, 5, 6, - 14, 30, 35, 40, 64, 65, 66, 68, 27, 5, - 65, 25, 5, 49, 25, 33, 52, 25, 25, 26, - 64, 64, 64, 64, 64, 26, 26, 26, 49, 5, - 48, 65, 64, 64, 49, 19, 20, 21, 26, 27, - 28, 29, 30, 31, 32, 25, 71, 5, 24, 36, - 63, 33, 41, 56, 5, 33, 69, 70, 27, 53, - 54, 64, 64, 64, 64, 28, 33, 28, 33, 36, - 33, 56, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 13, 33, 35, 60, 37, 44, 69, 25, - 26, 56, 25, 69, 49, 44, 33, 50, 5, 7, - 8, 9, 51, 58, 50, 51, 69, 41, 71, 46, - 71, 5, 61, 13, 71, 39, 41, 56, 56, 64, - 56, 28, 33, 55, 5, 7, 8, 9, 25, 5, - 5, 5, 5, 28, 34, 25, 28, 41, 59, 28, - 34, 5, 7, 8, 9, 47, 61, 36, 59, 59, - 25, 25, 64, 50, 51, 56, 50, 51, 56, 50, - 56, 25, 71, 5, 5, 5, 5, 56, 25, 28, - 25, 25, 47, 50, 56, 56, 25 -}; - -#define yyerrok (yyerrstatus = 0) -#define yyclearin (yychar = YYEMPTY) -#define YYEMPTY (-2) -#define YYEOF 0 - -#define YYACCEPT goto yyacceptlab -#define YYABORT goto yyabortlab -#define YYERROR goto yyerrorlab - - -/* Like YYERROR except do call yyerror. This remains here temporarily - to ease the transition to the new meaning of YYERROR, for GCC. - Once GCC version 2 has supplanted version 1, this can go. */ - -#define YYFAIL goto yyerrlab - -#define YYRECOVERING() (!!yyerrstatus) - -#define YYBACKUP(Token, Value) \ -do \ - if (yychar == YYEMPTY && yylen == 1) \ - { \ - yychar = (Token); \ - yylval = (Value); \ - yytoken = YYTRANSLATE (yychar); \ - YYPOPSTACK (1); \ - goto yybackup; \ - } \ - else \ - { \ - yyerror (YY_("syntax error: cannot back up")); \ - YYERROR; \ - } \ -while (YYID (0)) - - -#define YYTERROR 1 -#define YYERRCODE 256 - - -/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. - If N is 0, then set CURRENT to the empty location which ends - the previous symbol: RHS[0] (always defined). */ - -#define YYRHSLOC(Rhs, K) ((Rhs)[K]) -#ifndef YYLLOC_DEFAULT -# define YYLLOC_DEFAULT(Current, Rhs, N) \ - do \ - if (YYID (N)) \ - { \ - (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ - (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ - (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ - (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ - } \ - else \ - { \ - (Current).first_line = (Current).last_line = \ - YYRHSLOC (Rhs, 0).last_line; \ - (Current).first_column = (Current).last_column = \ - YYRHSLOC (Rhs, 0).last_column; \ - } \ - while (YYID (0)) -#endif - - -/* YY_LOCATION_PRINT -- Print the location on the stream. - This macro was not mandated originally: define only if we know - we won't break user code: when these are the locations we know. */ - -#ifndef YY_LOCATION_PRINT -# if YYLTYPE_IS_TRIVIAL -# define YY_LOCATION_PRINT(File, Loc) \ - fprintf (File, "%d.%d-%d.%d", \ - (Loc).first_line, (Loc).first_column, \ - (Loc).last_line, (Loc).last_column) -# else -# define YY_LOCATION_PRINT(File, Loc) ((void) 0) -# endif -#endif - - -/* YYLEX -- calling `yylex' with the right arguments. */ - -#ifdef YYLEX_PARAM -# define YYLEX yylex (YYLEX_PARAM) -#else -# define YYLEX yylex () -#endif - -/* Enable debugging if requested. */ -#if YYDEBUG - -# ifndef YYFPRINTF -# include /* INFRINGES ON USER NAME SPACE */ -# define YYFPRINTF fprintf -# endif - -# define YYDPRINTF(Args) \ -do { \ - if (yydebug) \ - YYFPRINTF Args; \ -} while (YYID (0)) - -# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ -do { \ - if (yydebug) \ - { \ - YYFPRINTF (stderr, "%s ", Title); \ - yy_symbol_print (stderr, \ - Type, Value); \ - YYFPRINTF (stderr, "\n"); \ - } \ -} while (YYID (0)) - - -/*--------------------------------. -| Print this symbol on YYOUTPUT. | -`--------------------------------*/ - -/*ARGSUSED*/ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static void -yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) -#else -static void -yy_symbol_value_print (yyoutput, yytype, yyvaluep) - FILE *yyoutput; - int yytype; - YYSTYPE const * const yyvaluep; -#endif -{ - if (!yyvaluep) - return; -# ifdef YYPRINT - if (yytype < YYNTOKENS) - YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); -# else - YYUSE (yyoutput); -# endif - switch (yytype) - { - default: - break; - } -} - - -/*--------------------------------. -| Print this symbol on YYOUTPUT. | -`--------------------------------*/ - -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static void -yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) -#else -static void -yy_symbol_print (yyoutput, yytype, yyvaluep) - FILE *yyoutput; - int yytype; - YYSTYPE const * const yyvaluep; -#endif -{ - if (yytype < YYNTOKENS) - YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); - else - YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); - - yy_symbol_value_print (yyoutput, yytype, yyvaluep); - YYFPRINTF (yyoutput, ")"); -} - -/*------------------------------------------------------------------. -| yy_stack_print -- Print the state stack from its BOTTOM up to its | -| TOP (included). | -`------------------------------------------------------------------*/ - -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static void -yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop) -#else -static void -yy_stack_print (yybottom, yytop) - yytype_int16 *yybottom; - yytype_int16 *yytop; -#endif -{ - YYFPRINTF (stderr, "Stack now"); - for (; yybottom <= yytop; yybottom++) - { - int yybot = *yybottom; - YYFPRINTF (stderr, " %d", yybot); - } - YYFPRINTF (stderr, "\n"); -} - -# define YY_STACK_PRINT(Bottom, Top) \ -do { \ - if (yydebug) \ - yy_stack_print ((Bottom), (Top)); \ -} while (YYID (0)) - - -/*------------------------------------------------. -| Report that the YYRULE is going to be reduced. | -`------------------------------------------------*/ - -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static void -yy_reduce_print (YYSTYPE *yyvsp, int yyrule) -#else -static void -yy_reduce_print (yyvsp, yyrule) - YYSTYPE *yyvsp; - int yyrule; -#endif -{ - int yynrhs = yyr2[yyrule]; - int yyi; - unsigned long int yylno = yyrline[yyrule]; - YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", - yyrule - 1, yylno); - /* The symbols being reduced. */ - for (yyi = 0; yyi < yynrhs; yyi++) - { - YYFPRINTF (stderr, " $%d = ", yyi + 1); - yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], - &(yyvsp[(yyi + 1) - (yynrhs)]) - ); - YYFPRINTF (stderr, "\n"); - } -} - -# define YY_REDUCE_PRINT(Rule) \ -do { \ - if (yydebug) \ - yy_reduce_print (yyvsp, Rule); \ -} while (YYID (0)) - -/* Nonzero means print parse trace. It is left uninitialized so that - multiple parsers can coexist. */ -int yydebug; -#else /* !YYDEBUG */ -# define YYDPRINTF(Args) -# define YY_SYMBOL_PRINT(Title, Type, Value, Location) -# define YY_STACK_PRINT(Bottom, Top) -# define YY_REDUCE_PRINT(Rule) -#endif /* !YYDEBUG */ - - -/* YYINITDEPTH -- initial size of the parser's stacks. */ -#ifndef YYINITDEPTH -# define YYINITDEPTH 200 -#endif - -/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only - if the built-in stack extension method is used). - - Do not make this value too large; the results are undefined if - YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) - evaluated with infinite-precision integer arithmetic. */ - -#ifndef YYMAXDEPTH -# define YYMAXDEPTH 10000 -#endif - - - -#if YYERROR_VERBOSE - -# ifndef yystrlen -# if defined __GLIBC__ && defined _STRING_H -# define yystrlen strlen -# else -/* Return the length of YYSTR. */ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static YYSIZE_T -yystrlen (const char *yystr) -#else -static YYSIZE_T -yystrlen (yystr) - const char *yystr; -#endif -{ - YYSIZE_T yylen; - for (yylen = 0; yystr[yylen]; yylen++) - continue; - return yylen; -} -# endif -# endif - -# ifndef yystpcpy -# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE -# define yystpcpy stpcpy -# else -/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in - YYDEST. */ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static char * -yystpcpy (char *yydest, const char *yysrc) -#else -static char * -yystpcpy (yydest, yysrc) - char *yydest; - const char *yysrc; -#endif -{ - char *yyd = yydest; - const char *yys = yysrc; - - while ((*yyd++ = *yys++) != '\0') - continue; - - return yyd - 1; -} -# endif -# endif - -# ifndef yytnamerr -/* Copy to YYRES the contents of YYSTR after stripping away unnecessary - quotes and backslashes, so that it's suitable for yyerror. The - heuristic is that double-quoting is unnecessary unless the string - contains an apostrophe, a comma, or backslash (other than - backslash-backslash). YYSTR is taken from yytname. If YYRES is - null, do not copy; instead, return the length of what the result - would have been. */ -static YYSIZE_T -yytnamerr (char *yyres, const char *yystr) -{ - if (*yystr == '"') - { - YYSIZE_T yyn = 0; - char const *yyp = yystr; - - for (;;) - switch (*++yyp) - { - case '\'': - case ',': - goto do_not_strip_quotes; - - case '\\': - if (*++yyp != '\\') - goto do_not_strip_quotes; - /* Fall through. */ - default: - if (yyres) - yyres[yyn] = *yyp; - yyn++; - break; - - case '"': - if (yyres) - yyres[yyn] = '\0'; - return yyn; - } - do_not_strip_quotes: ; - } - - if (! yyres) - return yystrlen (yystr); - - return yystpcpy (yyres, yystr) - yyres; -} -# endif - -/* Copy into YYRESULT an error message about the unexpected token - YYCHAR while in state YYSTATE. Return the number of bytes copied, - including the terminating null byte. If YYRESULT is null, do not - copy anything; just return the number of bytes that would be - copied. As a special case, return 0 if an ordinary "syntax error" - message will do. Return YYSIZE_MAXIMUM if overflow occurs during - size calculation. */ -static YYSIZE_T -yysyntax_error (char *yyresult, int yystate, int yychar) -{ - int yyn = yypact[yystate]; - - if (! (YYPACT_NINF < yyn && yyn <= YYLAST)) - return 0; - else - { - int yytype = YYTRANSLATE (yychar); - YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); - YYSIZE_T yysize = yysize0; - YYSIZE_T yysize1; - int yysize_overflow = 0; - enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; - char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; - int yyx; - -# if 0 - /* This is so xgettext sees the translatable formats that are - constructed on the fly. */ - YY_("syntax error, unexpected %s"); - YY_("syntax error, unexpected %s, expecting %s"); - YY_("syntax error, unexpected %s, expecting %s or %s"); - YY_("syntax error, unexpected %s, expecting %s or %s or %s"); - YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); -# endif - char *yyfmt; - char const *yyf; - static char const yyunexpected[] = "syntax error, unexpected %s"; - static char const yyexpecting[] = ", expecting %s"; - static char const yyor[] = " or %s"; - char yyformat[sizeof yyunexpected - + sizeof yyexpecting - 1 - + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) - * (sizeof yyor - 1))]; - char const *yyprefix = yyexpecting; - - /* Start YYX at -YYN if negative to avoid negative indexes in - YYCHECK. */ - int yyxbegin = yyn < 0 ? -yyn : 0; - - /* Stay within bounds of both yycheck and yytname. */ - int yychecklim = YYLAST - yyn + 1; - int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; - int yycount = 1; - - yyarg[0] = yytname[yytype]; - yyfmt = yystpcpy (yyformat, yyunexpected); - - for (yyx = yyxbegin; yyx < yyxend; ++yyx) - if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) - { - if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) - { - yycount = 1; - yysize = yysize0; - yyformat[sizeof yyunexpected - 1] = '\0'; - break; - } - yyarg[yycount++] = yytname[yyx]; - yysize1 = yysize + yytnamerr (0, yytname[yyx]); - yysize_overflow |= (yysize1 < yysize); - yysize = yysize1; - yyfmt = yystpcpy (yyfmt, yyprefix); - yyprefix = yyor; - } - - yyf = YY_(yyformat); - yysize1 = yysize + yystrlen (yyf); - yysize_overflow |= (yysize1 < yysize); - yysize = yysize1; - - if (yysize_overflow) - return YYSIZE_MAXIMUM; - - if (yyresult) - { - /* Avoid sprintf, as that infringes on the user's name space. - Don't have undefined behavior even if the translation - produced a string with the wrong number of "%s"s. */ - char *yyp = yyresult; - int yyi = 0; - while ((*yyp = *yyf) != '\0') - { - if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) - { - yyp += yytnamerr (yyp, yyarg[yyi++]); - yyf += 2; - } - else - { - yyp++; - yyf++; - } - } - } - return yysize; - } -} -#endif /* YYERROR_VERBOSE */ - - -/*-----------------------------------------------. -| Release the memory associated to this symbol. | -`-----------------------------------------------*/ - -/*ARGSUSED*/ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static void -yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep) -#else -static void -yydestruct (yymsg, yytype, yyvaluep) - const char *yymsg; - int yytype; - YYSTYPE *yyvaluep; -#endif -{ - YYUSE (yyvaluep); - - if (!yymsg) - yymsg = "Deleting"; - YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); - - switch (yytype) - { - - default: - break; - } -} - -/* Prevent warnings from -Wmissing-prototypes. */ -#ifdef YYPARSE_PARAM -#if defined __STDC__ || defined __cplusplus -int yyparse (void *YYPARSE_PARAM); -#else -int yyparse (); -#endif -#else /* ! YYPARSE_PARAM */ -#if defined __STDC__ || defined __cplusplus -int yyparse (void); -#else -int yyparse (); -#endif -#endif /* ! YYPARSE_PARAM */ - - -/* The lookahead symbol. */ -int yychar; - -/* The semantic value of the lookahead symbol. */ -YYSTYPE yylval; - -/* Number of syntax errors so far. */ -int yynerrs; - - - -/*-------------------------. -| yyparse or yypush_parse. | -`-------------------------*/ - -#ifdef YYPARSE_PARAM -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -int -yyparse (void *YYPARSE_PARAM) -#else -int -yyparse (YYPARSE_PARAM) - void *YYPARSE_PARAM; -#endif -#else /* ! YYPARSE_PARAM */ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -int -yyparse (void) -#else -int -yyparse () - -#endif -#endif -{ - - - int yystate; - /* Number of tokens to shift before error messages enabled. */ - int yyerrstatus; - - /* The stacks and their tools: - `yyss': related to states. - `yyvs': related to semantic values. - - Refer to the stacks thru separate pointers, to allow yyoverflow - to reallocate them elsewhere. */ - - /* The state stack. */ - yytype_int16 yyssa[YYINITDEPTH]; - yytype_int16 *yyss; - yytype_int16 *yyssp; - - /* The semantic value stack. */ - YYSTYPE yyvsa[YYINITDEPTH]; - YYSTYPE *yyvs; - YYSTYPE *yyvsp; - - YYSIZE_T yystacksize; - - int yyn; - int yyresult; - /* Lookahead token as an internal (translated) token number. */ - int yytoken; - /* The variables used to return semantic value and location from the - action routines. */ - YYSTYPE yyval; - -#if YYERROR_VERBOSE - /* Buffer for error messages, and its allocated size. */ - char yymsgbuf[128]; - char *yymsg = yymsgbuf; - YYSIZE_T yymsg_alloc = sizeof yymsgbuf; -#endif - -#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) - - /* The number of symbols on the RHS of the reduced rule. - Keep to zero when no symbol should be popped. */ - int yylen = 0; - - yytoken = 0; - yyss = yyssa; - yyvs = yyvsa; - yystacksize = YYINITDEPTH; - - YYDPRINTF ((stderr, "Starting parse\n")); - - yystate = 0; - yyerrstatus = 0; - yynerrs = 0; - yychar = YYEMPTY; /* Cause a token to be read. */ - - /* Initialize stack pointers. - Waste one element of value and location stack - so that they stay on the same level as the state stack. - The wasted elements are never initialized. */ - yyssp = yyss; - yyvsp = yyvs; - - goto yysetstate; - -/*------------------------------------------------------------. -| yynewstate -- Push a new state, which is found in yystate. | -`------------------------------------------------------------*/ - yynewstate: - /* In all cases, when you get here, the value and location stacks - have just been pushed. So pushing a state here evens the stacks. */ - yyssp++; - - yysetstate: - *yyssp = yystate; - - if (yyss + yystacksize - 1 <= yyssp) - { - /* Get the current used size of the three stacks, in elements. */ - YYSIZE_T yysize = yyssp - yyss + 1; - -#ifdef yyoverflow - { - /* Give user a chance to reallocate the stack. Use copies of - these so that the &'s don't force the real ones into - memory. */ - YYSTYPE *yyvs1 = yyvs; - yytype_int16 *yyss1 = yyss; - - /* Each stack pointer address is followed by the size of the - data in use in that stack, in bytes. This used to be a - conditional around just the two extra args, but that might - be undefined if yyoverflow is a macro. */ - yyoverflow (YY_("memory exhausted"), - &yyss1, yysize * sizeof (*yyssp), - &yyvs1, yysize * sizeof (*yyvsp), - &yystacksize); - - yyss = yyss1; - yyvs = yyvs1; - } -#else /* no yyoverflow */ -# ifndef YYSTACK_RELOCATE - goto yyexhaustedlab; -# else - /* Extend the stack our own way. */ - if (YYMAXDEPTH <= yystacksize) - goto yyexhaustedlab; - yystacksize *= 2; - if (YYMAXDEPTH < yystacksize) - yystacksize = YYMAXDEPTH; - - { - yytype_int16 *yyss1 = yyss; - union yyalloc *yyptr = - (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); - if (! yyptr) - goto yyexhaustedlab; - YYSTACK_RELOCATE (yyss_alloc, yyss); - YYSTACK_RELOCATE (yyvs_alloc, yyvs); -# undef YYSTACK_RELOCATE - if (yyss1 != yyssa) - YYSTACK_FREE (yyss1); - } -# endif -#endif /* no yyoverflow */ - - yyssp = yyss + yysize - 1; - yyvsp = yyvs + yysize - 1; - - YYDPRINTF ((stderr, "Stack size increased to %lu\n", - (unsigned long int) yystacksize)); - - if (yyss + yystacksize - 1 <= yyssp) - YYABORT; - } - - YYDPRINTF ((stderr, "Entering state %d\n", yystate)); - - if (yystate == YYFINAL) - YYACCEPT; - - goto yybackup; - -/*-----------. -| yybackup. | -`-----------*/ -yybackup: - - /* Do appropriate processing given the current state. Read a - lookahead token if we need one and don't already have one. */ - - /* First try to decide what to do without reference to lookahead token. */ - yyn = yypact[yystate]; - if (yyn == YYPACT_NINF) - goto yydefault; - - /* Not known => get a lookahead token if don't already have one. */ - - /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */ - if (yychar == YYEMPTY) - { - YYDPRINTF ((stderr, "Reading a token: ")); - yychar = YYLEX; - } - - if (yychar <= YYEOF) - { - yychar = yytoken = YYEOF; - YYDPRINTF ((stderr, "Now at end of input.\n")); - } - else - { - yytoken = YYTRANSLATE (yychar); - YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); - } - - /* If the proper action on seeing token YYTOKEN is to reduce or to - detect an error, take that action. */ - yyn += yytoken; - if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) - goto yydefault; - yyn = yytable[yyn]; - if (yyn <= 0) - { - if (yyn == 0 || yyn == YYTABLE_NINF) - goto yyerrlab; - yyn = -yyn; - goto yyreduce; - } - - /* Count tokens shifted since error; after three, turn off error - status. */ - if (yyerrstatus) - yyerrstatus--; - - /* Shift the lookahead token. */ - YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); - - /* Discard the shifted token. */ - yychar = YYEMPTY; - - yystate = yyn; - *++yyvsp = yylval; - - goto yynewstate; - - -/*-----------------------------------------------------------. -| yydefault -- do the default action for the current state. | -`-----------------------------------------------------------*/ -yydefault: - yyn = yydefact[yystate]; - if (yyn == 0) - goto yyerrlab; - goto yyreduce; - - -/*-----------------------------. -| yyreduce -- Do a reduction. | -`-----------------------------*/ -yyreduce: - /* yyn is the number of a rule to reduce with. */ - yylen = yyr2[yyn]; - - /* If YYLEN is nonzero, implement the default value of the action: - `$$ = $1'. - - Otherwise, the following line sets YYVAL to garbage. - This behavior is undocumented and Bison - users should not rely upon it. Assigning to YYVAL - unconditionally makes the parser a bit smaller, and it avoids a - GCC warning that YYVAL may be used uninitialized. */ - yyval = yyvsp[1-yylen]; - - - YY_REDUCE_PRINT (yyn); - switch (yyn) - { - case 3: - -/* Line 1455 of yacc.c */ -#line 1239 "goomsl_yacc.y" - { gsl_append((yyvsp[(2) - (2)].nPtr)); } - break; - - case 4: - -/* Line 1455 of yacc.c */ -#line 1240 "goomsl_yacc.y" - { gsl_declare_global_variable((yyvsp[(6) - (8)].intValue),(yyvsp[(4) - (8)].strValue)); } - break; - - case 5: - -/* Line 1455 of yacc.c */ -#line 1241 "goomsl_yacc.y" - { gsl_declare_global_variable((yyvsp[(8) - (10)].intValue),(yyvsp[(4) - (10)].strValue)); } - break; - - case 6: - -/* Line 1455 of yacc.c */ -#line 1242 "goomsl_yacc.y" - { gsl_declare_global_variable((yyvsp[(6) - (8)].intValue),(yyvsp[(4) - (8)].strValue)); } - break; - - case 7: - -/* Line 1455 of yacc.c */ -#line 1243 "goomsl_yacc.y" - { gsl_declare_global_variable((yyvsp[(8) - (10)].intValue),(yyvsp[(4) - (10)].strValue)); } - break; - - case 11: - -/* Line 1455 of yacc.c */ -#line 1251 "goomsl_yacc.y" - { gsl_add_struct((yyvsp[(3) - (7)].strValue), (yyvsp[(5) - (7)].gsl_struct)); } - break; - - case 12: - -/* Line 1455 of yacc.c */ -#line 1254 "goomsl_yacc.y" - { (yyval.gsl_struct) = gsl_new_struct((yyvsp[(2) - (2)].gsl_struct_field)); } - break; - - case 13: - -/* Line 1455 of yacc.c */ -#line 1255 "goomsl_yacc.y" - { (yyval.gsl_struct) = (yyvsp[(1) - (4)].gsl_struct); gsl_add_struct_field((yyvsp[(1) - (4)].gsl_struct), (yyvsp[(4) - (4)].gsl_struct_field)); } - break; - - case 14: - -/* Line 1455 of yacc.c */ -#line 1258 "goomsl_yacc.y" - { (yyval.gsl_struct_field) = gsl_new_struct_field((yyvsp[(2) - (2)].strValue), INSTR_INT); } - break; - - case 15: - -/* Line 1455 of yacc.c */ -#line 1259 "goomsl_yacc.y" - { (yyval.gsl_struct_field) = gsl_new_struct_field((yyvsp[(2) - (2)].strValue), INSTR_FLOAT); } - break; - - case 16: - -/* Line 1455 of yacc.c */ -#line 1260 "goomsl_yacc.y" - { (yyval.gsl_struct_field) = gsl_new_struct_field((yyvsp[(2) - (2)].strValue), INSTR_PTR); } - break; - - case 17: - -/* Line 1455 of yacc.c */ -#line 1261 "goomsl_yacc.y" - { (yyval.gsl_struct_field) = gsl_new_struct_field_struct((yyvsp[(2) - (2)].strValue), (yyvsp[(1) - (2)].strValue)); } - break; - - case 18: - -/* Line 1455 of yacc.c */ -#line 1266 "goomsl_yacc.y" - { gsl_declare_external_task((yyvsp[(1) - (1)].strValue)); gsl_enternamespace((yyvsp[(1) - (1)].strValue)); strcpy((yyval.strValue),(yyvsp[(1) - (1)].strValue)); } - break; - - case 19: - -/* Line 1455 of yacc.c */ -#line 1268 "goomsl_yacc.y" - { gsl_declare_task((yyvsp[(1) - (1)].strValue)); gsl_enternamespace((yyvsp[(1) - (1)].strValue)); strcpy((yyval.strValue),(yyvsp[(1) - (1)].strValue)); strcpy((yyval.strValue),(yyvsp[(1) - (1)].strValue)); } - break; - - case 20: - -/* Line 1455 of yacc.c */ -#line 1271 "goomsl_yacc.y" - { (yyval.intValue)=-1; } - break; - - case 21: - -/* Line 1455 of yacc.c */ -#line 1272 "goomsl_yacc.y" - { (yyval.intValue)=INT_TK; } - break; - - case 22: - -/* Line 1455 of yacc.c */ -#line 1273 "goomsl_yacc.y" - { (yyval.intValue)=FLOAT_TK; } - break; - - case 23: - -/* Line 1455 of yacc.c */ -#line 1274 "goomsl_yacc.y" - { (yyval.intValue)=PTR_TK; } - break; - - case 24: - -/* Line 1455 of yacc.c */ -#line 1275 "goomsl_yacc.y" - { (yyval.intValue)= 1000 + gsl_get_struct_id((yyvsp[(2) - (2)].strValue)); } - break; - - case 29: - -/* Line 1455 of yacc.c */ -#line 1288 "goomsl_yacc.y" - { gsl_leavenamespace(); } - break; - - case 30: - -/* Line 1455 of yacc.c */ -#line 1290 "goomsl_yacc.y" - { gsl_append(new_function_intro((yyvsp[(2) - (5)].strValue))); - gsl_declare_global_variable((yyvsp[(4) - (5)].intValue),(yyvsp[(2) - (5)].strValue)); } - break; - - case 31: - -/* Line 1455 of yacc.c */ -#line 1292 "goomsl_yacc.y" - { gsl_append(new_function_intro((yyvsp[(2) - (7)].strValue))); - gsl_declare_global_variable((yyvsp[(6) - (7)].intValue),(yyvsp[(2) - (7)].strValue)); } - break; - - case 32: - -/* Line 1455 of yacc.c */ -#line 1295 "goomsl_yacc.y" - { gsl_append(new_function_outro()); } - break; - - case 33: - -/* Line 1455 of yacc.c */ -#line 1297 "goomsl_yacc.y" - { (yyval.namespace) = gsl_leavenamespace(); } - break; - - case 34: - -/* Line 1455 of yacc.c */ -#line 1301 "goomsl_yacc.y" - { gsl_float_decl_local((yyvsp[(2) - (4)].strValue)); (yyval.nPtr) = new_set(new_var((yyvsp[(2) - (4)].strValue),currentGoomSL->num_lines), (yyvsp[(4) - (4)].nPtr)); } - break; - - case 35: - -/* Line 1455 of yacc.c */ -#line 1302 "goomsl_yacc.y" - { gsl_int_decl_local((yyvsp[(2) - (4)].strValue)); (yyval.nPtr) = new_set(new_var((yyvsp[(2) - (4)].strValue),currentGoomSL->num_lines), (yyvsp[(4) - (4)].nPtr)); } - break; - - case 36: - -/* Line 1455 of yacc.c */ -#line 1303 "goomsl_yacc.y" - { gsl_ptr_decl_local((yyvsp[(2) - (4)].strValue)); (yyval.nPtr) = new_set(new_var((yyvsp[(2) - (4)].strValue),currentGoomSL->num_lines), (yyvsp[(4) - (4)].nPtr)); } - break; - - case 37: - -/* Line 1455 of yacc.c */ -#line 1304 "goomsl_yacc.y" - { gsl_struct_decl_local((yyvsp[(1) - (4)].strValue),(yyvsp[(2) - (4)].strValue)); (yyval.nPtr) = new_set(new_var((yyvsp[(2) - (4)].strValue),currentGoomSL->num_lines), (yyvsp[(4) - (4)].nPtr)); } - break; - - case 38: - -/* Line 1455 of yacc.c */ -#line 1305 "goomsl_yacc.y" - { (yyval.nPtr) = 0; } - break; - - case 39: - -/* Line 1455 of yacc.c */ -#line 1308 "goomsl_yacc.y" - { gsl_float_decl_local((yyvsp[(2) - (2)].strValue)); } - break; - - case 40: - -/* Line 1455 of yacc.c */ -#line 1309 "goomsl_yacc.y" - { gsl_int_decl_local((yyvsp[(2) - (2)].strValue)); } - break; - - case 41: - -/* Line 1455 of yacc.c */ -#line 1310 "goomsl_yacc.y" - { gsl_ptr_decl_local((yyvsp[(2) - (2)].strValue)); } - break; - - case 42: - -/* Line 1455 of yacc.c */ -#line 1311 "goomsl_yacc.y" - { gsl_struct_decl_local((yyvsp[(1) - (2)].strValue),(yyvsp[(2) - (2)].strValue)); } - break; - - case 43: - -/* Line 1455 of yacc.c */ -#line 1316 "goomsl_yacc.y" - { (yyval.nPtr) = (yyvsp[(1) - (2)].nPtr); } - break; - - case 44: - -/* Line 1455 of yacc.c */ -#line 1317 "goomsl_yacc.y" - { (yyval.nPtr) = (yyvsp[(1) - (2)].nPtr); } - break; - - case 45: - -/* Line 1455 of yacc.c */ -#line 1318 "goomsl_yacc.y" - { (yyval.nPtr) = new_if((yyvsp[(2) - (6)].nPtr),(yyvsp[(6) - (6)].nPtr)); } - break; - - case 46: - -/* Line 1455 of yacc.c */ -#line 1319 "goomsl_yacc.y" - { (yyval.nPtr) = new_while((yyvsp[(2) - (6)].nPtr),(yyvsp[(6) - (6)].nPtr)); } - break; - - case 47: - -/* Line 1455 of yacc.c */ -#line 1320 "goomsl_yacc.y" - { lastNode = (yyvsp[(3) - (6)].nPtr)->unode.opr.op[1]; (yyval.nPtr)=(yyvsp[(3) - (6)].nPtr); } - break; - - case 48: - -/* Line 1455 of yacc.c */ -#line 1321 "goomsl_yacc.y" - { (yyval.nPtr) = (yyvsp[(1) - (1)].nPtr); } - break; - - case 49: - -/* Line 1455 of yacc.c */ -#line 1322 "goomsl_yacc.y" - { (yyval.nPtr) = new_plus_eq(new_var((yyvsp[(1) - (3)].strValue),currentGoomSL->num_lines),(yyvsp[(3) - (3)].nPtr)); } - break; - - case 50: - -/* Line 1455 of yacc.c */ -#line 1323 "goomsl_yacc.y" - { (yyval.nPtr) = new_sub_eq(new_var((yyvsp[(1) - (3)].strValue),currentGoomSL->num_lines),(yyvsp[(3) - (3)].nPtr)); } - break; - - case 51: - -/* Line 1455 of yacc.c */ -#line 1324 "goomsl_yacc.y" - { (yyval.nPtr) = new_mul_eq(new_var((yyvsp[(1) - (3)].strValue),currentGoomSL->num_lines),(yyvsp[(3) - (3)].nPtr)); } - break; - - case 52: - -/* Line 1455 of yacc.c */ -#line 1325 "goomsl_yacc.y" - { (yyval.nPtr) = new_div_eq(new_var((yyvsp[(1) - (3)].strValue),currentGoomSL->num_lines),(yyvsp[(3) - (3)].nPtr)); } - break; - - case 53: - -/* Line 1455 of yacc.c */ -#line 1326 "goomsl_yacc.y" - { (yyval.nPtr) = new_static_foreach(new_var((yyvsp[(2) - (6)].strValue), currentGoomSL->num_lines), (yyvsp[(4) - (6)].nPtr), (yyvsp[(6) - (6)].nPtr)); } - break; - - case 54: - -/* Line 1455 of yacc.c */ -#line 1329 "goomsl_yacc.y" - { (yyval.nPtr) = (yyvsp[(2) - (3)].nPtr); } - break; - - case 55: - -/* Line 1455 of yacc.c */ -#line 1331 "goomsl_yacc.y" - { (yyval.nPtr) = new_var_list(new_var((yyvsp[(1) - (1)].strValue),currentGoomSL->num_lines), NULL); } - break; - - case 56: - -/* Line 1455 of yacc.c */ -#line 1332 "goomsl_yacc.y" - { (yyval.nPtr) = new_var_list(new_var((yyvsp[(1) - (2)].strValue),currentGoomSL->num_lines), (yyvsp[(2) - (2)].nPtr)); } - break; - - case 57: - -/* Line 1455 of yacc.c */ -#line 1335 "goomsl_yacc.y" - { (yyval.nPtr) = new_set(new_var((yyvsp[(1) - (3)].strValue),currentGoomSL->num_lines),(yyvsp[(3) - (3)].nPtr)); } - break; - - case 58: - -/* Line 1455 of yacc.c */ -#line 1337 "goomsl_yacc.y" - { (yyval.nPtr) = new_block(lastNode); lastNode = (yyval.nPtr)->unode.opr.op[0]; } - break; - - case 59: - -/* Line 1455 of yacc.c */ -#line 1340 "goomsl_yacc.y" - { (yyval.nPtr) = new_var((yyvsp[(1) - (1)].strValue),currentGoomSL->num_lines); } - break; - - case 60: - -/* Line 1455 of yacc.c */ -#line 1341 "goomsl_yacc.y" - { (yyval.nPtr) = (yyvsp[(1) - (1)].nPtr); } - break; - - case 61: - -/* Line 1455 of yacc.c */ -#line 1342 "goomsl_yacc.y" - { (yyval.nPtr) = new_mul((yyvsp[(1) - (3)].nPtr),(yyvsp[(3) - (3)].nPtr)); } - break; - - case 62: - -/* Line 1455 of yacc.c */ -#line 1343 "goomsl_yacc.y" - { (yyval.nPtr) = new_div((yyvsp[(1) - (3)].nPtr),(yyvsp[(3) - (3)].nPtr)); } - break; - - case 63: - -/* Line 1455 of yacc.c */ -#line 1344 "goomsl_yacc.y" - { (yyval.nPtr) = new_add((yyvsp[(1) - (3)].nPtr),(yyvsp[(3) - (3)].nPtr)); } - break; - - case 64: - -/* Line 1455 of yacc.c */ -#line 1345 "goomsl_yacc.y" - { (yyval.nPtr) = new_sub((yyvsp[(1) - (3)].nPtr),(yyvsp[(3) - (3)].nPtr)); } - break; - - case 65: - -/* Line 1455 of yacc.c */ -#line 1346 "goomsl_yacc.y" - { (yyval.nPtr) = new_neg((yyvsp[(2) - (2)].nPtr)); } - break; - - case 66: - -/* Line 1455 of yacc.c */ -#line 1347 "goomsl_yacc.y" - { (yyval.nPtr) = (yyvsp[(2) - (3)].nPtr); } - break; - - case 67: - -/* Line 1455 of yacc.c */ -#line 1348 "goomsl_yacc.y" - { (yyval.nPtr) = (yyvsp[(1) - (1)].nPtr); } - break; - - case 68: - -/* Line 1455 of yacc.c */ -#line 1351 "goomsl_yacc.y" - { (yyval.nPtr) = new_equ((yyvsp[(1) - (3)].nPtr),(yyvsp[(3) - (3)].nPtr)); } - break; - - case 69: - -/* Line 1455 of yacc.c */ -#line 1352 "goomsl_yacc.y" - { (yyval.nPtr) = new_low((yyvsp[(1) - (3)].nPtr),(yyvsp[(3) - (3)].nPtr)); } - break; - - case 70: - -/* Line 1455 of yacc.c */ -#line 1353 "goomsl_yacc.y" - { (yyval.nPtr) = new_low((yyvsp[(3) - (3)].nPtr),(yyvsp[(1) - (3)].nPtr)); } - break; - - case 71: - -/* Line 1455 of yacc.c */ -#line 1354 "goomsl_yacc.y" - { (yyval.nPtr) = new_not(new_low((yyvsp[(1) - (3)].nPtr),(yyvsp[(3) - (3)].nPtr))); } - break; - - case 72: - -/* Line 1455 of yacc.c */ -#line 1355 "goomsl_yacc.y" - { (yyval.nPtr) = new_not(new_low((yyvsp[(3) - (3)].nPtr),(yyvsp[(1) - (3)].nPtr))); } - break; - - case 73: - -/* Line 1455 of yacc.c */ -#line 1356 "goomsl_yacc.y" - { (yyval.nPtr) = new_not(new_equ((yyvsp[(1) - (3)].nPtr),(yyvsp[(3) - (3)].nPtr))); } - break; - - case 74: - -/* Line 1455 of yacc.c */ -#line 1357 "goomsl_yacc.y" - { (yyval.nPtr) = new_not((yyvsp[(2) - (2)].nPtr)); } - break; - - case 75: - -/* Line 1455 of yacc.c */ -#line 1360 "goomsl_yacc.y" - { (yyval.nPtr) = new_constFloat((yyvsp[(1) - (1)].strValue),currentGoomSL->num_lines); } - break; - - case 76: - -/* Line 1455 of yacc.c */ -#line 1361 "goomsl_yacc.y" - { (yyval.nPtr) = new_constInt((yyvsp[(1) - (1)].strValue),currentGoomSL->num_lines); } - break; - - case 77: - -/* Line 1455 of yacc.c */ -#line 1362 "goomsl_yacc.y" - { (yyval.nPtr) = new_constPtr((yyvsp[(1) - (1)].strValue),currentGoomSL->num_lines); } - break; - - case 78: - -/* Line 1455 of yacc.c */ -#line 1367 "goomsl_yacc.y" - { (yyval.nPtr) = new_call((yyvsp[(1) - (3)].strValue),NULL); } - break; - - case 79: - -/* Line 1455 of yacc.c */ -#line 1368 "goomsl_yacc.y" - { (yyval.nPtr) = new_call((yyvsp[(1) - (5)].strValue),(yyvsp[(3) - (5)].nPtr)); } - break; - - case 80: - -/* Line 1455 of yacc.c */ -#line 1369 "goomsl_yacc.y" - { (yyval.nPtr) = new_call((yyvsp[(2) - (5)].strValue),NULL); } - break; - - case 81: - -/* Line 1455 of yacc.c */ -#line 1370 "goomsl_yacc.y" - { (yyval.nPtr) = new_call((yyvsp[(2) - (7)].strValue),(yyvsp[(4) - (7)].nPtr)); } - break; - - case 82: - -/* Line 1455 of yacc.c */ -#line 1374 "goomsl_yacc.y" - { (yyval.nPtr) = new_call_expr((yyvsp[(2) - (4)].strValue),NULL); } - break; - - case 83: - -/* Line 1455 of yacc.c */ -#line 1375 "goomsl_yacc.y" - { (yyval.nPtr) = new_call_expr((yyvsp[(2) - (6)].strValue),(yyvsp[(4) - (6)].nPtr)); } - break; - - case 84: - -/* Line 1455 of yacc.c */ -#line 1378 "goomsl_yacc.y" - { (yyval.nPtr) = new_affec_list((yyvsp[(1) - (2)].nPtr),(yyvsp[(2) - (2)].nPtr)); } - break; - - case 85: - -/* Line 1455 of yacc.c */ -#line 1379 "goomsl_yacc.y" - { (yyval.nPtr) = new_affec_list((yyvsp[(1) - (1)].nPtr),NULL); } - break; - - case 86: - -/* Line 1455 of yacc.c */ -#line 1381 "goomsl_yacc.y" - { - gsl_reenternamespace((yyvsp[(3) - (4)].namespace)); - (yyval.nPtr) = new_set(new_var((yyvsp[(1) - (4)].strValue),currentGoomSL->num_lines),(yyvsp[(4) - (4)].nPtr)); - } - break; - - case 87: - -/* Line 1455 of yacc.c */ -#line 1385 "goomsl_yacc.y" - { - gsl_reenternamespace((yyvsp[(2) - (3)].namespace)); - (yyval.nPtr) = new_set(new_var("&this", currentGoomSL->num_lines),(yyvsp[(3) - (3)].nPtr)); - } - break; - - - -/* Line 1455 of yacc.c */ -#line 3302 "goomsl_yacc.c" - default: break; - } - YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); - - YYPOPSTACK (yylen); - yylen = 0; - YY_STACK_PRINT (yyss, yyssp); - - *++yyvsp = yyval; - - /* Now `shift' the result of the reduction. Determine what state - that goes to, based on the state we popped back to and the rule - number reduced by. */ - - yyn = yyr1[yyn]; - - yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; - if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) - yystate = yytable[yystate]; - else - yystate = yydefgoto[yyn - YYNTOKENS]; - - goto yynewstate; - - -/*------------------------------------. -| yyerrlab -- here on detecting error | -`------------------------------------*/ -yyerrlab: - /* If not already recovering from an error, report this error. */ - if (!yyerrstatus) - { - ++yynerrs; -#if ! YYERROR_VERBOSE - yyerror (YY_("syntax error")); -#else - { - YYSIZE_T yysize = yysyntax_error (0, yystate, yychar); - if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM) - { - YYSIZE_T yyalloc = 2 * yysize; - if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM)) - yyalloc = YYSTACK_ALLOC_MAXIMUM; - if (yymsg != yymsgbuf) - YYSTACK_FREE (yymsg); - yymsg = (char *) YYSTACK_ALLOC (yyalloc); - if (yymsg) - yymsg_alloc = yyalloc; - else - { - yymsg = yymsgbuf; - yymsg_alloc = sizeof yymsgbuf; - } - } - - if (0 < yysize && yysize <= yymsg_alloc) - { - (void) yysyntax_error (yymsg, yystate, yychar); - yyerror (yymsg); - } - else - { - yyerror (YY_("syntax error")); - if (yysize != 0) - goto yyexhaustedlab; - } - } -#endif - } - - - - if (yyerrstatus == 3) - { - /* If just tried and failed to reuse lookahead token after an - error, discard it. */ - - if (yychar <= YYEOF) - { - /* Return failure if at end of input. */ - if (yychar == YYEOF) - YYABORT; - } - else - { - yydestruct ("Error: discarding", - yytoken, &yylval); - yychar = YYEMPTY; - } - } - - /* Else will try to reuse lookahead token after shifting the error - token. */ - goto yyerrlab1; - - -/*---------------------------------------------------. -| yyerrorlab -- error raised explicitly by YYERROR. | -`---------------------------------------------------*/ -yyerrorlab: - - /* Pacify compilers like GCC when the user code never invokes - YYERROR and the label yyerrorlab therefore never appears in user - code. */ - if (/*CONSTCOND*/ 0) - goto yyerrorlab; - - /* Do not reclaim the symbols of the rule which action triggered - this YYERROR. */ - YYPOPSTACK (yylen); - yylen = 0; - YY_STACK_PRINT (yyss, yyssp); - yystate = *yyssp; - goto yyerrlab1; - - -/*-------------------------------------------------------------. -| yyerrlab1 -- common code for both syntax error and YYERROR. | -`-------------------------------------------------------------*/ -yyerrlab1: - yyerrstatus = 3; /* Each real token shifted decrements this. */ - - for (;;) - { - yyn = yypact[yystate]; - if (yyn != YYPACT_NINF) - { - yyn += YYTERROR; - if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) - { - yyn = yytable[yyn]; - if (0 < yyn) - break; - } - } - - /* Pop the current state because it cannot handle the error token. */ - if (yyssp == yyss) - YYABORT; - - - yydestruct ("Error: popping", - yystos[yystate], yyvsp); - YYPOPSTACK (1); - yystate = *yyssp; - YY_STACK_PRINT (yyss, yyssp); - } - - *++yyvsp = yylval; - - - /* Shift the error token. */ - YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); - - yystate = yyn; - goto yynewstate; - - -/*-------------------------------------. -| yyacceptlab -- YYACCEPT comes here. | -`-------------------------------------*/ -yyacceptlab: - yyresult = 0; - goto yyreturn; - -/*-----------------------------------. -| yyabortlab -- YYABORT comes here. | -`-----------------------------------*/ -yyabortlab: - yyresult = 1; - goto yyreturn; - -#if !defined(yyoverflow) || YYERROR_VERBOSE -/*-------------------------------------------------. -| yyexhaustedlab -- memory exhaustion comes here. | -`-------------------------------------------------*/ -yyexhaustedlab: - yyerror (YY_("memory exhausted")); - yyresult = 2; - /* Fall through. */ -#endif - -yyreturn: - if (yychar != YYEMPTY) - yydestruct ("Cleanup: discarding lookahead", - yytoken, &yylval); - /* Do not reclaim the symbols of the rule which action triggered - this YYABORT or YYACCEPT. */ - YYPOPSTACK (yylen); - YY_STACK_PRINT (yyss, yyssp); - while (yyssp != yyss) - { - yydestruct ("Cleanup: popping", - yystos[*yyssp], yyvsp); - YYPOPSTACK (1); - } -#ifndef yyoverflow - if (yyss != yyssa) - YYSTACK_FREE (yyss); -#endif -#if YYERROR_VERBOSE - if (yymsg != yymsgbuf) - YYSTACK_FREE (yymsg); -#endif - /* Make sure YYID is used. */ - return YYID (yyresult); -} - - - -/* Line 1675 of yacc.c */ -#line 1397 "goomsl_yacc.y" - - - -void yyerror(char *str) -{ /* {{{ */ - fprintf(stderr, "ERROR: Line %d, %s\n", currentGoomSL->num_lines, str); - currentGoomSL->compilationOK = 0; - exit(1); -} /* }}} */ - - diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/goomsl_yacc.h kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/goomsl_yacc.h --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/goomsl_yacc.h 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/goomsl_yacc.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,121 +0,0 @@ - -/* A Bison parser, made by GNU Bison 2.4.1. */ - -/* Skeleton interface for Bison's Yacc-like parsers in C - - Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 - Free Software Foundation, Inc. - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . */ - -/* As a special exception, you may create a larger work that contains - part or all of the Bison parser skeleton and distribute that work - under terms of your choice, so long as that work isn't itself a - parser generator using the skeleton or a modified version thereof - as a parser skeleton. Alternatively, if you modify or redistribute - the parser skeleton itself, you may (at your option) remove this - special exception, which will cause the skeleton and the resulting - Bison output files to be licensed under the GNU General Public - License without this special exception. - - This special exception was added by the Free Software Foundation in - version 2.2 of Bison. */ - - -/* Tokens. */ -#ifndef YYTOKENTYPE -# define YYTOKENTYPE - /* Put the tokens into the symbol table, so that GDB and other debuggers - know about them. */ - enum yytokentype { - LTYPE_INTEGER = 258, - LTYPE_FLOAT = 259, - LTYPE_VAR = 260, - LTYPE_PTR = 261, - PTR_TK = 262, - INT_TK = 263, - FLOAT_TK = 264, - DECLARE = 265, - EXTERNAL = 266, - WHILE = 267, - DO = 268, - NOT = 269, - PLUS_EQ = 270, - SUB_EQ = 271, - DIV_EQ = 272, - MUL_EQ = 273, - SUP_EQ = 274, - LOW_EQ = 275, - NOT_EQ = 276, - STRUCT = 277, - FOR = 278, - IN = 279 - }; -#endif -/* Tokens. */ -#define LTYPE_INTEGER 258 -#define LTYPE_FLOAT 259 -#define LTYPE_VAR 260 -#define LTYPE_PTR 261 -#define PTR_TK 262 -#define INT_TK 263 -#define FLOAT_TK 264 -#define DECLARE 265 -#define EXTERNAL 266 -#define WHILE 267 -#define DO 268 -#define NOT 269 -#define PLUS_EQ 270 -#define SUB_EQ 271 -#define DIV_EQ 272 -#define MUL_EQ 273 -#define SUP_EQ 274 -#define LOW_EQ 275 -#define NOT_EQ 276 -#define STRUCT 277 -#define FOR 278 -#define IN 279 - - - - -#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED -typedef union YYSTYPE -{ - -/* Line 1676 of yacc.c */ -#line 1200 "goomsl_yacc.y" - - int intValue; - float floatValue; - char charValue; - char strValue[2048]; - NodeType *nPtr; - GoomHash *namespace; - GSL_Struct *gsl_struct; - GSL_StructField *gsl_struct_field; - - - -/* Line 1676 of yacc.c */ -#line 113 "goomsl_yacc.h" -} YYSTYPE; -# define YYSTYPE_IS_TRIVIAL 1 -# define yystype YYSTYPE /* obsolescent; will be withdrawn */ -# define YYSTYPE_IS_DECLARED 1 -#endif - -extern YYSTYPE yylval; - - diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/goomsl_yacc.y kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/goomsl_yacc.y --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/goomsl_yacc.y 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/goomsl_yacc.y 1970-01-01 00:00:00.000000000 +0000 @@ -1,1406 +0,0 @@ -/** - * copyright 2004, Jean-Christophe Hoelt - * - * This program is released under the terms of the GNU Lesser General Public Licence. - */ -%{ - #include - #include - #include - #include "goomsl.h" - #include "goomsl_private.h" - #include "goomsl_yacc.h" - -#define STRUCT_ALIGNMENT 16 -/* #define VERBOSE */ - - int yylex(void); - void yyerror(char *); - extern GoomSL *currentGoomSL; - - static NodeType *nodeNew(const char *str, int type, int line_number); - static NodeType *nodeClone(NodeType *node); - static void nodeFreeInternals(NodeType *node); - static void nodeFree(NodeType *node); - - static void commit_node(NodeType *node, int releaseIfTemp); - static void precommit_node(NodeType *node); - - static NodeType *new_constInt(const char *str, int line_number); - static NodeType *new_constFloat(const char *str, int line_number); - static NodeType *new_constPtr(const char *str, int line_number); - static NodeType *new_var(const char *str, int line_number); - static NodeType *new_nop(const char *str); - static NodeType *new_op(const char *str, int type, int nbOp); - - static int allocateLabel(); - static int allocateTemp(); - static void releaseTemp(int n); - static void releaseAllTemps(); - - static int is_tmp_expr(NodeType *node) { - if (node->str) { - return (!strncmp(node->str,"_i_tmp_",7)) - || (!strncmp(node->str,"_f_tmp_",7)) - || (!strncmp(node->str,"_p_tmp",7)); - } - return 0; - } - /* pre: is_tmp_expr(node); */ - static int get_tmp_id(NodeType *node) { return atoi((node->str)+5); } - - static int is_commutative_expr(int itype) - { /* {{{ */ - return (itype == INSTR_ADD) - || (itype == INSTR_MUL) - || (itype == INSTR_ISEQUAL); - } /* }}} */ - - static void GSL_PUT_LABEL(char *name, int line_number) - { /* {{{ */ -#ifdef VERBOSE - printf("label %s\n", name); -#endif - currentGoomSL->instr = gsl_instr_init(currentGoomSL, "label", INSTR_LABEL, 1, line_number); - gsl_instr_add_param(currentGoomSL->instr, name, TYPE_LABEL); - } /* }}} */ - static void GSL_PUT_JUMP(char *name, int line_number) - { /* {{{ */ -#ifdef VERBOSE - printf("jump %s\n", name); -#endif - currentGoomSL->instr = gsl_instr_init(currentGoomSL, "jump", INSTR_JUMP, 1, line_number); - gsl_instr_add_param(currentGoomSL->instr, name, TYPE_LABEL); - } /* }}} */ - - static void GSL_PUT_JXXX(char *name, char *iname, int instr_id, int line_number) - { /* {{{ */ -#ifdef VERBOSE - printf("%s %s\n", iname, name); -#endif - currentGoomSL->instr = gsl_instr_init(currentGoomSL, iname, instr_id, 1, line_number); - gsl_instr_add_param(currentGoomSL->instr, name, TYPE_LABEL); - } /* }}} */ - static void GSL_PUT_JZERO(char *name,int line_number) - { /* {{{ */ - GSL_PUT_JXXX(name,"jzero.i",INSTR_JZERO,line_number); - } /* }}} */ - static void GSL_PUT_JNZERO(char *name, int line_number) - { /* {{{ */ - GSL_PUT_JXXX(name,"jnzero.i",INSTR_JNZERO,line_number); - } /* }}} */ - - /* Structures Management */ - -#define ALIGN_ADDR(_addr,_align) {\ - if (_align>1) {\ - int _dec = (_addr%_align);\ - if (_dec != 0) _addr += _align - _dec;\ - }} - - /* */ - void gsl_prepare_struct(GSL_Struct *s, int s_align, int i_align, int f_align) - { - int i; - int consumed = 0; - int iblk=0, fblk=0; - - s->iBlock[0].size = 0; - s->iBlock[0].data = 0; - s->fBlock[0].size = 0; - s->fBlock[0].data = 0; - - /* Prepare sub-struct and calculate space needed for their storage */ - for (i = 0; i < s->nbFields; ++i) - { - if (s->fields[i]->type < FIRST_RESERVED) - { - int j=0; - GSL_Struct *substruct = currentGoomSL->gsl_struct[s->fields[i]->type]; - consumed += sizeof(int); /* stocke le prefix */ - ALIGN_ADDR(consumed, s_align); - s->fields[i]->offsetInStruct = consumed; - gsl_prepare_struct(substruct, s_align, i_align, f_align); - for(j=0;substruct->iBlock[j].size>0;++j) { - s->iBlock[iblk].data = consumed + substruct->iBlock[j].data; - s->iBlock[iblk].size = substruct->iBlock[j].size; - iblk++; - } - for(j=0;substruct->fBlock[j].size>0;++j) { - s->fBlock[fblk].data = consumed + substruct->fBlock[j].data; - s->fBlock[fblk].size = substruct->fBlock[j].size; - fblk++; - } - consumed += substruct->size; - } - } - - /* Then prepare integers */ - ALIGN_ADDR(consumed, i_align); - for (i = 0; i < s->nbFields; ++i) - { - if (s->fields[i]->type == INSTR_INT) - { - if (s->iBlock[iblk].size == 0) { - s->iBlock[iblk].size = 1; - s->iBlock[iblk].data = consumed; - } else { - s->iBlock[iblk].size += 1; - } - s->fields[i]->offsetInStruct = consumed; - consumed += sizeof(int); - } - } - - iblk++; - s->iBlock[iblk].size = 0; - s->iBlock[iblk].data = 0; - - /* Then prepare floats */ - ALIGN_ADDR(consumed, f_align); - for (i = 0; i < s->nbFields; ++i) - { - if (s->fields[i]->type == INSTR_FLOAT) - { - if (s->fBlock[fblk].size == 0) { - s->fBlock[fblk].size = 1; - s->fBlock[fblk].data = consumed; - } else { - s->fBlock[fblk].size += 1; - } - s->fields[i]->offsetInStruct = consumed; - consumed += sizeof(int); - } - } - - fblk++; - s->fBlock[fblk].size = 0; - s->fBlock[fblk].data = 0; - - /* Finally prepare pointers */ - ALIGN_ADDR(consumed, i_align); - for (i = 0; i < s->nbFields; ++i) - { - if (s->fields[i]->type == INSTR_PTR) - { - s->fields[i]->offsetInStruct = consumed; - consumed += sizeof(int); - } - } - s->size = consumed; - } - - /* Returns the ID of a struct from its name */ - int gsl_get_struct_id(const char *name) /* {{{ */ - { - HashValue *ret = goom_hash_get(currentGoomSL->structIDS, name); - if (ret != NULL) return ret->i; - return -1; - } /* }}} */ - - /* Adds the definition of a struct */ - void gsl_add_struct(const char *name, GSL_Struct *gsl_struct) /* {{{ */ - { - /* Prepare the struct: ie calculate internal storage format */ - gsl_prepare_struct(gsl_struct, STRUCT_ALIGNMENT, STRUCT_ALIGNMENT, STRUCT_ALIGNMENT); - - /* If the struct does not already exists */ - if (gsl_get_struct_id(name) < 0) - { - /* adds it */ - int id = currentGoomSL->nbStructID++; - goom_hash_put_int(currentGoomSL->structIDS, name, id); - if (currentGoomSL->gsl_struct_size <= id) { - currentGoomSL->gsl_struct_size *= 2; - currentGoomSL->gsl_struct = (GSL_Struct**)realloc(currentGoomSL->gsl_struct, - sizeof(GSL_Struct*) * currentGoomSL->gsl_struct_size); - } - currentGoomSL->gsl_struct[id] = gsl_struct; - } - } /* }}} */ - - /* Creates a field for a struct */ - GSL_StructField *gsl_new_struct_field(const char *name, int type) - { - GSL_StructField *field = (GSL_StructField*)malloc(sizeof(GSL_StructField)); - strcpy(field->name, name); - field->type = type; - return field; - } - - /* Create as field for a struct which will be a struct itself */ - GSL_StructField *gsl_new_struct_field_struct(const char *name, const char *type) - { - GSL_StructField *field = gsl_new_struct_field(name, gsl_get_struct_id(type)); - if (field->type < 0) { - fprintf(stderr, "ERROR: Line %d, Unknown structure: '%s'\n", - currentGoomSL->num_lines, type); - exit(1); - } - return field; - } - - /* Creates a Struct */ - GSL_Struct *gsl_new_struct(GSL_StructField *field) - { - GSL_Struct *s = (GSL_Struct*)malloc(sizeof(GSL_Struct)); - s->nbFields = 1; - s->fields[0] = field; - return s; - } - - /* Adds a field to a struct */ - void gsl_add_struct_field(GSL_Struct *s, GSL_StructField *field) - { - s->fields[s->nbFields++] = field; - } - - int gsl_type_of_var(GoomHash *ns, const char *name) - { - char type_of[256]; - HashValue *hv; - sprintf(type_of, "__type_of_%s", name); - hv = goom_hash_get(ns, type_of); - if (hv != NULL) - return hv->i; - fprintf(stderr, "ERROR: Unknown variable type: '%s'\n", name); - return -1; - } - - static void gsl_declare_var(GoomHash *ns, const char *name, int type, void *space) - { - char type_of[256]; - if (name[0] == '@') { ns = currentGoomSL->vars; } - - if (space == NULL) { - switch (type) { - case INSTR_INT: - case INSTR_FLOAT: - case INSTR_PTR: - space = goom_heap_malloc_with_alignment(currentGoomSL->data_heap, - sizeof(int), sizeof(int)); - break; - case -1: - fprintf(stderr, "What the fuck!\n"); - exit(1); - default: /* On a un struct_id */ - space = goom_heap_malloc_with_alignment_prefixed(currentGoomSL->data_heap, - currentGoomSL->gsl_struct[type]->size, STRUCT_ALIGNMENT, sizeof(int)); - } - } - goom_hash_put_ptr(ns, name, (void*)space); - sprintf(type_of, "__type_of_%s", name); - goom_hash_put_int(ns, type_of, type); - - /* Ensuite le hack: on ajoute les champs en tant que variables. */ - if (type < FIRST_RESERVED) - { - int i; - GSL_Struct *gsl_struct = currentGoomSL->gsl_struct[type]; - ((int*)space)[-1] = type; /* stockage du type dans le prefixe de structure */ - for (i = 0; i < gsl_struct->nbFields; ++i) - { - char full_name[256]; - char *cspace = (char*)space + gsl_struct->fields[i]->offsetInStruct; - sprintf(full_name, "%s.%s", name, gsl_struct->fields[i]->name); - gsl_declare_var(ns, full_name, gsl_struct->fields[i]->type, cspace); - } - } - } - - /* Declare a variable which will be a struct */ - static void gsl_struct_decl(GoomHash *namespace, const char *struct_name, const char *name) - { - int struct_id = gsl_get_struct_id(struct_name); - gsl_declare_var(namespace, name, struct_id, NULL); - } - - static void gsl_float_decl_global(const char *name) - { - gsl_declare_var(currentGoomSL->vars, name, INSTR_FLOAT, NULL); - } - static void gsl_int_decl_global(const char *name) - { - gsl_declare_var(currentGoomSL->vars, name, INSTR_INT, NULL); - } - static void gsl_ptr_decl_global(const char *name) - { - gsl_declare_var(currentGoomSL->vars, name, INSTR_PTR, NULL); - } - static void gsl_struct_decl_global_from_id(const char *name, int id) - { - gsl_declare_var(currentGoomSL->vars, name, id, NULL); - } - - /* FLOAT */ - static void gsl_float_decl_local(const char *name) - { - gsl_declare_var(currentGoomSL->namespaces[currentGoomSL->currentNS], name, INSTR_FLOAT, NULL); - } - /* INT */ - static void gsl_int_decl_local(const char *name) - { - gsl_declare_var(currentGoomSL->namespaces[currentGoomSL->currentNS], name, INSTR_INT, NULL); - } - /* PTR */ - static void gsl_ptr_decl_local(const char *name) - { - gsl_declare_var(currentGoomSL->namespaces[currentGoomSL->currentNS], name, INSTR_PTR, NULL); - } - /* STRUCT */ - static void gsl_struct_decl_local(const char *struct_name, const char *name) - { - gsl_struct_decl(currentGoomSL->namespaces[currentGoomSL->currentNS],struct_name,name); - } - - - static void commit_test2(NodeType *set,const char *type, int instr); - static NodeType *new_call(const char *name, NodeType *affect_list); - - /* SETTER */ - static NodeType *new_set(NodeType *lvalue, NodeType *expression) - { /* {{{ */ - NodeType *set = new_op("set", OPR_SET, 2); - set->unode.opr.op[0] = lvalue; - set->unode.opr.op[1] = expression; - return set; - } /* }}} */ - static void commit_set(NodeType *set) - { /* {{{ */ - commit_test2(set,"set",INSTR_SET); - } /* }}} */ - - /* PLUS_EQ */ - static NodeType *new_plus_eq(NodeType *lvalue, NodeType *expression) /* {{{ */ - { - NodeType *set = new_op("plus_eq", OPR_PLUS_EQ, 2); - set->unode.opr.op[0] = lvalue; - set->unode.opr.op[1] = expression; - return set; - } - static void commit_plus_eq(NodeType *set) - { - precommit_node(set->unode.opr.op[1]); -#ifdef VERBOSE - printf("add %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str); -#endif - currentGoomSL->instr = gsl_instr_init(currentGoomSL, "add", INSTR_ADD, 2, set->line_number); - commit_node(set->unode.opr.op[0],0); - commit_node(set->unode.opr.op[1],1); - } /* }}} */ - - /* SUB_EQ */ - static NodeType *new_sub_eq(NodeType *lvalue, NodeType *expression) /* {{{ */ - { - NodeType *set = new_op("sub_eq", OPR_SUB_EQ, 2); - set->unode.opr.op[0] = lvalue; - set->unode.opr.op[1] = expression; - return set; - } - static void commit_sub_eq(NodeType *set) - { - precommit_node(set->unode.opr.op[1]); -#ifdef VERBOSE - printf("sub %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str); -#endif - currentGoomSL->instr = gsl_instr_init(currentGoomSL, "sub", INSTR_SUB, 2, set->line_number); - commit_node(set->unode.opr.op[0],0); - commit_node(set->unode.opr.op[1],1); - } /* }}} */ - - /* MUL_EQ */ - static NodeType *new_mul_eq(NodeType *lvalue, NodeType *expression) /* {{{ */ - { - NodeType *set = new_op("mul_eq", OPR_MUL_EQ, 2); - set->unode.opr.op[0] = lvalue; - set->unode.opr.op[1] = expression; - return set; - } - static void commit_mul_eq(NodeType *set) - { - precommit_node(set->unode.opr.op[1]); -#ifdef VERBOSE - printf("mul %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str); -#endif - currentGoomSL->instr = gsl_instr_init(currentGoomSL, "mul", INSTR_MUL, 2, set->line_number); - commit_node(set->unode.opr.op[0],0); - commit_node(set->unode.opr.op[1],1); - } /* }}} */ - - /* DIV_EQ */ - static NodeType *new_div_eq(NodeType *lvalue, NodeType *expression) /* {{{ */ - { - NodeType *set = new_op("div_eq", OPR_DIV_EQ, 2); - set->unode.opr.op[0] = lvalue; - set->unode.opr.op[1] = expression; - return set; - } - static void commit_div_eq(NodeType *set) - { - precommit_node(set->unode.opr.op[1]); -#ifdef VERBOSE - printf("div %s %s\n", set->unode.opr.op[0]->str, set->unode.opr.op[1]->str); -#endif - currentGoomSL->instr = gsl_instr_init(currentGoomSL, "div", INSTR_DIV, 2, set->line_number); - commit_node(set->unode.opr.op[0],0); - commit_node(set->unode.opr.op[1],1); - } /* }}} */ - - /* commodity method for add, mult, ... */ - - static void precommit_expr(NodeType *expr, const char *type, int instr_id) - { /* {{{ */ - NodeType *tmp, *tmpcpy; - int toAdd; - - /* compute "left" and "right" */ - switch (expr->unode.opr.nbOp) { - case 2: - precommit_node(expr->unode.opr.op[1]); - case 1: - precommit_node(expr->unode.opr.op[0]); - } - - if (is_tmp_expr(expr->unode.opr.op[0])) { - tmp = expr->unode.opr.op[0]; - toAdd = 1; - } - else if (is_commutative_expr(instr_id) && (expr->unode.opr.nbOp==2) && is_tmp_expr(expr->unode.opr.op[1])) { - tmp = expr->unode.opr.op[1]; - toAdd = 0; - } - else { - char stmp[256]; - /* declare a temporary variable to store the result */ - if (expr->unode.opr.op[0]->type == CONST_INT_NODE) { - sprintf(stmp,"_i_tmp_%i",allocateTemp()); - gsl_int_decl_global(stmp); - } - else if (expr->unode.opr.op[0]->type == CONST_FLOAT_NODE) { - sprintf(stmp,"_f_tmp%i",allocateTemp()); - gsl_float_decl_global(stmp); - } - else if (expr->unode.opr.op[0]->type == CONST_PTR_NODE) { - sprintf(stmp,"_p_tmp%i",allocateTemp()); - gsl_ptr_decl_global(stmp); - } - else { - int type = gsl_type_of_var(expr->unode.opr.op[0]->vnamespace, expr->unode.opr.op[0]->str); - if (type == INSTR_FLOAT) { - sprintf(stmp,"_f_tmp_%i",allocateTemp()); - gsl_float_decl_global(stmp); - } - else if (type == INSTR_PTR) { - sprintf(stmp,"_p_tmp_%i",allocateTemp()); - gsl_ptr_decl_global(stmp); - } - else if (type == INSTR_INT) { - sprintf(stmp,"_i_tmp_%i",allocateTemp()); - gsl_int_decl_global(stmp); - } - else if (type == -1) { - fprintf(stderr, "ERROR: Line %d, Could not find variable '%s'\n", - expr->line_number, expr->unode.opr.op[0]->str); - exit(1); - } - else { /* type is a struct_id */ - sprintf(stmp,"_s_tmp_%i",allocateTemp()); - gsl_struct_decl_global_from_id(stmp,type); - } - } - tmp = new_var(stmp,expr->line_number); - - /* set the tmp to the value of "op1" */ - tmpcpy = nodeClone(tmp); - commit_node(new_set(tmp,expr->unode.opr.op[0]),0); - toAdd = 1; - - tmp = tmpcpy; - } - - /* add op2 to tmp */ -#ifdef VERBOSE - if (expr->unode.opr.nbOp == 2) - printf("%s %s %s\n", type, tmp->str, expr->unode.opr.op[toAdd]->str); - else - printf("%s %s\n", type, tmp->str); -#endif - currentGoomSL->instr = gsl_instr_init(currentGoomSL, type, instr_id, expr->unode.opr.nbOp, expr->line_number); - tmpcpy = nodeClone(tmp); - commit_node(tmp,0); - if (expr->unode.opr.nbOp == 2) { - commit_node(expr->unode.opr.op[toAdd],1); - } - - /* redefine the ADD node now as the computed variable */ - nodeFreeInternals(expr); - *expr = *tmpcpy; - free(tmpcpy); - } /* }}} */ - - static NodeType *new_expr1(const char *name, int id, NodeType *expr1) - { /* {{{ */ - NodeType *add = new_op(name, id, 1); - add->unode.opr.op[0] = expr1; - return add; - } /* }}} */ - - static NodeType *new_expr2(const char *name, int id, NodeType *expr1, NodeType *expr2) - { /* {{{ */ - NodeType *add = new_op(name, id, 2); - add->unode.opr.op[0] = expr1; - add->unode.opr.op[1] = expr2; - return add; - } /* }}} */ - - /* ADD */ - static NodeType *new_add(NodeType *expr1, NodeType *expr2) { /* {{{ */ - return new_expr2("add", OPR_ADD, expr1, expr2); - } - static void precommit_add(NodeType *add) { - precommit_expr(add,"add",INSTR_ADD); - } /* }}} */ - - /* SUB */ - static NodeType *new_sub(NodeType *expr1, NodeType *expr2) { /* {{{ */ - return new_expr2("sub", OPR_SUB, expr1, expr2); - } - static void precommit_sub(NodeType *sub) { - precommit_expr(sub,"sub",INSTR_SUB); - } /* }}} */ - - /* NEG */ - static NodeType *new_neg(NodeType *expr) { /* {{{ */ - NodeType *zeroConst = NULL; - if (expr->type == CONST_INT_NODE) - zeroConst = new_constInt("0", currentGoomSL->num_lines); - else if (expr->type == CONST_FLOAT_NODE) - zeroConst = new_constFloat("0.0", currentGoomSL->num_lines); - else if (expr->type == CONST_PTR_NODE) { - fprintf(stderr, "ERROR: Line %d, Could not negate const pointer.\n", - currentGoomSL->num_lines); - exit(1); - } - else { - int type = gsl_type_of_var(expr->vnamespace, expr->str); - if (type == INSTR_FLOAT) - zeroConst = new_constFloat("0.0", currentGoomSL->num_lines); - else if (type == INSTR_PTR) { - fprintf(stderr, "ERROR: Line %d, Could not negate pointer.\n", - currentGoomSL->num_lines); - exit(1); - } - else if (type == INSTR_INT) - zeroConst = new_constInt("0", currentGoomSL->num_lines); - else if (type == -1) { - fprintf(stderr, "ERROR: Line %d, Could not find variable '%s'\n", - expr->line_number, expr->unode.opr.op[0]->str); - exit(1); - } - else { /* type is a struct_id */ - fprintf(stderr, "ERROR: Line %d, Could not negate struct '%s'\n", - expr->line_number, expr->str); - exit(1); - } - } - return new_expr2("sub", OPR_SUB, zeroConst, expr); - } - /* }}} */ - - /* MUL */ - static NodeType *new_mul(NodeType *expr1, NodeType *expr2) { /* {{{ */ - return new_expr2("mul", OPR_MUL, expr1, expr2); - } - static void precommit_mul(NodeType *mul) { - precommit_expr(mul,"mul",INSTR_MUL); - } /* }}} */ - - /* DIV */ - static NodeType *new_div(NodeType *expr1, NodeType *expr2) { /* {{{ */ - return new_expr2("div", OPR_DIV, expr1, expr2); - } - static void precommit_div(NodeType *mul) { - precommit_expr(mul,"div",INSTR_DIV); - } /* }}} */ - - /* CALL EXPRESSION */ - static NodeType *new_call_expr(const char *name, NodeType *affect_list) { /* {{{ */ - NodeType *call = new_call(name,affect_list); - NodeType *node = new_expr1(name, OPR_CALL_EXPR, call); - node->vnamespace = gsl_find_namespace(name); - if (node->vnamespace == NULL) - fprintf(stderr, "ERROR: Line %d, No return type for: '%s'\n", currentGoomSL->num_lines, name); - return node; - } - static void precommit_call_expr(NodeType *call) { - char stmp[256]; - NodeType *tmp,*tmpcpy; - int type = gsl_type_of_var(call->vnamespace, call->str); - if (type == INSTR_FLOAT) { - sprintf(stmp,"_f_tmp_%i",allocateTemp()); - gsl_float_decl_global(stmp); - } - else if (type == INSTR_PTR) { - sprintf(stmp,"_p_tmp_%i",allocateTemp()); - gsl_ptr_decl_global(stmp); - } - else if (type == INSTR_INT) { - sprintf(stmp,"_i_tmp_%i",allocateTemp()); - gsl_int_decl_global(stmp); - } - else if (type == -1) { - fprintf(stderr, "ERROR: Line %d, Could not find variable '%s'\n", - call->line_number, call->str); - exit(1); - } - else { /* type is a struct_id */ - sprintf(stmp,"_s_tmp_%i",allocateTemp()); - gsl_struct_decl_global_from_id(stmp,type); - } - tmp = new_var(stmp,call->line_number); - commit_node(call->unode.opr.op[0],0); - tmpcpy = nodeClone(tmp); - commit_node(new_set(tmp,new_var(call->str,call->line_number)),0); - - nodeFreeInternals(call); - *call = *tmpcpy; - free(tmpcpy); - } /* }}} */ - - static void commit_test2(NodeType *set,const char *type, int instr) - { /* {{{ */ - NodeType *tmp; - char stmp[256]; - precommit_node(set->unode.opr.op[0]); - precommit_node(set->unode.opr.op[1]); - tmp = set->unode.opr.op[0]; - - stmp[0] = 0; - if (set->unode.opr.op[0]->type == CONST_INT_NODE) { - sprintf(stmp,"_i_tmp_%i",allocateTemp()); - gsl_int_decl_global(stmp); - } - else if (set->unode.opr.op[0]->type == CONST_FLOAT_NODE) { - sprintf(stmp,"_f_tmp%i",allocateTemp()); - gsl_float_decl_global(stmp); - } - else if (set->unode.opr.op[0]->type == CONST_PTR_NODE) { - sprintf(stmp,"_p_tmp%i",allocateTemp()); - gsl_ptr_decl_global(stmp); - } - if (stmp[0]) { - NodeType *tmpcpy; - tmp = new_var(stmp, set->line_number); - tmpcpy = nodeClone(tmp); - commit_node(new_set(tmp,set->unode.opr.op[0]),0); - tmp = tmpcpy; - } - -#ifdef VERBOSE - printf("%s %s %s\n", type, tmp->str, set->unode.opr.op[1]->str); -#endif - currentGoomSL->instr = gsl_instr_init(currentGoomSL, type, instr, 2, set->line_number); - commit_node(tmp,instr!=INSTR_SET); - commit_node(set->unode.opr.op[1],1); - } /* }}} */ - - /* NOT */ - static NodeType *new_not(NodeType *expr1) { /* {{{ */ - return new_expr1("not", OPR_NOT, expr1); - } - static void commit_not(NodeType *set) - { - commit_node(set->unode.opr.op[0],0); -#ifdef VERBOSE - printf("not\n"); -#endif - currentGoomSL->instr = gsl_instr_init(currentGoomSL, "not", INSTR_NOT, 1, set->line_number); - gsl_instr_add_param(currentGoomSL->instr, "|dummy|", TYPE_LABEL); - } /* }}} */ - - /* EQU */ - static NodeType *new_equ(NodeType *expr1, NodeType *expr2) { /* {{{ */ - return new_expr2("isequal", OPR_EQU, expr1, expr2); - } - static void commit_equ(NodeType *mul) { - commit_test2(mul,"isequal",INSTR_ISEQUAL); - } /* }}} */ - - /* INF */ - static NodeType *new_low(NodeType *expr1, NodeType *expr2) { /* {{{ */ - return new_expr2("islower", OPR_LOW, expr1, expr2); - } - static void commit_low(NodeType *mul) { - commit_test2(mul,"islower",INSTR_ISLOWER); - } /* }}} */ - - /* WHILE */ - static NodeType *new_while(NodeType *expression, NodeType *instr) { /* {{{ */ - NodeType *node = new_op("while", OPR_WHILE, 2); - node->unode.opr.op[0] = expression; - node->unode.opr.op[1] = instr; - return node; - } - - static void commit_while(NodeType *node) - { - int lbl = allocateLabel(); - char start_while[1024], test_while[1024]; - sprintf(start_while, "|start_while_%d|", lbl); - sprintf(test_while, "|test_while_%d|", lbl); - - GSL_PUT_JUMP(test_while,node->line_number); - GSL_PUT_LABEL(start_while,node->line_number); - - /* code */ - commit_node(node->unode.opr.op[1],0); - - GSL_PUT_LABEL(test_while,node->line_number); - commit_node(node->unode.opr.op[0],0); - GSL_PUT_JNZERO(start_while,node->line_number); - } /* }}} */ - - /* FOR EACH */ - static NodeType *new_static_foreach(NodeType *var, NodeType *var_list, NodeType *instr) { /* {{{ */ - NodeType *node = new_op("for", OPR_FOREACH, 3); - node->unode.opr.op[0] = var; - node->unode.opr.op[1] = var_list; - node->unode.opr.op[2] = instr; - node->line_number = currentGoomSL->num_lines; - return node; - } - static void commit_foreach(NodeType *node) - { - NodeType *cur = node->unode.opr.op[1]; - char tmp_func[256], tmp_loop[256]; - int lbl = allocateLabel(); - sprintf(tmp_func, "|foreach_func_%d|", lbl); - sprintf(tmp_loop, "|foreach_loop_%d|", lbl); - - GSL_PUT_JUMP(tmp_loop, node->line_number); - GSL_PUT_LABEL(tmp_func, node->line_number); - - precommit_node(node->unode.opr.op[2]); - commit_node(node->unode.opr.op[2], 0); - - currentGoomSL->instr = gsl_instr_init(currentGoomSL, "ret", INSTR_RET, 1, node->line_number); - gsl_instr_add_param(currentGoomSL->instr, "|dummy|", TYPE_LABEL); -#ifdef VERBOSE - printf("ret\n"); -#endif - - GSL_PUT_LABEL(tmp_loop, node->line_number); - - while (cur != NULL) - { - NodeType *x, *var; - - /* 1: x=var */ - x = nodeClone(node->unode.opr.op[0]); - var = nodeClone(cur->unode.opr.op[0]); - commit_node(new_set(x, var),0); - - /* 2: instr */ - currentGoomSL->instr = gsl_instr_init(currentGoomSL, "call", INSTR_CALL, 1, node->line_number); - gsl_instr_add_param(currentGoomSL->instr, tmp_func, TYPE_LABEL); -#ifdef VERBOSE - printf("call %s\n", tmp_func); -#endif - - /* 3: var=x */ - x = nodeClone(node->unode.opr.op[0]); - var = cur->unode.opr.op[0]; - commit_node(new_set(var, x),0); - cur = cur->unode.opr.op[1]; - } - nodeFree(node->unode.opr.op[0]); - } /* }}} */ - - /* IF */ - static NodeType *new_if(NodeType *expression, NodeType *instr) { /* {{{ */ - NodeType *node = new_op("if", OPR_IF, 2); - node->unode.opr.op[0] = expression; - node->unode.opr.op[1] = instr; - return node; - } - static void commit_if(NodeType *node) { - - char slab[1024]; - sprintf(slab, "|eif%d|", allocateLabel()); - commit_node(node->unode.opr.op[0],0); - GSL_PUT_JZERO(slab,node->line_number); - /* code */ - commit_node(node->unode.opr.op[1],0); - GSL_PUT_LABEL(slab,node->line_number); - } /* }}} */ - - /* BLOCK */ - static NodeType *new_block(NodeType *lastNode) { /* {{{ */ - NodeType *blk = new_op("block", OPR_BLOCK, 2); - blk->unode.opr.op[0] = new_nop("start_of_block"); - blk->unode.opr.op[1] = lastNode; - return blk; - } - static void commit_block(NodeType *node) { - commit_node(node->unode.opr.op[0]->unode.opr.next,0); - } /* }}} */ - - /* FUNCTION INTRO */ - static NodeType *new_function_intro(const char *name) { /* {{{ */ - char stmp[256]; - if (strlen(name) < 200) { - sprintf(stmp, "|__func_%s|", name); - } - return new_op(stmp, OPR_FUNC_INTRO, 0); - } - static void commit_function_intro(NodeType *node) { - currentGoomSL->instr = gsl_instr_init(currentGoomSL, "label", INSTR_LABEL, 1, node->line_number); - gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_LABEL); -#ifdef VERBOSE - printf("label %s\n", node->str); -#endif - } /* }}} */ - - /* FUNCTION OUTRO */ - static NodeType *new_function_outro() { /* {{{ */ - return new_op("ret", OPR_FUNC_OUTRO, 0); - } - static void commit_function_outro(NodeType *node) { - currentGoomSL->instr = gsl_instr_init(currentGoomSL, "ret", INSTR_RET, 1, node->line_number); - gsl_instr_add_param(currentGoomSL->instr, "|dummy|", TYPE_LABEL); - releaseAllTemps(); -#ifdef VERBOSE - printf("ret\n"); -#endif - } /* }}} */ - - /* AFFECTATION LIST */ - static NodeType *new_affec_list(NodeType *set, NodeType *next) /* {{{ */ - { - NodeType *node = new_op("affect_list", OPR_AFFECT_LIST, 2); - node->unode.opr.op[0] = set; - node->unode.opr.op[1] = next; - return node; - } - static NodeType *new_affect_list_after(NodeType *affect_list) - { - NodeType *ret = NULL; - NodeType *cur = affect_list; - while(cur != NULL) { - NodeType *set = cur->unode.opr.op[0]; - NodeType *next = cur->unode.opr.op[1]; - NodeType *lvalue = set->unode.opr.op[0]; - NodeType *expression = set->unode.opr.op[1]; - if ((lvalue->str[0] == '&') && (expression->type == VAR_NODE)) { - NodeType *nset = new_set(nodeClone(expression), nodeClone(lvalue)); - ret = new_affec_list(nset, ret); - } - cur = next; - } - return ret; - } - static void commit_affect_list(NodeType *node) - { - NodeType *cur = node; - while(cur != NULL) { - NodeType *set = cur->unode.opr.op[0]; - precommit_node(set->unode.opr.op[0]); - precommit_node(set->unode.opr.op[1]); - cur = cur->unode.opr.op[1]; - } - cur = node; - while(cur != NULL) { - NodeType *set = cur->unode.opr.op[0]; - commit_node(set,0); - cur = cur->unode.opr.op[1]; - } - } /* }}} */ - - /* VAR LIST */ - static NodeType *new_var_list(NodeType *var, NodeType *next) /* {{{ */ - { - NodeType *node = new_op("var_list", OPR_VAR_LIST, 2); - node->unode.opr.op[0] = var; - node->unode.opr.op[1] = next; - return node; - } - static void commit_var_list(NodeType *node) - { - } /* }}} */ - - /* FUNCTION CALL */ - static NodeType *new_call(const char *name, NodeType *affect_list) { /* {{{ */ - HashValue *fval; - fval = goom_hash_get(currentGoomSL->functions, name); - if (!fval) { - gsl_declare_task(name); - fval = goom_hash_get(currentGoomSL->functions, name); - } - if (!fval) { - fprintf(stderr, "ERROR: Line %d, Could not find function %s\n", currentGoomSL->num_lines, name); - exit(1); - return NULL; - } - else { - ExternalFunctionStruct *gef = (ExternalFunctionStruct*)fval->ptr; - if (gef->is_extern) { - NodeType *node = new_op(name, OPR_EXT_CALL, 1); - node->unode.opr.op[0] = affect_list; - return node; - } - else { - NodeType *node; - char stmp[256]; - if (strlen(name) < 200) { - sprintf(stmp, "|__func_%s|", name); - } - node = new_op(stmp, OPR_CALL, 1); - node->unode.opr.op[0] = affect_list; - return node; - } - } - } - static void commit_ext_call(NodeType *node) { - NodeType *alafter = new_affect_list_after(node->unode.opr.op[0]); - commit_node(node->unode.opr.op[0],0); - currentGoomSL->instr = gsl_instr_init(currentGoomSL, "extcall", INSTR_EXT_CALL, 1, node->line_number); - gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_VAR); -#ifdef VERBOSE - printf("extcall %s\n", node->str); -#endif - commit_node(alafter,0); - } - static void commit_call(NodeType *node) { - NodeType *alafter = new_affect_list_after(node->unode.opr.op[0]); - commit_node(node->unode.opr.op[0],0); - currentGoomSL->instr = gsl_instr_init(currentGoomSL, "call", INSTR_CALL, 1, node->line_number); - gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_LABEL); -#ifdef VERBOSE - printf("call %s\n", node->str); -#endif - commit_node(alafter,0); - } /* }}} */ - - /** **/ - - static NodeType *rootNode = 0; /* TODO: reinitialiser a chaque compilation. */ - static NodeType *lastNode = 0; - static NodeType *gsl_append(NodeType *curNode) { - if (curNode == 0) return 0; /* {{{ */ - if (lastNode) - lastNode->unode.opr.next = curNode; - lastNode = curNode; - while(lastNode->unode.opr.next) lastNode = lastNode->unode.opr.next; - if (rootNode == 0) - rootNode = curNode; - return curNode; - } /* }}} */ - -#if 1 - int allocateTemp() { - return allocateLabel(); - } - void releaseAllTemps() {} - void releaseTemp(int n) {} -#else - static int nbTemp = 0; - static int *tempArray = 0; - static int tempArraySize = 0; - int allocateTemp() { /* TODO: allocateITemp, allocateFTemp */ - int i = 0; /* {{{ */ - if (tempArray == 0) { - tempArraySize = 256; - tempArray = (int*)malloc(tempArraySize * sizeof(int)); - } - while (1) { - int j; - for (j=0;jtype == OPR_NODE) - switch(node->unode.opr.type) { - case OPR_ADD: precommit_add(node); break; - case OPR_SUB: precommit_sub(node); break; - case OPR_MUL: precommit_mul(node); break; - case OPR_DIV: precommit_div(node); break; - case OPR_CALL_EXPR: precommit_call_expr(node); break; - } - } /* }}} */ - - void commit_node(NodeType *node, int releaseIfTmp) - { /* {{{ */ - if (node == 0) return; - - switch(node->type) { - case OPR_NODE: - switch(node->unode.opr.type) { - case OPR_SET: commit_set(node); break; - case OPR_PLUS_EQ: commit_plus_eq(node); break; - case OPR_SUB_EQ: commit_sub_eq(node); break; - case OPR_MUL_EQ: commit_mul_eq(node); break; - case OPR_DIV_EQ: commit_div_eq(node); break; - case OPR_IF: commit_if(node); break; - case OPR_WHILE: commit_while(node); break; - case OPR_BLOCK: commit_block(node); break; - case OPR_FUNC_INTRO: commit_function_intro(node); break; - case OPR_FUNC_OUTRO: commit_function_outro(node); break; - case OPR_CALL: commit_call(node); break; - case OPR_EXT_CALL: commit_ext_call(node); break; - case OPR_EQU: commit_equ(node); break; - case OPR_LOW: commit_low(node); break; - case OPR_NOT: commit_not(node); break; - case OPR_AFFECT_LIST: commit_affect_list(node); break; - case OPR_FOREACH: commit_foreach(node); break; - case OPR_VAR_LIST: commit_var_list(node); break; -#ifdef VERBOSE - case EMPTY_NODE: printf("NOP\n"); break; -#endif - } - - commit_node(node->unode.opr.next,0); /* recursive for the moment, maybe better to do something iterative? */ - break; - - case VAR_NODE: gsl_instr_set_namespace(currentGoomSL->instr, node->vnamespace); - gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_VAR); break; - case CONST_INT_NODE: gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_INTEGER); break; - case CONST_FLOAT_NODE: gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_FLOAT); break; - case CONST_PTR_NODE: gsl_instr_add_param(currentGoomSL->instr, node->str, TYPE_PTR); break; - } - if (releaseIfTmp && is_tmp_expr(node)) - releaseTemp(get_tmp_id(node)); - - nodeFree(node); - } /* }}} */ - - NodeType *nodeNew(const char *str, int type, int line_number) { - NodeType *node = (NodeType*)malloc(sizeof(NodeType)); /* {{{ */ - node->type = type; - node->str = (char*)malloc(strlen(str)+1); - node->vnamespace = NULL; - node->line_number = line_number; - strcpy(node->str, str); - return node; - } /* }}} */ - static NodeType *nodeClone(NodeType *node) { - NodeType *ret = nodeNew(node->str, node->type, node->line_number); /* {{{ */ - ret->vnamespace = node->vnamespace; - ret->unode = node->unode; - return ret; - } /* }}} */ - - void nodeFreeInternals(NodeType *node) { - free(node->str); /* {{{ */ - } /* }}} */ - - void nodeFree(NodeType *node) { - nodeFreeInternals(node); /* {{{ */ - free(node); - } /* }}} */ - - NodeType *new_constInt(const char *str, int line_number) { - NodeType *node = nodeNew(str, CONST_INT_NODE, line_number); /* {{{ */ - node->unode.constInt.val = atoi(str); - return node; - } /* }}} */ - - NodeType *new_constPtr(const char *str, int line_number) { - NodeType *node = nodeNew(str, CONST_PTR_NODE, line_number); /* {{{ */ - node->unode.constPtr.id = strtol(str,NULL,0); - return node; - } /* }}} */ - - NodeType *new_constFloat(const char *str, int line_number) { - NodeType *node = nodeNew(str, CONST_FLOAT_NODE, line_number); /* {{{ */ - node->unode.constFloat.val = atof(str); - return node; - } /* }}} */ - - NodeType *new_var(const char *str, int line_number) { - NodeType *node = nodeNew(str, VAR_NODE, line_number); /* {{{ */ - node->vnamespace = gsl_find_namespace(str); - if (node->vnamespace == 0) { - fprintf(stderr, "ERROR: Line %d, Variable not found: '%s'\n", line_number, str); - exit(1); - } - return node; - } /* }}} */ - - NodeType *new_nop(const char *str) { - NodeType *node = new_op(str, EMPTY_NODE, 0); /* {{{ */ - return node; - } /* }}} */ - - NodeType *new_op(const char *str, int type, int nbOp) { - int i; /* {{{ */ - NodeType *node = nodeNew(str, OPR_NODE, currentGoomSL->num_lines); - node->unode.opr.next = 0; - node->unode.opr.type = type; - node->unode.opr.nbOp = nbOp; - for (i=0;iunode.opr.op[i] = 0; - return node; - } /* }}} */ - - - void gsl_declare_global_variable(int type, char *name) { - switch(type){ - case -1: break; - case FLOAT_TK:gsl_float_decl_global(name);break; - case INT_TK: gsl_int_decl_global(name);break; - case PTR_TK: gsl_ptr_decl_global(name);break; - default: - { - int id = type - 1000; - gsl_struct_decl_global_from_id(name,id); - } - } - } - -%} - -%union { - int intValue; - float floatValue; - char charValue; - char strValue[2048]; - NodeType *nPtr; - GoomHash *namespace; - GSL_Struct *gsl_struct; - GSL_StructField *gsl_struct_field; - }; - -%token LTYPE_INTEGER -%token LTYPE_FLOAT -%token LTYPE_VAR -%token LTYPE_PTR - -%token PTR_TK INT_TK FLOAT_TK DECLARE EXTERNAL WHILE DO NOT PLUS_EQ SUB_EQ DIV_EQ MUL_EQ SUP_EQ LOW_EQ NOT_EQ STRUCT FOR IN - -%type return_type -%type expression constValue instruction test func_call func_call_expression -%type start_block affectation_list affectation_in_list affectation declaration -%type var_list_content var_list -%type task_name ext_task_name -%type leave_namespace -%type struct_members -%type struct_member -%left '\n' -%left PLUS_EQ SUB_EQ MUL_EQ DIV_EQ -%left NOT -%left '=' '<' '>' -%left '+' '-' -%left '/' '*' - -%% - -/* -------------- Global architechture of a GSL program ------------*/ - -gsl: gsl_code function_outro gsl_def_functions ; - -gsl_code: gsl_code instruction { gsl_append($2); } - | gsl_code EXTERNAL '<' ext_task_name '>' return_type '\n' leave_namespace { gsl_declare_global_variable($6,$4); } - | gsl_code EXTERNAL '<' ext_task_name ':' arglist '>' return_type '\n' leave_namespace { gsl_declare_global_variable($8,$4); } - | gsl_code DECLARE '<' task_name '>' return_type '\n' leave_namespace { gsl_declare_global_variable($6,$4); } - | gsl_code DECLARE '<' task_name ':' arglist '>' return_type '\n' leave_namespace { gsl_declare_global_variable($8,$4); } - | gsl_code struct_declaration - | gsl_code '\n' - | - ; - -/* ------------- Declaration of a structure ------------ */ - -struct_declaration: STRUCT '<' LTYPE_VAR ':' struct_members '>' '\n' { gsl_add_struct($3, $5); } - ; - -struct_members: opt_nl struct_member { $$ = gsl_new_struct($2); } - | struct_members ',' opt_nl struct_member { $$ = $1; gsl_add_struct_field($1, $4); } - ; - -struct_member: INT_TK LTYPE_VAR { $$ = gsl_new_struct_field($2, INSTR_INT); } - | FLOAT_TK LTYPE_VAR { $$ = gsl_new_struct_field($2, INSTR_FLOAT); } - | PTR_TK LTYPE_VAR { $$ = gsl_new_struct_field($2, INSTR_PTR); } - | LTYPE_VAR LTYPE_VAR { $$ = gsl_new_struct_field_struct($2, $1); } - ; - -/* ------------- Fonction declarations -------------- */ - -ext_task_name: LTYPE_VAR { gsl_declare_external_task($1); gsl_enternamespace($1); strcpy($$,$1); } - ; -task_name: LTYPE_VAR { gsl_declare_task($1); gsl_enternamespace($1); strcpy($$,$1); strcpy($$,$1); } - ; - -return_type: { $$=-1; } - | ':' INT_TK { $$=INT_TK; } - | ':' FLOAT_TK { $$=FLOAT_TK; } - | ':' PTR_TK { $$=PTR_TK; } - | ':' LTYPE_VAR { $$= 1000 + gsl_get_struct_id($2); } - ; - -arglist: empty_declaration - | empty_declaration ',' arglist - ; - -/* ------------- Fonction definition -------------- */ - -gsl_def_functions: gsl_def_functions function - | - ; - -function: function_intro gsl_code function_outro { gsl_leavenamespace(); } - -function_intro: '<' task_name '>' return_type '\n' { gsl_append(new_function_intro($2)); - gsl_declare_global_variable($4,$2); } - | '<' task_name ':' arglist '>' return_type '\n' { gsl_append(new_function_intro($2)); - gsl_declare_global_variable($6,$2); } - ; -function_outro: { gsl_append(new_function_outro()); } ; - -leave_namespace: { $$ = gsl_leavenamespace(); }; - -/* ------------ Variable declaration ---------------- */ - -declaration: FLOAT_TK LTYPE_VAR '=' expression { gsl_float_decl_local($2); $$ = new_set(new_var($2,currentGoomSL->num_lines), $4); } - | INT_TK LTYPE_VAR '=' expression { gsl_int_decl_local($2); $$ = new_set(new_var($2,currentGoomSL->num_lines), $4); } - | PTR_TK LTYPE_VAR '=' expression { gsl_ptr_decl_local($2); $$ = new_set(new_var($2,currentGoomSL->num_lines), $4); } - | LTYPE_VAR LTYPE_VAR '=' expression { gsl_struct_decl_local($1,$2); $$ = new_set(new_var($2,currentGoomSL->num_lines), $4); } - | empty_declaration { $$ = 0; } - ; - -empty_declaration: FLOAT_TK LTYPE_VAR { gsl_float_decl_local($2); } - | INT_TK LTYPE_VAR { gsl_int_decl_local($2); } - | PTR_TK LTYPE_VAR { gsl_ptr_decl_local($2); } - | LTYPE_VAR LTYPE_VAR { gsl_struct_decl_local($1,$2); } - ; - -/* -------------- Instructions and Expressions ------------------ */ - -instruction: affectation '\n' { $$ = $1; } - | declaration '\n' { $$ = $1; } - | '(' test ')' '?' opt_nl instruction { $$ = new_if($2,$6); } - | WHILE test opt_nl DO opt_nl instruction { $$ = new_while($2,$6); } - | '{' '\n' start_block gsl_code '}' '\n' { lastNode = $3->unode.opr.op[1]; $$=$3; } - | func_call { $$ = $1; } - | LTYPE_VAR PLUS_EQ expression { $$ = new_plus_eq(new_var($1,currentGoomSL->num_lines),$3); } - | LTYPE_VAR SUB_EQ expression { $$ = new_sub_eq(new_var($1,currentGoomSL->num_lines),$3); } - | LTYPE_VAR MUL_EQ expression { $$ = new_mul_eq(new_var($1,currentGoomSL->num_lines),$3); } - | LTYPE_VAR DIV_EQ expression { $$ = new_div_eq(new_var($1,currentGoomSL->num_lines),$3); } - | FOR LTYPE_VAR IN var_list DO instruction { $$ = new_static_foreach(new_var($2, currentGoomSL->num_lines), $4, $6); } - ; - -var_list: '(' var_list_content ')' { $$ = $2; } - ; -var_list_content: LTYPE_VAR { $$ = new_var_list(new_var($1,currentGoomSL->num_lines), NULL); } - | LTYPE_VAR var_list_content { $$ = new_var_list(new_var($1,currentGoomSL->num_lines), $2); } - ; - -affectation: LTYPE_VAR '=' expression { $$ = new_set(new_var($1,currentGoomSL->num_lines),$3); } ; - -start_block: { $$ = new_block(lastNode); lastNode = $$->unode.opr.op[0]; } - ; - -expression: LTYPE_VAR { $$ = new_var($1,currentGoomSL->num_lines); } - | constValue { $$ = $1; } - | expression '*' expression { $$ = new_mul($1,$3); } - | expression '/' expression { $$ = new_div($1,$3); } - | expression '+' expression { $$ = new_add($1,$3); } - | expression '-' expression { $$ = new_sub($1,$3); } - | '-' expression { $$ = new_neg($2); } - | '(' expression ')' { $$ = $2; } - | func_call_expression { $$ = $1; } - ; - -test: expression '=' expression { $$ = new_equ($1,$3); } - | expression '<' expression { $$ = new_low($1,$3); } - | expression '>' expression { $$ = new_low($3,$1); } - | expression SUP_EQ expression { $$ = new_not(new_low($1,$3)); } - | expression LOW_EQ expression { $$ = new_not(new_low($3,$1)); } - | expression NOT_EQ expression { $$ = new_not(new_equ($1,$3)); } - | NOT test { $$ = new_not($2); } - ; - -constValue: LTYPE_FLOAT { $$ = new_constFloat($1,currentGoomSL->num_lines); } - | LTYPE_INTEGER { $$ = new_constInt($1,currentGoomSL->num_lines); } - | LTYPE_PTR { $$ = new_constPtr($1,currentGoomSL->num_lines); } - ; - -/* ---------------- Function Calls ------------------ */ - -func_call: task_name '\n' leave_namespace { $$ = new_call($1,NULL); } - | task_name ':' affectation_list '\n' leave_namespace { $$ = new_call($1,$3); } - | '[' task_name ']' '\n' leave_namespace { $$ = new_call($2,NULL); } - | '[' task_name ':' affectation_list ']' '\n' leave_namespace { $$ = new_call($2,$4); } - ; - -func_call_expression: - '[' task_name leave_namespace ']' { $$ = new_call_expr($2,NULL); } - | '[' task_name ':' affectation_list ']' leave_namespace { $$ = new_call_expr($2,$4); } - ; - -affectation_list: affectation_in_list affectation_list { $$ = new_affec_list($1,$2); } - | affectation_in_list { $$ = new_affec_list($1,NULL); } - -affectation_in_list: LTYPE_VAR '=' leave_namespace expression { - gsl_reenternamespace($3); - $$ = new_set(new_var($1,currentGoomSL->num_lines),$4); - } - | ':' leave_namespace expression { - gsl_reenternamespace($2); - $$ = new_set(new_var("&this", currentGoomSL->num_lines),$3); - } - ; - - -/* ------------ Misc ---------- */ - -opt_nl: '\n' | ; - - -%% - - -void yyerror(char *str) -{ /* {{{ */ - fprintf(stderr, "ERROR: Line %d, %s\n", currentGoomSL->num_lines, str); - currentGoomSL->compilationOK = 0; - exit(1); -} /* }}} */ - diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/goom_tools.c kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/goom_tools.c --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/goom_tools.c 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/goom_tools.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -#include "goom_tools.h" -#include - -GoomRandom *goom_random_init(int i) { - GoomRandom *grandom = (GoomRandom*)malloc(sizeof(GoomRandom)); - srand (i); - grandom->pos = 1; - goom_random_update_array(grandom, GOOM_NB_RAND); - return grandom; -} - -void goom_random_free(GoomRandom *grandom) { - free(grandom); -} - -void goom_random_update_array(GoomRandom *grandom, int numberOfValuesToChange) { - while (numberOfValuesToChange > 0) { -#if RAND_MAX < 0x10000 - grandom->array[grandom->pos++] = ((rand()<<16)+rand()) / 127; -#else - grandom->array[grandom->pos++] = rand() / 127; -#endif - numberOfValuesToChange--; - } -} diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/goom_tools.h kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/goom_tools.h --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/goom_tools.h 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/goom_tools.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,42 +0,0 @@ -#ifndef _GOOMTOOLS_H -#define _GOOMTOOLS_H - -/** - * Random number generator wrapper for faster random number. - */ - -#ifdef _WIN32PC -#define inline __inline -#ifndef M_PI -#define M_PI 3.14159265358979323846 -#endif -#define random rand -#define bzero(x,y) memset(x,0,y) -#endif - -#define GOOM_NB_RAND 0x10000 - -typedef struct _GOOM_RANDOM { - int array[GOOM_NB_RAND]; - unsigned short pos; -} GoomRandom; - -GoomRandom *goom_random_init(int i); -void goom_random_free(GoomRandom *grandom); - -inline static int goom_random(GoomRandom *grandom) { - - grandom->pos++; /* works because pos is an unsigned short */ - return grandom->array[grandom->pos]; -} - -inline static int goom_irand(GoomRandom *grandom, int i) { - - grandom->pos++; - return grandom->array[grandom->pos] % i; -} - -/* called to change the specified number of value in the array, so that the array does not remain the same*/ -void goom_random_update_array(GoomRandom *grandom, int numberOfValuesToChange); - -#endif diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/goom_typedefs.h kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/goom_typedefs.h --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/goom_typedefs.h 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/goom_typedefs.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,11 +0,0 @@ -#ifndef _GOOM_TYPEDEFS_H -#define _GOOM_TYPEDEFS_H - -typedef struct _PLUGIN_INFO PluginInfo; -typedef struct _SOUND_INFO SoundInfo; -typedef struct _GMLINE GMLine; -typedef struct _GMUNITPOINTER GMUnitPointer; -typedef struct _ZOOM_FILTER_DATA ZoomFilterData; -typedef struct _VISUAL_FX VisualFX; - -#endif diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/goom_visual_fx.h kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/goom_visual_fx.h --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/goom_visual_fx.h 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/goom_visual_fx.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,26 +0,0 @@ -#ifndef _VISUAL_FX_H -#define _VISUAL_FX_H - -/** - * File created on 2003-05-21 by Jeko. - * (c)2003, JC Hoelt for iOS-software. - * - * LGPL Licence. - * If you use this file on a visual program, - * please make my name being visible on it. - */ - -#include "goom_config_param.h" -#include "goom_graphic.h" -#include "goom_typedefs.h" - -struct _VISUAL_FX { - void (*init) (struct _VISUAL_FX *_this, PluginInfo *info); - void (*free) (struct _VISUAL_FX *_this); - void (*apply) (struct _VISUAL_FX *_this, Pixel *src, Pixel *dest, PluginInfo *info); - void *fx_data; - - PluginParameters *params; -}; - -#endif diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/graphic.c kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/graphic.c --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/graphic.c 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/graphic.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,10 +0,0 @@ -#include "goom_graphic.h" - -const Color BLACK = { 0, 0, 0 }; -const Color WHITE = { 0xff, 0xff, 0xff }; -const Color RED = { 0xff, 0x05, 0x05 }; -const Color GREEN = { 0x05, 0xff, 0x05 }; -const Color BLUE = { 0x05, 0x05, 0xff }; -const Color YELLOW = { 0xff, 0xff, 0x33 }; -const Color ORANGE = { 0xff, 0xcc, 0x05 }; -const Color VIOLET = { 0x55, 0x05, 0xff }; diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/ifs.c kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/ifs.c --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/ifs.c 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/ifs.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,763 +0,0 @@ -/* - * ifs.c --- modified iterated functions system for goom. - */ - -/*- - * Copyright (c) 1997 by Massimino Pascal - * - * Permission to use, copy, modify, and distribute this software and its - * documentation for any purpose and without fee is hereby granted, - * provided that the above copyright notice appear in all copies and that - * both that copyright notice and this permission notice appear in - * supporting documentation. - * - * This file is provided AS IS with no warranties of any kind. The author - * shall have no liability with respect to the infringement of copyrights, - * trade secrets or any patents by this file or any part thereof. In no - * event will the author be liable for any lost revenue or profits or - * other special, indirect and consequential damages. - * - * If this mode is weird and you have an old MetroX server, it is buggy. - * There is a free SuSE-enhanced MetroX X server that is fine. - * - * When shown ifs, Diana Rose (4 years old) said, "It looks like dancing." - * - * Revision History: - * 13-Dec-2003: Added some goom specific stuffs (to make ifs a VisualFX). - * 11-Apr-2002: jeko@ios-software.com: Make ifs.c system-indendant. (ifs.h added) - * 01-Nov-2000: Allocation checks - * 10-May-1997: jwz@jwz.org: turned into a standalone program. - * Made it render into an offscreen bitmap and then copy - * that onto the screen, to reduce flicker. - */ - -/* #ifdef STANDALONE */ - -#include -#include -#include - -#include "goom_config.h" - -#ifdef HAVE_MMX -#include "mmx.h" -#endif - -#include "goom_graphic.h" -#include "ifs.h" -#include "goom_tools.h" - -typedef struct _ifsPoint -{ - gint32 x, y; -} -IFSPoint; - - -#define MODE_ifs - -#define PROGCLASS "IFS" - -#define HACK_INIT init_ifs -#define HACK_DRAW draw_ifs - -#define ifs_opts xlockmore_opts - -#define DEFAULTS "*delay: 20000 \n" \ -"*ncolors: 100 \n" - -#define SMOOTH_COLORS - -#define LRAND() ((long) (goom_random(goomInfo->gRandom) & 0x7fffffff)) -#define NRAND(n) ((int) (LRAND() % (n))) - -#if RAND_MAX < 0x10000 -#define MAXRAND (((float)(RAND_MAX<16)+((float)RAND_MAX)+1.0f)/127.0f) -#else -#define MAXRAND (2147483648.0/127.0) /* unsigned 1<<31 / 127.0 (cf goom_tools) as a float */ -#endif - -/*****************************************************/ - -typedef float DBL; -typedef int F_PT; - -/* typedef float F_PT; */ - -/*****************************************************/ - -#define FIX 12 -#define UNIT ( 1<c_x = Gauss_Rand (goomInfo, 0.0, .8, 4.0); - Cur->c_y = Gauss_Rand (goomInfo, 0.0, .8, 4.0); - Cur->r = Gauss_Rand (goomInfo, F->r_mean, F->dr_mean, 3.0); - Cur->r2 = Half_Gauss_Rand (goomInfo, 0.0, F->dr2_mean, 2.0); - Cur->A = Gauss_Rand (goomInfo, 0.0, 360.0, 4.0) * (M_PI / 180.0); - Cur->A2 = Gauss_Rand (goomInfo, 0.0, 360.0, 4.0) * (M_PI / 180.0); - Cur++; - } -} - -static void -free_ifs_buffers (FRACTAL * Fractal) -{ - if (Fractal->Buffer1 != NULL) { - (void) free ((void *) Fractal->Buffer1); - Fractal->Buffer1 = (IFSPoint *) NULL; - } - if (Fractal->Buffer2 != NULL) { - (void) free ((void *) Fractal->Buffer2); - Fractal->Buffer2 = (IFSPoint *) NULL; - } -} - - -static void -free_ifs (FRACTAL * Fractal) -{ - free_ifs_buffers (Fractal); -} - -/***************************************************************/ - -static void -init_ifs (PluginInfo *goomInfo, IfsData *data) -{ - int i; - FRACTAL *Fractal; - int width = goomInfo->screen.width; - int height = goomInfo->screen.height; - - if (data->Root == NULL) { - data->Root = (FRACTAL *) malloc (sizeof (FRACTAL)); - if (data->Root == NULL) - return; - data->Root->Buffer1 = (IFSPoint *) NULL; - data->Root->Buffer2 = (IFSPoint *) NULL; - } - Fractal = data->Root; - - free_ifs_buffers (Fractal); - - i = (NRAND (4)) + 2; /* Number of centers */ - switch (i) { - case 3: - Fractal->Depth = MAX_DEPTH_3; - Fractal->r_mean = .6; - Fractal->dr_mean = .4; - Fractal->dr2_mean = .3; - break; - - case 4: - Fractal->Depth = MAX_DEPTH_4; - Fractal->r_mean = .5; - Fractal->dr_mean = .4; - Fractal->dr2_mean = .3; - break; - - case 5: - Fractal->Depth = MAX_DEPTH_5; - Fractal->r_mean = .5; - Fractal->dr_mean = .4; - Fractal->dr2_mean = .3; - break; - - default: - case 2: - Fractal->Depth = MAX_DEPTH_2; - Fractal->r_mean = .7; - Fractal->dr_mean = .3; - Fractal->dr2_mean = .4; - break; - } - Fractal->Nb_Simi = i; - Fractal->Max_Pt = Fractal->Nb_Simi - 1; - for (i = 0; i <= Fractal->Depth + 2; ++i) - Fractal->Max_Pt *= Fractal->Nb_Simi; - - if ((Fractal->Buffer1 = (IFSPoint *) calloc (Fractal->Max_Pt, - sizeof (IFSPoint))) == NULL) { - free_ifs (Fractal); - return; - } - if ((Fractal->Buffer2 = (IFSPoint *) calloc (Fractal->Max_Pt, - sizeof (IFSPoint))) == NULL) { - free_ifs (Fractal); - return; - } - - Fractal->Speed = 6; - Fractal->Width = width; /* modif by JeKo */ - Fractal->Height = height; /* modif by JeKo */ - Fractal->Cur_Pt = 0; - Fractal->Count = 0; - Fractal->Lx = (Fractal->Width - 1) / 2; - Fractal->Ly = (Fractal->Height - 1) / 2; - Fractal->Col = rand () % (width * height); /* modif by JeKo */ - - Random_Simis (goomInfo, Fractal, Fractal->Components, 5 * MAX_SIMI); -} - - -/***************************************************************/ - -static inline void -Transform (SIMI * Simi, F_PT xo, F_PT yo, F_PT * x, F_PT * y) -{ - F_PT xx, yy; - - xo = xo - Simi->Cx; - xo = (xo * Simi->R) >> FIX; /* / UNIT; */ - yo = yo - Simi->Cy; - yo = (yo * Simi->R) >> FIX; /* / UNIT; */ - - xx = xo - Simi->Cx; - xx = (xx * Simi->R2) >> FIX; /* / UNIT; */ - yy = -yo - Simi->Cy; - yy = (yy * Simi->R2) >> FIX; /* / UNIT; */ - - *x = - ((xo * Simi->Ct - yo * Simi->St + xx * Simi->Ct2 - yy * Simi->St2) - >> FIX /* / UNIT */ ) + Simi->Cx; - *y = - ((xo * Simi->St + yo * Simi->Ct + xx * Simi->St2 + yy * Simi->Ct2) - >> FIX /* / UNIT */ ) + Simi->Cy; -} - -/***************************************************************/ - -static void -Trace (FRACTAL * F, F_PT xo, F_PT yo, IfsData *data) -{ - F_PT x, y, i; - SIMI *Cur; - - Cur = data->Cur_F->Components; - for (i = data->Cur_F->Nb_Simi; i; --i, Cur++) { - Transform (Cur, xo, yo, &x, &y); - - data->Buf->x = F->Lx + ((x * F->Lx) >> (FIX+1) /* /(UNIT*2) */ ); - data->Buf->y = F->Ly - ((y * F->Ly) >> (FIX+1) /* /(UNIT*2) */ ); - data->Buf++; - - data->Cur_Pt++; - - if (F->Depth && ((x - xo) >> 4) && ((y - yo) >> 4)) { - F->Depth--; - Trace (F, x, y, data); - F->Depth++; - } - } -} - -static void -Draw_Fractal (IfsData *data) -{ - FRACTAL *F = data->Root; - int i, j; - F_PT x, y, xo, yo; - SIMI *Cur, *Simi; - - for (Cur = F->Components, i = F->Nb_Simi; i; --i, Cur++) { - Cur->Cx = DBL_To_F_PT (Cur->c_x); - Cur->Cy = DBL_To_F_PT (Cur->c_y); - - Cur->Ct = DBL_To_F_PT (cos (Cur->A)); - Cur->St = DBL_To_F_PT (sin (Cur->A)); - Cur->Ct2 = DBL_To_F_PT (cos (Cur->A2)); - Cur->St2 = DBL_To_F_PT (sin (Cur->A2)); - - Cur->R = DBL_To_F_PT (Cur->r); - Cur->R2 = DBL_To_F_PT (Cur->r2); - } - - - data->Cur_Pt = 0; - data->Cur_F = F; - data->Buf = F->Buffer2; - for (Cur = F->Components, i = F->Nb_Simi; i; --i, Cur++) { - xo = Cur->Cx; - yo = Cur->Cy; - for (Simi = F->Components, j = F->Nb_Simi; j; --j, Simi++) { - if (Simi == Cur) - continue; - Transform (Simi, xo, yo, &x, &y); - Trace (F, x, y, data); - } - } - - /* Erase previous */ - - F->Cur_Pt = data->Cur_Pt; - data->Buf = F->Buffer1; - F->Buffer1 = F->Buffer2; - F->Buffer2 = data->Buf; -} - - -static IFSPoint * -draw_ifs (PluginInfo *goomInfo, int *nbpt, IfsData *data) -{ - int i; - DBL u, uu, v, vv, u0, u1, u2, u3; - SIMI *S, *S1, *S2, *S3, *S4; - FRACTAL *F; - - if (data->Root == NULL) - return NULL; - F = data->Root; - if (F->Buffer1 == NULL) - return NULL; - - u = (DBL) (F->Count) * (DBL) (F->Speed) / 1000.0; - uu = u * u; - v = 1.0 - u; - vv = v * v; - u0 = vv * v; - u1 = 3.0 * vv * u; - u2 = 3.0 * v * uu; - u3 = u * uu; - - S = F->Components; - S1 = S + F->Nb_Simi; - S2 = S1 + F->Nb_Simi; - S3 = S2 + F->Nb_Simi; - S4 = S3 + F->Nb_Simi; - - for (i = F->Nb_Simi; i; --i, S++, S1++, S2++, S3++, S4++) { - S->c_x = u0 * S1->c_x + u1 * S2->c_x + u2 * S3->c_x + u3 * S4->c_x; - S->c_y = u0 * S1->c_y + u1 * S2->c_y + u2 * S3->c_y + u3 * S4->c_y; - S->r = u0 * S1->r + u1 * S2->r + u2 * S3->r + u3 * S4->r; - S->r2 = u0 * S1->r2 + u1 * S2->r2 + u2 * S3->r2 + u3 * S4->r2; - S->A = u0 * S1->A + u1 * S2->A + u2 * S3->A + u3 * S4->A; - S->A2 = u0 * S1->A2 + u1 * S2->A2 + u2 * S3->A2 + u3 * S4->A2; - } - - Draw_Fractal (data); - - if (F->Count >= 1000 / F->Speed) { - S = F->Components; - S1 = S + F->Nb_Simi; - S2 = S1 + F->Nb_Simi; - S3 = S2 + F->Nb_Simi; - S4 = S3 + F->Nb_Simi; - - for (i = F->Nb_Simi; i; --i, S++, S1++, S2++, S3++, S4++) { - S2->c_x = 2.0 * S4->c_x - S3->c_x; - S2->c_y = 2.0 * S4->c_y - S3->c_y; - S2->r = 2.0 * S4->r - S3->r; - S2->r2 = 2.0 * S4->r2 - S3->r2; - S2->A = 2.0 * S4->A - S3->A; - S2->A2 = 2.0 * S4->A2 - S3->A2; - - *S1 = *S4; - } - Random_Simis (goomInfo, F, F->Components + 3 * F->Nb_Simi, F->Nb_Simi); - - Random_Simis (goomInfo, F, F->Components + 4 * F->Nb_Simi, F->Nb_Simi); - - F->Count = 0; - } - else - F->Count++; - - F->Col++; - - (*nbpt) = data->Cur_Pt; - return F->Buffer2; -} - - -/***************************************************************/ - -static void release_ifs (IfsData *data) -{ - if (data->Root != NULL) { - free_ifs (data->Root); - (void) free ((void *) data->Root); - data->Root = (FRACTAL *) NULL; - } -} - -#define RAND() goom_random(goomInfo->gRandom) - -static void ifs_update (PluginInfo *goomInfo, Pixel * data, Pixel * back, int increment, IfsData *fx_data) -{ - static int couleur = 0xc0c0c0c0; - static int v[4] = { 2, 4, 3, 2 }; - static int col[4] = { 2, 4, 3, 2 }; - -#define MOD_MER 0 -#define MOD_FEU 1 -#define MOD_MERVER 2 - static int mode = MOD_MERVER; - static int justChanged = 0; - static int cycle = 0; - int cycle10; - - int nbpt; - IFSPoint *points; - int i; - - int couleursl = couleur; - int width = goomInfo->screen.width; - int height = goomInfo->screen.height; - - cycle++; - if (cycle >= 80) - cycle = 0; - - if (cycle < 40) - cycle10 = cycle / 10; - else - cycle10 = 7 - cycle / 10; - - { - unsigned char *tmp = (unsigned char *) &couleursl; - - for (i = 0; i < 4; i++) { - *tmp = (*tmp) >> cycle10; - tmp++; - } - } - - points = draw_ifs (goomInfo, &nbpt, fx_data); - nbpt--; - -#ifdef HAVE_MMX - movd_m2r (couleursl, mm1); - punpckldq_r2r (mm1, mm1); - for (i = 0; i < nbpt; i += increment) { - int x = points[i].x; - int y = points[i].y; - - if ((x < width) && (y < height) && (x > 0) && (y > 0)) { - int pos = x + (y * width); - movd_m2r (back[pos], mm0); - paddusb_r2r (mm1, mm0); - movd_r2m (mm0, data[pos]); - } - } - emms();/*__asm__ __volatile__ ("emms");*/ -#else - for (i = 0; i < nbpt; i += increment) { - int x = (int) points[i].x & 0x7fffffff; - int y = (int) points[i].y & 0x7fffffff; - - if ((x < width) && (y < height)) { - int pos = x + (int) (y * width); - int tra = 0, i = 0; - unsigned char *bra = (unsigned char *) &back[pos]; - unsigned char *dra = (unsigned char *) &data[pos]; - unsigned char *cra = (unsigned char *) &couleursl; - - for (; i < 4; i++) { - tra = *cra; - tra += *bra; - if (tra > 255) - tra = 255; - *dra = tra; - ++dra; - ++cra; - ++bra; - } - } - } -#endif /*MMX*/ - justChanged--; - - col[ALPHA] = couleur >> (ALPHA * 8) & 0xff; - col[BLEU] = couleur >> (BLEU * 8) & 0xff; - col[VERT] = couleur >> (VERT * 8) & 0xff; - col[ROUGE] = couleur >> (ROUGE * 8) & 0xff; - - if (mode == MOD_MER) { - col[BLEU] += v[BLEU]; - if (col[BLEU] > 255) { - col[BLEU] = 255; - v[BLEU] = -(RAND() % 4) - 1; - } - if (col[BLEU] < 32) { - col[BLEU] = 32; - v[BLEU] = (RAND() % 4) + 1; - } - - col[VERT] += v[VERT]; - if (col[VERT] > 200) { - col[VERT] = 200; - v[VERT] = -(RAND() % 3) - 2; - } - if (col[VERT] > col[BLEU]) { - col[VERT] = col[BLEU]; - v[VERT] = v[BLEU]; - } - if (col[VERT] < 32) { - col[VERT] = 32; - v[VERT] = (RAND() % 3) + 2; - } - - col[ROUGE] += v[ROUGE]; - if (col[ROUGE] > 64) { - col[ROUGE] = 64; - v[ROUGE] = -(RAND () % 4) - 1; - } - if (col[ROUGE] < 0) { - col[ROUGE] = 0; - v[ROUGE] = (RAND () % 4) + 1; - } - - col[ALPHA] += v[ALPHA]; - if (col[ALPHA] > 0) { - col[ALPHA] = 0; - v[ALPHA] = -(RAND () % 4) - 1; - } - if (col[ALPHA] < 0) { - col[ALPHA] = 0; - v[ALPHA] = (RAND () % 4) + 1; - } - - if (((col[VERT] > 32) && (col[ROUGE] < col[VERT] + 40) - && (col[VERT] < col[ROUGE] + 20) && (col[BLEU] < 64) - && (RAND () % 20 == 0)) && (justChanged < 0)) { - mode = RAND () % 3 ? MOD_FEU : MOD_MERVER; - justChanged = 250; - } - } - else if (mode == MOD_MERVER) { - col[BLEU] += v[BLEU]; - if (col[BLEU] > 128) { - col[BLEU] = 128; - v[BLEU] = -(RAND () % 4) - 1; - } - if (col[BLEU] < 16) { - col[BLEU] = 16; - v[BLEU] = (RAND () % 4) + 1; - } - - col[VERT] += v[VERT]; - if (col[VERT] > 200) { - col[VERT] = 200; - v[VERT] = -(RAND () % 3) - 2; - } - if (col[VERT] > col[ALPHA]) { - col[VERT] = col[ALPHA]; - v[VERT] = v[ALPHA]; - } - if (col[VERT] < 32) { - col[VERT] = 32; - v[VERT] = (RAND () % 3) + 2; - } - - col[ROUGE] += v[ROUGE]; - if (col[ROUGE] > 128) { - col[ROUGE] = 128; - v[ROUGE] = -(RAND () % 4) - 1; - } - if (col[ROUGE] < 0) { - col[ROUGE] = 0; - v[ROUGE] = (RAND () % 4) + 1; - } - - col[ALPHA] += v[ALPHA]; - if (col[ALPHA] > 255) { - col[ALPHA] = 255; - v[ALPHA] = -(RAND () % 4) - 1; - } - if (col[ALPHA] < 0) { - col[ALPHA] = 0; - v[ALPHA] = (RAND () % 4) + 1; - } - - if (((col[VERT] > 32) && (col[ROUGE] < col[VERT] + 40) - && (col[VERT] < col[ROUGE] + 20) && (col[BLEU] < 64) - && (RAND () % 20 == 0)) && (justChanged < 0)) { - mode = RAND () % 3 ? MOD_FEU : MOD_MER; - justChanged = 250; - } - } - else if (mode == MOD_FEU) { - - col[BLEU] += v[BLEU]; - if (col[BLEU] > 64) { - col[BLEU] = 64; - v[BLEU] = -(RAND () % 4) - 1; - } - if (col[BLEU] < 0) { - col[BLEU] = 0; - v[BLEU] = (RAND () % 4) + 1; - } - - col[VERT] += v[VERT]; - if (col[VERT] > 200) { - col[VERT] = 200; - v[VERT] = -(RAND () % 3) - 2; - } - if (col[VERT] > col[ROUGE] + 20) { - col[VERT] = col[ROUGE] + 20; - v[VERT] = -(RAND () % 3) - 2; - v[ROUGE] = (RAND () % 4) + 1; - v[BLEU] = (RAND () % 4) + 1; - } - if (col[VERT] < 0) { - col[VERT] = 0; - v[VERT] = (RAND () % 3) + 2; - } - - col[ROUGE] += v[ROUGE]; - if (col[ROUGE] > 255) { - col[ROUGE] = 255; - v[ROUGE] = -(RAND () % 4) - 1; - } - if (col[ROUGE] > col[VERT] + 40) { - col[ROUGE] = col[VERT] + 40; - v[ROUGE] = -(RAND () % 4) - 1; - } - if (col[ROUGE] < 0) { - col[ROUGE] = 0; - v[ROUGE] = (RAND () % 4) + 1; - } - - col[ALPHA] += v[ALPHA]; - if (col[ALPHA] > 0) { - col[ALPHA] = 0; - v[ALPHA] = -(RAND () % 4) - 1; - } - if (col[ALPHA] < 0) { - col[ALPHA] = 0; - v[ALPHA] = (RAND () % 4) + 1; - } - - if (((col[ROUGE] < 64) && (col[VERT] > 32) && (col[VERT] < col[BLEU]) - && (col[BLEU] > 32) - && (RAND () % 20 == 0)) && (justChanged < 0)) { - mode = RAND () % 2 ? MOD_MER : MOD_MERVER; - justChanged = 250; - } - } - - couleur = (col[ALPHA] << (ALPHA * 8)) - | (col[BLEU] << (BLEU * 8)) - | (col[VERT] << (VERT * 8)) - | (col[ROUGE] << (ROUGE * 8)); -} - -/** VISUAL_FX WRAPPER FOR IFS */ - -static void ifs_vfx_apply(VisualFX *_this, Pixel *src, Pixel *dest, PluginInfo *goomInfo) { - - IfsData *data = (IfsData*)_this->fx_data; - if (!data->initalized) { - data->initalized = 1; - init_ifs(goomInfo, data); - } - ifs_update (goomInfo, dest, src, goomInfo->update.ifs_incr, data); - /*TODO: trouver meilleur soluce pour increment (mettre le code de gestion de l'ifs dans ce fichier: ifs_vfx_apply) */ -} - -static void ifs_vfx_init(VisualFX *_this, PluginInfo *info) { - - IfsData *data = (IfsData*)malloc(sizeof(IfsData)); - data->Root = (FRACTAL*)NULL; - data->initalized = 0; - _this->fx_data = data; -} - -static void ifs_vfx_free(VisualFX *_this) { - IfsData *data = (IfsData*)_this->fx_data; - release_ifs(data); - free(data); -} - -VisualFX ifs_visualfx_create(void) { - VisualFX vfx; - vfx.init = ifs_vfx_init; - vfx.free = ifs_vfx_free; - vfx.apply = ifs_vfx_apply; - return vfx; -} diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/ifs.h kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/ifs.h --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/ifs.h 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/ifs.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,27 +0,0 @@ -/* - * File created 11 april 2002 by JeKo - */ - -#ifndef IFS_H -#define IFS_H - -#include "goom_config.h" -#include "goom_graphic.h" -#include "goom_plugin_info.h" -#include "goom_visual_fx.h" - -VisualFX ifs_visualfx_create(void); - -/* init ifs for a (width)x(height) output. * / -void init_ifs (PluginInfo *goomInfo, int width, int height); - -/ * draw an ifs on the buffer (which size is width * height) - increment means that we draw 1/increment of the ifs's points * / -void ifs_update (PluginInfo *goomInfo, Pixel * buffer, Pixel * back, int width, int height, int increment); - -/ * free all ifs's data. * / -void release_ifs (void); -*/ - - -#endif diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/jitc_test.c kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/jitc_test.c --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/jitc_test.c 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/jitc_test.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,38 +0,0 @@ -#include "jitc_x86.h" -#include - -int main(int c, char **v) -{ - int i; - int j; - JitcX86Env *jitc = jitc_x86_env_new(0xffff); - JitcFunc func = jitc_prepare_func(jitc); - - jitc_add(jitc, "mov edx, $d", 0xffffffff); - jitc_add(jitc, "mov eax, $d", 40); - jitc_add(jitc, "mov ebx, $d", 2); - jitc_add(jitc, "idiv ebx"); - jitc_add(jitc, "mov eax, [$d]", 0xdeadbeaf); - - jitc_add(jitc, "sal edx, $d", 7); - jitc_add(jitc, "imul ecx"); - jitc_add(jitc, "idiv ecx"); - jitc_add(jitc, "imul $d[ecx]", 2); - jitc_add(jitc, "imul ecx, [ecx]"); - jitc_add(jitc, "mov ecx, $d", (char*)(&i)-12); - jitc_add(jitc, "dec $d[ecx]", 2); - jitc_add(jitc, "add ecx, $d", 12); - jitc_add(jitc, "dec [ecx]"); - jitc_add(jitc, "dec ecx"); - - JITC_FLD_pIMM32(jitc,&i); - JITC_FSTP_pIMM32(jitc,&j); - - jitc_validate_func(jitc); - func(); - - printf("i = 0x%08x\n", i); - - jitc_x86_delete(jitc); - return 0; -} diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/jitc_x86.c kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/jitc_x86.c --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/jitc_x86.c 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/jitc_x86.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,530 +0,0 @@ -#include "jitc_x86.h" - -#include -#include -#include - -#define PARAM_INT 1 -#define PARAM_FLOAT 2 -#define PARAM_REG 3 -#define PARAM_dispREG 4 -#define PARAM_DISP32 5 -#define PARAM_LABEL 6 -#define PARAM_NONE 666 - -typedef struct { - int id; - int i; - double f; - int reg; - int disp; - char label[256]; -} IParam; - -struct { - char *name; - int reg; -} RegsName[] = { - {"eax",EAX}, {"ebx",EBX}, {"ecx",ECX}, {"edx",EDX}, - {"edi",EDI}, {"esi",ESI}, {"ebp",EBP}, {"esp",ESP}, - {"st0",0}, {"st1",1}, {"st2",2}, {"st3",3}, - {"st4",4}, {"st5",5}, {"st6",6}, {"st7",7}, - {"mm0",0}, {"mm1",1}, {"mm2",2}, {"mm3",3}, - {"mm4",4}, {"mm5",5}, {"mm6",6}, {"mm7",7}, {NULL,0} -}; - -void modrm(JitcX86Env *jitc, int opcode, IParam *iparam) -{ - int dest = 0; - int src = 1; - int direction = 0x0; - unsigned int byte = 666; - unsigned int int32 = 0; - unsigned int need32 = 0; - - if ((iparam[0].id == PARAM_REG) && (iparam[1].id != PARAM_REG)) { - dest = 1; - src = 0; - direction = 0x02; - } - - if (iparam[src].id != PARAM_REG) { - fprintf(stderr, "JITC_x86: Invalid Instruction Parameters: %d %d.\n", iparam[0].id, iparam[1].id); - exit(1); - } - - if (iparam[dest].id == PARAM_REG) { - byte = ((int)JITC_MOD_REG_REG << 6) | (iparam[src].reg << 3) | (iparam[0].reg); - } - - else if (iparam[dest].id == PARAM_dispREG) - { - if (iparam[dest].disp == 0) - byte = ((int)JITC_MOD_pREG_REG << 6) | (iparam[src].reg << 3) | (iparam[dest].reg); - } - - else if (iparam[dest].id == PARAM_DISP32) - { - byte = ((int)JITC_MOD_pREG_REG << 6) | (iparam[src].reg << 3) | JITC_RM_DISP32; - need32 = 1; - int32 = iparam[dest].disp; - } - - if (byte == 666) { - fprintf(stderr, "JITC_x86: Invalid Instruction Parameters: %d %d.\n", iparam[0].id, iparam[1].id); - exit(1); - } - else { - if (opcode < 0x100) - JITC_ADD_UCHAR(jitc, opcode + direction); - else { - JITC_ADD_UCHAR(jitc, (opcode>>8)&0xff); - JITC_ADD_UCHAR(jitc, (opcode&0xff)/* + direction*/); - } - JITC_ADD_UCHAR(jitc, byte); - if (need32) - JITC_ADD_UINT(jitc, int32); - } -} - -static void imul_like_modrm_1param(JitcX86Env *jitc, int opcode, int digit, IParam *iparam) -{ - if (iparam[0].id == PARAM_REG) - { - JITC_ADD_UCHAR(jitc, opcode); - JITC_MODRM(jitc, 0x03, digit, iparam[0].reg); - return; - } - if (iparam[0].id == PARAM_dispREG) { - JITC_ADD_UCHAR(jitc, opcode); - if (iparam[0].disp == 0) - { - JITC_MODRM(jitc, 0x00, digit, iparam[0].reg); - } - else if ((iparam[0].disp & 0xff) == iparam[0].disp) - { - JITC_MODRM(jitc, 0x01, digit, iparam[0].reg); - JITC_ADD_UCHAR(jitc, iparam[0].disp); - } - else - { - JITC_MODRM(jitc, 0x02, digit, iparam[0].reg); - JITC_ADD_UINT(jitc, iparam[0].disp); - } - return; - } - if (iparam[0].id == PARAM_DISP32) { - JITC_ADD_UCHAR(jitc, opcode); - JITC_MODRM(jitc, JITC_MOD_pREG_REG, digit, JITC_RM_DISP32); - JITC_ADD_UINT(jitc, iparam[0].disp); - return; - } -} - -/* 1 byte encoded opcode including register... imm32 parameter */ -#define INSTR_1bReg_IMM32(opcode,dest,src) { \ - JITC_ADD_UCHAR(jitc, opcode + iparam[dest].reg); \ - JITC_ADD_UINT (jitc, (int)iparam[src].i); } - -typedef struct { - char *name; - int opcode; - int opcode_reg_int; - int digit_reg_int; - int opcode_eax_int; -} AddLikeInstr; - -static AddLikeInstr addLike[] = { - { "add", 0x01, 0x81, 0x00, 0x05 }, - { "and", 0x21, 0x81, 0x04, 0x25 }, - { "or", 0x0B, 0x81, 0x01, 0x0D }, - { "cmp", 0x39, 0x81, 0x07, 0x3D }, - { "imul", 0x0FAF, 0x69, 0x00, 0x10000 }, - { "sub", 0x29, 0x81, 0x05, 0X2D }, - { NULL, -1, -1, -1, -1 } -}; - -int checkAddLike(JitcX86Env *jitc, char *op, IParam *iparam, int nbParams) -{ - int i; - for (i=0;addLike[i].name;++i) - { - if (strcmp(op,addLike[i].name) == 0) - { - if ((iparam[0].id == PARAM_REG) && (iparam[1].id == PARAM_INT)) { - if ((iparam[0].reg == EAX) && (addLike[i].opcode_eax_int != 0x10000)) { - JITC_ADD_UCHAR(jitc, addLike[i].opcode_eax_int); - JITC_ADD_UINT(jitc, iparam[1].i); - return 1; - } - else { - JITC_ADD_UCHAR(jitc, addLike[i].opcode_reg_int); - JITC_MODRM(jitc, 0x03, addLike[i].digit_reg_int, iparam[0].reg); - JITC_ADD_UINT(jitc, iparam[1].i); - return 1; - } - } - else if ((iparam[0].id == PARAM_dispREG) && (iparam[1].id == PARAM_INT)) { - JITC_ADD_UCHAR(jitc, addLike[i].opcode_reg_int); - if ((iparam[0].disp & 0xff) == iparam[0].disp) - { - JITC_MODRM(jitc, 0x01, addLike[i].digit_reg_int, iparam[0].reg); - JITC_ADD_UCHAR(jitc, iparam[0].disp); - } - else - { - JITC_MODRM(jitc, 0x00, addLike[i].digit_reg_int, iparam[0].reg); - JITC_ADD_UINT(jitc, iparam[0].disp); - } - JITC_ADD_UINT(jitc, iparam[1].i); - return 1; - } - else if ((iparam[0].id == PARAM_DISP32) && (iparam[1].id == PARAM_INT)) { - JITC_ADD_UCHAR(jitc, addLike[i].opcode_reg_int); - JITC_MODRM(jitc, 0x00, addLike[i].digit_reg_int, 0x05); - JITC_ADD_UINT(jitc, iparam[0].disp); - JITC_ADD_UINT(jitc, iparam[1].i); - return 1; - } - else { - modrm(jitc, addLike[i].opcode, iparam); - return 1; - } - } - } - return 0; -} - -/** - * Check all kind of known instruction... perform special optimisations.. - */ -static void jitc_add_op(JitcX86Env *jitc, char *op, IParam *iparam, int nbParams) -{ - /* MOV */ - if (strcmp(op,"mov") == 0) - { - if ((iparam[0].id == PARAM_REG) && (iparam[1].id == PARAM_INT)) { - INSTR_1bReg_IMM32(0xb8,0,1); - } - else if ((iparam[0].id == PARAM_DISP32) && (iparam[1].id == PARAM_INT)) { - JITC_ADD_UCHAR(jitc, 0xc7); - JITC_MODRM(jitc, 0x00, 0x00, 0x05); - JITC_ADD_UINT(jitc, iparam[0].disp); - JITC_ADD_UINT(jitc, iparam[1].i); - } - else - modrm(jitc, 0x89, iparam); - return; - } - -#define IMUL_LIKE(_OP,_opcode,_digit)\ - if (strcmp(op, _OP) == 0) { \ - if (nbParams == 1) { \ - imul_like_modrm_1param(jitc, _opcode, _digit, iparam); \ - return; }} - -#define SHIFT_LIKE(_name,_op1,_op2,_digit) \ - if (strcmp(op, _name) == 0) { \ - if (iparam[1].id == PARAM_INT) { \ - if (iparam[1].i == 1) \ - imul_like_modrm_1param(jitc, _op1, _digit, iparam); \ - else { \ - imul_like_modrm_1param(jitc, _op2, _digit, iparam); \ - JITC_ADD_UCHAR(jitc, iparam[1].i); \ - } \ - return; \ - } \ - } - -#define POP_LIKE(_OP,_opcode) \ - if (strcmp(op, _OP) == 0) { \ - if (iparam[0].id == PARAM_REG) { \ - JITC_ADD_UCHAR(jitc, _opcode + iparam[0].reg); \ - return; } } - - IMUL_LIKE("neg", 0xf7, 0x03); - IMUL_LIKE("imul", 0xf7, 0x05); - IMUL_LIKE("idiv", 0xf7, 0x07); - - POP_LIKE("pop", 0x58); - POP_LIKE("push", 0x50); - - SHIFT_LIKE("sal", 0xd1, 0xc1, 0x04); - SHIFT_LIKE("sar", 0xd1, 0xc1, 0x07); - SHIFT_LIKE("shl", 0xd1, 0xc1, 0x04); - SHIFT_LIKE("shr", 0xd1, 0xc1, 0x05); - - /* INC */ - if (strcmp(op, "inc") == 0) { - if (iparam[0].id == PARAM_REG) { - JITC_ADD_UCHAR(jitc, 0x40 + iparam[0].reg); - return; - } - imul_like_modrm_1param(jitc, 0xff, 0x00, iparam); - return; - } - - /* DEC */ - if (strcmp(op, "dec") == 0) { - if (iparam[0].id == PARAM_REG) { - JITC_ADD_UCHAR(jitc, 0x48 + iparam[0].reg); - return; - } - imul_like_modrm_1param(jitc, 0xff, 0x01, iparam); - return; - } - - if (strcmp(op, "call") == 0) - { - if (iparam[0].id == PARAM_LABEL) { - jitc_add_used_label(jitc,iparam[0].label,jitc->used+1); - JITC_CALL(jitc,0); - return; - } - if (iparam[0].id == PARAM_INT) { - JITC_CALL(jitc,iparam[0].i); - return; - } - if (iparam[0].id == PARAM_dispREG) { - JITC_ADD_UCHAR(jitc,0xff); - JITC_ADD_UCHAR(jitc,0xd0+iparam[0].reg); - return; - } - } - -#define MONOBYTE_INSTR(_OP,_opcode) \ - if (strcmp(op, _OP) == 0) { \ - JITC_ADD_UCHAR(jitc, _opcode); \ - return; } - - MONOBYTE_INSTR("ret", 0xc3); - MONOBYTE_INSTR("leave", 0xc9); - MONOBYTE_INSTR("cdq", 0x99); - - /* JNE */ - if (strcmp(op, "jne") == 0) { - if (iparam[0].id == PARAM_LABEL) { - JITC_JUMP_COND_LABEL(jitc,COND_NOT_EQUAL,iparam[0].label); - return; - } - if (iparam[0].id == PARAM_INT) { - JITC_JUMP_COND(jitc,COND_NOT_EQUAL,iparam[0].i); - return; - } - } - - /* JE */ - if (strcmp(op, "je") == 0) { - if (iparam[0].id == PARAM_LABEL) { - JITC_JUMP_COND_LABEL(jitc,COND_EQUAL,iparam[0].label); - return; - } - if (iparam[0].id == PARAM_INT) { - JITC_JUMP_COND(jitc,COND_EQUAL,iparam[0].i); - return; - } - } - - /* ADD LIKE */ - if (checkAddLike(jitc, op, iparam, nbParams)) return; - - /* BSWAP : 0F C8+rd */ - - fprintf(stderr, "JITC_x86: Invalid Operation '%s'\n", op); - exit(1); -} - -/** - * Adds a new instruction to the just in time compiled function - */ -void jitc_add(JitcX86Env *jitc, const char *_instr, ...) -{ - char instr[256]; - char *op; - char *sparam[16]; int nbParam=0; int i; - IParam iparam[16]; - va_list ap; - strcpy(instr,_instr); - -#ifdef DISPLAY_GENCODE - printf("|"); -#endif - - op = strtok(instr, " ,"); - if (!op) return; - - /* decoupage en tokens */ - while ((sparam[nbParam] = strtok(NULL, " ,")) != NULL) if (strlen(sparam[nbParam])>0) nbParam++; - - /* Reconnaissance des parametres */ - va_start(ap, _instr); - for (i=0;i 0) { - if (strcmp(regname, RegsName[r].name) == 0) { - iparam[i].id = PARAM_dispREG; - iparam[i].reg = RegsName[r].reg; - iparam[i].disp = va_arg(ap, int); - } - } - if (sscanf(sparam[i], "[%3s]", regname) > 0) { - if (strcmp(regname, RegsName[r].name) == 0) { - iparam[i].id = PARAM_dispREG; - iparam[i].reg = RegsName[r].reg; - iparam[i].disp = 0; - } - } - } - } - if (iparam[i].id == PARAM_NONE) { - fprintf(stderr, "JITC_x86: Unrecognized parameter '%s'\n", sparam[i]); - exit(1); - } - } - va_end(ap); - - jitc_add_op(jitc, op, &(iparam[0]), nbParam); -#ifdef DISPLAY_GENCODE - printf(" ;;; %s", op); - for (i=0;i_memory = (unsigned char*)malloc(memory_size); - jitc->used = 0; - jitc->memory = (unsigned char*)((int)jitc->_memory + (32-((int)jitc->_memory)%32)%32); - - jitc->nbUsedLabel = 0; - jitc->nbKnownLabel = 0; - - jitc->usedLabel = (LabelAddr*)malloc(sizeof(LabelAddr) * JITC_MAXLABEL); - jitc->knownLabel = (LabelAddr*)malloc(sizeof(LabelAddr) * JITC_MAXLABEL); - - return jitc; -} - -void jitc_x86_delete(JitcX86Env *jitc) { - - free(jitc->usedLabel); - free(jitc->knownLabel); - free(jitc->_memory); - free(jitc); -} - -JitcFunc jitc_prepare_func(JitcX86Env *jitc) { - - JitcFunc ptr = 0; - jitc->used = (32 - jitc->used%32)%32; - ptr = (JitcFunc)&(jitc->memory[jitc->used]); - -#ifdef DISPLAY_GENCODE - printf("\n------------------------------------------\n"); - printf("-- Function Intro --\n"); - printf("------------------------------------------\n"); -#endif - - /* save the state */ - jitc_add(jitc,"push ebp"); - jitc_add(jitc,"mov ebp, esp"); - jitc_add(jitc,"sub esp, $d", 8); - JITC_PUSH_ALL(jitc); -#ifdef DISPLAY_GENCODE - printf("\n------------------------------------------\n"); -#endif - return ptr; -} - -void jitc_validate_func(JitcX86Env *jitc) { - -#ifdef DISPLAY_GENCODE - printf("\n------------------------------------------\n"); - printf("-- Function Outro --\n"); - printf("------------------------------------------\n"); -#endif - /* restore the state */ - JITC_POP_ALL(jitc); - jitc_add(jitc, "leave"); - jitc_add(jitc, "ret"); - jitc_resolve_labels(jitc); -#ifdef DISPLAY_GENCODE - printf("\n------------------------------------------\n"); -#endif -} - -void jitc_add_used_label(JitcX86Env *jitc, char *label, int where) { - - strncpy(jitc->usedLabel[jitc->nbUsedLabel].label, label, JITC_LABEL_SIZE); - jitc->usedLabel[jitc->nbUsedLabel].address = where; - jitc->nbUsedLabel++; -} - -void jitc_add_known_label(JitcX86Env *jitc, char *label, int where) { - -#ifdef DISPLAY_GENCODE - printf("%s:\n", label); -#endif - strncpy(jitc->knownLabel[jitc->nbKnownLabel].label, label, JITC_LABEL_SIZE); - jitc->knownLabel[jitc->nbKnownLabel].address = where; - jitc->nbKnownLabel++; -} - -void jitc_resolve_labels(JitcX86Env *jitc) { - - int i,j; - for (i=jitc->nbUsedLabel;i-->0;) { - - LabelAddr used = jitc->usedLabel[i]; - for (j=jitc->nbKnownLabel;j-->0;) { - - LabelAddr known = jitc->knownLabel[j]; - if (strcmp(known.label, used.label) == 0) { - int *offset = (int*)&(jitc->memory[used.address]); - *offset = known.address - used.address - 4; /* always using long offset */ - break; - } - } - } - jitc->nbUsedLabel = jitc->nbKnownLabel = 0; -} diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/jitc_x86.h kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/jitc_x86.h --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/jitc_x86.h 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/jitc_x86.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,214 +0,0 @@ -/** - * Copyright (c)2004 Jean-Christophe Hoelt - */ - -#include -#include - -#define JITC_MAXLABEL 1024 -#define JITC_LABEL_SIZE 64 - -/** - * low level macros - */ - - /* {{{ Registres Generaux */ -#define EAX 0 -#define ECX 1 -#define EDX 2 -#define EBX 3 -#define ESP 4 -#define EBP 5 -#define ESI 6 -#define EDI 7 - /* }}} */ - /* {{{ Registres MMX */ -#define MM0 0 -#define MM1 1 -#define MM2 2 -#define MM3 3 -#define MM4 4 -#define MM5 5 -#define MM6 6 -#define MM7 7 - /* }}} */ - /* {{{ Registres SSE*/ -#define XMM0 0 -#define XMM1 1 -#define XMM2 2 -#define XMM3 3 -#define XMM4 4 -#define XMM5 5 -#define XMM6 6 -#define XMM7 7 - /* }}} */ - /* {{{ Alias aux registres */ -#define R0 0 -#define R1 1 -#define R2 2 -#define R3 3 -#define R4 4 -#define R5 5 -#define R6 6 -#define R7 7 - /* }}} */ - - /* {{{ Conditions */ -#define COND_OVERFLOW 0 -#define COND_NO_OVERFLOW 1 -#define COND_BELOW 2 -#define COND_NOT_BELOW 3 -#define COND_EQUAL 4 -#define COND_ZERO 4 -#define COND_NOT_EQUAL 5 -#define COND_NOT_ZERO 5 -#define COND_NOT_ABOVE 6 -#define COND_ABOVE 7 -#define COND_SIGN 8 -#define COND_NOT_SIGN 9 -#define COND_EVEN 10 -#define COND_ODD 11 -#define COND_LESS_THAN 12 -#define COND_GREATER_EQUAL 13 -#define COND_LESS_EQUAL 14 -#define COND_GREATER_THAN 15 - /* }}} */ - -typedef int (*JitcFunc)(void); - -typedef struct _LABEL_ADDR { - char label[JITC_LABEL_SIZE]; - int address; -} LabelAddr; - -typedef struct _JITC_X86_ENV { - unsigned char *_memory; - unsigned char *memory; - unsigned int used; - - int nbUsedLabel; - int nbKnownLabel; - LabelAddr *usedLabel; - LabelAddr *knownLabel; -} JitcX86Env; - -#define DISPLAY_GENCODE -/*#define DISPLAY_GENCODE_HEXA*/ - -#ifdef DISPLAY_GENCODE_HEXA - #define JITC_ADD_UCHAR(jitc,op) printf(" 0x%02x", op) && (jitc->memory[jitc->used++]=op) -#else - #define JITC_ADD_UCHAR(jitc,op) (jitc->memory[jitc->used++]=op) -#endif - -#define JITC_ADD_USHORT(jitc,i) { JITC_ADD_UCHAR(jitc,i&0xff); JITC_ADD_UCHAR(jitc,(i>>8)&0xff); } -#define JITC_ADD_UINT(jitc,i) { \ - JITC_ADD_UCHAR(jitc,i&0xff); \ - JITC_ADD_UCHAR(jitc,(i>>8)&0xff); \ - JITC_ADD_UCHAR(jitc,(i>>16)&0xff); \ - JITC_ADD_UCHAR(jitc,(i>>24)&0xff); \ -} -#define JITC_ADD_2UCHAR(jitc,op1,op2) {JITC_ADD_UCHAR(jitc,op1); JITC_ADD_UCHAR(jitc,op2);} - -#define JITC_MODRM(jitc,mod,reg,rm) { JITC_ADD_UCHAR(jitc,((int)mod<<6)|((int)reg<<3)|((int)rm)); } - -/* special values for R/M */ -#define JITC_RM_DISP32 0x05 - -#define JITC_MOD_pREG_REG 0x00 -#define JITC_MOD_disp8REG_REG 0x01 -#define JITC_MOD_disp32REG_REG 0x02 -#define JITC_MOD_REG_REG 0x03 -/* cf 24319101 p.27 */ - -#define JITC_OP_REG_REG(jitc,op,dest,src) { JITC_ADD_UCHAR(jitc,op); JITC_ADD_UCHAR(jitc,0xc0+(src<<3)+dest); } -#define JITC_OP_REG_pREG(jitc,op,dest,src) { JITC_ADD_UCHAR(jitc,op); JITC_ADD_UCHAR(jitc,(dest<<3)+src); } -#define JITC_OP_pREG_REG(jitc,op,dest,src) { JITC_ADD_UCHAR(jitc,op); JITC_ADD_UCHAR(jitc,(src<<3)+dest); } - -/** - * "high" level macro - */ - -#define JITC_LOAD_REG_IMM32(jitc,reg,imm32) { JITC_ADD_UCHAR (jitc,0xb8+reg); JITC_ADD_UINT(jitc,(int)(imm32)); } -#define JITC_LOAD_REG_REG(jitc,dest,src) { JITC_OP_REG_REG (jitc,0x89,dest,src); } - -#define JITC_LOAD_REG_pREG(jitc,dest,src) { JITC_OP_REG_pREG(jitc,0x8b,dest,src); } -#define JITC_LOAD_pREG_REG(jitc,dest,src) { JITC_OP_pREG_REG(jitc,0x89,dest,src); } - -#define JITC_DEC_REG(jitc,reg) { JITC_ADD_UCHAR (jitc,0x48+reg); } -#define JITC_INC_REG(jitc,reg) { JITC_ADD_UCHAR (jitc,0x40+reg); } - -#define JITC_ADD_REG_REG(jitc,dest,src) { JITC_OP_REG_REG (jitc,0x01,dest,src); } -#define JITC_ADD_REG_IMM32(jitc,reg,imm32) { JITC_ADD_UCHAR (jitc,0x81);\ - JITC_ADD_UCHAR (jitc,0xc0+reg);\ - JITC_ADD_UINT (jitc,(int)imm32); } - -#define JITC_AND_REG_REG(jitc,dest,src) { JITC_OP_REG_REG (jitc,0x21,dest,src); } -#define JITC_CMP_REG_REG(jitc,dest,src) { JITC_OP_REG_REG (jitc,0x39,dest,src); } -#define JITC_CMP_REG_IMM32(jitc,reg,imm32) { JITC_ADD_2UCHAR (jitc,0x81,0xf8+reg); \ - JITC_ADD_UINT (jitc,(int)imm32); } - -#define JITC_IDIV_EAX_REG(jitc,reg) { JITC_ADD_2UCHAR(jitc, 0xf7, 0xf8+reg); } -#define JITC_IMUL_EAX_REG(jitc,reg) { JITC_ADD_2UCHAR(jitc, 0xf7, 0xe8+reg); } - -/*#define JITC_SUB_REG_REG(jitc,dest,src) { JITC_OP_REG_REG (jitc,0x29,dest,src); } -#define JITC_SUB_EAX_IMM32(jitc,imm32) { JITC_ADD_UCHAR (jitc,0x2d); JITC_ADD_UINT(jitc,(int)imm32); } -#define JITC_SUB_REG_IMM32(jitc,reg,imm32) { JITC_ADD_2UCHAR (jitc,0x81, 0xe8+reg);\ - JITC_ADD_UINT (jitc,(int)imm32); }*/ -#define JITC_SUB_REG_IMM8(jitc,reg,imm8) { JITC_ADD_2UCHAR (jitc,0x83, 0xe8+reg);\ - JITC_ADD_UCHAR(jitc,imm8); } - -/* Floating points */ - -#define JITC_FLD_pIMM32(jitc,address) { JITC_ADD_UCHAR (jitc, 0xD9); \ - JITC_MODRM (jitc, 0x00, 0x00,JITC_RM_DISP32); \ - JITC_ADD_UINT(jitc,(int)(address)); } -#define JITC_FLD_STi(jict,reg) { JITC_ADD_2UCHAR (jitc, 0xD9, 0xC0+reg); } - -#define JITC_FST_pIMM32(jitc,address) { JITC_ADD_UCHAR (jitc, 0xD9); \ - JITC_MODRM (jitc, 0x00, 0x02,JITC_RM_DISP32); \ - JITC_ADD_UINT(jitc,(int)(ADDRess)); } -#define JITC_FST_STi(jict,reg) { JITC_ADD_2UCHAR (jitc, 0xDD, 0xD0+reg); } - -#define JITC_FSTP_pIMM32(jitc,address) { JITC_ADD_UCHAR (jitc, 0xD9); \ - JITC_MODRM (jitc, 0x00, 0x03, JITC_RM_DISP32); \ - JITC_ADD_UINT(jitc,(int)(address)); } -#define JITC_FSTP_STi(jict,reg) { JITC_ADD_2UCHAR (jitc, 0xDD, 0xD8+reg); } - -#define JITC_FADD - -/* Jumps */ - -#define JITC_ADD_LABEL(jitc,label) { jitc_add_known_label(jitc,label,jitc->used); } - -#define JITC_JUMP(jitc,offset) { JITC_ADD_UCHAR(jitc,0xe9); JITC_ADD_UINT(jitc,offset); } -#define JITC_JUMP_LABEL(jitc,label) { jitc_add_used_label(jitc,label,jitc->used+1); JITC_JUMP(jitc,0); } -#define JITC_JUMP_COND(jitc,cond,offset) { JITC_ADD_UCHAR(jitc,0x0f);\ - JITC_ADD_UCHAR(jitc,0x80+cond);\ - JITC_ADD_UINT(jitc,offset); } -#define JITC_JUMP_COND_LABEL(jitc,cond,label) { jitc_add_used_label(jitc,label,jitc->used+2); JITC_JUMP_COND(jitc,cond,0); } -#define JITC_CALL(jitc,function) { int __offset__ = (int)function - (int)(&jitc->memory[jitc->used+5]);\ - JITC_ADD_UCHAR(jitc,0xe8); JITC_ADD_UINT(jitc,__offset__); } -/*#define JITC_CALL_pREG(jitc,reg) { JITC_ADD_UCHAR(jitc,0xff); JITC_ADD_UCHAR(jitc,0xd0+reg); } -#define JITC_CALL_LABEL(jitc,label) { jitc_add_used_label(jitc,label,jitc->used+1); JITC_CALL(jitc,0); }*/ - -/* save all registers (except EAX,ESP,EBP) */ -#define JITC_PUSH_ALL(jitc) { jitc_add(jitc,"push ecx"); jitc_add(jitc,"push edx"); jitc_add(jitc,"push ebx"); \ - jitc_add(jitc,"push esi"); jitc_add(jitc,"push edi"); } - -/* restore all registers (except EAX,ESP,EBP) */ -#define JITC_POP_ALL(jitc) { jitc_add(jitc,"pop edi"); jitc_add(jitc,"pop esi"); jitc_add(jitc,"pop ebx"); \ - jitc_add(jitc,"pop edx"); jitc_add(jitc,"pop ecx"); } - -/* public methods */ -JitcX86Env *jitc_x86_env_new(int memory_size); -JitcFunc jitc_prepare_func(JitcX86Env *jitc); -void jitc_add(JitcX86Env *jitc, const char *instr, ...); -void jitc_validate_func(JitcX86Env *jitc); -void jitc_x86_delete(JitcX86Env *jitc); - - -/* private methods */ -void jitc_add_used_label(JitcX86Env *jitc, char *label, int where); -void jitc_add_known_label(JitcX86Env *jitc, char *label, int where); -void jitc_resolve_labels(JitcX86Env *jitc); diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/lines.c kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/lines.c --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/lines.c 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/lines.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,239 +0,0 @@ -/* - * lines.c - */ - -#include "lines.h" -#include -#include -#include -#include "goom_tools.h" -#include "drawmethods.h" -#include "goom_plugin_info.h" - -static inline unsigned char lighten (unsigned char value, float power) -{ - int val = value; - float t = (float) val * log10(power) / 2.0; - - if (t > 0) { - val = (int) t; /* (32.0f * log (t)); */ - if (val > 255) - val = 255; - if (val < 0) - val = 0; - return val; - } - else { - return 0; - } -} - -static void lightencolor (guint32 *col, float power) -{ - unsigned char *color; - - color = (unsigned char *) col; - *color = lighten (*color, power); - color++; - *color = lighten (*color, power); - color++; - *color = lighten (*color, power); - color++; - *color = lighten (*color, power); -} - - - -static void -genline (int id, float param, GMUnitPointer * l, int rx, int ry) -{ - int i; - - switch (id) { - case GML_HLINE: - for (i = 0; i < 512; i++) { - l[i].x = ((float) i * rx) / 512.0f; - l[i].y = param; - l[i].angle = M_PI / 2.0f; - } - return; - case GML_VLINE: - for (i = 0; i < 512; i++) { - l[i].y = ((float) i * ry) / 512.0f; - l[i].x = param; - l[i].angle = 0.0f; - } - return; - case GML_CIRCLE: - for (i = 0; i < 512; i++) { - float cosa, sina; - - l[i].angle = 2.0f * M_PI * (float) i / 512.0f; - cosa = param * cos (l[i].angle); - sina = param * sin (l[i].angle); - l[i].x = ((float) rx / 2.0f) + cosa; - l[i].y = (float) ry / 2.0f + sina; - } - return; - } -} - -static guint32 getcouleur (int mode) -{ - switch (mode) { - case GML_RED: - return (230 << (ROUGE * 8)) | (120 << (VERT * 8)) | (18 << (BLEU * 8)); - case GML_ORANGE_J: - return (120 << (VERT * 8)) | (252 << (ROUGE * 8)) | (18 << (BLEU * 8)); - case GML_ORANGE_V: - return (160 << (VERT * 8)) | (236 << (ROUGE * 8)) | (40 << (BLEU * 8)); - case GML_BLEUBLANC: - return (40 << (BLEU * 8)) | (220 << (ROUGE * 8)) | (140 << (VERT * 8)); - case GML_VERT: - return (200 << (VERT * 8)) | (80 << (ROUGE * 8)) | (18 << (BLEU * 8)); - case GML_BLEU: - return (250 << (BLEU * 8)) | (30 << (VERT * 8)) | (80 << (ROUGE * 8)); - case GML_BLACK: - return (16 << (BLEU * 8)) | (16 << (VERT * 8)) | (16 << (ROUGE * 8)); - } - return 0; -} - -void -goom_lines_set_res (GMLine * gml, int rx, int ry) -{ - if (gml != NULL) { - gml->screenX = rx; - gml->screenY = ry; - - genline (gml->IDdest, gml->param, gml->points2, rx, ry); - } -} - - -static void -goom_lines_move (GMLine * l) -{ - int i; - unsigned char *c1, *c2; - - for (i = 0; i < 512; i++) { - l->points[i].x = (l->points2[i].x + 39.0f * l->points[i].x) / 40.0f; - l->points[i].y = (l->points2[i].y + 39.0f * l->points[i].y) / 40.0f; - l->points[i].angle = - (l->points2[i].angle + 39.0f * l->points[i].angle) / 40.0f; - } - - c1 = (unsigned char *) &l->color; - c2 = (unsigned char *) &l->color2; - for (i = 0; i < 4; i++) { - int cc1, cc2; - - cc1 = *c1; - cc2 = *c2; - *c1 = (unsigned char) ((cc1 * 63 + cc2) >> 6); - ++c1; - ++c2; - } - - l->power += l->powinc; - if (l->power < 1.1f) { - l->power = 1.1f; - l->powinc = (float) (goom_irand(l->goomInfo->gRandom,20) + 10) / 300.0f; - } - if (l->power > 17.5f) { - l->power = 17.5f; - l->powinc = -(float) (goom_irand(l->goomInfo->gRandom,20) + 10) / 300.0f; - } - - l->amplitude = (99.0f * l->amplitude + l->amplitudeF) / 100.0f; -} - -void -goom_lines_switch_to (GMLine * gml, int IDdest, - float param, float amplitude, int col) -{ - genline (IDdest, param, gml->points2, gml->screenX, gml->screenY); - gml->IDdest = IDdest; - gml->param = param; - gml->amplitudeF = amplitude; - gml->color2 = getcouleur (col); -} - -GMLine * -goom_lines_init (PluginInfo *goomInfo, int rx, int ry, - int IDsrc, float paramS, int coulS, - int IDdest, float paramD, int coulD) -{ - GMLine *l = (GMLine *) malloc (sizeof (GMLine)); - - l->goomInfo = goomInfo; - - l->points = (GMUnitPointer *) malloc (512 * sizeof (GMUnitPointer)); - l->points2 = (GMUnitPointer *) malloc (512 * sizeof (GMUnitPointer)); - l->nbPoints = 512; - - l->IDdest = IDdest; - l->param = paramD; - - l->amplitude = l->amplitudeF = 1.0f; - - genline (IDsrc, paramS, l->points, rx, ry); - genline (IDdest, paramD, l->points2, rx, ry); - - l->color = getcouleur (coulS); - l->color2 = getcouleur (coulD); - - l->screenX = rx; - l->screenY = ry; - - l->power = 0.0f; - l->powinc = 0.01f; - - goom_lines_switch_to (l, IDdest, paramD, 1.0f, coulD); - - return l; -} - -void -goom_lines_free (GMLine ** l) -{ - free ((*l)->points); - free ((*l)->points2); - free (*l); - l = NULL; -} - -void goom_lines_draw (PluginInfo *plug, GMLine * line, gint16 data[512], Pixel *p) -{ - if (line != NULL) { - int i, x1, y1; - guint32 color = line->color; - GMUnitPointer *pt = &(line->points[0]); - - float cosa = cos (pt->angle) / 1000.0f; - float sina = sin (pt->angle) / 1000.0f; - - lightencolor (&color, line->power); - - x1 = (int) (pt->x + cosa * line->amplitude * data[0]); - y1 = (int) (pt->y + sina * line->amplitude * data[0]); - - for (i = 1; i < 512; i++) { - int x2, y2; - GMUnitPointer *pt = &(line->points[i]); - - float cosa = cos (pt->angle) / 1000.0f; - float sina = sin (pt->angle) / 1000.0f; - - x2 = (int) (pt->x + cosa * line->amplitude * data[i]); - y2 = (int) (pt->y + sina * line->amplitude * data[i]); - - plug->methods.draw_line (p, x1, y1, x2, y2, color, line->screenX, line->screenY); - - x1 = x2; - y1 = y2; - } - goom_lines_move (line); - } -} diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/lines.h kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/lines.h --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/lines.h 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/lines.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,81 +0,0 @@ -#ifndef _LINES_H -#define _LINES_H - -/* - * lines.h - * Goom - * Copyright (c) 2000-2003 iOS-software. All rights reserved. - */ - -#include "goom_typedefs.h" -#include "goom_graphic.h" -#include "goom_config.h" - -struct _GMUNITPOINTER -{ - float x; - float y; - float angle; -}; - -/* tableau de points */ -struct _GMLINE -{ - - GMUnitPointer *points; - GMUnitPointer *points2; - int IDdest; - float param; - float amplitudeF; - float amplitude; - - int nbPoints; - guint32 color; /* pour l'instant je stocke la couleur a terme, on stockera le mode couleur et l'on animera */ - guint32 color2; - - int screenX; - int screenY; - - float power; - float powinc; - - PluginInfo *goomInfo; -}; - -/* les ID possibles */ - -#define GML_CIRCLE 0 -/* (param = radius) */ - -#define GML_HLINE 1 -/* (param = y) */ - -#define GML_VLINE 2 -/* (param = x) */ - -/* les modes couleur possible (si tu mets un autre c'est noir) */ - -#define GML_BLEUBLANC 0 -#define GML_RED 1 -#define GML_ORANGE_V 2 -#define GML_ORANGE_J 3 -#define GML_VERT 4 -#define GML_BLEU 5 -#define GML_BLACK 6 - -/* construit un effet de line (une ligne horitontale pour commencer) */ -GMLine *goom_lines_init (PluginInfo *goomInfo, int rx, int ry, - int IDsrc, float paramS, int modeCoulSrc, - int IDdest, float paramD, int modeCoulDest); - -void goom_lines_switch_to (GMLine * gml, int IDdest, float param, - float amplitude, - int modeCoul); - -void goom_lines_set_res (GMLine * gml, int rx, int ry); - -void goom_lines_free (GMLine ** gml); - -void goom_lines_draw (PluginInfo *plugInfo, GMLine * gml, gint16 data[512], Pixel *p); - -#endif /* _LINES_H */ diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/Makefile.am kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/Makefile.am --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/Makefile.am 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/Makefile.am 1970-01-01 00:00:00.000000000 +0000 @@ -1,34 +0,0 @@ -# libgoom2 - -if HAVE_MMX -MMX_FILES=mmx.c xmmx.c -else -MMX_FILES= -endif - -if HAVE_PPC -PPC_FILES=ppc_zoom_ultimate.s ppc_drawings.s -else -PPC_FILES= -endif - -goom2_lib_LTLIBRARIES = libgoom2.la -goom2_libdir = $(libdir) - -goom2_library_includedir=$(includedir)/goom -goom2_library_include_HEADERS = goom.h goom_plugin_info.h goom_typedefs.h goom_graphic.h goom_config_param.h goom_visual_fx.h goom_filters.h goom_tools.h goomsl.h goomsl_hash.h goomsl_heap.h goom_tools.h goom_config.h -libgoom2_la_LDFLAGS = -export-dynamic -export-symbols-regex "goom.*" -libgoom2_la_SOURCES = \ - goomsl_yacc.y goomsl_lex.l goomsl.c goomsl_hash.c goomsl_heap.c \ - goom_tools.c $(MMX_FILES) $(PPC_FILES) \ - config_param.c convolve_fx.c filters.c \ - flying_stars_fx.c gfontlib.c gfontrle.c \ - goom_core.c graphic.c ifs.c lines.c \ - mathtools.c sound_tester.c surf3d.c \ - tentacle3d.c plugin_info.c \ - v3d.c drawmethods.c \ - cpu_info.c - -AM_YFLAGS=-d - -noinst_HEADERS = mmx.h diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/mathtools.c kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/mathtools.c --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/mathtools.c 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/mathtools.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,84 +0,0 @@ -/*---------------------------------------------------------------------------*/ -/* -** mathtools.c -** Goom Project -** -** Created by Jeko on Sun Jul 20 2003 - ** Copyright (c) 2003 iOS. All rights reserved. -*/ -/*---------------------------------------------------------------------------*/ - -#include "mathtools.h" - -float sin256[256] = { - 0,0.0245412,0.0490677,0.0735646,0.0980171,0.122411,0.14673,0.170962 - ,0.19509,0.219101,0.24298,0.266713,0.290285,0.313682,0.33689,0.359895 - ,0.382683,0.405241,0.427555,0.449611,0.471397,0.492898,0.514103,0.534998 - ,0.55557,0.575808,0.595699,0.615232,0.634393,0.653173,0.671559,0.689541 - ,0.707107,0.724247,0.740951,0.757209,0.77301,0.788346,0.803208,0.817585 - ,0.83147,0.844854,0.857729,0.870087,0.881921,0.893224,0.903989,0.91421 - ,0.92388,0.932993,0.941544,0.949528,0.95694,0.963776,0.970031,0.975702 - ,0.980785,0.985278,0.989177,0.99248,0.995185,0.99729,0.998795,0.999699 - ,1,0.999699,0.998795,0.99729,0.995185,0.99248,0.989177,0.985278 - ,0.980785,0.975702,0.970031,0.963776,0.95694,0.949528,0.941544,0.932993 - ,0.92388,0.91421,0.903989,0.893224,0.881921,0.870087,0.857729,0.844854 - ,0.83147,0.817585,0.803208,0.788346,0.77301,0.757209,0.740951,0.724247 - ,0.707107,0.689541,0.671559,0.653173,0.634393,0.615232,0.595699,0.575808 - ,0.55557,0.534998,0.514103,0.492898,0.471397,0.449611,0.427555,0.405241 - ,0.382683,0.359895,0.33689,0.313682,0.290285,0.266713,0.24298,0.219101 - ,0.19509,0.170962,0.14673,0.122411,0.0980171,0.0735646,0.0490677,0.0245412 - ,1.22465e-16,-0.0245412,-0.0490677,-0.0735646,-0.0980171,-0.122411,-0.14673,-0.170962 - ,-0.19509,-0.219101,-0.24298,-0.266713,-0.290285,-0.313682,-0.33689,-0.359895 - ,-0.382683,-0.405241,-0.427555,-0.449611,-0.471397,-0.492898,-0.514103,-0.534998 - ,-0.55557,-0.575808,-0.595699,-0.615232,-0.634393,-0.653173,-0.671559,-0.689541 - ,-0.707107,-0.724247,-0.740951,-0.757209,-0.77301,-0.788346,-0.803208,-0.817585 - ,-0.83147,-0.844854,-0.857729,-0.870087,-0.881921,-0.893224,-0.903989,-0.91421 - ,-0.92388,-0.932993,-0.941544,-0.949528,-0.95694,-0.963776,-0.970031,-0.975702 - ,-0.980785,-0.985278,-0.989177,-0.99248,-0.995185,-0.99729,-0.998795,-0.999699 - ,-1,-0.999699,-0.998795,-0.99729,-0.995185,-0.99248,-0.989177,-0.985278 - ,-0.980785,-0.975702,-0.970031,-0.963776,-0.95694,-0.949528,-0.941544,-0.932993 - ,-0.92388,-0.91421,-0.903989,-0.893224,-0.881921,-0.870087,-0.857729,-0.844854 - ,-0.83147,-0.817585,-0.803208,-0.788346,-0.77301,-0.757209,-0.740951,-0.724247 - ,-0.707107,-0.689541,-0.671559,-0.653173,-0.634393,-0.615232,-0.595699,-0.575808 - ,-0.55557,-0.534998,-0.514103,-0.492898,-0.471397,-0.449611,-0.427555,-0.405241 - ,-0.382683,-0.359895,-0.33689,-0.313682,-0.290285,-0.266713,-0.24298,-0.219101 - ,-0.19509,-0.170962,-0.14673,-0.122411,-0.0980171,-0.0735646,-0.0490677,-0.0245412 - -}; - -float cos256[256] = { - 0,0.999699,0.998795,0.99729,0.995185,0.99248,0.989177,0.985278 - ,0.980785,0.975702,0.970031,0.963776,0.95694,0.949528,0.941544,0.932993 - ,0.92388,0.91421,0.903989,0.893224,0.881921,0.870087,0.857729,0.844854 - ,0.83147,0.817585,0.803208,0.788346,0.77301,0.757209,0.740951,0.724247 - ,0.707107,0.689541,0.671559,0.653173,0.634393,0.615232,0.595699,0.575808 - ,0.55557,0.534998,0.514103,0.492898,0.471397,0.449611,0.427555,0.405241 - ,0.382683,0.359895,0.33689,0.313682,0.290285,0.266713,0.24298,0.219101 - ,0.19509,0.170962,0.14673,0.122411,0.0980171,0.0735646,0.0490677,0.0245412 - ,6.12323e-17,-0.0245412,-0.0490677,-0.0735646,-0.0980171,-0.122411,-0.14673,-0.170962 - ,-0.19509,-0.219101,-0.24298,-0.266713,-0.290285,-0.313682,-0.33689,-0.359895 - ,-0.382683,-0.405241,-0.427555,-0.449611,-0.471397,-0.492898,-0.514103,-0.534998 - ,-0.55557,-0.575808,-0.595699,-0.615232,-0.634393,-0.653173,-0.671559,-0.689541 - ,-0.707107,-0.724247,-0.740951,-0.757209,-0.77301,-0.788346,-0.803208,-0.817585 - ,-0.83147,-0.844854,-0.857729,-0.870087,-0.881921,-0.893224,-0.903989,-0.91421 - ,-0.92388,-0.932993,-0.941544,-0.949528,-0.95694,-0.963776,-0.970031,-0.975702 - ,-0.980785,-0.985278,-0.989177,-0.99248,-0.995185,-0.99729,-0.998795,-0.999699 - ,-1,-0.999699,-0.998795,-0.99729,-0.995185,-0.99248,-0.989177,-0.985278 - ,-0.980785,-0.975702,-0.970031,-0.963776,-0.95694,-0.949528,-0.941544,-0.932993 - ,-0.92388,-0.91421,-0.903989,-0.893224,-0.881921,-0.870087,-0.857729,-0.844854 - ,-0.83147,-0.817585,-0.803208,-0.788346,-0.77301,-0.757209,-0.740951,-0.724247 - ,-0.707107,-0.689541,-0.671559,-0.653173,-0.634393,-0.615232,-0.595699,-0.575808 - ,-0.55557,-0.534998,-0.514103,-0.492898,-0.471397,-0.449611,-0.427555,-0.405241 - ,-0.382683,-0.359895,-0.33689,-0.313682,-0.290285,-0.266713,-0.24298,-0.219101 - ,-0.19509,-0.170962,-0.14673,-0.122411,-0.0980171,-0.0735646,-0.0490677,-0.0245412 - ,-1.83697e-16,0.0245412,0.0490677,0.0735646,0.0980171,0.122411,0.14673,0.170962 - ,0.19509,0.219101,0.24298,0.266713,0.290285,0.313682,0.33689,0.359895 - ,0.382683,0.405241,0.427555,0.449611,0.471397,0.492898,0.514103,0.534998 - ,0.55557,0.575808,0.595699,0.615232,0.634393,0.653173,0.671559,0.689541 - ,0.707107,0.724247,0.740951,0.757209,0.77301,0.788346,0.803208,0.817585 - ,0.83147,0.844854,0.857729,0.870087,0.881921,0.893224,0.903989,0.91421 - ,0.92388,0.932993,0.941544,0.949528,0.95694,0.963776,0.970031,0.975702 - ,0.980785,0.985278,0.989177,0.99248,0.995185,0.99729,0.998795,0.999699 - -}; - diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/mathtools.h kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/mathtools.h --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/mathtools.h 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/mathtools.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,36 +0,0 @@ -#ifndef MATHTOOLS_H -#define MATHTOOLS_H - - -#define _double2fixmagic (68719476736.0*1.5) -/* 2^36 * 1.5, (52-_shiftamt=36) uses limited precisicion to floor */ -#define _shiftamt 16 -/* 16.16 fixed point representation */ - -#if BigEndian_ -#define iexp_ 0 -#define iman_ 1 -#else -#define iexp_ 1 -#define iman_ 0 -#endif /* BigEndian_ */ - -/* TODO: this optimization is very efficient: put it again when all works -#ifdef HAVE_MMX -#define F2I(dbl,i) {double d = dbl + _double2fixmagic; i = ((int*)&d)[iman_] >> _shiftamt;} -#else*/ -#define F2I(dbl,i) i=(int)dbl; -/*#endif*/ - -#if 0 -#define SINCOS(f,s,c) \ - __asm__ __volatile__ ("fsincos" : "=t" (c), "=u" (s) : "0" (f)) -#else -#define SINCOS(f,s,c) {s=sin(f);c=cos(f);} -#endif - -extern float sin256[256]; -extern float cos256[256]; - -#endif - diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/mmx.c kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/mmx.c --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/mmx.c 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/mmx.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,275 +0,0 @@ -#ifdef HAVE_MMX - -#define BUFFPOINTNB 16 -#define BUFFPOINTMASK 0xffff -#define BUFFINCR 0xff - -#include "mmx.h" -#include "goom_graphic.h" - -#define sqrtperte 16 -// faire : a % sqrtperte <=> a & pertemask -#define PERTEMASK 0xf -// faire : a / sqrtperte <=> a >> PERTEDEC -#define PERTEDEC 4 - -int mmx_supported (void) { - return (mm_support()&0x1); -} - -void zoom_filter_mmx (int prevX, int prevY, - Pixel *expix1, Pixel *expix2, - int *brutS, int *brutD, int buffratio, - int precalCoef[16][16]) -{ - unsigned int ax = (prevX-1)<> BUFFPOINTNB); - brutSmypos = brutS[myPos2]; - py = brutSmypos + (((brutD[myPos2] - brutSmypos)*buffratio) >> BUFFPOINTNB); - - if ((py>=ay) || (px>=ax)) { - pos=coeffs=0; - } - else { - pos = ((px >> PERTEDEC) + prevX * (py >> PERTEDEC)); - // coef en modulo 15 - coeffs = precalCoef [px & PERTEMASK][py & PERTEMASK]; - } - - __asm__ __volatile__ ( - "movd %2, %%mm6 \n\t" - - /* recuperation des deux premiers pixels dans mm0 et mm1 */ - "movq (%3,%1,4), %%mm0 \n\t" /* b1-v1-r1-a1-b2-v2-r2-a2 */ - "movq %%mm0, %%mm1 \n\t" /* b1-v1-r1-a1-b2-v2-r2-a2 */ - - /* depackage du premier pixel */ - "punpcklbw %%mm7, %%mm0 \n\t" /* 00-b2-00-v2-00-r2-00-a2 */ - - "movq %%mm6, %%mm5 \n\t" /* ??-??-??-??-c4-c3-c2-c1 */ - /* depackage du 2ieme pixel */ - "punpckhbw %%mm7, %%mm1 \n\t" /* 00-b1-00-v1-00-r1-00-a1 */ - - /* extraction des coefficients... */ - "punpcklbw %%mm5, %%mm6 \n\t" /* c4-c4-c3-c3-c2-c2-c1-c1 */ - "movq %%mm6, %%mm4 \n\t" /* c4-c4-c3-c3-c2-c2-c1-c1 */ - "movq %%mm6, %%mm5 \n\t" /* c4-c4-c3-c3-c2-c2-c1-c1 */ - - "punpcklbw %%mm5, %%mm6 \n\t" /* c2-c2-c2-c2-c1-c1-c1-c1 */ - "punpckhbw %%mm5, %%mm4 \n\t" /* c4-c4-c4-c4-c3-c3-c3-c3 */ - - "movq %%mm6, %%mm3 \n\t" /* c2-c2-c2-c2-c1-c1-c1-c1 */ - - "punpcklbw %%mm7, %%mm6 \n\t" /* 00-c1-00-c1-00-c1-00-c1 */ - "punpckhbw %%mm7, %%mm3 \n\t" /* 00-c2-00-c2-00-c2-00-c2 */ - - /* multiplication des pixels par les coefficients */ - "pmullw %%mm6, %%mm0 \n\t" /* c1*b2-c1*v2-c1*r2-c1*a2 */ - "pmullw %%mm3, %%mm1 \n\t" /* c2*b1-c2*v1-c2*r1-c2*a1 */ - "paddw %%mm1, %%mm0 \n\t" - - /* ...extraction des 2 derniers coefficients */ - "movq %%mm4, %%mm5 \n\t" /* c4-c4-c4-c4-c3-c3-c3-c3 */ - "punpcklbw %%mm7, %%mm4 \n\t" /* 00-c3-00-c3-00-c3-00-c3 */ - "punpckhbw %%mm7, %%mm5 \n\t" /* 00-c4-00-c4-00-c4-00-c4 */ - - /* ajouter la longueur de ligne a esi */ - "addl 8(%%ebp),%1 \n\t" - - /* recuperation des 2 derniers pixels */ - "movq (%3,%1,4), %%mm1 \n\t" - "movq %%mm1, %%mm2 \n\t" - - /* depackage des pixels */ - "punpcklbw %%mm7, %%mm1 \n\t" - "punpckhbw %%mm7, %%mm2 \n\t" - - /* multiplication pas les coeffs */ - "pmullw %%mm4, %%mm1 \n\t" - "pmullw %%mm5, %%mm2 \n\t" - - /* ajout des valeurs obtenues la valeur finale */ - "paddw %%mm1, %%mm0 \n\t" - "paddw %%mm2, %%mm0 \n\t" - - /* division par 256 = 16+16+16+16, puis repackage du pixel final */ - "psrlw $8, %%mm0 \n\t" - "packuswb %%mm7, %%mm0 \n\t" - - "movd %%mm0,%0 \n\t" - :"=g"(expix2[loop]) - :"r"(pos),"r"(coeffs),"r"(expix1) - - ); - - emms(); - } -} - -#define DRAWMETHOD_PLUS_MMX(_out,_backbuf,_col) \ -{ \ - movd_m2r(_backbuf, mm0); \ - paddusb_m2r(_col, mm0); \ - movd_r2m(mm0, _out); \ -} - -#define DRAWMETHOD DRAWMETHOD_PLUS_MMX(*p,*p,col) - -void draw_line_mmx (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny) -{ - int x, y, dx, dy, yy, xx; - Pixel *p; - - if ((y1 < 0) || (y2 < 0) || (x1 < 0) || (x2 < 0) || (y1 >= screeny) || (y2 >= screeny) || (x1 >= screenx) || (x2 >= screenx)) - goto end_of_line; - - dx = x2 - x1; - dy = y2 - y1; - if (x1 >= x2) { - int tmp; - - tmp = x1; - x1 = x2; - x2 = tmp; - tmp = y1; - y1 = y2; - y2 = tmp; - dx = x2 - x1; - dy = y2 - y1; - } - - /* vertical line */ - if (dx == 0) { - if (y1 < y2) { - p = &(data[(screenx * y1) + x1]); - for (y = y1; y <= y2; y++) { - DRAWMETHOD; - p += screenx; - } - } - else { - p = &(data[(screenx * y2) + x1]); - for (y = y2; y <= y1; y++) { - DRAWMETHOD; - p += screenx; - } - } - goto end_of_line; - } - /* horizontal line */ - if (dy == 0) { - if (x1 < x2) { - p = &(data[(screenx * y1) + x1]); - for (x = x1; x <= x2; x++) { - DRAWMETHOD; - p++; - } - goto end_of_line; - } - else { - p = &(data[(screenx * y1) + x2]); - for (x = x2; x <= x1; x++) { - DRAWMETHOD; - p++; - } - goto end_of_line; - } - } - /* 1 */ - /* \ */ - /* \ */ - /* 2 */ - if (y2 > y1) { - /* steep */ - if (dy > dx) { - dx = ((dx << 16) / dy); - x = x1 << 16; - for (y = y1; y <= y2; y++) { - xx = x >> 16; - p = &(data[(screenx * y) + xx]); - DRAWMETHOD; - if (xx < (screenx - 1)) { - p++; - /* DRAWMETHOD; */ - } - x += dx; - } - goto end_of_line; - } - /* shallow */ - else { - dy = ((dy << 16) / dx); - y = y1 << 16; - for (x = x1; x <= x2; x++) { - yy = y >> 16; - p = &(data[(screenx * yy) + x]); - DRAWMETHOD; - if (yy < (screeny - 1)) { - p += screeny; - /* DRAWMETHOD; */ - } - y += dy; - } - } - } - /* 2 */ - /* / */ - /* / */ - /* 1 */ - else { - /* steep */ - if (-dy > dx) { - dx = ((dx << 16) / -dy); - x = (x1 + 1) << 16; - for (y = y1; y >= y2; y--) { - xx = x >> 16; - p = &(data[(screenx * y) + xx]); - DRAWMETHOD; - if (xx < (screenx - 1)) { - p--; - /* DRAWMETHOD; */ - } - x += dx; - } - goto end_of_line; - } - /* shallow */ - else { - dy = ((dy << 16) / dx); - y = y1 << 16; - for (x = x1; x <= x2; x++) { - yy = y >> 16; - p = &(data[(screenx * yy) + x]); - DRAWMETHOD; - if (yy < (screeny - 1)) { - p += screeny; - /* DRAWMETHOD; */ - } - y += dy; - } - goto end_of_line; - } - } -end_of_line: - emms(); - /* __asm__ __volatile__ ("emms"); */ -} - -#endif diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/mmx.h kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/mmx.h --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/mmx.h 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/mmx.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,729 +0,0 @@ -/* mmx.h - - MultiMedia eXtensions GCC interface library for IA32. - - To use this library, simply include this header file - and compile with GCC. You MUST have inlining enabled - in order for mmx_ok() to work; this can be done by - simply using -O on the GCC command line. - - Compiling with -DMMX_TRACE will cause detailed trace - output to be sent to stderr for each mmx operation. - This adds lots of code, and obviously slows execution to - a crawl, but can be very useful for debugging. - - THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY - EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT - LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY - AND FITNESS FOR ANY PARTICULAR PURPOSE. - - 1997-99 by H. Dietz and R. Fisher - - Notes: - It appears that the latest gas has the pand problem fixed, therefore - I'll undefine BROKEN_PAND by default. -*/ - -#ifndef _MMX_H -#define _MMX_H - -#include "goom_graphic.h" - -/* Warning: at this writing, the version of GAS packaged - with most Linux distributions does not handle the - parallel AND operation mnemonic correctly. If the - symbol BROKEN_PAND is defined, a slower alternative - coding will be used. If execution of mmxtest results - in an illegal instruction fault, define this symbol. -*/ -#undef BROKEN_PAND - - -/* The type of an value that fits in an MMX register - (note that long long constant values MUST be suffixed - by LL and unsigned long long values by ULL, lest - they be truncated by the compiler) -*/ -typedef union { - long long q; /* Quadword (64-bit) value */ - unsigned long long uq; /* Unsigned Quadword */ - int d[2]; /* 2 Doubleword (32-bit) values */ - unsigned int ud[2]; /* 2 Unsigned Doubleword */ - short w[4]; /* 4 Word (16-bit) values */ - unsigned short uw[4]; /* 4 Unsigned Word */ - char b[8]; /* 8 Byte (8-bit) values */ - unsigned char ub[8]; /* 8 Unsigned Byte */ - float s[2]; /* Single-precision (32-bit) value */ -} __attribute__ ((aligned (8))) mmx_t; /* On an 8-byte (64-bit) boundary */ - - - -/* Function to test if multimedia instructions are supported... -*/ -static int -mm_support(void) -{ - /* Returns 1 if MMX instructions are supported, - 3 if Cyrix MMX and Extended MMX instructions are supported - 5 if AMD MMX and 3DNow! instructions are supported - 13 if AMD Extended MMX, &3dNow supported - 0 if hardware does not support any of these - */ - register int rval = 0; - - __asm__ __volatile__ ( - /* See if CPUID instruction is supported ... */ - /* ... Get copies of EFLAGS into eax and ecx */ - "pushl %%ebx\n\t" - "pushf\n\t" - "popl %%eax\n\t" - "movl %%eax, %%ecx\n\t" - - /* ... Toggle the ID bit in one copy and store */ - /* to the EFLAGS reg */ - "xorl $0x200000, %%eax\n\t" - "push %%eax\n\t" - "popf\n\t" - - /* ... Get the (hopefully modified) EFLAGS */ - "pushf\n\t" - "popl %%eax\n\t" - - /* ... Compare and test result */ - "xorl %%eax, %%ecx\n\t" - "testl $0x200000, %%ecx\n\t" - "jz NotSupported1\n\t" /* CPUID not supported */ - - - /* Get standard CPUID information, and - go to a specific vendor section */ - "movl $0, %%eax\n\t" - "cpuid\n\t" - - /* Check for Intel */ - "cmpl $0x756e6547, %%ebx\n\t" - "jne TryAMD\n\t" - "cmpl $0x49656e69, %%edx\n\t" - "jne TryAMD\n\t" - "cmpl $0x6c65746e, %%ecx\n" - "jne TryAMD\n\t" - "jmp Intel\n\t" - - /* Check for AMD */ - "\nTryAMD:\n\t" - "cmpl $0x68747541, %%ebx\n\t" - "jne TryCyrix\n\t" - "cmpl $0x69746e65, %%edx\n\t" - "jne TryCyrix\n\t" - "cmpl $0x444d4163, %%ecx\n" - "jne TryCyrix\n\t" - "jmp AMD\n\t" - - /* Check for Cyrix */ - "\nTryCyrix:\n\t" - "cmpl $0x69727943, %%ebx\n\t" - "jne NotSupported2\n\t" - "cmpl $0x736e4978, %%edx\n\t" - "jne NotSupported3\n\t" - "cmpl $0x64616574, %%ecx\n\t" - "jne NotSupported4\n\t" - /* Drop through to Cyrix... */ - - - /* Cyrix Section */ - /* See if extended CPUID level 80000001 is supported */ - /* The value of CPUID/80000001 for the 6x86MX is undefined - according to the Cyrix CPU Detection Guide (Preliminary - Rev. 1.01 table 1), so we'll check the value of eax for - CPUID/0 to see if standard CPUID level 2 is supported. - According to the table, the only CPU which supports level - 2 is also the only one which supports extended CPUID levels. - */ - "cmpl $0x2, %%eax\n\t" - "jne MMXtest\n\t" /* Use standard CPUID instead */ - - /* Extended CPUID supported (in theory), so get extended - features */ - "movl $0x80000001, %%eax\n\t" - "cpuid\n\t" - "testl $0x00800000, %%eax\n\t" /* Test for MMX */ - "jz NotSupported5\n\t" /* MMX not supported */ - "testl $0x01000000, %%eax\n\t" /* Test for Ext'd MMX */ - "jnz EMMXSupported\n\t" - "movl $1, %0\n\n\t" /* MMX Supported */ - "jmp Return\n\n" - "EMMXSupported:\n\t" - "movl $3, %0\n\n\t" /* EMMX and MMX Supported */ - "jmp Return\n\t" - - - /* AMD Section */ - "AMD:\n\t" - - /* See if extended CPUID is supported */ - "movl $0x80000000, %%eax\n\t" - "cpuid\n\t" - "cmpl $0x80000000, %%eax\n\t" - "jl MMXtest\n\t" /* Use standard CPUID instead */ - - /* Extended CPUID supported, so get extended features */ - "movl $0x80000001, %%eax\n\t" - "cpuid\n\t" - "testl $0x00800000, %%edx\n\t" /* Test for MMX */ - "jz NotSupported6\n\t" /* MMX not supported */ - "testl $0x80000000, %%edx\n\t" /* Test for 3DNow! */ - "jnz ThreeDNowSupported\n\t" - "movl $1, %0\n\n\t" /* MMX Supported */ - "jmp Return\n\n" - "ThreeDNowSupported:\n\t" - "testl $0x40000000, %%edx\n\t" /* Test AMD Extended MMX */ - "jnz AMDXMMXSupported\n\t" - "movl $5, %0\n\n\t" /* 3DNow! and MMX Supported */ - "jmp Return\n\t" - "AMDXMMXSupported:\n\t" - "movl $13, %0\n\n\t" /* XMMX, 3DNow! and MMX Supported */ - "jmp Return\n\t" - - - /* Intel Section */ - "Intel:\n\t" - - /* Check for MMX */ - "MMXtest:\n\t" - "movl $1, %%eax\n\t" - "cpuid\n\t" - "testl $0x00800000, %%edx\n\t" /* Test for MMX */ - "jz NotSupported7\n\t" /* MMX Not supported */ - "movl $1, %0\n\n\t" /* MMX Supported */ - "jmp Return\n\t" - - /* Nothing supported */ - "\nNotSupported1:\n\t" - "#movl $101, %0\n\n\t" - "\nNotSupported2:\n\t" - "#movl $102, %0\n\n\t" - "\nNotSupported3:\n\t" - "#movl $103, %0\n\n\t" - "\nNotSupported4:\n\t" - "#movl $104, %0\n\n\t" - "\nNotSupported5:\n\t" - "#movl $105, %0\n\n\t" - "\nNotSupported6:\n\t" - "#movl $106, %0\n\n\t" - "\nNotSupported7:\n\t" - "#movl $107, %0\n\n\t" - "movl $0, %0\n\n\t" - - "Return:\n\t" - "popl %%ebx\n\t" - : "=X" (rval) - : /* no input */ - : "eax", "ecx", "edx" - ); - - /* Return */ - return(rval); -} - -/* Function to test if mmx instructions are supported... -*/ -static inline int -mmx_ok(void) -{ - /* Returns 1 if MMX instructions are supported, 0 otherwise */ - return ( mm_support() & 0x1 ); -} - -int mmx_supported (void); -int xmmx_supported (void); - - -/* MMX optimized implementations */ -void draw_line_mmx (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny); -void draw_line_xmmx (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny); -void zoom_filter_mmx (int prevX, int prevY, Pixel *expix1, Pixel *expix2, - int *brutS, int *brutD, int buffratio, int precalCoef[16][16]); -void zoom_filter_xmmx (int prevX, int prevY, Pixel *expix1, Pixel *expix2, - int *lbruS, int *lbruD, int buffratio, int precalCoef[16][16]); - - -/* Helper functions for the instruction macros that follow... - (note that memory-to-register, m2r, instructions are nearly - as efficient as register-to-register, r2r, instructions; - however, memory-to-memory instructions are really simulated - as a convenience, and are only 1/3 as efficient) -*/ -#ifdef MMX_TRACE - -/* Include the stuff for printing a trace to stderr... -*/ - -#include - -#define mmx_i2r(op, imm, reg) \ - { \ - mmx_t mmx_trace; \ - mmx_trace.uq = (imm); \ - printf(#op "_i2r(" #imm "=0x%08x%08x, ", \ - mmx_trace.d[1], mmx_trace.d[0]); \ - __asm__ __volatile__ ("movq %%" #reg ", %0" \ - : "=X" (mmx_trace) \ - : /* nothing */ ); \ - printf(#reg "=0x%08x%08x) => ", \ - mmx_trace.d[1], mmx_trace.d[0]); \ - __asm__ __volatile__ (#op " %0, %%" #reg \ - : /* nothing */ \ - : "X" (imm)); \ - __asm__ __volatile__ ("movq %%" #reg ", %0" \ - : "=X" (mmx_trace) \ - : /* nothing */ ); \ - printf(#reg "=0x%08x%08x\n", \ - mmx_trace.d[1], mmx_trace.d[0]); \ - } - -#define mmx_m2r(op, mem, reg) \ - { \ - mmx_t mmx_trace; \ - mmx_trace = (mem); \ - printf(#op "_m2r(" #mem "=0x%08x%08x, ", \ - mmx_trace.d[1], mmx_trace.d[0]); \ - __asm__ __volatile__ ("movq %%" #reg ", %0" \ - : "=X" (mmx_trace) \ - : /* nothing */ ); \ - printf(#reg "=0x%08x%08x) => ", \ - mmx_trace.d[1], mmx_trace.d[0]); \ - __asm__ __volatile__ (#op " %0, %%" #reg \ - : /* nothing */ \ - : "m" (mem)); \ - __asm__ __volatile__ ("movq %%" #reg ", %0" \ - : "=X" (mmx_trace) \ - : /* nothing */ ); \ - printf(#reg "=0x%08x%08x\n", \ - mmx_trace.d[1], mmx_trace.d[0]); \ - } - -#define mmx_r2m(op, reg, mem) \ - { \ - mmx_t mmx_trace; \ - __asm__ __volatile__ ("movq %%" #reg ", %0" \ - : "=X" (mmx_trace) \ - : /* nothing */ ); \ - printf(#op "_r2m(" #reg "=0x%08x%08x, ", \ - mmx_trace.d[1], mmx_trace.d[0]); \ - mmx_trace = (mem); \ - printf(#mem "=0x%08x%08x) => ", \ - mmx_trace.d[1], mmx_trace.d[0]); \ - __asm__ __volatile__ (#op " %%" #reg ", %0" \ - : "=m" (mem) \ - : /* nothing */ ); \ - mmx_trace = (mem); \ - printf(#mem "=0x%08x%08x\n", \ - mmx_trace.d[1], mmx_trace.d[0]); \ - } - -#define mmx_r2r(op, regs, regd) \ - { \ - mmx_t mmx_trace; \ - __asm__ __volatile__ ("movq %%" #regs ", %0" \ - : "=X" (mmx_trace) \ - : /* nothing */ ); \ - printf(#op "_r2r(" #regs "=0x%08x%08x, ", \ - mmx_trace.d[1], mmx_trace.d[0]); \ - __asm__ __volatile__ ("movq %%" #regd ", %0" \ - : "=X" (mmx_trace) \ - : /* nothing */ ); \ - printf(#regd "=0x%08x%08x) => ", \ - mmx_trace.d[1], mmx_trace.d[0]); \ - __asm__ __volatile__ (#op " %" #regs ", %" #regd); \ - __asm__ __volatile__ ("movq %%" #regd ", %0" \ - : "=X" (mmx_trace) \ - : /* nothing */ ); \ - printf(#regd "=0x%08x%08x\n", \ - mmx_trace.d[1], mmx_trace.d[0]); \ - } - -#define mmx_m2m(op, mems, memd) \ - { \ - mmx_t mmx_trace; \ - mmx_trace = (mems); \ - printf(#op "_m2m(" #mems "=0x%08x%08x, ", \ - mmx_trace.d[1], mmx_trace.d[0]); \ - mmx_trace = (memd); \ - printf(#memd "=0x%08x%08x) => ", \ - mmx_trace.d[1], mmx_trace.d[0]); \ - __asm__ __volatile__ ("movq %0, %%mm0\n\t" \ - #op " %1, %%mm0\n\t" \ - "movq %%mm0, %0" \ - : "=m" (memd) \ - : "m" (mems)); \ - mmx_trace = (memd); \ - printf(#memd "=0x%08x%08x\n", \ - mmx_trace.d[1], mmx_trace.d[0]); \ - } - -#else - -/* These macros are a lot simpler without the tracing... -*/ - -#define mmx_i2r(op, imm, reg) \ - __asm__ __volatile__ (#op " %0, %%" #reg \ - : /* nothing */ \ - : "X" (imm) ) - -#define mmx_m2r(op, mem, reg) \ - __asm__ __volatile__ (#op " %0, %%" #reg \ - : /* nothing */ \ - : "m" (mem)) - -#define mmx_r2m(op, reg, mem) \ - __asm__ __volatile__ (#op " %%" #reg ", %0" \ - : "=m" (mem) \ - : /* nothing */ ) - -#define mmx_r2r(op, regs, regd) \ - __asm__ __volatile__ (#op " %" #regs ", %" #regd) - -#define mmx_m2m(op, mems, memd) \ - __asm__ __volatile__ ("movq %0, %%mm0\n\t" \ - #op " %1, %%mm0\n\t" \ - "movq %%mm0, %0" \ - : "=m" (memd) \ - : "m" (mems)) - -#endif - - -/* 1x64 MOVe Quadword - (this is both a load and a store... - in fact, it is the only way to store) -*/ -#define movq_m2r(var, reg) mmx_m2r(movq, var, reg) -#define movq_r2m(reg, var) mmx_r2m(movq, reg, var) -#define movq_r2r(regs, regd) mmx_r2r(movq, regs, regd) -#define movq(vars, vard) \ - __asm__ __volatile__ ("movq %1, %%mm0\n\t" \ - "movq %%mm0, %0" \ - : "=X" (vard) \ - : "X" (vars)) - - -/* 1x32 MOVe Doubleword - (like movq, this is both load and store... - but is most useful for moving things between - mmx registers and ordinary registers) -*/ -#define movd_m2r(var, reg) mmx_m2r(movd, var, reg) -#define movd_r2m(reg, var) mmx_r2m(movd, reg, var) -#define movd_r2r(regs, regd) mmx_r2r(movd, regs, regd) -#define movd(vars, vard) \ - __asm__ __volatile__ ("movd %1, %%mm0\n\t" \ - "movd %%mm0, %0" \ - : "=X" (vard) \ - : "X" (vars)) - - -/* 2x32, 4x16, and 8x8 Parallel ADDs -*/ -#define paddd_m2r(var, reg) mmx_m2r(paddd, var, reg) -#define paddd_r2r(regs, regd) mmx_r2r(paddd, regs, regd) -#define paddd(vars, vard) mmx_m2m(paddd, vars, vard) - -#define paddw_m2r(var, reg) mmx_m2r(paddw, var, reg) -#define paddw_r2r(regs, regd) mmx_r2r(paddw, regs, regd) -#define paddw(vars, vard) mmx_m2m(paddw, vars, vard) - -#define paddb_m2r(var, reg) mmx_m2r(paddb, var, reg) -#define paddb_r2r(regs, regd) mmx_r2r(paddb, regs, regd) -#define paddb(vars, vard) mmx_m2m(paddb, vars, vard) - - -/* 4x16 and 8x8 Parallel ADDs using Saturation arithmetic -*/ -#define paddsw_m2r(var, reg) mmx_m2r(paddsw, var, reg) -#define paddsw_r2r(regs, regd) mmx_r2r(paddsw, regs, regd) -#define paddsw(vars, vard) mmx_m2m(paddsw, vars, vard) - -#define paddsb_m2r(var, reg) mmx_m2r(paddsb, var, reg) -#define paddsb_r2r(regs, regd) mmx_r2r(paddsb, regs, regd) -#define paddsb(vars, vard) mmx_m2m(paddsb, vars, vard) - - -/* 4x16 and 8x8 Parallel ADDs using Unsigned Saturation arithmetic -*/ -#define paddusw_m2r(var, reg) mmx_m2r(paddusw, var, reg) -#define paddusw_r2r(regs, regd) mmx_r2r(paddusw, regs, regd) -#define paddusw(vars, vard) mmx_m2m(paddusw, vars, vard) - -#define paddusb_m2r(var, reg) mmx_m2r(paddusb, var, reg) -#define paddusb_r2r(regs, regd) mmx_r2r(paddusb, regs, regd) -#define paddusb(vars, vard) mmx_m2m(paddusb, vars, vard) - - -/* 2x32, 4x16, and 8x8 Parallel SUBs -*/ -#define psubd_m2r(var, reg) mmx_m2r(psubd, var, reg) -#define psubd_r2r(regs, regd) mmx_r2r(psubd, regs, regd) -#define psubd(vars, vard) mmx_m2m(psubd, vars, vard) - -#define psubw_m2r(var, reg) mmx_m2r(psubw, var, reg) -#define psubw_r2r(regs, regd) mmx_r2r(psubw, regs, regd) -#define psubw(vars, vard) mmx_m2m(psubw, vars, vard) - -#define psubb_m2r(var, reg) mmx_m2r(psubb, var, reg) -#define psubb_r2r(regs, regd) mmx_r2r(psubb, regs, regd) -#define psubb(vars, vard) mmx_m2m(psubb, vars, vard) - - -/* 4x16 and 8x8 Parallel SUBs using Saturation arithmetic -*/ -#define psubsw_m2r(var, reg) mmx_m2r(psubsw, var, reg) -#define psubsw_r2r(regs, regd) mmx_r2r(psubsw, regs, regd) -#define psubsw(vars, vard) mmx_m2m(psubsw, vars, vard) - -#define psubsb_m2r(var, reg) mmx_m2r(psubsb, var, reg) -#define psubsb_r2r(regs, regd) mmx_r2r(psubsb, regs, regd) -#define psubsb(vars, vard) mmx_m2m(psubsb, vars, vard) - - -/* 4x16 and 8x8 Parallel SUBs using Unsigned Saturation arithmetic -*/ -#define psubusw_m2r(var, reg) mmx_m2r(psubusw, var, reg) -#define psubusw_r2r(regs, regd) mmx_r2r(psubusw, regs, regd) -#define psubusw(vars, vard) mmx_m2m(psubusw, vars, vard) - -#define psubusb_m2r(var, reg) mmx_m2r(psubusb, var, reg) -#define psubusb_r2r(regs, regd) mmx_r2r(psubusb, regs, regd) -#define psubusb(vars, vard) mmx_m2m(psubusb, vars, vard) - - -/* 4x16 Parallel MULs giving Low 4x16 portions of results -*/ -#define pmullw_m2r(var, reg) mmx_m2r(pmullw, var, reg) -#define pmullw_r2r(regs, regd) mmx_r2r(pmullw, regs, regd) -#define pmullw(vars, vard) mmx_m2m(pmullw, vars, vard) - - -/* 4x16 Parallel MULs giving High 4x16 portions of results -*/ -#define pmulhw_m2r(var, reg) mmx_m2r(pmulhw, var, reg) -#define pmulhw_r2r(regs, regd) mmx_r2r(pmulhw, regs, regd) -#define pmulhw(vars, vard) mmx_m2m(pmulhw, vars, vard) - - -/* 4x16->2x32 Parallel Mul-ADD - (muls like pmullw, then adds adjacent 16-bit fields - in the multiply result to make the final 2x32 result) -*/ -#define pmaddwd_m2r(var, reg) mmx_m2r(pmaddwd, var, reg) -#define pmaddwd_r2r(regs, regd) mmx_r2r(pmaddwd, regs, regd) -#define pmaddwd(vars, vard) mmx_m2m(pmaddwd, vars, vard) - - -/* 1x64 bitwise AND -*/ -#ifdef BROKEN_PAND -#define pand_m2r(var, reg) \ - { \ - mmx_m2r(pandn, (mmx_t) -1LL, reg); \ - mmx_m2r(pandn, var, reg); \ - } -#define pand_r2r(regs, regd) \ - { \ - mmx_m2r(pandn, (mmx_t) -1LL, regd); \ - mmx_r2r(pandn, regs, regd) \ - } -#define pand(vars, vard) \ - { \ - movq_m2r(vard, mm0); \ - mmx_m2r(pandn, (mmx_t) -1LL, mm0); \ - mmx_m2r(pandn, vars, mm0); \ - movq_r2m(mm0, vard); \ - } -#else -#define pand_m2r(var, reg) mmx_m2r(pand, var, reg) -#define pand_r2r(regs, regd) mmx_r2r(pand, regs, regd) -#define pand(vars, vard) mmx_m2m(pand, vars, vard) -#endif - - -/* 1x64 bitwise AND with Not the destination -*/ -#define pandn_m2r(var, reg) mmx_m2r(pandn, var, reg) -#define pandn_r2r(regs, regd) mmx_r2r(pandn, regs, regd) -#define pandn(vars, vard) mmx_m2m(pandn, vars, vard) - - -/* 1x64 bitwise OR -*/ -#define por_m2r(var, reg) mmx_m2r(por, var, reg) -#define por_r2r(regs, regd) mmx_r2r(por, regs, regd) -#define por(vars, vard) mmx_m2m(por, vars, vard) - - -/* 1x64 bitwise eXclusive OR -*/ -#define pxor_m2r(var, reg) mmx_m2r(pxor, var, reg) -#define pxor_r2r(regs, regd) mmx_r2r(pxor, regs, regd) -#define pxor(vars, vard) mmx_m2m(pxor, vars, vard) - - -/* 2x32, 4x16, and 8x8 Parallel CoMPare for EQuality - (resulting fields are either 0 or -1) -*/ -#define pcmpeqd_m2r(var, reg) mmx_m2r(pcmpeqd, var, reg) -#define pcmpeqd_r2r(regs, regd) mmx_r2r(pcmpeqd, regs, regd) -#define pcmpeqd(vars, vard) mmx_m2m(pcmpeqd, vars, vard) - -#define pcmpeqw_m2r(var, reg) mmx_m2r(pcmpeqw, var, reg) -#define pcmpeqw_r2r(regs, regd) mmx_r2r(pcmpeqw, regs, regd) -#define pcmpeqw(vars, vard) mmx_m2m(pcmpeqw, vars, vard) - -#define pcmpeqb_m2r(var, reg) mmx_m2r(pcmpeqb, var, reg) -#define pcmpeqb_r2r(regs, regd) mmx_r2r(pcmpeqb, regs, regd) -#define pcmpeqb(vars, vard) mmx_m2m(pcmpeqb, vars, vard) - - -/* 2x32, 4x16, and 8x8 Parallel CoMPare for Greater Than - (resulting fields are either 0 or -1) -*/ -#define pcmpgtd_m2r(var, reg) mmx_m2r(pcmpgtd, var, reg) -#define pcmpgtd_r2r(regs, regd) mmx_r2r(pcmpgtd, regs, regd) -#define pcmpgtd(vars, vard) mmx_m2m(pcmpgtd, vars, vard) - -#define pcmpgtw_m2r(var, reg) mmx_m2r(pcmpgtw, var, reg) -#define pcmpgtw_r2r(regs, regd) mmx_r2r(pcmpgtw, regs, regd) -#define pcmpgtw(vars, vard) mmx_m2m(pcmpgtw, vars, vard) - -#define pcmpgtb_m2r(var, reg) mmx_m2r(pcmpgtb, var, reg) -#define pcmpgtb_r2r(regs, regd) mmx_r2r(pcmpgtb, regs, regd) -#define pcmpgtb(vars, vard) mmx_m2m(pcmpgtb, vars, vard) - - -/* 1x64, 2x32, and 4x16 Parallel Shift Left Logical -*/ -#define psllq_i2r(imm, reg) mmx_i2r(psllq, imm, reg) -#define psllq_m2r(var, reg) mmx_m2r(psllq, var, reg) -#define psllq_r2r(regs, regd) mmx_r2r(psllq, regs, regd) -#define psllq(vars, vard) mmx_m2m(psllq, vars, vard) - -#define pslld_i2r(imm, reg) mmx_i2r(pslld, imm, reg) -#define pslld_m2r(var, reg) mmx_m2r(pslld, var, reg) -#define pslld_r2r(regs, regd) mmx_r2r(pslld, regs, regd) -#define pslld(vars, vard) mmx_m2m(pslld, vars, vard) - -#define psllw_i2r(imm, reg) mmx_i2r(psllw, imm, reg) -#define psllw_m2r(var, reg) mmx_m2r(psllw, var, reg) -#define psllw_r2r(regs, regd) mmx_r2r(psllw, regs, regd) -#define psllw(vars, vard) mmx_m2m(psllw, vars, vard) - - -/* 1x64, 2x32, and 4x16 Parallel Shift Right Logical -*/ -#define psrlq_i2r(imm, reg) mmx_i2r(psrlq, imm, reg) -#define psrlq_m2r(var, reg) mmx_m2r(psrlq, var, reg) -#define psrlq_r2r(regs, regd) mmx_r2r(psrlq, regs, regd) -#define psrlq(vars, vard) mmx_m2m(psrlq, vars, vard) - -#define psrld_i2r(imm, reg) mmx_i2r(psrld, imm, reg) -#define psrld_m2r(var, reg) mmx_m2r(psrld, var, reg) -#define psrld_r2r(regs, regd) mmx_r2r(psrld, regs, regd) -#define psrld(vars, vard) mmx_m2m(psrld, vars, vard) - -#define psrlw_i2r(imm, reg) mmx_i2r(psrlw, imm, reg) -#define psrlw_m2r(var, reg) mmx_m2r(psrlw, var, reg) -#define psrlw_r2r(regs, regd) mmx_r2r(psrlw, regs, regd) -#define psrlw(vars, vard) mmx_m2m(psrlw, vars, vard) - - -/* 2x32 and 4x16 Parallel Shift Right Arithmetic -*/ -#define psrad_i2r(imm, reg) mmx_i2r(psrad, imm, reg) -#define psrad_m2r(var, reg) mmx_m2r(psrad, var, reg) -#define psrad_r2r(regs, regd) mmx_r2r(psrad, regs, regd) -#define psrad(vars, vard) mmx_m2m(psrad, vars, vard) - -#define psraw_i2r(imm, reg) mmx_i2r(psraw, imm, reg) -#define psraw_m2r(var, reg) mmx_m2r(psraw, var, reg) -#define psraw_r2r(regs, regd) mmx_r2r(psraw, regs, regd) -#define psraw(vars, vard) mmx_m2m(psraw, vars, vard) - - -/* 2x32->4x16 and 4x16->8x8 PACK and Signed Saturate - (packs source and dest fields into dest in that order) -*/ -#define packssdw_m2r(var, reg) mmx_m2r(packssdw, var, reg) -#define packssdw_r2r(regs, regd) mmx_r2r(packssdw, regs, regd) -#define packssdw(vars, vard) mmx_m2m(packssdw, vars, vard) - -#define packsswb_m2r(var, reg) mmx_m2r(packsswb, var, reg) -#define packsswb_r2r(regs, regd) mmx_r2r(packsswb, regs, regd) -#define packsswb(vars, vard) mmx_m2m(packsswb, vars, vard) - - -/* 4x16->8x8 PACK and Unsigned Saturate - (packs source and dest fields into dest in that order) -*/ -#define packuswb_m2r(var, reg) mmx_m2r(packuswb, var, reg) -#define packuswb_r2r(regs, regd) mmx_r2r(packuswb, regs, regd) -#define packuswb(vars, vard) mmx_m2m(packuswb, vars, vard) - - -/* 2x32->1x64, 4x16->2x32, and 8x8->4x16 UNPaCK Low - (interleaves low half of dest with low half of source - as padding in each result field) -*/ -#define punpckldq_m2r(var, reg) mmx_m2r(punpckldq, var, reg) -#define punpckldq_r2r(regs, regd) mmx_r2r(punpckldq, regs, regd) -#define punpckldq(vars, vard) mmx_m2m(punpckldq, vars, vard) - -#define punpcklwd_m2r(var, reg) mmx_m2r(punpcklwd, var, reg) -#define punpcklwd_r2r(regs, regd) mmx_r2r(punpcklwd, regs, regd) -#define punpcklwd(vars, vard) mmx_m2m(punpcklwd, vars, vard) - -#define punpcklbw_m2r(var, reg) mmx_m2r(punpcklbw, var, reg) -#define punpcklbw_r2r(regs, regd) mmx_r2r(punpcklbw, regs, regd) -#define punpcklbw(vars, vard) mmx_m2m(punpcklbw, vars, vard) - - -/* 2x32->1x64, 4x16->2x32, and 8x8->4x16 UNPaCK High - (interleaves high half of dest with high half of source - as padding in each result field) -*/ -#define punpckhdq_m2r(var, reg) mmx_m2r(punpckhdq, var, reg) -#define punpckhdq_r2r(regs, regd) mmx_r2r(punpckhdq, regs, regd) -#define punpckhdq(vars, vard) mmx_m2m(punpckhdq, vars, vard) - -#define punpckhwd_m2r(var, reg) mmx_m2r(punpckhwd, var, reg) -#define punpckhwd_r2r(regs, regd) mmx_r2r(punpckhwd, regs, regd) -#define punpckhwd(vars, vard) mmx_m2m(punpckhwd, vars, vard) - -#define punpckhbw_m2r(var, reg) mmx_m2r(punpckhbw, var, reg) -#define punpckhbw_r2r(regs, regd) mmx_r2r(punpckhbw, regs, regd) -#define punpckhbw(vars, vard) mmx_m2m(punpckhbw, vars, vard) - - -/* Empty MMx State - (used to clean-up when going from mmx to float use - of the registers that are shared by both; note that - there is no float-to-mmx operation needed, because - only the float tag word info is corruptible) -*/ -#ifdef MMX_TRACE - -#define emms() \ - { \ - printf("emms()\n"); \ - __asm__ __volatile__ ("emms" \ - "st(1)","st(2)","st(3)","st(4)","st(5)","st(6)","st(7)"); \ - } - -#else - -#define emms() __asm__ __volatile__ ("emms"::: \ - "st(1)","st(2)","st(3)","st(4)","st(5)","st(6)","st(7)") - -#endif - -#endif - diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/motif_goom1.h kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/motif_goom1.h --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/motif_goom1.h 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/motif_goom1.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,1026 +0,0 @@ -static Motif CONV_MOTIF1 = { - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,14,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,13,9,9,7,2,2,9,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,11, - 11,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,12,7,4,0,0,0,2,0,0,3,14,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,12,10,9,9,4,1,0, - 1,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,10,3,0,0,0,1,1,3,5,0,0,1,14,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,14,6,3,1,1,4,9,1, - 1,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 10,3,0,0,2,7,13,14,14,14,7,0,0,2,14,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,12,1,9,15,15,15,15,3, - 0,13,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,12,4, - 0,0,2,10,15,15,15,15,15,15,1,0,0,10,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,9,0,2,14,15,15,15,7, - 0,9,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,14,6,0,0, - 2,9,15,15,15,15,15,15,15,13,0,0,3,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,11,0,0,10,15,15,15,9, - 0,9,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,13,3,0,1,5, - 5,4,4,4,6,12,15,15,15,13,0,0,7,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,14,0,0,5,15,15,15,10, - 0,7,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,11,1,0,3,3,1, - 0,0,0,0,0,0,5,13,15,12,0,0,13,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,13,14,15, - 15,15,15,15,15,15,15,15,14,0,0,1,15,15,15,12, - 0,3,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,10,1,2,4,0,0,1, - 9,12,12,12,9,3,0,2,14,5,0,7,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,14,7,4,4,1,1,12, - 15,15,15,15,15,15,15,15,14,1,0,0,12,15,15,15, - 1,0,12,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,10,0,3,2,0,0,3,12, - 15,15,15,15,15,14,2,1,13,2,0,12,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,14,3,0,0,0,0,0,2, - 13,15,15,15,15,15,15,15,14,1,0,0,8,15,15,15, - 1,0,9,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,12,2,1,0,0,0,9,14,15, - 15,15,15,15,15,14,1,1,11,0,3,14,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,7,4,11,12,10,1,0, - 3,12,15,15,15,15,15,15,13,1,1,0,4,15,15,15, - 2,0,10,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,14,2,1,0,0,3,12,15,15,15, - 15,15,15,15,15,11,0,5,9,1,12,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,5,1,13,15,15,12,1, - 0,1,9,15,15,15,15,15,14,2,5,0,1,14,15,15, - 2,0,7,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,14,3,0,0,0,7,14,15,15,15,15, - 15,15,15,15,15,9,0,8,7,4,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,7,0,7,8,11,15,13, - 2,0,0,3,10,15,15,15,15,5,11,0,0,11,15,15, - 6,0,2,14,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,6,0,0,0,8,15,15,15,15,15,15, - 15,15,15,15,15,6,0,4,0,6,15,15,15,15,15,15, - 14,9,14,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,11,0,3,3,0,8,15, - 14,5,0,0,0,4,12,15,15,5,13,2,0,6,15,15, - 12,0,0,11,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,10,0,0,0,8,15,15,15,15,15,15,15, - 15,15,15,15,10,1,7,6,4,13,15,15,15,15,13,11, - 6,0,8,11,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,1,1,11,2,0,5, - 14,15,8,0,0,0,0,7,15,5,14,6,0,2,15,15, - 15,3,0,5,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,13,1,0,0,7,15,15,15,15,15,15,15,15, - 15,15,15,15,7,9,15,15,15,15,15,15,12,6,2,1, - 1,1,8,6,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,4,0,6,12,1,0, - 3,13,15,11,2,0,0,0,8,4,14,10,0,0,13,15, - 15,7,0,1,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,5,0,0,5,15,15,15,15,15,15,15,15,15, - 15,15,15,15,13,15,15,15,15,14,8,3,1,2,7,11, - 5,4,5,6,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,8,0,1,14,11,0, - 0,1,9,15,14,5,0,0,2,4,14,13,0,0,10,15, - 15,12,0,0,12,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,10,0,0,1,14,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,14,13,7,2,0,5,9,15,15,15, - 5,3,6,9,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,13,0,0,9,15,12, - 2,0,0,4,13,14,4,0,3,2,12,15,1,0,5,15, - 15,14,1,0,8,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,2,0,0,9,15,15,15,15,15,15,15,15,15,15, - 15,15,15,12,11,6,1,0,2,3,10,15,15,15,15,7, - 1,2,4,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,5,0,3,14,15, - 9,2,0,0,1,6,12,13,13,1,9,12,0,0,2,14, - 15,15,4,0,4,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,10,0,0,2,14,15,15,15,15,15,15,15,15,15,15, - 13,9,6,0,1,2,9,10,15,15,15,15,14,7,1,0, - 6,2,4,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,11,0,0,9,15, - 4,4,11,6,1,0,0,1,1,0,10,4,0,0,0,12, - 15,15,9,0,1,14,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,3,0,0,8,15,15,15,15,15,15,15,13,12,4,4, - 1,1,3,10,12,15,15,15,15,15,9,2,1,0,1,6, - 6,0,10,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,4,0,3,14, - 4,3,15,15,14,9,7,9,1,0,0,0,0,1,0,7, - 15,15,13,0,0,9,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 13,0,0,1,14,15,15,15,15,15,12,9,1,0,1,4, - 7,15,15,15,15,15,15,14,8,2,0,0,0,2,13,9, - 0,4,14,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,11,0,0,9, - 3,0,8,14,15,15,15,15,10,5,4,4,7,4,0,3, - 15,15,15,4,0,3,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 5,0,0,5,15,15,15,15,14,8,7,8,10,12,14,15, - 15,15,15,15,15,15,11,1,0,0,0,5,11,15,13,1, - 1,13,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,3,0,4, - 4,0,0,2,6,10,15,15,15,15,15,15,15,10,0,0, - 12,15,15,9,0,0,12,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 1,0,0,10,15,15,15,15,15,13,14,15,15,15,15,15, - 15,15,15,15,14,7,1,0,0,3,12,15,15,15,6,0, - 7,15,15,15,12,10,9,10,12,14,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,9,0,0, - 8,3,1,4,1,0,1,12,15,15,15,15,15,14,2,0, - 6,15,15,15,2,0,6,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 0,0,1,14,15,15,15,15,14,5,15,15,15,15,15,15, - 15,15,15,7,2,0,0,1,8,15,15,15,15,12,0,2, - 14,15,12,4,0,0,0,0,0,1,5,10,14,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,14,0,0, - 5,4,1,14,15,10,7,13,15,15,15,15,15,15,8,0, - 1,14,15,15,7,0,1,14,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,13, - 0,0,4,15,15,15,15,15,13,2,13,15,15,15,15,15, - 12,7,0,0,0,0,5,12,15,15,15,15,14,3,0,9, - 11,1,0,0,1,1,0,1,0,0,0,0,2,12,15,15, - 15,15,15,15,15,15,15,14,15,15,15,15,15,15,2,0, - 5,2,1,14,15,14,13,15,15,15,15,15,15,15,12,0, - 0,10,15,15,13,0,0,9,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,12, - 0,0,4,15,15,15,15,15,12,0,12,15,15,15,12,6, - 0,0,0,0,6,14,15,15,15,15,15,15,7,0,0,12, - 1,0,0,2,2,1,1,7,12,8,3,0,0,1,13,15, - 15,15,15,15,15,8,4,8,12,15,15,15,15,15,8,0, - 4,2,0,14,15,11,9,15,15,15,15,15,15,15,15,3, - 0,5,15,15,15,5,0,3,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,12, - 0,0,4,15,15,15,15,15,12,0,12,15,13,3,1,0, - 0,0,5,12,15,15,15,15,15,15,15,12,0,0,7,7, - 0,0,0,0,0,0,0,1,12,15,15,12,3,0,5,15, - 15,15,15,14,5,0,0,0,0,2,2,3,7,14,9,8, - 14,2,1,14,15,2,12,13,15,15,15,15,15,15,15,9, - 0,0,13,15,15,10,0,0,12,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,13, - 0,0,5,15,15,15,15,15,12,0,11,10,1,0,0,1, - 5,14,15,15,15,15,15,15,15,15,15,6,0,2,7,0, - 0,0,0,1,2,7,4,0,3,14,15,15,14,2,0,12, - 15,15,15,9,0,1,2,1,0,0,0,0,0,1,3,7, - 15,3,0,14,15,4,12,15,15,15,15,15,15,15,15,14, - 1,0,8,15,15,14,1,0,8,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,13, - 0,0,4,15,15,15,15,15,12,0,2,0,0,1,10,15, - 15,15,15,15,15,15,15,15,15,15,12,0,0,6,0,0, - 0,1,10,14,15,15,11,1,0,9,15,15,15,8,0,9, - 15,15,12,4,8,14,15,8,1,0,0,0,0,0,1,9, - 15,2,0,13,15,1,9,15,15,15,15,15,15,15,15,15, - 6,0,1,14,15,14,1,0,3,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,14, - 1,0,1,14,15,15,15,15,12,1,3,7,9,13,15,15, - 15,15,15,15,15,15,15,15,15,15,3,0,2,3,0,4, - 0,8,15,15,15,15,15,13,1,2,14,15,15,10,0,6, - 15,14,2,6,15,15,15,1,3,7,3,0,0,0,0,1, - 11,1,0,11,12,0,12,15,15,15,15,15,15,15,15,15, - 11,0,0,9,15,15,4,0,0,12,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 6,0,0,9,15,15,15,15,15,12,14,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,11,0,0,3,0,8,14, - 2,5,15,15,15,15,15,15,5,0,8,15,15,12,0,4, - 15,5,2,14,15,15,10,0,13,15,13,2,4,5,5,0, - 9,1,0,10,9,1,14,15,15,15,15,15,15,15,15,15, - 13,0,0,3,15,15,9,0,0,8,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 12,0,0,3,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,3,0,1,1,5,14,15, - 11,0,12,15,15,15,15,15,14,1,1,14,15,12,0,4, - 10,0,9,15,15,11,1,8,15,15,8,1,14,15,14,2, - 5,0,0,10,6,2,15,15,15,15,15,15,15,15,15,15, - 15,3,0,0,12,15,13,0,0,2,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,3,0,0,10,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,10,0,0,1,0,11,15,15, - 15,2,6,15,15,15,15,15,15,6,0,9,15,13,0,6, - 3,0,13,15,14,2,6,15,15,13,1,8,15,15,15,4, - 3,1,0,10,7,2,15,15,15,15,15,15,15,15,15,15, - 15,9,0,0,6,15,15,3,0,0,13,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,9,0,0,2,14,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,11,10,2,0,3,0,3,15,15,15, - 15,8,1,14,15,15,15,15,15,13,0,2,15,9,1,10, - 0,3,15,15,6,2,14,15,14,3,1,14,15,15,15,2, - 4,0,0,12,5,3,15,15,15,15,15,15,15,15,15,15, - 15,14,1,0,1,14,15,5,0,0,12,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,4,0,0,6,15,15,15,15,15,15,15,15,14,12, - 12,9,5,4,4,3,0,0,0,0,4,0,8,15,15,15, - 15,13,1,10,15,15,15,15,15,15,2,0,11,3,5,10, - 0,7,15,9,1,11,15,15,8,0,6,15,15,15,10,0, - 3,0,0,13,3,6,15,15,15,15,15,15,15,15,15,15, - 15,15,6,0,0,12,15,5,0,0,7,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,13,1,0,0,8,14,15,15,13,6,4,4,1,0, - 0,0,0,0,0,0,2,0,0,4,3,0,12,15,15,15, - 15,15,5,3,15,15,15,15,14,8,0,0,1,1,12,9, - 0,9,10,0,6,15,15,15,2,2,14,15,15,13,2,0, - 4,0,1,13,0,10,15,15,15,15,15,15,15,15,15,15, - 15,15,13,1,0,10,15,10,0,0,5,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,9,0,0,0,3,2,2,1,0,0,0,1,4, - 4,5,10,12,12,12,11,0,0,11,4,0,12,15,15,15, - 15,15,12,0,7,13,15,15,5,0,0,0,1,6,15,9, - 0,3,0,0,1,6,14,10,0,12,15,15,11,2,0,2, - 3,0,3,12,1,11,15,15,15,15,15,15,15,15,15,15, - 15,15,15,3,0,6,8,7,0,0,5,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,9,1,0,0,0,2,6,10,12,12,14,15, - 15,15,15,15,11,5,4,0,2,14,4,0,12,15,15,15, - 15,15,15,4,0,3,13,6,0,0,0,1,2,14,15,12, - 0,0,0,0,0,0,2,2,6,15,14,8,0,0,0,7, - 4,0,4,12,0,12,15,15,15,15,15,15,15,15,15,15, - 15,15,15,12,0,0,0,0,0,0,1,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,12,2,0,0,0,1,6,11,15,15,15, - 15,15,15,15,2,1,0,0,9,15,6,0,7,15,15,15, - 15,15,15,13,2,0,0,0,0,0,0,1,12,15,15,15, - 4,0,0,0,0,0,0,6,13,6,1,0,0,4,13,15, - 6,0,6,12,0,12,15,15,15,15,15,15,15,15,15,15, - 15,15,15,14,5,0,0,0,0,0,5,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,14,5,0,0,0,0,0,2,4,5, - 7,3,6,3,0,2,0,2,15,15,11,0,0,9,15,15, - 15,15,15,15,11,0,0,0,0,0,2,11,15,15,15,15, - 12,1,0,0,1,4,6,10,2,0,0,0,7,14,15,15, - 9,0,9,9,0,12,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,13,9,8,9,7,13,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,12,6,1,0,0,0,0,0, - 0,0,0,2,8,0,0,9,15,15,14,4,0,0,3,10, - 14,15,15,15,15,13,3,0,0,4,14,15,15,15,15,15, - 15,11,2,0,0,1,1,0,0,0,1,11,15,15,15,15, - 9,0,10,5,3,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,14,12,10,5,4,6, - 2,4,10,14,8,0,1,14,15,15,15,14,5,0,0,0, - 1,2,4,4,4,3,1,2,9,14,15,15,15,15,15,15, - 15,15,15,11,11,13,10,9,9,11,15,15,15,15,15,15, - 10,0,8,2,4,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 2,7,15,14,1,0,6,15,15,15,15,15,15,10,6,4, - 2,2,4,4,4,3,9,14,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 11,0,3,1,4,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,11, - 1,10,15,9,0,0,13,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 11,0,11,11,11,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,2, - 5,15,14,2,0,5,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 14,1,13,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,10,1, - 13,15,11,0,0,12,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,5,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,8,1, - 15,15,5,0,3,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,10,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,12,2,3, - 15,14,1,0,7,15,15,15,15,15,13,15,15,15,15,14, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,13,12,12,11,9,4,7,14,15, - 14,13,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,12,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,14,3,0,10, - 15,9,0,0,8,7,4,2,2,1,0,3,4,3,4,9, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,14,13,11,7,4,2,0,0,0,0,0,0,1,12,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,14,13,11,7,4,2,2,13,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,12,0,3,11, - 7,1,0,0,0,0,0,1,4,9,11,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,14,12,11,9,7,4, - 3,1,0,0,0,0,0,0,0,0,0,2,11,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,13,11,8, - 4,3,1,0,0,0,0,3,8,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,14,11,3,0,0,0, - 0,0,0,2,6,9,12,14,15,15,15,15,15,15,15,15, - 15,15,15,15,15,13,9,6,3,1,0,0,0,0,0,0, - 0,0,0,0,1,4,7,11,12,12,12,14,15,15,15,15, - 15,15,15,15,15,15,15,14,12,11,7,4,2,0,0,0, - 0,0,0,1,5,10,13,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,14,12,7,3,1,0,0,0,2,5, - 2,0,2,14,15,15,15,15,15,15,15,15,15,14,13,12, - 11,9,6,4,2,0,0,0,0,0,0,0,0,1,2,4, - 5,9,11,13,15,15,15,15,15,15,15,15,15,15,15,15, - 15,14,12,11,7,4,3,1,0,0,0,0,0,0,0,1, - 4,5,10,14,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,13,10,5,1,0,0,0,1,0,0,2,13,14, - 1,0,8,15,15,14,12,11,9,8,4,3,2,1,0,0, - 0,0,0,0,1,3,2,3,5,9,10,12,13,14,15,15, - 15,15,15,15,15,15,15,15,15,15,15,13,11,10,6,4, - 3,1,0,0,0,0,0,0,0,0,1,4,7,11,13,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,11,4,0,0,0,1,4,9,13,13,1,0,0,1,7, - 0,0,7,8,5,2,0,0,0,0,0,0,1,2,3,4, - 5,9,10,12,14,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,14,11,8,4,3,1,0,0,0,0,0, - 0,0,0,0,1,4,5,9,12,13,15,15,15,15,15,15, - 15,15,14,12,9,8,8,7,4,2,5,4,5,5,12,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,14,10,5, - 1,0,1,3,6,11,14,15,15,15,15,13,12,8,3,2, - 0,0,1,1,3,3,4,5,8,10,12,13,14,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,13, - 11,9,6,4,2,1,0,0,0,0,0,0,0,1,2,4, - 6,10,11,13,15,15,15,15,15,15,15,15,13,11,9,7, - 4,2,1,0,0,0,0,2,4,7,12,14,14,14,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,10,5,1,1,3, - 8,12,14,15,15,15,15,15,15,15,15,15,15,15,15,9, - 3,11,14,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,8,6,9,9,9,9,9,8,5,4,4,3,1,0, - 0,0,0,0,1,2,3,2,4,5,9,11,12,14,15,15, - 15,15,15,15,15,15,15,14,12,9,5,2,0,0,0,0, - 0,1,2,4,7,10,14,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,14,9,4,1,3,9,13,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,13, - 11,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,13,3,1,1,1,1,1,1,1,0,0,0,0,2,3, - 5,8,10,12,14,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,12,5,2,0,0,0,1,3,4,7,10, - 12,13,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,13,11,13,13,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,14,12,12,12,13,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,8,1,0,1,4,7,11,13,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,13,7,8,11,14,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15 - }; diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/motif_goom2.h kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/motif_goom2.h --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/motif_goom2.h 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/motif_goom2.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,1026 +0,0 @@ -static Motif CONV_MOTIF2 = { - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,12,5,14, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,12,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,10,1,14, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,10,0,12,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,6,0,12, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,7,0,8,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,13,2,0,10, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,6,0,2,14,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,5,0,0,10, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,9,0,0,12,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,14,9,0,0,1,14, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,8,0,0,8,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,14,8,3,0,0,0,9,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,11,0,0,2,14,15,15,15,15,15,15,15,15,15,15, - 15,15,15,13,9,5,3,4,1,0,0,0,0,7,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,14,4,0,0,4,11,13,13,15,15,14,12,10,8,5, - 6,4,1,0,0,0,0,0,0,0,0,0,0,14,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,12,1,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,9,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 13,9,10,13,14,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,12,3,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,2,5,6,0,0,0,0,12,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 5,0,0,0,3,10,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,14,9,2,1,0,0,0,1,4,6,6,1, - 0,0,0,8,13,15,15,15,12,1,0,2,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,14, - 2,0,0,0,0,0,4,12,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,3,0,0,10,15,15,15,10, - 0,0,4,15,15,15,15,15,15,2,0,6,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,5, - 3,11,5,0,0,0,0,0,4,11,14,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,7,0,0,13,15,15,15,11, - 0,0,7,15,15,15,15,15,15,1,0,9,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,9,0, - 13,15,15,12,5,0,0,0,0,0,1,8,14,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,7,0,1,14,15,15,15,11, - 0,0,7,15,15,15,15,15,14,0,0,9,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,11,1,10, - 15,15,15,15,15,11,5,0,0,0,0,0,1,6,13,15, - 15,15,15,15,14,8,11,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,6,0,2,15,15,15,15,11, - 0,0,6,15,15,15,15,15,13,0,0,11,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,11,1,6,15, - 15,15,15,15,15,15,15,14,5,0,0,0,0,0,0,6, - 14,15,15,15,6,0,4,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,7,0,5,15,15,15,15,11, - 0,0,5,15,15,15,15,15,12,0,0,12,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,13,2,1,13,15, - 15,15,15,15,15,15,15,15,15,12,2,0,0,0,0,0, - 1,6,11,7,0,0,4,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,7,0,7,15,15,15,15,11, - 0,0,6,15,15,15,15,15,12,0,0,12,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,5,0,7,15,15, - 15,15,15,15,15,15,15,15,15,15,15,11,5,0,0,0, - 0,0,0,0,0,1,11,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,7,0,10,15,15,15,15,11, - 0,0,6,15,15,15,15,15,12,0,0,12,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,10,0,4,14,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,13,7,0, - 0,0,0,0,0,1,6,12,14,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,7,0,10,15,15,15,15,11, - 0,0,7,15,15,15,15,15,12,0,0,12,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,13,1,1,12,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,13, - 5,0,0,0,0,0,0,0,3,10,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,7,0,10,15,15,15,15,11, - 0,0,7,15,15,15,15,15,11,0,0,13,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,14,4,0,8,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 13,0,0,0,1,0,0,0,0,1,13,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,7,0,10,15,15,15,15,11, - 0,0,8,15,15,15,15,15,8,0,2,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,9,0,4,14,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,14, - 4,0,0,5,13,12,6,2,0,2,13,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,7,0,10,15,15,15,15,11, - 0,0,7,15,15,15,15,15,4,0,4,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,13,1,1,13,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,11, - 0,0,1,13,15,15,15,14,9,13,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,5,0,6,15,15,15,15,11, - 0,0,8,15,15,15,15,15,2,0,8,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,5,0,9,15,15,15,15,15,15, - 15,15,15,15,15,15,14,11,15,15,15,15,15,15,15,9, - 0,0,10,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,4,0,4,15,15,15,15,11, - 0,0,7,15,15,15,15,13,0,0,11,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,10,0,3,14,15,15,15,15,15,15, - 15,15,15,15,15,14,3,0,13,15,15,15,15,15,15,14, - 9,11,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,4,0,4,15,15,15,15,11, - 0,0,8,15,15,15,15,12,0,0,12,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,14,2,1,12,15,15,15,15,15,15,15, - 15,15,15,15,14,3,0,0,9,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,6,0,3,15,15,15,15,13, - 1,0,8,15,15,15,15,12,0,0,12,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,9,0,5,15,15,15,15,15,15,15,15, - 15,15,15,14,4,0,0,0,10,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,8,0,2,15,15,15,15,15, - 3,0,13,15,15,15,15,12,0,0,12,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,13,2,1,12,15,15,15,15,15,15,15,15, - 15,15,15,7,0,0,0,0,8,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,10,0,1,14,15,15,15,15, - 11,5,15,15,15,15,15,12,0,0,11,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,6,0,7,15,15,15,15,15,15,15,15,15, - 15,15,8,0,0,0,0,0,0,9,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,12,0,0,12,15,15,15,15, - 15,14,15,15,15,15,15,10,0,0,12,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,13,1,2,14,15,15,15,15,15,15,15,15,15, - 15,10,0,0,0,6,6,0,0,0,5,12,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,12,12, - 15,15,15,15,15,15,15,15,13,0,0,11,15,15,15,15, - 15,15,15,15,15,15,15,9,0,1,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,7,0,8,15,15,15,15,15,15,15,15,15,15, - 15,9,0,0,4,15,15,8,0,0,0,1,5,13,15,15, - 15,15,15,15,15,15,15,15,15,15,12,8,7,6,5,3, - 3,3,4,12,15,15,15,15,15,15,15,15,15,7,0,6, - 15,15,15,15,15,15,15,15,14,1,0,10,15,15,15,15, - 15,15,15,15,15,15,15,6,0,3,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,13,1,0,13,15,15,15,15,15,15,15,15,15,15, - 15,14,7,8,13,15,15,15,11,2,0,0,0,0,5,11, - 15,15,15,15,15,15,15,15,13,3,0,0,0,0,0,0, - 0,0,0,5,15,15,15,15,15,15,15,15,12,1,0,0, - 3,11,15,15,15,15,15,15,13,1,0,10,15,15,15,15, - 15,15,15,15,15,15,15,3,0,5,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,9,0,5,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,14,8,1,0,0,0,0, - 4,12,15,15,15,15,15,15,4,0,0,0,0,0,0,0, - 0,0,0,2,15,15,15,15,15,15,15,14,4,0,0,0, - 0,0,9,15,15,15,15,15,14,1,0,10,15,15,15,15, - 15,15,15,15,15,15,15,2,0,9,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,14,4,0,11,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,14,8,2,0,0, - 0,0,4,10,14,15,15,15,4,0,0,0,0,0,0,0, - 0,0,0,3,15,15,15,15,15,15,15,6,0,0,0,2, - 3,0,0,8,15,15,15,15,14,1,0,10,15,15,15,15, - 15,15,15,15,15,15,15,1,0,9,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 14,5,0,4,14,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,14,9,3, - 0,0,0,0,2,5,10,15,5,0,1,11,11,12,13,15, - 11,0,0,7,15,15,15,15,15,15,8,0,0,0,1,12, - 14,6,0,0,7,14,15,15,14,1,0,9,15,15,15,15, - 15,15,15,15,15,15,15,2,0,10,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 9,0,1,13,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,14, - 10,2,0,0,0,0,1,14,4,0,1,14,15,15,15,15, - 9,0,0,9,15,15,15,15,15,9,0,0,0,0,9,15, - 15,15,7,0,0,6,14,15,15,3,0,6,15,15,15,15, - 15,15,15,15,15,15,15,1,0,9,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,9, - 0,0,1,10,14,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,13,1,0,0,0,1,14,3,0,0,14,15,15,15,15, - 5,0,0,11,15,15,15,15,13,1,0,0,0,6,15,15, - 15,15,15,8,0,0,2,10,15,6,0,3,15,15,15,15, - 15,15,15,15,15,15,15,2,0,10,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,13,1, - 0,0,0,0,3,9,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,6,1,0,0,0,8,15,1,0,0,14,15,15,15,15, - 4,0,0,13,15,15,15,14,4,0,0,0,3,14,15,15, - 15,15,15,15,5,0,0,1,14,9,0,1,14,15,15,15, - 15,15,15,15,15,15,15,1,0,9,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,13,1, - 0,0,0,0,0,0,4,12,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 9,0,0,0,0,7,15,15,1,0,0,14,15,15,15,14, - 2,0,1,14,15,15,15,12,0,0,0,3,13,15,15,15, - 15,15,15,9,0,0,0,1,14,12,0,0,12,15,15,15, - 15,15,15,15,15,15,14,1,0,10,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,12, - 3,0,0,0,0,0,0,1,8,14,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,9, - 0,0,0,0,7,15,15,15,1,0,0,14,15,15,15,13, - 0,0,1,15,15,15,15,12,0,0,0,6,14,15,15,15, - 15,15,12,0,0,0,0,3,14,12,0,0,12,15,15,15, - 15,15,15,15,15,15,12,0,0,12,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,13,3,0,0,0,0,0,0,1,6,13,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,12,0, - 0,0,0,3,15,15,15,12,0,0,0,14,15,15,15,11, - 0,0,3,15,15,15,15,15,12,7,0,0,4,14,15,15, - 15,11,1,0,0,0,4,13,15,12,0,0,12,15,15,15, - 15,15,15,15,15,15,10,0,1,14,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,12,7,0,0,0,0,0,0,0,3,8,12,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,4,0, - 0,0,1,13,15,15,15,6,0,0,0,14,15,15,15,8, - 0,0,7,15,15,15,15,15,15,15,8,1,0,2,13,15, - 14,2,0,0,0,4,14,15,15,13,1,0,10,15,15,15, - 15,15,15,15,15,15,9,0,2,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,11,6,2,0,0,0,0,0,0,0,1, - 10,15,15,15,15,15,15,15,15,15,15,15,15,8,0,0, - 0,0,10,15,15,15,15,4,0,0,1,15,15,15,15,4, - 0,0,8,15,15,15,15,15,15,15,15,10,1,0,1,8, - 2,0,0,0,5,15,15,15,15,15,2,0,6,15,15,15, - 15,15,15,15,15,15,9,0,1,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,9,1,0,0,0,0,0,0, - 0,1,7,13,14,15,15,15,15,15,15,15,9,0,0,0, - 0,6,15,15,15,15,15,4,0,0,4,15,15,15,14,1, - 0,0,9,15,15,15,15,15,15,15,15,15,12,2,0,0, - 0,0,0,4,14,15,15,15,15,15,4,0,4,15,15,15, - 15,15,15,15,15,15,7,0,0,14,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,14,11,6,2,0,0,0, - 0,0,0,0,1,9,12,15,15,15,15,14,3,0,0,0, - 4,15,15,15,15,15,15,4,0,0,3,6,4,4,2,0, - 0,0,13,15,15,15,15,15,15,15,15,15,15,12,1,0, - 0,0,3,14,15,15,15,15,15,15,4,0,4,15,15,15, - 15,15,15,15,15,15,5,0,0,12,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,8,2,0, - 0,0,0,0,0,0,0,1,9,15,15,5,0,0,0,0, - 12,15,15,15,15,15,15,4,0,0,0,0,0,0,0,0, - 0,3,15,15,15,15,15,15,15,15,15,15,15,14,4,0, - 0,1,12,15,15,15,15,15,15,15,6,0,1,14,15,15, - 15,15,15,15,15,15,5,0,0,13,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,12, - 7,1,0,0,0,0,0,0,0,5,7,0,0,0,0,10, - 15,15,15,15,15,15,15,7,0,0,0,0,0,0,0,0, - 1,10,15,15,15,15,15,15,15,15,15,15,15,14,3,0, - 3,12,15,15,15,15,15,15,15,15,12,0,0,12,15,15, - 15,15,15,15,15,15,5,0,0,1,1,4,11,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,11,6,1,0,0,0,0,0,0,0,0,0,7,15, - 15,15,15,15,15,15,15,14,7,4,4,4,5,9,12,13, - 14,15,15,15,15,15,15,15,15,15,15,15,15,15,11,9, - 14,15,15,14,12,11,11,11,10,9,7,0,0,5,13,15, - 15,15,15,15,15,12,1,0,0,0,0,0,0,10,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,14,7,1,0,0,0,0,0,3,14,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,13,2,0,0,0,0,0,0,0,0,0,0,0,8, - 15,15,15,15,15,11,0,0,0,0,0,0,0,9,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,13,5,0,0,0,0,12,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,8,0,0,0,0,0,0,0,0,0,0,0,0,5, - 15,15,15,15,15,15,10,5,6,7,7,7,9,14,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,8,3,2,2,2,2,5,14,15, - 15,15,15,15,15,15,15,15,15,10,3,0,6,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,13,3,1,0,1,0,1,1,2,4,4,3,9,14, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,12,4,0,1,6,7,7,4,1,3,13, - 15,15,15,15,15,15,15,15,15,15,14,10,13,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,11,11,15,15,15,15, - 15,15,15,14,14,14,14,14,14,14,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,14,2,0,4,13,15,15,15,15,10,0,12, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,14,13,14,12,12,12,12,12,12,12, - 12,14,15,15,15,15,15,15,15,15,4,14,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,7,1,5,14,15,15,15,15,15,12,1,11, - 15,15,15,13,12,13,15,15,14,11,13,15,15,15,15,15, - 15,15,15,11,6,3,1,1,1,0,0,0,0,0,0,0, - 0,1,4,7,11,14,15,15,15,14,4,15,13,10,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,14,7,4,5, - 12,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,13,1,1,14,15,15,14,10,12,15,11,1,12, - 15,15,11,1,0,4,15,15,6,0,2,14,15,15,15,15, - 15,15,14,8,6,3,3,2,2,1,0,0,0,0,0,0, - 0,0,0,0,0,3,11,15,15,11,8,15,12,6,15,9, - 8,15,15,15,15,15,15,15,15,15,15,15,10,4,4,1, - 4,15,15,15,15,11,6,2,8,14,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,12,0,4,15,15,15,11,2,10,15,9,1,13, - 15,13,1,7,6,2,14,14,1,2,1,14,15,15,15,15, - 15,15,15,15,15,15,15,15,15,13,12,12,12,12,12,12, - 11,11,11,10,9,10,12,15,15,6,7,15,9,4,15,4, - 1,14,15,15,15,15,15,15,15,15,15,15,2,11,15,4, - 4,15,15,15,15,3,9,4,0,9,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,12,0,4,15,15,15,5,0,6,6,1,9,15, - 15,4,1,13,10,1,13,9,2,7,1,14,14,14,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,3,5,15,3,5,14,1, - 0,12,13,9,14,15,15,15,15,15,15,15,2,2,4,1, - 6,15,15,15,14,1,5,6,0,9,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,12,0,4,15,15,15,12,4,2,2,10,15,15, - 11,0,6,15,12,0,10,7,9,10,1,14,7,14,15,15, - 15,15,15,15,15,15,13,12,11,11,10,9,9,10,11,13, - 15,15,15,15,15,15,15,15,15,1,9,15,2,7,14,1, - 0,10,7,0,8,15,15,15,15,15,15,15,11,4,4,4, - 13,15,15,15,15,10,2,2,4,14,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,12,0,4,15,15,15,15,15,15,15,15,15,15, - 4,2,14,15,15,1,9,5,14,9,1,14,8,14,15,15, - 15,15,15,15,15,10,3,0,1,0,0,0,0,0,0,5, - 15,15,15,15,15,15,15,15,15,1,9,14,1,8,14,1, - 0,11,13,6,11,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,14,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,12,0,4,15,15,15,15,15,15,15,15,15,11, - 0,6,15,15,15,1,5,3,13,10,0,6,8,15,15,15, - 15,15,15,15,15,15,13,12,12,11,10,9,9,10,11,13, - 15,15,15,15,15,15,15,15,15,1,9,12,1,11,15,4, - 1,14,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 14,10,4,2,12,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,12,1,3,14,15,15,15,15,15,15,15,15,4, - 3,14,15,15,15,5,1,8,15,14,5,2,9,15,15,15, - 15,15,15,15,15,15,15,15,15,11,9,13,15,15,15,15, - 15,15,15,15,15,15,15,15,15,1,9,12,1,12,15,13, - 11,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 10,2,9,2,3,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,14,4,0,5,14,15,15,15,15,15,15,11,0, - 6,15,15,15,15,15,14,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,8,1,0,3,15,15,15,15, - 15,15,15,15,15,15,15,15,15,1,9,15,11,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 7,1,12,6,1,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,11,1,0,3,8,9,9,10,11,9,5,4, - 13,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,12,9,13,15,15,15,15, - 15,15,15,15,15,15,15,15,15,5,11,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 10,3,4,1,5,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,12,2,0,0,0,0,0,0,1,8,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,14,12,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,13,8,8,10,9,10,11,14,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15 - }; diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/plugin_info.c kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/plugin_info.c --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/plugin_info.c 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/plugin_info.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,202 +0,0 @@ -#include "goom_plugin_info.h" -#include "goom_fx.h" -#include "cpu_info.h" -#include "default_scripts.h" -#include "drawmethods.h" -#include -#include - - -#ifdef CPU_POWERPC -#include -#include -#include "ppc_zoom_ultimate.h" -#include "ppc_drawings.h" -#endif /* CPU_POWERPC */ - - -#ifdef CPU_X86 -#include "mmx.h" -#endif /* CPU_X86 */ - - - -static void setOptimizedMethods(PluginInfo *p) { - - unsigned int cpuFlavour = cpu_flavour(); - - /* set default methods */ - p->methods.draw_line = draw_line; - p->methods.zoom_filter = zoom_filter_c; -/* p->methods.create_output_with_brightness = create_output_with_brightness;*/ - -#ifdef CPU_X86 - if (cpuFlavour & CPU_OPTION_XMMX) { -#ifdef VERBOSE - printf ("Extented MMX detected. Using the fastest methods !\n"); -#endif - p->methods.draw_line = draw_line_mmx; - p->methods.zoom_filter = zoom_filter_xmmx; - } - else if (cpuFlavour & CPU_OPTION_MMX) { -#ifdef VERBOSE - printf ("MMX detected. Using fast methods !\n"); -#endif - p->methods.draw_line = draw_line_mmx; - p->methods.zoom_filter = zoom_filter_mmx; - } -#ifdef VERBOSE - else - printf ("Too bad ! No SIMD optimization available for your CPU.\n"); -#endif -#endif /* CPU_X86 */ - -#ifdef CPU_POWERPC - - if ((cpuFlavour & CPU_OPTION_64_BITS) != 0) { -/* p->methods.create_output_with_brightness = ppc_brightness_G5; */ - p->methods.zoom_filter = ppc_zoom_generic; - } - else if ((cpuFlavour & CPU_OPTION_ALTIVEC) != 0) { -/* p->methods.create_output_with_brightness = ppc_brightness_G4; */ - p->methods.zoom_filter = ppc_zoom_G4; - } - else - { -/* p->methods.create_output_with_brightness = ppc_brightness_generic;*/ - p->methods.zoom_filter = ppc_zoom_generic; - } -#endif /* CPU_POWERPC */ - -} - -void plugin_info_init(PluginInfo *pp, int nbVisuals) { - - PluginInfo p; - int i; - - p.sound.speedvar = p.sound.accelvar = p.sound.totalgoom = 0; - p.sound.prov_max = 0; - p.sound.goom_limit = 1; - p.sound.allTimesMax = 1; - - p.sound.volume_p = secure_f_feedback("Sound Volume"); - p.sound.accel_p = secure_f_feedback("Sound Acceleration"); - p.sound.speed_p = secure_f_feedback("Sound Speed"); - p.sound.goom_limit_p = secure_f_feedback("Goom Limit"); - p.sound.last_goom_p = secure_f_feedback("Goom Detection"); - p.sound.last_biggoom_p = secure_f_feedback("Big Goom Detection"); - p.sound.goom_power_p = secure_f_feedback("Goom Power"); - - p.sound.biggoom_speed_limit_p = secure_i_param("Big Goom Speed Limit"); - IVAL(p.sound.biggoom_speed_limit_p) = 10; - IMIN(p.sound.biggoom_speed_limit_p) = 0; - IMAX(p.sound.biggoom_speed_limit_p) = 100; - ISTEP(p.sound.biggoom_speed_limit_p) = 1; - - p.sound.biggoom_factor_p = secure_i_param("Big Goom Factor"); - IVAL(p.sound.biggoom_factor_p) = 10; - IMIN(p.sound.biggoom_factor_p) = 0; - IMAX(p.sound.biggoom_factor_p) = 100; - ISTEP(p.sound.biggoom_factor_p) = 1; - - p.sound.params = plugin_parameters ("Sound", 11); - - p.nbParams = 0; - p.nbVisuals = nbVisuals; - p.visuals = (VisualFX**)malloc(sizeof(VisualFX*)*nbVisuals); - - *pp = p; - pp->sound.params.params[0] = &pp->sound.biggoom_speed_limit_p; - pp->sound.params.params[1] = &pp->sound.biggoom_factor_p; - pp->sound.params.params[2] = 0; - pp->sound.params.params[3] = &pp->sound.volume_p; - pp->sound.params.params[4] = &pp->sound.accel_p; - pp->sound.params.params[5] = &pp->sound.speed_p; - pp->sound.params.params[6] = 0; - pp->sound.params.params[7] = &pp->sound.goom_limit_p; - pp->sound.params.params[8] = &pp->sound.goom_power_p; - pp->sound.params.params[9] = &pp->sound.last_goom_p; - pp->sound.params.params[10] = &pp->sound.last_biggoom_p; - - pp->statesNumber = 8; - pp->statesRangeMax = 510; - { - GoomState states[8] = { - {1,0,0,1,4, 0, 100}, - {1,0,0,0,1, 101, 140}, - {1,0,0,1,2, 141, 200}, - {0,1,0,1,2, 201, 260}, - {0,1,0,1,0, 261, 330}, - {0,1,1,1,4, 331, 400}, - {0,0,1,0,5, 401, 450}, - {0,0,1,1,1, 451, 510}}; - for (i=0;i<8;++i) - pp->states[i] = states[i]; - } - pp->curGState = &(pp->states[6]); - - /* datas for the update loop */ - pp->update.lockvar = 0; - pp->update.goomvar = 0; - pp->update.loopvar = 0; - pp->update.stop_lines = 0; - pp->update.ifs_incr = 1; /* dessiner l'ifs (0 = non: > = increment) */ - pp->update.decay_ifs = 0; /* disparition de l'ifs */ - pp->update.recay_ifs = 0; /* dedisparition de l'ifs */ - pp->update.cyclesSinceLastChange = 0; - pp->update.drawLinesDuration = 80; - pp->update.lineMode= pp->update.drawLinesDuration; - - pp->update.switchMultAmount = (29.0f/30.0f); - pp->update.switchIncrAmount = 0x7f; - pp->update.switchMult = 1.0f; - pp->update.switchIncr = pp->update.switchIncrAmount; - - pp->update.stateSelectionRnd = 0; - pp->update.stateSelectionBlocker = 0; - pp->update.previousZoomSpeed = 128; - pp->update.timeOfTitleDisplay = 0; - - pp->update_message.affiche = 0; - - { - ZoomFilterData zfd = { - 127, 8, 16, - 1, 1, 0, NORMAL_MODE, - 0, 0, 0, 0, 0 - }; - pp->update.zoomFilterData = zfd; - } - - setOptimizedMethods(pp); - - pp->scanner = gsl_new(); - pp->main_scanner = gsl_new(); - pp->main_script_str = GOOM_MAIN_SCRIPT; - - for (i = 0; i < 0xffff; i++) { - pp->sintable[i] = (int) (1024 * sin ((double) i * 360 / (sizeof (pp->sintable) / sizeof (pp->sintable[0]) - 1) * 3.141592 / 180) + .5); - /* sintable [us] = (int)(1024.0f * sin (us*2*3.31415f/0xffff)) ; */ - } -} - -void plugin_info_add_visual(PluginInfo *p, int i, VisualFX *visual) { - p->visuals[i] = visual; - if (i == p->nbVisuals-1) { - ++i; - p->nbParams = 1; - while (i--) { - if (p->visuals[i]->params) - p->nbParams++; - } - p->params = (PluginParameters *)malloc(sizeof(PluginParameters)*p->nbParams); - i = p->nbVisuals; - p->nbParams = 1; - p->params[0] = p->sound.params; - while (i--) { - if (p->visuals[i]->params) - p->params[p->nbParams++] = *(p->visuals[i]->params); - } - } -} diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/pngload.c kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/pngload.c --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/pngload.c 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/pngload.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,141 +0,0 @@ -#include - -int -loadpng (char *file_name, int *w, int *h, unsigned int ***buf) -{ - FILE *fp; - png_uint_32 width, height; - int bit_depth, - - color_type, interlace_type, compression_type, filter_type; - int rowbytes; - - png_structp png_ptr; - png_infop info_ptr; - png_infop end_info; - - int x, y; - unsigned int **row_pointers; - - /* OUVERTURE DU FICHIER */ - - fp = fopen (file_name, "rb"); - - if (!fp) { - // fprintf (stderr, "Couldn't open file\n"); - return 1; - } - - /* CREATION DES STRUCTURES */ - png_ptr = png_create_read_struct - (PNG_LIBPNG_VER_STRING, (png_voidp) NULL, NULL, NULL); - if (!png_ptr) { - fprintf (stderr, "Memory error\n"); - return 1; - } - - info_ptr = png_create_info_struct (png_ptr); - if (!info_ptr) { - png_destroy_read_struct (&png_ptr, (png_infopp) NULL, (png_infopp) NULL); - fprintf (stderr, "Read error 1\n"); - return 1; - } - - end_info = png_create_info_struct (png_ptr); - if (!end_info) { - png_destroy_read_struct (&png_ptr, &info_ptr, (png_infopp) NULL); - fprintf (stderr, "Read error 2\n"); - return 1; - } - - /* CHARGEMENT DE L'IMAGE */ - if (setjmp (png_ptr->jmpbuf)) { - png_destroy_read_struct (&png_ptr, &info_ptr, &end_info); - fclose (fp); - fprintf (stderr, "Erreur de chargement\n"); - return 1; - } - - png_init_io (png_ptr, fp); - png_set_read_status_fn (png_ptr, NULL); - - png_read_info (png_ptr, info_ptr); - - png_get_IHDR (png_ptr, info_ptr, &width, &height, - &bit_depth, &color_type, &interlace_type, - &compression_type, &filter_type); -/* - printf ("taille : %dx%d\n",width,height); - printf ("depth : %d\n",bit_depth); - printf ("color type : "); - switch (color_type) { - case PNG_COLOR_TYPE_GRAY: - printf ("PNG_COLOR_TYPE_GRAY (bit depths 1, 2, 4, 8, 16)\n"); - break; - case PNG_COLOR_TYPE_GRAY_ALPHA: - printf ("PNG_COLOR_TYPE_GRAY_ALPHA (bit depths 8, 16)\n"); - break; - case PNG_COLOR_TYPE_PALETTE: - printf ("PNG_COLOR_TYPE_PALETTE (bit depths 1, 2, 4, 8)\n"); - break; - case PNG_COLOR_TYPE_RGB: - printf ("PNG_COLOR_TYPE_RGB (bit_depths 8, 16)\n"); - break; - case PNG_COLOR_TYPE_RGB_ALPHA: - printf ("PNG_COLOR_TYPE_RGB_ALPHA (bit_depths 8, 16)\n"); - break; - } - */ - // printf ("PNG_COLOR_MASK_ALPHA : %x\n", PNG_COLOR_MASK_ALPHA); - // printf ("PNG_COLOR_MASK_COLOR : %x\n", PNG_COLOR_MASK_COLOR); - // printf ("PNG_COLOR_MASK_PALETTE : %x\n", PNG_COLOR_MASK_PALETTE); - - if (color_type == PNG_COLOR_TYPE_PALETTE && bit_depth <= 8) - png_set_palette_to_rgb (png_ptr); - - if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8) - png_set_expand_gray_1_2_4_to_8 (png_ptr); - else if (color_type == PNG_COLOR_TYPE_GRAY || - color_type == PNG_COLOR_TYPE_GRAY_ALPHA) - png_set_gray_to_rgb (png_ptr); - - if (png_get_valid (png_ptr, info_ptr, PNG_INFO_tRNS)) - png_set_tRNS_to_alpha (png_ptr); - - png_read_update_info (png_ptr, info_ptr); - -// printf ("channels : %d\n", png_get_channels (png_ptr, info_ptr)); - rowbytes = png_get_rowbytes (png_ptr, info_ptr); -// printf ("rowbytes : %d\n", rowbytes); - - row_pointers = (unsigned int **) malloc (height * sizeof (unsigned int *)); - - for (y = 0; y < height; y++) - row_pointers[y] = (unsigned int *) malloc (4 * width); - png_read_image (png_ptr, (png_bytepp) row_pointers); - - // for (y=0;y unsigned int * frompixmap -; r4 <=> unsigned int * topixmap -; r5 <=> unsigned int sizeX (in pixels) -; r6 <=> unsigned int sizeY (in pixels) -; r7 <=> unsigned int * brutS -; r8 <=> unsigned int * brutD -; r9 <=> unsigned int buffratio -; r10 <=> int [16][16] precalccoeffs - -; globals after init -; r3 <=> frompixmap - 1 byte needed for preincremental fetch (replaces r3) -; r4 <=> topixmap - 1 byte needed for preincremental fetch (replaces r4) -; r5 <=> ax = x max in 16th of pixels (replaces old r5) -; r6 <=> ay = y max in 16th of pixels (replaces old r6) -; r20 <=> row size in bytes -; r12 <=> 0xFF00FF (mask for parallel 32 bits pixs computing) -; r30 <=> brutS - 1 byte needed for preincremental fetch (replaces r7) -; r31 <=> brutD - 1 byte needed for preincremental fetch (replaces r8) - -; ABI notes : -; r1 is the Stack Pointer (SP) => Do not use -; r13..r31 are non-volatiles => Do not use - -_ppc_zoom_generic: - -; Saves the used non volatile registers in the Mach-O stack s Red-Zone -stmw r18,-56(r1) - -; init -li r18,0 ; Default value if out of range : 0 (Black) -mr r11,r10 -lis r12,0xFF -mullw r2,r5,r6 ; Number of pixels to compute -subi r30,r8,0 -slwi r20,r5,2 -srawi r19,r20,2 -ori r12,r12,0xFF -subi r5,r5,1 -subi r6,r6,1 -mtspr ctr,r2 ; Init the loop count (one loop per pixel computed) -subi r31,r7,0 -subi r4,r4,4 -slwi r5,r5,4 -slwi r6,r6,4 - -;pre init for loop -lwz r2,0(r31) ; px -lwz r29,4(r31) ; py -lwz r8,0(r30) ; px2 -lwz r10,4(r30) ; py2 - -L1: - -; computes dynamically the position to fetch -sub r8,r8,r2 -sub r10,r10,r29 -mullw r8,r8,r9 -addi r31,r31,8 -mullw r10,r10,r9 -addi r30,r30,8 - -srawi r8,r8,16 -srawi r10,r10,16 -add r2,r2,r8 -add r29,r29,r10 - -; if px>ax or py>ay goto outofrange -; computes the attenuation coeffs and the original point address -rlwinm r10,r2,6,28-6,31-6 ; r10 <- (r2 << 2) & 0x000002D0 (r10=(r2%16)*4*16) -cmpl cr6,0,r2,r5 -rlwimi r10, r29, 2, 28-2, 31-2 ; r10 <- ((r29 << 2) & 0x0000002D) | (r10 & !0x0000002D) (r10=(r10%16)*4 | r10) -cmpl cr7,0,r29,r6 -srawi r29,r29,4 ; pos computing -bge- cr6,L4 -srawi r2,r2,4 ; pos computing -mullw r29, r29,r19 ; pos computing -bge- cr7,L4 - -; Channels notation : 00112233 (AARRVVBB) - -add r2,r2,r29 ; pos computing -lwzx r10,r11,r10 ; Loads coefs -slwi r2,r2,2 ; pos computing -add r2,r2,r3 ; pos computing -rlwinm r21,r10,0,24,31 ; Isolates coef1 (??????11 -> 00000011) -lwz r25,0(r2) ; Loads col1 -> r25 -lwz r26,4(r2) ; Loads col2 -> r26 -rlwinm r22,r10,24,24,31 ; Isolates coef2 (????22?? -> 00000022) -rlwinm r23,r10,16,24,31 ; Isolates coef3 (??33???? -> 00000033) -add r2,r2,r20 ; Adds one line for future load of col3 and col4 -and r8, r25,r12 ; Masks col1 channels 1 & 3 : 0x00XX00XX -rlwinm r24,r10,8,24,31 ; Isolates coef4 (44?????? -> 00000044) -andi. r25,r25,0xFF00 ; Masks col1 channel 2 : 0x0000XX00 -mullw r8, r8, r21 ; Applies coef1 on col1 channels 1 & 3 - - -; computes final pixel color -and r10,r26,r12 ; Masks col2 channels 1 & 3 : 0x00XX00XX -lwz r27,0(r2) ; Loads col3 -> r27 -mullw r10,r10,r22 ; Applies coef2 on col2 channels 1 & 3 -mullw r25,r25,r21 ; Applies coef1 on col1 channel 2 -andi. r29,r26,0xFF00 ; Masks col2 channel 2 : 0x0000XX00 -mullw r29,r29,r22 ; Applies coef2 on col2 channel 2 -lwz r28,4(r2) ; Loads col4 -> r28 -add r8 ,r8 ,r10 ; Adds col1 & col2 channels 1 & 3 -and r10,r27,r12 ; Masks col3 channels 1 & 3 : 0x00XX00XX -add r25,r25,r29 ; Adds col1 & col2 channel 2 -mullw r10,r10,r23 ; Applies coef3 on col3 channels 1 & 3 -andi. r29,r27,0xFF00 ; Masks col3 channel 2 : 0x0000XX00 -mullw r29,r29,r23 ; Applies coef3 on col3 channel 2 -lwz r2,0(r31) ; px -add r7 ,r8 ,r10 ; Adds col3 to (col1 + col2) channels 1 & 3 -and r10,r28,r12 ; Masks col4 channels 1 & 3 : 0x00XX00XX -mullw r10,r10,r24 ; Applies coef4 on col4 channels 1 & 3 -add r25,r25,r29 ; Adds col 3 to (col1 + col2) channel 2 -lwz r8,0(r30) ; px2 -andi. r28,r28,0xFF00 ; Masks col4 channel 2 : 0x0000XX00 -add r7 ,r7 ,r10 ; Adds col4 to (col1 + col2 + col3) channels 1 & 3 -lwz r10,4(r30) ; py2 -mullw r28,r28,r24 ; Applies coef4 on col4 channel 2 -srawi r7, r7, 8 ; (sum of channels 1 & 3) >> 8 -lwz r29,4(r31) ; py -add r25,r25,r28 ; Adds col 4 to (col1 + col2 + col3) channel 2 -rlwimi r7, r25, 24, 16, 23 ; (((sum of channels 2) >> 8 ) & 0x0000FF00) | ((sum of channels 1 and 3) & 0xFFFF00FF) -stwu r7,4(r4) ; Stores the computed pixel -bdnz L1 ; Iterate again if needed -b L3 ;goto end ; If not, returns from the function - - -; if out of range -L4: -stwu r18,4(r4) -lwz r8,0(r30) ; px2 -lwz r10,4(r30) ; py2 -lwz r2,0(r31) ; px -lwz r29,4(r31) ; py -bdnz L1 - - -L3: - -; Restore saved registers and return -lmw r18,-56(r1) -blr - - - - - - - - -_ppc_zoom_G4: - -; Saves the used non volatile registers in the Mach-O stack s Red-Zone -stmw r17,-60(r1) - -; init -li r18,0 ; Default value if out of range : 0 (Black) -mr r11,r10 -lis r12,0xFF -mullw r2,r5,r6 ; Number of pixels to compute -subi r30,r8,0 -slwi r20,r5,2 -srawi r19,r20,2 -ori r12,r12,0xFF -subi r5,r5,1 -subi r6,r6,1 -mtspr ctr,r2 ; Init the loop count (one loop per pixel computed) -subi r31,r7,0 -subi r4,r4,4 -slwi r5,r5,4 -slwi r6,r6,4 - -;pre init for loop -lwz r2,0(r31) ; px -lwz r29,4(r31) ; py -lwz r8,0(r30) ; px2 -lwz r10,4(r30) ; py2 - -;********************* -lis r17,0x0F01 - -L100: - -; computes dynamically the position to fetch -;mullw r8,r8,r29 -;mullw r2,r2,r29 -;add r2,r8,r2 -;srawi r2,r2,17 - -sub r8,r8,r2 -sub r10,r10,r29 -mullw r8,r8,r9 -addi r31,r31,8 -mullw r10,r10,r9 -addi r30,r30,8 - -dst r30,r17,0 - -srawi r8,r8,16 -srawi r10,r10,16 -add r2,r2,r8 -add r29,r29,r10 - -dst r31,r17,1 - -; if px>ax or py>ay goto outofrange -; computes the attenuation coeffs and the original point address -rlwinm r10,r2,6,28-6,31-6 ; r10 <- (r2 << 2) & 0x000002D0 (r10=(r2%16)*4*16) -cmpl cr6,0,r2,r5 -rlwimi r10, r29, 2, 28-2, 31-2 ; r10 <- ((r29 << 2) & 0x0000002D) | (r10 & !0x0000002D) (r10=(r29%16)*4 | r10) -cmpl cr7,0,r29,r6 -srawi r29,r29,4 ; pos computing -bge- cr6,L400 -srawi r2,r2,4 ; pos computing -mullw r29, r29,r19 ; pos computing -bge- cr7,L400 - -; Channels notation : 00112233 (AARRVVBB) - -add r2,r2,r29 ; pos computing -lwzx r10,r11,r10 ; Loads coefs -slwi r2,r2,2 ; pos computing -add r2,r2,r3 ; pos computing -rlwinm r21,r10,0,24,31 ; Isolates coef1 (??????11 -> 00000011) -lwz r25,0(r2) ; Loads col1 -> r25 -lwz r26,4(r2) ; Loads col2 -> r26 -rlwinm r22,r10,24,24,31 ; Isolates coef2 (????22?? -> 00000022) -rlwinm r23,r10,16,24,31 ; Isolates coef3 (??33???? -> 00000033) -add r2,r2,r20 ; Adds one line for future load of col3 and col4 -and r8, r25,r12 ; Masks col1 channels 1 & 3 : 0x00XX00XX -rlwinm r24,r10,8,24,31 ; Isolates coef4 (44?????? -> 00000044) -dst r2,r17,2 -andi. r25,r25,0xFF00 ; Masks col1 channel 2 : 0x0000XX00 -mullw r8, r8, r21 ; Applies coef1 on col1 channels 1 & 3 - - -; computes final pixel color -and r10,r26,r12 ; Masks col2 channels 1 & 3 : 0x00XX00XX -lwz r27,0(r2) ; Loads col3 -> r27 -mullw r10,r10,r22 ; Applies coef2 on col2 channels 1 & 3 -mullw r25,r25,r21 ; Applies coef1 on col1 channel 2 -andi. r29,r26,0xFF00 ; Masks col2 channel 2 : 0x0000XX00 -mullw r29,r29,r22 ; Applies coef2 on col2 channel 2 -lwz r28,4(r2) ; Loads col4 -> r28 -add r8 ,r8 ,r10 ; Adds col1 & col2 channels 1 & 3 -and r10,r27,r12 ; Masks col3 channels 1 & 3 : 0x00XX00XX -add r25,r25,r29 ; Adds col1 & col2 channel 2 -mullw r10,r10,r23 ; Applies coef3 on col3 channels 1 & 3 -andi. r29,r27,0xFF00 ; Masks col3 channel 2 : 0x0000XX00 -mullw r29,r29,r23 ; Applies coef3 on col3 channel 2 -lwz r2,0(r31) ; px -add r7 ,r8 ,r10 ; Adds col3 to (col1 + col2) channels 1 & 3 -and r10,r28,r12 ; Masks col4 channels 1 & 3 : 0x00XX00XX -mullw r10,r10,r24 ; Applies coef4 on col4 channels 1 & 3 -add r25,r25,r29 ; Adds col 3 to (col1 + col2) channel 2 -lwz r8,0(r30) ; px2 -andi. r28,r28,0xFF00 ; Masks col4 channel 2 : 0x0000XX00 -add r7 ,r7 ,r10 ; Adds col4 to (col1 + col2 + col3) channels 1 & 3 -lwz r10,4(r30) ; py2 -mullw r28,r28,r24 ; Applies coef4 on col4 channel 2 -srawi r7, r7, 8 ; (sum of channels 1 & 3) >> 8 -lwz r29,4(r31) ; py -add r25,r25,r28 ; Adds col 4 to (col1 + col2 + col3) channel 2 -rlwimi r7, r25, 24, 16, 23 ; (((sum of channels 2) >> 8 ) & 0x0000FF00) | ((sum of channels 1 and 3) & 0xFFFF00FF) -stwu r7,4(r4) ; Stores the computed pixel -bdnz L100 ; Iterate again if needed -b L300 ;goto end ; If not, returns from the function - - -; if out of range -L400: -stwu r18,4(r4) -lwz r8,0(r30) ; px2 -lwz r10,4(r30) ; py2 -lwz r2,0(r31) ; px -lwz r29,4(r31) ; py -bdnz L100 - - -L300: - -; Restore saved registers and return -lmw r17,-60(r1) -blr diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/powerpc/ppc_doubling.s kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/powerpc/ppc_doubling.s --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/powerpc/ppc_doubling.s 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/powerpc/ppc_doubling.s 1970-01-01 00:00:00.000000000 +0000 @@ -1,50 +0,0 @@ -.section regular,__TEXT -.globl _ppc_doubling ; name of the function to call by C program - -; width (src width)->r3 -; myx (src) ->r4 -; myX (dest) ->r5 -; myX2 (dest + 1 complete line)->r6 -; heigth (src height)->r7 -; inc (increment for next line in dest) ->r8 - -_ppc_doubling: - -mtspr ctr,r3 - -addi r4,r4,-4 -addi r5,r5,-4 -addi r6,r6,-4 - -1:;boucle: - -lwzu r10,4(r4) -stwu r10,4(r5) -stwu r10,4(r5) -stwu r10,4(r6) -stwu r10,4(r6) - -bdnz 1boucle - -subi r7,r7,1 -add r5,r5,r8 -cmpwi cr1,r7,0 -add r6,r6,r8 -mtspr ctr,r3 -bgt cr1,1boucle - -blr - -;backup - -lwzu r10,4(r4) -stwu r10,4(r5) -stwu r10,4(r6) -stwu r10,4(r5) -stwu r10,4(r6) - -lwzu r10,4(r4) -stwu r10,4(r5) -stwu r10,4(r6) -stwu r10,4(r5) -stwu r10,4(r6) diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/ppc_drawings.h kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/ppc_drawings.h --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/ppc_drawings.h 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/ppc_drawings.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -/* - * ppc_drawings.h - * Goom - * - * Created by Guillaume Borios on Sun Dec 28 2003. - * Copyright (c) 2003 iOS. All rights reserved. - * - */ - -/* Generic PowerPC Code */ -void ppc_brightness_generic(Pixel *src, Pixel *dest, int size, int coeff); - -/* G4 Specific PowerPC Code (Possible use of Altivec and Data Streams) */ -void ppc_brightness_G4(Pixel *src, Pixel *dest, int size, int coeff); - -/* G5 Specific PowerPC Code (Possible use of Altivec) */ -void ppc_brightness_G5(Pixel *src, Pixel *dest, int size, int coeff); - diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/ppc_drawings.s kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/ppc_drawings.s --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/ppc_drawings.s 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/ppc_drawings.s 1970-01-01 00:00:00.000000000 +0000 @@ -1,381 +0,0 @@ -; PowerPC optimized drawing methods for Goom -; © 2003 Guillaume Borios -; This Source Code is released under the terms of the General Public License - -; Change log : -; 30 May 2003 : File creation - -; Section definition : We use a read only code section for the whole file -.section __TEXT,__text,regular,pure_instructions - - -; -------------------------------------------------------------------------------------- -; Single 32b pixel drawing macros -; Usage : -; DRAWMETHOD_XXXX_MACRO *pixelIN, *pixelOUT, COLOR, WR1, WR2, WR3, WR4 -; Only the work registers (WR) can be touched by the macros -; -; Available methods : -; DRAWMETHOD_DFLT_MACRO : Default drawing method (Actually OVRW) -; DRAWMETHOD_PLUS_MACRO : RVB Saturated per channel addition (SLOWEST) -; DRAWMETHOD_HALF_MACRO : 50% Transparency color drawing -; DRAWMETHOD_OVRW_MACRO : Direct COLOR drawing (FASTEST) -; DRAWMETHOD_B_OR_MACRO : Bitwise OR -; DRAWMETHOD_BAND_MACRO : Bitwise AND -; DRAWMETHOD_BXOR_MACRO : Bitwise XOR -; DRAWMETHOD_BNOT_MACRO : Bitwise NOT -; -------------------------------------------------------------------------------------- - -.macro DRAWMETHOD_OVRW_MACRO - stw $2,0($1) ;; *$1 <- $2 -.endmacro - -.macro DRAWMETHOD_B_OR_MACRO - lwz $3,0($0) ;; $3 <- *$0 - or $3,$3,$2 ;; $3 <- $3 | $2 - stw $3,0($1) ;; *$1 <- $3 -.endmacro - -.macro DRAWMETHOD_BAND_MACRO - lwz $3,0($0) ;; $3 <- *$0 - and $3,$3,$2 ;; $3 <- $3 & $2 - stw $3,0($1) ;; *$1 <- $3 -.endmacro - -.macro DRAWMETHOD_BXOR_MACRO - lwz $3,0($0) ;; $3 <- *$0 - xor $3,$3,$2 ;; $3 <- $3 ^ $2 - stw $3,0($1) ;; *$1 <- $3 -.endmacro - -.macro DRAWMETHOD_BNOT_MACRO - lwz $3,0($0) ;; $3 <- *$0 - nand $3,$3,$3 ;; $3 <- ~$3 - stw $3,0($1) ;; *$1 <- $3 -.endmacro - -.macro DRAWMETHOD_PLUS_MACRO - lwz $4,0($0) ;; $4 <- *$0 - andi. $3,$4,0xFF00 ;; $3 <- $4 & 0x0000FF00 - andi. $5,$2,0xFF00 ;; $5 <- $2 & 0x0000FF00 - add $3,$3,$5 ;; $3 <- $3 + $5 - rlwinm $5,$3,15,0,0 ;; $5 <- 0 | ($3[15] << 15) - srawi $5,$5,23 ;; $5 <- $5 >> 23 (algebraic for sign extension) - or $3,$3,$5 ;; $3 <- $3 | $5 - lis $5,0xFF ;; $5 <- 0x00FF00FF - addi $5,$5,0xFF - and $4,$4,$5 ;; $4 <- $4 & $5 - and $6,$2,$5 ;; $6 <- $2 & $5 - add $4,$4,$6 ;; $4 <- $4 + $6 - rlwinm $6,$4,7,0,0 ;; $6 <- 0 | ($4[7] << 7) - srawi $6,$6,15 ;; $6 <- $6 >> 15 (algebraic for sign extension) - rlwinm $5,$4,23,0,0 ;; $5 <- 0 | ($4[23] << 23) - srawi $5,$5,31 ;; $5 <- $5 >> 31 (algebraic for sign extension) - rlwimi $6,$5,0,24,31 ;; $6[24..31] <- $5[24..31] - or $4,$4,$6 ;; $4 <- $4 | $6 - rlwimi $4,$3,0,16,23 ;; $4[16..23] <- $3[16..23] - stw $4,0($1) ;; *$1 <- $4 -.endmacro - -.macro DRAWMETHOD_HALF_MACRO - lwz $4,0($0) ;; $4 <- *$0 - andi. $3,$4,0xFF00 ;; $3 <- $4 & 0x0000FF00 - andi. $5,$2,0xFF00 ;; $5 <- $2 & 0x0000FF00 - add $3,$3,$5 ;; $3 <- $3 + $5 - lis $5,0xFF ;; $5 <- 0x00FF00FF - addi $5,$5,0xFF - and $4,$4,$5 ;; $4 <- $4 & $5 - and $5,$2,$5 ;; $5 <- $2 & $5 - add $4,$4,$5 ;; $4 <- $4 + $5 - srwi $4,$4,1 ;; $4 <- $4 >> 1 - rlwimi $4,$3,31,16,23 ;; $4[16..23] <- $3[15..22] - stw $4,0($1) ;; *$1 <- $4 -.endmacro - -.macro DRAWMETHOD_DFLT_MACRO - DRAWMETHOD_PLUS_MACRO -.endmacro - -; -------------------------------------------------------------------------------------- - - - -; ************************************************************************************** -; void DRAWMETHOD_PLUS_PPC(unsigned int * buf, unsigned int _col); -; void DRAWMETHOD_PLUS_2_PPC(unsigned * in, unsigned int * out, unsigned int _col); -; ************************************************************************************** -.globl _DRAWMETHOD_PLUS_2_PPC -.align 3 -_DRAWMETHOD_PLUS_2_PPC: - DRAWMETHOD_PLUS_MACRO r3,r4,r5,r6,r7,r8,r9 - blr ;; return - -.globl _DRAWMETHOD_PLUS_PPC -.align 3 -_DRAWMETHOD_PLUS_PPC: - DRAWMETHOD_PLUS_MACRO r3,r3,r4,r5,r6,r7,r9 - blr ;; return - - -; ************************************************************************************** -; void DRAWMETHOD_HALF_PPC(unsigned int * buf, unsigned int _col); -; void DRAWMETHOD_HALF_2_PPC(unsigned * in, unsigned int * out, unsigned int _col); -; ************************************************************************************** -.globl _DRAWMETHOD_HALF_2_PPC -.align 3 -_DRAWMETHOD_HALF_2_PPC: - DRAWMETHOD_HALF_MACRO r3,r4,r5,r6,r7,r8 - blr ;; return - -.globl _DRAWMETHOD_HALF_PPC -.align 3 -_DRAWMETHOD_HALF_PPC: - DRAWMETHOD_HALF_MACRO r3,r3,r4,r5,r6,r7 - blr ;; return - - -; ************************************************************************************** -; void DRAW_LINE_PPC(unsigned int *data, int x1, int y1, int x2, int y2, unsigned int col, -; unsigned int screenx, unsigned int screeny) -; ************************************************************************************** -.globl _DRAW_LINE_PPC -.align 3 -_DRAW_LINE_PPC: - ;; NOT IMPLEMENTED YET - blr ;; return - - -; ************************************************************************************** -; void _ppc_brightness(Pixel * src, Pixel * dest, unsigned int size, unsigned int coeff) -; ************************************************************************************** - - -.const -.align 4 -vectorZERO: - .long 0,0,0,0 - .long 0x10101000, 0x10101001, 0x10101002, 0x10101003 - .long 0x10101004, 0x10101005, 0x10101006, 0x10101007 - .long 0x10101008, 0x10101009, 0x1010100A, 0x1010100B - .long 0x1010100C, 0x1010100D, 0x1010100E, 0x1010100F - - -.section __TEXT,__text,regular,pure_instructions - -.globl _ppc_brightness_G4 -.align 3 -_ppc_brightness_G4: - - -;; PowerPC Altivec code - srwi r5,r5,2 - mtctr r5 - -;;vrsave - mfspr r11,256 - lis r12,0xCFFC - mtspr 256,r12 - - mflr r0 - bcl 20,31,"L00000000001$pb" -"L00000000001$pb": - mflr r10 - mtlr r0 - - addis r9,r10,ha16(vectorZERO-"L00000000001$pb") - addi r9,r9,lo16(vectorZERO-"L00000000001$pb") - - vxor v0,v0,v0 ;; V0 = NULL vector - - addi r9,r9,16 - lvx v10,0,r9 - addi r9,r9,16 - lvx v11,0,r9 - addi r9,r9,16 - lvx v12,0,r9 - addi r9,r9,16 - lvx v13,0,r9 - - addis r9,r10,ha16(vectortmpwork-"L00000000001$pb") - addi r9,r9,lo16(vectortmpwork-"L00000000001$pb") - stw r6,0(r9) - li r6,8 - stw r6,4(r9) - lvx v9,0,r9 - li r9,128 - vspltw v8,v9,0 - vspltw v9,v9,1 - -;; elt counter - li r9,0 - lis r7,0x0F01 - b L7 -.align 4 -L7: - lvx v1,r9,r3 - - vperm v4,v1,v0,v10 - ;********************* - add r10,r9,r3 - ;********************* - vperm v5,v1,v0,v11 - vperm v6,v1,v0,v12 - vperm v7,v1,v0,v13 - - vmulouh v4,v4,v8 - ;********************* - dst r10,r7,3 - ;********************* - vmulouh v5,v5,v8 - vmulouh v6,v6,v8 - vmulouh v7,v7,v8 - vsrw v4,v4,v9 - vsrw v5,v5,v9 - vsrw v6,v6,v9 - vsrw v7,v7,v9 - - vpkuwus v4,v4,v5 - vpkuwus v6,v6,v7 - vpkuhus v1,v4,v6 - - stvx v1,r9,r4 - addi r9,r9,16 - - bdnz L7 - - mtspr 256,r11 - blr - - -.globl _ppc_brightness_G5 -.align 3 -_ppc_brightness_G5: - -;; PowerPC Altivec G5 code - srwi r5,r5,2 - mtctr r5 - -;;vrsave - mfspr r11,256 - lis r12,0xCFFC - mtspr 256,r12 - - mflr r0 - bcl 20,31,"L00000000002$pb" -"L00000000002$pb": - mflr r10 - mtlr r0 - - addis r9,r10,ha16(vectorZERO-"L00000000002$pb") - addi r9,r9,lo16(vectorZERO-"L00000000002$pb") - - vxor v0,v0,v0 ;; V0 = NULL vector - - addi r9,r9,16 - lvx v10,0,r9 - addi r9,r9,16 - lvx v11,0,r9 - addi r9,r9,16 - lvx v12,0,r9 - addi r9,r9,16 - lvx v13,0,r9 - - addis r9,r10,ha16(vectortmpwork-"L00000000002$pb") - addi r9,r9,lo16(vectortmpwork-"L00000000002$pb") - stw r6,0(r9) - li r6,8 - stw r6,4(r9) - lvx v9,0,r9 - li r9,128 - vspltw v8,v9,0 - vspltw v9,v9,1 - -;; elt counter - li r9,0 - lis r7,0x0F01 - b L6 -.align 4 -L6: - lvx v1,r9,r3 - - vperm v4,v1,v0,v10 - ;********************* - add r10,r9,r3 - ;********************* - vperm v5,v1,v0,v11 - vperm v6,v1,v0,v12 - vperm v7,v1,v0,v13 - - vmulouh v4,v4,v8 - vmulouh v5,v5,v8 - vmulouh v6,v6,v8 - vmulouh v7,v7,v8 - vsrw v4,v4,v9 - vsrw v5,v5,v9 - vsrw v6,v6,v9 - vsrw v7,v7,v9 - - vpkuwus v4,v4,v5 - vpkuwus v6,v6,v7 - vpkuhus v1,v4,v6 - - stvx v1,r9,r4 - addi r9,r9,16 - - bdnz L6 - - mtspr 256,r11 - blr - - -.globl _ppc_brightness_generic -.align 3 -_ppc_brightness_generic: - lis r12,0x00FF - ori r12,r12,0x00FF - subi r3,r3,4 - subi r4,r4,4 - mtctr r5 - b L1 -.align 4 -L1: - lwzu r7,4(r3) - - rlwinm r8,r7,16,24,31 - rlwinm r9,r7,24,24,31 - mullw r8,r8,r6 - rlwinm r10,r7,0,24,31 - mullw r9,r9,r6 - srwi r8,r8,8 - mullw r10,r10,r6 - srwi r9,r9,8 - - rlwinm. r11,r8,0,0,23 - beq L2 - li r8,0xFF -L2: - srwi r10,r10,8 - rlwinm. r11,r9,0,0,23 - beq L3 - li r9,0xFF -L3: - rlwinm r7,r8,16,8,15 - rlwinm. r11,r10,0,0,23 - beq L4 - li r10,0xFF -L4: - rlwimi r7,r9,8,16,23 - rlwimi r7,r10,0,24,31 - - stwu r7,4(r4) - bdnz L1 - - blr - - - -.static_data -.align 4 -vectortmpwork: - .long 0,0,0,0 - diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/ppc_zoom_ultimate.h kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/ppc_zoom_ultimate.h --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/ppc_zoom_ultimate.h 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/ppc_zoom_ultimate.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,14 +0,0 @@ -/* - * ppc_zoom_ultimate.h - * Goom - * - * Created by Guillaume Borios on Sun Dec 28 2003. - * Copyright (c) 2003 iOS. All rights reserved. - * - */ - -/* Generic PowerPC Code */ -void ppc_zoom_generic (int sizeX, int sizeY, Pixel *src, Pixel *dest, int *brutS, int *brutD, int buffratio, int precalCoef[16][16]); - -/* G4 Specific PowerPC Code (Possible use of Altivec and Data Streams) */ -void ppc_zoom_G4 (int sizeX, int sizeY, Pixel *src, Pixel *dest, int *brutS, int *brutD, int buffratio, int precalCoef[16][16]); \ No newline at end of file diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/ppc_zoom_ultimate.s kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/ppc_zoom_ultimate.s --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/ppc_zoom_ultimate.s 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/ppc_zoom_ultimate.s 1970-01-01 00:00:00.000000000 +0000 @@ -1,323 +0,0 @@ -; PowerPC optimized zoom for Goom -; © 2001-2003 Guillaume Borios -; This Source Code is released under the terms of the General Public License - -; Change log : -; 21 Dec 2003 : Use of altivec is now determined with a parameter - -; Section definition : We use a read only section -.text - -; name of the function to call by C program : ppc_zoom -; We declare this label as a global to extend its scope outside this file -.globl _ppc_zoom_generic -.globl _ppc_zoom_G4 - -; Description : -; This routine dynamically computes and applies a zoom filter - -; parameters : -; r3 <=> unsigned int sizeX (in pixels) -; r4 <=> unsigned int sizeY (in pixels) -; r5 <=> unsigned int * frompixmap -; r6 <=> unsigned int * topixmap -; r7 <=> unsigned int * brutS -; r8 <=> unsigned int * brutD -; r9 <=> unsigned int buffratio -; r10 <=> int [16][16] precalccoeffs - -; globals after init -; r5 <=> frompixmap - 1 byte needed for preincremental fetch (replaces r5) -; r6 <=> topixmap - 1 byte needed for preincremental fetch (replaces r6) -; r3 <=> ax = x max in 16th of pixels (replaces old r3) -; r4 <=> ay = y max in 16th of pixels (replaces old r4) -; r20 <=> row size in bytes -; r12 <=> 0xFF00FF (mask for parallel 32 bits pixs computing) -; r30 <=> brutS - 1 byte needed for preincremental fetch (replaces r7) -; r31 <=> brutD - 1 byte needed for preincremental fetch (replaces r8) - -; ABI notes : -; r1 is the Stack Pointer (SP) => Do not use -; r13..r31 are non-volatiles => Do not use - -_ppc_zoom_generic: - -; Saves the used non volatile registers in the Mach-O stack s Red-Zone -stmw r18,-56(r1) - -; init -li r18,0 ; Default value if out of range : 0 (Black) -mr r11,r10 -lis r12,0xFF -mullw r2,r3,r4 ; Number of pixels to compute -subi r30,r8,0 -slwi r20,r3,2 -srawi r19,r20,2 -ori r12,r12,0xFF -subi r3,r3,1 -subi r4,r4,1 -mtspr ctr,r2 ; Init the loop count (one loop per pixel computed) -subi r31,r7,0 -subi r6,r6,4 -slwi r3,r3,4 -slwi r4,r4,4 - -;pre init for loop -lwz r2,0(r31) ; px -lwz r29,4(r31) ; py -lwz r8,0(r30) ; px2 -lwz r10,4(r30) ; py2 - -b L1 -.align 5 -L1: - -; computes dynamically the position to fetch -sub r8,r8,r2 -sub r10,r10,r29 -mullw r8,r8,r9 -addi r31,r31,8 -mullw r10,r10,r9 -addi r30,r30,8 - -srawi r8,r8,16 -srawi r10,r10,16 -add r2,r2,r8 -add r29,r29,r10 - -; if px>ax or py>ay goto outofrange -; computes the attenuation coeffs and the original point address -rlwinm r10,r2,6,28-6,31-6 ; r10 <- (r2 << 2) & 0x000002D0 (r10=(r2%16)*4*16) -cmpl cr4,0,r2,r3 -rlwimi r10, r29, 2, 28-2, 31-2 ; r10 <- ((r29 << 2) & 0x0000002D) | (r10 & !0x0000002D) (r10=(r10%16)*4 | r10) -cmpl cr7,0,r29,r4 -srawi r29,r29,4 ; pos computing -bge- cr4,L4 -srawi r2,r2,4 ; pos computing -mullw r29, r29,r19 ; pos computing -bge- cr7,L4 - -; Channels notation : 00112233 (AARRVVBB) - -add r2,r2,r29 ; pos computing -lwzx r10,r11,r10 ; Loads coefs -slwi r2,r2,2 ; pos computing -add r2,r2,r5 ; pos computing -rlwinm r21,r10,0,24,31 ; Isolates coef1 (??????11 -> 00000011) -lwz r25,0(r2) ; Loads col1 -> r25 -lwz r26,4(r2) ; Loads col2 -> r26 -rlwinm r22,r10,24,24,31 ; Isolates coef2 (????22?? -> 00000022) -rlwinm r23,r10,16,24,31 ; Isolates coef3 (??33???? -> 00000033) -add r2,r2,r20 ; Adds one line for future load of col3 and col4 -and r8, r25,r12 ; Masks col1 channels 1 & 3 : 0x00XX00XX -rlwinm r24,r10,8,24,31 ; Isolates coef4 (44?????? -> 00000044) -andi. r25,r25,0xFF00 ; Masks col1 channel 2 : 0x0000XX00 -mullw r8, r8, r21 ; Applies coef1 on col1 channels 1 & 3 - - -; computes final pixel color -and r10,r26,r12 ; Masks col2 channels 1 & 3 : 0x00XX00XX -lwz r27,0(r2) ; Loads col3 -> r27 -mullw r10,r10,r22 ; Applies coef2 on col2 channels 1 & 3 -mullw r25,r25,r21 ; Applies coef1 on col1 channel 2 -andi. r29,r26,0xFF00 ; Masks col2 channel 2 : 0x0000XX00 -mullw r29,r29,r22 ; Applies coef2 on col2 channel 2 -lwz r28,4(r2) ; Loads col4 -> r28 -add r8 ,r8 ,r10 ; Adds col1 & col2 channels 1 & 3 -and r10,r27,r12 ; Masks col3 channels 1 & 3 : 0x00XX00XX -add r25,r25,r29 ; Adds col1 & col2 channel 2 -mullw r10,r10,r23 ; Applies coef3 on col3 channels 1 & 3 -andi. r29,r27,0xFF00 ; Masks col3 channel 2 : 0x0000XX00 -mullw r29,r29,r23 ; Applies coef3 on col3 channel 2 -lwz r2,0(r31) ; px -add r7 ,r8 ,r10 ; Adds col3 to (col1 + col2) channels 1 & 3 -and r10,r28,r12 ; Masks col4 channels 1 & 3 : 0x00XX00XX -mullw r10,r10,r24 ; Applies coef4 on col4 channels 1 & 3 -add r25,r25,r29 ; Adds col 3 to (col1 + col2) channel 2 -lwz r8,0(r30) ; px2 -andi. r28,r28,0xFF00 ; Masks col4 channel 2 : 0x0000XX00 -add r7 ,r7 ,r10 ; Adds col4 to (col1 + col2 + col3) channels 1 & 3 -lwz r10,4(r30) ; py2 -mullw r28,r28,r24 ; Applies coef4 on col4 channel 2 -srawi r7, r7, 8 ; (sum of channels 1 & 3) >> 8 -lwz r29,4(r31) ; py -add r25,r25,r28 ; Adds col 4 to (col1 + col2 + col3) channel 2 -rlwimi r7, r25, 24, 16, 23 ; (((sum of channels 2) >> 8 ) & 0x0000FF00) | ((sum of channels 1 and 3) & 0xFFFF00FF) -stwu r7,4(r6) ; Stores the computed pixel -bdnz L1 ; Iterate again if needed -b L3 ;goto end ; If not, returns from the function - - -; if out of range -L4: -stwu r18,4(r6) -lwz r8,0(r30) ; px2 -lwz r10,4(r30) ; py2 -lwz r2,0(r31) ; px -lwz r29,4(r31) ; py -bdnz L1 - - -L3: - -; Restore saved registers and return -lmw r18,-56(r1) -blr - - - - - - - - -_ppc_zoom_G4: - -; Saves the used non volatile registers in the Mach-O stack s Red-Zone -stmw r17,-60(r1) - -; init -li r18,0 ; Default value if out of range : 0 (Black) -mr r11,r10 -lis r12,0xFF -mullw r2,r3,r4 ; Number of pixels to compute -subi r30,r8,0 -slwi r20,r3,2 -srawi r19,r20,2 -ori r12,r12,0xFF -subi r3,r3,1 -subi r4,r4,1 -mtspr ctr,r2 ; Init the loop count (one loop per pixel computed) -subi r31,r7,0 -subi r6,r6,4 -slwi r3,r3,4 -slwi r4,r4,4 - -;pre init for loop -lwz r2,0(r31) ; px -lwz r29,4(r31) ; py -lwz r8,0(r30) ; px2 -lwz r10,4(r30) ; py2 - -;********************* -lis r17,0x0F01 - -b L100 -.align 5 -L100: - -addi r6,r6,4 - -; Optimization to ensure the destination buffer -; won't be loaded into the data cache -rlwinm. r0,r6,0,27,31 -bne+ L500 -dcbz 0,r6 -;dcba 0,r6 -L500: - -; computes dynamically the position to fetch -;mullw r8,r8,r29 -;mullw r2,r2,r29 -;add r2,r8,r2 -;srawi r2,r2,17 - -sub r8,r8,r2 -sub r10,r10,r29 -mullw r8,r8,r9 -addi r31,r31,8 -mullw r10,r10,r9 -addi r30,r30,8 - -dst r30,r17,0 - -srawi r8,r8,16 -srawi r10,r10,16 -add r2,r2,r8 -add r29,r29,r10 - -dst r31,r17,1 - -; if px>ax or py>ay goto outofrange -; computes the attenuation coeffs and the original point address -rlwinm r10,r2,6,28-6,31-6 ; r10 <- (r2 << 2) & 0x000002D0 (r10=(r2%16)*4*16) -cmpl cr4,0,r2,r3 -rlwimi r10, r29, 2, 28-2, 31-2 ; r10 <- ((r29 << 2) & 0x0000002D) | (r10 & !0x0000002D) (r10=(r29%16)*4 | r10) -cmpl cr7,0,r29,r4 -srawi r29,r29,4 ; pos computing -bge- cr4,L400 -srawi r2,r2,4 ; pos computing -mullw r29, r29,r19 ; pos computing -bge- cr7,L400 - -; Channels notation : 00112233 (AARRVVBB) - -add r2,r2,r29 ; pos computing -lwzx r10,r11,r10 ; Loads coefs -slwi r2,r2,2 ; pos computing -add r2,r2,r5 ; pos computing -rlwinm r21,r10,0,24,31 ; Isolates coef1 (??????11 -> 00000011) -lwz r25,0(r2) ; Loads col1 -> r25 -lwz r26,4(r2) ; Loads col2 -> r26 -rlwinm r22,r10,24,24,31 ; Isolates coef2 (????22?? -> 00000022) -rlwinm r23,r10,16,24,31 ; Isolates coef3 (??33???? -> 00000033) -add r2,r2,r20 ; Adds one line for future load of col3 and col4 -and r8, r25,r12 ; Masks col1 channels 1 & 3 : 0x00XX00XX -rlwinm r24,r10,8,24,31 ; Isolates coef4 (44?????? -> 00000044) -dst r2,r17,2 -rlwinm r25,r25,0,16,23 ; Masks col1 channel 2 : 0x0000XX00 -;andi. r25,r25,0xFF00 ; Masks col1 channel 2 : 0x0000XX00 -mullw r8, r8, r21 ; Applies coef1 on col1 channels 1 & 3 - - -; computes final pixel color -and r10,r26,r12 ; Masks col2 channels 1 & 3 : 0x00XX00XX -lwz r27,0(r2) ; Loads col3 -> r27 -mullw r10,r10,r22 ; Applies coef2 on col2 channels 1 & 3 -mullw r25,r25,r21 ; Applies coef1 on col1 channel 2 -rlwinm r29,r26,0,16,23 ; Masks col2 channel 2 : 0x0000XX00 -;andi. r29,r26,0xFF00 ; Masks col2 channel 2 : 0x0000XX00 -mullw r29,r29,r22 ; Applies coef2 on col2 channel 2 -lwz r28,4(r2) ; Loads col4 -> r28 -add r8 ,r8 ,r10 ; Adds col1 & col2 channels 1 & 3 -and r10,r27,r12 ; Masks col3 channels 1 & 3 : 0x00XX00XX -add r25,r25,r29 ; Adds col1 & col2 channel 2 -mullw r10,r10,r23 ; Applies coef3 on col3 channels 1 & 3 -rlwinm r29,r27,0,16,23 ; Masks col3 channel 2 : 0x0000XX00 -;andi. r29,r27,0xFF00 ; Masks col3 channel 2 : 0x0000XX00 -mullw r29,r29,r23 ; Applies coef3 on col3 channel 2 -lwz r2,0(r31) ; px -add r7 ,r8 ,r10 ; Adds col3 to (col1 + col2) channels 1 & 3 -and r10,r28,r12 ; Masks col4 channels 1 & 3 : 0x00XX00XX -mullw r10,r10,r24 ; Applies coef4 on col4 channels 1 & 3 -add r25,r25,r29 ; Adds col 3 to (col1 + col2) channel 2 -lwz r8,0(r30) ; px2 -rlwinm r28,r28,0,16,23 ; Masks col4 channel 2 : 0x0000XX00 -;andi. r28,r28,0xFF00 ; Masks col4 channel 2 : 0x0000XX00 -add r7 ,r7 ,r10 ; Adds col4 to (col1 + col2 + col3) channels 1 & 3 -lwz r10,4(r30) ; py2 -mullw r28,r28,r24 ; Applies coef4 on col4 channel 2 -srawi r7, r7, 8 ; (sum of channels 1 & 3) >> 8 -lwz r29,4(r31) ; py -add r25,r25,r28 ; Adds col 4 to (col1 + col2 + col3) channel 2 -rlwimi r7, r25, 24, 16, 23 ; (((sum of channels 2) >> 8 ) & 0x0000FF00) | ((sum of channels 1 and 3) & 0xFFFF00FF) -stw r7,0(r6) ; Stores the computed pixel -bdnz L100 ; Iterate again if needed -b L300 ;goto end ; If not, returns from the function - - -; if out of range -L400: -stw r18,0(r6) -lwz r8,0(r30) ; px2 -lwz r10,4(r30) ; py2 -lwz r2,0(r31) ; px -lwz r29,4(r31) ; py -bdnz L100 - - -L300: - -; Restore saved registers and return -lmw r17,-60(r1) -blr diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/sound_tester.c kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/sound_tester.c --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/sound_tester.c 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/sound_tester.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,138 +0,0 @@ -#include "sound_tester.h" - -#include -#include - -/* some constants */ -#define BIG_GOOM_DURATION 100 -#define BIG_GOOM_SPEED_LIMIT 0.1f - -#define ACCEL_MULT 0.95f -#define SPEED_MULT 0.99f - - -void evaluate_sound(gint16 data[2][512], SoundInfo *info) { - - int i; - float difaccel; - float prevspeed; - - /* find the max */ - int incvar = 0; - for (i = 0; i < 512; i+=2) { - if (incvar < data[0][i]) - incvar = data[0][i]; - } - - if (incvar > info->allTimesMax) - info->allTimesMax = incvar; - - /* volume sonore */ - info->volume = (float)incvar / (float)info->allTimesMax; - memcpy(info->samples[0],data[0],512*sizeof(short)); - memcpy(info->samples[1],data[1],512*sizeof(short)); - - difaccel = info->accelvar; - info->accelvar = info->volume; /* accel entre 0 et 1 */ - - /* transformations sur la vitesse du son */ - if (info->speedvar > 1.0f) - info->speedvar = 1.0f; - - if (info->speedvar < 0.1f) - info->accelvar *= (1.0f - (float)info->speedvar); - else if (info->speedvar < 0.3f) - info->accelvar *= (0.9f - (float)(info->speedvar-0.1f)/2.0f); - else - info->accelvar *= (0.8f - (float)(info->speedvar-0.3f)/4.0f); - - /* adoucissement de l'acceleration */ - info->accelvar *= ACCEL_MULT; - if (info->accelvar < 0) - info->accelvar = 0; - - difaccel = info->accelvar - difaccel; - if (difaccel < 0) - difaccel = - difaccel; - - /* mise a jour de la vitesse */ - prevspeed = info->speedvar; - info->speedvar = (info->speedvar + difaccel * 0.5f) / 2; - info->speedvar *= SPEED_MULT; - info->speedvar = (info->speedvar + 3.0f * prevspeed) / 4.0f; - if (info->speedvar < 0) - info->speedvar = 0; - if (info->speedvar > 1) - info->speedvar = 1; - - /* temps du goom */ - info->timeSinceLastGoom++; - info->timeSinceLastBigGoom++; - info->cycle++; - - /* detection des nouveaux gooms */ - if ((info->speedvar > (float)IVAL(info->biggoom_speed_limit_p)/100.0f) - && (info->accelvar > info->bigGoomLimit) - && (info->timeSinceLastBigGoom > BIG_GOOM_DURATION)) { - info->timeSinceLastBigGoom = 0; - } - - if (info->accelvar > info->goom_limit) { - /* TODO: tester && (info->timeSinceLastGoom > 20)) { */ - info->totalgoom ++; - info->timeSinceLastGoom = 0; - info->goomPower = info->accelvar - info->goom_limit; - } - - if (info->accelvar > info->prov_max) - info->prov_max = info->accelvar; - - if (info->goom_limit>1) - info->goom_limit=1; - - /* toute les 2 secondes : vrifier si le taux de goom est correct - * et le modifier sinon.. */ - if (info->cycle % 64 == 0) { - if (info->speedvar<0.01f) - info->goom_limit *= 0.91; - if (info->totalgoom > 4) { - info->goom_limit+=0.02; - } - if (info->totalgoom > 7) { - info->goom_limit*=1.03f; - info->goom_limit+=0.03; - } - if (info->totalgoom > 16) { - info->goom_limit*=1.05f; - info->goom_limit+=0.04; - } - if (info->totalgoom == 0) { - info->goom_limit = info->prov_max - 0.02; - } - if ((info->totalgoom == 1) && (info->goom_limit > 0.02)) - info->goom_limit-=0.01; - info->totalgoom = 0; - info->bigGoomLimit = info->goom_limit * (1.0f + (float)IVAL(info->biggoom_factor_p)/500.0f); - info->prov_max = 0; - } - - /* mise a jour des parametres pour la GUI */ - FVAL(info->volume_p) = info->volume; - info->volume_p.change_listener(&info->volume_p); - FVAL(info->speed_p) = info->speedvar * 4; - info->speed_p.change_listener(&info->speed_p); - FVAL(info->accel_p) = info->accelvar; - info->accel_p.change_listener(&info->accel_p); - - FVAL(info->goom_limit_p) = info->goom_limit; - info->goom_limit_p.change_listener(&info->goom_limit_p); - FVAL(info->goom_power_p) = info->goomPower; - info->goom_power_p.change_listener(&info->goom_power_p); - FVAL(info->last_goom_p) = 1.0-((float)info->timeSinceLastGoom/20.0f); - info->last_goom_p.change_listener(&info->last_goom_p); - FVAL(info->last_biggoom_p) = 1.0-((float)info->timeSinceLastBigGoom/40.0f); - info->last_biggoom_p.change_listener(&info->last_biggoom_p); - - /* bigGoomLimit ==goomLimit*9/8+7 ? */ - } - diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/sound_tester.h kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/sound_tester.h --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/sound_tester.h 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/sound_tester.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,11 +0,0 @@ -#ifndef _SOUND_TESTER_H -#define _SOUND_TESTER_H - -#include "goom_plugin_info.h" -#include "goom_config.h" - -/** change les donnees du SoundInfo */ -void evaluate_sound(gint16 data[2][512], SoundInfo *sndInfo); - -#endif - diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/surf3d.c kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/surf3d.c --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/surf3d.c 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/surf3d.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,107 +0,0 @@ -#include "surf3d.h" -#include "goom_plugin_info.h" -#include -#include -#include - -grid3d *grid3d_new (int sizex, int defx, int sizez, int defz, v3d center) { - int x = defx; - int y = defz; - grid3d *g = malloc (sizeof(grid3d)); - surf3d *s = &(g->surf); - s->nbvertex = x*y; - s->vertex = malloc (x*y*sizeof(v3d)); - s->svertex = malloc (x*y*sizeof(v3d)); - s->center = center; - - g->defx=defx; - g->sizex=sizex; - g->defz=defz; - g->sizez=sizez; - g->mode=0; - - while (y) { - --y; - x = defx; - while (x) { - --x; - s->vertex[x+defx*y].x = (float)(x-defx/2)*sizex/defx; - s->vertex[x+defx*y].y = 0; - s->vertex[x+defx*y].z = (float)(y-defz/2)*sizez/defz; - } - } - return g; -} - -void grid3d_draw (PluginInfo *plug, grid3d *g, int color, int colorlow, - int dist, Pixel *buf, Pixel *back, int W,int H) { - - int x; - v2d v2,v2x; - - v2d *v2_array = malloc(g->surf.nbvertex * sizeof(v2d)); - v3d_to_v2d(g->surf.svertex, g->surf.nbvertex, W, H, dist, v2_array); - - for (x=0;xdefx;x++) { - int z; - v2x = v2_array[x]; - - for (z=1;zdefz;z++) { - v2 = v2_array[z*g->defx + x]; - if (((v2.x != -666) || (v2.y!=-666)) - && ((v2x.x != -666) || (v2x.y!=-666))) { - plug->methods.draw_line (buf,v2x.x,v2x.y,v2.x,v2.y, colorlow, W, H); - plug->methods.draw_line (back,v2x.x,v2x.y,v2.x,v2.y, color, W, H); - } - v2x = v2; - } - } - - free(v2_array); -} - -void surf3d_rotate (surf3d *s, float angle) { - int i; - float cosa; - float sina; - SINCOS(angle,sina,cosa); - for (i=0;inbvertex;i++) { - Y_ROTATE_V3D(s->vertex[i],s->svertex[i],cosa,sina); - } -} - -void surf3d_translate (surf3d *s) { - int i; - for (i=0;inbvertex;i++) { - TRANSLATE_V3D(s->center,s->svertex[i]); - } -} - -void grid3d_update (grid3d *g, float angle, float *vals, float dist) { - int i; - float cosa; - float sina; - surf3d *s = &(g->surf); - v3d cam = s->center; - cam.z += dist; - - SINCOS((angle/4.3f),sina,cosa); - cam.y += sina*2.0f; - SINCOS(angle,sina,cosa); - - if (g->mode==0) { - if (vals) - for (i=0;idefx;i++) - s->vertex[i].y = s->vertex[i].y*0.2 + vals[i]*0.8; - - for (i=g->defx;inbvertex;i++) { - s->vertex[i].y *= 0.255f; - s->vertex[i].y += (s->vertex[i-g->defx].y * 0.777f); - } - } - - for (i=0;inbvertex;i++) { - Y_ROTATE_V3D(s->vertex[i],s->svertex[i],cosa,sina); - TRANSLATE_V3D(cam,s->svertex[i]); - } -} diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/surf3d.h kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/surf3d.h --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/surf3d.h 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/surf3d.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,38 +0,0 @@ -#ifndef _SURF3D_H -#define _SURF3D_H - -#include "v3d.h" -#include "goom_graphic.h" -#include "goom_typedefs.h" - -typedef struct { - v3d *vertex; - v3d *svertex; - int nbvertex; - - v3d center; -} surf3d; - -typedef struct { - surf3d surf; - - int defx; - int sizex; - int defz; - int sizez; - int mode; -} grid3d; - -/* hi-level */ - -/* works on grid3d */ -grid3d *grid3d_new (int sizex, int defx, int sizez, int defz, v3d center); -void grid3d_update (grid3d *s, float angle, float *vals, float dist); - -/* low level */ -void surf3d_draw (surf3d *s, int color, int dist, int *buf, int *back, int W,int H); -void grid3d_draw (PluginInfo *plug, grid3d *g, int color, int colorlow, int dist, Pixel *buf, Pixel *back, int W,int H); -void surf3d_rotate (surf3d *s, float angle); -void surf3d_translate (surf3d *s); - -#endif diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/surf3d.s kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/surf3d.s --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/surf3d.s 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/surf3d.s 1970-01-01 00:00:00.000000000 +0000 @@ -1,484 +0,0 @@ - .file "surf3d.c" - .version "01.01" -gcc2_compiled.: -.text - .align 4 -.globl grid3d_new - .type grid3d_new,@function -grid3d_new: - pushl %ebp - movl %esp,%ebp - subl $44,%esp - pushl %edi - pushl %esi - pushl %ebx - movl 20(%ebp),%eax - movl 12(%ebp),%esi - movl %eax,-8(%ebp) - addl $-12,%esp - pushl $44 - call malloc - movl %esi,%edx - imull -8(%ebp),%edx - movl %eax,%edi - movl %edx,-12(%ebp) - leal (%edx,%edx,2),%ebx - movl %edx,8(%edi) - addl $-12,%esp - sall $2,%ebx - pushl %ebx - call malloc - addl $32,%esp - movl %eax,(%edi) - addl $-12,%esp - pushl %ebx - call malloc - movl %eax,4(%edi) - movl 24(%ebp),%eax - movl %eax,12(%edi) - movl 28(%ebp),%eax - movl %eax,16(%edi) - movl 32(%ebp),%eax - movl %eax,20(%edi) - movl 8(%ebp),%eax - movl %eax,28(%edi) - movl %esi,24(%edi) - movl -8(%ebp),%edx - movl 16(%ebp),%eax - movl %edx,32(%edi) - movl %eax,36(%edi) - movl $0,40(%edi) - testl %edx,%edx - je .L480 - movl %esi,%eax - movl %esi,-28(%ebp) - shrl $31,%eax - addl %eax,%esi - movl -8(%ebp),%eax - shrl $31,%eax - addl -8(%ebp),%eax - movl -12(%ebp),%edx - sarl $1,%eax - movl %edx,-24(%ebp) - negl -28(%ebp) - movl %esi,-16(%ebp) - movl %eax,-20(%ebp) - .p2align 4,,7 -.L481: - movl -28(%ebp),%eax - addl %eax,-24(%ebp) - decl -8(%ebp) - movl 12(%ebp),%esi - testl %esi,%esi - je .L479 - movl -8(%ebp),%eax - subl -20(%ebp),%eax - movl %eax,-4(%ebp) - fildl -4(%ebp) - movl %esi,-4(%ebp) - movl -24(%ebp),%edx - leal (%edx,%esi),%eax - movl -16(%ebp),%ebx - fildl 16(%ebp) - leal (%eax,%eax,2),%eax - sarl $1,%ebx - leal 0(,%eax,4),%ecx - fmulp %st,%st(1) - fildl 20(%ebp) - fdivrp %st,%st(1) - fildl 8(%ebp) - fildl -4(%ebp) - jmp .L484 -.L487: - fxch %st(2) - .p2align 4,,7 -.L484: - decl %esi - movl %esi,%eax - movl (%edi),%edx - subl %ebx,%eax - movl %eax,-4(%ebp) - fildl -4(%ebp) - addl $-12,%ecx - fmul %st(2),%st - fdiv %st(1),%st - fstps (%edx,%ecx) - fxch %st(2) - movl (%edi),%eax - movl $0,4(%eax,%ecx) - movl (%edi),%eax - fsts 8(%eax,%ecx) - testl %esi,%esi - jne .L487 - fstp %st(0) - fstp %st(0) - fstp %st(0) -.L479: - cmpl $0,-8(%ebp) - jne .L481 -.L480: - leal -56(%ebp),%esp - popl %ebx - movl %edi,%eax - popl %esi - popl %edi - leave - ret -.Lfe1: - .size grid3d_new,.Lfe1-grid3d_new -.section .rodata - .align 8 -.LC48: - .long 0x0,0x3fe00000 - .align 4 -.LC49: - .long 0x3f19999a - .align 4 -.LC50: - .long 0x3ee3d70a -.text - .align 4 -.globl grid3d_update - .type grid3d_update,@function -grid3d_update: - pushl %ebp - movl %esp,%ebp - subl $32,%esp - pushl %esi - pushl %ebx - flds 12(%ebp) - movl 8(%ebp),%ebx - movl 16(%ebp),%ecx - fld %st(0) -#APP - fsin -#NO_APP - fstps -4(%ebp) - flds -4(%ebp) - fxch %st(1) -#APP - fcos -#NO_APP - fstps -4(%ebp) - flds -4(%ebp) - cmpl $0,40(%ebx) - jne .L519 - testl %ecx,%ecx - je .L520 - xorl %esi,%esi - cmpl 24(%ebx),%esi - jge .L520 - fldl .LC48 - xorl %edx,%edx - .p2align 4,,7 -.L524: - movl (%ebx),%eax - fld %st(0) - fld %st(1) - fxch %st(1) - fmuls 4(%eax,%edx) - fxch %st(1) - fmuls (%ecx,%esi,4) - faddp %st,%st(1) - incl %esi - fstps 4(%eax,%edx) - addl $12,%edx - cmpl 24(%ebx),%esi - jl .L524 - fstp %st(0) -.L520: - movl 24(%ebx),%esi - cmpl 8(%ebx),%esi - jge .L519 - leal (%esi,%esi,2),%eax - flds .LC49 - flds .LC50 - leal 0(,%eax,4),%ecx - .p2align 4,,7 -.L529: - movl (%ebx),%eax - flds 4(%eax,%ecx) - fmul %st(2),%st - fstps 4(%eax,%ecx) - movl %esi,%eax - subl 24(%ebx),%eax - movl (%ebx),%edx - leal (%eax,%eax,2),%eax - flds 4(%edx,%eax,4) - fmul %st(1),%st - fadds 4(%edx,%ecx) - incl %esi - fstps 4(%edx,%ecx) - addl $12,%ecx - cmpl 8(%ebx),%esi - jl .L529 - fstp %st(0) - fstp %st(0) -.L519: - xorl %esi,%esi - cmpl 8(%ebx),%esi - jge .L536 - xorl %ecx,%ecx - .p2align 4,,7 -.L534: - movl (%ebx),%eax - flds (%eax,%ecx) - flds 8(%eax,%ecx) - fmul %st(2),%st - fxch %st(1) - fmul %st(3),%st - fsubp %st,%st(1) - movl 4(%ebx),%edx - incl %esi - fstps (%edx,%ecx) - movl (%ebx),%eax - flds (%eax,%ecx) - flds 8(%eax,%ecx) - fxch %st(1) - fmul %st(2),%st - fxch %st(1) - fmul %st(3),%st - faddp %st,%st(1) - movl 4(%ebx),%edx - fstps 8(%edx,%ecx) - movl (%ebx),%eax - flds 4(%eax,%ecx) - movl 4(%ebx),%edx - fstps 4(%edx,%ecx) - movl 4(%ebx),%eax - flds (%eax,%ecx) - fadds 12(%ebx) - fstps (%eax,%ecx) - movl 4(%ebx),%eax - flds 4(%eax,%ecx) - fadds 16(%ebx) - fstps 4(%eax,%ecx) - movl 4(%ebx),%eax - flds 8(%eax,%ecx) - fadds 20(%ebx) - fstps 8(%eax,%ecx) - addl $12,%ecx - cmpl 8(%ebx),%esi - jl .L534 -.L536: - fstp %st(0) - fstp %st(0) - popl %ebx - popl %esi - leave - ret -.Lfe2: - .size grid3d_update,.Lfe2-grid3d_update -.section .rodata - .align 4 -.LC51: - .long 0x40000000 - .align 8 -.LC52: - .long 0x0,0x42380000 -.text - .align 4 -.globl surf3d_draw - .type surf3d_draw,@function -surf3d_draw: - pushl %ebp - movl %esp,%ebp - subl $60,%esp - pushl %edi - pushl %esi - pushl %ebx - movl $0,-20(%ebp) - movl -20(%ebp),%edx - movl 8(%ebp),%eax - cmpl 8(%eax),%edx - jge .L493 - fldl .LC52 - flds .LC51 - xorl %edi,%edi - .p2align 4,,7 -.L495: - movl 8(%ebp),%eax - movl 4(%eax),%eax - movl %eax,-36(%ebp) - fcoms 8(%eax,%edi) - fnstsw %ax - andb $69,%ah - cmpb $1,%ah - jne .L496 - fildl 16(%ebp) - movl -36(%ebp),%edx - fld %st(0) - fmuls (%edx,%edi) - fdivs 8(%edx,%edi) - fld %st(3) - faddp %st,%st(1) - fstpl -32(%ebp) - movl -32(%ebp),%eax - movl -28(%ebp),%edx - movl %eax,-40(%ebp) - sarl $16,-40(%ebp) - movl -36(%ebp),%edx - fmuls 4(%edx,%edi) - fdivs 8(%edx,%edi) - movl -40(%ebp),%ecx - fld %st(2) - faddp %st,%st(1) - fstpl -32(%ebp) - movl -32(%ebp),%eax - movl -28(%ebp),%edx - movl %eax,-44(%ebp) - movl 28(%ebp),%eax - sarl $1,%eax - addl %eax,%ecx - movl 32(%ebp),%eax - sarl $16,-44(%ebp) - sarl $1,%eax - movl %ecx,%ebx - subl -44(%ebp),%eax - movl %eax,%esi - cmpl 28(%ebp),%ebx - jge .L496 - testl %ecx,%ecx - jl .L496 - cmpl 32(%ebp),%esi - jge .L496 - testl %eax,%eax - jge .L499 -.L496: - xorl %esi,%esi - xorl %ebx,%ebx -.L499: - movl 20(%ebp),%eax - movl %ebx,%edx - leal (%eax,%edx,4),%edx - movl 28(%ebp),%eax - imull %esi,%eax - leal (%edx,%eax,4),%eax - testl %ebx,%ebx - je .L494 - testl %esi,%esi - je .L494 -#APP - movd (%eax), %mm0 - paddusb 12(%ebp), %mm0 - movd %mm0, (%eax) -#NO_APP -.L494: - incl -20(%ebp) - addl $12,%edi - movl -20(%ebp),%eax - movl 8(%ebp),%edx - cmpl 8(%edx),%eax - jl .L495 - fstp %st(0) - fstp %st(0) -.L493: - popl %ebx - popl %esi - popl %edi - leave - ret -.Lfe3: - .size surf3d_draw,.Lfe3-surf3d_draw - .align 4 -.globl surf3d_rotate - .type surf3d_rotate,@function -surf3d_rotate: - pushl %ebp - movl %esp,%ebp - subl $32,%esp - pushl %esi - pushl %ebx - flds 12(%ebp) - movl 8(%ebp),%ebx - fld %st(0) -#APP - fsin -#NO_APP - fstps -4(%ebp) - flds -4(%ebp) - fxch %st(1) -#APP - fcos -#NO_APP - fstps -4(%ebp) - xorl %esi,%esi - flds -4(%ebp) - cmpl 8(%ebx),%esi - jge .L537 - xorl %ecx,%ecx - .p2align 4,,7 -.L508: - movl (%ebx),%eax - flds (%eax,%ecx) - flds 8(%eax,%ecx) - fmul %st(2),%st - fxch %st(1) - fmul %st(3),%st - fsubp %st,%st(1) - movl 4(%ebx),%edx - incl %esi - fstps (%edx,%ecx) - movl (%ebx),%eax - flds (%eax,%ecx) - flds 8(%eax,%ecx) - fxch %st(1) - fmul %st(2),%st - fxch %st(1) - fmul %st(3),%st - faddp %st,%st(1) - movl 4(%ebx),%edx - fstps 8(%edx,%ecx) - movl (%ebx),%eax - flds 4(%eax,%ecx) - movl 4(%ebx),%edx - fstps 4(%edx,%ecx) - addl $12,%ecx - cmpl 8(%ebx),%esi - jl .L508 -.L537: - fstp %st(0) - fstp %st(0) - popl %ebx - popl %esi - leave - ret -.Lfe4: - .size surf3d_rotate,.Lfe4-surf3d_rotate - .align 4 -.globl surf3d_translate - .type surf3d_translate,@function -surf3d_translate: - pushl %ebp - movl %esp,%ebp - pushl %ebx - movl 8(%ebp),%ecx - xorl %ebx,%ebx - cmpl 8(%ecx),%ebx - jge .L512 - xorl %edx,%edx - .p2align 4,,7 -.L514: - movl 4(%ecx),%eax - flds (%eax,%edx) - fadds 12(%ecx) - incl %ebx - fstps (%eax,%edx) - movl 4(%ecx),%eax - flds 4(%eax,%edx) - fadds 16(%ecx) - fstps 4(%eax,%edx) - movl 4(%ecx),%eax - flds 8(%eax,%edx) - fadds 20(%ecx) - fstps 8(%eax,%edx) - addl $12,%edx - cmpl 8(%ecx),%ebx - jl .L514 -.L512: - popl %ebx - leave - ret -.Lfe5: - .size surf3d_translate,.Lfe5-surf3d_translate - .ident "GCC: (GNU) 2.95.3 19991030 (prerelease)" diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/tentacle3d.c kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/tentacle3d.c --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/tentacle3d.c 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/tentacle3d.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,299 +0,0 @@ -#include - -#include "v3d.h" -#include "surf3d.h" -#include "goom_tools.h" -#include "goom_config.h" -#include "goom_plugin_info.h" -#include "tentacle3d.h" - -#define D 256.0f - -#define nbgrid 6 -#define definitionx 15 -#define definitionz 45 - -typedef struct _TENTACLE_FX_DATA { - PluginParam enabled_bp; - PluginParameters params; - - float cycle; - grid3d *grille[nbgrid]; - float *vals; - -#define NB_TENTACLE_COLORS 4 - int colors[NB_TENTACLE_COLORS]; - - int col; - int dstcol; - float lig; - float ligs; - - /* statics from pretty_move */ - float distt; - float distt2; - float rot; /* entre 0 et 2 * M_PI */ - int happens; - int rotation; - int lock; -} TentacleFXData; - -static void tentacle_new (TentacleFXData *data); -static void tentacle_update(PluginInfo *goomInfo, Pixel *buf, Pixel *back, int W, int H, - short[2][512], float, int drawit, TentacleFXData *data); -static void tentacle_free (TentacleFXData *data); - -/* - * VisualFX wrapper for the tentacles - */ - -static void tentacle_fx_init(VisualFX *_this, PluginInfo *info) { - - TentacleFXData *data = (TentacleFXData*)malloc(sizeof(TentacleFXData)); - - data->enabled_bp = secure_b_param("Enabled", 1); - data->params = plugin_parameters ("3D Tentacles", 1); - data->params.params[0] = &data->enabled_bp; - - data->cycle = 0.0f; - data->col = (0x28<<(ROUGE*8))|(0x2c<<(VERT*8))|(0x5f<<(BLEU*8)); - data->dstcol = 0; - data->lig = 1.15f; - data->ligs = 0.1f; - - data->distt = 10.0f; - data->distt2 = 0.0f; - data->rot = 0.0f; /* entre 0 et 2 * M_PI */ - data->happens = 0; - - data->rotation = 0; - data->lock = 0; - data->colors[0] = (0x18<<(ROUGE*8))|(0x4c<<(VERT*8))|(0x2f<<(BLEU*8)); - data->colors[1] = (0x48<<(ROUGE*8))|(0x2c<<(VERT*8))|(0x6f<<(BLEU*8)); - data->colors[2] = (0x58<<(ROUGE*8))|(0x3c<<(VERT*8))|(0x0f<<(BLEU*8)); - data->colors[3] = (0x87<<(ROUGE*8))|(0x55<<(VERT*8))|(0x74<<(BLEU*8)); - tentacle_new(data); - - _this->params = &data->params; - _this->fx_data = (void*)data; -} - -static void tentacle_fx_apply(VisualFX *_this, Pixel *src, Pixel *dest, PluginInfo *goomInfo) -{ - TentacleFXData *data = (TentacleFXData*)_this->fx_data; - if (BVAL(data->enabled_bp)) { - tentacle_update(goomInfo, dest, src, goomInfo->screen.width, - goomInfo->screen.height, goomInfo->sound.samples, - (float)goomInfo->sound.accelvar, - goomInfo->curGState->drawTentacle, data); - } -} - -static void tentacle_fx_free(VisualFX *_this) { - TentacleFXData *data = (TentacleFXData*)_this->fx_data; - free(data->params.params); - tentacle_free(data); - free(_this->fx_data); -} - -VisualFX tentacle_fx_create(void) { - VisualFX fx; - fx.init = tentacle_fx_init; - fx.apply = tentacle_fx_apply; - fx.free = tentacle_fx_free; - return fx; -} - -/* ----- */ - -static void tentacle_free (TentacleFXData *data) { - /* TODO : un vrai FREE GRID!! */ - int tmp; - for (tmp=0;tmpgrille[tmp]; - free (g->surf.vertex); - free (g->surf.svertex); - free (g); - } - free (data->vals); -} - -static void tentacle_new (TentacleFXData *data) { - int tmp; - - v3d center = {0,-17.0,0}; - data->vals = (float*)malloc ((definitionx+20)*sizeof(float)); - - for (tmp=0;tmpgrille[tmp] = grid3d_new (x, definitionx, z, definitionz + rand() % 10, center); - center.y += 8; - } -} - -static inline unsigned char lighten (unsigned char value, float power) -{ - int val = value; - float t = (float) val * log10(power) / 2.0; - - if (t > 0) { - val = (int) t; /* (32.0f * log (t)); */ - if (val > 255) - val = 255; - if (val < 0) - val = 0; - return val; - } - else { - return 0; - } -} - -static void lightencolor (int *col, float power) -{ - unsigned char *color; - - color = (unsigned char *) col; - *color = lighten (*color, power); - color++; - *color = lighten (*color, power); - color++; - *color = lighten (*color, power); - color++; - *color = lighten (*color, power); -} - -/* retourne x>>s , en testant le signe de x */ -#define ShiftRight(_x,_s) ((_x<0) ? -(-_x>>_s) : (_x>>_s)) - -static int evolutecolor (unsigned int src,unsigned int dest, - unsigned int mask, unsigned int incr) { - - int color = src & (~mask); - src &= mask; - dest &= mask; - - if ((src!=mask) - &&(srcdest) - src -= incr; - return (src&mask)|color; -} - -static void pretty_move (PluginInfo *goomInfo, float cycle, float *dist, float *dist2, float *rotangle, TentacleFXData *fx_data) { - - float tmp; - - /* many magic numbers here... I don't really like that. */ - if (fx_data->happens) - fx_data->happens -= 1; - else if (fx_data->lock == 0) { - fx_data->happens = goom_irand(goomInfo->gRandom,200)?0:100+goom_irand(goomInfo->gRandom,60); - fx_data->lock = fx_data->happens * 3 / 2; - } - else fx_data->lock --; - - tmp = fx_data->happens?8.0f:0; - *dist2 = fx_data->distt2 = (tmp + 15.0f*fx_data->distt2)/16.0f; - - tmp = 30+D-90.0f*(1.0f+sin(cycle*19/20)); - if (fx_data->happens) - tmp *= 0.6f; - - *dist = fx_data->distt = (tmp + 3.0f*fx_data->distt)/4.0f; - - if (!fx_data->happens){ - tmp = M_PI*sin(cycle)/32+3*M_PI/2; - } - else { - fx_data->rotation = goom_irand(goomInfo->gRandom,500)?fx_data->rotation:goom_irand(goomInfo->gRandom,2); - if (fx_data->rotation) - cycle *= 2.0f*M_PI; - else - cycle *= -1.0f*M_PI; - tmp = cycle - (M_PI*2.0) * floor(cycle/(M_PI*2.0)); - } - - if (abs(tmp-fx_data->rot) > abs(tmp-(fx_data->rot+2.0*M_PI))) { - fx_data->rot = (tmp + 15.0f*(fx_data->rot+2*M_PI)) / 16.0f; - if (fx_data->rot>2.0*M_PI) - fx_data->rot -= 2.0*M_PI; - *rotangle = fx_data->rot; - } - else if (abs(tmp-fx_data->rot) > abs(tmp-(fx_data->rot-2.0*M_PI))) { - fx_data->rot = (tmp + 15.0f*(fx_data->rot-2.0*M_PI)) / 16.0f; - if (fx_data->rot<0.0f) - fx_data->rot += 2.0*M_PI; - *rotangle = fx_data->rot; - } - else - *rotangle = fx_data->rot = (tmp + 15.0f*fx_data->rot) / 16.0f; -} - -static void tentacle_update(PluginInfo *goomInfo, Pixel *buf, Pixel *back, int W, int H, - short data[2][512], float rapport, int drawit, TentacleFXData *fx_data) { - - int tmp; - int tmp2; - - int color; - int colorlow; - - float dist,dist2,rotangle; - - if ((!drawit) && (fx_data->ligs>0.0f)) - fx_data->ligs = -fx_data->ligs; - - fx_data->lig += fx_data->ligs; - - if (fx_data->lig > 1.01f) { - if ((fx_data->lig>10.0f) | (fx_data->lig<1.1f)) fx_data->ligs = -fx_data->ligs; - - if ((fx_data->lig<6.3f)&&(goom_irand(goomInfo->gRandom,30)==0)) - fx_data->dstcol=goom_irand(goomInfo->gRandom,NB_TENTACLE_COLORS); - - fx_data->col = evolutecolor(fx_data->col,fx_data->colors[fx_data->dstcol],0xff,0x01); - fx_data->col = evolutecolor(fx_data->col,fx_data->colors[fx_data->dstcol],0xff00,0x0100); - fx_data->col = evolutecolor(fx_data->col,fx_data->colors[fx_data->dstcol],0xff0000,0x010000); - fx_data->col = evolutecolor(fx_data->col,fx_data->colors[fx_data->dstcol],0xff000000,0x01000000); - - color = fx_data->col; - colorlow = fx_data->col; - - lightencolor(&color,fx_data->lig * 2.0f + 2.0f); - lightencolor(&colorlow,(fx_data->lig/3.0f)+0.67f); - - rapport = 1.0f + 2.0f * (rapport - 1.0f); - rapport *= 1.2f; - if (rapport > 1.12f) - rapport = 1.12f; - - pretty_move (goomInfo, fx_data->cycle, &dist, &dist2, &rotangle, fx_data); - - for (tmp=0;tmpgRandom,511)],10)) * rapport; - fx_data->vals[tmp2] = val; - } - - grid3d_update (fx_data->grille[tmp], rotangle, fx_data->vals, dist2); - } - fx_data->cycle+=0.01f; - for (tmp=0;tmpgrille[tmp],color,colorlow,dist,buf,back,W,H); - } - else { - fx_data->lig = 1.05f; - if (fx_data->ligs < 0.0f) - fx_data->ligs = -fx_data->ligs; - pretty_move (goomInfo, fx_data->cycle, &dist, &dist2, &rotangle, fx_data); - fx_data->cycle+=0.1f; - if (fx_data->cycle > 1000) - fx_data->cycle = 0; - } -} diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/tentacle3d.h kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/tentacle3d.h --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/tentacle3d.h 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/tentacle3d.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,8 +0,0 @@ -#ifndef _TENTACLE3D_H -#define _TENTACLE3D_H - -#include "goom_visual_fx.h" - -VisualFX tentacle_fx_create(void); - -#endif diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/TODO kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/TODO --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/TODO 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/TODO 1970-01-01 00:00:00.000000000 +0000 @@ -1,32 +0,0 @@ -Idees: - -- Flash lights (Phosphor) - --> --> --> - <-- <-- <-- - -- Re-remplir RAND regulierement (1/tour) - -- Un effect qui affecte la displacement map: - -- Enregistrer l'etat de la config, s'en servir pour definir un etat de goom. - -- PluginParam de type Button, avec juste un listener en donnee. - -- PluginParam de type TextField. - -- Liste des modes possibles pour l'effet de BG. - -- Goom lui-meme : liste des effets actifs. - mode automatique / manuel (plus de changement aleatoires) - -- Possibilite d'envoyer des commandes format text au Core. exemples : -" BRIGHT_FLASH.SCREEN_BRIGHTNESS=200.0 - if SOUND.GOOM_DETECTION > 0 - 3D_TENTACLES.ENABLED = 1 - endif - CORE.MAIN_SCRIPT="..." -" - void goom_execute_script(const char *cmds); - void goom_set_main_script(const char *script); /// peut retourner un message d'erreur ? - char *goom_create_state_script(); /* retourne un script permettant de remettre goom dans l'etat actuel */ - diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/v3d.c kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/v3d.c --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/v3d.c 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/v3d.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ -#include "v3d.h" - -void v3d_to_v2d(v3d *v3, int nbvertex, int width, int height, float distance, v2d *v2) { - int i; - for (i=0;i 2) { - int Xp, Yp; - F2I((distance * v3[i].x / v3[i].z),Xp); - F2I((distance * v3[i].y / v3[i].z),Yp); - v2[i].x = Xp + (width>>1); - v2[i].y = -Yp + (height>>1); - } - else v2[i].x=v2[i].y=-666; - } -} diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/v3d.h kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/v3d.h --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/v3d.h 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/v3d.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,65 +0,0 @@ -#ifndef _V3D_H -#define _V3D_H - -#include -#include -#include - -#include "mathtools.h" - -typedef struct { - float x,y,z; -} v3d; - -typedef struct { - int x,y; -} v2d; - -typedef struct { - double x,y; -} v2g; - -/* - * projete le vertex 3D sur le plan d'affichage - * retourne (0,0) si le point ne doit pas etre affiche. - * - * bonne valeur pour distance : 256 - */ -#define V3D_TO_V2D(v3,v2,width,height,distance) \ -{ \ - int Xp, Yp; \ - if (v3.z > 2) { \ - F2I((distance * v3.x / v3.z),Xp) ; \ - F2I((distance * v3.y / v3.z),Yp) ; \ - v2.x = Xp + (width>>1); \ - v2.y = -Yp + (height>>1); \ - } \ - else v2.x=v2.y=-666; \ -} - -void v3d_to_v2d(v3d *src, int nbvertex, int width, int height, float distance, v2d *v2_array); - -/* - * rotation selon Y du v3d vi d'angle a (cosa=cos(a), sina=sin(a)) - * centerz = centre de rotation en z - */ -#define Y_ROTATE_V3D(vi,vf,sina,cosa)\ -{\ - vf.x = vi.x * cosa - vi.z * sina;\ - vf.z = vi.x * sina + vi.z * cosa;\ - vf.y = vi.y;\ -} - -/* - * translation - */ -#define TRANSLATE_V3D(vsrc,vdest)\ -{\ - vdest.x += vsrc.x;\ - vdest.y += vsrc.y;\ - vdest.z += vsrc.z;\ -} - -#define MUL_V3D(lf,v) {v.x*=lf;v.y*=lf;v.z*=lf;} - -#endif diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/xmmx.c kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/xmmx.c --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/xmmx.c 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/xmmx.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,390 +0,0 @@ - -#ifdef HAVE_MMX - -/* a definir pour avoir exactement le meme resultat que la fonction C - * (un chouillat plus lent).. mais la difference est assez peu notable. - */ -// #define STRICT_COMPAT - -#define BUFFPOINTNB 16 -#define BUFFPOINTMASK 0xffff -#define BUFFINCR 0xff - -#define sqrtperte 16 -/* faire : a % sqrtperte <=> a & pertemask*/ -#define PERTEMASK 0xf -/* faire : a / sqrtperte <=> a >> PERTEDEC*/ -#define PERTEDEC 4 - - -/*#define MMX_TRACE*/ -#include "mmx.h" -/*#include "xmmx.h"*/ -#include "goom_graphic.h" - -int xmmx_supported (void) { - return (mm_support()&0x8)>>3; -} - -void zoom_filter_xmmx (int prevX, int prevY, - Pixel *expix1, Pixel *expix2, - int *lbruS, int *lbruD, int buffratio, - int precalCoef[16][16]) -{ - int bufsize = prevX * prevY; /* taille du buffer */ - volatile int loop; /* variable de boucle */ - - mmx_t *brutS = (mmx_t*)lbruS; /* buffer de transformation source */ - mmx_t *brutD = (mmx_t*)lbruD; /* buffer de transformation dest */ - - volatile mmx_t prevXY; - volatile mmx_t ratiox; - /* volatile mmx_t interpix; */ - - expix1[0].val=expix1[prevX-1].val=expix1[prevX*prevY-1].val=expix1[prevX*prevY-prevX].val=0; - - prevXY.ud[0] = (prevX-1)<> 16 */ - - "#1 \n\t paddd %%mm1, %%mm0" /* mm0 = S + mm1 */ - "#1 \n\t psrld $16, %%mm0" - : - :[brutS] "r" (&brutS[loop]) ,[brutD] "r" (&brutD[loop]) - ); /* mm0 = S */ - - /* - * pre : mm0 : position vector on screen - * prevXY : coordinate of the lower-right point on screen - * post : clipped mm0 - * modified : mm0,mm1,mm2 - */ - asm volatile - ("#1 \n\t movq %[prevXY], %%mm1" - "#1 \n\t pcmpgtd %%mm0, %%mm1" - /* mm0 en X contient (idem pour Y) : - * 1111 si prevXY > px - * 0000 si prevXY <= px */ -#ifdef STRICT_COMPAT - "#1 \n\t movq %%mm1, %%mm2" - "#1 \n\t punpckhdq %%mm2, %%mm2" - "#1 \n\t punpckldq %%mm1, %%mm1" - "#1 \n\t pand %%mm2, %%mm0" -#endif - - "#1 \n\t pand %%mm1, %%mm0" /* on met a zero la partie qui deborde */ - ::[prevXY]"m"(prevXY)); - - /* Thread #2 - * pre : mm0 : clipped position on screen - * - * post : mm3 : coefs for this position - * mm1 : X vector [0|X] - * - * modif : eax,esi - */ - __asm__ __volatile__ ( - "#2 \n\t movd %%mm0,%%esi" - "#2 \n\t movq %%mm0,%%mm1" - - "#2 \n\t andl $15,%%esi" - "#2 \n\t psrlq $32,%%mm1" - - "#2 \n\t shll $6,%%esi" - "#2 \n\t movd %%mm1,%%eax" - - "#2 \n\t addl %[precalCoef],%%esi" - "#2 \n\t andl $15,%%eax" - - "#2 \n\t movd (%%esi,%%eax,4),%%mm3" - ::[precalCoef]"g"(precalCoef):"eax","esi"); - - /* - * extraction des coefficients... (Thread #3) - * - * pre : coef dans mm3 - * - * post : coef extraits dans mm3 (c1 & c2) - * et mm4 (c3 & c4) - * - * modif : mm5 - */ - - /* (Thread #4) - * pre : mm0 : Y pos [*|Y] - * mm1 : X pos [*|X] - * - * post : mm0 : expix1[position] - * mm2 : expix1[position+largeur] - * - * modif : eax, esi - */ - __asm__ __volatile__ ( - "#2 \n\t psrld $4, %%mm0" - "#2 \n\t psrld $4, %%mm1" /* PERTEDEC = $4 */ - - "#4 \n\t movd %%mm1,%%eax" - "#3 \n\t movq %%mm3,%%mm5" - - "#4 \n\t mull %[prevX]" - "#4 \n\t movd %%mm0,%%esi" - - "#3 \n\t punpcklbw %%mm5, %%mm3" - "#4 \n\t addl %%esi, %%eax" - - "#3 \n\t movq %%mm3, %%mm4" - "#3 \n\t movq %%mm3, %%mm5" - - "#4 \n\t movl %[expix1], %%esi" - "#3 \n\t punpcklbw %%mm5, %%mm3" - - "#4 \n\t movq (%%esi,%%eax,4),%%mm0" - "#3 \n\t punpckhbw %%mm5, %%mm4" - - "#4 \n\t addl %[prevX],%%eax" - "#4 \n\t movq (%%esi,%%eax,4),%%mm2" - - : - : [expix1] "g"(expix1) - , [prevX] "g"(prevX) - :"eax","esi" - ); - - /* - * pre : mm0 : expix1[position] - * mm2 : expix1[position+largeur] - * mm3 & mm4 : coefs - */ - - /* recopie des deux premiers pixels dans mm0 et mm1 */ - movq_r2r (mm0, mm1); /* b1-v1-r1-a1-b2-v2-r2-a2 */ - - /* depackage du premier pixel */ - punpcklbw_r2r (mm7, mm0); /* 00-b2-00-v2-00-r2-00-a2 */ - - /* extraction des coefficients... */ - - movq_r2r (mm3, mm5); /* c2-c2-c2-c2-c1-c1-c1-c1 */ - - /*^en parrallele^*/ /* depackage du 2ieme pixel */ - /*^*/ punpckhbw_r2r (mm7, mm1); /* 00-b1-00-v1-00-r1-00-a1 */ - - punpcklbw_r2r (mm7, mm5); /* 00-c1-00-c1-00-c1-00-c1 */ - punpckhbw_r2r (mm7, mm3); /* 00-c2-00-c2-00-c2-00-c2 */ - - /* multiplication des pixels par les coefficients */ - pmullw_r2r (mm5, mm0); /* c1*b2-c1*v2-c1*r2-c1*a2 */ - pmullw_r2r (mm3, mm1); /* c2*b1-c2*v1-c2*r1-c2*a1 */ - paddw_r2r (mm1, mm0); - - /* ...extraction des 2 derniers coefficients */ - movq_r2r (mm4, mm5); /* c4-c4-c4-c4-c3-c3-c3-c3 */ - punpcklbw_r2r (mm7, mm4); /* 00-c3-00-c3-00-c3-00-c3 */ - punpckhbw_r2r (mm7, mm5); /* 00-c4-00-c4-00-c4-00-c4 */ - - /* recuperation des 2 derniers pixels */ - movq_r2r (mm2, mm1); - - /* depackage des pixels */ - punpcklbw_r2r (mm7, mm1); - punpckhbw_r2r (mm7, mm2); - - /* multiplication pas les coeffs */ - pmullw_r2r (mm4, mm1); - pmullw_r2r (mm5, mm2); - - /* ajout des valeurs obtenues la valeur finale */ - paddw_r2r (mm1, mm0); - paddw_r2r (mm2, mm0); - - /* division par 256 = 16+16+16+16, puis repackage du pixel final */ - psrlw_i2r (8, mm0); - packuswb_r2r (mm7, mm0); - - movd_r2m (mm0,expix2[loop]); - - ++loop; - } - __asm__ __volatile__ ("emms\n"); -} - -#define DRAWMETHOD_PLUS_XMMX(_out,_backbuf,_col) \ -{ \ - movd_m2r(_backbuf, mm0); \ - paddusb_m2r(_col, mm0); \ - movd_r2m(mm0, _out); \ -} - -#define DRAWMETHOD DRAWMETHOD_PLUS_XMMX(*p,*p,col) - -void draw_line_xmmx (Pixel *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny) -{ - int x, y, dx, dy, yy, xx; - Pixel *p; - - if ((y1 < 0) || (y2 < 0) || (x1 < 0) || (x2 < 0) || (y1 >= screeny) || (y2 >= screeny) || (x1 >= screenx) || (x2 >= screenx)) - goto end_of_line; - - dx = x2 - x1; - dy = y2 - y1; - if (x1 >= x2) { - int tmp; - - tmp = x1; - x1 = x2; - x2 = tmp; - tmp = y1; - y1 = y2; - y2 = tmp; - dx = x2 - x1; - dy = y2 - y1; - } - - /* vertical line */ - if (dx == 0) { - if (y1 < y2) { - p = &(data[(screenx * y1) + x1]); - for (y = y1; y <= y2; y++) { - DRAWMETHOD; - p += screenx; - } - } - else { - p = &(data[(screenx * y2) + x1]); - for (y = y2; y <= y1; y++) { - DRAWMETHOD; - p += screenx; - } - } - goto end_of_line; - } - /* horizontal line */ - if (dy == 0) { - if (x1 < x2) { - p = &(data[(screenx * y1) + x1]); - for (x = x1; x <= x2; x++) { - DRAWMETHOD; - p++; - } - goto end_of_line; - } - else { - p = &(data[(screenx * y1) + x2]); - for (x = x2; x <= x1; x++) { - DRAWMETHOD; - p++; - } - goto end_of_line; - } - } - /* 1 */ - /* \ */ - /* \ */ - /* 2 */ - if (y2 > y1) { - /* steep */ - if (dy > dx) { - dx = ((dx << 16) / dy); - x = x1 << 16; - for (y = y1; y <= y2; y++) { - xx = x >> 16; - p = &(data[(screenx * y) + xx]); - DRAWMETHOD; - if (xx < (screenx - 1)) { - p++; - /* DRAWMETHOD; */ - } - x += dx; - } - goto end_of_line; - } - /* shallow */ - else { - dy = ((dy << 16) / dx); - y = y1 << 16; - for (x = x1; x <= x2; x++) { - yy = y >> 16; - p = &(data[(screenx * yy) + x]); - DRAWMETHOD; - if (yy < (screeny - 1)) { - p += screeny; - /* DRAWMETHOD; */ - } - y += dy; - } - } - } - /* 2 */ - /* / */ - /* / */ - /* 1 */ - else { - /* steep */ - if (-dy > dx) { - dx = ((dx << 16) / -dy); - x = (x1 + 1) << 16; - for (y = y1; y >= y2; y--) { - xx = x >> 16; - p = &(data[(screenx * y) + xx]); - DRAWMETHOD; - if (xx < (screenx - 1)) { - p--; - /* DRAWMETHOD; */ - } - x += dx; - } - goto end_of_line; - } - /* shallow */ - else { - dy = ((dy << 16) / dx); - y = y1 << 16; - for (x = x1; x <= x2; x++) { - yy = y >> 16; - p = &(data[(screenx * yy) + x]); - DRAWMETHOD; - if (yy < (screeny - 1)) { - p += screeny; - /* DRAWMETHOD; */ - } - y += dy; - } - goto end_of_line; - } - } -end_of_line: - __asm__ __volatile__ ("emms\n"); -} - -#endif diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/xmmx.h kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/xmmx.h --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/src/xmmx.h 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/src/xmmx.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,537 +0,0 @@ -/* xmmx.h - - eXtended MultiMedia eXtensions GCC interface library for IA32. - - To use this library, simply include this header file - and compile with GCC. You MUST have inlining enabled - in order for xmmx_ok() to work; this can be done by - simply using -O on the GCC command line. - - Compiling with -DXMMX_TRACE will cause detailed trace - output to be sent to stderr for each mmx operation. - This adds lots of code, and obviously slows execution to - a crawl, but can be very useful for debugging. - - THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY - EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT - LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY - AND FITNESS FOR ANY PARTICULAR PURPOSE. - - 1999 by R. Fisher - Based on libmmx, 1997-99 by H. Dietz and R. Fisher - - Notes: - It appears that the latest gas has the pand problem fixed, therefore - I'll undefine BROKEN_PAND by default. -*/ - -#ifndef _XMMX_H -#define _XMMX_H - - -/* Warning: at this writing, the version of GAS packaged - with most Linux distributions does not handle the - parallel AND operation mnemonic correctly. If the - symbol BROKEN_PAND is defined, a slower alternative - coding will be used. If execution of mmxtest results - in an illegal instruction fault, define this symbol. -*/ -#undef BROKEN_PAND - - -/* The type of an value that fits in an (Extended) MMX register - (note that long long constant values MUST be suffixed - by LL and unsigned long long values by ULL, lest - they be truncated by the compiler) -*/ -#ifndef _MMX_H -typedef union { - long long q; /* Quadword (64-bit) value */ - unsigned long long uq; /* Unsigned Quadword */ - int d[2]; /* 2 Doubleword (32-bit) values */ - unsigned int ud[2]; /* 2 Unsigned Doubleword */ - short w[4]; /* 4 Word (16-bit) values */ - unsigned short uw[4]; /* 4 Unsigned Word */ - char b[8]; /* 8 Byte (8-bit) values */ - unsigned char ub[8]; /* 8 Unsigned Byte */ - float s[2]; /* Single-precision (32-bit) value */ -} __attribute__ ((aligned (8))) mmx_t; /* On an 8-byte (64-bit) boundary */ -#endif - - - -/* Function to test if multimedia instructions are supported... -*/ -static int -mm_support(void) -{ - /* Returns 1 if MMX instructions are supported, - 3 if Cyrix MMX and Extended MMX instructions are supported - 5 if AMD MMX and 3DNow! instructions are supported - 0 if hardware does not support any of these - */ - register int rval = 0; - - __asm__ __volatile__ ( - /* See if CPUID instruction is supported ... */ - /* ... Get copies of EFLAGS into eax and ecx */ - "pushf\n\t" - "popl %%eax\n\t" - "movl %%eax, %%ecx\n\t" - - /* ... Toggle the ID bit in one copy and store */ - /* to the EFLAGS reg */ - "xorl $0x200000, %%eax\n\t" - "push %%eax\n\t" - "popf\n\t" - - /* ... Get the (hopefully modified) EFLAGS */ - "pushf\n\t" - "popl %%eax\n\t" - - /* ... Compare and test result */ - "xorl %%eax, %%ecx\n\t" - "testl $0x200000, %%ecx\n\t" - "jz NotSupported1\n\t" /* CPUID not supported */ - - - /* Get standard CPUID information, and - go to a specific vendor section */ - "movl $0, %%eax\n\t" - "cpuid\n\t" - - /* Check for Intel */ - "cmpl $0x756e6547, %%ebx\n\t" - "jne TryAMD\n\t" - "cmpl $0x49656e69, %%edx\n\t" - "jne TryAMD\n\t" - "cmpl $0x6c65746e, %%ecx\n" - "jne TryAMD\n\t" - "jmp Intel\n\t" - - /* Check for AMD */ - "\nTryAMD:\n\t" - "cmpl $0x68747541, %%ebx\n\t" - "jne TryCyrix\n\t" - "cmpl $0x69746e65, %%edx\n\t" - "jne TryCyrix\n\t" - "cmpl $0x444d4163, %%ecx\n" - "jne TryCyrix\n\t" - "jmp AMD\n\t" - - /* Check for Cyrix */ - "\nTryCyrix:\n\t" - "cmpl $0x69727943, %%ebx\n\t" - "jne NotSupported2\n\t" - "cmpl $0x736e4978, %%edx\n\t" - "jne NotSupported3\n\t" - "cmpl $0x64616574, %%ecx\n\t" - "jne NotSupported4\n\t" - /* Drop through to Cyrix... */ - - - /* Cyrix Section */ - /* See if extended CPUID level 80000001 is supported */ - /* The value of CPUID/80000001 for the 6x86MX is undefined - according to the Cyrix CPU Detection Guide (Preliminary - Rev. 1.01 table 1), so we'll check the value of eax for - CPUID/0 to see if standard CPUID level 2 is supported. - According to the table, the only CPU which supports level - 2 is also the only one which supports extended CPUID levels. - */ - "cmpl $0x2, %%eax\n\t" - "jne MMXtest\n\t" /* Use standard CPUID instead */ - - /* Extended CPUID supported (in theory), so get extended - features */ - "movl $0x80000001, %%eax\n\t" - "cpuid\n\t" - "testl $0x00800000, %%eax\n\t" /* Test for MMX */ - "jz NotSupported5\n\t" /* MMX not supported */ - "testl $0x01000000, %%eax\n\t" /* Test for Ext'd MMX */ - "jnz EMMXSupported\n\t" - "movl $1, %0:\n\n\t" /* MMX Supported */ - "jmp Return\n\n" - "EMMXSupported:\n\t" - "movl $3, %0:\n\n\t" /* EMMX and MMX Supported */ - "jmp Return\n\t" - - - /* AMD Section */ - "AMD:\n\t" - - /* See if extended CPUID is supported */ - "movl $0x80000000, %%eax\n\t" - "cpuid\n\t" - "cmpl $0x80000000, %%eax\n\t" - "jl MMXtest\n\t" /* Use standard CPUID instead */ - - /* Extended CPUID supported, so get extended features */ - "movl $0x80000001, %%eax\n\t" - "cpuid\n\t" - "testl $0x00800000, %%edx\n\t" /* Test for MMX */ - "jz NotSupported6\n\t" /* MMX not supported */ - "testl $0x80000000, %%edx\n\t" /* Test for 3DNow! */ - "jnz ThreeDNowSupported\n\t" - "movl $1, %0:\n\n\t" /* MMX Supported */ - "jmp Return\n\n" - "ThreeDNowSupported:\n\t" - "movl $5, %0:\n\n\t" /* 3DNow! and MMX Supported */ - "jmp Return\n\t" - - - /* Intel Section */ - "Intel:\n\t" - - /* Check for MMX */ - "MMXtest:\n\t" - "movl $1, %%eax\n\t" - "cpuid\n\t" - "testl $0x00800000, %%edx\n\t" /* Test for MMX */ - "jz NotSupported7\n\t" /* MMX Not supported */ - "movl $1, %0:\n\n\t" /* MMX Supported */ - "jmp Return\n\t" - - /* Nothing supported */ - "\nNotSupported1:\n\t" - "#movl $101, %0:\n\n\t" - "\nNotSupported2:\n\t" - "#movl $102, %0:\n\n\t" - "\nNotSupported3:\n\t" - "#movl $103, %0:\n\n\t" - "\nNotSupported4:\n\t" - "#movl $104, %0:\n\n\t" - "\nNotSupported5:\n\t" - "#movl $105, %0:\n\n\t" - "\nNotSupported6:\n\t" - "#movl $106, %0:\n\n\t" - "\nNotSupported7:\n\t" - "#movl $107, %0:\n\n\t" - "movl $0, %0:\n\n\t" - - "Return:\n\t" - : "=a" (rval) - : /* no input */ - : "eax", "ebx", "ecx", "edx" - ); - - /* Return */ - return(rval); -} - -/* Function to test if mmx instructions are supported... -*/ -#ifndef _XMMX_H -inline extern int -mmx_ok(void) -{ - /* Returns 1 if MMX instructions are supported, 0 otherwise */ - return ( mm_support() & 0x1 ); -} -#endif - -/* Function to test if xmmx instructions are supported... -*/ -inline extern int -xmmx_ok(void) -{ - /* Returns 1 if Extended MMX instructions are supported, 0 otherwise */ - return ( (mm_support() & 0x2) >> 1 ); -} - - -/* Helper functions for the instruction macros that follow... - (note that memory-to-register, m2r, instructions are nearly - as efficient as register-to-register, r2r, instructions; - however, memory-to-memory instructions are really simulated - as a convenience, and are only 1/3 as efficient) -*/ -#ifdef XMMX_TRACE - -/* Include the stuff for printing a trace to stderr... -*/ - -#include - -#define mmx_i2r(op, imm, reg) \ - { \ - mmx_t mmx_trace; \ - mmx_trace.uq = (imm); \ - fprintf(stderr, #op "_i2r(" #imm "=0x%08x%08x, ", \ - mmx_trace.d[1], mmx_trace.d[0]); \ - __asm__ __volatile__ ("movq %%" #reg ", %0" \ - : "=X" (mmx_trace) \ - : /* nothing */ ); \ - fprintf(stderr, #reg "=0x%08x%08x) => ", \ - mmx_trace.d[1], mmx_trace.d[0]); \ - __asm__ __volatile__ (#op " %0, %%" #reg \ - : /* nothing */ \ - : "X" (imm)); \ - __asm__ __volatile__ ("movq %%" #reg ", %0" \ - : "=X" (mmx_trace) \ - : /* nothing */ ); \ - fprintf(stderr, #reg "=0x%08x%08x\n", \ - mmx_trace.d[1], mmx_trace.d[0]); \ - } - -#define mmx_m2r(op, mem, reg) \ - { \ - mmx_t mmx_trace; \ - mmx_trace = (mem); \ - fprintf(stderr, #op "_m2r(" #mem "=0x%08x%08x, ", \ - mmx_trace.d[1], mmx_trace.d[0]); \ - __asm__ __volatile__ ("movq %%" #reg ", %0" \ - : "=X" (mmx_trace) \ - : /* nothing */ ); \ - fprintf(stderr, #reg "=0x%08x%08x) => ", \ - mmx_trace.d[1], mmx_trace.d[0]); \ - __asm__ __volatile__ (#op " %0, %%" #reg \ - : /* nothing */ \ - : "X" (mem)); \ - __asm__ __volatile__ ("movq %%" #reg ", %0" \ - : "=X" (mmx_trace) \ - : /* nothing */ ); \ - fprintf(stderr, #reg "=0x%08x%08x\n", \ - mmx_trace.d[1], mmx_trace.d[0]); \ - } - -#define mmx_r2m(op, reg, mem) \ - { \ - mmx_t mmx_trace; \ - __asm__ __volatile__ ("movq %%" #reg ", %0" \ - : "=X" (mmx_trace) \ - : /* nothing */ ); \ - fprintf(stderr, #op "_r2m(" #reg "=0x%08x%08x, ", \ - mmx_trace.d[1], mmx_trace.d[0]); \ - mmx_trace = (mem); \ - fprintf(stderr, #mem "=0x%08x%08x) => ", \ - mmx_trace.d[1], mmx_trace.d[0]); \ - __asm__ __volatile__ (#op " %%" #reg ", %0" \ - : "=X" (mem) \ - : /* nothing */ ); \ - mmx_trace = (mem); \ - fprintf(stderr, #mem "=0x%08x%08x\n", \ - mmx_trace.d[1], mmx_trace.d[0]); \ - } - -#define mmx_r2r(op, regs, regd) \ - { \ - mmx_t mmx_trace; \ - __asm__ __volatile__ ("movq %%" #regs ", %0" \ - : "=X" (mmx_trace) \ - : /* nothing */ ); \ - fprintf(stderr, #op "_r2r(" #regs "=0x%08x%08x, ", \ - mmx_trace.d[1], mmx_trace.d[0]); \ - __asm__ __volatile__ ("movq %%" #regd ", %0" \ - : "=X" (mmx_trace) \ - : /* nothing */ ); \ - fprintf(stderr, #regd "=0x%08x%08x) => ", \ - mmx_trace.d[1], mmx_trace.d[0]); \ - __asm__ __volatile__ (#op " %" #regs ", %" #regd); \ - __asm__ __volatile__ ("movq %%" #regd ", %0" \ - : "=X" (mmx_trace) \ - : /* nothing */ ); \ - fprintf(stderr, #regd "=0x%08x%08x\n", \ - mmx_trace.d[1], mmx_trace.d[0]); \ - } - -#define mmx_m2m(op, mems, memd) \ - { \ - mmx_t mmx_trace; \ - mmx_trace = (mems); \ - fprintf(stderr, #op "_m2m(" #mems "=0x%08x%08x, ", \ - mmx_trace.d[1], mmx_trace.d[0]); \ - mmx_trace = (memd); \ - fprintf(stderr, #memd "=0x%08x%08x) => ", \ - mmx_trace.d[1], mmx_trace.d[0]); \ - __asm__ __volatile__ ("movq %0, %%mm0\n\t" \ - #op " %1, %%mm0\n\t" \ - "movq %%mm0, %0" \ - : "=X" (memd) \ - : "X" (mems)); \ - mmx_trace = (memd); \ - fprintf(stderr, #memd "=0x%08x%08x\n", \ - mmx_trace.d[1], mmx_trace.d[0]); \ - } - -#else - -/* These macros are a lot simpler without the tracing... -*/ - -#define mmx_i2r(op, imm, reg) \ - __asm__ __volatile__ (#op " %0, %%" #reg \ - : /* nothing */ \ - : "X" (imm) ) - -#define mmx_m2r(op, mem, reg) \ - __asm__ __volatile__ (#op " %0, %%" #reg \ - : /* nothing */ \ - : "X" (mem)) - -#define mmx_m2ir(op, mem, rs) \ - __asm__ __volatile__ (#op " %0, %%" #rs \ - : /* nothing */ \ - : "X" (mem) ) - -#define mmx_r2m(op, reg, mem) \ - __asm__ __volatile__ (#op " %%" #reg ", %0" \ - : "=X" (mem) \ - : /* nothing */ ) - -#define mmx_r2r(op, regs, regd) \ - __asm__ __volatile__ (#op " %" #regs ", %" #regd) - -#define mmx_r2ir(op, rs1, rs2) \ - __asm__ __volatile__ (#op " %%" #rs1 ", %%" #rs2 \ - : /* nothing */ \ - : /* nothing */ ) - -#define mmx_m2m(op, mems, memd) \ - __asm__ __volatile__ ("movq %0, %%mm0\n\t" \ - #op " %1, %%mm0\n\t" \ - "movq %%mm0, %0" \ - : "=X" (memd) \ - : "X" (mems)) - -#endif - - - -/* 1x64 MOVe Quadword - (this is both a load and a store... - in fact, it is the only way to store) -*/ -#define movq_m2r(var, reg) mmx_m2r(movq, var, reg) -#define movq_r2m(reg, var) mmx_r2m(movq, reg, var) -#define movq_r2r(regs, regd) mmx_r2r(movq, regs, regd) -#define movq(vars, vard) \ - __asm__ __volatile__ ("movq %1, %%mm0\n\t" \ - "movq %%mm0, %0" \ - : "=X" (vard) \ - : "X" (vars)) - - -/* 1x32 MOVe Doubleword - (like movq, this is both load and store... - but is most useful for moving things between - mmx registers and ordinary registers) -*/ -#define movd_m2r(var, reg) mmx_m2r(movd, var, reg) -#define movd_r2m(reg, var) mmx_r2m(movd, reg, var) -#define movd_r2r(regs, regd) mmx_r2r(movd, regs, regd) -#define movd(vars, vard) \ - __asm__ __volatile__ ("movd %1, %%mm0\n\t" \ - "movd %%mm0, %0" \ - : "=X" (vard) \ - : "X" (vars)) - - - -/* 4x16 Parallel MAGnitude -*/ -#define pmagw_m2r(var, reg) mmx_m2r(pmagw, var, reg) -#define pmagw_r2r(regs, regd) mmx_r2r(pmagw, regs, regd) -#define pmagw(vars, vard) mmx_m2m(pmagw, vars, vard) - - -/* 4x16 Parallel ADDs using Saturation arithmetic - and Implied destination -*/ -#define paddsiw_m2ir(var, rs) mmx_m2ir(paddsiw, var, rs) -#define paddsiw_r2ir(rs1, rs2) mmx_r2ir(paddsiw, rs1, rs2) -#define paddsiw(vars, vard) mmx_m2m(paddsiw, vars, vard) - - -/* 4x16 Parallel SUBs using Saturation arithmetic - and Implied destination -*/ -#define psubsiw_m2ir(var, rs) mmx_m2ir(psubsiw, var, rs) -#define psubsiw_r2ir(rs1, rs2) mmx_r2ir(psubsiw, rs1, rs2) -#define psubsiw(vars, vard) mmx_m2m(psubsiw, vars, vard) - - -/* 4x16 Parallel MULs giving High 4x16 portions of results - Rounded with 1/2 bit 15. -*/ -#define pmulhrw_m2r(var, reg) mmx_m2r(pmulhrw, var, reg) -#define pmulhrw_r2r(regs, regd) mmx_r2r(pmulhrw, regs, regd) -#define pmulhrw(vars, vard) mmx_m2m(pmulhrw, vars, vard) - - -/* 4x16 Parallel MULs giving High 4x16 portions of results - Rounded with 1/2 bit 15, storing to Implied register -*/ -#define pmulhriw_m2ir(var, rs) mmx_m2ir(pmulhriw, var, rs) -#define pmulhriw_r2ir(rs1, rs2) mmx_r2ir(pmulhriw, rs1, rs2) -#define pmulhriw(vars, vard) mmx_m2m(pmulhriw, vars, vard) - - -/* 4x16 Parallel Muls (and ACcumulate) giving High 4x16 portions - of results Rounded with 1/2 bit 15, accumulating with Implied register -*/ -#define pmachriw_m2ir(var, rs) mmx_m2ir(pmachriw, var, rs) -#define pmachriw_r2ir(rs1, rs2) mmx_r2ir(pmachriw, rs1, rs2) -#define pmachriw(vars, vard) mmx_m2m(pmachriw, vars, vard) - - -/* 8x8u Parallel AVErage -*/ -#define paveb_m2r(var, reg) mmx_m2r(paveb, var, reg) -#define paveb_r2r(regs, regd) mmx_r2r(paveb, regs, regd) -#define paveb(vars, vard) mmx_m2m(paveb, vars, vard) - - -/* 8x8u Parallel DISTance and accumulate with - unsigned saturation to Implied register -*/ -#define pdistib_m2ir(var, rs) mmx_m2ir(pdistib, var, rs) -#define pdistib(vars, vard) mmx_m2m(pdistib, vars, vard) - - -/* 8x8 Parallel conditional MoVe - if implied register field is Zero -*/ -#define pmvzb_m2ir(var, rs) mmx_m2ir(pmvzb, var, rs) - - -/* 8x8 Parallel conditional MoVe - if implied register field is Not Zero -*/ -#define pmvnzb_m2ir(var, rs) mmx_m2ir(pmvnzb, var, rs) - - -/* 8x8 Parallel conditional MoVe - if implied register field is Less than Zero -*/ -#define pmvlzb_m2ir(var, rs) mmx_m2ir(pmvlzb, var, rs) - - -/* 8x8 Parallel conditional MoVe - if implied register field is Greater than or Equal to Zero -*/ -#define pmvgezb_m2ir(var, rs) mmx_m2ir(pmvgezb, var, rs) - - -/* Fast Empty MMx State - (used to clean-up when going from mmx to float use - of the registers that are shared by both; note that - there is no float-to-xmmx operation needed, because - only the float tag word info is corruptible) -*/ -#ifdef XMMX_TRACE - -#define femms() \ - { \ - fprintf(stderr, "femms()\n"); \ - __asm__ __volatile__ ("femms"); \ - } - -#else - -#define femms() __asm__ __volatile__ ("femms") - -#endif - -#endif - diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/test/testapp.c kodi-visualization-goom-2.1.0/lib/goom2k4-0/test/testapp.c --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/test/testapp.c 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/test/testapp.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -#include -#include - -gint16 data[2][512]; - -int main() -{ - int i; - PluginInfo *goom; - goom = goom_init (640, 480); - for (i = 0; i<100; i++) - { - fprintf(stderr,"*"); - goom_update (goom, data, 0, -1, 0, 0); - } - return 0; -} diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/tools/gfont.c kodi-visualization-goom-2.1.0/lib/goom2k4-0/tools/gfont.c --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/tools/gfont.c 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/tools/gfont.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,3483 +0,0 @@ -/* GIMP RGBA C-Source image dump (gfont.c) */ - -static const struct { - unsigned int width; - unsigned int height; - unsigned int bytes_per_pixel; /* 3:RGB, 4:RGBA */ - char *comment; - unsigned char pixel_data[1277 * 21 * 4]; -} the_font = { - 1277, 21, 4, - "Created with The GIMP", - "y\21\244\377y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0y\21\244" - "\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377" - "y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244" - "\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244" - "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21" - "\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377" - "y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21" - "\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21" - "\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21" - "\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244" - "\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244" - "\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377" - "y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0" - "\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21" - "\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21" - "\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21" - "\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21" - "\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244" - "\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244" - "\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244" - "\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244" - "\377\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377" - "\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21" - "\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244" - "\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21" - "\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21" - "\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21" - "\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21" - "\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21" - "\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244" - "\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244" - "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0" - "\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21" - "\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244" - "\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21" - "\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21" - "\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244" - "\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244" - "\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244" - "\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244" - "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21" - "\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244" - "\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21" - "\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244" - "\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0" - "\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244" - "\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244" - "\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244" - "\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244" - "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21" - "\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21" - "\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21" - "\244\377\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244" - "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21" - "\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21" - "\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244" - "\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21" - "\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21" - "\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244" - "\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244" - "\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244" - "\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21" - "\244\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21" - "\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21" - "\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21" - "\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244" - "\0y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0" - "y\21\244\377y\21\244\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244\377y\21\244\377y\21\244\377y\21\244" - "\377y\21\244\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\21\244\0y\21\244" - "\377y\21\244\377\15\4\21\0\15\4\21\0\15\4\21\0\20\5\26\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26" - "\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4" - "\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23" - "\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23" - "\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20" - "\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23" - "\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4" - "\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26" - "\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26" - "\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0" - "\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16" - "\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26" - "\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20" - "\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0" - "\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0" - "\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26" - "\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0" - "\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0" - "\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26" - "\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16" - "\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\20\5\26\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0" - "\16\4\23\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0" - "\20\5\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\20\5\26\0\16\4\23\0\15\4\21\0\15\4\21\0\20\5\26\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\5\26\0\16\4\23\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\10\6\3""9\12\10\5U\11\7\4L\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""6\11\10\4`\11" - "\7\4U\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""9\11\10\4`\11\7\4U\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""9\13\10\4U\11\7\4O\0\0\0\0\0\0\0" - "\0\0\0\0\0\10\6\3""3\12\10\5U\10\6\3U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""9\13\10\4U\10\6\3U\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""9" - "\12\10\5U\11\7\4U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\5\4\2\16\10\6\3U\11\7\4U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\10\6\3J\11\7\4q\10\6\3\247\10\6\3\213\11\7\4U\5\4\2\16\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""9\11\10\4" - "n\11\7\4U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\4\2\24\11\7\4" - "U\11\10\4U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\10\4""9\11\10\4U\6\5\3""0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\4\2\21\10" - "\6\3U\11\7\4R\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\4\2\3\10\6\3U\11" - "\7\4]\10\6\3\231\10\6\3\241\10\6\3n\11\10\4U\10\6\3U\6\5\3\37\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\4\2\3\10\6\3U\12\10" - "\5U\12\7\5U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\5\4\2""9\10\6\3U\11\7\4[\10\6\3\231\10\6\3\252\10\6\3\244\10\6" - "\3l\10\6\3U\6\5\3G\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\4\2" - "*\10\6\3U\11\7\4[\10\6\3\231\10\6\3\252\10\6\3\244\10\6\3l\10\6\3U\6\5\3" - "G\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\5\4\2\3\10\6\3U\11\10\4U\11\7\4J\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\10\6\3*\11\7\4U\10\6\3U\11\7\4U\10\6\3}\10\6\3\252\7\6\4" - "\252\11\7\4\252\14\11\7\252\23\16\12\252\23\15\12\216\10\6\5\34\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\5\4\2""3\10\6\3U\11\7\4[\10\6\3\231\10\6\3\252\10" - "\6\3\244\10\6\3l\10\6\3U\6\5\3G\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12" - "\10\5""9\11\7\4\252\10\6\3\252\10\6\3\252\10\6\3\241\10\6\3\216\11\7\4`\11" - "\7\4U\10\6\3U\11\7\4U\11\7\4J\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\4" - "\2*\10\6\3U\11\7\4[\10\6\3\231\10\6\3\252\10\6\3\244\10\6\3l\10\6\3U\6\5" - "\3L\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5R\12\10\7\205\14" - "\11\7\252\17\13\10\252\17\13\10\252\17\13\10\252\15\12\10\252\12\10\7\241" - "\12\10\7U\6\5\5\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3" - "J\11\10\4U\10\6\3""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\7\6\4\34\11\7\4U\11\7\4U\5\4\2\21\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\4\2*\10\6\3U\11" - "\7\4[\10\6\3\231\10\6\3\252\10\6\3\244\10\6\3l\10\6\3U\6\5\3U\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5U\12\10\7\205\14\11\7\252\17\12" - "\10\252\17\13\10\252\17\13\10\252\15\12\10\252\12\10\7\226\10\6\5>\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5R\12\10\7\205\14\11\7\252" - "\17\12\10\252\16\12\7\252\11\7\4\252\10\6\5\223\12\10\5U\7\6\4U\5\4\4\3\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\11\7""9\13\10\6\241\11\7\6\252\12\10\7" - "\252\15\12\10\252\16\12\7\252\15\12\10\252\14\11\7\252\12\10\7\234\12\10" - "\7U\6\5\5\31\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\5\3""9\10\7\5U\11" - "\7\4n\11\7\4\252\12\10\5\252\12\10\5\252\13\10\6\252\12\10\7\226\12\10\7" - "U\6\5\5\31\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\13\10""9\13\10\6\252\11\7\6" - "\252\12\10\7\252\15\12\10\252\17\13\10\252\17\13\10\252\15\12\10\252\12\10" - "\7\237\12\10\7U\6\5\5\31\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\13\10;\13\11" - "\6\252\11\7\4}\12\10\5U\10\6\3\205\10\6\3\247\10\6\3\252\10\6\3\252\11\10" - "\4q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3*\12\10\5U\12\7\5U\11\7\4}\12\10" - "\5\252\14\12\7\252\16\13\7\252\23\16\12\252\23\16\12\216\10\6\5\34\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5R\12\10\7\205\14\11\7\252\17\13\10\252\17" - "\13\10\252\17\13\10\252\15\12\10\252\12\10\7\241\12\10\7U\6\5\5\31\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\14\12\7J\16\12\7\252\14\11\7\213\7\6\4\34\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7n\16\12\7\252\15\12\10}\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\15\12\10G\17\13\10\252\15\12\10\202\5\5\4\10\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\13\10\6U\11\7\4\252\12\10\5]\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\11" - "\7""9\12\10\5\247\13\10\6n\6\5\3\10\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\10" - "\6""9\12\7\5\237\13\10\6f\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""3\12\10" - "\5U\11\7\4U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\12\7\5""9\13\11\6U\7\6\4""9\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\5\4\34\12\10\5U\13\10\6U\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\10\6\3""0\12\10\5U\10\6\3U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\10\6\3""9\13\10\4U\11\7\4O\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\5\4\2-\10\6\3U\11\7\4U\11\7\4X\11\7\4l\11\10\4]\11\7\4U\10\6\3U\6\5" - "\3J\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3-\11\7\4U\10\6\3U\11\7" - "\4U\10\6\3}\10\6\3\252\10\6\3\244\10\6\3l\10\6\3U\6\5\3J\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\5\3""9\10\7\5U\12\10\5U\11\7\4w\10\6\3" - "\216\11\7\4\202\12\10\5[\12\7\5U\6\5\3U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\11\7\4""9\12\10\5U\12\7\5U\12\10\5U\10\6\3\220\10\6\3\252\10\6\3\244" - "\10\6\3l\10\6\3U\6\5\3G\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5" - "\4\2-\10\6\3U\11\7\4[\10\6\3\231\10\6\3\252\10\6\3\244\11\7\4i\10\6\3U\6" - "\5\3J\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\10\4;\11\7\4\252\10\6\3" - "\244\11\7\4[\10\6\3U\10\6\3U\10\6\3U\11\7\4U\10\6\3\216\11\6\4\252\11\10" - "\4t\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""0\12\10\5U\11\7\4U\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""9\13\10\4U\11\7\4L\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\10\6\3""0\12\10\5U\11\7\4U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\10\6\3""9\13\10\4U\11\7\4L\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10" - "\6\3""0\12\10\5U\11\7\4U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\10\6\3""9\13\10\4U\11\7\4L\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6" - "\3""6\11\10\4`\11\7\4U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""9" - "\11\10\4`\11\7\4U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5""9\12\7\5\231\12" - "\10\5]\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7]\16\13\7\252\15\12" - "\10\210\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\10\6[\13\10\6\252\11\7\4\252\11" - "\7\4\252\10\6\5\252\10\6\3w\11\7\4U\10\6\3U\10\6\3U\11\7\4U\11\7\4L\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3*\11\7\4U\10\6\3U\10\6\3z\11\10\4f\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""3\11\7\4U\6\5\3-\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\10\5""9\10" - "\6\3\234\12\7\5]\13\10\6U\13\10\6U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\6\5\5\16\15\12\10U\10\7\5-\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5""9\12" - "\7\5\234\12\10\5`\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4""9\12\10\5]\12\10\5U\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7n\15\12\10\252\14\11" - "\7\205\5\5\4\6\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5O\12\10\7\177\15\12\10\252\20" - "\14\11\216\10\7\5\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\10\6\3""9\12\10\5U\11\6\4U\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17" - "\13\10q\31\22\14\252\24\17\13\216\10\7\5\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\17\13\10\202\26\20\13\252\24\17\13\216\7\6\6\27" - "\0\0\0\0\0\0\0\0\0\0\0\0\15\12\10D\14\11\7\252\13\10\6t\6\5\3\10\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\14\11\7R\17\12\10\252\15\12\10\202\5\5\4\10\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\6\5\3""9\10\6\3U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\4\2\6\10\6\3U\10\6" - "\3\234\11\10\4q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""0\11\10\4[\11\7\4" - "L\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5""9\11\6\4\252\10\6\3c\5\4\2\"\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10" - "\6\3G\11\10\4]\11\10\4`\10\6\3U\6\5\3-\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3L\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\10\6\3""9:\37\11\377]2\14\377X-\13\377\14\12\5q\0\0\0\0\7" - "\6\4\34""6\35\11\377].\14\377X-\13\377\14\11\5z\0\0\0\0\7\5\4%6\35\11\377" - "].\14\377X-\13\377\16\12\5\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3U:\37" - "\11\377]2\14\377X,\13\377\11\7\4\252\0\0\0\0\5\4\2U4\34\11\377]0\14\377X" - ",\13\377\14\12\5\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\7\6\4U:\37\11\377]2\14\377X-\13\377\14\11\5\252\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""9:\37\11\377]2\14\377X-\13\377" - "\16\12\5\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\5\3\34\23\14\6\343" - "L%\13\377X-\13\377\16\12\5\213\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\10\4\252" - "E#\12\377\\/\13\377\\/\13\377X-\13\377X-\13\377\20\13\5\343\7\5\4\34\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""9:\37\11\377" - "].\14\377X-\13\377\16\12\5\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\5\3\34\23" - "\14\6\343R'\13\377\\/\13\377\16\12\5i\0\0\0\0\0\0\0\0\7\5\4\24""6\35\11\377" - "d2\15\377\36\23\7\377\10\6\3U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\6\5\3\34\23\14\6\343L%\13\377X-\13\377\16\12\5\202\0\0\0\0\0\0\0\0\0" - "\0\0\0\7\6\4A\21\13\6\343G%\12\377X-\13\377\\/\13\377\\/\13\377X-\13\377" - "X,\13\377X,\13\377\31\20\6\377\10\6\3\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\7\5\4U\21\14\6\345M'\14\377k3\16\377q7\20\377\24\16\11\262" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\13\7\252\35\22" - "\10\377J'\13\377X-\13\377X-\13\377\\/\13\377\\/\13\377X-\13\377X,\13\377" - ")\27\10\377\14\11\5\343\5\5\4\27\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4\252\32\21" - "\6\377J'\13\377X-\13\377X-\13\377\\/\13\377\\/\13\377X-\13\377X,\13\377)" - "\30\10\377\14\11\5\343\6\5\3\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\5\3U\20\13\5\343G%\12\377X-\13\377X,\13" - "\377\14\12\5q\0\0\0\0\0\0\0\0\10\6\3\34""6\35\11\377\\/\13\377X,\13\377X" - "-\13\377\\.\15\377d4\15\377m5\20\377y?\24\377\236J\27\377\264X\33\377\267" - "Z\34\377\32\21\13\216\0\0\0\0\0\0\0\0\0\0\0\0\12\7\5\252\32\21\6\377J'\13" - "\377X-\13\377\\/\13\377\\/\13\377\\/\13\377X-\13\377X-\13\377)\30\10\377" - "\14\11\5\343\6\5\3\34\0\0\0\0\0\0\0\0\7\6\4\10=\40\12\377f3\15\377\\.\15" - "\377\\.\15\377\\.\15\377\\.\15\377\\.\15\377Z-\13\377T,\13\377X-\13\377X" - ",\13\377\16\12\5w\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4\231\32\21\6\377J'\13\377" - "X-\13\377\\/\13\377\\/\13\377\\/\13\377X-\13\377X,\13\377-\31\10\377\15\12" - "\6\343\7\6\4\34\0\0\0\0\0\0\0\0\0\0\0\0\21\15\12\252@'\25\377\233N\32\377" - "\251S\32\377\245P\30\377\241O\30\377\221G\26\377\210F\25\377\206E\25\377" - "X2\27\377\26\21\13\350\11\10\6\37\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\4\4\3\27\14\11\5" - "\255G\"\12\377\\+\15\377!\24\10\377\12\10\5""9\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\24\16\7\343S*\14\377\\.\15\377\23\15\6\343" - "\6\5\3\"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\12\10\5\252\32\21\6\377L%\13\377Z.\13\377\\.\15\377\\.\15\377Z-\13\377Z" - "-\13\377X,\13\377.\32\11\377\22\15\11\343\10\7\5\34\0\0\0\0\0\0\0\0\0\0\0" - "\0\17\14\10\252:#\23\377\206I\27\377\231L\30\377\216E\25\377\203@\24\377" - "y;\22\377y;\22\377y>\22\377+\33\14\377\13\11\6\252\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\21\15\12\252@'\25\377\244U\33\377\261V\32\377\232K\27\377y>\22" - "\377s8\20\377w=\22\377{=\24\377P-\23\377\26\20\13\343\10\7\5\34\0\0\0\0\0" - "\0\0\0\15\12\10""9`0\23\377\245P\30\377\237N\30\377\237N\30\377\245P\30\377" - "\245P\30\377\245P\30\377\237N\30\377\244Q\31\377[4\30\377\26\21\13\343\10" - "\7\5\34\0\0\0\0\0\0\0\0\0\0\0\0\15\12\10\252&\30\13\377c/\20\377t;\21\377" - "~A\25\377\216E\25\377\231L\30\377\235J\30\377\233L\30\377[4\30\377\27\22" - "\14\343\10\7\5\34\0\0\0\0\0\0\0\0\15\12\10""9h4\25\377\253T\32\377\233L\30" - "\377\244Q\31\377\255Q\32\377\264X\33\377\264X\33\377\261V\32\377\251P\32" - "\377\\7\31\377\26\21\13\343\10\7\5\34\0\0\0\0\0\0\0\0\15\12\10""9r?\31\377" - "\261V\32\377r8\21\377\\.\15\377\\/\13\377].\14\377\\.\15\377`0\15\377\\." - "\15\377\22\14\5[\0\0\0\0\0\0\0\0\10\6\3(7\35\12\377l2\17\377r8\21\377\202" - "C\25\377\231L\30\377\241R\30\377\253T\32\377\263T\32\377\263T\32\377\31\21" - "\12\216\0\0\0\0\0\0\0\0\0\0\0\0\17\14\10\252@'\25\377\242T\33\377\263X\34" - "\377\267Z\34\377\265Y\34\377\265Y\34\377\254X\33\377\234M\31\377X2\27\377" - "\26\21\13\343\10\7\5\34\0\0\0\0\0\0\0\0\15\11\6""9`0\23\377\231G\26\377\206" - "E\25\377\24\16\11\301\0\0\0\0\0\0\0\0\0\0\0\0\13\10\6q|>\31\377\271[\34\377" - "\251P\32\377\26\17\11\216\0\0\0\0\0\0\0\0\13\10\6""9o=\30\377\270Z\33\377" - "\261V\32\377\27\20\12\255\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\10\6qr;\27\377\220I\25\377~?\25\377\24" - "\16\11\216\0\0\0\0\0\0\0\0\13\11\6""9a3\24\377\230G\27\377\206E\25\377\24" - "\16\11\273\0\0\0\0\0\0\0\0\0\0\0\0\14\11\7`a0\22\377\214G\25\377\212G\25" - "\377\24\17\11\216\0\0\0\0\0\0\0\0\10\6\3(4\34\11\377]2\14\377X-\13\377\16" - "\12\5\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\15\12\10R[0\20\377\204G\25\377?$\22\377\12\10\7\210\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\7\6\6>\37\25\14\364|B\27\377\206E\25\377\24\17\11\216" - "\0\0\0\0\0\0\0\0\10\6\3\34""6\35\11\377].\14\377P'\13\377\16\12\5\216\0\0" - "\0\0\0\0\0\0\0\0\0\0\10\6\3""9:\37\11\377]2\14\377X,\13\377\16\12\5t\0\0" - "\0\0\0\0\0\0\0\0\0\0\11\7\4\231\32\21\6\377J'\13\377X-\13\377X-\13\377X-" - "\13\377X-\13\377X,\13\377X,\13\377)\27\10\377\14\11\5\343\5\4\4\21\0\0\0" - "\0\0\0\0\0\10\6\3\"6\35\11\377\\+\13\377X,\13\377X-\13\377\\+\13\377\\/\13" - "\377\\/\13\377X-\13\377X,\13\377-\31\10\377\14\12\5\343\6\5\3\34\0\0\0\0" - "\0\0\0\0\0\0\0\0\15\12\6\252(\30\13\377a0\20\377q7\20\377s8\20\377t9\21\377" - "t9\21\377q7\20\377q7\20\377\25\377\270^\25\377u>\26\377\21\14\10\343" - "\7\5\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\10\6" - "\252C#\20\377\244U\25\377s:\20\377\24\16\7\374\10\6\5U\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4RB%\15\377\221K\22\377\232N\21\377s" - ":\20\377\35\22\10\377\16\12\7\377\20\13\7\377A\"\14\377\226J\23\377\275a" - "\26\377\212O\33\377\16\14\11\216\0\0\0\0\0\0\0\0\7\6\6""97!\20\377\236Q\23" - "\377\242P\23\377f5\21\377\30\17\7\377\23\14\6\252\16\12\5\314.\32\11\377" - "\211C\20\377\213G\20\3771\33\12\377\7\6\4i\0\0\0\0\0\0\0\0\7\6\6>H.\27\377" - "\307s\40\377\315o\34\377\233T\32\377)\30\16\377\22\15\11\377\31\20\12\377" - "n=\31\377\307d\34\377\315p\36\377\222W\35\377\15\13\10\216\0\0\0\0\0\0\0" - "\0\12\10\7\223\264W\31\377\316o\33\377\313i\32\377\244U\33\377(\30\17\377" - "\24\16\11\377\32\21\13\377y@\32\377\311e\34\377\315p\36\377\222W\35\377\16" - "\13\7\216\0\0\0\0\0\0\0\0\10\6\5""9G,\26\377\300l\31\377\306e\27\377\226" - "N\31\377)\30\16\377\40\25\15\377J)\25\377\270i\33\377\312h\31\377\312v\33" - "\377\256f\37\377\21\16\12\216\0\0\0\0\0\0\0\0\13\11\6\210\266\\\31\377\316" - "p\35\377\315o\34\377\246O\33\377+\31\20\377\25\17\12\377\35\23\14\377tC\33" - "\377\312k\37\377\316q\37\377\222W\35\377\14\12\7\216\0\0\0\0\0\0\0\0\13\10" - "\6\220\271]\32\377\312g\27\377\235M\22\377S*\14\377\23\15\6\377\15\12\6\377" - "\24\15\7\377\33\21\10\377\34\22\11\343\12\10\5-\0\0\0\0\0\0\0\0\13\11\6\216" - "\213I\24\377\306`\25\377\307j\30\377\233N\32\377)\31\16\377\25\17\12\377" - "\34\22\13\377&\30\17\377(\30\17\343\16\12\7>\0\0\0\0\0\0\0\0\10\7\5""9A)" - "\24\377\305l\34\377\315o\34\377\252X\33\377+\33\20\377\23\16\12\377\35\23" - "\14\377{B\30\377\265T\24\377\252W\23\377r<\21\377\13\12\6\216\0\0\0\0\0\0" - "\0\0\13\11\6Uw<\17\377\232K\21\377\232N\21\377\22\15\7\377\0\0\0\0\0\0\0" - "\0\0\0\0\0\15\12\10\252\277f\36\377\321v\36\377\317q\36\377\34\23\13\311" - "\0\0\0\0\0\0\0\0\15\12\10i\246W\27\377\306e\27\377\306a\27\377\32\22\13\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\15\12\10\252\275d\34\377\316o\33\377\314f\33\377\34\24\13\311\0" - "\0\0\0\0\0\0\0\14\12\7t\270]\33\377\316k\33\377\313q\32\377\27\21\12\377" - "\0\0\0\0\0\0\0\0\6\5\5\34\31\22\14\364\300i\33\377\316p\35\377\317u\36\377" - "\40\26\15\252\0\0\0\0\0\0\0\0\13\11\6Xp9\15\377\217F\20\377\215E\20\377\21" - "\14\6\343\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\16\13\11\252\270\\\31\377\316o\33\377\300o\37\3771!\22\377\12\10\7z\0\0" - "\0\0\0\0\0\0\0\0\0\0\7\7\6;\26\20\13\350\247d\34\377\315p\36\377\315t\36" - "\377\32\22\13\322\0\0\0\0\0\0\0\0\10\7\3Un6\15\377\215E\20\377\215K\20\377" - "\31\20\6\377\5\4\4(\0\0\0\0\0\0\0\0\12\10\5Up7\15\377\215K\20\377\215K\20" - "\377\24\15\5\252\0\0\0\0\0\0\0\0\5\4\2\34!\24\10\377\202B\17\377\215H\20" - "\377p7\15\377-\31\10\377\32\21\6\377!\24\10\377^/\15\377\215E\20\377\220" - "G\21\377P(\15\377\11\7\4}\0\0\0\0\0\0\0\0\12\10\5Up9\15\377\224O\21\377\215" - "K\20\377W*\14\377\23\15\6\377\16\12\5\327\17\12\6\377<\37\13\377\217G\22" - "\377\240R\23\377`6\21\377\14\11\7\216\0\0\0\0\0\0\0\0\10\6\5""9G,\26\377" - "\300d\31\377\307j\30\377\271]\32\377[2\26\377:!\21\377H)\23\377\236Q\31\377" - "\307j\30\377\307j\30\377\212O\33\377\15\13\10\216\0\0\0\0\0\0\0\0\12\10\7" - "\223\246W\27\377\313l\30\377\312l\31\377\231M\32\377&\26\15\377\17\13\6\377" - "\16\12\5\3774\34\11\377\204F\17\377\215K\20\377P)\15\377\12\10\5\213\0\0" - "\0\0\0\0\0\0\7\6\6""90\35\15\377\232O\23\377\240U\23\377l8\21\377\36\22\11" - "\377\20\13\7\377\30\17\11\377`3\21\377\247V\24\377\265X\24\377\214K\27\377" - "\22\16\11\220\0\0\0\0\0\0\0\0\0\0\0\0\26\16\7\301\26\15\7\377\24\15\7\377" - "N(\17\377\245Q\24\377\261Z\24\377\261Z\24\377s:\24\377\40\24\13\377\30\17" - "\11\377\36\23\11\343\13\10\6""6\0\0\0\0\0\0\0\0\13\11\6\216\213D\24\377\246" - "N\23\377\220G\21\377\23\14\6\327\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4\210r8\15" - "\377\217F\20\377\213D\20\377\23\15\6\252\0\0\0\0\0\0\0\0\12\7\5Up7\15\377" - "\217F\20\377\213J\20\377\21\13\6\335\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4\210r" - "8\15\377\217F\20\377\215K\20\377\24\15\5\252\0\0\0\0\0\0\0\0\11\6\4Un6\15" - "\377\215E\20\377\215H\20\377\21\13\6\335\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\11\7\4\210r8\15\377\217I\20\377\213J\20\377\23\15\6\252\0\0\0\0" - "\0\0\0\0\10\6\3Un6\15\377\217L\20\377\215E\20\377\22\14\5\374\0\0\0\0\0\0" - "\0\0\0\0\0\0\13\11\6\252\203E\22\377\252W\23\377\250V\23\377\34\23\11\252" - "\0\0\0\0\0\0\0\0\13\10\6U\221J\32\377\314f\33\377\313i\32\3774!\21\377\6" - "\5\5""9\0\0\0\0\0\0\0\0\21\16\12\343\276k\31\377\314q\31\377\256V\33\377" - "\22\15\11\252\0\0\0\0\0\0\0\0\0\0\0\0\34\22\13\306%\27\16\377\40\25\15\377" - "\25\17\12\377\24\16\11\377&\27\13\377W,\14\377\211F\20\377\215H\20\377\217" - "F\20\377\215H\20\377\22\14\5\252\0\0\0\0\0\0\0\0\11\6\4Un6\15\377\221J\20" - "\377\215E\20\377^/\15\377\33\21\10\343\14\10\5\34\0\0\0\0\0\0\0\0\16\12\7" - "Uy>\22\377\254W\23\377\213E\22\377\24\17\11\343\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\25\16\10\343u=\30\377\307" - "d\34\377\315j\32\377\314n\33\377\32\22\13\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\10\7\5\34\24\17\13\343\207I\26\377\300a\25\377\245S\26\377!\26\14\377" - "\12\11\7U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\13\11\6\252\270a\33\377\316p\35\377\314n\33\377\34\23\13\377\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\13\7\252\263]\30" - "\377\312g\27\377\306a\27\377\26\17\11\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\11\7\6\252}?\22\377\236M\21\377\222K\21\377\21\14\6\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\10\6\5LH.\27\377\305l\34\377\311k\30\377\244U\33\377%\26\16\343" - "\15\11\6""0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\14\11\7\252\212C\23\377\252O\23\377\250V\23\377\24\16\11\377\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10" - "\7\5\24\25\17\12\270\32\21\13\377\32\21\13\327\14\11\7J\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5\24\25\17\12\270\32\21\13\377\37\25" - "\14\317\22\15\11\34\0\0\0\0\0\0\0\0\13\11\10\234\270]\33\377\320i\35\377" - "\315o\34\377\34\23\13\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\13\7\252\270\\\31\377\313h\30\377\310" - "b\27\377\32\22\13\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5""93\35\14\377\230K\23" - "\377\242V\23\377\23\15\10\366\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\6\5\3\34\23\15\6\371\\.\15\377{?\16\377N'\13\377\25" - "\17\6\343\11\10\4\34\0\0\0\0\0\0\0\0\11\10\4Un;\15\377\215E\20\377\215K\20" - "\377\25\16\6\252\0\0\0\0\0\0\0\0\0\0\0\0\20\13\5\2524\34\11\377s;\16\377" - "t<\17\377+\32\12\377\11\7\6}\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5\34\25" - "\21\12\343m;\22\377\240R\23\377y@\22\377>\"\15\377^5\21\377\225N\24\377f" - "6\23\377\40\26\13\377H'\17\377y>\22\377\30\21\11\273\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3\247\200" - "B\17\377\241U\21\377\237Q\22\377\30\17\7\262\0\0\0\0\6\5\3%0\34\13\377\255" - "\\\24\377\265`\24\377\25\17\10\335\0\0\0\0\6\5\3\34(\30\11\377\217J\22\377" - "\236P\21\377\25\17\6\265\0\0\0\0\0\0\0\0\12\10\5""6k3\16\377\235S\22\377" - "\244T\23\377\260Y\23\377\275\\\24\377\277b\26\377\276j\27\377\305n\32\377" - "\313l\30\377\313u\30\377\315w\32\377\317z\36\377\307v\40\377\40\27\15\252" - "\0\0\0\0\0\0\0\0\0\0\0\0\7\6\4U\26\17\7\350q6\16\377\222K\21\377\236P\21" - "\377\232N\21\377\236P\21\377\224L\21\377\213G\20\377\207B\20\377\207B\20" - "\377\25\16\6\210\0\0\0\0\0\0\0\0\12\10\5U\200B\17\377\241U\21\377\236P\21" - "\377\31\20\6\314\0\0\0\0\0\0\0\0\0\0\0\0\7\6\4\34\31\20\10\343f2\17\377\224" - "L\21\377\216I\21\377T-\15\377\12\10\5q\0\0\0\0\0\0\0\0\11\7\4Rk5\16\377\222" - "K\21\377T)\15\377\10\7\5\306\3\2\2\27\5\4\4\210&\27\11\377\210F\21\377\214" - "H\21\377\25\17\6\262\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\6" - "\4""9-\32\12\377\217J\22\377\236P\21\377\32\21\6\252\0\0\0\0\0\0\0\0\0\0" - "\0\0\30\20\7\343s:\20\377\224L\21\377.\32\11\377\7\6\4\234\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\5\4\4G\23\15\6\377\213G\20\377\214H\21\377+\32\12\377" - "\11\10\4U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5Um4\16\377&\27\11\377\6" - "\5\3U\0\0\0\0\0\0\0\0\0\0\0\0\4\4\3\34\17\14\6\343s8\20\377\35\23\10\252" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\12\6" - "qz@\25\377\244U\25\377\212G\21\377\25\17\6\241\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15" - "\12\6\343\211C\20\377\232K\21\377T-\15\377\12\10\5t\0\0\0\0\0\0\0\0\11\7" - "\4Uo7\16\377\236W\21\377\236P\21\377\23\15\6\377\4\4\3\34\0\0\0\0\3\3\2q" - "\21\14\6\377\213G\20\377\241U\21\377\222K\21\377\24\16\7\322\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\20\15\11n\270i\33\377\321{\36\377\322|\37\377\320{\37" - "\377\317z\36\377\33\24\14\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\15\13\10\223\217K\24\377\241U\21\377\236P\21\377\33\22\10\343\5\4\2" - "\34\0\0\0\0\0\0\0\0\12\7\5\306\203A\20\377\241U\21\377\226L\21\377\25\16" - "\6\252\0\0\0\0\0\0\0\0\12\10\5U{=\20\377\243S\22\377\236P\21\377\33\22\10" - "\343\5\4\2\34\0\0\0\0\0\0\0\0\11\7\4\306\202B\17\377\243S\22\377\224L\21" - "\377\25\16\6\301\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\7\6\4U\26\17\7\377\203A\20\377\232N\21\377\232N\21\377\232N\21\377\232N" - "\21\377\25\17\6\252\0\0\0\0\0\0\0\0\12\10\5U\201@\20\377\243V\22\377\264" - "[\23\377\35\24\12\377\3\3\2]\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5zy<\20\377\241U\21\377\237Q\22\377\30" - "\17\7\377\4\4\3\"\0\0\0\0\2\2\1\6\21\15\10\265\265]\26\377\313l\30\377\315" - "r\32\377\40\27\15\322\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\5\4\4\241\36\26\15\377\306t\35\377\316j\31\377\277`" - "\24\377\32\21\7\252\0\0\0\0\0\0\0\0\11\7\4Ut<\17\377\241U\21\377\236P\21" - "\377\25\16\6\377\5\4\2\34\0\0\0\0\2\2\1\3\14\11\7\327\276k\31\377\323|\36" - "\377\320\206%\377\40\26\15\262\0\0\0\0\0\0\0\0\15\13\10`\273p\40\377\321" - "{\36\377\277`\24\377\34\23\11\377\4\3\3J\0\0\0\0\3\2\2\34\15\12\10\343\304" - "x\37\377\323|\36\377\307j\30\377\33\23\12\252\0\0\0\0\0\0\0\0\15\12\6""9" - "r=\23\377\262[\25\377\266f\27\377\27\21\12\255\0\0\0\0\0\0\0\0\13\11\6[\222" - "U\31\377\306q\35\377\304x\37\377\33\24\14\317\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\5\5\4\34\25\21\14\343\276v!\377\321\203(\377\241d\"\377\21\16" - "\12\343\5\5\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\11\10\6\252[;\34\377\275^\30\377\242S\23\377'\31\14\377" - "\7\7\6U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\216\267g\30\377" - "\313p\30\377\313p\30\377*\32\15\371\5\4\4>\0\0\0\0\3\2\2\31\14\11\7\343\303" - "s\36\377\324\177#\377\323\204&\377\40\26\15\265\0\0\0\0\0\0\0\0\14\12\7U" - "|A\21\377\241U\21\377\237N\22\377\25\16\6\377\5\4\2\34\0\0\0\0\0\0\0\0\7" - "\6\4\340\205D\20\377\237Q\22\377\222H\21\377\26\16\7\252\0\0\0\0\0\0\0\0" - "\15\13\10[\271o\40\377\322}!\377\315r\32\377%\32\16\377\4\4\3U\0\0\0\0\4" - "\4\4\34\15\12\10\343\301i\32\377\316o\33\377\312v\33\377\40\26\15\252\0\0" - "\0\0\0\0\0\0\13\11\6\177\256[\27\377\312f\25\377\310i\25\377$\27\15\377\4" - "\4\3U\0\0\0\0\3\3\2\34\15\13\10\343\306v!\377\324\177#\377\320\200!\377\37" - "\26\14\265\0\0\0\0\0\0\0\0\15\13\10[\271r\36\377\323|\36\377\320z\35\377" - "\"\30\15\377\4\4\3U\0\0\0\0\7\6\6q\40\30\15\377\271_\26\377\312b\25\377\306" - "a\27\377!\26\14\252\0\0\0\0\0\0\0\0\12\10\7\234\276l\33\377\324~!\377\323" - "\177$\377(\32\17\377\4\4\3U\0\0\0\0\3\3\2\34\15\13\10\343\306v!\377\326\201" - "%\377\323\204&\377\40\27\15\255\0\0\0\0\0\0\0\0\12\10\7\220\247W\26\377\271" - "^\24\377\245W\22\377\31\21\10\377\3\3\2""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\252\303p\36\377\322}!\377\320u\35\377" - "'\32\16\377\4\4\3U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\14\12\7\226\270l\33\377\323|\36\377\323\177$\377(\33\17\377\4\4\3U\0\0" - "\0\0\3\3\2\34\21\15\10\262\212G\21\377\241U\21\377\233O\22\377\25\16\6\252" - "\0\0\0\0\0\0\0\0\12\10\5U|=\17\377\251Y\22\377\264[\23\377\31\22\12\377\0" - "\0\0\0\0\0\0\0\0\0\0\0\15\13\10\252\304q\37\377\323|\36\377\315w\32\377\32" - "\22\13\314\0\0\0\0\0\0\0\0\13\11\6X\206F\23\377\255W\22\377\250V\23\377\24" - "\15\7\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\15\13\10\252\304q\37\377\322}!\377\317z\36\377\30\22\13" - "\324\0\0\0\0\0\0\0\0\13\11\6w\264]\27\377\313l\30\377\312g\27\377\24\17\11" - "\377\0\0\0\0\0\0\0\0\17\15\12\303e?\32\377\312u\31\377\316\200#\377\240j" - "#\377\17\15\12\216\0\0\0\0\0\0\0\0\12\10\5\223\213F\24\377\277`\24\377\310" - "i\25\377\31\22\12\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\15\12\10\252\275c\32\377\316s\33\377\315j\32\377\271j\34\377" - "O4\32\377\12\11\7z\0\0\0\0\7\6\6*$\33\21\364\254j#\377\317\200\"\377\323" - "~\"\377\323\177$\377\30\22\13\343\0\0\0\0\0\0\0\0\12\10\5U|@\17\377\237Q" - "\22\377\236P\21\377L(\15\377\13\10\6\322\0\0\0\0\0\0\0\0\14\11\5U\201@\20" - "\377\241U\21\377\236P\21\377\32\20\7\252\0\0\0\0\0\0\0\0\11\7\4Us8\20\377" - "\241U\21\377\237Q\22\3771\33\12\377\7\6\4\252\5\4\4U\6\5\3q\32\23\13\377" - "\271_\26\377\312f\25\377\305h\26\377\34\24\13\255\0\0\0\0\0\0\0\0\15\12\6" - "f\247W\26\377\310e\25\377\311f\26\377\40\25\13\377\4\3\3A\0\0\0\0\2\2\1\21" - "\14\12\7\335\276b\27\377\320t\33\377\314n\33\377\36\25\13\265\0\0\0\0\0\0" - "\0\0\15\13\10[\271r\36\377\323|\36\377\321{\36\377V7\31\377\11\10\6\273\6" - "\6\5U\7\6\6\202\40\30\17\377\310z\37\377\321{\36\377\316z\37\377\40\27\15" - "\255\0\0\0\0\0\0\0\0\12\10\7\220\277q\36\377\324\177#\377\322~#\377(\33\17" - "\377\4\4\3U\0\0\0\0\2\2\1\10\13\11\6\324\235Q\24\377\275\\\24\377\276a\25" - "\377\33\23\12\262\0\0\0\0\0\0\0\0\14\12\7`\267i\34\377\321{\36\377\315r\32" - "\377$\30\15\377\4\4\3U\0\0\0\0\4\4\4\34\22\16\11\273\303s\36\377\323|\36" - "\377\322\202#\377#\32\16\322\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\2" - "\2\34\14\12\7\343\303s\36\377\323|\36\377\321{\36\377&\31\17\377\4\4\3U\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\252\302s\37\377\321z\34\377" - "\304c\25\377\25\17\10\377\0\0\0\0\0\0\0\0\0\0\0\0\13\11\6\252\231O\24\377" - "\273[\24\377\265`\24\377\36\24\11\262\0\0\0\0\0\0\0\0\15\12\6`\227O\24\377" - "\273[\24\377\265`\24\377\26\20\11\377\0\0\0\0\0\0\0\0\0\0\0\0\14\11\7\252" - "\222L\23\377\247X\22\377\236M\21\377\27\17\6\252\0\0\0\0\0\0\0\0\12\10\5" - "U\205B\20\377\247X\22\377\250V\23\377\26\20\11\377\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\14\11\7\252\233P\24\377\271^\24\377\265`\24\377\26\20" - "\11\335\0\0\0\0\0\0\0\0\6\6\5*3\35\14\377\226Q\23\377\245W\22\377*\32\13" - "\377\5\5\4l\0\0\0\0\5\5\4\34\22\17\13\377\303r\34\377\317{\40\377\236^\37" - "\377\21\15\12\216\0\0\0\0\0\0\0\0\6\5\5""92\"\23\377\277o\40\377\320u\35" - "\377qI\36\377\12\12\11\343\6\6\5}\7\7\6\306*\35\21\377\273`\26\377\246W\27" - "\377*\33\17\377\10\6\5n\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\5\5\4\270\25\20\10\377j6\17\377\232N\21\377\227M\22\377\\" - "0\17\377\13\11\6w\0\0\0\0\0\0\0\0\12\10\5]\203E\22\377\275\\\24\377\310i" - "\25\377!\26\14\377\5\4\4""6\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6UL5\31\377\310" - "v\37\377\314r\33\377A+\26\377\6\6\5q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\4\3\3\21\16\13\11\343\303o\34\377\316s\33\377" - "\314i\31\377\30\21\13\377\0\0\0\0\0\0\0\0\0\0\0\0\5\5\4\34\15\12\6\343}B" - "\22\377\245T\22\377\241U\21\377\241U\21\377\233O\22\377\34\23\11\377\6\5" - "\3U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\11\10DV8\33" - "\377\314~!\377\322}!\377\36\25\15\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\252\303s\36\377\321{\36\377\317z\36" - "\377\33\23\14\377\3\3\2\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\6\4" - "\270\203A\20\377\241U\21\377\232N\21\377\17\13\6\371\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7\255" - "\246W\27\377\306h\25\377\304c\25\377#\27\14\377\3\3\2U\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\252\302s" - "\37\377\323|\36\377\317z\36\377\33\23\14\377\3\3\2\34\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\252\304q\37" - "\377\325\204$\377\323\177$\377\36\25\15\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\11\6\252\233P\24\377" - "\271^\24\377\264[\23\377\25\17\10\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7\270" - "\267d\32\377\320t\33\377\314r\33\377\32\22\13\377\4\4\4\34\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5\177w<\17\377\240U\23\377" - "[0\20\377\12\10\5\343\4\4\3\34\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4\241\203C\20" - "\377\237Q\22\377\237N\22\377\22\15\7\371\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\7\6\4\2529\"\16\377\260Z\25\377\303_\26\377\32\23\13\350\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\21\16\12c\263j\34\377\317z\36\377\264m!\377\31\24\14\377" - "\7\6\6\252\24\21\13\377\304r\33\377\320u\35\377\313|\36\377\254j#\3775$\24" - "\377\12\11\7l\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\11\10\6\252\237R\24\377\312g\27\377\316o\33\377\26\21" - "\13\377\0\0\0\0\0\0\0\0\12\11\7\213sJ\36\377\325\2050\377'\34\20\377\0\0" - "\0\0\0\0\0\0\11\10\4qC'\16\377\265\\\24\377\30\22\11\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\34\23\11\343\213O\32\377\316u\37\377\324{%\377\326~)\377\254j#\377" - "5\"\22\377zN\37\377\323\177,\377\331\2102\377\330\2071\377\276z)\377A+\26" - "\377\16\13\7U\0\0\0\0\0\0\0\0\7\6\4\34\35\25\12\371\231O\24\377\256U\23\377" - "g5\20\377\21\14\6\364\23\15\6\252\25\16\6\252\33\21\6\252\25\16\6\324\25" - "\16\6\377\31\21\6\340\14\11\5-\0\0\0\0\0\0\0\0\0\0\0\0\30\20\7\231\26\17" - "\7\377\32\20\7\322\14\11\5(\0\0\0\0\0\0\0\0\10\7\5\34\21\15\10\343r=\23\377" - "\256U\23\377\232O\23\377\12\11\5\210\14\12\7\252\16\13\7\252" - "\15\12\6\252\13\11\6\306\37\25\12\377\231R\22\377\261U\22\377\251N\22\377" - "\26\17\7\314\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5""9\13\12\6\216\23\21" - "\14\252\27\25\20\252\31\26\20\252\27\25\20\252\25\23\16\252\17\16\12\252" - "\12\12\11q\7\6\6\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\12\7\2317\40\16\377" - "\257]\24\377\271^\24\377\267Y\23\377P,\21\377\15\13\10\273\7\6\6\31\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5>\13\12\6\216\20\16\13\252\27\23\16\252" - "\31\26\20\252\27\25\20\252\23\21\14\252\17\16\12\252\21\17\12\252\23\21\14" - "\216\11\10\10\34\0\0\0\0\0\0\0\0\14\12\11\252\314\2111\377\334\222;\377\332" - "\2225\377\215[&\377\23\21\14\343\23\21\14\252\30\24\17\252\25\23\16\252\17" - "\16\12\252\12\12\11q\7\6\6\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\12\7""9" - "\16\14\7f\16\13\7U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\14\12\7""9\15\13\10i\17\15\10U\0\0\0\0\0\0\0\0\0\0\0\0\14\13\11" - "\252\314\210/\377\334\222;\377\332\231;\377\30\23\15\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\10\7\5R\13\12\6\234\13\11\6\252\12\11\7[\0\0\0\0\0\0\0\0\0\0\0\0" - "\12\10\5\177\220N\23\377\264W\23\377\256Q\23\377\30\17\7\322\0\0\0\0\0\0" - "\0\0\0\0\0\0\16\13\7D\14\12\7\252\14\12\7\252\21\17\12\252\30\24\17\252\23" - "\21\14\252\17\16\12\252\22\17\13\252\30\25\17\252\25\23\16\252\17\16\12\252" - "\13\12\10q\7\7\6\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12w\21\17\14\252" - "\17\15\12\252\20\16\13\252\23\21\14\252\25\22\14\252\22\17\13\252\17\15\10" - "\252\13\11\6\252\12\10\7X\6\5\5\27\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\12\11\7U\16\14\11\252\23\21\14\252\25\23\16\252\25\23\16\252\25\23\16" - "\252\23\21\14\252\17\16\12\252\13\12\10t\7\7\6\34\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\17\16\12w\22\17\13\252\17\16\12\252\22\17\13\252\25\23\16\252\31" - "\26\20\252\27\25\20\252\25\23\16\252\20\16\13\252\13\12\10q\7\7\6\34\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7U\16\14\11\252\23\21\14\252\24" - "\22\15\252\24\22\15\252\27\23\16\252\23\21\14\252\17\16\12\252\21\16\12\252" - "\23\21\14\216\12\11\7\34\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12q\22\17\13\252\17" - "\16\12\252\22\17\13\252\25\23\16\252\31\26\20\252\27\25\20\252\24\22\15\252" - "\20\16\13\252\13\12\10q\7\7\6\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\7\7\6R\13\12\6\216\20\15\11\252\23\21\14\252\25\23\16\252\30\25\17\252\31" - "\26\20\252\31\26\20\252\17\15\12\252\14\13\11""9\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\17\15\12\252aA\"\377\321\204*\377\326\210+\377\326\177+\377\237" - "g*\377\25\23\16\343\13\12\10\34\0\0\0\0\0\0\0\0\0\0\0\0\20\16\13q\25\23\16" - "\252\22\17\13\231\13\12\10\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\16\12}\25" - "\23\16\252\23\21\14\216\12\11\7\34\0\0\0\0\0\0\0\0\0\0\0\0\17\16\12q\25\23" - "\16\252\22\20\13\231\13\12\10\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12" - "}\25\23\16\252\23\21\14\216\12\11\7\34\0\0\0\0\0\0\0\0\0\0\0\0\17\16\12q" - "\25\23\16\252\22\20\13\231\13\12\10\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\17\16\12}\25\23\16\252\23\21\14\216\11\11\10\34\0\0\0\0\0" - "\0\0\0\0\0\0\0\21\16\12\202\33\30\20\252\25\23\16\216\12\11\7\34\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\20\16\13q\34\30\21\252\30\25\17\241\14\13\11\34" - "\0\0\0\0\0\0\0\0\0\0\0\0\20\16\13q\25\23\16\252\22\17\13\231\13\12\10\34" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12}\25\23\16\252\23\21\14\216\11\10" - "\6\34\0\0\0\0\0\0\0\0\0\0\0\0\22\17\13\210\23\20\12\252\20\15\11\252\20\16" - "\11\252\17\15\10\252\15\13\10\252\14\13\11\252\15\14\10\252\17\16\12\252" - "\16\15\13\252\13\13\12q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10" - "\252\276b\27\377\314t\37\377J4\33\377\11\10\10q\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\15\13\10\252\300j\35\377\320p\33\377\320u\35\377\33\25\14\377\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\5\4\34\33\27\20\377\307y,\377\326\213)\377" - "\37\27\16\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\34\40\30\15\343$\32" - "\17\377\23\20\14\306\10\10\7""3\0\0\0\0\10\10\7""9\35\25\14\3320\40\21\377" - "-\36\20\377\24\20\13\332\12\11\7i\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\14\11\252\314\2023\377" - "\340\231M\377\341\251X\377!\33\22\377\0\0\0\0\0\0\0\0\0\0\0\0\25\23\16\327" - "\331\243V\377=.\34\377\0\0\0\0\0\0\0\0\0\0\0\0\23\20\14\311\313y(\3773&\26" - "\377\0\0\0\0\0\0\0\0\0\0\0\0\4\4\3\31\20\16\13\343\324\223G\377\340\240M" - "\377\337\241P\377\37\31\20\377\4\4\4f\12\12\11\327\316\2057\377\337\234F" - "\377\340\244U\3773'\30\377\5\5\4R\0\0\0\0\0\0\0\0\0\0\0\0\17\14\10n\262b" - "\33\377\323s\36\377\323y\"\377$\32\17\377\3\3\2U\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\10\10\5\34\33\24\12\350}I\26\377\276a\25\377\264" - "\\\25\377a8\24\377\16\13\7\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\12\7\216" - "\245Y\26\377\306h\25\377T2\23\377\7\6\4\237\0\0\0\0\5\5\4R\40\27\13\377y" - "E\26\377a8\24\377\17\15\10\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\16\14\7\306\254\\\25\377\34\23\11\317\0\0\0\0\0\0" - "\0\0\13\12\6U\224N\25\377\306h\25\377\300a\25\377\25\17\10\377\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\5\252\247Z\26\377\312]\25\377" - "\312g\27\377\25\20\12\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\4\3\3\205" - "\24\20\11\377\227P\26\377K*\20\377\12\10\7\377\40\26\13\377\244V\27\377<" - "'\21\377\5\5\4\374\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\14\13\11\306\325\233P\377\340\246S\377\323y\"\377\24\20" - "\11\377\3\3\2\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\6\6\5""3\33\24\12\377\240T\27\377\306h\25\377C(\20\377\10" - "\7\5}\0\0\0\0\0\0\0\0\0\0\0\0\14\12\11\252\303p\36\377\327}&\377\331\205" - "2\3771#\26\377\5\5\4\205\15\14\12\322\275w2\377\323\177,\377\324y)\377\332" - "\2075\377\334\224?\377\"\33\21\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\4\4\4\21\15\14\12\343\304q\37\377\324v#\377\326{+\377!\32\20\377\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\13\11\273\320\2067\377\337\222F\377" - "\335\230F\377\"\32\21\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5\244\245V\26\377\312b\25\377\306`" - "\25\377\26\20\11\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\10\5U\40" - "\26\13\377\247W\26\377\240T\27\377]6\24\377xA\25\377\274`\25\377\304c\25" - "\377\310i\25\377\30\23\13\317\0\0\0\0\0\0\0\0\17\16\12n\320\230G\377\343" - "\256b\377\344\263g\377\341\260b\377\331\251^\377\325\246\\\377\327\247\\" - "\377\325\233P\377\314\2107\377\212Y%\377\31\26\20\343\11\11\10\34\0\0\0\0" - "\0\0\0\0\13\12\10\252\313\2012\377\337\225F\377\336\236K\377\37\31\20\377" - "\4\4\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\10\7""91(\32" - "\377\316\230S\377\340\251[\377\302\214G\377\37\33\24\377\11\10\10\34\0\0" - "\0\0\0\0\0\0\14\12\11\241\304n!\377\332\2023\377\336\236K\377\37\31\20\377" - "\4\4\4\34\0\0\0\0\0\0\0\0\13\12\10\306\325\240T\377\344\264i\377\343\257" - "d\377!\34\22\317\0\0\0\0\0\0\0\0\14\13\11\202\322\233M\377\344\251c\377\342" - "\254_\377\36\31\21\377\4\4\4\34\0\0\0\0\0\0\0\0\13\12\10\306\314\2011\377" - "\326\177+\377\325}(\377\27\23\14\350\0\0\0\0\0\0\0\0\16\15\11}\320\230G\377" - "\337\237L\377\332\231;\377!\32\20\322\0\0\0\0\0\0\0\0\15\14\12\177\306v'" - "\377\327\177*\377\325~*\377)\37\22\343\0\0\0\0\0\0\0\0\0\0\0\0\6\6\5\34\31" - "\25\20\343\314\226O\377\337\253b\377\257z<\377\22\17\13\332\5\4\4\21\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\24\22\15U\261e\"\377\314{%\377\307u" - "$\377\307u$\377\312z%\377\307u$\377\306r\37\377\306n\37\377\312v#\377.!\25" - "\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\231nN%\377\325" - "\242R\377\332\244W\377C3\36\377\11\10\10U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\5\5\34\25\23\16\377\331" - "\246\\\377\343\257d\377\340\251[\377\37\31\20\327\0\0\0\0\0\0\0\0\14\12\7" - "U\232P\25\377\305c\24\377\300a\25\377\34\24\11\377\4\3\3n\13\11\6\252u?\24" - "\377\270^\25\377\306h\25\377\313h\30\377\322z%\377\25\21\14\374\0\0\0\0\0" - "\0\0\0\12\11\7\241\313\2012\377\340\240M\377\341\251X\377\36\31\21\377\4" - "\4\4\34\0\0\0\0\0\0\0\0\10\7\5\276\245V\26\377\306h\25\377\304c\25\377\34" - "\23\11\252\0\0\0\0\0\0\0\0\15\13\10U\260[\27\377\320p\33\377\322y#\377\33" - "\26\16\377\4\4\4\34\0\0\0\0\0\0\0\0\13\12\10\306\323\225L\377\340\250W\377" - "\340\242Q\377\40\32\21\322\0\0\0\0\0\0\0\0\14\12\7q\260[\27\377\312k\27\377" - "\312_\27\377\24\20\11\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12\252\325\240T\377\344\264i\377\343" - "\256b\377!\32\22\377\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12\252\325\233P\377\342" - "\254_\377\340\247U\377\27\24\16\364\0\0\0\0\0\0\0\0\13\12\10\177\275h\34" - "\377\326\177+\377\335\224F\377\37\31\20\377\4\4\4\34\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\14\11\252\303q\40\377\321u\34\377" - "\312g\27\377\24\17\11\374\3\3\3\16\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\17\16\12\252\325\233P\377\342\254_\377\335\230F\377\34" - "\30\17\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\16\14\11\252\320\215=\377\341\242X\377\343\256b\377!\32" - "\22\377\4\4\4\34\0\0\0\0\0\0\0\0\12\10\7\306\266b\27\377\312g\27\377\306" - "h\25\377\34\23\11\252\0\0\0\0\0\0\0\0\13\12\6U\232P\25\377\312b\25\377\312" - "g\27\377\31\24\14\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\12\7\252\272d\27\377\312c\27\377\310i\25" - "\377\36\25\11\252\0\0\0\0\0\0\0\0\14\11\7U\232P\25\377\306h\25\377\304c\25" - "\377\34\24\11\377\4\4\3q\13\12\6\343\267d\32\377\324\177+\377\247u4\377\21" - "\17\14\327\5\5\5\16\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12\252\323\225L\377\340" - "\246S\377\337\241P\377\"\32\21\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\252\247W\26\377\306\\\25\377\304c\25\377" - "\304_\25\377\306\\\25\377\303c\26\377\300j\35\377\316\177+\377\331\215<\377" - "\337\222F\377\340\245Q\377\334\224?\377\324|'\377\31\23\14\327\0\0\0\0\0" - "\0\0\0\14\13\11t\304t%\377\332\2153\377\332\2137\377\332\216=\377\327\217" - ":\377\30\23\15\324\0\0\0\0\12\11\7\234\313\2012\377\335\226B\377\334\224" - "?\377\31\25\16\343\0\0\0\0\0\0\0\0\12\12\7\237\314\206;\377\341\240T\377" - "\341\251X\377$\35\23\377\0\0\0\0\0\0\0\0\0\0\0\0\17\16\12\252\314\2023\377" - "\334\216;\377\332\2137\377\25\22\14\371\0\0\0\0\0\0\0\0\13\12\10\216\316" - "\221C\377\342\254_\377\343\256b\377\40\32\21\377\4\4\4\34\0\0\0\0\0\0\0\0" - "\13\12\10\306\306u%\377\327}&\377\323z$\377\34\25\15\327\0\0\0\0\0\0\0\0" - "\15\13\10`\256[\27\377\312k\27\377\312g\27\377\26\21\11\377\0\0\0\0\0\0\0" - "\0\0\0\0\0\13\12\6\252\260[\27\377\312g\27\377\313l\30\377\25\17\12\356\0" - "\0\0\0\0\0\0\0\13\12\10\216\316\221C\377\342\252[\377\340\240U\377\36\30" - "\21\377\4\4\4\34\0\0\0\0\0\0\0\0\13\12\10\306\321\225F\377\340\240M\377\336" - "\236K\377\37\31\20\324\0\0\0\0\0\0\0\0\14\13\11\177\306t#\377\327}&\377\323" - "z$\377\34\25\15\377\4\4\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\14\10\252" - "\303p\36\377\321n\36\377\317i\36\377\31\24\14\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\17\16\12\252\325\236P\377\342\254_\377\340\244U" - "\377!\33\22\377\0\0\0\0\0\0\0\0\0\0\0\0\17\16\12\252\322\217A\377\340\250" - "W\377\340\245Q\377\31\25\16\350\0\0\0\0\0\0\0\0\12\12\11\231\320\223C\377" - "\340\246S\377\336\236K\377\"\32\21\377\0\0\0\0\0\0\0\0\0\0\0\0\17\16\12\252" - "\323\225L\377\337\225F\377\333\222<\377\31\24\16\353\0\0\0\0\0\0\0\0\12\12" - "\11\226\314\206;\377\340\234S\377\340\245Q\377!\33\22\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\17\16\12\252\323\226F\377\342\252[\377\342\254_" - "\377!\32\22\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\11\10\226eJ&\377\306\221" - "M\377\316\235W\377\312\227O\377\305\215J\377\310\222K\377\264~9\377\25\23" - "\16\343\5\5\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5q+\34\16\377\273`" - "\26\377\265]\26\377b7\25\377D*\21\377M.\22\377\201H\26\377\256Y\25\377S/" - "\22\377\13\11\6\335\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\6\6\5\34\20\16\13\303lL#\377\322\215;\377\332\242Q\377\247v6\377\20\16" - "\13\335\5\5\5\16\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12\252\323\225L\377\340\250" - "W\377\337\232P\377\37\31\20\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6" - "\6\5""9\"\33\21\377\313z$\377\320|)\377mL\"\377\15\14\12\216\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\252\260[\27" - "\377\312]\25\377\304c\25\377\34\23\11\252\0\0\0\0\0\0\0\0\13\11\6U\204G\25" - "\377\303c\26\377g;\24\377\13\12\6\252\3\3\2\31\6\6\5n7#\20\377\306q\35\377" - "\324\2063\377)\40\24\322\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\25\23\16\327\331\243V\3771&\30\377\0\0\0\0\0\0\0\0\0\0\0" - "\0\13\12\10R6+\33\377\310\207;\377\322\211;\377\317\2032\377\315\177,\377" - "\307u$\377\303o\34\377\273e\30\377]6\26\377\23\17\12\343\7\6\6\34\0\0\0\0" - "\0\0\0\0\12\11\7\252\303m\40\377\332\2125\377\340\236Q\377\337\255_\377\333" - "\247^\377\331\251^\377\332\253a\377\331\246\\\377\320\210;\377nD\33\377\23" - "\17\12\343\6\6\5\34\0\0\0\0\0\0\0\0\0\0\0\0\14\13\7\252=*\24\377\274j!\377" - "\320\2067\377\327\243R\377\331\246\\\377\330\247X\377\330\247Y\377\323\226" - "F\377\222^'\377\32\25\17\345\11\10\6\34\0\0\0\0\0\0\0\0\0\0\0\0\14\12\7\252" - "3\40\16\377\227P\26\377\251[\26\377\255V\26\377\251X\26\377\255V\26\377\264" - "\\\25\377\302b\25\377\304_\25\377\300a\25\377\37\25\12\252\0\0\0\0\0\0\0" - "\0\0\0\0\0\14\12\7\2529%\22\377\275k\"\377\324\225C\377\331\246\\\377\331" - "\246\\\377\332\253a\377\327\243R\377\315~0\377tH\35\377\24\20\13\343\6\6" - "\5\34\0\0\0\0\0\0\0\0\13\11\6D~D\25\377\277b\26\377\302b\25\377\300a\25\377" - "\300a\25\377\277b\26\377\261[\26\377\32\23\11\216\0\0\0\0\0\0\0\0\0\0\0\0" - "\14\12\7\252:%\21\377\271k\36\377\320\2067\377\330\247X\377\332\253a\377" - "\331\246\\\377\325\224H\377\314\2023\377\321\215<\377\323\237L\377\36\31" - "\21\252\0\0\0\0\0\0\0\0\12\12\7\247\322\233M\377\344\262c\377\340\245Q\377" - "\335\245V\377\331\246\\\377\332\251]\377\331\246\\\377\326\234Q\377\316\207" - "3\377tH\35\377\24\20\13\343\6\6\5\34\0\0\0\0\0\0\0\0\15\12\6""9s>\24\377" - "\251[\26\377\245V\26\377\30\22\11\247\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\14\12\7Xu?\24\377\272d\27\377\277k\40\377#\33\20\220\0\0\0\0" - "\0\0\0\0\12\12\7\252\322\233M\377\344\262c\377\335\230F\377\30\23\15\377" - "\0\0\0\0\0\0\0\0\14\12\7\252:$\17\377\235O\26\377\227P\26\377:#\17\377\13" - "\11\6""9\0\0\0\0\0\0\0\0\14\12\7U\235Q\24\377\305c\24\377\300a\25\377\34" - "\24\11\252\0\0\0\0\0\0\0\0\13\11\6""9s>\24\377\275^\30\377\306u%\377\325" - "\235L\377\332\253a\377\331\251^\377\326\241U\377\325\235L\377\324\225C\377" - "\320\2067\377\315~0\377\217`(\377\34\32\23\345\10\10\7\34\0\0\0\0\0\0\0\0" - "\15\14\10U\215J\30\377\276^\27\377\267_\30\377\267_\30\377\273]\30\377\275" - "a\26\377\265]\26\377\261[\26\377\251X\26\377Y4\24\377\25\22\14\343\11\11" - "\10\34\0\0\0\0\0\0\0\0\0\0\0\0\22\21\15\265gJ(\377\317\222J\377\326\234Q" - "\377\322\220C\377\320\2127\377\317\2014\377\315\2050\377\315~0\377\227e*" - "\377\34\32\23\350\11\10\10\34\0\0\0\0\0\0\0\0\15\14\12n\272\177?\377\326" - "\234Q\377\325\236P\377\325\233P\377\326\234Q\377\326\231K\377\325\224H\377" - "\325\224H\377\323\226F\377\237o6\377\34\31\23\361\11\10\10\37\0\0\0\0\0\0" - "\0\0\0\0\0\0\22\21\15\265gJ(\377\320\234Q\377\326\234Q\377\320\2127\377\321" - "\211<\377\325\236P\377\325\233P\377\325\240T\377\327\240X\377\325\243T\377" - "\36\30\21\262\0\0\0\0\0\0\0\0\14\13\11]\262y5\377\325\236P\377\322\217A\377" - "\323\222>\377\325\224H\377\327\243R\377\325\236P\377\324\225C\377\321\215" - "<\377\231j1\377\34\31\23\353\11\11\10\37\0\0\0\0\0\0\0\0\0\0\0\0\22\17\13" - "\255B+\25\377\273e\40\377\317\2044\377\322\220C\377\325\224H\377\326\234" - "Q\377\330\247X\377\326\234Q\377\260\200A\377.'\33\377\0\0\0\0\0\0\0\0\0\0" - "\0\0\17\16\12U\265o*\377\327\2104\377\325}(\377\323z$\377\324{%\377\322{" - "'\377\312z%\377\37\30\16\252\0\0\0\0\0\0\0\0\14\13\11X\244Y\35\377\313z$" - "\377\307u$\377\36\27\17\324\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12\177\273\205" - ">\377\325\224H\377\320\2127\377\37\30\20\252\0\0\0\0\0\0\0\0\15\14\12U\254" - "h%\377\321\2066\377\316\2073\377\40\31\21\324\0\0\0\0\0\0\0\0\0\0\0\0\17" - "\15\12\177\265t.\377\323\217>\377\322\231G\377\35\30\20\262\0\0\0\0\0\0\0" - "\0\15\14\12[\262y5\377\325\232F\377\320\2067\377\37\31\20\322\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\16\12}\263n*\377\322\2077\377\320\213A\377" - "\32\25\17\270\0\0\0\0\0\0\0\0\16\15\11U\263u,\377\331\245R\377\325\243T\377" - "\33\27\20\335\0\0\0\0\0\0\0\0\0\0\0\0\16\14\11\210\256g'\377\316\177+\377" - "\307u$\377\37\30\16\252\0\0\0\0\0\0\0\0\14\13\11X\244Y\35\377\312v#\377\304" - "r!\377\35\26\16\322\0\0\0\0\0\0\0\0\0\0\0\0\16\14\11}\251_\36\377\312w%\377" - "\307w'\377\30\23\15\276\0\0\0\0\0\0\0\0\16\14\11U\252_\35\377\306q\35\377" - "\307t\"\377\314\200/\377\316\2073\377\314\2011\377\314\2011\377\320\2067" - "\377\323\225L\377\300\214I\377_J'\377\21\17\14U\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\16\14\11\306\323\226F\377\316\230Q\377\37\32\24\377\7\7\6""0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12\252\323\225L\377\342\252[\377\342\254" - "_\377#\34\22\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\16\14\332\253" - "x<\377\333\232F\377)\37\24\377\4\4\3\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\21\20\14\252\333\263t\377\350\301\211\377" - "\350\307\207\377(!\27\377\0\0\0\0\0\0\0\0\0\0\0\0\12\12\11L>2\37\377\24\22" - "\15\247\0\0\0\0\0\0\0\0\0\0\0\0\13\12\10L:.\35\377\24\22\15\247\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\15\14\12\252\322\226G\377\337\223H\377\335\226B\377" - "\32\25\17\322\0\0\0\0\13\12\10w\323\237T\377\345\270r\377\346\272{\377\36" - "\32\23\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\13\11]\211Z(\377\337\247^\377" - "\344\264o\377\247\205P\377\21\20\16\343\13\13\12\252\14\13\11\252\14\13\11" - "\252\14\13\11w\7\7\6""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\7\7\6>\25\22\14\343\235\\\34\377\313i\32\377\305j" - "\32\377R0\25\377\16\14\7\255\5\5\4\10\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10" - "\7\5\34\32\23\13\343gD\31\377\236`\35\3779)\26\377\15\14\12\361!\32\20\377" - "\222X\37\377B/\27\377\14\12\11\311\6\5\5\16\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5""9\36\26\13\377\17\14\10`\0\0\0" - "\0\0\0\0\0\12\12\7\202\276h\33\377\321v\36\377\323u\"\377\33\25\16\377\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\14\12\252\307z'\377\332" - "\2023\377\337\222F\377\36\30\21\377\0\0\0\0\0\0\0\0\0\0\0\0\27\26\22\213" - "\36\33\25\252\20\17\13\377Y;\32\377\313n\34\377\304q\37\377zQ!\377\272u+" - "\377\330\2013\377\270~9\377&\"\31\377\30\26\23\335!\36\30\252\17\17\14\34" - "\0\0\0\0\0\0\0\0\0\0\0\0\30\26\23\216\40\37\31\252\25\24\20\306ZG-\377\337" - "\263n\377\342\254_\377\335\226B\377\217d,\377\26\25\21\343\34\33\25\252\35" - "\34\26\252\15\15\14*\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\10\10\10\13\31\30\24\216'#\34\252\36\34\27\252\35\33" - "\26\252\35\33\26\252\35\33\26\252\35\33\26\252\35\33\24\252\27\25\20\252" - "\16\15\13\"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\14\12\237\216V\37\377\320t" - "#\377\311w&\377\40\32\21\377\5\5\4\34\0\0\0\0\0\0\0\0\0\0\0\0\16\15\13\252" - "\330\247a\377\347\270|\377\347\301\200\377\265\222\\\3774,!\377ZG-\377\311" - "\233X\377\337\255f\377\344\263s\377\346\267{\377\346\270w\377'\40\26\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\14\13\252\316\213=\377" - "\342\244[\377\344\256g\377'\40\26\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\6\5\34\11" - "\11\10\2168.\37\377\336\264q\377\346\273w\377\336\264q\377\27\25\20\377\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17" - "\16\14\244O;\36\377\321\200*\377\323\177,\377\253u.\377\22\17\13\252\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\11\10t!\34\20\377\241^\34\377\307k\32\377" - "A(\22\377\10\7\5\377\31\24\14\377\306q\35\377\322x!\377\331\2052\377\33\27" - "\20\377\0\0\0\0\0\0\0\0\7\7\6\27\"\34\23\306.$\31\377'\37\26\377)!\26\377" - ";.\34\3773(\32\377=/\34\377\264\205G\377\343\257d\377\342\257g\377\265\217" - "X\377\21\20\14\216\0\0\0\0\0\0\0\0\13\13\12\252\326\246a\377\345\263r\377" - "\344\271o\377\241yD\377\27\25\20\343\27\26\22\252\26\25\21\252\20\17\15\252" - "\13\13\10\223\10\10\7U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\15\13\252\265\217X\377\344\271{\377\332" - "\250a\377F6#\377\11\11\10q\0\0\0\0\0\0\0\0\0\0\0\0\13\12\10UxW-\377\337\267" - "x\377\347\276\204\377\247\207P\377\30\26\23\343\23\22\20\252\23\22\20\306" - "_P.\377\342\301\201\377\344\273\201\377\272\224W\377\17\16\14\252\0\0\0\0" - "\0\0\0\0\12\12\11U\233q@\377\345\304\204\377\350\277\205\377\263\216Z\377" - "\33\31\24\343\22\22\17\252\23\22\20\306ZG-\377\336\257e\377\343\256b\377" - "\344\271o\377\34\31\23\377\0\0\0\0\0\0\0\0\7\7\6\27\"\34\23\3061#\26\377" - "'\35\22\343\14\13\11U\0\0\0\0\0\0\0\0\10\7\7\34!\32\20\3064'\27\377/#\26" - "\343\15\14\10U\0\0\0\0\0\0\0\0\10\10\7\34!\36\30\343\311\235d\377\346\272" - "{\377\265\211J\377\20\17\13\317\6\6\5\27\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\13\12\10\34\33\25\14\301\32\23\13\377\27\22\12\377\27\22" - "\12\377\30\22\13\377\30\22\13\377\32\24\13\377#\33\20\377*\37\23\361\21\16" - "\12U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\11\10\220" - "[C$\377\331\232H\377\323\226F\377E7\"\377\17\16\14U\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\6\5\13\13\13\12\216\30\26\23\377\247" - "\207P\377\341\254h\377\340\246S\377\301~6\377\20\16\13\252\0\0\0\0\0\0\0" - "\0\15\14\10U\271a\32\377\317p\34\377\314n\33\377G.\26\377\10\10\7\377\34" - "\26\15\377\306k\33\377\301o\36\377~N\37\377\307\213>\377\342\270o\377\33" - "\30\22\377\0\0\0\0\0\0\0\0\13\12\10\252\326\246a\377\346\273w\377\344\263" - "g\377\217f0\377\21\20\14\343\14\14\11\252\15\14\12\306.!\21\377\307p\34\377" - "\316o\33\377\314n\33\377\40\27\15\260\0\0\0\0\0\0\0\0\14\13\11\210\314\206" - ";\377\342\254_\377\344\265k\377\242}I\377\30\26\23\343\23\22\20\252\23\22" - "\20\306_P.\377\340\263m\377\337\255_\377\255u2\377\17\15\12\234\0\0\0\0\0" - "\0\0\0\14\13\7c\271a\32\377\320p\33\377\314n\33\377\26\22\13\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\20\17\15\252\333\263t\377\350\302\205\377\347\301\200\377(!\27\377\0\0\0" - "\0\0\0\0\0\0\0\0\0\20\17\15\252\333\261p\377\346\273w\377\340\237S\377\30" - "\25\17\377\0\0\0\0\0\0\0\0\13\12\10\244\323\236R\377\345\270r\377\346\277" - "{\377\246\177M\377\26\25\21\343\26\25\21\252\24\23\15\252\16\15\13\34\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\13\11\252\303p\36\377\321j\36\377\316o\33" - "\377e?\32\377\20\16\13\343\27\25\20\252\35\33\26\252\15\15\14*\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\20\17\15\252\330\247a\377\340\236W\377\330}-\377\30" - "\24\15\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\21\20\14\252\333\261p\377\350\303\211\377\347\275\200" - "\377\242}I\377\26\25\21\343\16\16\13\252\15\14\12\3062#\23\377\307p\34\377" - "\316o\33\377\314n\33\377\40\30\15\252\0\0\0\0\0\0\0\0\15\14\10]\302m!\377" - "\333\2136\377\340\236Q\377'\40\26\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\12\10\252\276h\33\377\320" - "p\33\377\314n\33\377\40\30\15\252\0\0\0\0\0\0\0\0\15\14\10U\270`\31\377\317" - "p\34\377\314f\33\377\201N\34\377\37\32\20\377\177T\"\377\333\223F\377\255" - "z>\377\17\16\14\324\6\6\5\31\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\17\15\252" - "\325\233P\377\335\220D\377\331\2024\377\37\31\20\377\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\252\275c\32\377\320" - "p\33\377\314n\33\377\233W\32\377H.\25\377\263g$\377\337\234L\377\330\252" - "a\377\206`/\377\256\177G\377\335\247Z\377\337\223H\377\336\236K\377\27\23" - "\16\374\0\0\0\0\0\0\0\0\13\12\10\252\326\246a\377\347\273|\377\346\277{\377" - "\344\266u\377\336\257e\377@2!\377\7\7\6\345\32\27\23\377\334\257i\377\344" - "\267q\377\344\274u\377\31\25\20\377\0\0\0\0\0\0\0\0\13\12\10\252\331\260" - "p\377\350\305\211\377\350\307\207\377%\37\26\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\15\14\12\252\306u%\377\327\177*\377\331\2024\377\25\23\16\377\0\0\0\0\0" - "\0\0\0\13\12\10\247\327\254h\377\350\277\205\377\347\276\204\377\246\177" - "M\377\27\25\20\343\22\21\17\252\21\20\14\306J4\33\377\314u!\377\323o\36\377" - "\255]\34\377\17\14\10\244\0\0\0\0\0\0\0\0\15\14\10X\271a\32\377\320p\33\377" - "\314n\33\377\23\20\12\377\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\252\276h\33\377" - "\324v#\377\330\2103\377\25\23\16\374\0\0\0\0\0\0\0\0\13\12\10\247\327\254" - "h\377\350\302\177\377\347\301\200\377\246\201M\377\27\25\20\343\23\22\20" - "\252\23\22\16\306Q;\"\377\325\220>\377\327\214<\377\245l(\377\15\14\12\247" - "\0\0\0\0\0\0\0\0\10\10\7Ue?\32\377\316r!\377\324y!\377\233\\$\377\27\25\20" - "\343\26\25\21\252\34\32\25\252\25\24\22\252\15\15\14\244\12\12\11U\6\6\6" - "\6\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\13\11\252\302" - "p\37\377\324w%\377\330\206-\377#\34\22\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\20\17\15\252\331\253j\377\347\273|\377\344\265k\377'\40" - "\26\377\0\0\0\0\0\0\0\0\0\0\0\0\20\17\13\252\320\2067\377\337\234F\377\335" - "\224F\377\27\24\16\356\0\0\0\0\0\0\0\0\13\12\10\252\314\2107\377\337\234" - "F\377\336\236K\377\"\34\23\377\0\0\0\0\0\0\0\0\0\0\0\0\16\15\13\252\331\253" - "j\377\350\275\177\377\346\272{\377\31\26\20\377\0\0\0\0\0\0\0\0\12\12\11" - "\247\322\233M\377\342\254_\377\340\245Q\377\37\32\22\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\17\15\14\252\331\255h\377\350\277\205\377\347\303" - "\204\377(!\27\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\11\205I:" - "$\377\341\270x\377\347\301\200\377\344\264o\377\223f0\377\17\15\12\343\10" - "\7\7\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\13\7\306d;\27" - "\377\251]\32\377\234[\33\377\256`\33\377\264c\33\377\250a\33\377i>\30\377" - "\22\17\11\377\7\6\6""0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7" - "\7\7\34\17\17\14\343\220rC\377\333\261p\377\337\260f\377\231q>\377\21\20" - "\14\343\7\7\6\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\17\15\252\325\233P\377" - "\337\222F\377\331\2012\377\33\26\16\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\14\12\11\303\241^\34\377\317r\40\377\301r$\377\27\24\20\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\13\11" - "\252\277i\34\377\317d\34\377\314n\33\377\32\24\13\314\0\0\0\0\0\0\0\0\6\5" - "\5\3\32\23\11\306\30\22\11\366\17\14\10\216\0\0\0\0\0\0\0\0\0\0\0\0\17\15" - "\12[\37\30\20\3643'\30\377\25\23\16[\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\12\11L=1\36\377\24\22\15\234\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\21\17\14\216\33\26\16\350\36\26\15\377\31\24\14\377" - "\26\22\13\356\25\20\12\377c:\26\377\313q\32\377\315o\34\377\203P\36\377\14" - "\13\11\216\0\0\0\0\0\0\0\0\13\12\10\252\324\240U\377\350\277\177\377\347" - "\303\204\377\304\233[\377Q;\"\377)\40\24\3776+\33\377\264\205G\377\330\220" - ";\377\320s!\377\201N\34\377\14\13\7\216\0\0\0\0\0\0\0\0\10\7\7""9H4\35\377" - "\327\233N\377\343\256b\377\317\236^\377U?\"\377$\35\23\3779+\32\377\275\202" - "B\377\333\225B\377\324y)\377\254i!\377\21\17\12\223\0\0\0\0\0\0\0\0\7\6\6" - """6:(\25\377\306q\35\377\316g\33\377\245W\30\377*\34\15\377\25\20\10\377" - "\33\24\12\377_<\26\377\312i\33\377\316d\35\377\314n\33\377#\30\14\252\0\0" - "\0\0\0\0\0\0\7\7\6""6F2\33\377\324\221A\377\343\256b\377\311\233X\377;,\34" - "\377\27\24\16\377\"\34\23\377\235h0\377\323~*\377\320s!\377\204R\35\377\15" - "\13\10\216\0\0\0\0\0\0\0\0\0\0\0\0\30\22\11\335l=\27\377\311p\32\377\317" - "p\34\377\314n\33\377\236[\31\377.\35\15\371\13\12\6""9\0\0\0\0\0\0\0\0\10" - "\10\7""9F2\33\377\324\216;\377\342\254_\377\317\236^\377U?\"\377)\40\24\377" - "9+\32\377\256|;\377\340\252]\377\345\270r\377\347\304\200\377\34\31\23\377" - "\0\0\0\0\0\0\0\0\12\12\11\247\327\251f\377\350\277\177\377\347\301\200\377" - "\304\232W\377M;\"\377)\37\24\3776+\33\377\250q1\377\324y)\377\316r!\377\204" - "R\35\377\14\13\11\202\0\0\0\0\0\0\0\0\14\13\7n\274b\31\377\316o\33\377\316" - "j\31\377\32\23\13\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16" - "\14\11\252\307u$\377\335\224>\377\343\256b\377\34\32\23\377\0\0\0\0\0\0\0" - "\0\12\12\11\247\324\241Y\377\340\246S\377\331\2012\377\40\30\17\377\5\5\4" - "\37\7\7\6\210A,\26\377\300j\35\377\313l\30\377rB\27\377\21\15\10\335\0\0" - "\0\0\0\0\0\0\0\0\0\0\12\11\7\213\271a\32\377\320p\33\377\320u\35\377\40\30" - "\15\252\0\0\0\0\0\0\0\0\17\15\10[\275c\32\377\327{*\377\342\254_\377\306" - "\230W\377Q:\"\377\260\205G\377\340\250_\377\305\212>\377A/\32\377\205Q\36" - "\377\320y%\377\324s%\377\230b#\377\14\13\11\216\0\0\0\0\0\0\0\0\12\11\7\223" - "\276k\31\377\316o\33\377\316j\31\377\236[\31\377*\34\15\377\25\17\10\377" - "\32\23\11\377rB\27\377\314q\31\377\320s!\377\255z>\377\20\17\15\226\0\0\0" - "\0\0\0\0\0\10\10\7GnW3\377\336\264q\377\340\246S\377\321\211<\377\205T\40" - "\377M2\30\377Y;\32\377\265m\40\377\322y#\377\324y)\377\253t4\377\17\16\14" - "\216\0\0\0\0\0\0\0\0\16\15\13\252\333\261p\377\347\273|\377\344\264o\377" - "\315\236Z\377O:\40\377&\35\23\3771#\26\377\247r.\377\331\222>\377\333\232" - "F\377\251u8\377\17\15\14\234\0\0\0\0\0\0\0\0\10\10\7GhP-\377\340\267w\377" - "\350\277\177\377\322\246a\377Q<\40\377'\36\22\3774(\31\377\257\200B\377\341" - "\255b\377\344\264i\377\342\257_\377\35\31\22\377\0\0\0\0\0\0\0\0\14\14\13" - "\252\320\2127\377\336\221?\377\334\213;\377\301y2\377D2\35\377&\34\23\377" - "0#\27\377\257p,\377\331\2166\377\331\220B\377\277\211B\377\23\20\14\252\0" - "\0\0\0\0\0\0\0\11\10\10JoR(\377\330\233K\377\342\254_\377\310\227Q\3779)" - "\32\377\33\27\20\377#\34\22\377)\40\24\377'\36\24\377\31\26\20\343\17\16" - "\12\216\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\34!\30\16\343\207Q\34\377\316u\37" - "\377\322l!\377\320n\37\377\253\\\34\3771!\20\374\15\13\10D\0\0\0\0\0\0\0" - "\0\13\12\10\252\303l\36\377\324v#\377\331\2114\377*!\27\377\0\0\0\0\0\0\0" - "\0\0\0\0\0\24\22\17\252\326\234Q\377\335\224>\377\326\177+\377\27\23\14\356" - "\0\0\0\0\0\0\0\0\12\12\7\237\304m\37\377\325w$\377\324{%\377\37\30\16\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\17\16\12\252\321\211<\377\344\254c\377\346\275w" - "\377\34\32\23\377\0\0\0\0\0\0\0\0\14\14\13\252\320\2067\377\332\2113\377" - "\326\177+\377#\33\20\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\16\13" - "\252\307t\"\377\331\2040\377\340\246S\377\40\32\23\377\0\0\0\0\0\0\0\0\12" - "\12\7\"Q:\"\377\340\262i\377\342\254_\377\201\\(\377\11\11\10\252\6\6\6U" - "\6\6\5q#\33\20\377\314u!\377\320u\35\377nE\31\377\16\14\7l\0\0\0\0\0\0\0" - "\0\12\12\7\252\303p\36\377\323s\36\377\323s\36\377\36\27\15\377\0\0\0\0\0" - "\0\0\0\0\0\0\0\16\14\11\252\304q\37\377\323x\40\377\326~)\377!\32\22\377" - "\0\0\0\0\0\0\0\0\11\10\6\34,!\23\324<*\27\377.#\25\377J5\37\377\234m5\377" - "\330\247a\377\344\263m\377\345\261n\377\343\270l\377\250{E\377\27\25\20\343" - "\11\10\10\34\0\0\0\0\0\0\0\0\0\0\0\0\21\20\16\252\206b3\377\337\246\\\377" - "\204d5\377\11\11\10\205\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\17\15" - "\252\333\261p\377\350\277\205\377\347\303\204\377(!\27\377\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\6\6\5-'\40\26\377\322\2011\377\254j#\377\24\21" - "\15\343\13\13\10\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\21\21\16\252\335\275\204\377\353\315\232\377\352\315\233\377*'\35\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\11\10\31\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\11\10\10\31\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\16\13" - "\252\320\215=\377\340\250W\377\344\256g\377\37\32\24\335\0\0\0\0\15\14\14" - "\202\332\271\177\377\352\312\223\377\350\306\213\377(!\31\377\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\21\21\16\260\214sG\377\346\312\223\377\350\312" - "\225\377\332\252e\377\310|+\377\306u%\377\306u%\377\304t%\377H4\33\377\14" - "\13\11\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\10" - "\7U%\37\24\377\256n)\377\322{'\377\314x%\377\202W\37\377\17\15\12\276\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\5\4q\34\32\23\377" - "\322\217A\377\334\243Q\377\331\246\\\377\336\255a\377\341\260b\377*%\31\377" - "\4\4\4J\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\14\12\252\320\215=\377" - "\342\254_\377\344\267o\377(\"\31\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\21\20\16\252\333\261p\377\350\302\205\377\351\312\224\377\33" - "\30\24\377\0\0\0\0\0\0\0\0\20\17\15U\307\241f\377\334\246Y\377\323\217>\377" - "\331\232H\377\337\241P\377\340\251[\377\341\271r\377\345\274|\377\347\276" - "\204\377\347\310\217\377\343\303\214\377\343\304\212\377\341\303\210\377" - ",%\33\252\0\0\0\0\0\0\0\0\21\20\16U\310\245m\377\343\306\216\377\341\277" - "\204\377\343\303\206\377\347\307\210\377\347\305\204\377\347\302|\377\345" - "\277\202\377\341\303\210\377\341\303\210\377\341\277\204\3771*\36\306\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\22\21" - "\15i\301\207B\377\335\257f\377\336\272{\377\337\276\204\377\340\300\207\377" - "\337\276\204\377\336\272{\377\335\262n\377\332\254i\377.'\33\303\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\6\6\6\34\33\32\24\377\330\252a\377\341\262h\377\260\210" - "S\377\20\17\15\306\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\21\21\16\252\335\274\202" - "\377\353\315\232\377\352\315\233\377\350\314\225\377\344\307\217\377\253" - "\220`\377@9)\377\232~Q\377\343\275z\377\346\270w\377\343\253b\377\"\36\25" - "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\21\20\16\252\335\272" - "~\377\352\312\223\377\350\300\207\377,'\33\377\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\11\10\216" - "\31\30\24\377r_5\377\317\251f\377\343\273v\377\342\274{\377\262\224_\377" - "\23\22\20\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\30\26\23U\305\221T\377\343\273v\377\347\302|\377\317\255r\377=7&\377" - "\10\10\10\210\0\0\0\0\0\0\0\0\0\0\0\0\12\12\11l-$\25\377\303t&\377\317z&" - "\377\213Z\40\377\15\14\10\252\0\0\0\0\12\12\11\306\320\214;\377\342\252[" - "\377\347\301\200\377(#\33\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\4\4\3\34\22\21\15\343\336\275\203\377\352\311" - "\217\377\345\277\202\377\"\36\27\314\0\0\0\0\0\0\0\0\13\13\12\252\323\236" - "R\377\342\252[\377\340\245Q\377\333\232F\377\320\2043\377\316\200-\377\314" - "z)\377\311x(\377\304t%\377oJ\36\377\24\22\15\343\10\10\7\34\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\6\6\34\34\32\25\377\336\272" - "{\377\345\304\204\377\265\220\\\377\20\17\15\324\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\6\6\6U\31\30\24\377\264\225e\377\347\315\232\377\350\314\225\377" - "\343\306\216\377\337\300\212\377\337\301\210\377\346\307\213\377\350\305" - "\215\377\323\260z\377@9)\377\10\10\7q\0\0\0\0\0\0\0\0\6\6\5\16!\37\30\343" - "\272\233k\377\350\314\225\377\351\315\230\377\343\305\214\377\335\275\204" - "\377\340\300\207\377\344\306\215\377\350\311\215\377\350\300\207\377\347" - "\305\204\377)#\32\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\21\20\16\213\323\262x\377\351\312\224\377\351\312\224\37780!\377\4\4" - "\4U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\13" - "\12\377\330\244Y\377\346\277{\377\343\303\206\377(#\33\343\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\17\15\343~iE\377\331\260p\377" - "\341\257h\377\337\237L\377\275|1\377+#\24\377\11\10\10""9\0\0\0\0\0\0\0\0" - "\12\12\11\205\302m!\377\327}&\377\324|'\377\220]!\377\35\30\20\377D5\35\377" - "\272{1\377\200_/\377\31\30\24\377\217wN\377\346\311\221\377!\36\30\377\0" - "\0\0\0\0\0\0\0\13\13\12\252\331\260p\377\344\266m\377\336\236K\377\324\206" - "3\377\314z)\377\306u%\377\310v%\377\320{'\377\324{%\377\326y'\377\331\205" - "2\377\30\25\17\364\0\0\0\0\0\0\0\0\13\13\12\252\332\271\177\377\353\313\224" - "\377\351\312\224\377\346\311\221\377\343\305\214\377\335\273\200\377\335" - "\270x\377\340\262i\377\340\244U\377\275\201:\377'\40\24\377\7\7\6U\0\0\0" - "\0\0\0\0\0\13\12\10}\302m!\377\327}&\377\325}(\377\35\30\20\377\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\21" - "\21\16\252\335\274\202\377\353\311\230\377\350\311\215\377*$\33\377\0\0\0" - "\0\0\0\0\0\0\0\0\0\21\21\16\252\333\263t\377\347\273|\377\344\267o\377\30" - "\26\21\377\0\0\0\0\0\0\0\0\13\13\12\252\332\271\177\377\350\305\211\377\343" - "\263h\377\333\233H\377\320\2043\377\314z)\377\312x'\377&\37\23\252\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\14\13\11\252\304n!\377\327q&\377\325z*\377\327" - "\217:\377\331\246\\\377\336\272{\377\341\303\210\3774,!\306\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\21\20\16\252\323\226F\377\333\2148\377\325~*\377\31\25" - "\16\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\21\21\16\252\335\273\200\377\350\307\215\377\344\264o\377" - "\333\233H\377\317\200,\377\307w'\377\310v%\377\320{'\377\324{%\377\326}'" - "\377\324|'\377\"\32\17\265\0\0\0\0\0\0\0\0\13\12\12\241\327\254h\377\352" - "\311\217\377\352\316\227\377*'\35\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\13\11\252\304n!\377\327}" - "&\377\324|'\377$\34\21\252\0\0\0\0\0\0\0\0\17\16\12U\302m!\377\327}&\377" - "\324|'\377\322\200)\377\323\2076\377\341\260b\377\347\305\204\37780!\377" - "\4\4\4U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\21\20\16\252\316\2073\377" - "\331\2052\377\325z*\377\31\25\16\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\13\11\252\304n!\377\327}&\377\325z*\377C" - "3\34\377\6\6\5\377(\"\31\377\342\276\177\377\212nE\377\7\7\7\377\31\30\24" - "\377\335\263p\377\350\277\177\377\350\311\215\377\32\27\23\377\0\0\0\0\0" - "\0\0\0\13\13\12\252\326\250e\377\346\273w\377\344\274u\377\324\255i\377\226" - "vC\377fV/\377oZ2\377\271\221X\377\343\273v\377\347\303\204\377\350\311\215" - "\377\32\27\23\377\0\0\0\0\0\0\0\0\13\13\12\252\333\270\200\377\353\315\232" - "\377\352\316\227\377*$\33\377\0\0\0\0\0\0\0\0\0\0\0\0\17\17\14\252\325\236" - "P\377\344\266m\377\346\277{\377\33\27\22\377\0\0\0\0\0\0\0\0\13\13\12\252" - "\333\275\204\377\353\315\232\377\350\305\215\377\341\271r\377\327\233N\377" - "\316\2073\377\315~*\377\321\200*\377\324y)\377\265o$\377'\36\22\377\10\10" - "\7""9\0\0\0\0\0\0\0\0\12\12\11\210\302m!\377\327}&\377\324|'\377\30\24\15" - "\377\0\0\0\0\0\0\0\0\0\0\0\0\17\16\14\252\322\222G\377\345\267n\377\347\305" - "\204\377\32\27\23\377\0\0\0\0\0\0\0\0\13\13\12\252\332\275\177\377\352\307" - "\217\377\347\305\204\377\341\260j\377\326\231K\377\320\2127\377\315\2050" - "\377\322\177-\377\326\2061\377\263w*\377%\36\22\377\7\7\6U\0\0\0\0\0\0\0" - "\0\0\0\0\0\27\24\16\343\241s2\377\336\247Y\377\343\272r\377\341\276\202\377" - "\337\306\210\377\343\306\216\377\340\304\215\377\335\277\206\377\241\202" - "V\377!\36\30\345\12\12\11*\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\17\17\14\252\323\225L\377\344\266m\377\347\275\200\377,'\33\377\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\21\21\16\252\330\252a\377\342" - "\254_\377\340\245Q\377\37\32\22\377\0\0\0\0\0\0\0\0\0\0\0\0\15\14\12\252" - "\311x(\377\331\2052\377\330}-\377\31\25\16\324\0\0\0\0\0\0\0\0\13\12\10\220" - "\313\2024\377\340\246S\377\344\256g\377(\"\31\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\21\20\16\252\335\273\200\377\352\311\217\377\346\277{\377\34\31\23\364\0" - "\0\0\0\0\0\0\0\12\12\11\244\313z2\377\334\224?\377\331\2154\377\27\24\16" - "\377\0\0\0\0\0\0\0\0\16\15\13l\12\12\11\34\0\0\0\0\15\15\14\252\335\275\206" - "\377\353\315\232\377\352\316\227\377*%\33\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\13\13\12\377\336\275\203\377\350\303\203\377\340\242" - "Q\377$\35\23\377\4\4\4""6\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\7\7\6\34\23\21\14\350]B\36\377\267p$\377\321z&\377\324x'\377\237" - "f\"\377\26\23\15\377\7\7\6U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\6\6\5\34\21\20\16\343\225zT\377\343\303\214\377\343\277\206\377\263\216" - "Z\377\21\20\16\343\5\5\4\31\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\16" - "\14\252\314\2011\377\332\2153\377\325~*\377\31\25\16\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\7[D0\31\377\315\177,\377\334\231K\377" - "cN,\377\10\10\7q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\14\13\11\252\304n!\377\327}&\377\324|'\377\30\24\15\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\11\11\10\31\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\2\2\1\27\11\10\6\377\307t\"\377\327" - "}&\377\324\200-\377\33\30\20\317\0\0\0\0\0\0\0\0\13\13\12\252\333\270\200" - "\377\353\315\232\377\352\315\233\377:1#\377\5\5\4U\0\0\0\0\4\4\3\34\20\17" - "\13\343\314z)\377\327~(\377\322{'\377\40\31\17\252\0\0\0\0\0\0\0\0\15\15" - "\14z\320\250c\377\352\307\217\377\352\314\227\377?6&\377\5\5\4U\0\0\0\0\4" - "\4\3\34\22\21\15\327\314\177-\377\326}'\377\324y)\377\"\33\17\252\0\0\0\0" - "\0\0\0\0\15\14\12U\271p\"\377\327}&\377\324{%\377#\34\20\377\4\4\3U\0\0\0" - "\0\3\3\2\34\14\12\11\340\306u%\377\327}&\377\324|'\377\"\33\17\262\0\0\0" - "\0\0\0\0\0\16\15\13q\316\242^\377\350\307\215\377\352\317\233\377?5$\377" - "\4\4\3q\0\0\0\0\3\3\3\34\12\12\11\377\310v%\377\327}&\377\322{'\377\33\26" - "\16\343\0\0\0\0\0\0\0\0\0\0\0\0\3\3\2\6\15\13\10\335\307t\"\377\327}&\377" - "\324|'\377#\33\20\377\5\4\4""9\0\0\0\0\0\0\0\0\0\0\0\0\17\16\14\223\316\232" - "W\377\350\303\211\377\352\314\227\377?6&\377\5\5\4U\0\0\0\0\4\4\3\34\22\20" - "\15\343\336\275\203\377\353\315\230\377\352\315\233\377\33\30\24\377\0\0" - "\0\0\0\0\0\0\13\13\12\252\333\270\202\377\353\315\230\377\352\315\233\377" - ":1#\377\5\5\4U\0\0\0\0\4\4\3\34\16\14\11\343\307u$\377\327q&\377\322{'\377" - "\40\31\17\252\0\0\0\0\0\0\0\0\14\14\11f\302m!\377\327}&\377\324|'\377\33" - "\26\16\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\22\20\15\252\331" - "\260n\377\352\304\217\377\352\314\227\377\33\30\24\377\0\0\0\0\0\0\0\0\13" - "\12\12\252\314\206;\377\333\2106\377\325z*\377H2\33\377\10\10\7\377\31\26" - "\16\377\303t&\377\320{'\377\216[\37\377\20\16\11\301\4\4\3\21\0\0\0\0\0\0" - "\0\0\0\0\0\0\13\13\10\252\306u%\377\333\2058\377\335\230F\377\33\27\20\335" - "\0\0\0\0\0\0\0\0\15\14\12c\301q\"\377\337\234F\377\347\301\200\377(\"\31" - "\377\4\3\3q\21\20\14\343\320\210;\377-$\25\377\4\3\3q\12\11\7\317\304n!\377" - "\327}&\377\322\200)\377\40\31\17\252\0\0\0\0\0\0\0\0\14\13\11l\302m!\377" - "\327}&\377\324|'\377#\33\20\377\4\4\3U\0\0\0\0\3\3\2\34\14\13\11\343\307" - "u$\377\335\226B\377\345\277~\377\40\35\27\322\0\0\0\0\0\0\0\0\15\15\14z\314" - "\226O\377\337\237L\377\331\2154\377T9\35\377\11\10\6\252\5\5\4U\6\6\5q\33" - "\26\16\377\317\200,\377\337\223H\377\343\273v\377\"\36\27\317\0\0\0\0\0\0" - "\0\0\14\13\13\252\332\264w\377\345\270r\377\340\247U\3772(\31\377\5\5\4U" - "\0\0\0\0\4\4\3\34\16\14\11\343\313}*\377\331\2000\377\325\200-\377#\33\20" - "\255\0\0\0\0\0\0\0\0\14\14\13\202\321\243b\377\353\313\224\377\351\312\224" - "\377?6$\377\5\5\4U\0\0\0\0\4\4\3\34\17\17\14\343\321\211<\377\335\227D\377" - "\333\223>\377\27\24\16\356\0\0\0\0\0\0\0\0\12\12\11\226\304y)\377\331\200" - "0\377\327\205,\377(\37\23\377\5\5\5U\0\0\0\0\4\4\3\34\20\16\13\317\311x(" - "\377\331\2052\377\335\241L\3779,\34\252\0\0\0\0\0\0\0\0\17\16\14i\323\245" - "b\377\350\305\211\377\350\307\215\377:1#\377\4\4\3q\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\3\2\21\14\13" - "\11\343\307t\"\377\327}&\377\324|'\377#\33\20\377\4\4\3>\0\0\0\0\0\0\0\0" - "\0\0\0\0\14\13\11\252\310x)\377\337\237L\377\346\277{\377,%\33\377\0\0\0" - "\0\0\0\0\0\0\0\0\0\22\21\17\252\320\214;\377\331\2052\377\325}(\377\33\27" - "\16\303\0\0\0\0\0\0\0\0\14\13\11l\302m!\377\327}&\377\324|'\377\31\25\16" - "\377\0\0\0\0\0\0\0\0\0\0\0\0\21\20\16\252\333\263t\377\353\311\230\377\352" - "\314\227\377\33\30\24\377\0\0\0\0\0\0\0\0\12\12\11\252\306z)\377\327\177" - "*\377\325}(\377\33\26\16\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\13" - "\11\252\311x(\377\340\234S\377\347\276\204\377(!\31\377\0\0\0\0\0\0\0\0\0" - "\0\0\0\12\12\11U4*\35\377\310\216;\377\267w,\377H4\33\377'\36\22\3771%\26" - "\377\226c!\377\304t%\377M2\30\377\12\11\7\220\0\0\0\0\0\0\0\0\0\0\0\0\12" - "\12\11\252\304s#\377\327}&\377\324|'\377\31\25\16\377\0\0\0\0\0\0\0\0\0\0" - "\0\0\14\13\11\252\304n!\377\326\177+\377\336\236K\377)\"\30\377\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\5\4U\13\13\12\377\202e;\377\337" - "\260f\377\340\260e\377\261\211J\377\22\21\15\343\6\5\5\34\0\0\0\0\0\0\0\0" - "\0\0\0\0\24\23\17U\272x1\377\331\216>\377\331\2138\377\"\35\23\377\4\4\3" - "\21\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\21\21\16\252\335\274\202\377" - "\353\315\230\377\352\315\233\377*'\35\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\15\15\12\265\307w'\377\324y)\377\313y(\377#\35\21\252\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\24\22\17\252\336\272" - "{\377\352\311\217\377\350\305\207\377/(\34\377\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\15\13\252\325\240T\377\346\273w\377\347" - "\305\204\377#\36\26\306\0\0\0\0\16\15\13l\331\260p\377\350\301\211\377\347" - "\305\204\377!\34\26\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14" - "\14\13q\37\35\26\322(#\33\377)\"\30\377\35\30\20\377\40\32\21\377\222\\#" - "\377\326\2061\377\324\200-\377{Q$\377\17\15\12\216\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\7\7\6U\34\32\23\374\302\214G\377\324\177+\377\312v#\377" - "aB\36\377\17\16\12\317\6\6\5\31\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\6\6\5\10\17\15\14\343oV2\377\321\250f\377\260\210S\377UC,\377\243" - "\201P\377\335\272~\377SE,\377\7\7\6\252\5\5\5\10\0\0\0\0\11\11\10l\24\22" - "\15\252\15\14\12""3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\20\17\15\252\331\260n\377\350\302\205\377\350\306\213" - "\377$!\31\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\17\14\252" - "\333\263t\377\350\301\211\377\350\307\207\377\37\32\24\377\0\0\0\0\0\0\0" - "\0\13\13\12\34""80!\343bL-\377hP-\377\303\232`\377\343\272r\377\342\275}" - "\377\317\255r\377\336\274{\377\347\276\204\377\331\274|\377\211mF\377cV6" - "\377N@+\377\25\24\20U\0\0\0\0\0\0\0\0\14\14\13\34""60#\343VH/\377J?+\377" - "\253\211T\377\345\277\202\377\346\277{\377\346\272{\377\312\244i\377aP2\377" - "K@,\377H='\377\26\25\21f\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\14\13\13-7-\36\343ZG-\377N?)\377H='\377J?+\377H" - "='\377H='\377[J.\377N?)\377\26\24\21f\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\14\13\260" - "\204j=\377\344\274}\377\322\254q\377*%\35\377\11\11\10>\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\21\20\16\252\335\272|\377\352\307\217\377\350\311\215\377" - "\350\311\215\377\335\275\206\3774.!\377\6\7\6\343\30\27\21\377\320\2043\377" - "\327\205,\377\324|'\377\30\24\15\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\21\20\14\252\333\261p\377\347\273|\377\344\266m\377(!\27\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\11\11\10J\21\17\14\343C3\34\377\242k+\377\310\216C\377\314\235[\377\261" - "\214V\377J?+\377\23\21\20\306\11\11\10\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\16\13\37""8.\37\343\300\235g\377\345" - "\302\200\377\341\274|\377\222pC\377\13\12\10\244\0\0\0\0\0\0\0\0\7\7\6\34" - "\"\33\21\377\276k!\377\322y#\377\222_#\377\20\16\13\273\0\0\0\0\0\0\0\0\11" - "\11\10\252\326\244]\377\350\302\177\377\347\303\204\377(\"\31\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\15\15\12\252\325\235T\377\340\246S\377\335\226B\377\27\24\16\366\0\0\0\0" - "\0\0\0\0\14\13\11q\302m!\377\324w%\377\322q#\377\250g!\3778*\27\377\33\27" - "\16\377&\37\23\377\225\\\36\377\317v\40\377\317q\36\377|K\33\377\15\13\10" - "\241\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\14\13\260" - "\202c;\377\345\277~\377\323\256t\377+%\34\377\11\11\10;\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\10\10\7UD:%\377\326\261w\377\347\304\210\377\317\253r\377" - "aP2\3776/#\377B;)\377\262\224_\377\344\275y\377\340\273{\377\222pC\377\14" - "\14\13\252\0\0\0\0\0\0\0\0\0\0\0\0\12\12\11\34\20\17\15\223\35\34\26\335" - "0*\37\377F=)\377B9'\377F=)\377\253\214\\\377\340\252e\377\340\250W\377\340" - "\245Q\377'\40\26\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\16\15\13""9dR3\377\336\272{\377\342\254_\377qR&\377\11\10\10\177\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\11\6f\13" - "\12\6\252\13\12\10\252\14\13\11\252\17\15\12\252\17\15\12\252\17\16\12\252" - "\22\17\13\252\22\17\13\234\14\13\11\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\6\6\5A(\"\31\377\340\267w\377\345\303\210\377\253" - "\214\\\377\25\24\22\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13" - "\12\10f\203\\.\377\325\2218\377\326w+\377\322\200)\377\227^\40\377\27\25" - "\16\377\12\12\11U\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\252\277j\36\377\323s\36" - "\377\320r\37\377\215W\36\377$\37\23\377yZ*\377\331\250\\\377\315\243f\377" - "\204f;\377\325\254l\377\347\301\200\377#\36\26\377\0\0\0\0\0\0\0\0\13\13" - "\12\244\313\2012\377\327\177*\377\323u\"\377\246a\35\3776(\25\377\35\27\16" - "\377&\37\23\377xN\35\377\316v!\377\326\177+\377\340\233Q\377\27\25\20\377" - "\0\0\0\0\0\0\0\0\13\12\12\252\331\267t\377\352\311\217\377\350\306\213\377" - "\312\246m\377aN2\3774.!\377:2!\377\226`'\377\320y%\377\303p\36\377S5\30\377" - "\11\10\6q\0\0\0\0\0\0\0\0\15\14\10`\275h\34\377\322x!\377\326\204-\377\"" - "\35\23\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\21\20\14\252\331\254f\377\344\264i\377\344\265k\377(!" - "\27\377\0\0\0\0\0\0\0\0\0\0\0\0\21\17\14\252\330\253e\377\350\277\177\377" - "\347\305\204\377\30\26\21\377\0\0\0\0\0\0\0\0\13\13\12\247\321\222H\377\335" - "\227D\377\325~*\377\254j#\3779)\26\377*\40\23\377+!\24\374\22\17\13U\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\12\10\252\301o\36\377\327q&\377\334\220?" - "\377\305\221T\377[G,\377K>*\377K@,\377\26\25\21c\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\16\15\13\252\304n!\377\322s\37\377\322s\37\377\26\23\13\343\0\0" - "\0\0\0\0\0\0\20\15\11q\30\25\17\252\21\17\14\252\22\17\15\252\23\21\14\216" - "\11\10\10\34\0\0\0\0\0\0\0\0\16\15\13\252\322\222G\377\334\216;\377\325}" - "(\377\250g!\3776(\25\377\35\27\16\377&\37\23\377wN\36\377\314t\37\377\322" - "w\37\377\322s\37\377\32\24\15\322\0\0\0\0\0\0\0\0\13\13\12\252\331\263x\377" - "\352\312\223\377\350\311\215\377(#\31\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\12\10\252\301o\36\377" - "\323s\36\377\322s\37\377$\31\15\252\0\0\0\0\0\0\0\0\16\14\11U\276i\35\377" - "\322k\37\377\320r\37\377\273|*\377\217o8\377\322\253m\377\345\273\200\377" - "\203c6\377\10\10\7\234\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\14\12\252" - "\302p\37\377\322k\37\377\322s\37\377\26\23\13\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\12\10\252\301o\36\377\327}&\377" - "\332\215;\377'!\26\377\5\5\5\34\14\14\13\252\234~S\377\33\30\24\343\5\5\5" - "\27\16\15\13\306\333\261p\377\350\277\177\377\346\277{\377\31\26\20\371\0" - "\0\0\0\0\0\0\0\13\12\10\231\310x)\377\326\177+\377\325~*\377]B\40\377\13" - "\13\12\377\"\37\27\377\316\230Q\377\342\263o\377\347\275\200\377\350\300" - "\207\377\350\311\215\377\31\26\22\377\0\0\0\0\0\0\0\0\13\12\12\252\327\253" - "f\377\344\256i\377\336\236K\377\33\30\20\377\0\0\0\0\0\0\0\0\0\0\0\0\17\17" - "\14\252\333\261p\377\350\301\211\377\350\311\215\377\31\26\22\377\0\0\0\0" - "\0\0\0\0\13\12\12\252\327\254h\377\344\266m\377\335\233F\377\261r.\3777*" - "\30\377#\34\22\377)\37\22\377#\34\21\377\33\26\16\377\21\20\14\273\11\11" - "\10O\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\252\277j\36\377\323s\36\377\322s\37" - "\377!\31\16\377\0\0\0\0\0\0\0\0\0\0\0\0\25\24\20\252\335\264t\377\350\301" - "\211\377\350\311\215\377\31\26\22\377\0\0\0\0\0\0\0\0\13\13\12\252\324\240" - "U\377\340\234S\377\332\215;\377\257s,\3777*\30\377\37\31\20\377&\36\23\377" - "\177R\36\377\314t\37\377\303p\36\377R7\31\377\13\12\10\226\0\0\0\0\0\0\0" - "\0\0\0\0\0\11\11\10\34\17\16\14\216\34\31\23\335.(\35\377G<&\377B9'\377F" - "=)\377\301\237j\377\343\270l\377\335\231H\377\233b$\377\15\14\12\252\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\21\17\14\252\333\264p\377\350" - "\305\211\377\350\311\215\377(#\31\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\16\15\13\252\306u%\377\325|&\377\322y#\377\27\23\14\377\0\0" - "\0\0\0\0\0\0\0\0\0\0\13\12\10\252\301o\36\377\323s\36\377\320r\37\377\27" - "\23\14\317\0\0\0\0\0\0\0\0\16\15\13U\265\204D\377\344\271u\377\347\301\200" - "\3776.\37\377\5\5\4\10\0\0\0\0\0\0\0\0\25\24\20\262\327\240X\377\337\223" - "H\377\316\2073\377\27\24\16\252\0\0\0\0\0\0\0\0\14\13\11f\300o\37\377\322" - "l!\377\320r\37\377\26\22\13\377\0\0\0\0\12\12\11qO=&\377\21\20\14\306\0\0" - "\0\0\20\17\15\252\333\263t\377\347\273|\377\340\251[\377!\34\24\377\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\10\10U'!\30\377\331\246\\\377\333\214" - "8\377\322y#\377B,\25\377\7\7\6\205\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\6\6\5J\23\22\14\377\267f\36\377\317i\36\377\322" - "o\37\377I3\30\377\10\10\7t\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\6\6\6\34\17\15\14\343\220p=\377\335\264t\377\340\262q\377\230tA\377\22" - "\21\15\335\10\10\7\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14" - "\12\11\252\301o\36\377\322k\37\377\322s\37\377\26\23\13\377\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\17\15\343\244z?\377\341\271" - "r\377\300\231a\377\25\23\20\350\7\7\6\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\13\12\10\252\301o\36\377\323s\36\377\322s\37\377\27\23\14" - "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\6\6\5""3\13\11\6U\14\12\7f\12\10\5\234\12\10\5\177\10\7\5\270" - "\33\26\14\377\306i\35\377\323z$\377\334\210=\377\31\26\20\377\0\0\0\0\0\0" - "\0\0\12\12\11\252\332\265{\377\352\312\223\377\350\305\215\377\36\33\25\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6\252\277j\36\377\323s\36\377\322o\37\377" - "'\33\16\252\0\0\0\0\0\0\0\0\14\13\13\252\332\264w\377\352\304\217\377\350" - "\311\215\377\35\32\24\377\0\0\0\0\0\0\0\0\0\0\0\0\7\7\6\34\33\26\16\234\31" - "\26\16\377\40\31\17\322\26\22\13\34\0\0\0\0\0\0\0\0\12\11\7\226\303p\36\377" - "\323s\36\377\322s\37\377\23\17\12\374\0\0\0\0\0\0\0\0\0\0\0\0\11\11\10\252" - "\277j\36\377\323o\36\377\320r\37\377\31\24\14\314\0\0\0\0\0\0\0\0\14\13\13" - "\252\332\264w\377\352\312\223\377\350\311\215\377\216o?\377\16\14\11\343" - "\12\11\7\177\10\7\5\265#\31\16\377\307p\34\377\321v\36\377\321u\34\377\36" - "\26\15\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6\247\277j\36\377\323s\36" - "\377\322s\37\377\23\17\12\374\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\25\23\20\252" - "\334\262q\377\350\305\211\377\350\311\215\377\32\27\23\377\0\0\0\0\0\0\0" - "\0\0\0\0\0\13\13\12\252\332\265{\377\352\311\217\377\347\305\204\377\30\26" - "\21\377\0\0\0\0\0\0\0\0\13\12\12\252\332\265{\377\352\311\217\377\347\305" - "\204\377\36\32\25\377\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6\247\277j\36\377\323" - "s\36\377\322o\37\377'\33\16\252\0\0\0\0\0\0\0\0\15\14\10U\276i\35\377\325" - "w$\377\326\204-\377\40\32\21\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\21\20\16\252\335\272|\377\352\312\223\377\350\307\207\377\31\26" - "\22\374\0\0\0\0\0\0\0\0\13\12\10\177\300o\37\377\322k\37\377\320r\37\377" - "\241^\34\377A+\24\377\221U\32\377\317u\36\377zK\35\377\17\16\12\252\5\5\4" - "\10\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\12\10\252\304s#\377\337\222F\377\344" - "\267o\377\31\26\20\374\0\0\0\0\0\0\0\0\16\14\11U\276i\35\377\327}&\377\332" - "\215;\377\36\30\21\303\0\0\0\0\12\12\7\252\301o\36\377\24\21\13\374\0\0\0" - "\0\13\12\10U\274g\33\377\323s\36\377\321j\36\377'\33\16\252\0\0\0\0\0\0\0" - "\0\15\14\10U\276i\35\377\323s\36\377\322s\37\377\23\17\12\377\0\0\0\0\0\0" - "\0\0\0\0\0\0\11\10\6\247\300o\37\377\332\2113\377\343\257d\377\33\30\22\377" - "\0\0\0\0\0\0\0\0\13\12\10\223\304j!\377\322l!\377\322s\37\377\36\27\15\377" - "\4\4\3\16\0\0\0\0\0\0\0\0\17\16\14\303\323\225L\377\345\270r\377\350\307" - "\207\377\34\31\23\377\0\0\0\0\0\0\0\0\13\12\10\247\313\2012\377\327\177*" - "\377\322y#\377\24\21\13\350\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6\213\276i\35\377" - "\323o\36\377\321r\36\377\36\26\15\306\0\0\0\0\0\0\0\0\15\14\12\252\331\255" - "h\377\350\301\211\377\350\302\213\377\31\26\22\377\0\0\0\0\0\0\0\0\0\0\0" - "\0\11\10\10\234\300o\37\377\322l!\377\322s\37\377\40\30\15\255\0\0\0\0\0" - "\0\0\0\15\14\10X\276i\35\377\323s\36\377\320r\37\377\23\17\12\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\7\7\6\34\33\26\16\306-$\25\3774+\35\364\16\15\13U\0\0\0" - "\0\0\0\0\0\15\15\14X\261\217Z\377\346\302\203\377\342\254_\377\211[$\377" - "\12\11\7\343\10\10\5\241\12\11\7\247\12\11\7\210\15\12\6U\7\6\6J\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6\247\277j\36\377\323s\36" - "\377\322s\37\377\23\17\12\374\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\13\11\252" - "\320\215=\377\346\273w\377\350\311\215\377(\"\31\377\0\0\0\0\0\0\0\0\0\0" - "\0\0\16\14\11\252\304m\37\377\322k\37\377\322s\37\377$\31\15\252\0\0\0\0" - "\0\0\0\0\12\11\7U\233[\34\377\320r\37\377\321j\36\377\36\26\15\377\0\0\0" - "\0\0\0\0\0\0\0\0\0\26\25\21\260\336\272{\377\352\307\217\377\342\303\207" - "\377#\35\26\262\0\0\0\0\0\0\0\0\14\13\11i\276i\35\377\323s\36\377\320r\37" - "\377\27\23\14\322\0\0\0\0\0\0\0\0\17\14\10;\7\6\4\3\0\0\0\0\11\11\10\237" - "\314\206;\377\346\266w\377\350\306\213\377'!\30\377\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\12\12\11\"\17\16\12\3064(\25\377\245`\34\377\306q\35\377\271f" - "\34\377P5\31\377\23\21\14\343\12\11\7L\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13" - "\12\10\252\303p\36\377\323s\36\377\322s\37\377\24\20\13\377\0\0\0\0\0\0\0" - "\0\0\0\0\0\12\11\7\252\300o\37\377\327}&\377\340\237S\377)!\30\377\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\7\6l\30\24\15\377\222X\37\377" - "\303\177&\377qM\"\377\17\16\14\322\7\7\6\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\14\14\13\34%\36\22\343\250c\37\377\316r!\3773\"\22\377\6\5\5G\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\21\20\16\252\335\272|\377\352\312\223\377" - "\350\311\215\377(#\31\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\21\17\12\343\306i\35\377\302m!\377>,\27\377\20\16\13U\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\23\21\14\216\326\253a\377\344\267" - "q\377\343\272l\3772(\31\343\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\14\13\11\306\326\236U\377\345\267n\377\344\265k\377\25\23\16\371" - "\2\2\1\24\10\10\7\265\322\234O\377\342\251_\377\340\233Q\377!\32\22\377\4" - "\4\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\3\3\2\34\13\12\10\377\321\212>\377\337\232H\377\335\244R\377" - "\33\27\20\371\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\7\6O.&\31\377\305\227T\377" - "\336\241Y\377\321\200*\377\215[\40\377\17\15\12\332\5\5\5\13\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12\213\277\203<\377\334" - "\250]\377\250{E\377\16\15\13\343\5\5\5U\11\11\10\252iN(\377\242t=\377XB%" - "\377\27\25\20\377\13\13\12\377N:#\377\320\226K\377=.\34\265\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12\252\330" - "\252a\377\346\273w\377\344\262q\377\"\34\23\377\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\17\15\12\252\327\247\\\377\345\263r\377\344\265k\377" - "\40\33\23\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\6\6\31\5\5\4\3064*\33\377" - "\334\251a\377\275\216L\377#\37\26\377\206`3\377\341\260j\377\214j5\377\6" - "\6\5\377\6\6\6""3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\5\5\5\34\17\15\12\343\320\210;\377\332\2125\377\325z*\377+\37\22\377\5\5" - "\4U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\10\10""99/" - "\36\377\324\243]\377\340\235U\377|Z-\377\12\12\11\223\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\17\15\12\252\330\252a\377\344\265k\377\340\245Q\377" - "\302\210=\377:.\35\377\14\14\13U\0\0\0\0\12\11\7\234\256[\27\377\312g\27" - "\377\312f\25\377\24\20\11\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\17\15\12\252\325\233P\377\343\257d\377\343\253b\377#\35\24\377\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\7\6U1!\22\377" - "\267l\"\377\321\200*\377\321\211<\377\272\206C\377_J'\377\26\24\17\345\10" - "\10\7i\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\5\4\4\34\21\17\14\343\330\247Y\377\344\265k\377\337" - "\260f\377\"\34\23\270\0\0\0\0\0\0\0\0\14\13\11l\264j!\377\326}'\377\331\215" - "4\377*!\25\377\4\4\4U\0\0\0\0\0\0\0\0\13\12\10\306\323\225L\377\340\240M" - "\377\334\220?\377\"\33\21\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\12\7\252\275c\32\377\316f\31\377" - "\313d\30\377\36\25\13\260\0\0\0\0\0\0\0\0\14\12\7U\247W\26\377\312g\27\377" - "\312f\25\377\33\24\12\377\4\4\3D\0\0\0\0\4\4\4\34\14\12\7\327\260[\27\377" - "\313h\30\377\312i\33\377\34\25\15\371\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\11\10\10""99/\36\377\325\247^\377\344\270s\377~\\/\377\11\11" - "\10\223\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\14\12\247\307\203:\377" - "\334\224?\377\333\223>\3771&\30\377\6\6\6U\0\0\0\0\5\5\5\34\17\16\14\343" - "\331\251^\377\344\267o\377\341\256f\377\37\31\22\361\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\5\5\34\17\15\12\343" - "\314\177-\377\333\2058\377\335\226B\377#\34\22\377\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\11U-\"\25\377\311n\36\377" - "\300d\31\3779#\20\377\14\12\7U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\15\13\6O~D\25\377\277d\32\377\306u%\377\320\213A\377\325\233P\377" - "\326\241U\377\327\247\\\377\330\247Y\377\327\240X\3771&\30\252\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\7\6L-$\30\371\317\244Z\377\344\267" - "o\377\217o8\377\15\14\12\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\15\14\10\216\266c\31\377\313l\30\377\312f\25\377pA\27\377\17" - "\15\10\343\6\6\5-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7\252\253Y\26\377" - "\312_\27\377\312g\27\377g@\32\377\24\22\15\377O=$\377\336\255a\377\343\263" - "h\377\340\254a\377\342\253c\377\340\260]\377$\35\23\317\0\0\0\0\0\0\0\0\14" - "\12\7q\260[\27\377\312_\27\377\312f\25\377\33\24\12\377\4\4\3J\0\0\0\0\4" - "\4\4\34\13\11\6\327\273e\30\377\330\206-\377\342\254_\377\27\25\20\361\0" - "\0\0\0\0\0\0\0\12\12\11\241\324\240U\377\342\254_\377\336\236K\3773'\30\377" - "\6\6\6U\0\0\0\0\4\4\3\34\13\12\6\327\260[\27\377\312f\25\377\277f\26\377" - "\26\21\11\252\0\0\0\0\0\0\0\0\14\12\7U\247W\26\377\314i\31\377\331\2052\377" - "#\34\22\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\17\15\12\252\307t\"\377\324r#\377\332\2137\377!\33\22" - "\377\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12\252\325\240T\377\343\257d\377\340\245" - "Q\377\31\25\16\353\0\0\0\0\0\0\0\0\15\13\10l\270`\31\377\313`\30\377\312" - "_\27\377\33\24\12\377\4\4\3G\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\12\11\7\252\273e\30\377\330\206-\377\340\247U\3776*\33\377\6" - "\6\6U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\252" - "\253Y\26\377\312g\27\377\312f\25\377\35\25\12\252\0\0\0\0\13\11\6*\211M\30" - "\377\323\2108\377\327\247\\\377\330\246_\377\325\243T\377!\34\22\241\0\0" - "\0\0\0\0\0\0\13\12\10\202\270d\31\377\313d\30\377\312f\25\377\33\24\12\377" - "\4\4\3J\0\0\0\0\4\4\4\34\13\11\6\327\260[\27\377\312g\27\377\312_\27\377" - "\34\25\13\276\0\0\0\0\0\0\0\0\12\12\11\241\324\241Y\377\344\256i\377\337" - "\241P\377!\34\22\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\247\253Y\26\377\312g\27\377\312f\25" - "\377\35\25\12\252\0\0\0\0\0\0\0\0\14\12\7U\247W\26\377\312g\27\377\313l\30" - "\377D/\31\377\6\6\5\377\37\32\24\377\334\250]\377\334\261e\377nP)\377\14" - "\13\11\226\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\252\253Y\26\377\312g\27" - "\377\312f\25\377\24\20\11\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\12\11\7\252\301o\36\377\333\2106\377\340\245Q\377\33" - "\30\20\377\0\0\0\0\7\7\7\34\25\24\20\265\12\12\11U\0\0\0\0\14\13\11\252\314" - "\2023\377\332\2153\377\323z$\377\40\27\15\273\0\0\0\0\0\0\0\0\15\13\10U\247" - "W\26\377\313d\30\377\320i\35\377\27\23\14\377\4\4\3\34\13\12\10\265\323\236" - "R\377\345\267n\377\344\267o\377\344\267q\377\344\265k\377\33\27\20\345\0" - "\0\0\0\0\0\0\0\12\12\11\226\300o\37\377\320p\33\377\313l\30\377\25\21\12" - "\377\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12\252\330\252a\377\345\267n\377\344\265" - "k\377\31\25\20\353\0\0\0\0\0\0\0\0\13\12\10\216\302t!\377\321j\36\377\313" - "l\30\377\33\24\12\377\4\4\3J\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7\252\253Y\26\377\312g\27\377\312f\25" - "\377*\34\15\377\6\5\5""0\0\0\0\0\6\6\6\34\25\23\16\377\335\257f\377\345\263" - "r\377\344\265k\377\30\24\17\366\0\0\0\0\0\0\0\0\14\13\11\177\276h\33\377" - "\316j\31\377\312g\27\377\33\24\12\377\4\4\3J\0\0\0\0\4\4\4\34\13\12\6\327" - "\260[\27\377\314i\31\377\317z&\377\34\26\17\356\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\5\5\34\17\15\12\343\303" - "o\34\377\314i\31\377\305d\26\377\26\21\11\340\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\17\15\12\252\330\252a\377\345\270r\377\344\265k\377" - "\"\34\23\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\252" - "\256[\27\377\312g\27\377\312f\25\377\24\20\11\374\0\0\0\0\0\0\0\0\0\0\0\0" - "\12\11\7\252\253Y\26\377\312k\27\377\316o\33\377\26\21\13\374\0\0\0\0\0\0" - "\0\0\10\7\7-I;$\377\332\256i\377\344\262k\377YC$\377\7\7\6q\0\0\0\0\5\5\4" - "\34\24\22\15\377\307n\36\377\312i\33\377X6\27\377\12\11\7q\0\0\0\0\0\0\0" - "\0\15\13\6U\247W\26\377\312_\27\377\312Z\27\377\40\30\15\377\4\4\3\262\23" - "\20\14\356\324\243]\377B4\37\377\5\5\5\270\16\15\13\377\315\2050\377\324" - "r#\377\320u\35\377\35\26\16\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\13\11" - "UeJ&\377\275y1\377\271h\40\377\264b\31\377\264]\27\377\232R\27\377K,\22\377" - "\13\11\6\220\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\12\11\7\252\235O\26\377\312f\25\377\312f\25\377\26\21\11\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\15\13\340\210b5\377\331" - "\245R\377\325\2218\377\226\\#\377\23\20\14\255\5\5\5\10\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7\252\253Y\26\377\312g\27\377" - "\312f\25\377\24\20\11\374\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\7\7\6;+#\30\377\335\257f\377\337\262j\377\206b3\377\16\15\13\216" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\247\253Y\26\377" - "\312g\27\377\312f\25\377\24\20\11\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\12\7\252.\35\15\377\214J\25\377\245" - "V\26\377\247W\26\377\245V\26\377\247W\26\377\271_\26\377\306a\27\377\316" - "o\33\377\335\222B\377\27\23\16\371\0\0\0\0\0\0\0\0\12\12\11\231\324\241Y" - "\377\345\267n\377\340\245Q\377\34\27\17\377\0\0\0\0\0\0\0\0\0\0\0\0\12\10" - "\7\234\253Y\26\377\312g\27\377\312f\25\377\37\25\12\252\0\0\0\0\0\0\0\0\12" - "\12\11\247\324\240U\377\344\261i\377\336\236K\377\33\27\20\377\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12" - "\10\7\252\247W\26\377\312g\27\377\312f\25\377\24\20\11\356\0\0\0\0\0\0\0" - "\0\0\0\0\0\12\10\7\244\253Y\26\377\312g\27\377\313d\30\377\26\22\13\353\0" - "\0\0\0\0\0\0\0\12\12\11\247\326\244]\377\344\266m\377\337\232P\377\317x$" - "\377\275^\30\377\247W\26\377\247W\26\377\273`\26\377\306]\27\377\312]\25" - "\377\306`\25\377\32\23\11\343\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7\247" - "\253Y\26\377\312g\27\377\312f\25\377\24\17\11\374\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\21\17\14\252\330\252a\377\345\267n\377\340\244U\377\35\30\20\377" - "\3\3\2\34\0\0\0\0\0\0\0\0\14\13\11\306\323\225L\377\335\227D\377\333\222" - "<\377\26\23\15\366\0\0\0\0\0\0\0\0\12\12\11\241\322\233M\377\337\223H\377" - "\325z*\377\27\22\14\377\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7\247\253Y\26\377\312" - "g\27\377\312f\25\377\35\25\12\252\0\0\0\0\0\0\0\0\14\12\7U\246W\27\377\321" - "v\36\377\332\2137\377!\33\22\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\17\15\12\252\327\237\\\377\342\251_\377\332\215;\377\"\32\17\276" - "\0\0\0\0\0\0\0\0\15\12\6U\247W\26\377\312g\27\377\306`\25\377\305`\26\377" - "\275a\26\377\306`\25\377\306`\25\377\31\23\12\377\4\4\3\34\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\252\262\\\27\377\322k\37\377\327\200," - "\377!\30\16\301\0\0\0\0\0\0\0\0\14\12\7U\247W\26\377\312_\27\377\312g\27" - "\377\40\26\13\252\0\0\0\0\12\10\7\252\253Y\26\377\30\21\11\371\0\0\0\0\14" - "\12\7U\243R\26\377\312g\27\377\312f\25\377\35\25\12\252\0\0\0\0\0\0\0\0\14" - "\12\7U\246W\27\377\312g\27\377\312f\25\377\24\17\11\377\0\0\0\0\0\0\0\0\0" - "\0\0\0\12\10\7\247\252Y\27\377\316j\31\377\320s!\377\34\25\15\317\0\0\0\0" - "\0\0\0\0\15\12\6U\247W\26\377\312_\27\377\312f\25\377\24\20\11\377\0\0\0" - "\0\0\0\0\0\0\0\0\0\17\15\12\252\326\236U\377\345\267n\377\344\271o\377\30" - "\24\17\371\0\0\0\0\0\0\0\0\14\13\11l\260[\27\377\312_\27\377\312f\25\377" - "\22\17\11\377\2\2\1\10\0\0\0\0\0\0\0\0\10\7\5\270\253Y\26\377\312_\27\377" - "\312f\25\377\"\27\13\255\0\0\0\0\0\0\0\0\14\13\11\210\324\240U\377\344\264" - "i\377\341\245X\377\37\31\22\377\3\3\2\34\0\0\0\0\0\0\0\0\10\7\5\262\253Y" - "\26\377\312g\27\377\312f\25\377\36\25\13\252\0\0\0\0\0\0\0\0\14\12\7U\247" - "W\26\377\312g\27\377\312f\25\377\24\17\11\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\7\6\34\36\33\25\356" - "\247o2\377\316n!\377\307f\30\377\257Z\26\377\245V\26\377\247W\26\377\247" - "W\26\377\241W\26\377T0\23\377\22\17\11\343\10\7\5\34\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\12\10\7\247\253Y\26\377\312g\27\377\312f\25\377\24\17\11\374" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12\252\323\237L\377\345\264n\377\344" - "\266m\377\"\34\23\377\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\252\253Y\26\377\312" - "g\27\377\312f\25\377\37\26\12\252\0\0\0\0\0\0\0\0\7\6\6\34""0\37\17\377\275" - "]\26\377\312f\25\377-\35\16\377\5\5\4q\0\0\0\0\5\5\4\34\26\24\17\377\334" - "\251a\377\342\262g\377\247v6\377\17\15\12\205\0\0\0\0\0\0\0\0\15\13\6U\247" - "W\26\377\312g\27\377\312f\25\377\23\17\10\327\0\0\0\0\13\11\6iyA\24\377\32" - "\22\11\276\0\0\0\0\11\11\10\247\320\226K\377\345\267n\377\344\265q\377%\35" - "\24\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\10\5\332\247W" - "\26\377\312]\25\377\306h\25\377\27\22\12\377\3\3\2""3\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\12\11\7\231\253Y\26\377\312_\27\377\312f\25\377\24\17" - "\11\377\2\2\1\21\0\0\0\0\0\0\0\0\10\7\5\265\270d\31\377\327w*\377\340\240" - "U\377\"\34\23\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6U\37\26" - "\14\377\246W\27\377\275a\26\377c<\26\377\17\15\10\252\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\4\3\3\27\15\13\10\343\266^\27\377\225" - "W\32\377\23\21\14\343\7\7\7\27\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12\252" - "\330\252a\377\345\263r\377\344\266m\377\"\34\23\377\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\11\10\6\202E*\22\377\303_\26\377#\30\14\377\5\5\4L\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\34\33" - "\30\20\270\40\33\23\377'\35\24\324\15\14\12U\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\15\13\10\252Q6\34\377\330\224C\377\337\241H\377\334" - "\223=\377uL\40\377\15\13\10\377,!\23\377\317{(\377\331\2102\377\332\2165" - "\377\234d'\377\22\17\13\343\12\10\7\34\0\0\0\0\0\0\0\0\0\0\0\0\17\15\10}" - "\23\16\12\252\16\13\7\252\12\10\7\252\13\11\6z\15\12\10U\10\7\5\231.!\25" - "\377\324\2123\377\335\227D\377\277\204>\377\23\21\14\260\0\0\0\0\0\0\0\0" - "\0\0\0\0\7\7\6L\32\26\17\361\275\201:\377\333\230H\377\331\232H\377\205W" - "&\377\17\15\12\335\6\6\5\34\0\0\0\0\0\0\0\0\17\14\10q\24\20\13\252\21\16" - "\12\216\7\6\6\34\0\0\0\0\0\0\0\0\23\20\14\252\310u#\377\324{%\377sJ\36\377" - "\11\10\6q\0\0\0\0\0\0\0\0\14\13\11\262hI%\377\316\223?\377\262y5\377:.\35" - "\377.$\31\377(\40\25\374\23\21\14U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\12\11\244\277\203<\377\337\241P\377" - "\335\227D\377.\"\25\377\4\4\3\3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\23" - "\20\14\255\320\2067\377\337\234F\377\330\240Q\377\25\23\16\377\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\6\5\5\31\21\16\12\343C0\34\377^C#\377\24\21\15\343" - "\6\6\5q\14\13\11\306C3\36\377U>\40\377\31\24\16\377\11\10\6R\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5\252\241W\26" - "\377\303Z\24\377\273[\24\377\23\16\10\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\17\14\10w\24\20\13\252\21\16\12\234\12\10\7\34\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\14\10z\22\17\13" - "\252\21\16\12\220\12\10\7\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\14\12\252" - "\235`$\377\323{&\377\307t\"\377\37\30\20\377\6\6\6\34\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\20\15\13\252\305n\40\377\321n\36\377\312g\27\377:$\17" - "\377\10\7\5q\0\0\0\0\0\0\0\0\12\10\5U\211D\22\377\271V\24\377\256X\23\377" - "\22\15\7\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\12\11\252" - "\314\2011\377\334\220?\377\331\2052\377\32\24\15\377\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\6\6L\27\23\14\364\271q$\377\317\201" - "4\377\255u2\377;.\34\377\22\17\15\306\11\11\10q\6\6\6\13\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\14\10\205\26\21\13\252\21\16\12\216\10" - "\7\5\34\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6\252\312\2001\377\334\224?\377\333" - "\2148\377\26\23\15\377\0\0\0\0\0\0\0\0\14\12\11\252\310}%\377\332\2153\377" - "\334\223=\377\212V#\377\15\12\10\343\13\11\6\252\15\13\10\306=)\26\377\312" - "o\37\377\314i\31\377\310i\25\377\26\21\11\335\0\0\0\0\0\0\0\0\0\0\0\0\13" - "\11\6l\16\13\7\252\13\11\6\213\6\5\3\21\0\0\0\0\0\0\0\0\0\0\0\0\11\7\6\205" - "\220K\23\377\271V\24\377\262V\23\377\33\22\10\252\0\0\0\0\0\0\0\0\13\11\6" - "U\206F\23\377\265X\24\377\264W\23\377\30\17\7\262\0\0\0\0\0\0\0\0\0\0\0\0" - "\12\10\5c\245V\26\377\316o\33\377\325|&\377$\33\21\377\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\12\11\205\247p0\377\336\246M\377\337\235" - "H\3776'\27\377\5\5\4%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\252" - "\265]\26\377\316o\33\377\326\177+\377\24\20\13\377\0\0\0\0\0\0\0\0\0\0\0" - "\0\11\10\10\252\313\2012\377\336\221?\377\334\223=\377!\32\20\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\14\12\7q\17\14\10\252\15\12\10z\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\12\10\7\252\310x)\377\334\216;\377\333\222<\377\33\25\16\377\0\0" - "\0\0\0\0\0\0\0\0\0\0\15\13\10q\22\17\13\252\21\16\12\216\10\7\5\34\0\0\0" - "\0\0\0\0\0\0\0\0\0\16\14\11q\24\17\13\252\21\16\12\231\12\10\7\34\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6U\35\25\12\377w>\24\377\231O\24\377(\31\13" - "\377\11\10\6U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7\34\40\30\15" - "\332D/\31\377=+\30\377=.\34\377=/\34\377=/\34\377B2\35\377I7\40\377B0\35" - "\377\30\24\17U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\6\6O\40\32\21\364" - "\307\2046\377\320\226K\377zW)\377\21\17\12\252\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\34\40\27\13\3435!\16\377\"" - "\27\13\377\14\12\7\276\6\5\5\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11" - "\7\4\252\222L\23\377\305c\24\377\314n\33\377;)\26\377\6\6\6\252\12\11\11" - "q\37\32\22\270\36\31\21\377\35\31\22\377\"\33\23\377%\34\22\335\15\13\10" - """9\0\0\0\0\0\0\0\0\15\12\6X\220K\23\377\271V\24\377\262Z\23\377\24\16\7" - "\324\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4}\235Q\24\377\324u!\377\334\224?\377\33" - "\25\16\332\0\0\0\0\0\0\0\0\14\12\11\177\300o\37\377\320p\33\377\312g\27\377" - "\26\20\11\314\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5]\211D\22\377\271^\24\377\264" - "[\23\377\36\24\11\252\0\0\0\0\0\0\0\0\13\11\6U\214C\23\377\312j\25\377\326" - "}'\377\31\24\16\377\0\0\0\0\0\0\0\0\0\0\0\0\6\6\5\34\15\13\10\213\24\20\13" - "\252\23\17\12\216\10\7\5\34\0\0\0\0\0\0\0\0\12\11\5\216\231O\24\377\303Z" - "\24\377\316o\33\377\30\24\15\377\0\0\0\0\0\0\0\0\0\0\0\0\14\12\11\252\303" - "q\40\377\323s\36\377\313l\30\377\37\25\12\255\0\0\0\0\0\0\0\0\13\11\6U\214" - "F\23\377\271V\24\377\264W\23\377\30\17\7\265\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6\252\256[\27\377\327{*\377\335" - "\226B\377\31\24\16\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\11\7\4\252\224M\23\377\265\\\24\377\264W\23\377\31\21\10\252" - "\0\0\0\0\0\0\0\0\"\30\15\252\241f&\377\333\232F\377\334\216;\377\325|&\377" - "\40\30\15\306\0\0\0\0\0\0\0\0\13\11\6U\214F\23\377\271V\24\377\262Z\23\377" - "\24\16\7\324\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5\177\220N\23\377\271V\24\377\264" - "W\23\377\35\23\12\252\0\0\0\0\0\0\0\0\15\13\10t\302t!\377\321n\36\377\312" - "_\27\377\26\21\11\335\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5U\14\11\5\252\12\10" - "\5\202\6\5\3\10\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5n\220N\23\377\271V\24\377" - "\262V\23\377\33\22\10\252\0\0\0\0\0\0\0\0\13\10\6U\211D\22\377\271V\24\377" - "\310i\25\377\35\25\14\377\4\4\4\31\12\11\7\213\232d/\377\327\224F\377\306" - "\203-\377.\"\23\377\13\11\6X\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5w\220N\23\377" - "\271V\24\377\264W\23\377\25\17\10\322\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\252\307w'\377\334\220?\377\335\233" - "F\377\33\25\16\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\252\253" - "Y\26\377\303b\24\377\267Y\23\377\35\24\10\252\0\0\0\0\0\0\0\0\13\11\6U\213" - "F\24\377\312g\27\377\323v$\377\34\25\15\311\0\0\0\0\10\10\7""9vT'\377\327" - "\237V\377\333\225B\377\330\201-\377\323y\"\377\"\31\15\262\0\0\0\0\0\0\0" - "\0\13\12\6X\222L\23\377\271^\24\377\262Z\23\377\30\22\11\377\0\0\0\0\0\0" - "\0\0\0\0\0\0\22\17\13\252\313z*\377\327~(\377\321j\36\377\40\26\15\270\0" - "\0\0\0\0\0\0\0\14\12\7U\217H\24\377\271^\24\377\262Z\23\377\24\16\7\322\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\11\7\4\252\224M\23\377\264W\23\377\262V\23\377\36\25\11\377\5\5\4" - "%\10\7\5\34\24\21\15\343\205Y&\377\327\2168\377\330\201-\377\321s\40\377" - "\32\23\13\322\0\0\0\0\0\0\0\0\13\11\6U\216J\23\377\271V\24\377\262Z\23\377" - "\24\16\7\322\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4z\217K\24\377\313l\30\377\330" - "\201-\377\36\27\17\377\0\0\0\0\0\0\0\0\0\0\0\0\14\12\7n\20\15\11\252\15\12" - "\10z\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6i\216J\23\377\271V\24\377\264" - "W\23\377\27\20\10\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17" - "\15\12\252\313z*\377\327~(\377\321v\36\377\30\21\13\377\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\10\4\252\224M\23\377\265\\\24\377\264W" - "\23\377\27\20\10\306\0\0\0\0\0\0\0\0\0\0\0\0\11\7\6\213\237R\24\377\313d" - "\30\377\324y!\377\34\25\15\377\0\0\0\0\0\0\0\0\0\0\0\0\14\13\11wQ;\"\377" - "\330\231G\377\255u2\377\25\22\16\377\12\12\11\364\13\12\10\377<#\17\377\255" - "U\24\377T1\21\377\15\12\6\252\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5\202\222O\23" - "\377\301Y\24\377\313h\30\377xM\37\377\23\21\14\377uP$\377\333\232F\377\262" - "y5\377\24\21\15\377-!\22\377\270^\25\377\303Z\24\377\315j\32\377\36\26\15" - "\377\0\0\0\0\0\0\0\0\0\0\0\0\7\7\6R#\34\22\377\304r!\377\224P\31\377\40\26" - "\13\377\24\17\11\377\32\22\11\377X1\21\377\225N\24\377(\32\13\377\11\7\4" - "U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4\177\214" - "F\23\377\265X\24\377\264W\23\377\22\15\7\353\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\12\11\7]hE#\377\311\2030\377\302m!\377A*\24\377\14\12" - "\7\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\11\7\4\252\222O\23\377\265X\24\377\264W\23\377\27\20\10\306\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\16\12\306\274" - "\205=\377\333\225B\377\302s%\377\21\17\12\364\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\12\10\5q\220N\23\377\271V\24\377\264W\23\377\22\15\7" - "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\6" - "\4A5\37\14\377\242S\23\377\271^\24\377\202F\25\377\37\26\12\377\31\23\12" - "\306\26\21\11\366F(\17\377\251W\24\377\310i\25\377\324{%\377\34\25\15\335" - "\0\0\0\0\0\0\0\0\14\12\11\205\310\177)\377\322x!\377\312_\27\377\23\16\10" - "\356\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5n\220N\23\377\271V\24\377\262V\23\377" - "\34\23\11\252\0\0\0\0\0\0\0\0\14\12\11\205\302p\37\377\321n\36\377\312f\25" - "\377\25\17\10\353\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4""9\14\12\5X\12\10" - "\5U\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5}\222O\23\377\265X\24\377\264W\23\377" - "\31\21\10\303\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5w\220N\23\377\271^\24\377\310" - "i\25\377\27\22\12\335\0\0\0\0\0\0\0\0\13\11\10\231\310{)\377\324u!\377\312" - "g\27\377o?\24\377\33\24\12\377\24\20\11\366\26\21\11\371\34\24\11\306\36" - "\25\11\252\30\21\11\327\34\24\11\311\12\10\5U\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\11\7\4\252\222O\23\377\265X\24\377\264W\23\377\22\15\7\377\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\13\12\10q\230h/\377\326\2061\377\314i\31\377b6\23" - "\377\22\15\11\343\15\12\10\252\16\14\11\306<)\25\377\307p\34\377\312f\25" - "\377\312g\27\377\32\23\13\314\0\0\0\0\0\0\0\0\14\13\11t\273e\30\377\312]" - "\25\377\273[\24\377\22\15\7\377\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4\252\222O\23" - "\377\265X\24\377\262Z\23\377\33\21\10\252\0\0\0\0\0\0\0\0\13\11\6U\213F\24" - "\377\312g\27\377\324{%\377\40\30\17\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\15\14\12\252\304r!\377\316j\31\377\304c\25\377\34\23\11\252" - "\0\0\0\0\0\0\0\0\13\10\6U\211D\22\377\265X\24\377\262V\23\377\244U\25\377" - "\212I\25\377\257]\24\377\262V\23\377.\34\13\377\6\5\3l\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\11\7\4\252\222L\23\377\275X\24\377\275X\24\377\34" - "\23\11\252\0\0\0\0\0\0\0\0\13\11\6U\211D\22\377\271V\24\377\262Z\23\377\33" - "\21\10\252\0\0\0\0\11\7\4\247\222O\23\377\24\16\7\374\0\0\0\0\13\11\6U\211" - "D\22\377\271^\24\377\262Z\23\377\33\21\10\252\0\0\0\0\0\0\0\0\13\11\6U\211" - "D\22\377\271V\24\377\264W\23\377\22\15\7\377\0\0\0\0\0\0\0\0\0\0\0\0\11\7" - "\4\252\222O\23\377\271^\24\377\267U\23\377\33\23\10\252\0\0\0\0\0\0\0\0\13" - "\11\6U\214I\23\377\265X\24\377\262Z\23\377\24\17\7\377\0\0\0\0\0\0\0\0\0" - "\0\0\0\20\16\13\252\320\217;\377\337\234F\377\330\2071\377\34\26\15\322\0" - "\0\0\0\0\0\0\0\13\11\6U\214F\23\377\271^\24\377\262Z\23\377H'\15\377\12\10" - "\5\332\10\6\3\252\11\7\4\301'\30\12\377\240R\23\377\271^\24\377\220J\27\377" - "\20\15\11\252\0\0\0\0\0\0\0\0\12\11\7U\221e0\377\332\225C\377\322s\37\377" - "c9\23\377\12\10\5\343\10\6\3\252\11\7\4\276\36\24\11\377\236Q\23\377\271" - "^\24\377\262Z\23\377\33\21\10\252\0\0\0\0\0\0\0\0\13\10\6U\211D\22\377\271" - "V\24\377\264W\23\377\22\15\7\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\11\10\34\15\14\10\216" - "\33\24\12\252\35\25\12\301\30\21\11\374\26\21\11\350\26\21\11\377W1\22\377" - "\265X\24\377\262Z\23\377d6\21\377\13\12\6\226\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\11\7\4\252\222O\23\377\265X\24\377\264W\23\377\22\15\7\377\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\17\15\12\252\320\2157\377\337\234F\377\331\2052\377" - "\27\23\14\377\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5z\220N\23\377\271V\24\377\264" - "W\23\377\36\24\11\260\0\0\0\0\0\0\0\0\0\0\0\0\14\12\7U'\32\14\377\233P\24" - "\377c7\23\377\23\20\14\377\14\13\11\377\22\17\13\377wT&\377\321\211<\377" - "\212V#\377\22\17\13\262\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5\202\220N\23\377\265" - "\\\24\377\262Z\23\377'\30\12\377\6\5\3\322\35\24\10\377\251W\24\377a5\22" - "\377\10\7\5\377\32\25\17\377\324\216;\377\335\227D\377\332\2165\377\"\31" - "\17\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\5\4R\20\14\7\377\240R\23" - "\377\271V\24\377\271V\24\3774\35\13\377\7\6\4\252\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\10\7\5US.\20\377\265\\\24\377\262V\23\377W/\16\377\12\10" - "\5\340\10\6\3\252\11\7\4\276\35\24\10\377\303h\30\377\331\2102\377\335\233" - "F\377\36\27\17\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5U\32\22\11\377k" - ";\24\377\227P\26\377<\"\17\377\13\11\6\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5\252\237R\24\377\312v#\377" - "B3\35\377\11\11\10`\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\15\12\252\320\214" - ";\377\337\234F\377\327\205,\377\33\24\14\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\16\14\7\364\203C\24\377\260Y\23\377\21\14\6\377\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\21\16" - "\12U\253_\34\377\316{!\377\320{\37\377\317p\34\377\312k\27\377\277b\26\377" - "\252[\25\377\303k\26\377\321{\36\377\324\204%\377\326\206'\377\323\205(\377" - "\312y#\377\35\25\14\244\0\0\0\0\0\0\0\0\14\12\7R\250b\35\377\312y#\377\304" - "x\37\377\302s\37\377\276s\33\377\271e\32\377\270d\31\377\307k\32\377\320" - "{\37\377\250i%\377\31\25\16\343\11\10\10\34\0\0\0\0\0\0\0\0\10\10\7\34'\36" - "\22\371\267z*\377\323\205(\377\322\205+\377\241j)\377\17\15\12\335\5\4\4" - "\21\0\0\0\0\0\0\0\0\16\13\7q\224S\31\377\301l\30\377\264]\27\377\33\22\12" - "\231\0\0\0\0\0\0\0\0\14\11\7z\220N\23\377\264[\23\377S.\20\377\7\6\4\270" - "\0\0\0\0\0\0\0\0\4\4\3U\34\25\15\377\312y#\377\321\204*\377\203W$\377\12" - "\11\7\377\5\5\5\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7DV>\37\377\316\203+\377\326\202'\377L2" - "\31\377\7\6\6q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\5\4\34\25\21\14\377\312" - "y#\377\322\207%\377\235d&\377\22\17\13\226\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\22\17\11[\241X\30\377i@\34\377\13\12\10\252\0\0\0\0\0\0\0\0\0\0\0\0\10" - "\7\7U(\34\21\377\256[\27\377*\33\15\255\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5t\205B\20\377\241U\21\377\241N\21\377" - "\31\20\10\335\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\14\10w\252" - "c\35\377\313~$\377\307\177\"\377\33\24\14\322\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\15\13\10z\252c\35\377\314\177%\377\307w\"\377\33\24" - "\14\306\0\0\0\0\0\0\0\0\0\0\0\0\4\4\3\13\22\15\11\377\232O\23\377\256X\23" - "\377\\3\21\377\14\12\7\306\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\13\11\6\223\216J\23\377\253Z\22\377\237Q\22\377\21\14\6\377\0\0\0\0\0" - "\0\0\0\0\0\0\0\10\7\5\216\205B\20\377\241U\21\377\241U\21\377\25\16\6\327" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\306\276k\31\377" - "\313h\30\377\304c\25\377\25\17\10\377\2\2\1\16\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\11\10\6%#\34\22\377\267p$\377\324\204%\377\262v)\377\33\27" - "\20\377\5\5\4\306\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\17\14\10i\216O\27\377\275a\26\377\240S\25\377\22\15\7\332\0\0\0" - "\0\0\0\0\0\0\0\0\0\12\10\7\306\304r!\377\326\201%\377\324\204%\377\33\25" - "\14\322\0\0\0\0\0\0\0\0\15\13\10t\300r\37\377\322}!\377\321{\36\377\313q" - "\32\377\261[\26\377\237R\24\377\240S\25\377\245U\24\377\250Y\23\377\243V" - "\22\377\241N\21\377\27\17\6\252\0\0\0\0\0\0\0\0\11\7\4""9c0\16\377\216I\21" - "\377\205B\20\377\23\15\6\276\0\0\0\0\0\0\0\0\0\0\0\0\7\6\4\244\207B\20\377" - "\241U\21\377\241U\21\377\31\20\6\252\0\0\0\0\0\0\0\0\12\10\5U\203A\20\377" - "\241U\21\377\241U\21\377\23\15\6\343\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5\260" - "\276k\31\377\324\177#\377\326\206'\377\36\25\15\377\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\14\12\7\252\302m!\377\325\204$\377\320z\35\377" - "\34\24\13\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4\223" - "\210F\21\377\312b\25\377\323~\"\377\33\24\14\377\3\3\2\34\0\0\0\0\0\0\0\0" - "\12\10\7\303\264]\27\377\312f\25\377\312f\25\377\31\21\12\335\0\0\0\0\0\0" - "\0\0\15\13\10A\201F\26\377\254X\25\377\220N\23\377\26\17\7\260\0\0\0\0\0" - "\0\0\0\0\0\0\0\12\10\7\306\306|%\377\327\210*\377\326\206'\377\33\25\14\324" - "\0\0\0\0\0\0\0\0\14\12\7O\227X\32\377\306t\35\377\300m\33\377\31\22\12\247" - "\0\0\0\0\0\0\0\0\14\11\7Rw>\24\377\256Y\25\377\232O\23\377\26\17\7\265\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\5\4D\24\16\7\371\216I\21\377\217" - "J\22\377-\32\12\377\12\10\5U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\6\6U'\36\22\377\304y)\377\325\207" - "*\377sH\36\377\12\11\7\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\5\4\21\6\5\5U\5\5\4-\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4\216\222O\23\377\314l\27\377" - "\324~!\377\36\26\15\377\3\3\3(\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5}\205B\20\377\241U\21\377\241U\21\377" - "\23\15\6\324\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5\177\210F\21\377\301a\24\377" - "\313l\30\377\36\25\13\301\0\0\0\0\0\0\0\0\15\12\6U\206F\23\377\253Z\22\377" - "\237Q\22\377\21\14\6\356\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5\220\207B\20\377\241" - "U\21\377\241U\21\377\27\17\6\252\0\0\0\0\0\0\0\0\12\7\5U\205B\20\377\271" - "^\24\377\321{\36\377\27\22\14\377\3\3\2\34\0\0\0\0\5\5\4\34\22\17\13\343" - "\206H\25\377\236Q\23\377\217J\22\377\26\17\7\216\0\0\0\0\0\0\0\0\12\10\5" - "U\203A\20\377\243O\22\377\262Z\23\377\26\20\11\377\3\2\2\24\0\0\0\0\0\0\0" - "\0\11\7\6\260\220N\23\377\257X\22\377\243O\22\377\32\20\7\252\0\0\0\0\0\0" - "\0\0\12\10\5U\201@\20\377\241U\21\377\241N\21\377\23\15\6\345\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5\234\220N\23\377" - "\312f\25\377\316o\33\377\33\24\14\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5\205\207B\20\377\241U\21\377\241U\21" - "\377\23\15\6\343\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5\377\254U\25\377\275\\\24" - "\377\254W\23\377\30\20\7\252\0\0\0\0\0\0\0\0\12\10\5U\201@\20\377\241U\21" - "\377\241U\21\377\23\15\6\324\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5\177\207B\20" - "\377\241U\21\377\241U\21\377\32\20\7\252\0\0\0\0\0\0\0\0\13\11\6U\206F\23" - "\377\253Z\22\377\237N\22\377\27\17\6\252\0\0\0\0\0\0\0\0\11\7\4""9b1\15\377" - "\213G\20\377\205B\20\377\23\15\6\301\0\0\0\0\0\0\0\0\0\0\0\0\7\6\4\260\205" - "B\20\377\241U\21\377\241U\21\377\27\17\6\252\0\0\0\0\0\0\0\0\12\10\5U\201" - "@\20\377\245W\22\377\264[\23\377\24\17\11\377\0\0\0\0\5\5\4\21\32\25\17\343" - "~K\31\377\262_\25\377\216J\23\377.\34\13\377\12\10\5""9\0\0\0\0\0\0\0\0\12" - "\10\5U\203A\20\377\241U\21\377\241U\21\377\21\14\6\374\2\1\1\10\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\252\307w\"\377\327" - "\210*\377\326\213)\377\34\24\15\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\10\7\5\252\207B\20\377\241U\21\377\241U\21\377\27\17\6\252\0\0\0\0\0\0" - "\0\0\12\10\5U\203C\20\377\312f\25\377\323\177$\377\26\21\13\371\0\0\0\0\0" - "\0\0\0\20\16\13\311eC\34\377\277b\26\377\271^\24\377\254W\23\377\32\21\7" - "\252\0\0\0\0\0\0\0\0\12\10\5U\201@\20\377\241U\21\377\241U\21\377\37\24\10" - "\377\5\5\4f\0\0\0\0\5\4\4\34\20\15\11\377\244U\25\377\264[\23\377\245W\22" - "\377\32\21\7\252\0\0\0\0\0\0\0\0\12\10\5U\201@\20\377\241U\21\377\241U\21" - "\377\23\15\6\324\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5\205\207B\20\377\241U\21\377\241U\21\377" - "\32\21\7\377\3\3\2\210\11\7\4\343\203C\24\377\305h\26\377\306h\25\377\267" - "]\23\377\254W\23\377\32\21\7\252\0\0\0\0\0\0\0\0\12\10\5U\201@\20\377\241" - "U\21\377\241U\21\377\23\15\6\324\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5\177\207" - "B\20\377\301a\24\377\321{\36\377\23\17\12\374\0\0\0\0\0\0\0\0\15\13\10A}" - "D\26\377\256V\25\377\222L\23\377\26\16\7\262\0\0\0\0\0\0\0\0\0\0\0\0\10\6" - "\5\220\207B\20\377\241U\21\377\241U\21\377\23\16\6\356\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\252\243W\24\377\264[\23\377\245W" - "\22\377\21\14\6\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7" - "\4\213\207B\20\377\241U\21\377\241U\21\377\17\13\6\366\0\0\0\0\0\0\0\0\0" - "\0\0\0\11\7\6\270\264]\27\377\323s\36\377\325\205&\377\34\24\15\377\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\14\13\11\252\230[\37\377\274i\37\377sB\26\377" - "[2\20\377T.\17\377t;\21\377v>\21\377\17\13\6\335\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\12\10\5t\222O\23\377\312g\27\377\321\200\40\377\310\177)\377\247" - "j(\377\305z*\377\322\202#\377\272j\33\377X3\23\377f7\21\377\235S\22\377\275" - "\\\24\377\321{\36\377\35\25\14\340\0\0\0\0\0\0\0\0\7\6\6\34)\37\22\353\240" - "T\27\377\252W\23\377-\32\12\377\5\5\4\252\4\4\4\10\4\4\3c\17\14\6\377\214" - "H\21\377\212G\21\377-\32\12\377\12\10\5U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\10\7\5\216\205B\20\377\241U\21\377\241U\21\377\23\15\6\345" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\252\240V\25\377" - "\271Z\24\377[2\20\377\7\6\4\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\5\226\205B\20\377\241U\21\377" - "\241U\21\377\17\13\6\366\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\10\10\7nJ4\33\377\277g\30\377\260Y\23\377\"\26\11\377\6" - "\5\3""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5\241\205B\20\377\241" - "U\21\377\241N\21\377\17\13\6\374\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\14\12\5U{=\20\377\241U\21\377\241U\21\377\26\17" - "\7\377\2\2\1U\0\0\0\0\0\0\0\0\7\6\4\364\205B\20\377\247X\22\377\275\\\24" - "\377\33\23\12\303\0\0\0\0\0\0\0\0\14\12\7n\240S\25\377\261U\22\377\241N\21" - "\377\17\13\6\374\0\0\0\0\0\0\0\0\0\0\0\0\7\6\4\241\205B\20\377\241U\21\377" - "\241U\21\377\27\17\6\252\0\0\0\0\0\0\0\0\13\11\6U\206F\23\377\253Z\22\377" - "\237N\22\377\17\13\6\371\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5Ub1\15\377\207H\20" - "\377\205B\20\377\23\15\6\213\0\0\0\0\0\0\0\0\12\10\5U\203A\20\377\241U\21" - "\377\241U\21\377\17\13\6\366\0\0\0\0\0\0\0\0\0\0\0\0\7\6\4\244\205B\20\377" - "\245W\22\377\262Z\23\377\30\21\11\324\0\0\0\0\0\0\0\0\15\13\10i\245V\26\377" - "\264[\23\377\237Q\22\377\23\16\6\377\2\2\1O\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5\247\205" - "B\20\377\241U\21\377\241U\21\377\17\13\6\374\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\7\6\6\34\30\23\15\343g;\24\377\235S\22\377\232N\21\377\226Q\23\377\232" - "O\23\377\236Q\23\377\242S\23\377\241U\21\377\237Q\22\377\243V\22\377\33\22" - "\10\252\0\0\0\0\0\0\0\0\13\11\6U\203C\20\377\245W\22\377\241U\21\377\17\13" - "\6\374\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5\247\205B\20\377\241U\21\377\241U\21" - "\377\27\17\6\252\0\0\0\0\0\0\0\0\12\10\5U\203A\20\377\257X\22\377\277`\24" - "\377\31\22\12\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\11\6" - "\252\224M\23\377\251R\22\377\241U\21\377\27\17\6\252\0\0\0\0\0\0\0\0\12\10" - "\5U\201@\20\377\241U\21\377\241U\21\377W/\16\377\27\21\10\377A\"\14\377\226" - "L\21\377\204D\21\377)\31\12\377\12\10\5U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\10\7\5\226\205B\20\377\241U\21\377\241N\21\377\27\17\6\252\0\0\0\0\0\0\0" - "\0\12\10\5U\201@\20\377\241U\21\377\241U\21\377\27\17\6\252\0\0\0\0\10\7" - "\5\231\205B\20\377\23\15\6\356\0\0\0\0\12\10\5U\201@\20\377\241U\21\377\241" - "U\21\377\27\17\6\252\0\0\0\0\0\0\0\0\12\10\5U\201@\20\377\241U\21\377\241" - "U\21\377\17\13\6\374\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5\247\205B\20\377\241U" - "\21\377\241U\21\377\27\17\6\252\0\0\0\0\0\0\0\0\12\10\5U\201@\20\377\241" - "U\21\377\241U\21\377\37\24\10\377\5\4\4U\0\0\0\0\5\4\4(\21\16\12\377\310" - "x#\377\317p\34\377\303b\24\377\35\24\10\252\0\0\0\0\0\0\0\0\12\10\5U\203" - "A\20\377\243V\22\377\237Q\22\377\226L\21\377\211F\20\377\207H\20\377\207" - "B\20\377\222K\21\377\237Q\22\377\203C\24\377*\37\21\377\12\11\7>\0\0\0\0" - "\0\0\0\0\5\5\4\10\32\25\17\343\211O\34\377\256X\23\377\236S\21\377\211F\20" - "\377\207H\20\377\207B\20\377\222K\21\377\237Q\22\377\241U\21\377\241U\21" - "\377\27\17\6\252\0\0\0\0\0\0\0\0\12\10\5U\203C\20\377\243V\22\377\237Q\22" - "\377\21\14\6\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\2\1\1\10\7\6\4\371\211C\20\377\245P\22\377\232N\21\377\33\22\10" - "\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5\247\205B\20\377\241U\21\377\241" - "U\21\377\17\13\6\374\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\252\307|$\377" - "\323}\40\377\310i\25\377\22\15\7\377\0\0\0\0\0\0\0\0\0\0\0\0\7\6\4\244\205" - "B\20\377\241U\21\377\241N\21\377\23\15\6\343\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\10\7\5zD&\15\377\226S\27\377\256k#\377\265p&\377\276u'\377\301r$\377" - "\217T\32\377\17\14\10\324\4\4\3\6\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5l\207B\20" - "\377\241U\21\377\241U\21\377}A\20\377Z/\15\377y<\20\377\244T\23\377\275a" - "\26\377\261h\40\377\302{'\377\324\206)\377\322|\37\377\310i\25\377\27\21" - "\10\332\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5\2478\37\13\377n7\17\377v" - ">\21\377s:\20\377s:\20\377x?\21\377_.\16\377\21\15\6\343\7\6\4\34\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\16\14\7\343W+\16\377\232N\21\377\230M\21\377\213" - "G\20\377\207H\20\377\207B\20\377\222K\21\377\310i\25\377\323\177$\377\326" - "\206'\377\27\22\14\377\0\0\0\0\0\0\0\0\0\0\0\0\7\6\4U\32\20\7\377\203C\20" - "\377\221K\22\377N+\17\377\7\6\4\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5\210\235Q\24\377\322\201" - "!\377\213Y$\377\12\11\7\306\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\13\10\252" - "\304q\37\377\316r\31\377\275\\\24\377\22\15\7\364\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\5\4\4X\33\23\10\377\215I\22\377\241U\21\377\25\16\6\332\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\14\11\7c\13\10\6\252\12\10\5[\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\13\12\10\34\40\27\15\343l9\23\377\231R\22\377\232N\21\377\222K\21" - "\377a/\16\377$\30\13\377l@\31\377\313o\36\377\317v\40\377\317v\40\377\275" - "n\40\377?)\24\377\17\14\10L\0\0\0\0\0\0\0\0\11\10\6\34&\33\17\3323!\22\377" - "0\40\21\377\203J\30\377\266a\25\377\260Y\23\377\252W\23\377\206H\25\377%" - "\31\16\377\17\15\10\220\7\7\6\34\0\0\0\0\0\0\0\0\0\0\0\0\13\11\10\177\253" - "c\34\377\320{\37\377\313|\36\377h?\33\377\17\15\12\324\7\6\6\34\0\0\0\0\0" - "\0\0\0\0\0\0\0\16\13\7\252\216J\23\377\241U\21\377\237Q\22\377\33\22\10\270" - "\0\0\0\0\0\0\0\0\6\5\3\34\33\21\10\343\\.\15\377o7\16\377\37\24\10\377\10" - "\6\3\306\11\7\4\252\12\10\5\343\26\20\11\377='\22\377k@\32\377lB\31\377\40" - "\26\13\377\11\7\6\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\11\7\2348$\23\377\277r\40\377\257" - "b\36\377)\33\20\377\13\11\6""9\0\0\0\0\0\0\0\0\0\0\0\0\25\17\12\343d8\25" - "\377\240S\25\377P,\21\377\16\14\7\276\7\6\6\34\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\15\12\6\34\35\24\12\324\25\17\12\220\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\14\11\7U'\30\12\255\20\14\7U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\5\3\24\23\15\6\255\25\16\6\377\25\17\6\327" - "\12\10\5U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\14\10\252\276" - "b\27\377\313l\30\377\312o\27\377\27\21\12\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\21\15\12\252\303p\36\377\323|\36\377\315j\32\377\37" - "\25\14\377\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5\213,\31\11\377\207H\20\377h6\15" - "\377\17\13\6\371\7\6\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\7\6\4""9,\31\11\377\211I\20\377\217F\20\3771\31\10\377\10\6\3\270\10\6\3" - "U\10\6\3\216\27\20\6\377\202B\17\377\221M\20\377W,\14\377\12\10\5\216\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\11\10\2445\37\16\377\226J\23\377" - "\232N\21\377\224L\21\377A!\12\377\12\10\5\270\6\5\5\34\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\13\11\6\216\257f\36\377\317{\40\377\320r\37\377\304r!\377" - "Y8\32\377\21\15\12\377\13\10\6\252\11\7\6\252\13\10\6\252\17\13\10\252\22" - "\15\11\216\10\6\5\34\0\0\0\0\0\0\0\0\12\10\5]f5\21\377\237Q\22\377\232N\21" - "\377H%\13\377\13\10\6\343\11\7\6\252\13\10\6\306=$\24\377\304k\33\377\314" - "r\33\377\266f\37\377\23\16\12\252\0\0\0\0\0\0\0\0\6\6\5\24\32\23\13\306\34" - "\24\13\377\26\20\11\377\27\20\10\377\33\22\10\377\30\20\7\377\30\20\7\377" - "J'\13\377\213D\20\377\217F\20\377\217F\20\377\24\15\5\252\0\0\0\0\0\0\0\0" - "\7\6\4JW,\14\377\233O\22\377\227I\20\377C\"\12\377\11\7\4\306\11\7\4`\10" - "\6\5\237\33\21\10\377\211C\20\377\236P\21\377p8\17\377\12\10\5\247\0\0\0" - "\0\0\0\0\0\7\5\4UJ$\13\377\226S\21\377\221M\20\3777\35\12\377\10\6\3\306" - "\10\6\3X\7\6\4\231'\30\14\377\307p\34\377\322s\37\377\270l!\377\21\16\12" - "\306\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\11\6\252\213E\22" - "\377\250V\23\377\232N\21\377\21\14\6\353\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\7\6\4U@\40\13\377\242P\23\377\306`\25\377m?\32\377\17\13" - "\10\343\12\10\7\252\10\7\5\303\35\22\10\377\211C\20\377\232N\21\377r;\17" - "\377\13\12\6\244\0\0\0\0\0\0\0\0\11\7\6Ua2\20\377\237Q\22\377\230M\21\377" - "J$\13\377\12\10\5\306\7\6\4}\12\10\5\306=$\24\377\310i\35\377\321z\34\377" - "\264h\35\377\20\14\11\252\0\0\0\0\0\0\0\0\14\12\7\252\240S\25\377\267Y\23" - "\377\256X\23\377\34\23\11\273\0\0\0\0\0\0\0\0\16\12\7U\217K\24\377\303b\24" - "\377\275\\\24\377\25\17\10\340\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\7\6\4U\32\20\7\377o7\16\377\204C\17\377'\27\10\377\10\6\3q\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\6U\40\26\15" - "\377\274p\37\377\301r\36\377^9\31\377\21\15\12\252\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4" - "\216\12\10\5\377\12\10\5\306\6\5\3\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\10\7\5UX0\23\377\314r\33\377\320v\37\377o>\32\377\13\10\6\343" - "\10\7\5\226\12\10\5t\12\10\5X\11\7\4U\6\5\3J\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\12\10\5cr8\15\377\217F\20\377\217F\20\377\22\14\5\327\0\0\0\0\0\0\0" - "\0\0\0\0\0\10\7\3\202v<\15\377\224L\21\377\226L\21\377\30\20\7\252\0\0\0" - "\0\0\0\0\0\11\7\4Ur8\15\377\221J\20\377\217F\20\3774\34\11\377\10\6\3\306" - "\10\6\3X\10\6\3\220\27\17\6\377\202B\17\377\227P\20\377o7\16\377\12\10\5" - "\220\0\0\0\0\0\0\0\0\6\5\3;;\40\12\377\235S\22\377\271Z\24\377a6\26\377\16" - "\12\7\343\15\12\6\252\15\12\6\377T)\15\377\224L\21\377\233R\22\377\207B\20" - "\377\16\12\5\237\0\0\0\0\0\0\0\0\11\7\4Ur8\15\377\221M\20\377\221J\20\377" - "7\34\12\377\11\7\4\306\10\6\3]\10\6\3\223\31\20\6\377\202@\17\377\227P\20" - "\377o7\16\377\12\10\5\216\0\0\0\0\0\0\0\0\11\7\4Ur8\15\377\221M\20\377\217" - "F\20\3774\34\11\377\10\6\3\306\10\6\3f\10\6\3\213\10\6\3\252\11\10\4q\0\0" - "\0\0\0\0\0\0\0\0\0\0\12\10\5[r8\15\377\226L\21\377\226L\21\377\21\14\6\374" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\6\4U@" - "!\13\377\221M\20\377\217F\20\3778\35\11\377\10\6\3\306\10\6\3U\6\5\3w\16" - "\13\5\377\200B\17\377\227I\20\377\217L\20\377\24\15\5\252\0\0\0\0\0\0\0\0" - "\11\7\4Ur8\15\377\217F\20\377\217F\20\377\22\14\5\327\0\0\0\0\0\0\0\0\0\0" - "\0\0\10\7\3\202r8\15\377\217F\20\377\217F\20\377\24\15\5\252\0\0\0\0\0\0" - "\0\0\11\7\4Ur8\15\377\217F\20\377\217F\20\377\24\15\5\252\0\0\0\0\0\0\0\0" - "\7\6\4GW,\14\377\236W\21\377\241U\21\377g5\24\377\17\13\10\343\12\10\7\252" - "\12\10\7\303!\24\12\377\211C\20\377\227I\20\377o7\16\377\12\10\5\216\0\0" - "\0\0\0\0\0\0\11\7\4Ur8\15\377\217F\20\377\222K\21\377\22\15\7\377\0\0\0\0" - "\0\0\0\0\7\6\6J\30\20\7\377\204C\17\377\221M\20\377\207H\20\377\16\12\5\252" - "\0\0\0\0\0\0\0\0\11\7\4Ur8\15\377\221M\20\377\217F\20\377:\37\13\377\13\10" - "\6\343\13\11\6\252\13\10\6\252\12\7\5\252\11\10\4q\0\0\0\0\0\0\0\0\0\0\0" - "\0\13\11\6\241\257\\\30\377\313l\30\377\306e\27\377\31\22\12\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3\223r8\15\377\217F\20\377\217F\20" - "\377\24\15\5\252\0\0\0\0\0\0\0\0\11\7\4Ur8\15\377\252W\23\377\307j\30\377" - "\30\21\13\377\0\0\0\0\0\0\0\0\6\6\5\34\17\14\6\377\200B\17\377\221J\20\377" - "\217F\20\377\24\15\5\252\0\0\0\0\0\0\0\0\6\5\3""99\37\12\377\221M\20\377" - "\217F\20\377Z,\15\377\23\15\6\377\12\10\5\377\15\12\6\377>!\13\377\207H\20" - "\377\227I\20\377l5\15\377\12\10\5\216\0\0\0\0\0\0\0\0\11\7\4Ur8\15\377\217" - "F\20\377\217F\20\377\22\14\5\327\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\6\4U@!\13\377\221M\20\377\217" - "F\20\377C\"\12\377\16\12\5\3771\33\11\377\214H\21\377\240U\23\377\240U\23" - "\377n7\17\377\37\24\10\377\11\7\4""9\0\0\0\0\0\0\0\0\11\10\4Ur8\15\377\217" - "F\20\377\217F\20\377\22\14\5\327\0\0\0\0\0\0\0\0\0\0\0\0\10\7\3\210v<\15" - "\377\232K\21\377\254W\23\377\30\21\11\314\0\0\0\0\0\0\0\0\10\7\5U_1\20\377" - "\241U\21\377\230M\21\377G\"\12\377\11\7\4\306\10\6\3X\10\6\3\216\27\17\6" - "\377\202B\17\377\227P\20\377o7\16\377\16\12\5\252\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4\244v8\17\377\221J\20\377\217F\20\377\20\14" - "\5\340\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4UU+\14\377\227" - "P\20\377\217F\20\3777\35\12\377\10\6\3\306\10\6\3]\10\6\5\255-\33\16\377" - "\307p\34\377\322|\37\377\307w\"\377\23\17\12\335\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\15\13\10\252.\34\13\377\203A\20\377\221J\20\377\211C\20" - "\377F#\13\377\14\12\5\340\7\6\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5" - "\"%\31\16\377\265d\34\377\316q\37\377\317{\40\377\307w\"\377kC\34\377\34" - "\24\13\377\34\23\11\377T)\15\377\215K\20\377\221J\20\377\237R\24\377X5\31" - "\377\15\13\10c\0\0\0\0\0\0\0\0\15\12\6Ur<\21\377\224L\21\377\217F\20\377" - "\25\16\6\377\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5\252w=\16\377\221M\20\377\207" - "H\20\377\23\15\6\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7" - "\3\216r8\15\377\217F\20\377\217F\20\377\20\14\5\332\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\13\10\6\252~>\17\377\227P\20\377p9\15\377\23\15" - "\6\377\10\6\3\220\10\6\3U\11\7\4q\10\6\3\247\10\6\3\252\10\6\3\252\11\10" - "\4q\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5[r8\15\377\221J\20\377\217F\20\377=\40" - "\12\377\11\10\4\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\14\12\7\317J$\13\377\213J\20\377O(\14\377\12\10\5\322\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4U\33\21\6\377\202B\17\377\217F\20\377\217" - "L\20\377\20\14\5\335\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\10\6\3UJ'\13\377\221M\20\377\217F\20\377)\27\10\377\7\6\4\255" - "\5\5\2U\6\5\3q\16\12\5\377\201A\16\377\221J\20\377\221J\20\377\30\20\7\252" - "\0\0\0\0\0\0\0\0\12\10\5Up9\15\377\221M\20\377\217F\20\3774\34\11\377\10" - "\6\3\306\10\6\3X\10\6\3\220\27\17\6\377\202B\17\377\227P\20\377o7\16\377" - "\12\10\5\220\0\0\0\0\0\0\0\0\6\5\3;?\"\12\377\221M\20\377\217F\20\3777\35" - "\12\377\10\6\3\306\10\6\3U\10\6\3\220\40\23\7\377\213J\20\377\233O\22\377" - "\207B\20\377\16\12\5\252\0\0\0\0\0\0\0\0\6\5\3""99\37\12\377\221M\20\377" - "\217F\20\3777\35\12\377\10\6\3\306\10\6\3X\10\6\3\220\25\17\6\377\202B\17" - "\377\217L\20\377\222K\21\377\30\17\7\270\0\0\0\0\0\0\0\0\7\6\4GB!\13\377" - "\224O\21\377\217F\20\377-\31\10\377\7\5\4\260\7\5\4U\10\6\3U\11\7\4U\10\6" - "\3R\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\3\210r8" - "\15\377\217F\20\377\217F\20\377\20\14\5\335\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\7\6\4\34\12\10\5\202\23\15\6\252\35\23\10\255\30\20\7\324\33\22" - "\10\301\24\15\7\3667\35\12\377\213J\20\377\217F\20\377\217F\20\377\22\15" - "\5\252\0\0\0\0\0\0\0\0\11\7\4Us6\16\377\217F\20\377\217F\20\377\20\14\5\335" - "\0\0\0\0\0\0\0\0\0\0\0\0\10\7\3\210r8\15\377\217F\20\377\217F\20\377\24\15" - "\5\252\0\0\0\0\0\0\0\0\11\7\4Ur8\15\377\221J\20\377\221J\20\377\21\13\6\374" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5\252w=\16\377\221" - "J\20\377\217F\20\377\22\15\5\252\0\0\0\0\0\0\0\0\11\7\4Ur8\15\377\217F\20" - "\377\217F\20\377!\24\10\377\5\4\4\303\10\6\5\306.\32\11\377~>\17\377\204" - "C\17\377#\26\10\377\11\7\4]\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5]r8\15\377\217" - "F\20\377\217F\20\377\24\15\5\252\0\0\0\0\0\0\0\0\11\7\4Ur8\15\377\217F\20" - "\377\217F\20\377\24\15\5\252\0\0\0\0\11\7\4}r8\15\377\25\15\6\322\0\0\0\0" - "\11\7\4Ur8\15\377\217F\20\377\217F\20\377\24\15\5\252\0\0\0\0\0\0\0\0\11" - "\7\4Ur8\15\377\217F\20\377\217F\20\377\20\14\5\335\0\0\0\0\0\0\0\0\0\0\0" - "\0\10\7\3\210r8\15\377\217F\20\377\217F\20\377\24\15\5\252\0\0\0\0\0\0\0" - "\0\6\5\3""99\37\12\377\221M\20\377\217F\20\377Z,\15\377\21\14\6\377\14\11" - "\5\377\24\17\11\377a3\24\377\251W\24\377\241U\21\377p6\17\377\12\10\5\216" - "\0\0\0\0\0\0\0\0\11\7\4Uy<\20\377\256X\23\377\260Y\23\377p;\21\377%\27\12" - "\377\32\20\7\377\31\22\10\377\30\17\7\377\27\20\10\377\22\15\11\306\12\11" - "\7c\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6\"\14\12\7\247\24\16\7\322\25" - "\17\6\377\32\21\7\377\30\20\7\377\32\21\7\377F#\13\377\216I\21\377\224L\21" - "\377\230M\21\377\30\17\7\252\0\0\0\0\0\0\0\0\15\12\6`\201A\22\377\252W\23" - "\377\252W\23\377\30\20\11\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\4\2L\10\6\3U\10\6" - "\3U\10\6\3U\7\5\4U\6\5\3w\20\13\5\377\201A\16\377\227I\20\377v=\17\377\16" - "\12\5\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\3\210r8\15\377\217F\20\377" - "\217F\20\377\20\14\5\335\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7qmC\32\377" - "\270Z\25\377\224L\21\3774\34\11\377\10\6\3\306\10\6\3X\10\6\3\220\25\17\6" - "\377\202B\17\377\217L\20\377\217L\20\377\20\14\5\343\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\11\10\6\252C*\24\377\312|\37\377\320\200!\377\315j\32" - "\377h:\25\377\16\13\7\332\6\5\5\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\6\4" - "\34\33\21\10\345f3\15\377\213D\20\377\217I\20\377\221J\20\377G%\14\377\32" - "\22\11\377P2\27\377\314z!\377\320s!\377\312h\31\377\225N\24\3774\36\13\377" - "\12\10\5U\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\252U+\14\377\211I\20\377M'\14\377" - "\16\12\5\343\12\10\5\252\12\10\5\306.\32\11\377\211I\20\377s;\16\377\31\20" - "\6\350\10\6\3\37\0\0\0\0\0\0\0\0\0\0\0\0\6\5\3\34\12\10\5w\23\15\6\252\35" - "\23\10\255\32\20\7\322\33\22\10\273\21\14\6\366:\36\13\377\227M\22\377\300" - "a\25\377\300a\25\377\30\20\11\317\0\0\0\0\0\0\0\0\4\4\3\3\31\20\6\353s;\16" - "\377\217I\20\377\221M\20\377l5\15\377\25\16\6\377\7\6\4\244\12\7\5U\10\7" - "\5\223\11\7\4\210\10\6\5L\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\5" - """9:!\15\377\274k\33\377\300o\37\377U3\30\377\22\15\11\273\6\5\5\24\0\0\0" - "\0\0\0\0\0\13\11\6\234\213E\22\377\236S\21\377\224L\21\377\27\17\6\252\0" - "\0\0\0\0\0\0\0\0\0\0\0\11\7\4U\23\15\6\377f3\15\377\200B\17\377Q)\14\377" - "\14\11\5\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\15\12\10Us<\30\377\242K\27\377y<\24\377\27\17\10\216\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\3\2\6\12\10\5\252]0\14\377{A\16" - "\377{<\16\377\16\12\5\343\3\3\2U\14\12\7\252\243S\30\377\307c\32\377\301" - "`\30\377)\32\16\343\6\6\5-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\3\3\2\34\13\10\6\252j2\15\377\201?\16\377\201?\16\377\35\22\10\343\6\5" - "\5\37\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\12\10\210\220I\25\377\266" - "Y\25\377c7\23\377\16\13\7\273\4\4\3\3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11" - "\7\4q].\14\377\203B\16\377y>\16\377\20\13\5\252\0\0\0\0\0\0\0\0\0\0\0\0\7" - "\6\4\34\16\12\5\343d2\15\377n;\15\377g4\16\377y;\22\377\206E\25\377\40\25" - "\13\377\6\5\5\306\12\10\7\343.\34\15\377h3\17\377`.\15\377\16\12\5\213\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\12\10\7l?%\22\377\260X\27\377\240P\25\377\24\16\11\252\0\0" - "\0\0\0\0\0\0\10\6\5OU)\14\377\203A\20\377B\"\13\377\12\10\5\252\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4\247" - "s8\20\377\245U\24\377pA\27\377\22\15\11\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\15\12\10\216\204D\25\377\242P\23\377\215F\22\377\21\14" - "\6\265\0\0\0\0\0\0\0\0\0\0\0\0\21\14\6\377g6\16\377\202B\17\377\37\24\10" - "\377\6\5\3q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\10\6\3\234#\26\10\377r:\15\377n;\15\377X-\13\377X*\13\377\\/\13\377h6" - "\15\377w:\16\377=\40\12\377\12\10\5\340\5\4\4\24\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\13\10\6Uq:\26\377\264Z\27\377\214E\21\377{?\16\377{<\16\377w8\16" - "\377x=\21\377\30\17\11\247\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\12\7\205\264" - "X\33\377\313k\36\377\307d\34\377\305h\34\377\277]\34\377\247N\30\377\204" - "D\25\377y>\22\377u<\22\377v9\21\377l2\17\377\21\14\6q\0\0\0\0\0\0\0\0\0\0" - "\0\0\16\12\5\343A!\12\377s;\16\377s;\16\377m4\16\377t9\21\377y;\22\377\213" - "D\24\377\232I\23\377s>\24\377!\27\14\377\11\10\6G\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\2\2\1\10\10\6\3\252]2\14" - "\377}@\16\377{<\16\377\16\12\5\237\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\340A!" - "\12\377s;\16\377s;\16\377m4\16\377w=\22\377\201B\24\377\224K\25\377\252T" - "\25\377\201C\26\377%\31\16\377\10\7\5""9\0\0\0\0\0\0\0\0\5\5\4\27\30\21\11" - "\377g6\22\377\204?\21\377x>\17\377b1\15\377Z-\13\377^-\15\377|<\21\377\254" - "Q\25\377\226N\31\377,\35\21\377\11\10\6[\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\10\7\3f].\14\377}@\16\377y>\16\377\22\14\5\252\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\12\5\343@!\13\377\204B" - "\21\377\236O\25\377\227F\26\377\202C\25\377n5\17\377l5\15\377v<\15\377U+" - "\14\377\25\16\6\377\7\6\4""9\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\343A!\12\377" - "\203A\20\377\225H\24\377\205D\24\377o6\20\377n5\17\377\212H\23\377\243Q\24" - "\377p:\23\377\34\24\11\377\10\7\5""9\0\0\0\0\0\0\0\0\11\7\4[`0\15\377\204" - "F\17\377{<\16\377\16\12\5\241\0\0\0\0\0\0\0\0\15\12\6U\224I\27\377\312e\33" - "\377\201C\32\377\22\15\11\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\6\5\3""0\21\14\6\343l7\15\377p7\15\377#\26\10\377\11\7\4""9" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\40\26\15\377\211" - "D\26\377\232I\23\377-\32\12\377\10\6\5\220\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3DC\"\12" - "\377s8\20\377m4\16\377\20\13\5\223\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\5\4\4\13\26\21\13\343\201L\34\377\303_\34\377\272T\27\377y;\22" - "\377k3\16\377`.\15\377Z-\13\377X-\13\377)\30\10\377\14\12\5\260\0\0\0\0\0" - "\0\0\0\0\0\0\0\10\6\3LX,\13\377}B\16\377{<\16\377\22\14\5\252\0\0\0\0\0\0" - "\0\0\0\0\0\0\11\7\4U\\/\13\377}@\16\377{<\16\377\20\13\5\226\0\0\0\0\0\0" - "\0\0\10\6\3>X-\13\377}@\16\377{<\16\377r:\15\377]2\14\377X,\13\377\\/\13" - "\377h6\15\377w:\16\377U+\14\377\25\17\6\377\7\6\4""3\0\0\0\0\0\0\0\0\0\0" - "\0\0\14\12\5\335=\40\12\377x>\17\377{=\20\377m4\16\377`.\15\377f3\15\377" - "s;\16\377{A\16\377U+\14\377\31\20\6\377\7\6\4""3\0\0\0\0\0\0\0\0\10\6\3J" - "X-\13\377}@\16\377{<\16\377r:\15\377]2\14\377X-\13\377\\/\13\377h4\15\377" - "v<\15\377U+\14\377\25\17\6\377\7\5\4(\0\0\0\0\0\0\0\0\10\6\3JX-\13\377}@" - "\16\377{<\16\377r:\15\377]2\14\377X-\13\377\\+\13\377]2\14\377]2\14\377\24" - "\15\5U\0\0\0\0\0\0\0\0\10\6\3AX-\13\377}@\16\377y>\16\377\22\15\5\252\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\12" - "\5\343;\37\12\377s>\16\377r:\15\377]2\14\377X,\13\377X,\13\377h6\15\377v" - "<\15\377{<\16\377{<\16\377\16\12\5\226\0\0\0\0\0\0\0\0\10\6\3AX-\13\377}" - "B\16\377{<\16\377\22\14\5\252\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4U\\/\13\377}" - "B\16\377{A\16\377\16\12\5\226\0\0\0\0\0\0\0\0\10\6\3AX-\13\377}B\16\377{" - "A\16\377\16\12\5\237\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\335F#\13\377\233J\24" - "\377\301Y\32\377\271[\34\377\254U\33\377\245P\30\377\233N\26\377\204B\21" - "\377Z,\15\377\25\17\6\377\7\5\4(\0\0\0\0\0\0\0\0\10\6\3JX-\13\377}@\16\377" - "y>\16\377\23\15\6\260\0\0\0\0\0\0\0\0\0\0\0\0\11\6\4\205]2\14\377\203B\16" - "\377{A\16\377\16\13\5\226\0\0\0\0\0\0\0\0\10\6\3>X-\13\377}@\16\377{<\16" - "\377v8\17\377x=\21\377\210C\25\377v9\21\377`0\15\377\\/\13\377\22\14\5U\0" - "\0\0\0\0\0\0\0\11\7\4Oh3\17\377\214B\21\377\207B\20\377\21\14\6\306\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4U\\/\13\377}B\16\377{A\16\377\16" - "\12\5\226\0\0\0\0\0\0\0\0\10\6\3AX-\13\377\207B\20\377\210C\21\377\26\16" - "\7\306\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3wX-\13\377}@\16\377{<\16\377\16\12\5" - "\237\0\0\0\0\0\0\0\0\0\0\0\0\14\12\5\322;\37\12\377s>\16\377v<\15\377h6\15" - "\377d2\15\377d2\15\377r:\15\377w?\16\377U+\14\377\25\17\6\377\7\5\4(\0\0" - "\0\0\0\0\0\0\10\6\3JX-\13\377}B\16\377{<\16\377\22\14\5\252\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\14\12\5\343;\37\12\377s>\16\377r:\15\377d2\15\377r8\15\377\205B\20\377" - "\240P\25\377\260S\25\377-\33\14\377\6\5\3\252\0\0\0\0\0\0\0\0\0\0\0\0\10" - "\6\3RX-\13\377}B\16\377{<\16\377\22\14\5\252\0\0\0\0\0\0\0\0\0\0\0\0\11\7" - "\4U\\/\13\377\203=\16\377~>\17\377\21\13\6\252\0\0\0\0\0\0\0\0\0\0\0\0\16" - "\12\5\343A!\12\377s;\16\377s>\16\377]2\14\377X,\13\377\\/\13\377h6\15\377" - "w:\16\377U+\14\377\25\17\6\377\7\6\4""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\11\7\4U\\/\13\377}B\16\377{<\16\377\22\14\5\252\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\5\4\34\23\15\6\377T*\13\377s>\16" - "\377n;\15\377]2\14\377T,\13\377j6\17\377\260T\27\377\307d\34\377\274e\37" - "\377Z6\31\377\15\12\10\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\10\6\3\244H%\13\377\203B\16\377n6\15\377\14\11\5\340\3\3\2\21\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\6\6U\36\24\15\377\276`\33\377" - "\307b\30\377yE\26\377\15\12\6\276\4\3\3\34\5\4\2i\33\21\6\377r8\15\377}@" - "\16\377-\32\12\377\10\7\5\231\0\0\0\0\0\0\0\0\0\0\0\0\12\7\5U`0\15\377}@" - "\16\377{<\16\377\20\13\5\303\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3n\\/\13\377\203" - "B\16\377{A\16\377\22\15\5\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\11\7\4U\\/\13\377}B\16\377{<\16\377\22\14\5\252\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\3c]2\14\377}B\16\377s;\16\377h6\15\377" - "X-\13\377X,\13\377\\+\13\377\\+\13\377\\+\13\377]2\14\377]2\14\377\24\15" - "\5U\0\0\0\0\0\0\0\0\10\6\3AX-\13\377}@\16\377{<\16\377s>\16\377].\14\377" - "\20\13\5\177\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\4" - "\4\34\14\12\5\366h6\15\377s;\16\377'\27\10\377\10\6\3R\0\0\0\0\0\0\0\0\0" - "\0\0\0:\37\11\377r:\15\377w?\16\377{<\16\377{A\16\377\22\14\5\252\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5" - "\343;\37\12\377s>\16\377n;\15\377X,\13\377P*\13\377X,\13\377h6\15\377s;\16" - "\377{<\16\377{<\16\377\20\13\5\226\0\0\0\0\0\0\0\0\10\6\3AX,\13\377}@\16" - "\377{<\16\377r:\15\377]2\14\377X,\13\377\\/\13\377h6\15\377w:\16\377U+\14" - "\377\25\17\6\377\7\6\4""3\0\0\0\0\0\0\0\0\0\0\0\0\14\11\5\340?\40\12\377" - "s>\16\377r8\15\377]2\14\377X,\13\377X-\13\377n;\15\377w=\16\377U+\14\377" - "\31\20\6\377\7\6\4""9\0\0\0\0\0\0\0\0\0\0\0\0\14\12\5\335;\37\12\377s>\16" - "\377r8\15\377]2\14\377X,\13\377\\/\13\377h6\15\377s;\16\377{<\16\377y>\16" - "\377\20\13\5\247\0\0\0\0\0\0\0\0\0\0\0\0\14\12\5\332;\37\12\377s>\16\377" - "n;\15\377X,\13\377P*\13\377X,\13\377X-\13\377X,\13\377\20\13\5i\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4U\\/\13\377}B\16\377{<\16\377" - "\22\14\5\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\5\4\306]2\14\377}B\16\377{<\16\377" - "\14\12\5\252\0\0\0\0\0\0\0\0\10\6\3AX-\13\377}B\16\377{A\16\377\22\14\5\252" - "\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4U\\/\13\377}B\16\377{A\16\377\16\12\5\226" - "\0\0\0\0\0\0\0\0\10\6\3AX-\13\377}B\16\377{<\16\377\22\15\5\252\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\3\2\13\11\7\4\343d2\15\377{<\16\377{<\16" - "\377\14\12\5\252\0\0\0\0\0\0\0\0\10\6\3>X-\13\377}B\16\377{<\16\377\16\12" - "\5\306\0\0\0\0\0\0\0\0\10\6\3\252#\26\10\377s;\16\377p7\15\377!\25\10\377" - "\10\6\3%\0\0\0\0\0\0\0\0\10\6\3JX-\13\377}B\16\377{A\16\377\16\12\5\226\0" - "\0\0\0\0\0\0\0\10\6\3AX-\13\377}B\16\377{A\16\377\16\13\5\223\0\0\0\0\11" - "\7\4U\\/\13\377\24\15\5\252\0\0\0\0\10\6\3>X-\13\377}B\16\377{A\16\377\16" - "\12\5\226\0\0\0\0\0\0\0\0\10\6\3AX-\13\377}B\16\377{<\16\377\22\14\5\252" - "\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4U\\/\13\377}B\16\377{<\16\377\16\12\5\237" - "\0\0\0\0\0\0\0\0\0\0\0\0\14\12\5\322;\37\12\377s;\16\377v<\15\377h6\15\377" - "f3\15\377p5\15\377z?\17\377{:\16\377U+\14\377\25\17\6\377\7\5\4-\0\0\0\0" - "\0\0\0\0\10\6\3Uq7\20\377\304\\\27\377\303`\30\377\31\21\12\377\4\3\3O\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\2\2\34\12\10\5\343" - "\212G\25\377\261W\24\377\256V\25\377\30\20\11\252\0\0\0\0\0\0\0\0\15\12\10" - "U\216I\27\377\303`\30\377\302[\27\377\30\21\13\343\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\11" - "\5\226#\26\10\377P*\13\377T,\13\377X,\13\377P*\13\377X,\13\377a2\14\377v" - "<\15\377U+\14\377\25\17\6\377\10\6\3""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11" - "\7\4U\\/\13\377}B\16\377{<\16\377\22\14\5\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\6\5\5\34\21\15\10\343D\"\13\377s;\16\377n;\15\377]2\14\377X,\13\377" - "\\/\13\377h6\15\377s;\16\377{<\16\377{A\16\377\22\14\5\252\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\11\7\252\203E\30\377\277Z\26\377\210" - "G\23\377\17\13\6\343\4\3\3\21\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\7\6\4\37\20\13\5\343h4\15\377\203B\16\377b1\15\377\12\10\5\301\3\2\2" - "D\10\7\5\252yB\32\377\303`\30\377\234J\23\377\"\25\11\377\11\7\4U\0\0\0\0" - "\0\0\0\0\0\0\0\0\10\6\3""3E#\12\377y>\16\377{<\16\377\20\13\5\343\4\3\3\34" - "\0\0\0\0\0\0\0\0\10\6\3\252\\/\13\377}@\16\377l7\15\377\16\12\5\244\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\7\5\4\306`0\15\377\206A\17\377\205B\20\377\17\13\6\252\0\0\0\0\0\0\0\0" - "\7\5\4UN'\13\377\202@\17\377\202@\17\377\206A\17\377\210C\21\377|>\21\377" - "r8\21\377q7\20\377v<\21\377k7\24\3770\35\17\377\14\12\7U\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6\252-\33\14\377\213F\24\377\203B\22\377k" - "5\16\377\23\15\6c\0\0\0\0\0\0\0\0\10\6\5U\\.\15\377\203=\16\377}@\16\377" - "\16\12\5\252\0\0\0\0\0\0\0\0\0\0\0\0:\37\11\377n;\15\377s;\16\3778\35\11" - "\377\12\10\5\343\5\4\4\27\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7\34\34\22\13\3241\34\20\377#\25\14\361\15" - "\12\6U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16" - "\12\5\216\24\16\5\252\20\14\5\244\10\6\3\34\0\0\0\0\0\0\0\0\30\20\11\216" - "\25\17\10\374\27\17\10\270\13\10\6\"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\24\16\5\252\20\13\5\252" - "\12\10\5\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\6\4\31\24\15" - "\7\223\26\17\7\252\12\10\5\216\5\4\4\3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\16\12\5\216\24\15\5\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\7\5\4\34\16\12\5\234\16\12\5\345\30\17\11\377\40\24" - "\13\377\34\22\13\364\14\11\7l\0\0\0\0\0\0\0\0\12\10\5\216\23\15\10\353\30" - "\17\7\343\12\10\5;\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\5]\27\17\10\252\34\22\11" - "\255\17\13\6\34\0\0\0\0\0\0\0\0\0\0\0\0\22\14\5\216\25\16\6\252\11\7\4\205" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\10\6\5qY,\16\377d3\25\377\15\12\10\343\6\5\5\34\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\5\5\10\21\14\6\216\32\20\7\252\22\14\5" - "\252\11\7\4\34\0\0\0\0\0\0\0\0\6\5\3U6\34\13\377\210B\23\377y;\22\377\17" - "\12\6\361\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\10\6\3""9\14\11\5\252\22\15\5\262\16\12\5\361\16\12\5\377" - "\16\12\5\374\20\13\5\303\20\13\5\252\10\6\3q\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\10\6\5\34\30\20\11\314\30\21\11\377\21\14\6\322\16\12" - "\5\252\20\13\5\252\21\13\6\366\33\21\12\366\16\12\7U\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\10\6\5\34\25\16\12\303\26\17\13\377\22\15\11\377\22\15\11\377" - "\26\17\11\377\23\15\10\377\21\14\6\377\21\13\6\377\17\13\6\377\21\14\6\377" - "\23\15\6\314\14\11\5\34\0\0\0\0\0\0\0\0\0\0\0\0\5\4\2\31\10\6\3z\16\12\5" - "\252\22\15\5\260\16\12\5\353\17\13\6\377\17\13\6\377\23\14\6\314\23\15\6" - "\252\12\10\5\252\10\6\5""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\25\15\6\252" - "\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\5\4\2\31\10\6\3}\16\12\5\252" - "\16\12\5\322\27\17\10\377\36\24\13\377\36\24\13\377\27\21\12\377\24\16\11" - "\364\20\14\11\252\11\10\6O\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\6A\17\13" - "\10\252\21\14\10\350\25\16\10\377\32\20\11\377\27\17\10\377\25\16\10\377" - "\17\13\6\377\26\17\7\262\13\11\6\252\12\10\7""9\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\12\5\216\24\15\5\252\20\13\5\252" - "\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\5\4" - "\34\10\6\3\205\17\13\6\301\24\17\11\377\34\22\13\377\36\24\13\377\32\20\11" - "\377\16\12\5\356\20\13\5\252\11\7\4\231\7\5\4""9\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\5\4\2\34\10\6\3\216\22\14\7\317\26\17\11\377\34\22\13\377\33\22" - "\12\377\22\15\7\377\17\13\6\343\25\15\6\252\12\7\5\244\7\6\4""9\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\24\15\5\252\20\14\5\252\11\7\4\34\0\0" - "\0\0\0\0\0\0\12\10\7w\225@\32\377\203?\32\377\16\13\7\343\6\5\5\34\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\5\4\34\16\12" - "\5\234\24\15\5\252\14\11\5\216\6\5\3\6\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\14\12\7\216\30\17\7\252\25\15\6\252\10\6\3L\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\11\7\6US+\20\377\260X\27\377\202>\25\377\20\13\7\252\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\10\6\34\15\12\10" - "\244\27\20\12\276\20\13\7\374\17\13\6\377\16\12\5\377\16\12\5\377\16\12\5" - "\377\20\13\5\350\16\12\5\252\10\6\3U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12" - "\5\216\25\15\6\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\16\12\5\216\24\15\5\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\16" - "\12\5\210\20\14\5\252\20\13\5\252\22\14\5\252\20\13\5\322\16\12\5\377\16" - "\12\5\371\20\14\5\301\20\13\5\252\11\7\4\231\7\5\4""9\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\5\5\4\34\10\6\3}\16\12\5\252\22\14\5\260\16\12\5\356\16\12\5" - "\366\20\14\5\303\22\15\5\252\20\13\5\252\11\7\4\226\7\5\4""6\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\16\12\5\216\20\14\5\252\20\13\5\252\22\14\5\252\20\13" - "\5\322\16\12\5\377\16\12\5\371\20\14\5\301\20\13\5\252\11\7\4\231\7\6\4""9" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\20\14\5\252\20\13\5\252\22\14" - "\5\252\20\13\5\322\16\12\5\374\14\11\5\377\20\13\5\377\24\15\5\311\13\11" - "\4\34\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\213\24\15\5\252\20\13\5\252\11\7\4" - "\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\5\5\4\34\10\6\3}\16\12\5\252\22\15\5\260\16\12\5\356\16\12\5\377\20\13" - "\5\353\22\15\5\255\20\13\5\252\20\14\5\252\20\13\5\244\11\7\4\34\0\0\0\0" - "\0\0\0\0\0\0\0\0\14\11\5\216\25\15\6\252\20\13\5\252\11\7\4\34\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\24\15\5\252\20\13\5\252\11\7\4\34\0\0" - "\0\0\0\0\0\0\0\0\0\0\14\11\5\216\25\15\6\252\20\13\5\252\11\7\4\34\0\0\0" - "\0\0\0\0\0\0\0\0\0\6\5\3\34\10\7\5\213\23\15\10\301\25\17\12\377\37\25\14" - "\377\40\25\15\377\37\24\14\377\27\21\12\377\22\14\7\324\12\10\5\237\7\6\4" - """9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\25\15\6\252\20\13\5\252\11" - "\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\25\15\6\252\20\14\5\252" - "\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\210\20\14\5\252\20\13\5\252\22" - "\14\5\260\21\14\6\374\25\16\10\377\21\14\6\377\20\13\5\377\24\15\5\314\13" - "\11\4\34\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\25\16\6\252\22\14\5\252\11\10" - "\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\24\15\5" - "\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\14\11\5\216\25\15\6\252" - "\20\14\5\252\12\10\5\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\11\5\216\24\15" - "\5\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\5\5\4\34\10\6\3}\16" - "\12\5\252\22\14\5\252\24\16\5\255\20\14\5\301\24\15\5\262\24\15\5\252\20" - "\13\5\252\11\7\4\231\7\6\4""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216" - "\25\15\6\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\5\4\34\10\6\3}\16\12" - "\5\252\22\15\5\252\24\16\5\252\22\14\5\252\15\12\6\343H&\23\377\271V\40\377" - "\220@\35\377\24\17\13\350\10\7\7\34\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\25" - "\15\6\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216" - "\24\15\5\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\5\4\2\31\10\6" - "\3z\16\12\5\252\22\15\5\260\16\12\5\356\16\12\5\377\16\12\5\371\20\14\5\301" - "\20\13\5\252\11\7\4\231\7\5\4""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\25\15\6\252\20\13\5\252\11\7\4\34\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3""9\11\7\4\244" - "\16\12\5\252\22\15\5\255\16\12\5\345\16\12\5\377\21\14\6\377\26\17\11\377" - "\24\16\11\374\25\17\12\260\13\11\6\213\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\10\4z\22\14\5\252\16\12\5\226\7\5\4\34" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\7""9" - "\30\20\13\255\32\22\11\276\15\12\6\216\5\4\4\13\0\0\0\0\0\0\0\0\10\7\3D\16" - "\12\5\252\20\13\5\252\11\7\4J\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16" - "\12\5\216\24\16\5\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\16\12\5\216\24\16\5\252\20\13\5\252\11\10\4\34\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\24\15\5\252\20\13\5\252\11\7" - "\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216" - "\22\15\5\252\20\14\5\252\22\15\5\255\16\12\5\343\16\12\5\377\16\12\5\374" - "\14\11\5\377\14\11\5\377\20\13\5\377\24\15\5\311\13\11\4\34\0\0\0\0\0\0\0" - "\0\0\0\0\0\14\12\5\210\20\14\5\252\20\13\5\252\20\13\5\301\25\17\6\270\16" - "\12\5\37\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\10\6\3\2136\36\11\377k2\14\377N'\13\377\11\7\4\241\0\0\0\0\0\0\0\0\0\0\0" - "\0\24\15\5\216\22\14\5\322\20\13\5\252\20\13\5\252\20\13\5\252\11\7\4\34" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\12\10""9\11\7" - "\6\237\10\6\5\237\12\10\7\202\12\10\7w\11\7\6\205\11\7\6\247\12\10\7\252" - "\13\11\10q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\5\4\2\34\10\6\3}\16\12\5\252\22\15\5\260\16\12" - "\5\356\16\12\5\377\20\13\5\353\22\15\5\255\20\13\5\252\20\14\5\252\20\13" - "\5\244\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\210\20\14\5\252\20\13\5" - "\252\22\14\5\252\20\13\5\322\16\12\5\377\16\12\5\371\20\14\5\301\20\13\5" - "\252\11\7\4\231\7\5\4""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\5\4\34\10\6\3" - "}\16\12\5\252\22\15\5\260\16\12\5\356\16\12\5\377\16\12\5\371\20\13\5\301" - "\20\13\5\252\11\7\4\226\7\5\4""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\5\4\34" - "\10\6\3}\16\12\5\252\22\15\5\260\16\12\5\356\16\12\5\377\16\12\5\353\22\15" - "\5\255\20\13\5\252\20\14\5\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0" - "\0\0\5\5\4\34\10\6\3}\16\12\5\252\22\15\5\260\16\12\5\353\16\12\5\377\16" - "\12\5\377\20\13\5\377\24\15\5\317\14\11\5\"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\24\15\5\252\20\13\5\252\11\7\4\34" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\5\3U\7\5\4U\6" - "\5\3U\5\4\4U\5\4\4i\11\10\4\361H%\13\377n6\15\377C\"\12\377\10\6\3\220\0" - "\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\25\16\6\252\20\14\5\252\11\10\4\34\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\25\15\6\252\20\13\5\252\11\7\4\34" - "\0\0\0\0\0\0\0\0\0\0\0\0\14\11\5\216\25\15\6\252\20\13\5\252\11\7\4\34\0" - "\0\0\0\0\0\0\0\0\0\0\0\7\5\2%\10\6\3\216\10\6\3\343\31\17\6\377K$\12\377" - "c3\14\377B!\11\377\10\6\3\202\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\213\25\15\6" - "\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\10\6\3O\16\12\5\252\22" - "\15\5\252\14\11\5\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\5\216\25\15\6" - "\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\14\11\5\216\25\15\6\252" - "\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\24\15\5U\13\10\4\34\0\0\0\0\0\0\0" - "\0\14\11\5\216\25\15\6\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0" - "\14\11\5\216\25\15\6\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\16\12\5\216\24\15\5\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0" - "\0\0\5\5\4\34\10\6\3}\16\12\5\252\22\14\5\252\24\16\5\255\20\14\5\301\24" - "\15\5\262\24\15\5\252\20\13\5\252\11\7\4\241\7\6\4""9\0\0\0\0\0\0\0\0\0\0" - "\0\0\10\6\3UT(\15\377\244I\27\377\270O\33\377\17\13\10\366\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\12\12\252\260" - "S%\377\304W!\377\300X\37\377\26\17\13\301\0\0\0\0\0\0\0\0\0\0\0\0\25\17\12" - "\237\32\21\13\377\30\21\13\335\12\10\7U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\7\3;\14\11\5\252" - "\20\13\5\322\16\12\5\377\16\12\5\377\16\12\5\377\16\12\5\366\20\14\5\301" - "\20\13\5\252\11\7\4\231\6\5\3""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\16\12\5\216\24\15\5\252\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\6\5\3\34\10\6\3\177\16\12\5\252\22\15\5\260\16\12" - "\5\356\16\12\5\377\16\12\5\353\22\15\5\255\20\13\5\252\20\14\5\252\20\13" - "\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\16\13\7\216\35\23\10\252\21\13\6\237\10\6\3\34\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\5\4\34\16\12\5\226\24\15\5\252\14" - "\11\5\216\5\4\2\16\0\0\0\0\0\0\0\0\17\13\10\216\32\22\11\262\23\15\6\252" - "\10\6\3D\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\22\14\5\216\20\13\5\356" - "\20\13\5\252\11\7\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\11\5\216\20\13" - "\5\327\22\15\5\273\13\11\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\4\4\3\6\5\4" - "\2R\5\4\2U\5\4\2U\5\4\2U\5\4\2c\11\7\4\361H%\13\377p5\15\377M'\14\377\12" - "\10\5\252\0\0\0\0\0\0\0\0\0\0\0\0\23\15\10\270\24\16\11\377\20\13\7\377\16" - "\13\7\377\21\14\10\377\26\17\11\377\33\21\12\377\36\23\13\377\34\22\13\377" - "\25\17\12\377\17\14\10\306\11\7\6\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\10\6\5[\17\13\6\252\16\13\5\356\23\15\6\306\14\11\5\34\0\0\0" - "\0\0\0\0\0\6\5\3U6\35\11\377d0\15\377m4\16\377\17\13\6\252\0\0\0\0\0\0\0" - "\0\0\0\0\0\23\15\6\220\16\12\5\377\20\13\5\262\10\6\3w\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\11\7Xc,\24\377" - "\32\20\13\350\5\4\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\5\3""9<" - "\34\13\377\236C\27\377X,\27\377\13\11\6\216\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\11" - "\7n~3\31\377\31\21\14\350\5\4\4\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\5\5\34\23\16\12\3434\35\21\377" - "\36\24\15\377\11\10\6R\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\12\11\252" - "\254Q1\377\325}^\377\271X:\377\27\20\16\237\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\4\2\34\20\13\5\364D" - "\"\11\377>!\11\377\11\10\4\213\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\12\10\7""0G!\22\377l/\27\377k0\26\377q3\30\377m2\30\377h-\25\377h" - "-\25\377q1\30\377s2\30\377\22\15\11\210\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\11\7\6\"\22\15\11\364B\37\17\377T%\21\377S$\20\377K\"\16\377" - "I#\16\377[)\20\377n/\23\377O(\20\377\30\20\11\377\10\6\5""9\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\26\16\5\364(\27\7\377*\27\7\377" - "6\34\11\377<\37\11\377$\26\7\377\14\11\5\364\6\5\3\34\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\6UH\"\15\377~8\25\377\224" - "?\31\377\31\21\16\276\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\17\14\14\205\262V9\377\310Y7\377\302R/\377\36\24\21" - "\273\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4c\21\14" - "\6\377*\26\11\3771\31\11\3776\32\13\3774\32\13\377;\34\14\377R%\17\377o1" - "\22\377T'\21\377\31\21\12\377\10\7\5""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\5\3""9&\26\7\377U'\14\377" - "|4\25\377\24\15\11\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\10\6\5\34\32\20\13\252\13\10\6U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\14\10\5w\24\16\11\252\14\11\7\216\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\11\7\6\34\33\21\14\252\13\11\10U\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\7\6\6\34\10\7\5U\10\6\5""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\31\21\20\241)\33\32\377(\32\27\353\16\14\13R\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10" - "\6\3%\11\7\4\216\11\7\4\210\6\5\3\6\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\27\17\12\231\23\15\12\377\20\13\11\377\20\13\11\377\20" - "\13\11\377\20\13\11\377\20\13\11\377\22\15\11\377\30\20\13\314\20\13\11\37" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\10\7\216\22\14" - "\11\317\22\15\11\377\20\13\11\377\17\13\10\377\17\13\10\374\22\15\11\303" - "\22\14\11\252\13\10\6\247\10\7\5""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\11\10\4\216\16\12\5\252\15\12\6\252\15\11\6\252" - "\13\10\6\252\7\6\4\202\6\5\3\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\12\7\216\25\16\12\252\23\15\12" - "\252\16\13\11\37\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\10\7\10\16\31\21\20\216\33\22\20\301\32\22\17\252\17\13" - "\12\"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\7\4\34\13" - "\10\6\252\16\12\7\350\17\12\10\377\17\12\10\377\17\12\10\377\17\12\10\374" - "\22\14\11\303\22\14\11\252\13\10\6\247\11\7\6""9\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\11\7\4[\20\13\7\252\24\15\11\252\15\12\10\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0", -}; - diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/tools/Makefile.devel kodi-visualization-goom-2.1.0/lib/goom2k4-0/tools/Makefile.devel --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/tools/Makefile.devel 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/tools/Makefile.devel 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ -minicompress:minicompress.c - gcc -o minicompress -Wall minicompress.c - -clean: - rm -f *~ *.o minicompress diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/tools/minicompress.c kodi-visualization-goom-2.1.0/lib/goom2k4-0/tools/minicompress.c --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/tools/minicompress.c 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/tools/minicompress.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,65 +0,0 @@ -#include -#include - -#define THE_FILE "gfont.c" -#define THE_FONT the_font -#define THE_FONTS "the_font" - -#include THE_FILE - -int main (int argc, char **argv) { - int i = 1; - int size = 0; - unsigned char pc = the_font.pixel_data[0]; - int nbz = 0; - unsigned char *rle; - rle = malloc (the_font.width*the_font.height*the_font.bytes_per_pixel); - - while (i < the_font.width *the_font.height*the_font.bytes_per_pixel) { - unsigned char c = the_font.pixel_data[i]; - if (pc==0) { - nbz ++; - if (c==0) { - if (nbz == 0xff) { - rle [size++] = 0; - rle [size++] = nbz; - nbz = 0; - } - } - else { - rle [size++] = 0; - rle [size++] = nbz; - nbz = 0; - } - } - else { - rle [size++] = pc; - } - pc = c; - i++; - } - - printf ("/* RGBA C-Source image dump (with zRLE compression) */\n" - "static const struct {\n" - " unsigned int width;\n" - " unsigned int height;\n" - " unsigned int bytes_per_pixel;\n" - " unsigned int rle_size;\n" - " unsigned char rle_pixel [%i];\n", size); - printf ("} " THE_FONTS " = {\n" - "%i, %i, %i, %i, {\n", - the_font.width,the_font.height,the_font.bytes_per_pixel,size); - - printf ("%i",rle[0]); - for (i=1;i= 0.9.5.1 -BuildPrereq: xmms-devel, gtk+-devel - -%description -A great visual plugins for XMMS. - -%prep -%setup -q -n %{name}_%{version} - -%build -%configure --libdir=%{_xmmsoutputdir} -make - -%install -rm -rf %{buildroot} -%makeinstall libdir=%{buildroot}/%{_xmmsoutputdir} -strip %{buildroot}/%{_xmmsoutputdir}/*.so - -%clean -rm -rf %{buildroot} - -%files -%defattr(-,root,root) -%doc AUTHORS COPYING ChangeLog NEWS README doc -%{_xmmsoutputdir}/libgoom.* - -%changelog -* Sun Jan 6 2002 Matthias Saou -- Initial RPM release. - diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/xmms-goom/Makefile.am kodi-visualization-goom-2.1.0/lib/goom2k4-0/xmms-goom/Makefile.am --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/xmms-goom/Makefile.am 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/xmms-goom/Makefile.am 1970-01-01 00:00:00.000000000 +0000 @@ -1,11 +0,0 @@ -# the xmms plugin - -if HAVE_XMMS -xmms_lib_LTLIBRARIES = libxmmsgoom2.la -xmms_libdir = $(XMMS_VISUALIZATION_PLUGIN_DIR) -libxmmsgoom2_la_LIBADD = $(top_builddir)/src/libgoom2.la $(XMMS_LIBS) -libxmmsgoom2_la_SOURCES = xmms_goom.c -INCLUDES=-DDATADIR=\"@XMMS_DATA_DIR@\" @XMMS_CFLAGS@ -Wall -I../src/ -endif - -libxmmsgoom2_la_LDFLAGS = -module -avoid-version diff -Nru kodi-visualization-goom-1.1.0/lib/goom2k4-0/xmms-goom/xmms_goom.c kodi-visualization-goom-2.1.0/lib/goom2k4-0/xmms-goom/xmms_goom.c --- kodi-visualization-goom-1.1.0/lib/goom2k4-0/xmms-goom/xmms_goom.c 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/goom2k4-0/xmms-goom/xmms_goom.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,130 +0,0 @@ -#include -#include "goom_config.h" - -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -static void plug_init (void); -static void plug_cleanup (void); -static void plug_render_pcm (gint16 data[2][512]); - -static int fd_in, fd_out; -static pid_t goom_pid = -1; - -static VisPlugin plug_vp = { - NULL, - NULL, - 0, - "What A GOOM!! " VERSION, - 2, - 0, - plug_init,/* init */ - plug_cleanup,/* cleanup */ - NULL,/* about */ - NULL,/* configure */ - NULL,/* disable_plugin */ - NULL,/* playback_start */ - NULL,/* playback_stop */ - plug_render_pcm, /* render_pcm */ - NULL /* render_freq */ -}; - -VisPlugin * -get_vplugin_info (void) -{ - return &plug_vp; -} - -static void -plug_init (void) -{ - int fd[2]; - pid_t pid; - - /* create a pipe */ - if (pipe(fd) < 0) { - fprintf (stderr, "System Error\n"); - /* TODO: en gtk? */ - return; - } - fd_in = fd[0]; - fd_out = fd[1]; - - /* load an executable */ - pid = fork(); - - /* todo look at the result */ - if (pid == 0) { - dup2(fd_in, 0); - - execlp ("goom2", "goom2", NULL, 0); - fprintf (stderr, "Unable to load goom...\n"); /* TODO: Message en gtk - check the PATH */ - exit (1); - } - if (pid == -1) { - /* erreur system : TODO -> dialog en gtk */ - } - if (goom_pid != -1) - kill (goom_pid, SIGQUIT); - goom_pid = pid; -} - -static void sendIntToGoom(int i) { - write (fd_out, &i, sizeof(int)); -} - -static void -plug_cleanup (void) -{ - sendIntToGoom(2); - kill (goom_pid, SIGQUIT); - goom_pid = -1; -} - -static void -plug_render_pcm (gint16 data[2][512]) -{ - fd_set rfds; - struct timeval tv; - int retval; - - tv.tv_sec = 0; - tv.tv_usec = 10000; - - FD_ZERO(&rfds); - FD_SET(fd_out, &rfds); - retval = select(fd_out+1, NULL, &rfds, NULL, &tv); - if (retval) { - /* send sound datas to goom */ - { - sendIntToGoom(0); - write (fd_out, &data[0][0], 512*sizeof(gint16)*2); - fsync(fd_out); - } - - /* send song title to goom */ - { - static int spos = -1; - int pos = xmms_remote_get_playlist_pos(plug_vp.xmms_session); - char title[2048]; - if (spos != pos) { - sendIntToGoom(1); - strcpy(title, xmms_remote_get_playlist_title(plug_vp.xmms_session, pos)); - write (fd_out, &title[0], 2048); - spos = pos; - } - } - } - else { - usleep(100); - } -} diff -Nru kodi-visualization-goom-1.1.0/lib/kodi/gui/gl/GL.h kodi-visualization-goom-2.1.0/lib/kodi/gui/gl/GL.h --- kodi-visualization-goom-1.1.0/lib/kodi/gui/gl/GL.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/kodi/gui/gl/GL.h 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,105 @@ +/* + * Copyright (C) 2005-2019 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +#pragma once + +//============================================================================== +/// +/// \defgroup cpp_kodi_gui_gl Kodi OpenGL helpers +/// \ingroup cpp_kodi_gui +/// \brief Auxiliary functions for Open GL +/// +/// This group includes help for definitions, functions, and classes for +/// OpenGL. +/// +/// To use OpenGL for your system, add the \ref GL.h "#include ". +/// +/// +///----------------------------------------------------------------------------- +/// +/// The \ref HAS_GL is declared if Open GL is required and \ref HAS_GLES if Open GL +/// Embedded Systems (ES) is required, with ES the version is additionally given +/// in the definition, this can be "2" or "3". +/// +/// +///----------------------------------------------------------------------------- +/// +/// Following \ref GL_TYPE_STRING define can be used, for example, to manage +/// different folders for GL and GLES and make the selection easier. +/// This are on OpenGL **"`GL`"** and on Open GL|ES **"`GLES`"**. +/// **Example:** +/// ~~~~~~~~~~~~~~~~~{.cpp} +/// kodi::GetAddonPath("resources/shaders/" GL_TYPE_STRING "/frag.glsl"); +/// ~~~~~~~~~~~~~~~~~ +/// +/// +///---------------------------------------------------------------------------- +/// +/// In addition, \ref BUFFER_OFFSET is declared in it which can be used to give an +/// offset on the array to GL. +/// **Example:** +/// ~~~~~~~~~~~~~~~~~{.cpp} +/// const struct PackedVertex { +/// float position[3]; // Position x, y, z +/// float color[4]; // Color r, g, b, a +/// } vertices[3] = { +/// { { -0.5f, -0.5f, 0.0f }, { 1.0f, 0.0f, 0.0f, 1.0f } }, +/// { { 0.5f, -0.5f, 0.0f }, { 0.0f, 1.0f, 0.0f, 1.0f } }, +/// { { 0.0f, 0.5f, 0.0f }, { 0.0f, 0.0f, 1.0f, 1.0f } } +/// }; +/// +/// glVertexAttribPointer(m_aPosition, 3, GL_FLOAT, GL_FALSE, sizeof(PackedVertex), BUFFER_OFFSET(offsetof(PackedVertex, position))); +/// glEnableVertexAttribArray(m_aPosition); +/// +/// glVertexAttribPointer(m_aColor, 4, GL_FLOAT, GL_FALSE, sizeof(PackedVertex), BUFFER_OFFSET(offsetof(PackedVertex, color))); +/// glEnableVertexAttribArray(m_aColor); +/// ~~~~~~~~~~~~~~~~~ + +#if HAS_GL + #define GL_TYPE_STRING "GL" + // always define GL_GLEXT_PROTOTYPES before include gl headers + #if !defined(GL_GLEXT_PROTOTYPES) + #define GL_GLEXT_PROTOTYPES + #endif + #if defined(TARGET_LINUX) + #include + #include + #elif defined(TARGET_FREEBSD) + #include + #elif defined(TARGET_DARWIN) + #include + #include + #elif defined(WIN32) + #error Use of GL under Windows is not possible + #endif +#elif HAS_GLES >= 2 + #define GL_TYPE_STRING "GLES" + #if defined(WIN32) + #error Use of GLES under Windows is not possible + #elif defined(TARGET_DARWIN) + #if HAS_GLES == 3 + #include + #include + #else + #include + #include + #endif + #else + #if HAS_GLES == 3 + #include + #include + #else + #include + #include + #endif + #endif +#endif + +#ifndef BUFFER_OFFSET +#define BUFFER_OFFSET(i) ((char *)nullptr + (i)) +#endif diff -Nru kodi-visualization-goom-1.1.0/lib/kodi/gui/gl/Shader.h kodi-visualization-goom-2.1.0/lib/kodi/gui/gl/Shader.h --- kodi-visualization-goom-1.1.0/lib/kodi/gui/gl/Shader.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/lib/kodi/gui/gl/Shader.h 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,594 @@ +/* + * Copyright (C) 2005-2019 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +#pragma once + +#include "GL.h" + +#include +#include +#include + +#include +#include + +#define LOG_SIZE 1024 +#define GLchar char + +namespace kodi +{ +namespace gui +{ +namespace gl +{ + +//======================================================================== +/// CShader - base class +class ATTRIBUTE_HIDDEN CShader +{ +public: + CShader() = default; + virtual ~CShader() = default; + virtual bool Compile(const std::string& extraBegin = "", + const std::string& extraEnd = "") = 0; + virtual void Free() = 0; + virtual GLuint Handle() = 0; + + bool LoadSource(const std::string& file) + { + char buffer[16384]; + + kodi::vfs::CFile source; + if (!source.OpenFile(file)) + { + kodi::Log(ADDON_LOG_ERROR, "CShader::%s: Failed to open file '%s'", __FUNCTION__, file.c_str()); + return false; + } + size_t len = source.Read(buffer, sizeof(buffer)); + m_source.assign(buffer); + m_source[len] = 0; + source.Close(); + return true; + } + + bool OK() const { return m_compiled; } + +protected: + std::string m_source; + std::string m_lastLog; + bool m_compiled = false; +}; +//------------------------------------------------------------------------ + +//======================================================================== +/// CVertexShader +class ATTRIBUTE_HIDDEN CVertexShader : public CShader +{ +public: + CVertexShader() = default; + ~CVertexShader() override { Free(); } + + void Free() override + { + if (m_vertexShader) + glDeleteShader(m_vertexShader); + m_vertexShader = 0; + } + + bool Compile(const std::string& extraBegin = "", + const std::string& extraEnd = "") override + { + GLint params[4]; + + Free(); + + m_vertexShader = glCreateShader(GL_VERTEX_SHADER); + + GLsizei count = 0; + const char *sources[3]; + if (!extraBegin.empty()) + sources[count++] = extraBegin.c_str(); + if (!m_source.empty()) + sources[count++] = m_source.c_str(); + if (!extraEnd.empty()) + sources[count++] = extraEnd.c_str(); + + glShaderSource(m_vertexShader, count, sources, nullptr); + glCompileShader(m_vertexShader); + glGetShaderiv(m_vertexShader, GL_COMPILE_STATUS, params); + if (params[0] != GL_TRUE) + { + GLchar log[LOG_SIZE]; + glGetShaderInfoLog(m_vertexShader, LOG_SIZE, nullptr, log); + kodi::Log(ADDON_LOG_ERROR, "CVertexShader::%s: %s", __FUNCTION__, log); + fprintf(stderr, "CVertexShader::%s: %s\n", __FUNCTION__, log); + m_lastLog = log; + m_compiled = false; + } + else + { + GLchar log[LOG_SIZE]; + glGetShaderInfoLog(m_vertexShader, LOG_SIZE, nullptr, log); + m_lastLog = log; + m_compiled = true; + } + return m_compiled; + } + + GLuint Handle() override { return m_vertexShader; } + +protected: + GLuint m_vertexShader = 0; +}; +//------------------------------------------------------------------------ + +//======================================================================== +/// CPixelShader +class ATTRIBUTE_HIDDEN CPixelShader : public CShader +{ +public: + CPixelShader() = default; + ~CPixelShader() { Free(); } + void Free() override + { + if (m_pixelShader) + glDeleteShader(m_pixelShader); + m_pixelShader = 0; + } + + bool Compile(const std::string& extraBegin = "", + const std::string& extraEnd = "") override + { + GLint params[4]; + + Free(); + + m_pixelShader = glCreateShader(GL_FRAGMENT_SHADER); + + GLsizei count = 0; + const char *sources[3]; + if (!extraBegin.empty()) + sources[count++] = extraBegin.c_str(); + if (!m_source.empty()) + sources[count++] = m_source.c_str(); + if (!extraEnd.empty()) + sources[count++] = extraEnd.c_str(); + + glShaderSource(m_pixelShader, count, sources, 0); + glCompileShader(m_pixelShader); + glGetShaderiv(m_pixelShader, GL_COMPILE_STATUS, params); + if (params[0] != GL_TRUE) + { + GLchar log[LOG_SIZE]; + glGetShaderInfoLog(m_pixelShader, LOG_SIZE, nullptr, log); + kodi::Log(ADDON_LOG_ERROR, "CPixelShader::%s: %s", __FUNCTION__, log); + fprintf(stderr, "CPixelShader::%s: %s\n", __FUNCTION__, log); + m_lastLog = log; + m_compiled = false; + } + else + { + GLchar log[LOG_SIZE]; + glGetShaderInfoLog(m_pixelShader, LOG_SIZE, nullptr, log); + m_lastLog = log; + m_compiled = true; + } + return m_compiled; + } + + GLuint Handle() override { return m_pixelShader; } + +protected: + GLuint m_pixelShader = 0; +}; +//------------------------------------------------------------------------ + +//============================================================================ +/// +/// \defgroup cpp_kodi_gui_gl_CShaderProgram GL Shader Program +/// \ingroup cpp_kodi_gui_gl +/// @brief \cpp_class{ kodi::gui::gl::CShaderProgram } +/// **Class to manage an OpenGL shader program** +/// +/// With this class the used GL shader code can be defined on the GPU and +/// its variables can be managed between CPU and GPU. +/// +/// It has the header \ref Shader.h "#include " +/// be included to enjoy it. +/// +/// ---------------------------------------------------------------------------- +/// +/// Example: +/// +/// ~~~~~~~~~~~~~{.cpp} +/// +/// #include +/// ... +/// +/// class ATTRIBUTE_HIDDEN CExample +/// : ..., +/// public kodi::gui::gl::CShaderProgram +/// { +/// public: +/// CExample() = default; +/// +/// bool Start(); +/// void Render(); +/// +/// // override functions for kodi::gui::gl::CShaderProgram +/// void OnCompiledAndLinked() override; +/// bool OnEnabled() override; +/// +/// private: +/// ... +/// GLint m_aPosition = -1; +/// GLint m_aColor = -1; +/// }; +/// +/// bool CExample::Start() +/// { +/// // Define shaders and load +/// std::string fraqShader = kodi::GetAddonPath("resources/shaders/" GL_TYPE_STRING "/glsl.frag"); +/// std::string vertShader = kodi::GetAddonPath("resources/shaders/" GL_TYPE_STRING "/glsl.vert"); +/// if (!LoadShaderFiles(vertShader, fraqShader) || !CompileAndLink()) +/// return false; +/// +/// ... +/// return true; +/// } +/// +/// ... +/// +/// void CExample::Render() +/// { +/// ... +/// +/// EnableShader(); +/// ... +/// DO WORK +/// ... +/// DisableShader(); +/// } +/// +/// void CExample::OnCompiledAndLinked() +/// { +/// ... +/// DO YOUR WORK HERE FOR WHAT IS ONE TIME REQUIRED DURING COMPILE OF SHADER, E.G.: +/// +/// m_aPosition = glGetAttribLocation(ProgramHandle(), "a_position"); +/// m_aColor = glGetAttribLocation(ProgramHandle(), "a_color"); +/// } +/// +/// bool OnEnabled() override +/// { +/// ... +/// DO YOUR WORK HERE FOR WHAT REQUIRED DURING ENABLE OF SHADER +/// ... +/// return true; +/// } +/// +/// ADDONCREATOR(CExample); +/// ~~~~~~~~~~~~~ +/// + +//======================================================================== +/// CShaderProgram +class ATTRIBUTE_HIDDEN CShaderProgram +{ +public: + //========================================================================== + /// + /// \ingroup cpp_kodi_gui_gl_CShaderProgram + /// @brief Construct a new shader + /// + /// Load must be done later with \ref LoadShaderFiles. + /// + CShaderProgram() = default; + //-------------------------------------------------------------------------- + + //========================================================================== + /// + /// \ingroup cpp_kodi_gui_gl_CShaderProgram + /// @brief Construct a new shader and load defined shader files + /// + /// @param[in] vert Path to used GL vertext shader + /// @param[in] frag Path to used GL fragment shader + /// + CShaderProgram(const std::string& vert, const std::string& frag) + { + LoadShaderFiles(vert, frag); + } + //-------------------------------------------------------------------------- + + //========================================================================== + /// + /// \ingroup cpp_kodi_gui_gl_CShaderProgram + /// @brief Destructor + /// + virtual ~CShaderProgram() + { + ShaderFree(); + } + //-------------------------------------------------------------------------- + + //========================================================================== + /// + /// \ingroup cpp_kodi_gui_gl_CShaderProgram + /// @brief To load manually the needed shader files + /// + /// @param[in] vert Path to used GL vertext shader + /// @param[in] frag Path to used GL fragment shader + /// + /// + /// @note The use of the files is optional, but it must either be passed over + /// here or via \ref CompileAndLink, or both of the source code. + /// + bool LoadShaderFiles(const std::string& vert, const std::string& frag) + { + if (!kodi::vfs::FileExists(vert) || !m_pVP.LoadSource(vert)) + { + kodi::Log(ADDON_LOG_ERROR, "%s: Failed to load '%s'", __func__, vert.c_str()); + return false; + } + + if (!kodi::vfs::FileExists(frag) || !m_pFP.LoadSource(frag)) + { + kodi::Log(ADDON_LOG_ERROR, "%s: Failed to load '%s'", __func__, frag.c_str()); + return false; + } + + return true; + } + //-------------------------------------------------------------------------- + + //========================================================================== + /// + /// \ingroup cpp_kodi_gui_gl_CShaderProgram + /// @brief To compile and link the shader to the GL interface + /// + /// Optionally, additional source code can be transferred here, or it can be + /// used independently without any files + /// + /// @param[in] vertexExtraBegin [opt] To additionally add vextex source + /// code to the beginning of the loaded file + /// source code + /// @param[in] vertexExtraEnd [opt] To additionally add vextex source + /// code to the end of the loaded file + /// source code + /// @param[in] fragmentExtraBegin [opt] To additionally add fragment source + /// code to the beginning of the loaded file + /// source code + /// @param[in] fragmentExtraEnd [opt] To additionally add fragment source + /// code to the end of the loaded file + /// source code + /// @return true if compile was successed + /// + /// + /// @note In the case of a compile error, it will be written once into the Kodi + /// log and in addition to the console output to quickly detect the errors when + /// writing the damage. + /// + /// + bool CompileAndLink(const std::string& vertexExtraBegin = "", + const std::string& vertexExtraEnd = "", + const std::string& fragmentExtraBegin = "", + const std::string& fragmentExtraEnd = "") + { + GLint params[4]; + + // free resources + ShaderFree(); + m_ok = false; + + // compiled vertex shader + if (!m_pVP.Compile(vertexExtraBegin, vertexExtraEnd)) + { + kodi::Log(ADDON_LOG_ERROR, "GL: Error compiling vertex shader"); + return false; + } + + // compile pixel shader + if (!m_pFP.Compile(fragmentExtraBegin, fragmentExtraEnd)) + { + m_pVP.Free(); + kodi::Log(ADDON_LOG_ERROR, "GL: Error compiling fragment shader"); + return false; + } + + // create program object + m_shaderProgram = glCreateProgram(); + if (!m_shaderProgram) + { + kodi::Log(ADDON_LOG_ERROR, "CShaderProgram::%s: Failed to create GL program", __FUNCTION__); + ShaderFree(); + return false; + } + + // attach the vertex shader + glAttachShader(m_shaderProgram, m_pVP.Handle()); + glAttachShader(m_shaderProgram, m_pFP.Handle()); + + // link the program + glLinkProgram(m_shaderProgram); + glGetProgramiv(m_shaderProgram, GL_LINK_STATUS, params); + if (params[0] != GL_TRUE) + { + GLchar log[LOG_SIZE]; + glGetProgramInfoLog(m_shaderProgram, LOG_SIZE, nullptr, log); + kodi::Log(ADDON_LOG_ERROR, "CShaderProgram::%s: %s", __FUNCTION__, log); + fprintf(stderr, "CShaderProgram::%s: %s\n", __FUNCTION__, log); + ShaderFree(); + return false; + } + + m_validated = false; + m_ok = true; + OnCompiledAndLinked(); + return true; + } + //-------------------------------------------------------------------------- + + //========================================================================== + /// + /// \ingroup cpp_kodi_gui_gl_CShaderProgram + /// @brief To activate the shader and use it on the GPU + /// + /// @return true if enable was successfull done + /// + /// + /// @note During this call, the \ref OnEnabled stored in the child is also + /// called + /// + bool EnableShader() + { + if (ShaderOK()) + { + glUseProgram(m_shaderProgram); + if (OnEnabled()) + { + if (!m_validated) + { + // validate the program + GLint params[4]; + glValidateProgram(m_shaderProgram); + glGetProgramiv(m_shaderProgram, GL_VALIDATE_STATUS, params); + if (params[0] != GL_TRUE) + { + GLchar log[LOG_SIZE]; + glGetProgramInfoLog(m_shaderProgram, LOG_SIZE, nullptr, log); + kodi::Log(ADDON_LOG_ERROR, "CShaderProgram::%s: %s", __FUNCTION__, log); + fprintf(stderr, "CShaderProgram::%s: %s\n", __FUNCTION__, log); + } + m_validated = true; + } + return true; + } + else + { + glUseProgram(0); + return false; + } + return true; + } + return false; + } + //-------------------------------------------------------------------------- + + //========================================================================== + /// + /// \ingroup cpp_kodi_gui_gl_CShaderProgram + /// @brief To deactivate the shader use on the GPU + /// + void DisableShader() + { + if (ShaderOK()) + { + glUseProgram(0); + OnDisabled(); + } + } + //-------------------------------------------------------------------------- + + //========================================================================== + /// + /// \ingroup cpp_kodi_gui_gl_CShaderProgram + /// @brief Used to check if shader has been loaded before. + /// + /// @return true if enable was successfull done + /// + /// @note The CompileAndLink call sets these values + /// + ATTRIBUTE_FORCEINLINE bool ShaderOK() const { return m_ok; } + //-------------------------------------------------------------------------- + + //========================================================================== + /// + /// \ingroup cpp_kodi_gui_gl_CShaderProgram + /// @brief To get the vertex shader class used by Kodi at the addon + /// + /// @return pointer to vertex shader class + /// + ATTRIBUTE_FORCEINLINE CVertexShader& VertexShader() { return m_pVP; } + //-------------------------------------------------------------------------- + + //========================================================================== + /// + /// \ingroup cpp_kodi_gui_gl_CShaderProgram + /// @brief To get the fragment shader class used by Kodi at the addon + /// + /// @return pointer to fragment shader class + /// + ATTRIBUTE_FORCEINLINE CPixelShader& PixelShader() { return m_pFP; } + //-------------------------------------------------------------------------- + + //========================================================================== + /// + /// \ingroup cpp_kodi_gui_gl_CShaderProgram + /// @brief Used to get the definition created in the OpenGL itself + /// + /// @return GLuint of GL shader program handler + /// + ATTRIBUTE_FORCEINLINE GLuint ProgramHandle() { return m_shaderProgram; } + //-------------------------------------------------------------------------- + + //========================================================================== + /// + /// \defgroup cpp_kodi_gui_gl_CShaderProgram_child Child Functions + /// \ingroup cpp_kodi_gui_gl_CShaderProgram + /// @brief \cpp_class{ kodi::gui::gl::CShaderProgram child functions } + /// + /// Functions that are added by parent in the child + //@{ + //========================================================================== + /// + /// \ingroup cpp_kodi_gui_gl_CShaderProgram_child + /// @brief Mandatory child function to set the necessary CPU to GPU data + /// + virtual void OnCompiledAndLinked() {}; + //-------------------------------------------------------------------------- + + //========================================================================== + /// + /// \ingroup cpp_kodi_gui_gl_CShaderProgram_child + /// @brief Optional function to exchange data between CPU and GPU while + /// activating the shader + /// + /// @return true if enable was successfull done + /// + virtual bool OnEnabled() { return true; }; + //-------------------------------------------------------------------------- + + //========================================================================== + /// + /// \ingroup cpp_kodi_gui_gl_CShaderProgram_child + /// @brief Optional child function that may have to be performed when + /// switching off the shader + virtual void OnDisabled() {}; + //-------------------------------------------------------------------------- + //@} + +private: + void ShaderFree() + { + if (m_shaderProgram) + glDeleteProgram(m_shaderProgram); + m_shaderProgram = 0; + m_ok = false; + } + + CVertexShader m_pVP; + CPixelShader m_pFP; + GLuint m_shaderProgram = 0; + bool m_ok = false; + bool m_validated = false; +}; +//------------------------------------------------------------------------ + +} /* namespace gl */ +} /* namespace gui */ +} /* namespace kodi */ diff -Nru kodi-visualization-goom-1.1.0/README.md kodi-visualization-goom-2.1.0/README.md --- kodi-visualization-goom-1.1.0/README.md 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/README.md 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,25 @@ +# visualization.goom addon for Kodi + +This is a [Kodi](http://kodi.tv) visualization addon. + +[![Build Status](https://travis-ci.org/xbmc/visualization.goom.svg?branch=master)](https://travis-ci.org/xbmc/visualization.goom) + +## Build instructions + +When building the addon you have to use the correct branch depending on which version of Kodi you're building against. +For example, if you're building the `master` branch of Kodi you should checkout the `master` branch of this repository. +Also make sure you follow this README from the branch in question. + +### Linux + +The following instructions assume you will have built Kodi already in the `kodi-build` directory +suggested by the README. + +1. `git clone --branch Leia https://github.com/xbmc/xbmc.git` +2. `git clone --branch Leia https://github.com/xbmc/visualization.goom.git` +3. `cd visualization.goom && mkdir build && cd build` +4. `cmake -DADDONS_TO_BUILD=visualization.goom -DADDON_SRC_PREFIX=../.. -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=../../xbmc/kodi-build/addons -DPACKAGE_ZIP=1 ../../xbmc/cmake/addons` +5. `make` + +The addon files will be placed in `../../xbmc/kodi-build/addons` so if you build Kodi from source and run it directly +the addon will be available as a system addon. diff -Nru kodi-visualization-goom-1.1.0/src/CircularBuffer.h kodi-visualization-goom-2.1.0/src/CircularBuffer.h --- kodi-visualization-goom-1.1.0/src/CircularBuffer.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/src/CircularBuffer.h 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,95 @@ +/* + * Copyright (C) 2019 Team Kodi + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XBMC; see the file COPYING. If not, see + * . + * + */ + +#pragma once + +#include +#include + +int const silence_threshold = 8; + +template +class circular_buffer +{ +public: + circular_buffer( unsigned p_size ) : readptr( 0 ), writeptr( 0 ), size( p_size ), used( 0 ) + { + buffer.resize( p_size ); + } + unsigned data_available() { return used; } + unsigned free_space() { return size - used; } + bool write( const T * src, unsigned count ) + { + if ( count > free_space() ) return false; + while( count ) + { + unsigned delta = size - writeptr; + if ( delta > count ) delta = count; + std::copy( src, src + delta, buffer.begin() + writeptr ); + used += delta; + writeptr = ( writeptr + delta ) % size; + src += delta; + count -= delta; + } + return true; + } + unsigned read( T * dst, unsigned count ) + { + unsigned done = 0; + for(;;) + { + unsigned delta = size - readptr; + if ( delta > used ) delta = used; + if ( delta > count ) delta = count; + if ( !delta ) break; + + std::copy( buffer.begin() + readptr, buffer.begin() + readptr + delta, dst ); + dst += delta; + done += delta; + readptr = ( readptr + delta ) % size; + count -= delta; + used -= delta; + } + return done; + } + void reset() + { + readptr = writeptr = used = 0; + } + void resize(unsigned p_size) + { + size = p_size; + buffer.resize( p_size ); + reset(); + } + bool test_silence() const + { + T* begin = (T*) &buffer[0]; + T first = *begin; + *begin = silence_threshold * 2; + T* p = begin + size; + while ( (unsigned) ( *--p + silence_threshold ) <= (unsigned) silence_threshold * 2 ) { } + *begin = first; + return p == begin && ( (unsigned) ( first + silence_threshold ) <= (unsigned) silence_threshold * 2 ); + } + +private: + std::vector buffer; + unsigned readptr, writeptr, used, size; +}; diff -Nru kodi-visualization-goom-1.1.0/src/goom_config.h kodi-visualization-goom-2.1.0/src/goom_config.h --- kodi-visualization-goom-1.1.0/src/goom_config.h 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/src/goom_config.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,12 +0,0 @@ -#ifndef GOOM_CONFIG -#define GOOM_CONFIG - -#ifdef MID -#define GOOM_TEXTURE_WIDTH 256 -#define GOOM_TEXTURE_HEIGHT 256 -#else // MID -#define GOOM_TEXTURE_WIDTH 512 -#define GOOM_TEXTURE_HEIGHT 512 -#endif // MID - -#endif // GOOM_CONFIG diff -Nru kodi-visualization-goom-1.1.0/src/Main.cpp kodi-visualization-goom-2.1.0/src/Main.cpp --- kodi-visualization-goom-1.1.0/src/Main.cpp 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/src/Main.cpp 2019-12-15 17:36:28.000000000 +0000 @@ -1,6 +1,7 @@ /* * Copyright (C) 2005-2013 Team XBMC - * http://www.xbmc.org + * Copyright (C) 2016-2019 Team Kodi + * http://kodi.tv * * This Program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -13,301 +14,460 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, see + * along with Kodi; see the file COPYING. If not, see * . * */ +#include "Main.h" -/* - -Goom Visualization Interface for XBMC -- Team XBMC +CVisualizationGoom::CVisualizationGoom() +{ + switch (kodi::GetSettingInt("quality")) + { + case 0: + m_tex_width = 512; + m_tex_height = 256; + break; + case 1: + m_tex_width = 640; + m_tex_height = 360; + break; + case 2: + m_tex_width = 1280; + m_tex_height = 720; + break; + default: + m_tex_width = GOOM_TEXTURE_WIDTH; + m_tex_height = GOOM_TEXTURE_HEIGHT; + break; + } -*/ + m_goomBufferSize = m_tex_width * m_tex_height * sizeof(uint32_t); -#define __STDC_LIMIT_MACROS + m_window_width = Width(); + m_window_height = Height(); + m_window_xpos = X(); + m_window_ypos = Y(); -#include -#include -#include -#include -#include -extern "C" { -#include "goom.h" -} -#include "goom_config.h" -#ifdef __APPLE__ -#include -#else -#include -#endif + InitQuadData(); +} -extern int preset_index; -char g_visName[512]; -PluginInfo* g_goom = NULL; - -int g_tex_width = GOOM_TEXTURE_WIDTH; -int g_tex_height = GOOM_TEXTURE_HEIGHT; -int g_window_width = 512; -int g_window_height = 512; -int g_window_xpos = 0; -int g_window_ypos = 0; - -GLuint g_texid = 0; -unsigned char* g_goom_buffer = NULL; -short g_audio_data[2][512]; -std::string g_configFile; +//-- Destroy ------------------------------------------------------------------- +// Do everything before unload of this add-on +// !!! Add-on master function !!! +//----------------------------------------------------------------------------- +CVisualizationGoom::~CVisualizationGoom() +{ + delete[] m_quadData; -using namespace std; + kodi::Log(ADDON_LOG_DEBUG, "~CVisualizationGoom: Destroyed CVisualizationGoom object."); +} -//-- Create ------------------------------------------------------------------- -// Called once when the visualisation is created by XBMC. Do any setup here. +//-- Start -------------------------------------------------------------------- +// Called when a new soundtrack is played //----------------------------------------------------------------------------- -extern "C" ADDON_STATUS ADDON_Create(void* hdl, void* props) +bool CVisualizationGoom::Start(int iChannels, int iSamplesPerSec, int iBitsPerSample, std::string szSongName) { - if (!props) - return ADDON_STATUS_UNKNOWN; - - VIS_PROPS* visprops = (VIS_PROPS*)props; + if (m_started) + { + kodi::Log(ADDON_LOG_WARNING, "Start: Already started without a stop - skipping this."); + return true; + } - strcpy(g_visName, visprops->name); - g_configFile = string(visprops->profile) + string("/goom.conf"); - std::string presetsDir = string(visprops->presets) + string("/resources"); + m_channels = iChannels; + m_currentSongName = szSongName; + m_titleChange = true; + + // Make one init frame in black + std::shared_ptr sp(new uint32_t[m_tex_width * m_tex_height], std::default_delete()); + memset(sp.get(), 0, m_tex_width * m_tex_height * sizeof(uint32_t)); + m_activeQueue.push(sp); + + // Init GL parts + if (!LoadShaderFiles(kodi::GetAddonPath("resources/shaders/" GL_TYPE_STRING "/vert.glsl"), + kodi::GetAddonPath("resources/shaders/" GL_TYPE_STRING "/frag.glsl"))) + { + kodi::Log(ADDON_LOG_FATAL, "Start: Failed to load GL shaders."); + return false; + } - /** Initialise Goom */ - if (g_goom) + if (!CompileAndLink()) { - goom_close( g_goom ); - g_goom = NULL; + kodi::Log(ADDON_LOG_FATAL, "Start: Failed to compile GL shaders."); + return false; } - g_goom = goom_init(g_tex_width, g_tex_height); - if (!g_goom) - return ADDON_STATUS_UNKNOWN; + if (!InitGLObjects()) + { + kodi::Log(ADDON_LOG_FATAL, "Start: Could not intilize GL objects."); + return false; + } - g_goom_buffer = (unsigned char*)malloc(g_tex_width * g_tex_height * 4); - goom_set_screenbuffer( g_goom, g_goom_buffer ); - memset( g_audio_data, 0, sizeof(g_audio_data) ); - g_window_width = visprops->width; - g_window_height = visprops->height; - g_window_xpos = visprops->x; - g_window_ypos = visprops->y; + // Start the goom process thread + kodi::Log(ADDON_LOG_DEBUG, "Start: Setting up buffer worker thread."); + m_workerThread = std::thread(&CVisualizationGoom::Process, this); - return ADDON_STATUS_OK; + m_started = true; + return true; } -//-- Destroy ------------------------------------------------------------------- -// Do everything before unload of this add-on -// !!! Add-on master function !!! +//-- Stop --------------------------------------------------------------------- +// Called when the visualisation is closed by Kodi //----------------------------------------------------------------------------- -extern "C" void ADDON_Destroy() +void CVisualizationGoom::Stop() { - if ( g_goom ) + if (!m_started) { - goom_close( g_goom ); - g_goom = NULL; + kodi::Log(ADDON_LOG_WARNING, "Stop: Not started - skipping this."); + return; } - if ( g_goom_buffer ) + + m_started = false; + + kodi::Log(ADDON_LOG_DEBUG, "Stop: Stopping processed buffers thread..."); { - free( g_goom_buffer ); - g_goom_buffer = NULL; + std::unique_lock lock(m_mutex); + m_threadExit = true; + m_wait.notify_one(); } + if (m_workerThread.joinable()) + m_workerThread.join(); + + kodi::Log(ADDON_LOG_DEBUG, "Stop: Processed buffers thread stopped."); + + glDeleteTextures(1, &m_textureId); + m_textureId = 0; + + glBindBuffer(GL_ARRAY_BUFFER, 0); + glDeleteBuffers(1, &m_vertexVBO); + m_vertexVBO = 0; } -//-- Start -------------------------------------------------------------------- -// Called when a new soundtrack is played -//----------------------------------------------------------------------------- -extern "C" void Start(int iChannels, int iSamplesPerSec, int iBitsPerSample, const char* szSongName) +void CVisualizationGoom::OnCompiledAndLinked() { - if ( g_goom ) - { - goom_update( g_goom, g_audio_data, 0, 0, (char*)szSongName, (char*)"XBMC" ); - } + m_uProjModelMatLoc = glGetUniformLocation(ProgramHandle(), "u_projModelMat"); + m_aPositionLoc = glGetAttribLocation(ProgramHandle(), "in_position"); + m_aCoordLoc = glGetAttribLocation(ProgramHandle(), "in_tex_coord"); } -//-- Stop --------------------------------------------------------------------- -// Called when the visualisation is closed by XBMC -//----------------------------------------------------------------------------- -extern "C" void ADDON_Stop() +bool CVisualizationGoom::OnEnabled() { - if (g_texid) - { - glDeleteTextures( 1, &g_texid ); - g_texid = 0; - } + glUniformMatrix4fv(m_uProjModelMatLoc, 1, GL_FALSE, glm::value_ptr(m_projModelMatrix)); + return true; } //-- Audiodata ---------------------------------------------------------------- -// Called by XBMC to pass new audio data to the vis +// Called by Kodi to pass new audio data to the vis //----------------------------------------------------------------------------- -extern "C" void AudioData(const float* pAudioData, int iAudioDataLength, float *pFreqData, int iFreqDataLength) +void CVisualizationGoom::AudioData(const float* pAudioData, int iAudioDataLength, float* pFreqData, int iFreqDataLength) { - int copysize = iAudioDataLength < (int)sizeof( g_audio_data ) >> 1 ? iAudioDataLength : (int)sizeof( g_audio_data ) >> 1; - int ipos, i; - for(ipos = 0, i = 0; i < copysize; i += 2, ++ipos) + if (!m_started) { - g_audio_data[0][ipos] = (int)(pAudioData[i ] * (INT16_MAX+.5f)); - g_audio_data[1][ipos] = (int)(pAudioData[i+1] * (INT16_MAX+.5f)); + kodi::Log(ADDON_LOG_WARNING, "AudioData: Not started - skipping this."); + return; } + + std::unique_lock lock(m_mutex); + + if (m_buffer.data_available() >= 16384) + return; + + m_buffer.write(pAudioData, iAudioDataLength); + m_wait.notify_one(); } +bool CVisualizationGoom::UpdateTrack(const VisTrack &track) +{ + if (m_goom) + { + m_lastSongName = m_currentSongName; + std::string artist = track.artist; + if (artist.empty()) + artist = track.albumArtist; + std::string title; + if (!artist.empty()) + m_currentSongName = artist + " - " + track.title; + else + m_currentSongName = track.title; + + if (m_lastSongName != m_currentSongName) + m_titleChange = true; + + m_showTitleAlways = kodi::GetSettingBoolean("show_title_always"); + } + return true; +} //-- Render ------------------------------------------------------------------- // Called once per frame. Do all rendering here. //----------------------------------------------------------------------------- -extern "C" void Render() + +bool CVisualizationGoom::IsDirty() { - if ( g_goom ) + return true;//!m_worker.RequestsQueueEmpty(); +} + +void CVisualizationGoom::Render() +{ + if (!m_started) { - goom_set_screenbuffer( g_goom, g_goom_buffer ); - if (!g_texid) + kodi::Log(ADDON_LOG_WARNING, "Render: Not started - skipping this."); + return; + } + + // Setup vertex attributes. +#ifdef HAS_GL + glBindVertexArray(m_vaoObject); +#else + glVertexAttribPointer(m_aPositionLoc, 2, GL_FLOAT, GL_FALSE, 0, m_quadData); + glEnableVertexAttribArray(m_aPositionLoc); + glVertexAttribPointer(m_aCoordLoc, 2, GL_FLOAT, GL_FALSE, 0, m_quadData+m_numVertices * m_componentsPerVertex); + glEnableVertexAttribArray(m_aCoordLoc); +#endif + + // Setup texture. + glDisable(GL_BLEND); + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, m_textureId); + if (!m_activeQueue.empty()) + { + std::shared_ptr pixels = m_activeQueue.front(); + m_activeQueue.pop(); + +#ifdef HAS_GL + if (g_usePixelBufferObjects) { - // initialize the texture we'll be using - glGenTextures( 1, &g_texid ); - if (!g_texid) - return; - goom_update( g_goom, g_audio_data, 0, 0, NULL, (char*)"XBMC" ); - glEnable(GL_TEXTURE_2D); - glBindTexture( GL_TEXTURE_2D, g_texid ); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexImage2D( GL_TEXTURE_2D, 0, 4, g_tex_width, g_tex_height, 0, - GL_RGBA, GL_UNSIGNED_BYTE, g_goom_buffer ); - glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); + m_currentPboIndex = (m_currentPboIndex + 1) % g_numPbos; + const int nextPboIndex = (m_currentPboIndex + 1) % g_numPbos; + + // Bind to current PBO and send pixels to texture object. + glBindBuffer(GL_PIXEL_UNPACK_BUFFER, m_pboIds[m_currentPboIndex]); + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, m_tex_width, m_tex_height, GL_RGBA, GL_UNSIGNED_BYTE, 0); + + // Bind to next PBO and update data directly on the mapped buffer. + glBindBuffer(GL_PIXEL_UNPACK_BUFFER, m_pboIds[nextPboIndex]); + memcpy(m_pboGoomBuffer[nextPboIndex], pixels.get(), sizeof(uint32_t) * m_tex_width * m_tex_height); + + glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER); // release pointer to mapping buffer + glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0); } else +#endif { - // update goom frame and copy to our texture - goom_update( g_goom, g_audio_data, 0, 0, NULL, (char*)"XBMC" ); - glEnable(GL_TEXTURE_2D); - glBindTexture( GL_TEXTURE_2D, g_texid ); - glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, g_tex_width, g_tex_height, - GL_RGBA, GL_UNSIGNED_BYTE, g_goom_buffer ); - glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, m_tex_width, m_tex_height, GL_RGBA, GL_UNSIGNED_BYTE, pixels.get()); } - glDisable(GL_BLEND); - glBegin( GL_QUADS ); - { - glColor3f( 1.0, 1.0, 1.0 ); - glTexCoord2f( 0.0, 0.0 ); - glVertex2f( g_window_xpos, g_window_ypos ); + m_storedQueue.push(pixels); + } - glTexCoord2f( 0.0, 1.0 ); - glVertex2f( g_window_xpos, g_window_ypos + g_window_height ); + EnableShader(); + glDrawArrays(GL_TRIANGLE_FAN, 0, 6); + DisableShader(); - glTexCoord2f( 1.0, 1.0 ); - glVertex2f( g_window_xpos + g_window_width, g_window_ypos + g_window_height ); + glEnable(GL_BLEND); - glTexCoord2f( 1.0, 0.0 ); - glVertex2f( g_window_xpos + g_window_width, g_window_ypos ); - } - glEnd(); - glDisable( GL_TEXTURE_2D ); - glEnable(GL_BLEND); - } +#ifdef HAS_GL + glBindVertexArray(0); +#else + glDisableVertexAttribArray(m_aPositionLoc); + glDisableVertexAttribArray(m_aCoordLoc); +#endif } -//-- GetInfo ------------------------------------------------------------------ -// Tell XBMC our requirements -//----------------------------------------------------------------------------- -extern "C" void GetInfo(VIS_INFO* pInfo) +static inline int16_t FloatToInt16(float f) { - pInfo->bWantsFreq = false; - pInfo->iSyncDelay = 0; + if (f >= 1.0f) + return 32767; + else if (f < -1.0f) + return -32768; + else + return (int16_t)(f * 32768.0f); } -//-- OnAction ----------------------------------------------------------------- -// Handle XBMC actions such as next preset, lock preset, album art changed etc -//----------------------------------------------------------------------------- -extern "C" bool OnAction(long flags, const void *param) +bool CVisualizationGoom::FillBuffer(int16_t* data) { - bool ret = false; - return ret; -} + if (m_buffer.data_available() < 512 * m_channels) + return false; -//-- GetPresets --------------------------------------------------------------- -// Return a list of presets to XBMC for display -//----------------------------------------------------------------------------- -extern "C" unsigned int GetPresets(char ***presets) -{ - return 0; -} + float floatData[512*2]; + unsigned read = m_buffer.read(floatData, 512 * m_channels); -//-- GetPreset ---------------------------------------------------------------- -// Return the index of the current playing preset -//----------------------------------------------------------------------------- -extern "C" unsigned GetPreset() -{ - return 0; -} + int ipos = 0; + int fpos = 0; + while (ipos < 512) + { + data[ipos] = FloatToInt16(floatData[fpos++]); + data[512 + ipos] = m_channels == 1 ? data[ipos] : FloatToInt16(floatData[fpos++]); + ipos++; + } -//-- IsLocked ----------------------------------------------------------------- -// Returns true if this add-on use settings -//----------------------------------------------------------------------------- -extern "C" bool IsLocked() -{ - return false; + return true; } -//-- GetSubModules ------------------------------------------------------------ -// Return any sub modules supported by this vis -//----------------------------------------------------------------------------- -extern "C" unsigned int GetSubModules(char ***names) +void CVisualizationGoom::Process() { - return 0; // this vis supports 0 sub modules -} + int16_t audioData[2][512]; + const char* title = nullptr; -//-- HasSettings -------------------------------------------------------------- -// Returns true if this add-on use settings -// !!! Add-on master function !!! -//----------------------------------------------------------------------------- -extern "C" bool ADDON_HasSettings() -{ - return false; -} + m_goom = goom_init(m_tex_width, m_tex_height); + if (!m_goom) + { + kodi::Log(ADDON_LOG_FATAL, "CVisualizationGoom: Goom could not be initialized!"); + return; + } -//-- GetStatus --------------------------------------------------------------- -// Returns the current Status of this visualisation -// !!! Add-on master function !!! -//----------------------------------------------------------------------------- -extern "C" ADDON_STATUS ADDON_GetStatus() -{ - return ADDON_STATUS_OK; -} + while (!m_threadExit) + { + bool bExit; + { + std::unique_lock lock(m_mutex); + if (!m_threadExit && FillBuffer((int16_t *)audioData) != true) + m_wait.wait(lock); + + if (m_titleChange || m_showTitleAlways) + { + title = m_currentSongName.c_str(); + m_titleChange = false; + } + else + title = nullptr; -//-- GetSettings -------------------------------------------------------------- -// Return the settings for XBMC to display -// !!! Add-on master function !!! -//----------------------------------------------------------------------------- -extern "C" unsigned int ADDON_GetSettings(ADDON_StructSetting ***sSet) -{ - return 0; -} + bExit = m_threadExit; + } -//-- FreeSettings -------------------------------------------------------------- -// Free the settings struct passed from XBMC -// !!! Add-on master function !!! -//----------------------------------------------------------------------------- + if (bExit) + break; -extern "C" void ADDON_FreeSettings() -{ -} + if (m_activeQueue.size() > 10) + continue; -//-- SetSetting --------------------------------------------------------------- -// Set a specific Setting value (called from XBMC) -// !!! Add-on master function !!! -//----------------------------------------------------------------------------- -extern "C" ADDON_STATUS ADDON_SetSetting(const char *strSetting, const void* value) -{ - return ADDON_STATUS_OK; + std::shared_ptr pixels; + if (!m_storedQueue.empty()) + { + pixels = m_storedQueue.front(); + m_storedQueue.pop(); + } + else + { + std::shared_ptr sp(new uint32_t[m_tex_width * m_tex_height], std::default_delete()); + pixels = sp; + } + + goom_set_screenbuffer(m_goom, pixels.get()); + uint32_t* plane = goom_update(m_goom, audioData, 0, 0.0f, (char*)title, (char*)"Kodi"); + m_activeQueue.push(pixels); + } + + goom_close(m_goom); } -//-- Announce ----------------------------------------------------------------- -// Receive announcements from XBMC -// !!! Add-on master function !!! -//----------------------------------------------------------------------------- -extern "C" void ADDON_Announce(const char *flag, const char *sender, const char *message, const void *data) +void CVisualizationGoom::InitQuadData() { + GLfloat x0 = m_window_xpos; + GLfloat y0 = m_window_ypos; + GLfloat x1 = m_window_xpos + m_window_width; + GLfloat y1 = m_window_ypos + m_window_height; + const GLfloat tempQuadData[] = + { + // Vertex positions + x0, y0, // bottom left + x0, y1, // top left + x1, y0, // bottom right + x1, y0, // bottom right + x1, y1, // top right + x0, y1, // top left + // Texture coordinates + 0.0, 1.0, + 0.0, 0.0, + 1.0, 1.0, + 1.0, 1.0, + 1.0, 0.0, + 0.0, 0.0, + }; + + m_numElements = sizeof(tempQuadData)/sizeof(GLfloat); + m_quadData = new GLfloat[m_numElements]; + for (int i = 0; i < m_numElements; i++) + { + m_quadData[i] = tempQuadData[i]; + }; + m_componentsPerVertex = 2; + m_componentsPerTexel = 2; + m_numVertices = 2 * 3; // 2 triangles + m_vertexVBO = 0; +} + +bool CVisualizationGoom::InitGLObjects() +{ + m_projModelMatrix = glm::ortho(0.0f, float(Width()), 0.0f, float(Height())); + + // Setup vertex attributes +#ifdef HAS_GL + glBindBuffer(GL_ARRAY_BUFFER, 0); + glDeleteBuffers(1, &m_vertexVBO); + glGenVertexArrays(1, &m_vaoObject); + glBindVertexArray(m_vaoObject); + glGenBuffers(1, &m_vertexVBO); + glBindBuffer(GL_ARRAY_BUFFER, m_vertexVBO); + glEnableVertexAttribArray(m_aPositionLoc); + glEnableVertexAttribArray(m_aCoordLoc); + glVertexAttribPointer(m_aPositionLoc, m_componentsPerVertex, GL_FLOAT, GL_FALSE, 0, (GLvoid*)0); + glVertexAttribPointer(m_aCoordLoc, m_componentsPerTexel, GL_FLOAT, GL_FALSE, 0, (GLvoid*)(m_numVertices * m_componentsPerVertex * sizeof(GLfloat))); + glBufferData(GL_ARRAY_BUFFER, m_numElements*sizeof(GLfloat), m_quadData, GL_STATIC_DRAW); + glBindVertexArray(0); +#endif + + // Create texture. + glGenTextures(1, &m_textureId); + if (!m_textureId) + { + kodi::Log(ADDON_LOG_ERROR, "InitGLObjects: Could not do glGenTextures."); + return false; + } + glClear(GL_COLOR_BUFFER_BIT); + + glBindTexture(GL_TEXTURE_2D, m_textureId); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); +#ifdef HAS_GL + glGenerateMipmap(GL_TEXTURE_2D); +#endif + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, m_tex_width, m_tex_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); + glBindTexture(GL_TEXTURE_2D, 0); + +#ifdef HAS_GL + if (!g_usePixelBufferObjects) + { + kodi::Log(ADDON_LOG_DEBUG, "InitGLObjects: Not using pixel buffer objects."); + } + else + { + kodi::Log(ADDON_LOG_DEBUG, "InitGLObjects: Using pixel buffer objects."); + m_currentPboIndex = 0; + + glGenBuffers(g_numPbos, m_pboIds); + for (int i = 0; i < g_numPbos; i++) + { + glBindBuffer(GL_PIXEL_UNPACK_BUFFER, m_pboIds[i]); + glBufferData(GL_PIXEL_UNPACK_BUFFER, m_goomBufferSize, 0, GL_STREAM_DRAW); + glBindBuffer(GL_PIXEL_UNPACK_BUFFER, m_pboIds[i]); + glBufferData(GL_PIXEL_UNPACK_BUFFER, m_goomBufferSize, 0, GL_STREAM_DRAW); + m_pboGoomBuffer[i] = reinterpret_cast(glMapBuffer(GL_PIXEL_UNPACK_BUFFER, GL_WRITE_ONLY)); + if (!m_pboGoomBuffer[i]) + { + kodi::Log(ADDON_LOG_ERROR, "InitGLObjects: Could not do glMapBuffer for pbo %d.", i); + return false; + } + } + glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER); // release pointer to mapping buffer + glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0); + } +#endif + + return true; } + +ADDONCREATOR(CVisualizationGoom) // Don't touch this! diff -Nru kodi-visualization-goom-1.1.0/src/Main.h kodi-visualization-goom-2.1.0/src/Main.h --- kodi-visualization-goom-1.1.0/src/Main.h 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/src/Main.h 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,130 @@ +/* + * Copyright (C) 2005-2013 Team XBMC + * Copyright (C) 2016-2019 Team Kodi + * http://kodi.tv + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Kodi; see the file COPYING. If not, see + * . + * + */ + +#define __STDC_LIMIT_MACROS + +#include "CircularBuffer.h" + +extern "C" { +#include "goom.h" +#include "goom_config.h" +} + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define GOOM_TEXTURE_WIDTH 1280 +#define GOOM_TEXTURE_HEIGHT 720 + +class ATTRIBUTE_HIDDEN CVisualizationGoom + : public kodi::addon::CAddonBase, + public kodi::addon::CInstanceVisualization, + private kodi::gui::gl::CShaderProgram +{ +public: + CVisualizationGoom(); + ~CVisualizationGoom() override; + + bool Start(int channels, int samplesPerSec, int bitsPerSample, std::string songName) override; + void Stop() override; + bool IsDirty() override; + void Render() override; + void AudioData(const float* audioData, int audioDataLength, float* freqData, int freqDataLength) override; + bool UpdateTrack(const VisTrack &track) override; + + // kodi::gui::gl::CShaderProgram + void OnCompiledAndLinked() override; + bool OnEnabled() override; + +private: + void Process(); + bool FillBuffer(int16_t* data); + bool InitGLObjects(); + void InitQuadData(); + + int m_tex_width = GOOM_TEXTURE_WIDTH; + int m_tex_height = GOOM_TEXTURE_HEIGHT; + int m_goomBufferSize = GOOM_TEXTURE_WIDTH * GOOM_TEXTURE_HEIGHT * sizeof(uint32_t); + + int m_window_width; + int m_window_height; + int m_window_xpos; + int m_window_ypos; + + int m_channels; + std::string m_currentSongName; + std::string m_lastSongName; + bool m_titleChange = false; + bool m_showTitleAlways = false; + + GLint m_componentsPerVertex; + GLint m_componentsPerTexel; + int m_numVertices; + int m_numElements; + GLfloat* m_quadData = nullptr; + +#ifdef HAS_GL + const static bool g_usePixelBufferObjects = false; // Currently unused, during view change it shortly looks bad with it +#endif + GLuint m_textureId = 0; + const static int g_numPbos = 3; + GLuint m_pboIds[g_numPbos]; + unsigned char* m_pboGoomBuffer[g_numPbos]; + int m_currentPboIndex; + glm::mat4 m_projModelMatrix; + GLuint m_vaoObject = 0; + GLuint m_vertexVBO = 0; + GLint m_uProjModelMatLoc = -1; + GLint m_aPositionLoc = -1; + GLint m_aCoordLoc = -1; + + // Goom's data itself + PluginInfo* m_goom = nullptr; + + // Audio buffer storage + circular_buffer m_buffer = 16384; + + // Goom process thread handles + bool m_threadExit = false; + std::thread m_workerThread; + std::mutex m_mutex; + std::condition_variable m_wait; + + // Screen frames storage, m_activeQueue for next view and m_storedQueue to + // use on next goom round become active again. + std::queue> m_activeQueue; + std::queue> m_storedQueue; + + // Start flag to know init was OK + bool m_started = false; +}; + diff -Nru kodi-visualization-goom-1.1.0/.travis.yml kodi-visualization-goom-2.1.0/.travis.yml --- kodi-visualization-goom-1.1.0/.travis.yml 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/.travis.yml 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,49 @@ +language: cpp + +# +# Define the build matrix +# +# Travis defaults to building on Ubuntu Trusty when building on +# Linux. We need Xenial in order to get up to date versions of +# cmake and g++. +# +env: + global: + - app_id=visualization.goom + +matrix: + include: + - os: linux + dist: xenial + sudo: required + compiler: gcc + - os: linux + dist: xenial + sudo: required + compiler: clang + - os: osx + osx_image: xcode9 + +# +# Some of the OS X images don't have cmake, contrary to what people +# on the Internet say +# +before_install: + - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then which cmake || brew update ; fi + - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then which cmake || brew install cmake ; fi + - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew update && brew upgrade cmake || true; fi + - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then sudo apt-get install -y libgl1-mesa-dev; fi + +# +# The addon source is automatically checked out in $TRAVIS_BUILD_DIR, +# we'll put the Kodi source on the same level +# +before_script: + - cd $TRAVIS_BUILD_DIR/.. + - git clone --branch Leia --depth=1 https://github.com/xbmc/xbmc.git + - cd ${app_id} && mkdir build && cd build + - mkdir -p definition/${app_id} + - echo ${app_id} $TRAVIS_BUILD_DIR $TRAVIS_COMMIT > definition/${app_id}/${app_id}.txt + - cmake -DADDONS_TO_BUILD=${app_id} -DADDON_SRC_PREFIX=$TRAVIS_BUILD_DIR/.. -DADDONS_DEFINITION_DIR=$TRAVIS_BUILD_DIR/build/definition -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=$TRAVIS_BUILD_DIR/../xbmc/addons -DPACKAGE_ZIP=1 $TRAVIS_BUILD_DIR/../xbmc/cmake/addons + +script: make diff -Nru kodi-visualization-goom-1.1.0/visualization.goom/addon.xml.in kodi-visualization-goom-2.1.0/visualization.goom/addon.xml.in --- kodi-visualization-goom-1.1.0/visualization.goom/addon.xml.in 2016-05-23 21:53:04.000000000 +0000 +++ kodi-visualization-goom-2.1.0/visualization.goom/addon.xml.in 2019-12-15 17:36:28.000000000 +0000 @@ -1,15 +1,28 @@ + provider-name="Team Kodi"> + @ADDON_DEPENDS@ - Goom 2k4 Visualization - The Goom 2k4 visualization supports effects like Tentacles, Flash, Stars, Fireworks, Waves, Blurs and Glows and includes a large number of trippy hypnotic effects that dance, swirl and pop with the music - @PLATFORM@ + Goom 2k4 Visualization + The Goom 2k4 visualization supports effects like Tentacles, Flash, Stars, Fireworks, Waves, Blurs and Glows and includes a large number of trippy hypnotic effects that dance, swirl and pop with the music + @PLATFORM@ + GPL-2.0 + https://github.com/xbmc/visualization.goom + + resources/icon.png + resources/fanart.png + resources/screenshot-01.png + resources/screenshot-02.png + resources/screenshot-03.png + resources/screenshot-04.png + resources/screenshot-05.png + resources/screenshot-06.png + Binary files /tmp/tmpPt54Nf/VKyUZvMq5a/kodi-visualization-goom-1.1.0/visualization.goom/icon.png and /tmp/tmpPt54Nf/jSnkFgw56d/kodi-visualization-goom-2.1.0/visualization.goom/icon.png differ Binary files /tmp/tmpPt54Nf/VKyUZvMq5a/kodi-visualization-goom-1.1.0/visualization.goom/resources/fanart.png and /tmp/tmpPt54Nf/jSnkFgw56d/kodi-visualization-goom-2.1.0/visualization.goom/resources/fanart.png differ Binary files /tmp/tmpPt54Nf/VKyUZvMq5a/kodi-visualization-goom-1.1.0/visualization.goom/resources/icon.png and /tmp/tmpPt54Nf/jSnkFgw56d/kodi-visualization-goom-2.1.0/visualization.goom/resources/icon.png differ diff -Nru kodi-visualization-goom-1.1.0/visualization.goom/resources/language/resource.language.en_gb/strings.po kodi-visualization-goom-2.1.0/visualization.goom/resources/language/resource.language.en_gb/strings.po --- kodi-visualization-goom-1.1.0/visualization.goom/resources/language/resource.language.en_gb/strings.po 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/visualization.goom/resources/language/resource.language.en_gb/strings.po 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,47 @@ +# Kodi Media Center language file +# Addon Name: Goom 2k4 Visualization +# Addon id: visualization.goom +# Addon Provider: Team-Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Addons\n" +"Report-Msgid-Bugs-To: https://github.com/xbmc/visualization.goom/issues\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: English (https://www.transifex.com/teamxbmc/kodi-addons/language/en_GB/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#settings labels + +msgctxt "#30000" +msgid "Show titles always" +msgstr "" + +msgctxt "#30001" +msgid "If set, the title will be displayed continuously, otherwise it will only be shown briefly on change." +msgstr "" + +msgctxt "#30002" +msgid "Render quality" +msgstr "" + +msgctxt "#30003" +msgid "If the system does not do the display in a high resolution, it can be reduced." +msgstr "" + +msgctxt "#30004" +msgid "Lowest (512x256)" +msgstr "" + +msgctxt "#30005" +msgid "Lower (640x360)" +msgstr "" + +msgctxt "#30006" +msgid "Standard (1280x720)" +msgstr "" Binary files /tmp/tmpPt54Nf/VKyUZvMq5a/kodi-visualization-goom-1.1.0/visualization.goom/resources/screenshot-01.png and /tmp/tmpPt54Nf/jSnkFgw56d/kodi-visualization-goom-2.1.0/visualization.goom/resources/screenshot-01.png differ Binary files /tmp/tmpPt54Nf/VKyUZvMq5a/kodi-visualization-goom-1.1.0/visualization.goom/resources/screenshot-02.png and /tmp/tmpPt54Nf/jSnkFgw56d/kodi-visualization-goom-2.1.0/visualization.goom/resources/screenshot-02.png differ Binary files /tmp/tmpPt54Nf/VKyUZvMq5a/kodi-visualization-goom-1.1.0/visualization.goom/resources/screenshot-03.png and /tmp/tmpPt54Nf/jSnkFgw56d/kodi-visualization-goom-2.1.0/visualization.goom/resources/screenshot-03.png differ Binary files /tmp/tmpPt54Nf/VKyUZvMq5a/kodi-visualization-goom-1.1.0/visualization.goom/resources/screenshot-04.png and /tmp/tmpPt54Nf/jSnkFgw56d/kodi-visualization-goom-2.1.0/visualization.goom/resources/screenshot-04.png differ Binary files /tmp/tmpPt54Nf/VKyUZvMq5a/kodi-visualization-goom-1.1.0/visualization.goom/resources/screenshot-05.png and /tmp/tmpPt54Nf/jSnkFgw56d/kodi-visualization-goom-2.1.0/visualization.goom/resources/screenshot-05.png differ diff -Nru kodi-visualization-goom-1.1.0/visualization.goom/resources/settings.xml kodi-visualization-goom-2.1.0/visualization.goom/resources/settings.xml --- kodi-visualization-goom-1.1.0/visualization.goom/resources/settings.xml 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/visualization.goom/resources/settings.xml 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,24 @@ + + +
+ + + + false + + + + 2 + + + + + + + + + + + +
+
diff -Nru kodi-visualization-goom-1.1.0/visualization.goom/resources/shaders/GL/frag.glsl kodi-visualization-goom-2.1.0/visualization.goom/resources/shaders/GL/frag.glsl --- kodi-visualization-goom-1.1.0/visualization.goom/resources/shaders/GL/frag.glsl 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/visualization.goom/resources/shaders/GL/frag.glsl 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,10 @@ +#version 150 + +uniform sampler2D tex; +smooth in vec2 vs_tex_coord; +out vec4 color; + +void main() +{ + color = vec4(texture(tex, vs_tex_coord).rgb, 1.0); +} diff -Nru kodi-visualization-goom-1.1.0/visualization.goom/resources/shaders/GL/vert.glsl kodi-visualization-goom-2.1.0/visualization.goom/resources/shaders/GL/vert.glsl --- kodi-visualization-goom-1.1.0/visualization.goom/resources/shaders/GL/vert.glsl 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/visualization.goom/resources/shaders/GL/vert.glsl 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,15 @@ +#version 150 + +uniform mat4 u_projModelMat; + +in vec2 in_position; +in vec2 in_tex_coord; +smooth out vec2 vs_tex_coord; + + +void main() +{ + gl_Position = u_projModelMat * vec4(in_position.x, in_position.y, 0.0, 1.0); + + vs_tex_coord = in_tex_coord; +} diff -Nru kodi-visualization-goom-1.1.0/visualization.goom/resources/shaders/GLES/frag.glsl kodi-visualization-goom-2.1.0/visualization.goom/resources/shaders/GLES/frag.glsl --- kodi-visualization-goom-1.1.0/visualization.goom/resources/shaders/GLES/frag.glsl 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/visualization.goom/resources/shaders/GLES/frag.glsl 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,12 @@ +#version 100 + +precision mediump float; + +uniform sampler2D tex; + +varying vec2 vs_tex_coord; + +void main() +{ + gl_FragColor = vec4(texture2D(tex, vs_tex_coord).rgb, 1.0); +} diff -Nru kodi-visualization-goom-1.1.0/visualization.goom/resources/shaders/GLES/vert.glsl kodi-visualization-goom-2.1.0/visualization.goom/resources/shaders/GLES/vert.glsl --- kodi-visualization-goom-1.1.0/visualization.goom/resources/shaders/GLES/vert.glsl 1970-01-01 00:00:00.000000000 +0000 +++ kodi-visualization-goom-2.1.0/visualization.goom/resources/shaders/GLES/vert.glsl 2019-12-15 17:36:28.000000000 +0000 @@ -0,0 +1,14 @@ +#version 100 + +uniform mat4 u_projModelMat; + +attribute vec2 in_position; +attribute vec2 in_tex_coord; + +varying vec2 vs_tex_coord; + +void main() +{ + gl_Position = u_projModelMat * vec4(in_position, 0.0, 1.0); + vs_tex_coord = in_tex_coord; +}