diff options
author | Timothy Pearson <[email protected]> | 2013-01-26 13:16:15 -0600 |
---|---|---|
committer | Timothy Pearson <[email protected]> | 2013-01-26 13:16:15 -0600 |
commit | 7e09b5c2efae58399621a938de26b9675b8ba621 (patch) | |
tree | de2c9535e1f4c48ae91910492d298eba1d593fd5 /kscreensaver/kdesavers | |
parent | 159f7e147ac33c924b3ce9050c8f03cbc54916ee (diff) | |
download | tdeartwork-7e09b5c2efae58399621a938de26b9675b8ba621.tar.gz tdeartwork-7e09b5c2efae58399621a938de26b9675b8ba621.zip |
Rename a number of libraries and executables to avoid conflicts with KDE4
Diffstat (limited to 'kscreensaver/kdesavers')
98 files changed, 0 insertions, 31184 deletions
diff --git a/kscreensaver/kdesavers/CMakeLists.txt b/kscreensaver/kdesavers/CMakeLists.txt deleted file mode 100644 index 6cfcf03b..00000000 --- a/kscreensaver/kdesavers/CMakeLists.txt +++ /dev/null @@ -1,145 +0,0 @@ -################################################# -# -# (C) 2011 Golubev Alexander -# fatzer2 (AT) gmail.com -# -# Improvements and feedback are welcome -# -# This file is released under GPL >= 2 -# -################################################# - -include_directories( - ${CMAKE_CURRENT_BINARY_DIR} - ${CMAKE_CURRENT_SOURCE_DIR} - ${CMAKE_BINARY_DIR} - ${TDE_INCLUDE_DIR} - ${TQT_INCLUDE_DIRS} -) - -link_directories( - ${TQT_LIBRARY_DIRS} - ${TDE_LIB_DIR} -) - -# ##### The "normal" screensavers ############### - -set( kbanner_SOURCES banner.cpp ) -set( kbanner_DESKTOP KBanner.desktop ) -set( kpolygon_SOURCES polygon.cpp ) -set( kpolygon_DESKTOP KPolygon.desktop ) -set( klines_SOURCES lines.cpp ) -set( klines_DESKTOP KLines-saver.desktop ) -set( klorenz_SOURCES lorenz.cpp ) -set( klorenz_DESKTOP KLorenz.desktop ) -set( kslideshow_SOURCES slideshow.cpp slideshowcfg.ui ) -set( kslideshow_DESKTOP KSlideshow.desktop ) -set( kblob_SOURCES blob.cpp ) -set( kblob_DESKTOP KBlob.desktop ) -set( kvm_SOURCES kvm.cpp vm.c vm_random.c ) -set( kvm_DESKTOP KVm.desktop ) - -set( kslideshow_LINK kio-shared ) - -set( NORMAL_SCREENSAVERS - kbanner kpolygon kslideshow klines klorenz kblob kvm ) - -##### X11 screensavers ########################## - -set( kscience_SOURCES science.cpp ) -set( kscience_DESKTOP KScience.desktop ) - -set( X11_SCREENSAVERS kscience) - -##### The GL screensavers ####################### - -set( kfountain_SOURCES fountain.cpp fountaincfg.ui ) -set( kfountain_DESKTOP KFountain.desktop ) -set( kwave_SOURCES wave.cpp wavecfg.ui ) -set( kwave_DESKTOP KWave.desktop ) -set( kgravity_SOURCES gravity.cpp gravitycfg.ui ) -set( kgravity_DESKTOP KGravity.desktop ) -set( kflux_SOURCES Flux.cpp ) -set( kflux_DESKTOP KFlux.desktop ) -set( keuphoria_SOURCES Euphoria.cpp ) -set( keuphoria_DESKTOP KEuphoria.desktop ) -set( ksolarwinds_SOURCES SolarWinds.cpp ) -set( ksolarwinds_DESKTOP KSolarWinds.desktop ) -set( krotation_SOURCES rotation.cpp rotationcfg.ui sspreviewarea.cpp - rkodesolver.cpp vec3.cpp ) -set( krotation_DESKTOP KRotation.desktop ) -set( kpendulum_SOURCES pendulum.cpp pendulumcfg.ui sspreviewarea.cpp - rkodesolver.cpp ) -set( kpendulum_DESKTOP KPendulum.desktop ) -set( OPENGL_SCREENSAVERS kfountain kwave kgravity kflux keuphoria ksolarwinds - krotation kpendulum ) - -##### The GL-Arts screensavers ################## - -set( kfiresaver_SOURCES firesaversetup.ui firesaverparticle.cpp - firesaverwriter.cpp firesaver.cpp ) -set( kfiresaver_DESKTOP KFiresaver.desktop ) -set( kfiresaver_LINK artskde-shared ) -set( GL_ARTS_SCREENSAVERS kfiresaver ) - -##### The LIBART screensavers ################### - -set( kclock_SOURCES kclock.cpp ) -set( kclock_DESKTOP KClock.desktop ) - -set( LIBART_SCREENSAVERS kclock ) - -##### LIBART conditions ######################### - -if( WITH_LIBART ) - list( APPEND SCREENSAVERS ${LIBART_SCREENSAVERS} ) - - include_directories( ${LIBART_INCLUDE_DIRS} ) - link_directories( ${LIBART_LIBRARY_DIRS} ) - foreach( saver ${LIBART_SCREENSAVERS} ) - list ( APPEND ${saver}_LINK ${LIBART_LIBRARIES} ) - endforeach( saver ${LIBART_SCREENSAVERS} ) -endif( WITH_LIBART ) - -##### GL conditions ############################# - -if( WITH_OPENGL ) - if( WITH_ARTS ) - list( APPEND OPENGL_SCREENSAVERS ${GL_ARTS_SCREENSAVERS} ) - endif( WITH_ARTS ) - - list( APPEND SCREENSAVERS ${OPENGL_SCREENSAVERS} ) - - include_directories( ${OPENGL_INCLUDE_DIRS} ) - link_directories( ${OPENGL_LIBRARY_DIRS} ) - foreach( saver ${OPENGL_SCREENSAVERS} ) - list ( APPEND ${saver}_LINK ${OPENGL_LIBRARIES} ) - endforeach( saver ${OPENGL_SCREENSAVERS} ) - -endif( WITH_OPENGL ) - -##### add normal screensavers ################### - -# FIXME: check for X includes/libraries -# this screensavers will work only in X -list( APPEND SCREENSAVERS ${X11_SCREENSAVERS} ) -list( APPEND SCREENSAVERS ${NORMAL_SCREENSAVERS} ) - -##### create install/compile rules ############## -foreach( saver ${SCREENSAVERS} ) - tde_add_executable( ${saver}.kss AUTOMOC - SOURCES ${${saver}_SOURCES} - LINK kscreensaver-shared tdeui-shared ${${saver}_LINK} - DESTINATION ${BIN_INSTALL_DIR} - ) - install( FILES ${${saver}_DESKTOP} - DESTINATION ${APPS_INSTALL_DIR}/System/ScreenSavers ) -endforeach( saver ${SCREENSAVERS} ) - -##### install various data ###################### - -install( FILES image.png kscience.png particle.png - DESTINATION ${DATA_INSTALL_DIR}/kscreensaver ) - -# Actually the only screensaver tha uses this data is kfiresaver -add_subdirectory( data ) diff --git a/kscreensaver/kdesavers/Euphoria.cpp b/kscreensaver/kdesavers/Euphoria.cpp deleted file mode 100644 index 7f69e34e..00000000 --- a/kscreensaver/kdesavers/Euphoria.cpp +++ /dev/null @@ -1,1084 +0,0 @@ -//============================================================================ -// -// Terence Welsh Screensaver - Euphoria -// http://www.reallyslick.com/ -// -// Ported to KDE by Karl Robillard -// -/* - * Copyright (C) 2002 Terence M. Welsh - * - * Euphoria is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * Euphoria is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ -//============================================================================ - - -#include <stdio.h> -#include <stdlib.h> -#include <math.h> -#include <time.h> -#include <tqtimer.h> -#include "Euphoria.h" -#include "Euphoria.moc" -#include "EuphoriaTexture.h" - - -#define NUMCONSTS 9 -#define PIx2 6.28318530718f - - -//---------------------------------------------------------------------------- - - -#include <sys/time.h> -#include <unistd.h> - - -// Returns the system time, in seconds. -double timeGetTime() -{ - struct timeval tp; - gettimeofday( &tp, 0 ); - return (double)tp.tv_sec + (double)tp.tv_usec / 1000000; -} - - -//---------------------------------------------------------------------------- - - -class rsVec -{ -public: - - float v[3]; - - rsVec() {} - rsVec(float xx, float yy, float zz); - - void set(float xx, float yy, float zz); - float normalize(); - float dot(rsVec); - void cross(rsVec, rsVec); - - float & operator [] (int i) {return v[i];} - const float & operator [] (int i) const {return v[i];} - rsVec & operator = (const rsVec &vec) - {v[0]=vec[0];v[1]=vec[1];v[2]=vec[2];return *this;}; - rsVec operator + (const rsVec &vec) - {return(rsVec(v[0]+vec[0], v[1]+vec[1], v[2]+vec[2]));}; - rsVec operator - (const rsVec &vec) - {return(rsVec(v[0]-vec[0], v[1]-vec[1], v[2]-vec[2]));}; - rsVec operator * (const float &mul) - {return(rsVec(v[0]*mul, v[1]*mul, v[2]*mul));}; - rsVec operator / (const float &div) - {float rec = 1.0f/div; return(rsVec(v[0]*rec, v[1]*rec, v[2]*rec));}; - rsVec & operator += (const rsVec &vec) - {v[0]+=vec[0];v[1]+=vec[1];v[2]+=vec[2];return *this;}; - rsVec & operator -= (const rsVec &vec) - {v[0]-=vec[0];v[1]-=vec[1];v[2]-=vec[2];return *this;}; - rsVec & operator *= (const rsVec &vec) - {v[0]*=vec[0];v[1]*=vec[1];v[2]*=vec[2];return *this;}; - rsVec & operator *= (const float &mul) - {v[0]*=mul;v[1]*=mul;v[2]*=mul;return *this;}; -}; - - -rsVec::rsVec(float xx, float yy, float zz){ - v[0] = xx; - v[1] = yy; - v[2] = zz; -} - - -void rsVec::set(float xx, float yy, float zz){ - v[0] = xx; - v[1] = yy; - v[2] = zz; -} - - -float rsVec::normalize(){ - float length = float(sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2])); - if(length == 0.0f){ - v[1] = 1.0f; - return(0.0f); - } - float reciprocal = 1.0f / length; - v[0] *= reciprocal; - v[1] *= reciprocal; - v[2] *= reciprocal; - // Really freakin' stupid compiler bug fix for VC++ 5.0 - /*v[0] /= length; - v[1] /= length; - v[2] /= length;*/ - return(length); -} - - -float rsVec::dot(rsVec vec1){ - return(v[0] * vec1[0] + v[1] * vec1[1] + v[2] * vec1[2]); -} - - -void rsVec::cross(rsVec vec1, rsVec vec2){ - v[0] = vec1[1] * vec2[2] - vec2[1] * vec1[2]; - v[1] = vec1[2] * vec2[0] - vec2[2] * vec1[0]; - v[2] = vec1[0] * vec2[1] - vec2[0] * vec1[1]; -} - - -//---------------------------------------------------------------------------- - - -void hsl2rgb(float h, float s, float l, float &r, float &g, float &b) -{ - // hue influence - if(h < 0.166667){ // full red, some green - r = 1.0; - g = h * 6.0f; - b = 0.0; - } - else { - if(h < 0.5){ // full green - g = 1.0; - if(h < 0.333333){ // some red - r = 1.0f - ((h - 0.166667f) * 6.0f); - b = 0.0; - } - else{ // some blue - b = (h - 0.333333f) * 6.0f; - r = 0.0; - } - } - else{ - if(h < 0.833333){ // full blue - b = 1.0; - if(h < 0.666667){ // some green - g = 1.0f - ((h - 0.5f) * 6.0f); - r = 0.0; - } - else{ // some red - r = (h - 0.666667f) * 6.0f; - g = 0.0; - } - } - else{ // full red, some blue - r = 1.0; - b = 1.0f - ((h - 0.833333f) * 6.0f); - g = 0.0; - } - } - } - - // saturation influence - r = 1.0f - (s * (1.0f - r)); - g = 1.0f - (s * (1.0f - g)); - b = 1.0f - (s * (1.0f - b)); - - // luminosity influence - r *= l; - g *= l; - b *= l; -} - - -// Useful random number macros -// Don't forget to initialize with srand() -inline int myRandi(int x){ - return((rand() * x) / RAND_MAX); -} -inline float myRandf(float x){ - return(float(rand() * x) / float(RAND_MAX)); -} - - -//---------------------------------------------------------------------------- - - -// Context pointer to allow many instances. -static EuphoriaWidget* _ec = 0; - - -class wisp -{ -public: - - wisp(); - ~wisp(); - void update(); - void draw(); - void drawAsBackground(); - - - int density; - float*** vertices; - float c[NUMCONSTS]; // constants - float cr[NUMCONSTS]; // constants' radial position - float cv[NUMCONSTS]; // constants' change velocities - float hsl[3]; - float rgb[3]; - float hueSpeed; - float saturationSpeed; -}; - - -wisp::wisp() -{ - int i, j; - float recHalfDens = 1.0f / (float(_ec->dDensity) * 0.5f); - - density = _ec->dDensity; - vertices = new float**[density+1]; - for(i=0; i<=density; i++) - { - vertices[i] = new float*[density+1]; - for(j=0; j<=density; j++) - { - vertices[i][j] = new float[7]; - vertices[i][j][3] = float(i) * recHalfDens - 1.0f; // x position on grid - vertices[i][j][4] = float(j) * recHalfDens - 1.0f; // y position on grid - // distance squared from the center - vertices[i][j][5] = vertices[i][j][3] * vertices[i][j][3] - + vertices[i][j][4] * vertices[i][j][4]; - vertices[i][j][6] = 0.0f; // intensity - } - } - - // initialize constants - for(i=0; i<NUMCONSTS; i++) - { - c[i] = myRandf(2.0f) - 1.0f; - cr[i] = myRandf(PIx2); - cv[i] = myRandf(_ec->dSpeed * 0.03f) + (_ec->dSpeed * 0.001f); - } - - // pick color - hsl[0] = myRandf(1.0f); - hsl[1] = 0.1f + myRandf(0.9f); - hsl[2] = 1.0f; - hueSpeed = myRandf(0.1f) - 0.05f; - saturationSpeed = myRandf(0.04f) + 0.001f; -} - - -wisp::~wisp() -{ - int i, j; - - for(i=0; i<=density; i++) - { - for(j=0; j<=density; j++) - { - delete[] vertices[i][j]; - } - delete[] vertices[i]; - } - delete[] vertices; -} - - -void wisp::update() -{ - int i, j; - rsVec up, right, crossvec; - // visibility constants - static float viscon1 = float(_ec->dVisibility) * 0.01f; - static float viscon2 = 1.0f / viscon1; - - // update constants - for(i=0; i<NUMCONSTS; i++){ - cr[i] += cv[i] * _ec->elapsedTime; - if(cr[i] > PIx2) - cr[i] -= PIx2; - c[i] = cos(cr[i]); - } - - // update vertex positions - for(i=0; i<=density; i++){ - for(j=0; j<=density; j++){ - vertices[i][j][0] = vertices[i][j][3] * vertices[i][j][3] * vertices[i][j][4] * c[0] - + vertices[i][j][5] * c[1] + 0.5f * c[2]; - vertices[i][j][1] = vertices[i][j][4] * vertices[i][j][4] * vertices[i][j][5] * c[3] - + vertices[i][j][3] * c[4] + 0.5f * c[5]; - vertices[i][j][2] = vertices[i][j][5] * vertices[i][j][5] * vertices[i][j][3] * c[6] - + vertices[i][j][4] * c[7] + c[8]; - } - } - - // update vertex normals for most of mesh - for(i=1; i<density; i++){ - for(j=1; j<density; j++){ - up.set(vertices[i][j+1][0] - vertices[i][j-1][0], - vertices[i][j+1][1] - vertices[i][j-1][1], - vertices[i][j+1][2] - vertices[i][j-1][2]); - right.set(vertices[i+1][j][0] - vertices[i-1][j][0], - vertices[i+1][j][1] - vertices[i-1][j][1], - vertices[i+1][j][2] - vertices[i-1][j][2]); - up.normalize(); - right.normalize(); - crossvec.cross(right, up); - // Use depth component of normal to compute intensity - // This way only edges of wisp are bright - if(crossvec[2] < 0.0f) - crossvec[2] *= -1.0f; - vertices[i][j][6] = viscon2 * (viscon1 - crossvec[2]); - if(vertices[i][j][6] > 1.0f) - vertices[i][j][6] = 1.0f; - if(vertices[i][j][6] < 0.0f) - vertices[i][j][6] = 0.0f; - } - } - - // update color - hsl[0] += hueSpeed * _ec->elapsedTime; - if(hsl[0] < 0.0f) - hsl[0] += 1.0f; - if(hsl[0] > 1.0f) - hsl[0] -= 1.0f; - hsl[1] += saturationSpeed * _ec->elapsedTime; - if(hsl[1] <= 0.1f){ - hsl[1] = 0.1f; - saturationSpeed = -saturationSpeed; - } - if(hsl[1] >= 1.0f){ - hsl[1] = 1.0f; - saturationSpeed = -saturationSpeed; - } - hsl2rgb(hsl[0], hsl[1], hsl[2], rgb[0], rgb[1], rgb[2]); -} - - -void wisp::draw() -{ - int i, j; - - glPushMatrix(); - - if(_ec->dWireframe) - { - for(i=1; i<density; i++){ - glBegin(GL_LINE_STRIP); - for(j=0; j<=density; j++){ - glColor3f(rgb[0] + vertices[i][j][6] - 1.0f, rgb[1] + vertices[i][j][6] - 1.0f, rgb[2] + vertices[i][j][6] - 1.0f); - glTexCoord2d(vertices[i][j][3] - vertices[i][j][0], vertices[i][j][4] - vertices[i][j][1]); - glVertex3fv(vertices[i][j]); - } - glEnd(); - } - for(j=1; j<density; j++){ - glBegin(GL_LINE_STRIP); - for(i=0; i<=density; i++){ - glColor3f(rgb[0] + vertices[i][j][6] - 1.0f, rgb[1] + vertices[i][j][6] - 1.0f, rgb[2] + vertices[i][j][6] - 1.0f); - glTexCoord2d(vertices[i][j][3] - vertices[i][j][0], vertices[i][j][4] - vertices[i][j][1]); - glVertex3fv(vertices[i][j]); - } - glEnd(); - } - } - else - { - for(i=0; i<density; i++){ - glBegin(GL_TRIANGLE_STRIP); - for(j=0; j<=density; j++){ - glColor3f(rgb[0] + vertices[i+1][j][6] - 1.0f, rgb[1] + vertices[i+1][j][6] - 1.0f, rgb[2] + vertices[i+1][j][6] - 1.0f); - glTexCoord2d(vertices[i+1][j][3] - vertices[i+1][j][0], vertices[i+1][j][4] - vertices[i+1][j][1]); - glVertex3fv(vertices[i+1][j]); - glColor3f(rgb[0] + vertices[i][j][6] - 1.0f, rgb[1] + vertices[i][j][6] - 1.0f, rgb[2] + vertices[i][j][6] - 1.0f); - glTexCoord2d(vertices[i][j][3] - vertices[i][j][0], vertices[i][j][4] - vertices[i][j][1]); - glVertex3fv(vertices[i][j]); - } - glEnd(); - } - } - - glPopMatrix(); -} - - -void wisp::drawAsBackground() -{ - int i, j; - - glPushMatrix(); - glTranslatef(c[0] * 0.2f, c[1] * 0.2f, 1.6f); - - if(_ec->dWireframe) - { - for(i=1; i<density; i++){ - glBegin(GL_LINE_STRIP); - for(j=0; j<=density; j++){ - glColor3f(rgb[0] + vertices[i][j][6] - 1.0f, rgb[1] + vertices[i][j][6] - 1.0f, rgb[2] + vertices[i][j][6] - 1.0f); - glTexCoord2d(vertices[i][j][3] - vertices[i][j][0], vertices[i][j][4] - vertices[i][j][1]); - glVertex3f(vertices[i][j][3], vertices[i][j][4], vertices[i][j][6]); - } - glEnd(); - } - for(j=1; j<density; j++){ - glBegin(GL_LINE_STRIP); - for(i=0; i<=density; i++){ - glColor3f(rgb[0] + vertices[i][j][6] - 1.0f, rgb[1] + vertices[i][j][6] - 1.0f, rgb[2] + vertices[i][j][6] - 1.0f); - glTexCoord2d(vertices[i][j][3] - vertices[i][j][0], vertices[i][j][4] - vertices[i][j][1]); - glVertex3f(vertices[i][j][3], vertices[i][j][4], vertices[i][j][6]); - } - glEnd(); - } - } - else - { - for(i=0; i<density; i++){ - glBegin(GL_TRIANGLE_STRIP); - for(j=0; j<=density; j++){ - glColor3f(rgb[0] + vertices[i+1][j][6] - 1.0f, rgb[1] + vertices[i+1][j][6] - 1.0f, rgb[2] + vertices[i+1][j][6] - 1.0f); - glTexCoord2d(vertices[i+1][j][3] - vertices[i+1][j][0], vertices[i+1][j][4] - vertices[i+1][j][1]); - glVertex3f(vertices[i+1][j][3], vertices[i+1][j][4], vertices[i+1][j][6]); - glColor3f(rgb[0] + vertices[i][j][6] - 1.0f, rgb[1] + vertices[i][j][6] - 1.0f, rgb[2] + vertices[i][j][6] - 1.0f); - glTexCoord2d(vertices[i][j][3] - vertices[i][j][0], vertices[i][j][4] - vertices[i][j][1]); - glVertex3f(vertices[i][j][3], vertices[i][j][4], vertices[i][j][6]); - } - glEnd(); - } - } - - glPopMatrix(); -} - - -//---------------------------------------------------------------------------- - - -EuphoriaWidget::EuphoriaWidget( TQWidget* parent, const char* name ) - : TQGLWidget(parent, name), texName(0), _wisps(0), _backwisps(0), - feedbackmap(0), feedbacktex(0) -{ - setDefaults( Regular ); - - _frameTime = 1000 / 60; - _timer = new TQTimer( this ); - connect( _timer, TQT_SIGNAL(timeout()), this, TQT_SLOT(nextFrame()) ); -} - - -EuphoriaWidget::~EuphoriaWidget() -{ - // Free memory - if ( texName ) - glDeleteTextures( 1, &texName ); - if ( feedbacktex ) - glDeleteTextures( 1, &feedbacktex ); - delete[] _wisps; - delete[] _backwisps; -} - - -void EuphoriaWidget::paintGL() -{ - int i; - static double lastTime = timeGetTime(); - - // update time - elapsedTime = timeGetTime() - lastTime; - lastTime += elapsedTime; - - _ec = this; - - // Update wisps - for(i=0; i<dWisps; i++) - _wisps[i].update(); - for(i=0; i<dBackground; i++) - _backwisps[i].update(); - - - if(dFeedback) - { - float feedbackIntensity = float(dFeedback) / 101.0f; - - // update feedback variables - for(i=0; i<4; i++) - { - fr[i] += elapsedTime * fv[i]; - if(fr[i] > PIx2) - fr[i] -= PIx2; - } - f[0] = 30.0f * cos(fr[0]); - f[1] = 0.2f * cos(fr[1]); - f[2] = 0.2f * cos(fr[2]); - f[3] = 0.8f * cos(fr[3]); - for(i=0; i<3; i++) - { - lr[i] += elapsedTime * lv[i]; - if(lr[i] > PIx2) - lr[i] -= PIx2; - l[i] = cos(lr[i]); - l[i] = l[i] * l[i]; - } - - // Create drawing area for feedback texture - glViewport(0, 0, feedbacktexsize, feedbacktexsize); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - gluPerspective(30.0, aspectRatio, 0.01f, 20.0f); - glMatrixMode(GL_MODELVIEW); - - // Draw - glClear(GL_COLOR_BUFFER_BIT); - glColor3f(feedbackIntensity, feedbackIntensity, feedbackIntensity); - glBindTexture(GL_TEXTURE_2D, feedbacktex); - glPushMatrix(); - glTranslatef(f[1] * l[1], f[2] * l[1], f[3] * l[2]); - glRotatef(f[0] * l[0], 0, 0, 1); - glBegin(GL_TRIANGLE_STRIP); - glTexCoord2f(-0.5f, -0.5f); - glVertex3f(-aspectRatio*2.0f, -2.0f, 1.25f); - glTexCoord2f(1.5f, -0.5f); - glVertex3f(aspectRatio*2.0f, -2.0f, 1.25f); - glTexCoord2f(-0.5f, 1.5f); - glVertex3f(-aspectRatio*2.0f, 2.0f, 1.25f); - glTexCoord2f(1.5f, 1.5f); - glVertex3f(aspectRatio*2.0f, 2.0f, 1.25f); - glEnd(); - glPopMatrix(); - glBindTexture(GL_TEXTURE_2D, texName); - for(i=0; i<dBackground; i++) - _backwisps[i].drawAsBackground(); - for(i=0; i<dWisps; i++) - _wisps[i].draw(); - - // readback feedback texture - glReadBuffer(GL_BACK); - glPixelStorei(GL_UNPACK_ROW_LENGTH, feedbacktexsize); - glBindTexture(GL_TEXTURE_2D, feedbacktex); - glReadPixels(0, 0, feedbacktexsize, feedbacktexsize, GL_RGB, GL_UNSIGNED_BYTE, feedbackmap); - glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, feedbacktexsize, feedbacktexsize, GL_RGB, GL_UNSIGNED_BYTE, feedbackmap); - - // create regular drawing area - glViewport(viewport[0], viewport[1], viewport[2], viewport[3]); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - gluPerspective(20.0, aspectRatio, 0.01f, 20.0f); - glMatrixMode(GL_MODELVIEW); - - // Draw again - glClear(GL_COLOR_BUFFER_BIT); - glColor3f(feedbackIntensity, feedbackIntensity, feedbackIntensity); - glPushMatrix(); - glTranslatef(f[1] * l[1], f[2] * l[1], f[3] * l[2]); - glRotatef(f[0] * l[0], 0, 0, 1); - glBegin(GL_TRIANGLE_STRIP); - glTexCoord2f(-0.5f, -0.5f); - glVertex3f(-aspectRatio*2.0f, -2.0f, 1.25f); - glTexCoord2f(1.5f, -0.5f); - glVertex3f(aspectRatio*2.0f, -2.0f, 1.25f); - glTexCoord2f(-0.5f, 1.5f); - glVertex3f(-aspectRatio*2.0f, 2.0f, 1.25f); - glTexCoord2f(1.5f, 1.5f); - glVertex3f(aspectRatio*2.0f, 2.0f, 1.25f); - glEnd(); - glPopMatrix(); - - glBindTexture(GL_TEXTURE_2D, texName); - } - else - glClear(GL_COLOR_BUFFER_BIT); - - // - for(i=0; i<dBackground; i++) - _backwisps[i].drawAsBackground(); - for(i=0; i<dWisps; i++) - _wisps[i].draw(); - - glFlush(); -} - - -void EuphoriaWidget::resizeGL( int w, int h ) -{ - glViewport(0, 0, w, h ); - - viewport[0] = 0; - viewport[1] = 0; - viewport[2] = w; - viewport[3] = h; - - aspectRatio = (float) w / (float) h; - - // setup regular drawing area just in case feedback isn't used - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - gluPerspective(20.0, aspectRatio, 0.01, 20); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - glTranslatef(0.0, 0.0, -5.0); -} - - -// Window initialization -void EuphoriaWidget::initializeGL() -{ - // Need to call this to setup viewport[] parameters used in - // the next updateParameters() call - resizeGL( width(), height() ); - - updateParameters(); - - _timer->start( _frameTime, true ); -} - - -#ifdef UNIT_TEST -void EuphoriaWidget::keyPressEvent( TQKeyEvent* e ) -{ - if( e->key() == TQt::Key_0 ) { setDefaults( 0 ); updateParameters(); } - if( e->key() == TQt::Key_1 ) { setDefaults( 1 ); updateParameters(); } - if( e->key() == TQt::Key_2 ) { setDefaults( 2 ); updateParameters(); } - if( e->key() == TQt::Key_3 ) { setDefaults( 3 ); updateParameters(); } - if( e->key() == TQt::Key_4 ) { setDefaults( 4 ); updateParameters(); } - if( e->key() == TQt::Key_5 ) { setDefaults( 5 ); updateParameters(); } - if( e->key() == TQt::Key_6 ) { setDefaults( 6 ); updateParameters(); } - if( e->key() == TQt::Key_7 ) { setDefaults( 7 ); updateParameters(); } - if( e->key() == TQt::Key_8 ) { setDefaults( 8 ); updateParameters(); } -} -#endif - - -void EuphoriaWidget::nextFrame() -{ - updateGL(); - _timer->start( _frameTime, true ); -} - - -void EuphoriaWidget::updateParameters() -{ - srand((unsigned)time(NULL)); - rand(); rand(); rand(); rand(); rand(); - - elapsedTime = 0.0f; - - fr[0] = 0.0f; - fr[1] = 0.0f; - fr[2] = 0.0f; - fr[3] = 0.0f; - - lr[0] = 0.0f; - lr[1] = 0.0f; - lr[2] = 0.0f; - - glClearColor(0.0f, 0.0f, 0.0f, 1.0f); - glClear(GL_COLOR_BUFFER_BIT); - glEnable(GL_BLEND); - glBlendFunc(GL_ONE, GL_ONE); - glLineWidth(2.0f); - - // Commented out because smooth lines and textures don't mix on my TNT. - // It's like it rendering in software mode - glEnable(GL_LINE_SMOOTH); - //glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); - - if(dTexture) - { - int whichtex = dTexture; - if(whichtex == 4) // random texture - whichtex = myRandi(3) + 1; - glEnable(GL_TEXTURE_2D); - glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); - // Initialize texture - glGenTextures(1, &texName); - glBindTexture(GL_TEXTURE_2D, texName); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); - switch(whichtex){ - case 1: - gluBuild2DMipmaps(GL_TEXTURE_2D, 1, TEXSIZE, TEXSIZE, GL_LUMINANCE, GL_UNSIGNED_BYTE, plasmamap); - break; - case 2: - gluBuild2DMipmaps(GL_TEXTURE_2D, 1, TEXSIZE, TEXSIZE, GL_LUMINANCE, GL_UNSIGNED_BYTE, stringymap); - break; - case 3: - gluBuild2DMipmaps(GL_TEXTURE_2D, 1, TEXSIZE, TEXSIZE, GL_LUMINANCE, GL_UNSIGNED_BYTE, linesmap); - } - } else if ( texName ) { - glDeleteTextures( 1, &texName ); - texName = 0; - } - - if(dFeedback) - { - feedbacktexsize = int(pow(2.0, dFeedbacksize)); - while(feedbacktexsize > viewport[2] || feedbacktexsize > viewport[3]){ - dFeedbacksize -= 1; - feedbacktexsize = int(pow(2.0, dFeedbacksize)); - } - - // feedback texture setup - glEnable(GL_TEXTURE_2D); - delete [] feedbackmap; - feedbackmap = new unsigned char[feedbacktexsize*feedbacktexsize*3]; - glGenTextures(1, &feedbacktex); - glBindTexture(GL_TEXTURE_2D, feedbacktex); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); - glTexImage2D(GL_TEXTURE_2D, 0, 3, feedbacktexsize, feedbacktexsize, 0, GL_RGB, GL_UNSIGNED_BYTE, feedbackmap); - - // feedback velocity variable setup - fv[0] = float(dFeedbackspeed) * (myRandf(0.025f) + 0.025f); - fv[1] = float(dFeedbackspeed) * (myRandf(0.05f) + 0.05f); - fv[2] = float(dFeedbackspeed) * (myRandf(0.05f) + 0.05f); - fv[3] = float(dFeedbackspeed) * (myRandf(0.1f) + 0.1f); - lv[0] = float(dFeedbackspeed) * (myRandf(0.0025f) + 0.0025f); - lv[1] = float(dFeedbackspeed) * (myRandf(0.0025f) + 0.0025f); - lv[2] = float(dFeedbackspeed) * (myRandf(0.0025f) + 0.0025f); - } else if ( feedbacktex ) { - glDeleteTextures( 1, &feedbacktex ); - feedbacktex = 0; - } - - // Initialize wisps - _ec = this; - delete[] _wisps; - delete[] _backwisps; - _wisps = new wisp[dWisps]; - _backwisps = new wisp[dBackground]; -} - - -/** - May be called at any time - makes no OpenGL calls. -*/ -void EuphoriaWidget::setDefaults(int which) -{ - switch(which) - { - case Grid: - dWisps = 4; - dBackground = 1; - dDensity = 25; - dVisibility = 70; - dSpeed = 15; - dFeedback = 0; - dFeedbackspeed = 1; - dFeedbacksize = 8; - dWireframe = 1; - dTexture = 0; - break; - - case Cubism: - dWisps = 15; - dBackground = 0; - dDensity = 4; - dVisibility = 15; - dSpeed = 10; - dFeedback = 0; - dFeedbackspeed = 1; - dFeedbacksize = 8; - dWireframe = 0; - dTexture = 0; - break; - - case BadMath: - dWisps = 2; - dBackground = 2; - dDensity = 20; - dVisibility = 40; - dSpeed = 30; - dFeedback = 40; - dFeedbackspeed = 5; - dFeedbacksize = 8; - dWireframe = 1; - dTexture = 2; - break; - - case MTheory: - dWisps = 3; - dBackground = 0; - dDensity = 25; - dVisibility = 15; - dSpeed = 20; - dFeedback = 40; - dFeedbackspeed = 20; - dFeedbacksize = 8; - dWireframe = 0; - dTexture = 0; - break; - - case UHFTEM: - dWisps = 0; - dBackground = 3; - dDensity = 35; - dVisibility = 5; - dSpeed = 50; - dFeedback = 0; - dFeedbackspeed = 1; - dFeedbacksize = 8; - dWireframe = 0; - dTexture = 0; - break; - - case Nowhere: - dWisps = 0; - dBackground = 3; - dDensity = 30; - dVisibility = 40; - dSpeed = 20; - dFeedback = 80; - dFeedbackspeed = 10; - dFeedbacksize = 8; - dWireframe = 1; - dTexture = 3; - break; - - case Echo: - dWisps = 3; - dBackground = 0; - dDensity = 25; - dVisibility = 30; - dSpeed = 20; - dFeedback = 85; - dFeedbackspeed = 30; - dFeedbacksize = 8; - dWireframe = 0; - dTexture = 1; - break; - - case Kaleidoscope: - dWisps = 3; - dBackground = 0; - dDensity = 25; - dVisibility = 40; - dSpeed = 15; - dFeedback = 90; - dFeedbackspeed = 3; - dFeedbacksize = 8; - dWireframe = 0; - dTexture = 0; - break; - - case Regular: - default: - dWisps = 5; - dBackground = 0; - dDensity = 25; - dVisibility = 35; - dSpeed = 15; - dFeedback = 0; - dFeedbackspeed = 1; - dFeedbacksize = 8; - dWireframe = 0; - dTexture = 2; - break; - } -} - - -//---------------------------------------------------------------------------- - - -#ifndef UNIT_TEST -#include <klocale.h> -#include <kglobal.h> -#include <kconfig.h> - - -// libkscreensaver interface -extern "C" -{ - KDE_EXPORT const char* kss_applicationName = "keuphoria.kss"; - KDE_EXPORT const char* kss_description = I18N_NOOP( "Euphoria" ); - KDE_EXPORT const char* kss_version = "1.0"; - - KDE_EXPORT KScreenSaver* kss_create( WId id ) - { - return new KEuphoriaScreenSaver( id ); - } - - KDE_EXPORT TQDialog* kss_setup() - { - return new KEuphoriaSetup; - } -} - - -//---------------------------------------------------------------------------- - - -KEuphoriaScreenSaver::KEuphoriaScreenSaver( WId id ) : KScreenSaver( id ) -{ - _effect = new EuphoriaWidget; - - readSettings(); - - embed( _effect ); - _effect->show(); -} - - -KEuphoriaScreenSaver::~KEuphoriaScreenSaver() -{ -} - - -static int filterRandom( int n ) -{ - if( (n < 0) || (n >= EuphoriaWidget::DefaultModes) ) - { - srand((unsigned)time(NULL)); - n = rand() % EuphoriaWidget::DefaultModes; - } - return n; -} - - -void KEuphoriaScreenSaver::readSettings() -{ - TDEConfig* config = TDEGlobal::config(); - config->setGroup("Settings"); - - _mode = config->readNumEntry( "Mode", EuphoriaWidget::Regular ); - _effect->setDefaults( filterRandom(_mode) ); -} - - -/** - Any invalid mode will select one at random. -*/ -void KEuphoriaScreenSaver::setMode( int id ) -{ - _mode = id; - _effect->setDefaults( filterRandom(id) ); - _effect->updateParameters(); -} - - -//---------------------------------------------------------------------------- - - -#include <tqlayout.h> -#include <tqlabel.h> -#include <tqcombobox.h> -#include <kmessagebox.h> - - -static const char* defaultText[] = -{ - I18N_NOOP( "Regular" ), - I18N_NOOP( "Grid" ), - I18N_NOOP( "Cubism" ), - I18N_NOOP( "Bad Math" ), - I18N_NOOP( "M-Theory" ), - I18N_NOOP( "UHFTEM" ), //"ultra high frequency tunneling electron microscope", - I18N_NOOP( "Nowhere" ), - I18N_NOOP( "Echo" ), - I18N_NOOP( "Kaleidoscope" ), - I18N_NOOP( "(Random)" ), - 0 -}; - - -KEuphoriaSetup::KEuphoriaSetup( TQWidget* parent, const char* name ) - : KDialogBase( parent, name, true, i18n("Setup Euphoria Screen Saver"), - Ok|Cancel|Help, Ok, true ) -{ - setButtonText( Help, i18n( "A&bout" ) ); - - TQWidget *main = makeMainWidget(); - - TQHBoxLayout* top = new TQHBoxLayout(main, 0, spacingHint()); - TQVBoxLayout* leftCol = new TQVBoxLayout; - top->addLayout( leftCol ); - - TQLabel* label = new TQLabel( i18n("Mode:"), main ); - leftCol->addWidget( label ); - - modeW = new TQComboBox( main ); - int i = 0; - while (defaultText[i]) - modeW->insertItem( i18n(defaultText[i++]) ); - leftCol->addWidget( modeW ); - - leftCol->addStretch(); - - // Preview - TQWidget* preview; - preview = new TQWidget( main ); - preview->setFixedSize( 220, 170 ); - preview->setBackgroundColor( black ); - preview->show(); // otherwise saver does not get correct size - _saver = new KEuphoriaScreenSaver( preview->winId() ); - top->addWidget(preview); - - // Now that we have _saver... - modeW->setCurrentItem( _saver->mode() ); // set before we connect - connect( modeW, TQT_SIGNAL(activated(int)), _saver, TQT_SLOT(setMode(int)) ); - - setMinimumSize( sizeHint() ); -} - - -KEuphoriaSetup::~KEuphoriaSetup() -{ - delete _saver; -} - - -void KEuphoriaSetup::slotHelp() -{ - KMessageBox::about(this, - i18n("<h3>Euphoria 1.0</h3>\n<p>Copyright (c) 2002 Terence M. Welsh<br>\n<a href=\"http://www.reallyslick.com/\">http://www.reallyslick.com/</a></p>\n\n<p>Ported to KDE by Karl Robillard</p>"), - TQString(), KMessageBox::AllowLink); -} - - -/** - Ok pressed - save settings and exit -*/ -void KEuphoriaSetup::slotOk() -{ - TDEConfig* config = TDEGlobal::config(); - config->setGroup("Settings"); - - TQString val; - val.setNum( modeW->currentItem() ); - config->writeEntry("Mode", val ); - - config->sync(); - accept(); -} -#endif -//---------------------------------------------------------------------------- - - -#ifdef UNIT_TEST -// moc Euphoria.h -o Euphoria.moc -// g++ -g -DUNIT_TEST Euphoria.cpp -I/usr/lib/qt3/include -lqt -L/usr/lib/qt3/lib -lGLU -lGL - -#include <tqapplication.h> - -int main( int argc, char** argv ) -{ - TQApplication app( argc, argv ); - - EuphoriaWidget w; - w.setDefaults( EuphoriaWidget::UHFTEM ); - app.setMainWidget( &w ); - w.show(); - - return app.exec(); -} -#endif - - -//EOF diff --git a/kscreensaver/kdesavers/Euphoria.h b/kscreensaver/kdesavers/Euphoria.h deleted file mode 100644 index 40959139..00000000 --- a/kscreensaver/kdesavers/Euphoria.h +++ /dev/null @@ -1,158 +0,0 @@ -#ifndef __EUPHORIASS_H__ -#define __EUPHORIASS_H__ -//============================================================================ -// -// Terence Welsh Screensaver - Euphoria -// http://www.reallyslick.com/ -// -// KDE port by Karl Robillard -// -//============================================================================ - - -#include <tqgl.h> - -#include <kdialogbase.h> - -class wisp; -class TQTimer; - -class EuphoriaWidget : public TQGLWidget -{ - Q_OBJECT - - -public: - - enum eDefault - { - Regular, - Grid, - Cubism, - BadMath, - MTheory, - UHFTEM, // ultra high frequency tunneling electron microscope - Nowhere, - Echo, - Kaleidoscope, - DefaultModes - }; - - EuphoriaWidget( TQWidget* parent=0, const char* name=0 ); - ~EuphoriaWidget(); - - void updateParameters(); - void setDefaults( int which ); - -protected: - - void paintGL(); - void resizeGL( int w, int h ); - void initializeGL(); -#ifdef UNIT_TEST - void keyPressEvent( TQKeyEvent* ); -#endif - -private slots: - - void nextFrame(); - -private: - - GLuint texName; - wisp* _wisps; - wisp* _backwisps; - unsigned char* feedbackmap; - float aspectRatio; - int viewport[4]; - double elapsedTime; - - // feedback texture object - unsigned int feedbacktex; - int feedbacktexsize; - // feedback variables - float fr[4]; - float fv[4]; - float f[4]; - // feedback limiters - float lr[3]; - float lv[3]; - float l[3]; - - - - int dWisps; - int dBackground; - int dDensity; - int dVisibility; - float dSpeed; - int dFeedback; - int dFeedbackspeed; - int dFeedbacksize; - int dWireframe; - int dTexture; - int dPriority; - - - // Using TQTimer rather than timerEvent() to avoid getting locked out of - // the TQEvent loop on lower-end systems. Ian Geiser <[email protected]> - // says this is the way to go. - TQTimer* _timer; - int _frameTime; - - friend class wisp; -}; - - -#ifndef UNIT_TEST -#include <tqdialog.h> -#include <kscreensaver.h> - - -class KEuphoriaScreenSaver : public KScreenSaver -{ - Q_OBJECT - - -public: - - KEuphoriaScreenSaver( WId id ); - virtual ~KEuphoriaScreenSaver(); - - int mode() const { return _mode; } - -public slots: - - void setMode( int ); - -private: - - void readSettings(); - - EuphoriaWidget* _effect; - int _mode; -}; - - -class TQComboBox; - -class KEuphoriaSetup : public KDialogBase -{ - Q_OBJECT - - -public: - KEuphoriaSetup( TQWidget* parent = 0, const char* name = 0 ); - ~KEuphoriaSetup(); - -private slots: - void slotHelp(); - void slotOk(); - -private: - TQComboBox* modeW; - KEuphoriaScreenSaver* _saver; -}; -#endif - -#endif //__EUPHORIASS_H__ diff --git a/kscreensaver/kdesavers/EuphoriaTexture.h b/kscreensaver/kdesavers/EuphoriaTexture.h deleted file mode 100644 index 5a6962b4..00000000 --- a/kscreensaver/kdesavers/EuphoriaTexture.h +++ /dev/null @@ -1,4138 +0,0 @@ -/* - * Copyright (C) 2002 Terence M. Welsh - * - * Euphoria is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * Euphoria is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - - -#ifndef TEXTURE_H -#define TEXTURE_H - - - -#define TEXSIZE 256 - - - -unsigned char plasmamap[TEXSIZE * TEXSIZE] = { -224,235,221,199,206,186,153,139,173,154,105,108,129,82,34,16,9,12,17,21,21,19,14,5,1,6,21,61,84,114,185,164,183,190,176,161,173,199,191,157,194,193,187,163,150,139,121,114, -104,84,72,68,63,66,69,66,58,51,44,34,30,28,27,22,17,9,6,9,10,5,0,0,0,6,17,28,37,49,56,64,62,59,64,73,83,88,84,73,75,84,105,130,116,91,97,97, -109,123,146,189,247,253,178,184,210,186,151,122,84,91,92,90,100,92,88,111,165,219,217,207,204,190,225,252,239,250,255,255,252,252,239,224,191,173,177,165,120,78,66,83,51,50,115,137, -95,104,150,149,100,86,80,72,75,87,83,58,45,28,24,15,7,2,0,0,1,6,7,3,3,3,8,9,19,36,47,51,45,44,52,71,83,72,61,57,63,86,108,147,191,186,165,172, -160,147,107,88,95,122,135,157,193,227,241,229,221,229,243,253,255,255,254,252,248,238,229,228,233,245,247,239,246,248,235,226,184,147,98,55,44,36,43,43,34,29,49,59,63,194,255,255, -255,255,255,255,255,255,255,255,255,242,252,233,213,231,221,228,205,192,193,191,190,175,153,156,173,184,172,127,104,62,24,8,5,9,14,19,23,23,16,6,1,8,30,66,77,114,192,217, -219,210,177,148,142,149,130,111,147,157,155,162,162,157,154,148,129,100,84,75,68,68,70,63,57,51,45,37,30,28,27,22,16,10,6,7,6,0,0,0,0,1,15,27,35,43,55,62, -63,58,61,70,88,84,75,73,73,85,111,134,125,101,85,82,107,150,183,186,236,247,133,100,113,107,98,72,63,85,78,83,108,121,116,135,160,163,161,158,155,147,192,246,253,254,254,250, -253,248,232,233,227,236,224,201,171,149,120,69,83,140,158,130,94,143,142,118,113,120,94,70,62,64,71,55,41,31,29,17,3,0,0,0,0,0,7,7,7,10,14,16,27,45,58,63, -58,65,78,86,86,77,62,55,59,71,94,130,142,125,114,99,83,84,78,82,92,99,123,169,207,214,224,217,222,233,249,254,252,250,246,226,205,206,210,211,221,245,245,243,248,248,242,226, -178,99,57,36,28,29,30,30,27,28,64,116,162,235,255,255,255,255,255,255,255,255,255,255,255,255,255,252,203,196,176,203,164,144,121,143,172,180,169,178,163,141,118,85,48,21,6,1, -1,7,14,20,24,22,15,8,5,10,28,44,71,106,155,208,194,175,140,116,113,98,88,83,88,106,136,158,165,164,153,141,126,109,92,78,70,65,63,63,56,49,43,37,33,28,26,22, -16,14,8,5,0,0,0,0,0,0,9,22,31,38,49,57,61,59,59,64,92,94,100,80,78,107,136,143,154,121,84,94,165,183,140,158,253,218,84,68,68,73,76,56,52,44,47,88, -153,162,144,146,149,163,186,172,156,196,227,245,248,238,234,241,247,232,199,211,221,219,191,141,168,175,164,137,153,178,151,112,102,151,144,104,111,123,76,40,33,34,29,27,29,19,19,9, -0,0,0,0,0,3,7,7,10,15,19,23,35,49,56,61,68,83,92,88,80,70,59,51,50,52,64,98,100,65,51,50,63,70,77,84,80,91,108,168,217,199,194,205,227,243,253,253, -252,243,224,187,160,163,191,203,215,225,238,241,241,241,239,221,190,106,50,27,23,21,21,28,27,24,62,130,211,255,255,255,255,254,254,255,255,255,255,255,255,255,248,243,224,200,190,182, -91,79,72,79,73,132,164,172,140,61,22,23,16,6,0,0,0,2,12,20,21,20,17,10,9,14,20,28,65,98,104,147,142,141,123,111,94,87,84,78,78,84,97,123,146,149,126,106, -111,109,95,84,71,64,63,64,52,44,41,34,30,27,24,23,19,14,9,7,2,0,1,0,0,0,8,19,33,43,49,62,76,75,66,65,86,99,104,73,88,133,149,165,175,132,114,143, -185,187,123,127,238,203,72,61,54,59,71,48,38,43,85,148,189,183,133,154,157,175,184,177,184,219,238,253,247,222,236,243,234,229,206,194,207,180,141,97,123,132,118,126,142,151,143,122, -128,147,156,144,109,87,50,20,13,19,10,3,5,2,1,0,0,0,12,16,3,7,13,8,14,16,22,31,41,57,69,72,84,90,90,75,66,59,50,44,40,36,43,57,49,33,30,34, -42,51,66,77,84,109,115,168,219,204,185,205,240,246,250,252,248,232,215,200,190,190,201,213,213,220,194,210,229,231,235,204,162,102,55,35,26,26,26,28,30,29,45,92,170,239,247,246, -235,235,254,255,255,255,255,255,255,255,253,253,222,198,183,126,75,57,49,61,61,82,121,134,125,50,13,6,0,0,0,0,0,0,8,17,21,23,20,16,22,22,16,28,44,52,61,77, -91,106,97,79,69,63,65,70,78,90,118,146,155,136,118,102,104,102,90,82,72,64,61,58,48,40,34,29,27,23,23,21,20,15,14,12,7,5,6,5,2,6,15,23,31,43,56,77, -114,98,86,76,76,71,70,66,109,151,187,203,170,153,155,193,194,161,116,113,154,134,71,65,51,49,61,44,37,61,113,140,134,119,113,149,191,200,187,198,171,198,208,193,199,176,201,228, -219,213,175,192,196,155,109,73,72,71,59,50,83,115,120,115,121,107,95,83,61,37,21,8,6,13,8,0,0,0,0,0,1,28,30,15,5,8,10,17,22,23,28,38,47,71,72,65, -76,78,73,62,52,44,40,35,30,30,31,33,28,27,29,30,40,59,98,109,101,122,155,205,219,218,207,219,245,241,229,248,229,226,218,212,214,210,184,153,168,157,140,139,178,199,207,184, -134,90,55,42,37,35,33,30,34,41,45,65,109,167,196,208,218,235,255,255,255,255,255,255,255,255,255,255,218,150,133,106,82,51,43,40,50,52,69,88,78,36,10,3,0,0,0,0, -0,0,8,20,26,26,27,27,35,30,19,22,34,34,37,47,47,57,55,49,45,44,47,61,86,125,148,155,161,128,106,99,92,86,82,76,70,65,61,55,43,35,28,26,23,20,16,15, -17,16,17,19,15,13,10,8,7,10,16,26,28,41,68,87,92,105,107,73,56,50,64,86,106,130,185,196,182,197,180,193,210,143,99,92,104,85,71,63,49,47,50,44,45,68,93,120, -111,102,116,155,179,161,168,186,182,162,143,106,120,105,140,180,207,165,128,150,144,109,82,54,27,19,15,17,30,34,58,78,77,55,24,14,19,16,12,7,8,16,14,3,0,1,1,0, -19,44,28,13,8,14,19,24,30,37,41,41,55,75,66,58,55,57,59,56,45,35,30,26,24,27,23,23,22,23,33,49,63,108,158,123,101,147,193,229,224,224,224,231,238,186,125,142, -130,180,217,218,210,162,119,80,86,82,83,71,102,151,171,162,112,71,56,41,35,35,31,33,37,45,50,57,72,101,130,158,217,255,255,255,255,255,255,255,255,255,255,255,215,125,115,112, -97,66,58,43,40,44,34,37,35,23,10,3,0,0,0,0,0,2,16,33,36,38,40,31,27,20,19,23,34,37,33,30,27,35,37,40,34,34,45,68,98,95,78,78,85,79,80,79, -76,77,75,71,69,65,63,52,42,35,30,26,23,17,14,14,16,19,21,20,19,19,19,16,14,14,21,27,31,45,78,100,91,99,101,70,44,45,68,104,113,149,186,221,249,253,232,208, -217,129,122,125,78,66,63,51,43,47,51,54,59,79,101,115,87,76,101,127,130,123,153,175,168,122,100,84,95,98,121,141,167,135,137,141,118,106,66,24,9,9,10,12,16,13,15,27, -23,20,8,13,14,9,7,10,26,30,24,14,10,10,9,10,14,21,23,23,20,22,34,33,34,42,61,62,62,58,58,69,65,51,50,49,40,35,31,26,22,19,22,26,26,35,48,73, -120,162,187,161,126,180,229,229,224,227,234,228,147,90,54,37,45,115,208,200,146,87,77,77,72,73,82,78,90,102,108,136,113,83,49,29,34,35,34,35,36,37,38,43,51,56,61,111, -183,248,255,255,255,255,255,255,255,255,255,255,228,136,111,123,109,85,73,52,44,44,30,22,19,12,8,3,2,0,1,2,3,8,34,50,36,44,49,37,23,16,16,31,59,58,31,20, -16,22,27,28,31,47,65,99,112,57,42,52,61,58,61,65,69,71,69,65,65,61,57,49,38,35,31,26,22,17,13,15,17,21,26,26,24,27,29,27,24,23,27,31,36,54,78,107, -129,139,119,75,49,45,62,107,171,247,255,253,255,255,255,252,233,156,165,171,76,58,56,43,42,49,51,69,85,95,102,106,87,73,79,78,87,104,128,144,135,98,88,104,108,121,139,133, -137,113,130,135,95,93,69,21,13,10,10,15,9,3,1,3,0,0,3,19,21,14,15,15,27,37,36,24,20,20,20,20,19,21,21,24,30,59,75,61,61,57,85,84,62,54,63,85, -78,51,45,48,44,44,36,29,24,21,23,27,43,73,100,132,156,177,172,162,147,187,232,224,219,235,241,194,101,51,28,31,43,116,182,179,148,105,100,120,112,115,128,134,112,97,100,122, -72,48,37,38,42,43,38,34,33,37,41,43,45,42,52,73,128,178,226,255,255,255,255,255,255,248,225,232,179,123,130,137,84,79,73,64,62,47,31,23,19,13,9,9,8,8,9,9, -12,20,42,45,30,41,55,51,33,20,22,65,107,73,36,23,21,19,20,22,30,37,56,82,93,66,45,52,61,52,51,59,63,68,65,62,62,56,50,42,35,35,34,28,22,20,17,20, -24,24,28,31,31,35,36,37,33,31,33,36,41,54,76,121,170,163,142,84,55,49,62,98,144,193,229,255,255,255,254,253,245,176,172,128,63,50,48,41,44,52,66,91,106,116,111,102, -86,86,72,65,78,92,105,120,119,104,113,136,135,140,126,102,100,112,109,93,62,63,56,23,13,10,16,21,10,1,6,17,2,0,15,30,29,28,22,17,28,40,40,33,28,27,28,30, -40,37,34,47,73,109,125,112,73,55,80,93,76,69,66,77,68,54,54,57,50,44,38,35,36,40,36,40,86,146,167,175,184,191,186,162,155,194,222,211,192,205,211,162,85,45,30,33, -31,36,72,148,149,125,126,150,135,126,126,126,106,111,147,119,56,43,50,50,48,49,44,40,38,43,49,54,61,51,54,64,97,123,175,219,247,255,255,255,255,222,178,167,140,115,129,122, -80,69,69,85,92,62,42,35,30,20,16,16,14,16,19,19,20,29,45,42,36,55,65,65,50,34,66,119,99,62,50,35,31,28,27,35,40,31,37,66,92,92,72,87,72,51,58,65, -65,65,59,58,55,49,45,38,34,31,33,28,23,23,23,26,28,29,33,36,42,41,41,42,42,37,36,38,47,59,90,136,165,146,154,86,54,57,65,65,73,94,189,255,255,255,255,254, -254,245,147,80,57,50,49,48,48,56,77,106,121,129,118,98,91,94,78,77,77,79,88,100,111,127,141,162,170,161,121,78,76,105,115,93,77,55,40,21,6,8,14,22,26,12,22,36, -10,10,31,44,40,22,26,26,37,50,49,47,42,38,41,44,55,42,52,84,108,128,129,118,73,61,91,114,104,65,57,59,65,75,63,54,44,37,33,42,59,93,84,99,171,208,199,196, -218,217,199,179,184,208,213,185,136,129,141,90,51,38,28,28,29,23,27,64,102,100,115,112,76,94,123,125,143,139,141,100,50,52,56,56,54,50,45,44,43,47,54,66,69,50,50,59, -93,118,171,189,204,243,255,253,213,156,140,144,126,112,129,108,116,115,112,105,100,75,52,45,37,27,24,24,23,27,30,26,30,31,47,62,93,106,85,75,70,70,112,130,101,82,76,62, -63,45,28,43,33,30,82,122,119,120,92,85,87,97,101,79,65,58,54,51,48,45,42,38,36,30,33,31,29,27,29,31,34,36,41,44,47,48,47,48,45,41,40,43,49,71,92,123, -153,121,115,97,75,75,78,66,64,68,108,170,217,211,232,255,255,215,97,69,58,55,51,51,55,66,85,111,127,132,136,134,125,111,106,106,66,56,62,76,94,118,156,170,154,148,130,91, -125,128,112,102,84,68,40,21,10,7,19,34,27,15,26,30,14,22,43,54,57,34,37,37,42,54,56,55,51,52,52,51,55,48,57,79,102,121,122,107,102,112,111,111,100,66,57,57, -54,59,50,42,38,36,43,69,115,160,180,217,242,236,225,225,227,191,171,187,217,245,242,192,111,84,68,54,44,33,28,28,22,16,17,23,38,45,51,55,43,42,77,135,178,175,140,94, -55,50,56,57,54,49,48,44,44,44,55,76,75,44,40,64,80,95,161,189,184,238,254,225,155,92,93,127,118,107,123,137,173,171,158,136,92,80,71,57,33,28,35,37,40,33,37,40, -41,35,51,80,104,98,79,80,95,129,141,108,90,82,88,83,82,63,56,69,51,68,101,140,136,107,71,70,99,122,107,76,58,51,51,47,43,40,38,35,34,36,35,33,31,33,35,37, -41,41,45,49,51,54,52,51,49,48,50,50,57,83,94,106,142,123,100,107,98,97,95,82,63,56,61,80,114,139,187,246,241,207,112,88,72,62,55,55,62,77,101,123,140,151,162,172, -160,121,90,75,47,38,45,57,70,90,162,196,146,149,175,142,148,123,100,102,71,51,33,29,27,24,42,42,22,17,34,35,20,31,43,43,66,75,70,51,51,56,57,55,59,63,57,54, -58,45,51,65,86,120,126,132,120,109,118,106,92,76,64,57,48,54,42,35,38,54,85,153,201,215,240,255,254,248,247,250,250,194,180,235,253,255,255,193,90,70,57,50,47,42,34,28, -17,10,13,20,22,23,29,35,36,36,40,69,164,183,135,77,59,49,51,52,48,49,49,47,45,42,58,72,68,45,41,66,76,77,136,189,197,218,214,190,164,119,119,120,111,129,133,173, -201,205,210,189,128,82,77,63,47,42,44,71,79,55,49,44,38,55,83,82,70,68,58,68,147,163,147,118,84,75,79,79,77,116,146,123,112,104,70,90,137,128,102,114,114,99,95,71, -50,44,43,41,37,37,36,30,31,35,35,33,33,34,40,43,43,44,50,55,56,56,57,59,57,59,65,63,77,93,105,135,137,139,107,86,85,80,88,80,52,47,55,66,85,100,128,196, -212,203,167,148,93,65,62,62,73,82,97,121,146,168,180,169,141,107,68,38,26,23,42,64,80,92,164,199,175,165,171,180,142,94,88,98,65,42,35,33,40,36,45,41,27,29,51,47, -30,40,42,38,55,57,68,68,66,65,70,72,78,70,62,58,48,42,58,78,97,116,132,146,113,118,118,94,63,64,58,48,40,36,34,33,40,72,154,233,255,253,253,255,255,255,255,255, -252,241,241,255,255,252,254,175,91,90,73,52,48,45,38,29,20,14,10,9,12,15,19,24,30,38,40,48,127,162,136,93,56,44,43,45,48,48,49,44,41,42,52,62,62,48,43,58, -70,77,126,160,167,176,177,165,157,125,121,115,115,155,172,199,210,211,211,206,170,105,80,65,98,101,101,147,129,102,72,45,38,80,101,100,68,70,65,78,144,153,165,175,148,95,84,80, -70,119,161,135,136,122,78,86,147,160,150,121,97,86,78,55,40,37,37,36,38,40,37,33,28,31,34,36,38,40,42,44,45,48,55,59,59,62,64,64,65,79,86,79,83,90,118,167, -175,133,90,48,54,65,78,72,51,42,50,57,70,105,156,165,162,175,176,142,97,71,72,71,83,97,105,100,109,139,162,144,106,79,50,28,21,27,49,104,153,160,175,183,176,167,135,165, -137,85,88,92,62,42,38,41,49,48,52,40,36,43,61,65,50,62,62,55,51,48,56,68,70,88,76,71,79,84,90,73,58,75,86,92,111,129,137,142,137,146,136,113,75,61,51,45, -40,30,28,29,45,109,215,255,255,254,255,255,255,255,255,255,254,255,253,254,250,248,248,227,196,179,135,86,61,58,52,44,29,14,6,5,5,6,13,21,28,33,35,42,95,148,136,87, -48,43,36,40,45,47,48,45,44,45,54,58,62,52,44,52,70,105,133,142,172,183,190,164,137,122,129,150,175,193,200,210,193,203,217,214,194,168,157,150,179,204,213,196,172,157,108,64, -54,80,115,120,70,73,101,115,135,143,168,196,171,140,114,78,87,136,172,164,149,147,105,93,109,98,90,91,72,54,52,40,30,33,35,37,38,38,33,29,27,29,31,38,41,44,42,44, -47,51,57,59,63,69,72,73,86,112,104,88,77,79,113,168,179,102,50,35,43,63,66,58,49,42,37,36,55,111,164,147,132,158,167,129,91,77,78,80,90,116,122,100,100,105,125,133, -95,85,56,34,27,36,51,120,168,204,193,162,130,123,126,150,123,102,93,84,58,43,43,58,76,71,58,49,52,71,71,68,84,100,91,62,63,57,50,61,85,102,76,69,71,85,105,100, -122,134,98,59,102,154,141,135,142,136,133,108,106,82,59,49,42,31,28,33,66,161,249,255,255,255,255,255,255,255,255,255,255,255,255,255,254,253,249,236,225,197,176,154,118,99,83,79, -51,9,0,0,0,0,12,24,35,41,35,41,83,125,113,66,71,72,56,50,56,59,57,65,73,80,91,94,92,78,55,59,109,136,150,172,189,196,191,157,127,142,157,183,214,211,214,205, -177,200,242,239,234,228,227,224,217,225,234,217,208,189,137,141,150,158,194,172,94,123,142,155,161,167,179,180,178,191,148,121,137,179,189,175,155,140,107,63,37,48,59,64,48,41,41,33, -33,37,41,38,37,37,31,26,30,31,34,38,42,43,42,43,48,52,59,63,68,73,78,85,107,137,129,92,76,79,106,135,112,68,43,38,44,45,43,45,41,45,40,45,83,141,172,146, -126,125,156,163,121,97,91,95,104,134,137,116,118,114,122,128,90,73,52,36,30,45,48,102,168,208,193,154,136,153,160,132,105,100,87,64,45,45,47,65,76,71,58,69,86,98,97,105, -111,108,95,72,62,50,45,59,108,108,69,76,79,82,106,141,168,160,90,57,76,146,155,143,130,126,114,107,115,107,71,48,30,30,33,40,90,203,255,255,255,255,255,255,255,255,255,255, -255,255,255,255,255,254,253,241,215,201,205,184,111,95,84,66,40,10,1,0,0,6,22,33,42,52,47,70,113,120,78,83,118,112,114,111,105,128,113,122,147,164,158,144,125,99,64,70, -107,139,175,193,191,193,167,137,163,203,205,222,218,212,222,200,220,242,255,248,249,254,253,247,242,242,243,241,241,214,201,231,221,193,196,203,162,170,140,148,148,147,153,168,182,203,193,189, -205,198,189,177,151,118,85,52,33,30,41,42,38,34,29,30,41,52,49,45,38,35,34,30,34,36,35,40,42,43,43,47,49,52,58,63,71,78,83,90,107,123,113,85,77,86,97,97, -70,56,51,49,51,43,37,50,54,56,62,75,129,173,190,171,157,156,171,177,147,109,87,99,112,136,139,150,160,157,164,151,121,86,50,29,26,49,55,80,119,170,217,180,170,177,139,107, -99,86,77,55,38,42,45,51,56,62,83,107,114,102,129,150,118,97,99,85,68,51,52,68,102,105,79,97,104,97,105,154,173,148,129,121,121,141,147,144,134,129,125,132,134,104,58,35, -23,27,35,43,97,211,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,254,254,243,228,218,206,189,154,143,100,61,26,9,3,8,19,26,27,41,56,51,44,86,76,34,24,35, -79,142,169,168,150,156,160,180,201,205,185,165,141,99,77,79,93,133,175,184,193,185,133,149,179,215,240,234,226,218,228,229,249,255,254,254,255,255,255,255,255,255,254,255,254,248,255,250, -218,183,169,196,176,196,191,142,95,100,156,148,176,200,200,212,212,200,142,149,141,84,51,35,33,37,37,33,34,31,34,36,48,61,52,41,35,30,30,31,36,36,37,41,44,47,47,49, -51,54,59,68,75,82,86,90,101,120,97,77,75,82,85,80,63,51,58,66,65,65,64,71,77,73,77,114,163,213,232,236,228,225,214,158,170,114,106,132,133,133,130,170,192,182,189,170, -132,94,55,30,24,33,40,76,84,80,204,199,197,160,82,91,97,68,63,55,41,41,48,54,70,93,132,134,109,94,121,144,142,150,130,82,62,47,49,82,104,93,97,118,150,141,151,176, -183,165,160,164,163,153,137,132,137,133,130,144,134,71,34,19,21,30,47,69,113,219,255,255,255,255,255,255,255,255,255,255,255,255,255,254,253,253,249,245,239,226,210,182,164,149,101,49, -20,13,10,27,44,40,30,52,58,45,41,59,33,22,29,38,63,108,173,156,129,136,149,182,205,205,192,182,161,137,129,107,106,128,156,175,215,185,167,190,170,189,239,240,249,246,249,252, -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,252,242,236,218,200,186,197,177,135,134,172,169,141,187,191,183,194,201,172,91,105,114,69,49,40,40,47,41,33,31,35,41,38, -37,42,47,42,31,30,31,33,35,40,43,43,52,57,54,55,56,58,63,71,77,84,92,99,102,114,97,79,76,82,80,70,58,54,71,88,87,86,79,91,95,92,106,143,193,240,255,255, -255,255,214,129,140,133,167,176,170,157,168,187,205,198,192,160,109,65,34,30,30,26,29,55,78,87,151,192,177,105,77,93,79,57,52,49,44,49,61,94,127,113,118,112,95,98,120,128, -133,167,128,75,63,43,49,87,112,114,112,128,167,177,182,194,194,161,146,164,173,167,157,155,160,153,148,153,120,42,21,22,38,56,115,189,213,248,255,255,255,255,255,255,255,255,255,254, -255,255,255,255,255,255,253,248,240,171,121,100,95,97,58,31,22,20,23,42,57,48,54,90,88,68,61,65,57,42,44,62,94,118,154,142,151,171,189,199,207,204,200,199,196,194,179,132, -125,128,154,173,212,213,178,151,144,192,232,248,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,254,246,218,199,213,201,178,173,187,183,184,116,126,176,193,157,168, -179,151,109,85,71,61,51,45,41,40,38,40,41,41,44,33,24,29,37,36,30,29,31,35,38,48,55,57,59,63,64,61,61,61,65,78,86,95,106,112,119,121,105,83,73,73,70,66, -61,63,88,115,113,108,102,105,112,130,158,186,214,250,255,255,255,252,236,201,168,168,194,203,179,184,200,204,212,219,192,157,98,49,26,29,35,41,49,50,51,70,113,179,169,94,102,88, -58,50,48,50,54,66,86,129,164,113,85,90,92,93,121,120,115,154,123,85,77,51,57,85,126,139,147,154,157,185,182,180,183,177,178,184,180,170,171,167,167,160,144,126,68,21,28,62, -79,123,217,255,255,255,255,255,255,255,255,255,255,254,248,245,255,247,180,197,213,186,212,241,194,91,66,87,102,92,61,29,24,24,34,51,70,72,73,85,121,119,78,92,95,58,64,79, -120,144,160,167,183,196,217,226,232,227,220,212,206,193,178,128,127,139,154,150,136,183,176,149,179,226,226,245,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254, -229,200,187,212,236,228,221,211,185,139,85,128,149,161,118,107,151,156,120,82,80,71,59,49,33,31,41,47,52,56,49,26,19,23,28,31,31,33,37,41,47,55,65,75,69,68,70,71, -70,66,70,83,100,109,125,141,156,146,132,111,100,83,68,68,77,86,108,136,147,139,136,123,116,157,205,218,224,250,255,255,255,235,232,198,176,175,191,201,177,185,199,220,227,224,197,176, -99,57,35,41,57,65,63,49,54,76,149,187,200,143,90,68,52,55,59,62,80,100,116,132,129,98,85,90,106,113,139,123,118,119,111,99,85,65,72,104,151,158,169,162,135,151,184,177, -186,215,221,210,198,177,175,161,161,157,94,37,29,29,44,65,99,176,253,255,255,255,255,255,255,255,255,255,255,252,234,227,231,160,54,52,63,65,95,160,137,66,57,64,90,84,57,31, -30,41,56,70,82,78,65,83,111,119,115,148,118,64,77,102,143,173,191,206,219,231,246,250,250,247,239,227,212,192,189,134,102,126,133,123,97,151,200,201,224,238,241,252,255,255,255,255, -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,240,236,247,242,248,241,238,225,167,139,144,165,123,132,136,98,108,107,83,94,98,97,92,82,70,45,50,57,56,65,45,27, -21,26,28,31,40,44,48,52,59,64,70,75,75,79,83,82,78,72,77,84,102,121,143,167,189,164,156,149,132,101,97,95,102,107,107,135,157,147,160,157,151,186,210,232,249,254,255,255, -255,227,198,205,183,185,178,185,196,199,197,206,211,207,185,160,106,85,71,84,115,105,85,64,59,93,178,219,218,182,109,88,73,77,86,115,160,168,161,137,121,114,112,120,129,129,141,130, -120,122,121,88,79,86,102,151,177,156,171,170,108,115,167,190,221,236,234,229,219,187,177,162,168,111,20,7,31,30,35,27,33,100,247,255,235,247,255,255,255,255,255,255,255,252,228,213, -137,73,45,36,38,45,50,92,107,63,56,51,51,44,33,33,41,66,90,80,70,73,61,61,102,100,153,169,128,92,78,112,144,176,224,238,243,254,255,255,255,254,255,240,208,192,186,130, -90,102,91,92,90,127,186,224,224,236,249,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,253,247,249,253,247,245,241,225,217,221,226,205,153,146,118,95, -77,70,86,107,105,120,125,132,128,83,68,69,55,54,42,30,24,31,40,44,52,58,61,65,69,72,71,71,73,77,80,83,80,75,80,101,121,135,150,172,196,180,171,172,160,129,109,126, -132,146,149,148,164,163,168,176,197,222,210,224,250,255,255,255,255,246,220,228,217,189,169,203,218,205,199,198,178,189,182,160,130,112,112,141,176,147,92,84,88,121,190,218,219,215,171,129, -98,104,142,206,242,241,239,212,170,142,132,137,139,136,141,143,120,137,116,98,115,126,142,190,197,170,176,164,111,112,136,162,211,228,229,226,212,198,184,180,156,62,0,0,12,8,12,14, -9,35,150,222,211,245,255,255,255,255,255,255,255,250,232,208,122,73,56,49,48,50,50,76,93,72,62,56,43,34,29,33,42,54,79,70,69,85,68,68,106,113,151,142,161,157,115,93, -123,183,238,250,255,255,255,255,255,255,250,198,173,189,182,148,101,91,78,78,86,109,132,173,220,240,243,254,255,255,253,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, -255,255,254,253,250,250,247,245,236,236,233,221,161,114,87,92,79,92,106,120,133,142,156,164,112,72,70,63,63,49,40,33,30,37,49,56,62,66,70,72,70,68,65,69,71,75,75,76, -78,76,79,120,154,149,149,186,212,190,171,197,192,161,93,82,112,178,197,186,183,182,173,191,226,224,212,222,248,254,255,255,255,253,240,231,208,184,203,234,221,198,205,212,189,187,193,185, -182,177,196,201,179,182,112,106,119,185,186,189,217,239,222,194,161,154,220,255,255,255,255,238,190,165,157,155,153,151,147,140,127,139,141,133,136,135,167,212,205,197,199,150,126,129,129,155, -206,226,231,224,206,204,182,178,136,70,24,16,15,24,29,21,9,7,30,115,146,171,234,245,236,253,255,255,255,250,247,236,151,83,65,61,50,43,47,63,77,78,72,57,41,33,29,33, -41,45,50,49,61,76,78,80,92,135,126,142,176,137,100,112,127,189,239,247,255,255,255,255,255,254,231,170,167,185,183,158,107,98,90,93,105,120,127,141,197,234,240,254,255,255,254,255, -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,252,248,247,247,234,225,214,190,156,119,102,104,122,137,134,141,137,150,182,185,111,55,52,56,65,51,49,44, -31,37,47,56,61,62,65,65,64,65,66,70,75,75,76,72,72,73,77,102,148,175,183,196,215,217,198,192,194,146,78,62,90,171,189,158,146,150,142,180,226,210,215,225,229,232,242,252, -255,255,247,220,199,192,232,248,228,213,213,218,208,204,203,201,212,239,255,245,207,206,178,143,156,211,213,219,242,248,249,245,228,219,240,255,255,255,255,245,219,205,196,220,224,204,200,172, -146,153,162,160,141,148,177,213,226,235,224,158,125,164,153,167,212,228,231,225,203,200,211,184,128,90,95,137,125,107,66,33,16,12,28,37,41,88,196,225,232,254,255,255,255,254,255,253, -186,98,70,66,58,49,52,61,71,77,70,52,40,33,30,30,36,38,38,34,43,58,77,76,95,151,160,156,116,101,113,143,172,192,211,228,234,250,255,255,255,255,221,191,192,193,182,146, -105,120,121,126,139,154,144,130,185,227,242,253,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,252,248,248,243,236,231,221,192,187,182,170,167, -175,157,120,126,119,134,169,185,134,73,59,62,68,56,47,38,35,36,37,48,54,56,58,58,59,64,68,75,83,79,79,80,76,72,73,86,122,155,190,191,191,205,196,163,158,161,98,73, -85,125,158,161,123,113,112,151,194,201,200,201,197,191,207,234,247,234,224,207,190,193,221,233,221,204,208,222,222,232,219,225,229,245,255,255,248,235,255,238,245,247,247,239,254,255,255,253, -250,249,254,255,255,255,255,255,250,252,248,250,255,252,255,240,225,217,193,191,192,182,187,221,238,243,228,193,165,185,156,185,217,226,227,217,193,158,184,208,162,142,160,192,199,135,86,58, -35,24,42,56,38,90,173,224,240,255,255,255,255,255,255,255,198,106,71,68,62,55,61,65,75,72,64,50,38,31,34,35,37,36,33,30,36,43,55,61,105,161,143,127,115,116,135,150, -199,194,197,207,187,226,255,255,255,253,219,203,208,196,167,128,112,132,140,149,161,155,157,154,199,235,247,252,249,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, -255,255,255,255,250,242,245,240,238,241,236,231,233,231,220,211,192,162,133,120,100,105,135,155,121,85,87,100,59,49,45,43,57,52,43,47,58,59,61,69,77,92,104,109,125,112,101,99, -100,90,78,82,93,133,210,221,194,191,197,170,146,191,155,104,125,160,170,164,123,125,118,132,142,147,179,191,182,162,182,212,214,201,197,183,179,185,204,212,199,189,214,232,229,217,218,235, -235,238,252,255,255,255,255,255,255,255,252,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,252,255,255,255,255,255,249,242,246,250,234,227,242,249,246,239,213,193,200,178,201, -220,226,224,207,164,127,154,149,177,210,164,153,184,151,121,86,61,41,50,68,68,99,175,214,240,255,255,255,255,255,255,243,165,98,77,69,63,58,62,72,78,68,64,58,48,34,36,41, -43,38,33,30,31,35,34,42,88,128,109,93,135,154,168,184,189,171,190,172,161,226,254,255,255,248,218,194,206,193,163,143,141,140,160,169,173,167,161,156,194,234,242,249,255,255,255,255, -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,247,234,239,235,228,227,233,239,239,232,217,207,194,175,151,116,91,85,108,122,73,69,86,105,63,43,48,66, -87,92,107,88,106,116,100,122,153,164,162,167,170,164,148,136,119,107,91,95,115,154,194,180,184,193,199,182,167,199,198,167,179,207,205,180,120,115,113,107,123,114,143,164,157,153,167,182, -187,182,171,157,160,171,192,205,183,176,199,211,203,180,211,239,245,247,245,254,255,255,255,255,255,255,253,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, -255,255,255,255,255,255,255,255,253,252,248,236,220,208,196,220,228,233,228,211,163,132,182,148,192,238,168,184,187,149,148,106,73,58,49,51,64,86,160,191,212,255,255,255,255,255,255,217, -130,91,85,75,68,65,64,82,82,66,63,59,55,41,41,45,47,38,33,31,33,41,47,44,48,59,65,66,93,141,189,211,197,167,142,151,162,194,228,249,238,222,204,193,205,194,156,154, -176,178,192,208,198,178,176,169,201,228,234,224,243,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,252,246,253,255,255,248,236,238,236,233,226,222,226,229,226,212,203, -193,176,149,122,91,73,98,94,57,61,65,71,66,41,28,26,68,139,158,137,115,132,143,171,182,185,176,147,139,157,171,171,142,116,94,105,128,137,157,156,136,170,192,189,169,190,207,201, -197,199,189,179,121,91,91,73,78,82,95,116,115,108,125,139,153,155,136,133,142,160,183,185,178,160,163,155,154,162,199,234,248,252,254,255,255,255,255,255,255,255,255,255,253,255,255,255, -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,250,246,242,240,234,233,241,245,246,235,218,176,143,186,207,215,162,142,206,229,177,133,107, -72,79,93,108,105,100,132,177,196,232,228,239,255,255,255,219,150,111,87,73,66,66,72,86,85,76,79,73,62,47,43,47,47,43,40,35,34,36,41,43,36,36,45,69,85,137,189,158, -155,141,134,151,168,150,161,189,191,185,175,175,182,182,179,194,203,194,189,201,200,200,192,179,208,228,221,197,220,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,253,248,252,250, -250,253,253,253,248,240,240,236,232,226,225,222,220,218,208,203,191,173,151,123,92,80,84,73,73,65,58,64,62,57,35,12,8,107,144,51,22,37,57,132,172,170,132,112,136,153,168,177, -139,128,97,93,109,111,126,168,148,140,158,162,158,171,180,189,190,179,160,156,146,102,64,52,42,44,59,83,83,79,97,104,119,122,116,120,137,154,178,171,168,153,161,142,143,165,198,234, -252,255,255,255,255,255,255,255,255,255,255,255,255,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,249,233,203,214,232,229,242,250,252, -253,252,243,224,180,157,193,218,196,141,133,161,219,233,170,104,68,88,79,82,87,136,165,192,199,163,172,212,252,255,255,234,183,130,79,61,58,59,71,101,109,93,94,85,64,51,57,63, -65,63,45,42,40,30,33,33,29,35,50,90,98,115,146,120,123,121,126,127,130,127,143,163,170,161,160,164,176,183,201,221,205,199,205,199,193,213,215,204,197,210,192,186,218,249,255,255, -255,255,255,249,255,255,255,255,255,255,255,255,254,248,250,253,254,254,253,252,248,246,240,243,240,232,234,225,225,219,211,199,170,142,125,108,79,90,80,57,63,61,45,47,38,52,45,15, -0,54,76,10,14,29,42,95,149,154,144,155,160,164,157,161,156,155,112,86,91,101,106,129,154,154,127,132,144,143,119,146,167,150,134,135,125,75,31,23,22,24,36,55,58,64,76,82, -95,101,108,114,129,140,153,147,129,140,151,146,156,187,225,243,246,255,255,255,255,255,255,255,255,255,255,255,255,252,255,255,255,255,255,255,254,255,255,255,255,255,255,255,255,255,255,255, -255,255,255,255,255,255,255,235,182,160,178,214,225,238,247,253,255,255,247,224,176,151,190,206,168,154,137,82,77,151,155,113,66,70,48,29,36,99,189,196,175,154,190,217,239,255,255,250, -197,115,71,65,64,62,71,111,119,104,99,92,73,72,73,77,90,78,50,43,38,35,34,30,33,54,71,88,86,92,111,90,80,79,92,122,139,119,121,143,142,134,142,165,178,187,211,229, -217,229,242,229,212,217,225,224,217,200,192,171,214,249,255,255,255,255,245,238,254,255,255,255,255,255,252,246,245,241,252,252,252,254,254,253,247,247,246,243,235,241,243,240,236,218,207,178, -144,108,86,93,88,82,66,57,49,38,22,21,28,33,35,14,3,12,14,10,16,33,48,90,160,177,176,175,164,155,129,143,172,171,148,106,85,97,106,116,150,158,125,108,108,98,64,93, -119,113,116,113,76,27,13,10,13,20,34,49,54,57,61,68,84,100,115,125,135,149,153,142,119,126,146,169,190,215,240,245,248,255,255,255,255,255,255,255,255,255,255,255,255,254,254,253, -250,255,255,249,248,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,238,224,253,247,187,164,177,204,234,240,250,255,255,255,246,225,199,162,180,193,142,93,84,57,42,70,98,87, -47,33,36,41,80,109,126,165,163,169,199,203,231,242,249,229,170,97,71,76,75,71,78,101,132,139,120,111,99,105,98,90,87,64,44,38,34,36,36,31,31,45,61,66,68,66,79,59, -54,62,73,122,139,99,92,108,122,148,156,170,186,197,213,221,231,250,252,239,221,222,232,225,219,207,200,170,220,249,254,255,231,220,203,215,247,255,255,255,255,255,240,228,239,245,249,248, -249,252,254,252,250,252,248,240,236,241,247,241,232,204,199,182,160,108,77,82,84,93,77,59,41,24,13,10,15,16,15,9,5,7,8,15,16,26,40,64,148,180,175,165,149,150,146,144, -158,165,164,139,100,86,93,115,132,127,108,92,85,80,61,73,79,83,85,82,44,19,7,5,15,28,48,59,61,61,58,64,78,101,118,136,164,183,163,155,153,149,147,182,210,218,221,232, -245,252,254,255,255,255,255,255,255,255,255,255,255,255,255,253,233,236,238,241,248,255,255,255,255,255,255,255,255,255,255,255,255,255,232,218,199,168,213,249,208,161,175,207,228,242,253,255, -255,255,243,220,196,182,169,147,111,63,56,40,33,38,62,47,36,28,23,28,71,106,119,155,182,168,173,155,149,139,142,139,100,80,71,76,78,76,80,98,134,162,140,112,102,106,109,101, -71,48,38,34,33,34,30,27,30,38,52,52,57,52,54,44,54,68,95,137,122,95,100,123,168,182,171,172,182,207,218,229,240,248,253,254,247,233,227,231,240,206,179,172,222,255,255,247, -172,158,176,200,225,252,254,255,255,255,250,245,236,236,241,236,247,250,255,253,248,233,235,241,246,247,246,238,224,208,191,167,128,107,73,56,78,93,82,57,27,13,12,14,16,13,10,8, -8,15,17,14,12,15,24,33,70,132,153,130,104,107,134,147,157,149,155,162,125,69,72,86,99,105,93,77,63,62,61,59,61,72,66,55,33,14,5,1,19,47,79,94,84,75,62,68, -83,104,126,150,171,194,176,168,170,157,146,182,222,228,227,234,241,235,229,248,255,255,255,255,255,255,255,255,255,255,249,246,231,206,221,235,249,255,255,255,255,255,255,255,255,255,255,255, -255,253,221,208,217,190,165,180,175,162,177,201,228,246,255,255,255,255,241,219,190,184,173,108,58,47,41,33,26,27,29,27,30,33,26,24,36,71,133,184,150,113,106,70,55,52,55,64, -72,78,76,77,79,79,84,104,143,186,167,118,106,109,121,114,77,52,37,34,33,31,31,31,31,34,44,44,49,51,55,57,62,78,134,139,95,94,114,136,154,163,165,157,163,208,233,242, -248,246,248,248,253,252,241,246,245,204,175,173,177,212,214,197,122,144,185,214,206,201,247,255,255,254,254,247,226,205,220,234,239,231,243,252,234,194,201,234,242,247,245,241,229,221,173,132, -88,88,102,112,104,98,77,50,20,16,21,23,22,14,10,10,15,20,19,13,8,10,19,22,31,48,77,101,94,75,104,147,153,125,150,153,90,49,58,73,85,86,86,68,44,40,38,38, -44,54,48,34,19,6,3,10,44,79,106,101,90,86,63,71,114,139,135,144,176,201,182,170,185,172,155,162,214,234,234,226,232,235,240,240,247,255,255,255,255,254,255,255,255,255,236,232, -234,213,211,220,234,254,253,255,255,255,255,255,255,255,255,255,255,254,240,215,204,200,200,173,167,184,182,186,220,246,255,255,255,253,235,214,200,199,205,156,76,40,37,31,16,17,23,15, -22,30,24,27,34,47,104,126,78,42,30,30,29,41,62,82,100,86,82,79,77,79,88,104,142,201,187,129,107,108,133,157,132,76,43,33,34,42,44,43,41,38,42,41,44,68,101,87, -78,134,164,130,94,98,130,147,156,187,196,197,207,233,249,250,253,248,246,247,248,254,239,229,221,208,179,157,130,133,140,139,105,123,158,189,173,210,255,255,255,254,249,239,229,233,238,231, -207,213,229,235,225,182,189,215,227,235,231,231,235,231,210,185,164,161,156,161,150,119,73,35,23,28,26,27,28,23,19,19,30,33,16,13,15,16,20,24,30,31,55,93,82,62,85,144, -149,114,150,107,45,42,51,70,76,71,73,63,38,23,19,23,40,59,44,17,10,7,13,31,65,106,139,135,108,95,73,71,114,161,161,158,191,218,203,177,192,180,149,140,179,221,229,218, -196,197,234,238,227,243,255,255,255,253,253,255,255,252,221,228,221,214,221,219,234,250,252,255,255,255,255,255,255,255,255,254,252,241,219,220,222,222,217,196,198,205,182,154,187,245,255,255, -255,252,231,211,208,208,208,178,111,69,47,23,16,16,17,14,20,26,28,29,38,66,76,70,55,22,22,26,45,94,136,162,146,98,85,77,72,73,85,97,114,151,146,127,113,113,141,183, -189,116,68,38,41,64,69,64,54,51,58,54,57,101,161,139,126,193,204,165,148,146,167,185,197,205,208,222,245,254,254,255,253,249,248,238,235,228,231,210,187,185,171,144,111,106,108,105, -88,104,153,165,151,217,255,253,252,240,246,246,227,226,247,239,198,196,199,211,184,186,206,208,206,210,180,178,203,215,213,207,208,194,167,157,146,123,87,56,41,34,24,29,36,34,28,34, -56,49,27,20,23,24,19,22,27,37,48,55,56,48,64,139,158,147,154,71,41,45,51,64,58,54,59,58,40,16,14,27,73,93,42,19,22,27,41,72,94,125,172,163,119,83,71,68, -83,134,165,183,183,198,212,198,175,173,150,128,154,199,228,197,160,180,193,217,215,224,252,255,241,238,254,255,255,252,238,241,215,218,231,243,253,253,254,255,255,255,255,255,255,255,255,255, -249,235,219,238,242,233,210,194,206,197,190,182,208,252,254,254,254,247,228,215,208,211,208,178,144,109,56,17,19,20,21,21,26,28,33,37,44,73,82,77,72,54,51,61,77,118,160,162, -130,84,70,61,65,69,77,91,97,111,119,109,115,121,139,176,173,148,108,64,62,71,86,82,62,56,71,84,92,115,192,240,232,235,233,220,199,193,204,203,207,217,228,245,254,255,255,255, -252,242,238,220,215,224,219,186,171,199,176,141,109,90,86,88,90,95,135,155,154,180,224,242,233,224,252,242,210,211,238,252,229,198,193,222,183,191,199,189,200,206,172,176,210,224,222,220, -212,189,184,178,169,143,108,77,52,40,30,26,26,27,24,33,41,35,36,33,31,36,31,29,31,45,54,51,47,49,55,100,150,133,100,54,43,42,44,49,45,44,48,48,37,28,23,76, -108,66,34,29,41,59,78,113,122,128,163,163,144,97,75,62,63,88,129,198,205,183,189,187,157,148,173,153,157,193,213,179,180,185,168,198,214,211,224,234,231,240,255,255,255,254,252,252, -247,247,253,255,252,248,250,255,255,255,255,255,255,255,255,255,254,246,245,245,229,214,199,196,196,182,172,200,245,252,254,254,252,241,222,213,205,213,210,204,193,108,56,34,23,27,29,29, -35,35,38,54,49,87,113,75,73,75,102,129,133,142,158,146,118,70,48,37,58,69,72,80,83,83,86,85,100,119,126,142,149,147,119,102,97,97,102,93,70,65,75,92,121,136,176,253, -255,248,218,220,210,214,219,219,219,233,246,255,255,255,255,255,253,228,204,182,185,204,219,185,183,204,165,120,111,83,82,93,87,90,129,204,199,192,208,234,235,252,252,203,182,215,246,253, -254,247,250,246,208,201,204,199,217,219,205,218,222,205,208,232,222,210,206,196,155,123,119,107,59,37,27,26,20,23,24,30,33,33,40,61,70,70,64,44,37,45,55,48,38,38,34,36, -58,44,33,48,54,37,34,40,47,56,50,44,48,58,64,112,109,73,58,56,73,101,111,147,154,122,119,137,136,119,85,73,78,87,137,221,212,192,189,192,175,165,197,184,175,187,203,205, -187,167,180,207,217,208,200,205,228,252,255,255,255,255,255,245,246,252,255,255,252,245,250,248,250,253,255,255,255,255,255,255,255,250,249,236,207,189,190,210,211,187,184,207,248,250,255,254, -248,232,214,207,206,207,207,198,197,123,43,52,38,36,38,35,35,43,59,79,78,69,56,44,49,62,125,146,148,157,164,156,129,75,52,42,56,64,69,70,68,64,66,73,83,105,112,121, -156,134,114,118,105,105,106,92,83,77,87,126,171,190,229,255,255,235,199,210,211,217,220,222,229,245,255,255,255,255,255,255,247,214,183,170,160,185,215,196,193,184,121,101,102,78,86,93, -93,118,149,186,194,206,203,240,255,255,227,184,208,225,241,252,252,253,249,249,232,220,215,199,203,232,225,219,211,194,205,222,229,231,227,219,153,135,154,142,80,38,27,23,17,17,29,34, -28,31,50,82,107,104,93,69,47,42,48,44,34,19,24,20,22,29,33,51,57,36,33,52,65,63,49,50,69,94,132,132,97,76,68,76,98,128,146,165,156,127,111,127,132,130,93,84, -114,165,179,182,146,144,179,196,185,176,204,204,200,194,196,207,190,179,206,225,227,224,204,208,227,254,255,255,255,255,255,243,242,245,249,255,253,243,228,228,240,242,250,255,255,255,255,255, -255,254,249,221,184,196,213,222,210,190,198,196,233,252,254,253,246,227,212,217,208,205,211,203,200,165,94,92,78,61,52,49,43,47,79,105,90,58,44,43,38,41,65,108,141,165,154,98, -66,61,57,51,56,57,62,65,62,57,59,65,72,90,111,146,167,135,134,104,80,83,86,79,82,91,151,218,249,243,250,255,255,246,212,213,219,224,235,247,253,254,255,255,255,255,255,250, -231,203,178,173,167,184,200,214,198,160,106,104,112,86,82,79,111,111,148,193,176,175,178,220,239,215,157,155,183,238,241,248,248,246,217,200,210,210,204,183,199,215,198,185,200,213,201,197, -208,224,224,220,170,116,132,127,62,28,26,22,24,22,21,35,43,52,69,83,105,109,109,80,49,40,45,55,51,35,27,38,62,66,63,83,65,42,76,100,97,72,55,45,83,160,160,151, -115,80,68,76,99,135,180,164,137,106,100,116,105,80,72,75,128,146,130,143,167,121,144,175,177,169,184,196,205,220,217,217,226,189,203,213,199,201,186,197,218,249,255,245,226,226,236,233, -235,232,229,233,241,233,228,238,252,248,249,255,255,255,255,255,255,255,246,217,207,225,228,225,201,185,206,224,239,248,250,247,240,221,207,206,203,204,211,206,201,194,189,155,122,127,97,73, -54,59,105,118,73,52,50,43,43,43,31,72,115,137,76,40,52,63,57,55,52,54,55,57,56,55,57,59,64,77,104,143,176,158,161,94,63,69,80,87,104,128,207,255,255,255,255,253, -254,248,232,219,221,232,250,255,255,255,254,255,255,255,249,228,207,184,163,154,151,165,193,213,157,116,105,119,115,107,93,94,147,140,144,178,151,146,160,171,163,185,207,198,204,249,249,241, -232,205,168,133,151,165,178,192,205,214,194,155,194,224,212,197,193,194,197,203,161,113,125,112,56,28,21,19,35,34,22,38,69,85,86,84,112,129,118,71,51,38,34,55,50,50,95,140, -136,112,85,84,90,116,162,154,127,83,82,71,104,163,162,176,177,136,86,82,95,120,172,148,153,120,72,88,77,57,47,51,84,109,118,106,148,147,129,130,143,156,165,168,198,215,204,212, -228,211,185,171,137,141,130,144,175,211,228,196,141,160,186,215,229,214,217,227,234,227,241,254,255,255,255,255,255,255,255,255,255,255,254,246,240,238,239,232,211,197,224,238,236,246,246,241, -233,210,201,201,199,204,210,208,210,207,212,191,170,186,144,111,82,87,105,100,79,71,61,55,49,45,45,47,65,58,21,29,48,59,56,50,45,44,49,50,48,48,51,55,58,73,92,132, -172,169,142,88,64,58,75,118,171,225,246,255,255,255,254,253,249,218,224,217,215,234,253,255,255,255,253,241,240,242,233,204,184,161,149,146,148,165,196,196,148,101,97,108,115,136,142,129, -189,163,146,154,133,132,164,150,161,213,253,255,255,253,242,225,213,149,115,115,123,142,170,193,192,183,142,115,170,206,210,214,205,177,160,172,139,111,121,99,55,35,23,27,48,34,27,45, -75,95,80,101,111,122,113,88,59,31,28,62,50,79,180,203,164,123,95,79,98,146,171,168,139,88,98,112,129,146,150,175,198,162,133,108,88,122,167,155,170,144,101,88,70,65,43,49, -70,94,127,112,112,144,158,118,114,122,121,109,155,182,173,208,231,203,154,132,102,97,90,99,112,140,163,150,111,105,137,184,180,182,205,220,222,220,247,250,249,252,255,255,255,255,255,255, -255,255,255,254,253,250,245,236,226,215,225,238,246,248,246,243,229,207,197,191,192,203,210,215,215,222,215,203,218,190,155,141,122,113,92,105,122,91,87,85,64,57,51,37,42,36,22,30, -42,47,48,41,37,36,38,37,40,43,44,48,52,68,93,118,128,133,121,82,58,61,78,120,171,232,245,248,255,255,255,247,234,196,213,218,201,226,250,255,255,255,240,206,192,206,217,203, -171,150,150,150,144,154,207,224,178,134,115,115,153,164,200,198,206,183,144,134,127,132,164,185,165,217,254,238,192,179,143,134,127,104,108,119,108,126,136,156,160,116,88,88,120,183,207,214, -196,158,140,136,122,113,127,90,58,48,40,56,68,50,63,99,123,105,99,128,130,134,125,95,52,35,44,62,68,88,146,182,160,153,121,87,134,170,193,214,163,113,143,143,157,151,154,167, -167,180,183,137,122,147,169,161,164,141,118,102,78,69,62,56,72,98,119,120,126,143,139,113,93,88,86,73,109,139,156,200,210,164,109,83,82,80,70,77,73,77,93,95,82,78,97,105, -106,136,167,198,219,219,235,242,248,249,254,254,255,254,252,254,255,255,255,255,255,254,247,239,231,222,204,206,229,242,229,224,204,180,172,179,176,196,208,229,231,232,222,225,227,184,182,190, -183,135,93,100,109,86,86,87,80,70,55,40,31,29,23,29,40,38,37,29,26,27,29,27,31,37,41,44,45,58,87,107,99,107,111,82,59,65,88,120,126,153,189,218,239,245,225,214, -226,172,183,212,203,211,240,252,253,245,229,211,207,212,220,212,183,161,149,169,178,165,214,246,222,172,157,142,179,197,219,228,246,245,214,194,150,150,179,210,221,243,255,201,149,140,134,144, -128,95,111,99,104,106,105,149,141,92,75,91,139,196,212,192,135,92,120,140,115,113,134,113,68,59,64,90,85,86,116,165,167,125,127,168,184,160,147,95,68,68,65,50,52,125,170,183, -191,194,171,177,212,201,199,205,194,165,163,137,141,140,127,147,146,185,203,187,186,191,183,183,176,147,116,91,70,63,71,65,61,71,82,91,102,108,105,90,78,72,77,78,97,118,147,179, -186,133,80,65,66,57,51,59,57,50,48,52,56,73,93,93,88,105,136,158,206,219,213,226,225,233,250,253,249,247,245,243,253,252,254,254,254,254,253,245,235,219,160,171,225,246,222,206, -183,155,132,146,172,197,203,229,241,240,240,240,240,235,235,225,220,175,122,104,88,69,63,65,77,58,40,29,28,24,21,23,27,28,21,15,12,15,20,22,27,34,38,45,47,50,68,86, -95,104,111,84,73,70,84,102,132,156,204,210,190,200,200,217,229,212,208,224,221,186,192,232,236,235,225,224,222,212,185,183,173,148,140,176,221,214,219,238,215,206,194,175,219,249,247,243, -242,242,210,168,162,136,106,143,235,248,235,169,149,147,168,169,180,154,125,99,111,105,120,139,150,133,105,147,192,206,203,177,130,98,135,154,128,118,107,113,91,69,70,104,100,115,119,170, -189,169,163,204,164,126,112,105,114,94,65,43,82,208,239,235,250,240,239,255,226,187,179,186,196,176,199,180,120,84,98,153,139,184,201,205,211,207,187,153,165,148,111,80,49,44,48,47, -48,55,57,64,76,80,84,80,65,54,61,68,77,97,132,161,189,132,93,70,42,36,47,44,43,48,41,41,47,73,122,123,111,122,126,132,172,183,133,141,125,101,149,235,242,236,235,227, -233,241,247,250,253,254,253,243,240,228,180,196,231,222,205,182,169,149,133,149,184,203,201,236,246,249,250,252,253,253,250,246,240,190,141,114,77,56,49,43,42,36,34,31,29,27,26,26, -22,16,12,3,0,1,9,14,20,26,33,41,48,51,56,69,85,84,82,77,86,92,94,90,126,167,191,210,193,180,197,220,232,235,227,222,228,175,135,150,165,214,228,225,191,156,156,176, -169,151,128,162,215,228,220,236,204,234,241,234,249,255,255,253,247,225,169,137,155,143,94,121,189,168,144,113,128,177,200,189,186,153,102,94,112,123,164,161,182,193,179,160,168,179,171,168, -164,161,180,163,132,140,140,170,158,134,135,128,91,82,92,154,212,212,206,179,136,105,102,112,105,82,61,48,151,246,246,255,255,255,250,250,242,235,231,213,196,187,196,161,126,136,177,156, -151,194,192,192,204,203,160,108,129,114,82,62,47,41,27,27,30,33,36,47,68,69,63,69,62,44,44,49,59,77,115,136,148,130,98,58,31,24,29,33,37,41,40,38,51,85,157,168, -119,130,132,130,149,105,64,86,72,44,50,133,218,212,220,210,211,200,208,236,245,250,252,246,235,233,219,213,221,187,170,167,168,167,155,169,192,207,227,247,252,253,255,255,255,255,254,249, -213,155,130,100,68,55,49,49,40,31,37,40,34,27,29,28,19,10,3,0,0,0,0,5,10,16,24,33,38,44,50,58,61,65,62,64,91,105,115,92,99,137,161,175,191,165,183,212, -234,239,218,201,252,213,93,83,102,187,224,191,123,97,113,157,204,200,156,168,168,184,204,200,207,239,247,254,254,255,255,253,255,233,184,196,190,184,160,160,148,108,83,84,122,186,183,178, -154,97,83,94,111,120,175,186,200,213,185,139,146,162,172,161,149,143,158,148,148,165,183,194,186,187,201,192,136,128,132,141,225,225,189,184,177,140,119,104,88,106,129,126,238,255,253,255, -255,255,253,253,243,207,192,191,210,187,168,168,179,179,163,107,137,186,187,158,180,182,146,114,90,68,57,54,44,36,23,17,15,15,23,34,58,50,45,56,58,44,33,38,56,88,125,123, -100,85,62,35,23,22,24,31,40,37,34,37,50,68,115,191,146,123,136,149,121,49,45,61,48,34,42,73,173,207,208,206,179,148,163,217,236,239,246,242,221,184,155,192,204,163,156,144, -128,154,164,196,205,214,247,253,253,255,255,255,255,255,255,250,199,137,101,80,71,64,61,61,49,38,41,44,59,43,31,26,15,8,0,0,0,0,0,0,2,13,20,26,30,35,41,45, -47,45,51,61,86,86,86,79,84,109,142,160,179,172,184,191,212,233,220,199,245,225,98,82,116,185,206,183,146,118,122,144,171,176,164,162,170,179,199,191,175,200,234,249,254,255,255,254, -255,250,234,227,205,183,165,142,130,99,78,97,127,146,161,160,112,79,71,82,97,107,167,193,186,186,186,173,187,192,187,153,134,146,160,171,187,190,196,191,183,193,206,212,212,229,221,227, -252,247,227,238,226,194,135,98,125,214,239,241,250,253,254,255,255,254,254,255,238,144,149,172,212,227,219,218,198,168,108,85,137,150,150,104,123,168,155,115,72,57,48,43,37,33,23,19, -14,17,29,30,38,34,35,45,54,44,31,40,77,118,118,98,72,66,45,28,26,27,28,33,38,36,34,41,48,58,80,160,163,150,137,156,116,30,24,36,33,23,29,44,90,175,203,167, -87,79,122,200,235,238,240,235,221,186,141,169,167,133,136,122,128,146,155,210,222,224,238,253,255,255,255,255,255,255,255,253,197,109,85,83,79,76,77,69,59,50,50,51,66,43,23,15, -8,5,0,0,0,0,0,0,0,6,12,17,24,30,35,36,36,36,43,58,75,72,65,62,70,87,113,144,151,147,140,143,175,220,226,208,242,250,147,121,139,136,168,187,162,161,167,161, -155,150,136,149,170,185,180,187,207,228,246,255,255,255,255,255,252,246,225,217,182,146,127,127,128,102,86,94,94,113,139,122,72,66,64,65,76,118,165,176,178,176,215,200,187,189,175,142, -155,177,177,204,205,207,203,165,158,190,231,241,250,248,254,255,255,255,252,249,248,248,219,179,208,255,254,255,250,253,255,255,255,255,255,253,240,182,197,226,224,241,233,233,205,136,116,151, -156,115,136,129,115,132,115,87,72,57,42,37,35,30,20,15,13,16,20,17,23,27,37,41,40,44,52,62,118,127,92,78,63,56,45,35,34,33,33,34,35,34,36,42,58,102,135,135, -135,120,112,135,98,27,17,16,17,20,24,34,48,102,151,120,56,52,73,125,199,231,234,231,236,215,171,171,161,133,142,118,118,105,132,190,214,225,235,254,255,255,255,255,255,255,255,241, -150,91,84,83,83,77,73,69,63,62,54,45,43,28,20,13,5,0,0,0,1,0,0,0,0,3,6,12,19,26,30,30,29,33,45,71,78,73,71,65,68,82,101,130,119,94,99,107, -147,167,155,182,242,250,190,203,229,210,175,172,155,148,154,140,136,127,116,130,185,238,236,233,239,255,255,255,255,255,255,255,221,183,180,201,179,160,129,116,120,119,113,102,104,122,116,93, -65,51,61,58,79,123,165,193,215,233,221,189,184,173,130,137,187,218,213,215,199,201,200,165,167,226,252,247,252,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,254,254,255,255, -255,255,255,254,254,234,212,234,238,232,231,226,212,197,199,215,179,157,163,154,143,105,76,75,70,54,40,36,31,23,17,13,14,10,3,6,22,37,49,42,48,69,85,108,127,106,84,71, -63,61,56,42,37,35,35,36,38,40,40,52,70,116,179,139,127,164,155,122,79,47,36,36,34,34,35,31,36,49,58,51,47,48,57,80,143,193,183,178,211,196,162,180,157,128,128,104, -102,106,119,183,196,197,238,255,255,255,255,255,255,255,255,227,143,93,85,83,75,72,66,64,57,61,48,36,31,24,16,12,5,0,0,0,0,0,0,0,0,1,2,6,15,22,24,24, -28,38,54,83,91,82,72,70,69,78,104,128,101,88,100,93,153,135,119,168,224,210,217,253,255,246,182,157,147,107,100,112,120,105,118,148,225,255,252,254,253,255,255,255,255,255,255,255, -203,142,127,167,218,199,156,144,139,161,162,134,118,101,70,57,50,45,57,61,95,136,194,219,221,232,204,186,206,157,149,183,162,199,221,208,226,217,221,224,236,255,254,254,255,255,255,255, -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,250,246,243,233,228,221,229,215,213,212,196,163,153,163,162,114,88,87,88,62,37,30,22,28,30,15, -14,7,1,17,45,51,43,40,48,77,129,153,132,88,68,59,58,57,52,47,40,38,38,41,43,47,54,65,107,156,200,173,173,183,160,129,102,99,107,105,83,61,45,37,36,36,31,35, -41,45,55,83,126,123,123,134,144,149,170,157,128,116,114,108,111,113,132,187,196,211,239,254,255,255,255,255,255,255,253,220,154,106,93,94,84,79,72,69,55,45,43,34,33,27,20,15, -6,2,0,0,0,0,0,0,0,0,0,6,15,20,21,23,31,45,59,87,94,86,69,72,69,77,112,140,141,112,91,88,118,115,111,146,180,154,172,229,255,240,225,206,134,98,106,127, -129,107,120,179,234,254,255,255,255,255,255,255,255,255,255,253,224,140,122,149,198,207,180,197,179,160,162,139,108,93,73,51,43,51,65,90,126,148,176,179,169,170,191,210,238,189,179,160, -146,190,217,226,250,252,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,252,246,228,213,219,218,201,214,211, -192,176,165,170,150,132,118,84,70,51,44,26,35,57,33,19,12,5,17,65,83,73,51,57,54,95,161,146,134,105,76,57,58,54,49,50,43,40,38,41,43,44,54,73,146,204,221,213, -203,146,147,175,146,149,149,125,83,58,40,33,35,33,24,24,29,38,48,78,134,130,118,118,119,132,156,177,155,123,137,142,112,111,127,182,217,233,242,254,255,255,255,255,255,255,252,226, -178,153,105,106,104,90,71,65,54,44,38,35,38,31,28,21,12,5,2,0,0,0,0,0,0,0,0,3,13,17,19,24,34,45,64,95,107,76,70,79,80,95,115,146,173,137,90,76, -79,80,78,92,113,127,168,176,215,219,196,182,127,105,113,140,169,173,197,241,228,247,255,255,255,255,255,255,255,255,255,255,241,136,128,160,201,210,203,189,158,129,140,128,104,86,90,69, -48,55,71,92,115,137,137,150,148,148,184,171,187,200,156,136,161,208,217,236,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, -255,255,255,255,255,255,254,253,246,227,217,221,217,214,221,217,198,203,200,183,153,140,111,58,40,34,48,95,112,82,34,27,17,10,29,72,94,93,63,79,86,104,135,136,132,121,88,62, -56,50,48,51,48,41,37,40,42,41,44,68,134,208,224,208,205,173,157,200,194,160,157,114,54,43,34,24,30,26,21,20,24,29,42,68,126,129,115,115,122,114,121,162,170,135,167,165, -109,112,129,180,220,243,254,255,255,255,255,255,255,254,247,228,201,196,137,115,105,75,54,51,51,48,45,38,40,38,33,22,14,10,7,2,0,0,0,0,0,0,0,5,10,16,19,22, -31,54,78,120,107,52,69,85,90,116,122,128,156,150,107,78,72,68,64,78,99,115,129,126,162,214,162,177,148,109,116,153,199,219,249,255,249,253,255,255,255,255,255,255,255,255,255,255, -217,136,135,158,224,228,210,154,135,154,163,135,90,90,95,85,55,52,61,73,78,99,119,113,134,165,165,130,104,176,164,140,151,192,196,238,255,255,255,255,255,255,255,255,255,255,255,255, -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,253,213,191,205,200,210,222,217,217,214,208,185,155,105,65,40,28,24,50,154,149,82,62,55, -31,37,69,107,155,122,65,98,130,144,132,116,114,100,80,68,52,45,50,54,48,44,41,37,40,38,40,55,104,172,203,197,187,187,162,179,205,180,148,86,45,38,33,30,34,29,23,24, -27,29,42,66,116,126,111,107,102,94,99,121,127,164,203,161,107,105,141,173,210,249,255,255,255,255,255,255,255,255,252,229,205,204,139,78,72,51,47,49,51,52,47,42,41,41,31,19, -16,17,14,9,7,2,0,0,0,0,1,7,13,16,19,22,26,50,86,143,75,41,57,71,83,93,119,142,143,165,143,98,78,72,69,77,95,116,121,120,180,229,150,140,132,123,146,178, -214,249,255,255,255,255,255,255,255,255,255,255,255,255,255,255,200,164,151,168,240,225,192,146,118,146,158,116,79,84,88,82,57,48,54,62,62,71,83,78,121,153,119,94,83,134,160,133, -116,157,182,215,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,252,254,255,255,253,184,153,192,197,194,178,193, -219,225,196,161,128,79,43,31,29,37,77,129,157,118,115,98,80,147,172,187,210,169,125,148,132,137,128,111,94,80,73,66,55,47,48,51,49,47,43,41,41,41,42,69,107,143,198,208, -156,130,126,148,173,206,184,133,86,54,41,43,44,40,34,30,28,31,44,65,93,116,106,95,100,82,79,129,128,177,177,163,151,119,119,140,180,249,255,255,255,255,255,255,255,255,227,191, -196,191,137,79,64,52,52,51,55,64,55,47,47,43,23,17,21,29,27,20,10,7,2,0,3,7,7,9,14,17,23,22,20,42,95,136,69,42,49,61,76,86,137,183,171,165,123,115, -109,84,66,75,90,127,157,133,183,207,133,143,153,171,192,204,190,234,250,255,255,255,255,254,255,255,255,255,255,255,255,255,233,201,183,185,192,160,132,132,125,109,100,66,64,63,59,59, -45,40,49,48,49,48,45,56,80,87,73,65,69,98,121,101,108,147,184,207,234,232,242,255,255,255,255,255,255,255,255,255,255,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255, -255,255,255,254,235,218,249,255,246,186,157,192,210,205,171,168,211,213,173,133,111,72,41,34,38,59,164,198,189,199,190,186,212,208,173,158,176,193,167,163,139,113,91,77,80,69,66,63, -52,48,48,50,50,50,45,43,42,43,42,64,133,179,191,203,155,125,108,140,176,196,207,197,123,71,57,57,70,54,37,26,26,31,44,58,79,98,105,104,94,86,90,112,143,154,155,194, -175,130,112,125,191,248,254,255,255,255,255,255,254,236,165,155,184,189,162,99,71,59,68,77,83,99,72,56,48,31,17,22,29,35,30,20,22,26,12,6,8,9,9,13,14,20,20,17, -23,37,111,125,75,45,49,61,75,102,176,208,190,186,180,162,151,123,87,76,80,119,142,118,148,179,127,143,172,198,199,215,176,205,243,255,255,255,255,254,255,255,255,255,255,255,255,255, -255,234,193,196,158,130,149,151,111,72,52,44,43,35,31,33,30,34,38,44,48,36,38,57,70,75,77,72,78,93,90,78,104,163,207,214,191,200,226,254,255,255,255,255,255,255,255,254, -254,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,253,249,243,234,226,236,221,206,180,161,172,203,214,199,196,197,165,140,106,99,70,48,38,43,114,220,225,226,235,231,231, -243,225,199,189,186,186,168,179,146,90,71,78,77,64,65,52,48,52,52,54,52,52,50,48,44,44,41,54,111,143,161,165,153,136,119,146,189,205,201,187,163,109,78,86,78,45,27,24, -27,33,41,55,76,93,112,109,94,101,101,120,162,154,165,160,128,115,140,150,190,232,239,253,255,255,255,255,255,222,163,165,191,194,170,108,100,90,113,127,141,151,106,72,50,27,23,28, -35,31,24,23,45,56,22,13,15,14,15,16,16,21,17,17,41,61,95,80,43,37,47,63,98,146,178,170,148,183,239,225,190,151,129,95,75,95,100,104,132,136,118,118,141,168,192,199, -176,192,239,255,255,255,255,255,255,255,255,255,255,255,255,255,255,246,210,210,180,153,137,109,75,65,49,40,30,23,20,19,21,29,41,50,54,50,56,90,111,119,113,108,121,130,102,76, -115,178,201,211,197,219,238,250,255,255,255,255,254,254,249,247,247,253,255,255,255,255,255,255,253,255,255,255,255,255,255,255,255,249,235,236,241,232,191,135,130,141,146,169,196,227,227,206, -158,155,140,109,94,75,73,75,78,194,236,231,236,245,240,234,247,247,238,221,200,189,171,148,118,99,88,83,68,64,68,58,56,55,52,52,54,54,50,49,48,47,47,55,82,104,115,108, -120,129,113,125,158,185,208,225,194,142,87,84,48,34,28,26,29,36,41,55,54,71,99,95,105,115,98,112,164,171,161,122,118,140,161,201,201,199,218,211,239,255,255,255,255,218,194,203, -197,178,130,97,123,133,134,139,144,161,109,85,54,34,27,30,30,26,26,34,62,68,30,20,26,22,21,17,17,23,24,33,76,105,105,73,50,37,41,56,92,139,164,154,137,148,212,217, -175,126,116,90,70,90,100,82,111,155,134,135,143,172,200,196,203,236,246,255,255,255,255,255,255,255,255,255,255,255,255,255,255,248,187,176,178,169,122,73,57,64,50,31,24,17,14,15, -17,29,42,58,92,97,90,128,146,151,143,153,157,143,111,82,127,177,206,212,226,241,235,247,253,254,254,253,252,246,236,245,241,250,254,255,255,255,255,246,248,255,255,255,255,255,255,253, -248,236,208,213,198,153,112,101,119,129,185,197,198,232,241,210,186,185,156,142,116,114,160,192,191,247,245,246,248,246,242,246,253,238,163,157,167,193,172,143,123,104,78,63,55,64,62,59, -58,55,52,52,54,52,54,52,51,52,52,66,69,72,93,98,87,87,90,112,132,143,183,215,175,149,118,79,35,36,31,28,28,35,42,51,45,43,42,38,43,52,63,118,165,139,123,144, -153,160,165,192,184,200,191,171,228,255,255,255,252,214,196,204,191,158,127,111,113,120,118,123,127,135,98,91,55,35,28,24,24,27,42,62,76,76,37,33,36,35,29,27,24,26,47,71, -109,135,144,116,75,44,34,44,64,97,118,142,160,123,164,180,177,142,87,72,64,108,133,80,107,189,172,161,160,182,207,217,228,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, -255,254,242,189,170,151,105,61,45,44,37,28,20,16,12,17,21,29,45,71,123,155,155,189,189,180,190,207,197,157,135,102,127,184,218,219,228,228,228,218,217,214,228,238,247,245,232,236, -241,252,255,255,247,240,233,226,240,255,255,255,255,255,255,246,235,229,217,204,187,160,165,180,171,187,213,228,234,246,249,220,205,217,212,171,130,164,247,249,255,248,249,252,252,253,248,252, -253,234,146,170,189,189,183,154,122,88,57,42,45,57,50,48,48,49,47,48,50,54,52,54,51,52,55,63,58,58,65,57,55,54,68,93,114,112,115,139,122,125,154,82,23,28,31,30, -22,28,37,37,30,23,20,20,29,41,45,69,97,98,94,134,164,185,218,206,168,162,153,157,232,255,255,255,252,224,192,200,187,139,113,121,119,127,143,164,171,141,104,92,58,38,28,23, -24,28,44,65,71,65,47,41,51,56,50,45,38,48,104,135,146,149,143,126,82,35,31,41,45,62,78,112,148,123,109,109,148,165,94,72,79,113,157,147,171,211,182,149,172,229,248,235, -246,253,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,247,226,163,94,65,49,34,22,21,15,13,13,17,22,33,57,90,134,171,199,240,243,232,236,232,196,153,134,106, -142,193,214,231,238,222,214,176,157,175,198,221,241,241,220,222,232,231,229,218,206,210,210,222,231,249,254,255,255,255,255,254,243,232,231,221,215,218,222,235,217,219,227,232,240,253,253,248, -245,254,255,249,228,242,255,254,254,253,253,255,255,254,255,255,249,245,210,201,213,192,173,142,111,77,50,35,35,40,37,34,38,42,43,44,45,50,50,52,51,52,54,52,47,38,36,31, -30,24,27,44,65,63,62,101,141,135,114,51,19,23,23,24,16,20,28,28,22,17,14,14,21,35,38,42,51,63,73,95,156,213,201,183,156,129,160,185,183,206,235,234,225,204,210,199, -164,126,120,136,142,141,176,201,217,200,109,93,63,38,28,27,28,27,34,47,56,52,43,41,58,69,64,62,68,80,100,144,171,167,150,115,92,41,34,41,44,50,62,73,95,104,88,78, -93,137,97,65,87,104,135,189,245,228,169,169,164,240,255,240,227,248,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,248,241,179,148,153,49,20,20,17,12,8,12,16, -19,31,58,94,135,162,193,224,250,245,239,227,185,143,123,121,170,203,218,235,242,201,186,162,136,143,165,184,196,190,187,186,192,184,180,160,154,182,210,226,231,232,241,255,255,255,255,255, -248,241,239,239,236,232,229,240,234,228,228,231,242,253,255,255,250,250,255,255,255,255,255,255,255,254,253,255,255,255,255,255,254,255,243,220,212,198,168,137,104,75,52,34,22,21,19,20, -26,33,36,38,41,41,45,47,48,48,47,47,44,35,27,21,17,13,9,19,45,49,43,83,118,111,95,54,21,30,29,15,8,17,29,33,33,21,15,10,7,14,23,22,27,43,91,116, -162,217,158,151,139,137,141,158,141,162,189,213,214,218,208,172,149,130,137,121,122,144,156,185,215,190,94,78,52,29,26,28,33,29,37,54,66,59,59,66,75,68,59,79,120,111,90,140, -183,178,153,134,116,49,37,42,45,51,56,57,66,86,88,76,71,123,129,79,75,84,100,164,252,249,233,226,194,201,255,255,235,242,254,254,255,255,255,255,255,255,255,255,255,255,255,255, -255,255,255,255,238,186,163,150,70,19,15,17,12,9,10,16,20,29,52,87,122,158,190,201,240,233,205,197,193,178,151,176,219,231,239,242,229,194,173,146,151,139,130,150,155,156,172,171, -173,163,175,155,153,179,214,225,234,234,248,255,255,255,255,254,253,252,252,249,242,233,235,239,238,227,224,231,242,252,255,254,250,249,255,255,255,255,255,254,255,255,254,255,255,255,255,253, -254,255,254,247,227,205,171,133,102,76,54,34,21,19,10,10,10,17,22,28,34,37,37,41,42,42,43,43,40,35,24,17,9,6,5,6,23,37,29,55,69,80,113,66,17,19,21,8, -9,31,49,66,63,31,22,15,7,7,8,12,38,77,130,135,163,207,155,132,111,107,99,88,99,143,189,204,182,192,217,175,142,128,141,99,98,156,169,183,213,190,91,49,38,29,27,36, -51,52,57,76,77,76,88,114,102,70,64,112,157,154,175,200,193,168,115,92,94,55,47,41,45,52,55,56,57,76,93,84,71,95,108,82,72,76,85,139,219,249,255,254,207,153,215,245, -255,249,247,252,249,236,250,255,255,255,255,255,255,255,255,255,255,255,255,255,253,177,105,90,78,37,15,16,14,12,10,16,20,27,49,79,122,163,176,169,191,191,200,217,225,208,160,160, -193,208,219,218,201,180,161,167,196,162,116,139,150,169,207,185,163,141,169,157,163,199,234,242,246,248,254,255,255,255,255,255,254,252,252,254,246,234,236,233,228,212,226,236,240,248,248,250, -254,255,255,255,255,254,255,255,255,255,255,255,255,255,254,252,250,254,252,248,236,213,176,135,104,78,55,35,21,10,8,7,5,9,12,15,29,37,37,42,45,45,43,40,37,31,24,16, -9,5,2,3,8,17,21,33,45,47,78,72,33,23,38,34,43,43,59,94,76,35,26,21,19,19,17,24,65,107,139,143,156,198,126,93,84,85,70,59,79,105,147,155,134,154,187,156, -134,147,162,135,136,192,201,186,193,196,141,66,41,36,33,40,65,77,77,90,101,118,120,125,106,83,86,116,157,189,206,213,201,129,69,54,63,62,51,38,44,52,52,54,55,61,75,82, -90,95,99,84,86,105,91,111,157,180,221,255,193,163,193,198,235,245,238,224,210,201,242,255,254,255,255,255,255,255,255,255,255,254,254,254,239,172,95,57,36,36,20,14,13,12,10,10, -15,23,47,78,114,127,113,140,160,156,173,194,179,194,191,187,186,196,196,167,175,196,187,205,213,177,168,185,180,179,210,175,151,161,160,144,176,218,242,246,250,254,255,255,255,255,255,255, -255,253,252,254,254,243,233,229,232,200,221,231,233,247,249,253,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,252,254,254,252,245,215,175,141,111,82,64,43,24,13,10,7, -6,7,9,16,26,35,37,38,45,44,42,38,35,30,23,20,14,8,7,6,9,14,22,28,26,24,43,76,56,58,62,44,62,65,76,79,54,35,27,24,28,24,23,35,69,123,148,163, -129,156,99,92,97,73,66,64,90,127,137,130,154,182,139,143,155,165,173,180,192,213,215,191,185,192,170,93,63,56,43,55,85,112,101,112,140,157,151,146,121,107,108,100,111,183,210,218, -191,119,70,68,62,61,47,36,37,45,49,50,50,56,64,68,76,88,107,101,94,128,140,135,139,136,185,254,221,210,225,199,214,229,233,193,172,190,227,248,249,254,255,255,255,255,255,255, -255,254,252,250,238,154,83,52,26,23,16,15,15,14,10,10,16,29,49,77,100,90,68,106,147,127,135,158,180,190,192,184,183,173,137,113,139,178,201,205,187,192,215,200,175,186,179,154, -146,164,143,150,197,224,245,249,255,255,255,255,255,255,255,255,253,252,253,255,255,254,252,252,246,212,222,232,234,241,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, -253,250,255,255,253,228,164,123,106,77,64,50,26,12,8,8,3,6,7,14,22,26,26,31,44,48,37,37,34,29,24,19,14,12,9,8,12,17,23,24,17,14,27,70,99,64,48,50, -56,71,64,43,37,33,29,27,26,20,26,45,87,167,169,175,141,139,116,127,132,107,99,82,115,158,161,150,173,147,133,179,191,179,177,205,213,208,208,206,197,176,112,99,83,69,68,82, -108,132,100,114,141,154,178,175,130,104,120,127,116,172,203,211,197,148,111,75,65,64,50,36,37,40,47,49,49,52,57,55,61,70,88,125,123,151,190,185,143,133,168,252,255,253,248,239, -224,232,236,184,177,197,206,229,243,254,255,255,255,255,255,255,252,255,253,250,255,164,48,34,16,16,20,16,16,16,14,16,21,33,49,72,94,105,100,118,121,116,146,160,201,206,199,173, -163,134,105,100,126,165,192,180,186,198,187,165,153,161,129,116,141,169,160,193,232,235,246,249,254,255,255,254,255,255,255,253,252,253,253,254,254,254,254,254,252,234,226,225,220,220,242,255, -255,255,255,255,255,255,255,255,255,255,255,255,255,254,255,254,253,240,234,252,255,229,157,108,106,92,69,41,23,12,5,2,2,3,3,9,19,26,26,33,45,51,37,35,36,35,30,21, -14,12,13,15,23,30,27,28,17,12,30,70,118,79,49,62,86,82,41,40,48,42,36,29,21,21,36,52,75,161,168,180,201,168,127,130,139,135,121,86,99,135,172,196,185,157,177,193, -197,169,185,208,198,185,205,218,207,162,107,116,98,108,108,109,140,137,118,128,149,167,194,185,144,126,142,127,161,201,203,208,204,186,135,93,71,66,56,44,47,43,43,44,44,48,52,52, -54,50,68,116,143,165,179,197,167,130,137,241,255,254,255,255,248,249,229,191,157,182,218,232,238,253,255,255,255,255,255,254,239,236,243,241,221,205,93,22,10,9,15,16,22,21,21,22, -21,28,44,66,90,106,106,113,104,114,156,187,210,197,191,180,161,114,77,77,111,175,173,173,160,146,144,182,169,133,137,146,175,206,201,205,199,197,219,236,250,245,252,252,248,245,242,240, -243,249,253,253,254,253,248,220,208,213,210,201,193,224,241,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,247,241,238,221,206,243,249,224,164,111,109,109,77,41,19,7,1,3, -15,17,10,16,37,48,55,61,78,58,41,55,57,57,42,23,15,19,16,22,41,44,33,35,28,27,49,93,140,121,82,73,98,77,36,40,37,38,38,30,23,22,43,65,91,149,144,148, -212,158,142,149,160,136,100,73,71,82,95,183,238,207,187,192,193,155,176,196,142,127,170,185,184,148,122,126,113,125,111,135,163,156,114,104,141,192,198,180,167,153,136,118,156,186,196,179, -177,172,169,143,84,79,76,65,59,45,40,35,37,47,55,55,50,45,62,92,112,149,175,186,169,142,134,228,252,255,255,255,252,225,201,186,143,150,204,243,234,236,252,254,255,255,255,255, -182,144,207,234,178,191,134,43,33,14,9,16,30,35,29,24,23,29,48,70,85,95,106,120,132,158,180,200,204,190,185,178,149,100,73,66,80,122,114,129,129,143,133,163,177,144,157,157, -163,194,197,172,146,165,190,220,220,198,218,225,214,194,232,243,242,247,255,255,254,250,235,200,176,184,203,203,203,224,239,249,255,255,255,255,255,255,255,255,255,255,255,255,255,250,234,219, -214,229,236,222,180,162,143,107,100,107,92,62,26,12,2,9,30,15,24,86,111,98,95,72,83,91,114,122,90,63,37,27,21,27,24,24,33,37,50,59,52,57,82,130,176,162,92,52, -52,58,51,35,29,28,28,23,21,23,42,59,87,111,105,147,190,155,201,203,173,120,77,63,62,91,126,171,211,189,192,204,179,148,167,151,95,93,113,146,168,149,116,107,112,151,167,170, -155,146,97,78,108,176,199,183,182,200,194,170,142,141,154,150,155,171,192,170,116,100,99,80,47,35,34,33,36,43,48,48,47,41,48,62,64,92,130,176,176,114,121,208,242,255,255,254, -232,193,179,172,151,113,162,238,229,220,253,255,255,255,255,236,201,155,194,225,161,184,160,83,85,50,19,24,51,61,47,30,26,31,49,70,79,92,122,139,171,196,201,205,182,169,176,177, -143,100,85,73,61,70,91,111,112,97,104,118,144,150,126,139,139,160,163,201,179,180,167,179,164,142,171,193,185,199,239,254,255,255,253,249,246,243,225,211,213,201,193,200,212,207,215,218, -235,252,255,255,254,249,255,255,255,255,255,255,255,250,225,192,208,222,201,153,106,83,83,85,93,100,99,80,43,26,8,22,48,29,52,101,139,118,87,61,65,101,140,129,90,58,43,34, -20,20,22,21,35,62,77,71,64,82,107,162,196,149,55,35,34,50,50,34,37,24,17,15,14,16,24,27,48,68,69,122,165,177,229,221,161,106,79,68,69,119,165,184,193,205,222,217, -189,190,183,111,72,76,128,187,176,144,136,129,133,191,190,172,165,147,100,70,75,142,203,205,201,212,217,151,101,128,176,156,149,167,164,164,142,127,90,54,29,28,29,30,34,36,40,40, -41,42,41,44,51,57,69,125,137,86,92,134,206,250,254,253,201,197,197,182,171,120,125,203,240,248,255,255,255,254,252,218,228,178,193,210,172,199,198,119,98,71,44,42,72,87,68,41, -27,35,47,59,71,120,157,171,198,191,201,199,155,139,173,180,143,108,92,79,62,56,86,93,95,84,87,105,116,115,120,142,146,172,182,226,196,163,165,163,146,129,156,187,198,198,242,255, -236,218,201,194,211,224,218,217,218,194,180,180,200,187,177,187,219,238,248,248,238,240,255,255,255,255,255,253,227,199,185,177,186,169,119,95,78,61,90,129,114,94,95,100,62,33,28,41, -52,50,47,42,82,109,99,63,58,70,83,88,68,43,44,30,15,9,10,14,30,69,91,87,76,80,104,141,175,144,52,47,45,48,47,34,33,20,13,8,8,3,1,1,8,17,40,83, -140,211,229,204,137,113,85,61,83,153,168,151,176,233,233,177,189,214,194,129,80,91,156,206,197,183,184,176,164,200,198,165,140,126,98,70,75,123,197,198,198,214,204,134,142,186,177,107, -146,156,144,155,156,118,62,34,27,28,29,30,31,34,41,43,49,45,37,37,36,38,45,63,93,82,87,100,149,208,253,249,193,193,214,218,205,119,95,154,227,255,255,255,253,252,247,236, -227,215,212,196,194,191,148,107,88,65,57,54,66,64,63,52,36,38,44,51,83,114,164,189,196,203,204,210,198,191,199,177,147,114,87,75,61,49,61,73,91,93,95,112,105,114,132,132, -139,212,245,240,219,217,234,220,194,156,172,199,218,235,250,254,217,187,194,215,228,225,218,215,205,203,200,187,194,165,150,168,191,215,232,226,210,198,241,255,255,255,255,250,226,189,162,171, -163,139,122,140,164,118,135,148,140,130,141,129,76,61,64,51,29,19,14,16,27,69,70,49,49,52,61,61,35,28,26,15,9,7,8,12,28,61,85,82,68,66,78,113,122,141,91,58, -55,49,41,41,30,17,7,1,0,0,0,0,0,8,40,63,122,201,226,191,128,106,70,56,78,123,141,156,178,225,214,179,187,199,177,136,127,141,163,175,177,171,177,167,170,180,191,171, -98,91,122,114,128,127,179,206,201,225,205,161,184,184,140,104,149,161,142,147,139,87,66,61,43,34,34,28,33,37,49,54,68,75,49,35,37,44,50,58,70,64,76,83,107,193,245,238, -214,197,217,210,163,94,83,134,213,248,253,254,247,246,245,240,243,229,193,190,177,163,93,63,58,44,51,55,42,37,44,43,36,41,45,65,91,94,143,189,201,242,243,250,250,240,213,173, -147,113,82,62,48,41,45,57,77,83,97,109,113,127,126,109,141,231,255,255,214,169,187,191,171,148,125,129,187,247,250,234,211,219,227,236,227,219,208,206,200,210,191,172,155,163,147,147, -186,213,218,213,205,185,203,231,254,255,254,249,246,205,161,161,172,167,170,180,218,184,165,160,150,162,158,130,113,111,82,47,17,6,1,2,5,16,28,36,64,49,48,69,45,24,20,15, -9,13,12,14,35,59,51,44,55,43,45,82,77,86,52,27,37,40,50,52,31,14,2,0,0,0,0,0,0,0,13,38,84,130,161,185,147,98,64,52,61,86,127,165,190,221,193,175, -192,179,141,115,134,133,147,136,144,176,175,163,178,163,162,141,109,102,134,135,153,150,190,220,226,233,221,224,211,187,141,148,153,161,125,88,77,78,65,86,86,61,43,31,30,43,58,66, -95,114,91,64,58,59,69,71,80,79,71,78,112,191,221,192,164,162,196,189,161,134,97,135,183,194,194,219,231,232,236,235,236,224,176,200,203,165,133,85,73,43,40,42,37,42,47,41, -34,40,48,61,71,94,151,187,222,255,255,255,255,255,228,178,141,107,77,56,43,38,40,52,72,90,100,104,112,116,104,92,122,203,252,228,173,125,115,127,125,106,91,109,170,214,204,178, -165,201,222,224,215,194,163,139,153,162,151,160,157,190,191,179,167,180,187,191,203,197,178,212,254,255,254,250,247,234,218,212,208,192,170,182,213,214,197,165,163,170,155,140,127,97,59,29, -7,2,0,0,0,5,22,35,45,31,35,51,36,21,17,15,13,16,22,26,42,48,31,40,41,14,12,26,24,0,0,5,21,31,45,52,27,3,0,0,0,0,0,0,0,0,5,24, -87,119,101,99,93,77,52,45,58,91,125,144,179,193,162,162,160,153,120,88,83,104,121,139,172,205,198,182,180,148,120,142,148,118,111,135,156,178,211,226,225,228,231,235,220,172,179,194, -147,149,112,78,68,95,97,91,95,86,62,38,33,49,77,102,129,149,142,127,127,100,94,83,73,78,88,98,133,183,207,198,182,168,151,150,163,163,128,120,153,156,168,201,221,220,232,234, -238,222,178,170,186,144,147,115,76,44,45,37,40,52,51,50,54,43,42,56,72,107,160,180,231,255,255,255,255,255,236,190,149,115,84,63,57,49,50,57,78,105,107,99,104,98,91,99, -146,190,215,167,160,116,105,140,134,99,113,154,185,176,171,162,144,164,201,194,196,155,106,93,105,127,142,180,184,206,211,178,141,160,175,186,191,182,171,235,255,255,255,253,249,245,243,248, -245,212,189,207,210,213,187,180,213,199,173,140,97,51,30,17,6,0,0,0,5,3,12,35,27,28,21,17,19,16,17,16,14,13,22,30,36,27,22,30,14,0,0,0,0,0,0,0, -1,15,23,36,28,0,0,0,0,0,0,0,0,0,7,29,57,68,83,92,82,59,42,37,54,76,100,132,146,128,107,100,78,78,73,73,80,86,95,133,189,214,199,178,168,165,161,162, -165,132,119,146,153,165,203,227,227,235,234,235,224,176,199,198,175,129,82,79,68,111,135,116,116,106,77,47,37,48,83,115,135,179,207,175,169,178,169,130,99,92,106,122,125,156,196,189, -178,180,155,139,151,149,130,136,153,171,183,211,226,225,227,231,212,206,189,139,133,150,163,135,107,83,70,49,38,45,52,68,75,55,43,64,83,101,143,167,218,255,255,255,255,255,243,210, -177,141,102,83,75,66,61,61,68,85,93,90,111,164,211,224,250,249,208,144,109,92,90,108,108,94,94,132,154,148,160,173,168,165,169,180,171,128,90,69,88,114,135,182,199,193,192,187, -184,194,201,193,180,175,189,231,252,254,249,247,253,250,243,242,249,239,214,201,210,233,204,229,247,228,196,135,77,44,28,14,5,0,0,0,0,0,9,20,19,30,23,14,14,15,16,16, -15,12,14,16,17,12,12,13,0,0,0,0,0,0,0,0,0,1,10,29,31,9,1,0,0,0,0,0,0,0,5,17,22,37,78,79,61,50,41,38,50,64,72,101,114,80,50,43, -51,63,70,78,75,72,83,114,194,228,211,182,176,210,196,169,163,139,182,207,213,218,233,239,238,239,235,241,231,199,190,179,167,104,84,87,90,118,153,178,193,149,98,55,42,55,80,114, -154,178,219,201,180,194,184,148,122,144,140,150,141,141,167,175,165,180,176,183,162,123,121,156,153,165,156,190,220,222,234,219,153,179,187,147,101,153,161,149,162,160,99,64,40,45,59,65, -61,47,43,61,70,88,129,156,191,250,253,255,255,254,253,236,210,163,118,111,120,97,68,62,66,80,90,92,118,176,249,246,239,239,220,171,91,72,65,69,65,69,84,104,126,140,144,146, -143,146,143,148,123,83,71,71,97,102,136,176,191,184,190,222,204,198,194,178,167,203,213,222,243,250,247,253,253,232,239,250,253,255,252,246,250,255,252,250,245,228,204,158,99,57,36,16, -8,3,0,0,1,17,52,47,26,36,24,15,14,13,15,17,16,13,9,5,9,20,23,15,0,0,9,2,0,0,0,0,0,2,17,33,38,21,7,7,2,0,0,0,3,3,8,12, -10,26,45,45,44,42,35,40,50,62,65,76,71,44,29,30,37,45,55,70,66,84,88,111,191,249,246,228,215,225,224,193,162,167,197,228,253,255,255,252,250,248,241,224,206,210,200,197, -206,178,134,129,122,155,219,232,189,127,102,59,43,71,130,141,143,168,226,220,180,190,206,190,146,116,132,162,186,192,180,184,176,177,193,203,184,125,118,134,123,137,143,191,205,198,221,206, -134,125,173,185,114,141,162,156,163,163,141,83,58,59,58,52,45,29,33,41,45,66,105,157,187,204,207,229,254,254,252,235,215,189,154,141,179,140,72,63,88,143,168,111,93,113,123,160, -185,171,158,134,77,59,59,58,63,93,120,116,105,111,122,121,126,136,142,123,106,75,73,99,108,107,144,193,211,226,240,222,197,199,180,146,178,232,242,240,243,250,254,255,242,231,249,255, -255,255,255,255,255,255,255,253,249,234,198,179,139,79,42,24,17,10,5,3,8,38,45,62,62,35,20,14,14,14,15,15,14,13,8,13,24,48,56,37,19,13,40,33,0,0,0,0, -0,6,22,35,38,24,14,14,8,5,5,3,6,8,15,17,14,14,21,27,30,31,30,34,40,50,55,55,49,38,36,37,41,49,77,107,88,90,102,156,212,249,250,201,207,219,220,224, -198,206,214,235,255,255,255,255,255,250,235,229,176,196,217,172,199,200,135,129,139,154,200,227,211,144,101,71,48,69,142,168,160,179,229,236,190,193,214,194,126,80,86,153,207,191,175,178, -171,161,205,201,173,162,151,120,93,94,144,207,205,203,213,205,160,100,120,164,164,158,175,183,179,156,150,146,118,66,43,42,40,27,27,33,38,56,97,154,184,164,185,221,248,255,240,212, -190,179,183,198,221,162,95,93,157,165,154,107,98,113,112,141,173,122,108,98,71,52,56,55,78,134,154,129,125,129,155,140,126,121,99,86,82,63,76,90,91,119,170,217,227,239,241,211, -199,214,167,177,200,199,233,239,239,254,255,255,249,253,255,255,255,255,255,255,255,255,255,253,248,226,205,212,187,120,57,31,17,9,5,1,3,8,20,36,48,34,16,15,16,15,15,14, -14,13,20,42,70,106,109,84,55,28,51,44,7,0,0,3,3,14,21,42,59,43,20,16,12,12,2,1,3,7,17,26,21,14,13,15,19,20,22,28,35,48,47,44,42,38,43,54, -64,80,142,148,88,99,142,199,245,252,246,205,205,201,193,193,198,221,238,240,241,255,255,255,255,254,222,191,149,200,232,180,198,183,137,136,156,176,169,227,222,155,90,59,50,54,104,155, -183,193,197,217,221,190,185,184,121,82,83,120,177,177,143,127,120,130,187,194,184,172,157,119,93,101,162,206,203,193,206,218,156,144,146,157,151,162,183,208,185,129,123,153,169,128,56,36, -30,23,27,29,35,56,95,137,158,177,208,217,241,247,236,210,175,136,151,186,228,236,212,227,231,153,143,121,143,161,184,167,130,111,132,109,77,58,62,84,128,173,169,178,186,164,168,151, -125,95,71,58,52,54,73,76,91,126,160,182,187,184,196,213,229,236,190,184,169,185,220,233,245,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,247,238,238,228,175,128,80,44, -19,8,3,1,2,5,13,13,16,21,16,21,31,26,23,22,20,29,87,126,137,142,133,113,50,27,56,70,41,16,10,17,28,35,42,61,71,45,21,22,23,14,9,5,3,5,19,31, -31,22,17,15,15,14,17,23,33,38,41,41,37,48,68,72,108,149,183,179,126,123,211,229,248,252,253,228,194,185,179,171,173,221,250,233,224,253,255,255,255,255,245,198,169,219,236,199, -213,183,144,133,150,190,146,182,182,167,114,68,47,47,75,109,170,222,196,191,201,185,149,170,170,111,101,121,149,168,151,121,115,118,149,158,169,163,157,111,95,126,187,198,176,168,175,167, -111,153,187,196,191,194,193,182,155,113,116,120,125,141,80,42,29,26,24,30,37,48,84,133,155,178,194,204,226,231,211,197,167,130,112,127,228,255,255,255,252,239,221,211,204,183,182,142, -92,114,160,122,79,68,78,125,182,220,211,198,179,167,176,151,122,87,68,55,45,45,51,75,80,100,130,140,167,167,184,208,204,204,197,165,161,196,226,231,250,255,255,255,255,255,255,255, -255,255,255,255,255,255,254,253,247,240,233,220,198,153,100,66,35,12,15,13,10,12,12,7,15,22,22,28,35,36,30,23,23,64,146,155,151,144,123,100,68,70,83,88,66,24,19,31, -44,41,61,76,65,37,23,29,36,26,16,9,6,7,19,37,40,29,22,16,13,12,13,21,31,36,37,37,38,57,97,125,160,176,186,167,141,129,224,240,247,250,253,249,233,207,182,139, -176,229,245,236,246,254,255,255,255,255,254,246,250,249,247,239,213,146,165,160,161,220,160,122,128,139,122,92,63,64,84,106,191,231,205,193,197,198,165,184,203,158,140,184,199,192,150,121, -132,116,129,116,133,165,162,127,120,151,191,197,176,143,123,129,128,148,187,192,204,207,193,158,113,98,109,99,65,71,58,37,24,22,29,38,41,44,80,143,191,192,196,221,185,157,155,180, -160,134,132,147,232,250,255,255,248,243,239,186,191,180,126,80,78,104,105,94,80,86,114,146,197,243,233,200,163,184,187,161,130,102,78,66,44,41,44,65,68,72,105,127,143,167,184,173, -154,135,191,168,161,176,207,213,252,255,255,255,255,255,255,255,255,255,255,255,255,255,254,250,248,242,228,217,213,177,97,66,69,56,37,20,19,22,16,10,16,34,42,44,38,37,31,21, -51,118,153,148,137,140,116,106,102,104,102,94,70,38,34,51,63,57,76,77,50,30,21,28,41,42,30,13,8,6,17,40,42,30,17,13,8,7,9,19,27,34,35,38,45,66,119,140, -164,184,199,165,130,140,243,249,240,240,245,235,246,231,173,150,189,227,229,239,254,255,255,255,255,255,254,253,254,252,249,254,177,116,180,177,189,186,156,115,118,126,122,108,72,95,143,183, -189,178,148,171,196,203,177,187,212,208,199,207,217,208,167,104,115,101,107,109,107,130,136,114,116,134,155,187,170,119,106,135,116,97,154,190,210,198,155,135,111,104,115,97,69,52,40,37, -35,37,43,52,51,58,101,156,208,234,219,225,191,148,150,160,126,111,134,157,182,171,215,241,254,248,254,203,165,147,101,79,78,94,97,91,94,119,168,175,214,246,227,198,194,211,201,167, -130,135,150,105,45,45,45,45,65,58,75,90,93,141,154,118,98,112,158,165,133,135,173,194,239,255,255,255,255,255,255,255,255,255,255,255,255,255,253,249,246,243,234,217,205,193,167,132, -122,104,52,22,20,26,20,12,28,44,56,52,38,33,28,30,108,149,156,149,134,139,125,133,104,94,102,90,76,66,69,95,101,88,86,64,45,29,17,22,50,63,40,15,7,5,13,34, -37,27,13,7,6,5,9,15,24,35,40,50,66,88,118,114,147,185,175,140,134,178,253,250,236,222,212,211,225,232,175,169,201,217,234,245,255,255,255,255,255,255,255,255,253,252,250,235, -176,150,179,175,179,133,129,97,107,108,78,73,64,105,154,151,147,178,165,136,177,187,180,179,203,212,212,211,203,192,180,129,105,85,71,65,77,99,120,82,80,98,118,161,154,115,94,112, -99,114,175,201,217,201,144,113,122,128,134,119,91,61,54,65,65,64,65,77,84,98,135,170,208,222,217,210,187,165,151,128,104,84,90,101,111,133,165,229,255,255,255,236,172,147,125,111, -84,76,78,107,134,155,183,203,219,205,176,162,205,229,198,140,167,197,182,116,51,51,54,35,49,47,44,51,56,86,93,72,57,77,108,116,95,107,136,178,213,242,241,252,255,255,255,255, -255,255,255,255,255,254,252,250,245,243,232,215,211,207,210,204,193,130,101,49,38,76,56,44,66,58,58,48,27,27,34,69,114,141,162,155,132,132,126,136,115,129,122,98,57,58,56,88, -115,91,71,43,22,13,9,24,52,55,33,10,5,1,7,24,28,20,9,2,2,3,10,15,24,40,54,70,83,101,93,90,126,123,126,143,142,190,255,204,183,208,179,211,228,231,196,178, -201,236,252,252,255,255,255,255,255,255,255,255,253,254,254,246,185,133,150,163,168,139,164,91,71,76,59,50,49,76,116,141,136,150,182,155,147,153,165,178,176,185,212,215,189,184,192,171, -90,59,55,42,47,69,83,58,70,77,90,116,122,108,100,104,119,158,178,204,219,215,173,142,140,162,168,150,108,84,76,84,79,80,90,98,104,121,148,172,189,193,196,175,151,176,157,126, -127,116,104,102,136,153,172,242,255,255,255,229,160,176,170,137,108,100,88,132,168,170,182,206,214,180,162,197,225,217,144,108,225,250,168,93,80,84,69,41,34,45,50,44,48,56,78,78, -58,71,82,76,72,87,125,183,184,177,205,235,255,255,255,255,254,254,255,255,254,253,253,245,240,238,240,227,220,218,210,206,205,172,179,132,87,128,148,136,125,71,45,30,27,42,64,86, -116,157,162,149,130,144,130,134,143,140,141,114,76,45,51,65,87,80,44,17,7,0,1,17,28,23,10,1,0,0,2,13,14,9,1,0,3,5,13,20,33,58,66,76,85,94,84,84, -95,87,112,167,199,236,255,197,154,185,204,242,247,239,234,232,213,242,255,255,255,255,255,255,255,255,255,254,255,255,255,249,183,151,162,178,150,161,201,126,86,70,76,64,55,79,113,160, -175,150,161,203,169,140,146,157,126,126,184,194,186,199,193,121,55,36,29,26,27,44,47,34,41,45,52,77,112,102,72,80,105,151,148,164,201,211,206,189,190,205,192,154,99,90,86,94, -105,132,150,141,116,114,122,120,121,161,172,143,156,183,150,128,142,155,133,147,185,158,147,214,255,255,243,205,196,201,157,133,121,114,118,130,143,161,201,219,222,191,194,231,222,160,114,144, -222,210,154,112,93,86,76,38,27,38,55,61,64,70,94,94,85,101,121,91,73,91,112,153,162,172,208,226,246,255,255,255,252,240,242,236,233,239,246,224,226,231,238,234,226,220,214,213, -212,208,207,196,158,150,136,132,112,62,38,28,36,65,87,122,157,173,167,151,135,150,147,141,130,113,104,68,54,37,49,62,68,57,35,7,0,0,1,10,10,7,2,0,0,0,0,1, -2,3,0,0,3,9,20,27,55,76,66,57,94,114,80,75,76,83,144,234,255,255,252,206,155,228,252,253,247,249,254,253,241,250,255,255,255,255,255,255,255,255,255,254,254,254,253,234, -182,176,183,150,132,161,207,150,130,111,106,100,95,106,154,196,215,201,213,220,179,151,132,143,104,101,151,163,178,212,186,79,42,31,21,17,22,29,23,19,20,16,23,45,92,93,66,61, -79,119,122,113,164,210,218,214,214,224,184,135,102,105,113,118,134,184,199,211,162,130,137,108,84,115,143,147,164,173,154,164,153,141,144,167,162,176,169,186,207,246,241,179,204,191,147,122, -94,86,95,120,129,158,189,218,219,210,225,233,203,144,133,191,217,198,154,165,153,132,94,28,26,43,62,79,102,113,121,109,122,137,141,92,73,86,108,134,133,176,198,203,238,249,252,248, -245,236,211,203,225,220,213,212,232,234,233,233,224,215,214,215,215,211,208,192,176,167,116,79,66,51,42,43,79,111,108,149,167,170,165,161,144,135,146,144,105,69,38,28,21,22,36,59, -64,50,38,21,7,7,12,5,0,0,0,0,0,0,0,0,0,0,0,3,12,20,27,41,64,64,58,64,122,121,76,79,90,106,167,249,245,215,211,182,215,255,252,226,241,255,254,254, -255,255,255,255,255,255,255,255,255,255,255,255,253,253,246,241,171,126,141,106,109,162,220,156,148,134,130,146,173,151,168,196,215,218,214,213,184,155,136,140,128,133,146,161,192,219,192,94, -79,50,26,19,20,19,13,9,9,8,9,23,43,58,61,58,69,82,111,148,191,214,225,225,217,200,153,125,120,115,91,118,130,164,198,220,153,115,107,66,63,94,136,178,154,135,169,168, -129,122,151,169,155,193,207,186,175,234,229,157,170,179,126,86,76,79,92,119,126,163,173,218,228,236,236,199,142,112,111,167,220,214,217,218,212,163,82,28,30,61,80,100,148,125,148,156, -168,154,143,119,87,78,111,130,156,162,184,192,184,184,185,218,224,221,192,203,212,218,197,210,224,224,221,225,225,222,219,212,210,211,207,197,186,187,173,125,132,135,129,140,165,154,125,148, -175,173,171,165,150,91,68,97,92,49,24,37,36,28,55,63,58,45,37,27,22,16,5,0,0,0,0,0,0,0,0,0,0,0,3,7,19,36,54,86,92,71,68,94,139,91,64,86, -105,141,189,235,221,167,162,165,242,255,239,233,252,255,255,255,255,255,255,255,255,255,255,255,255,254,253,253,253,255,240,191,114,78,82,87,100,151,204,214,191,155,123,151,176,194,227,248, -246,236,213,210,206,177,133,121,136,139,139,175,197,207,189,104,86,55,33,24,17,13,9,5,6,7,2,10,22,43,54,55,58,70,93,151,194,224,225,220,227,203,146,116,121,112,62,107, -157,167,198,217,153,91,65,37,57,108,165,179,161,150,140,125,120,114,123,139,168,226,234,203,214,210,189,169,177,162,92,61,65,80,100,121,128,157,187,225,217,221,212,161,109,69,75,169, -198,147,186,219,198,130,71,36,48,88,88,111,193,184,205,218,182,134,122,108,73,88,130,146,190,194,190,184,132,119,149,182,187,190,187,178,191,204,189,193,203,215,229,232,229,227,224,213, -217,215,207,214,208,205,203,198,198,193,190,186,190,185,177,182,179,175,162,153,146,90,37,54,75,35,17,36,38,43,77,88,75,62,48,28,19,7,0,0,0,0,0,0,0,0,0,0, -0,3,8,17,43,62,100,139,101,101,112,153,162,86,66,68,116,154,130,161,214,192,162,186,231,245,240,249,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,250,252,214,123,76, -87,115,108,101,147,165,177,201,196,161,170,155,151,233,255,255,255,253,225,198,203,192,154,126,123,114,122,129,150,156,127,95,85,50,29,22,15,9,5,2,1,0,0,2,12,28,37,42, -45,59,84,119,160,203,197,198,200,185,134,126,143,141,107,153,199,189,184,198,176,106,54,42,61,104,168,147,137,111,119,108,126,114,100,121,163,208,224,214,219,213,189,196,179,142,90,61, -50,69,79,105,135,170,215,200,180,177,179,180,134,142,144,149,175,143,150,201,207,155,86,58,78,107,97,112,178,232,224,224,177,114,108,92,87,122,149,155,215,208,161,158,136,112,129,142, -129,130,126,108,128,149,169,189,213,228,239,239,229,226,222,220,221,221,217,215,213,212,213,214,208,204,200,193,193,193,191,190,182,164,133,128,142,107,78,90,58,20,13,21,24,34,55,83, -93,62,35,17,9,0,0,0,0,0,0,0,0,0,0,0,3,9,21,48,90,113,129,140,109,169,190,169,121,79,65,56,106,129,95,137,200,185,185,180,200,220,229,243,255,255,250,255, -255,255,255,255,255,255,255,255,255,255,254,255,239,127,65,64,116,165,141,130,148,143,148,153,191,183,194,194,170,220,255,255,255,254,220,201,207,194,164,128,108,118,122,119,120,121,139,93, -85,51,31,21,14,10,2,1,0,0,0,0,7,17,26,35,41,52,77,116,150,167,173,206,177,143,143,150,157,168,175,200,214,201,182,184,182,122,65,71,75,85,105,90,98,92,95,83, -94,107,109,122,161,185,211,219,208,214,197,184,172,143,122,82,63,80,107,129,156,150,151,146,134,144,194,226,236,240,226,215,222,198,167,153,157,154,109,68,69,79,100,129,144,217,197,164, -140,154,150,125,161,200,205,219,207,189,165,146,129,142,115,108,106,105,106,90,102,153,178,206,224,225,231,239,236,239,238,238,239,236,234,231,226,225,220,215,212,205,198,197,192,193,191,190, -184,158,122,142,144,141,150,113,41,10,14,19,23,24,26,69,99,48,15,8,0,0,0,0,0,0,0,0,0,0,1,6,12,22,40,83,135,161,143,119,143,215,214,170,123,114,84,56, -80,118,133,164,184,178,183,180,204,231,234,235,242,229,211,253,255,255,255,255,255,255,255,255,255,255,255,255,241,147,92,80,102,157,171,168,133,116,130,151,184,192,198,219,218,243,255,255, -255,255,224,193,197,196,185,144,101,120,123,129,137,147,160,108,79,48,27,21,19,17,8,0,0,0,0,0,6,15,24,31,40,50,72,122,163,164,175,200,161,164,182,182,164,184,207,207, -203,207,194,186,133,91,73,68,70,59,58,78,84,72,52,62,65,76,88,109,150,172,191,204,191,184,212,204,164,143,135,136,140,144,158,154,172,157,143,134,119,144,196,225,238,212,210,224, -232,221,197,176,162,168,158,91,49,57,88,105,99,133,139,173,186,217,180,132,141,168,173,176,158,176,158,140,160,186,139,105,107,106,100,91,119,134,164,206,206,219,232,245,250,252,253,252, -253,250,252,249,246,238,227,219,211,203,198,200,196,184,179,178,163,129,153,168,164,163,150,91,27,23,27,23,23,16,10,40,58,16,0,0,0,0,0,0,0,0,0,0,0,1,6,14, -22,33,49,80,128,171,173,148,183,235,217,179,139,109,77,54,92,148,178,206,215,193,180,185,213,234,239,226,214,189,180,210,243,250,254,255,255,255,255,255,255,255,255,250,205,127,97,95, -109,154,148,168,178,137,109,130,134,184,238,243,255,255,255,255,255,255,227,160,161,189,193,170,107,86,69,92,109,126,136,90,63,44,19,10,15,23,21,8,2,1,0,0,7,15,23,29, -40,47,64,100,149,183,203,199,206,198,193,178,164,196,204,182,189,210,208,180,115,87,66,50,61,48,36,56,66,75,64,54,55,47,47,73,126,158,168,170,157,167,192,208,191,160,158,164, -173,163,143,144,155,156,155,141,113,141,208,222,205,172,173,200,219,217,197,198,192,169,163,101,40,40,49,50,58,77,95,142,153,161,187,182,175,164,161,140,125,177,167,150,191,194,162,164, -162,129,95,92,106,120,158,187,184,213,238,250,253,254,255,254,254,254,254,254,254,248,239,226,218,206,200,190,172,148,134,136,130,118,150,169,154,142,121,76,47,27,15,9,8,1,2,8, -9,0,0,0,0,0,0,0,0,0,0,2,5,7,14,22,30,35,44,59,84,162,204,186,171,144,132,129,100,65,57,56,114,185,197,226,240,192,189,197,219,225,240,227,220,179,169,157, -184,219,245,255,255,255,255,255,255,255,255,197,132,122,97,99,125,144,173,168,203,193,140,114,129,190,249,255,255,255,255,255,255,255,243,178,161,186,186,155,86,56,47,51,58,62,75,55, -42,38,26,9,13,21,27,22,12,2,1,1,7,19,24,29,35,41,49,71,83,130,225,236,221,192,191,167,144,193,165,115,140,178,179,161,113,94,63,41,38,35,27,34,48,65,59,55, -52,40,36,54,101,144,168,163,151,162,185,183,175,179,169,132,151,148,143,139,139,142,141,135,108,118,161,168,163,173,158,170,194,214,204,173,180,179,147,76,30,26,31,36,38,54,59,104, -141,171,184,182,167,168,163,137,121,143,163,180,173,164,191,199,157,129,104,119,119,123,154,160,185,217,240,253,253,254,255,255,254,255,255,255,254,250,242,234,221,189,167,170,151,142,107,116, -130,139,147,162,121,88,93,88,58,22,10,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,7,9,15,20,29,37,42,50,62,71,116,164,153,156,118,101,87,63,50,55,59, -109,156,176,236,248,200,192,190,201,217,221,203,171,141,146,128,154,232,254,255,255,255,255,255,255,255,255,185,113,115,98,99,149,151,194,200,198,187,148,136,161,193,252,255,255,255,255,255, -255,255,255,240,205,198,192,128,64,51,38,35,35,38,43,35,30,31,31,17,9,13,19,20,16,7,1,3,7,16,26,31,34,37,41,55,92,137,199,214,218,208,190,149,142,165,111,80, -93,126,155,157,113,91,66,44,34,30,26,26,33,48,50,52,44,38,43,69,121,150,173,191,203,194,217,203,186,200,176,134,158,132,140,132,107,111,116,151,161,150,120,157,155,169,182,178, -204,207,219,197,169,176,95,38,24,24,27,23,16,27,54,109,153,180,189,178,154,167,141,102,121,141,163,179,151,168,180,160,130,122,104,99,98,114,157,164,210,235,241,247,247,250,254,253, -254,253,249,250,250,246,240,226,211,185,184,192,179,153,114,98,101,140,169,156,116,75,65,64,47,22,10,1,0,0,0,0,0,0,0,0,0,0,0,0,0,8,8,10,13,16,23,31, -41,56,64,69,84,105,122,134,156,129,82,61,57,54,57,68,97,147,201,235,248,225,226,205,206,222,185,171,130,98,102,114,196,255,255,255,255,255,255,255,255,255,255,222,135,113,107,119, -162,169,182,217,199,169,146,144,184,220,247,255,255,255,255,255,255,255,254,249,228,200,198,134,71,63,37,28,27,28,30,27,23,22,24,19,9,9,13,9,12,10,7,8,14,19,23,28, -35,36,37,55,104,149,182,200,227,234,198,179,189,144,76,65,92,165,187,157,122,106,83,62,45,35,28,26,31,48,59,54,41,44,66,109,151,169,179,199,213,219,220,221,220,191,146,147, -171,156,125,116,93,86,137,191,180,154,127,184,158,192,220,219,217,221,218,214,196,151,58,34,29,27,21,15,13,27,66,118,141,137,147,167,160,158,116,59,100,162,187,167,160,141,130,141, -173,142,111,128,126,150,198,189,205,183,194,212,231,236,236,249,240,201,199,229,232,234,233,219,213,208,185,164,137,120,119,104,108,135,150,156,121,65,49,41,36,20,5,0,0,0,0,0, -0,0,0,0,0,0,0,0,3,14,13,12,14,19,23,29,41,64,72,75,101,108,120,155,139,86,62,62,54,50,62,78,116,184,228,241,247,232,217,199,213,198,176,173,134,91,97,143, -218,255,255,255,255,255,255,255,255,255,255,242,149,130,127,153,205,201,167,191,184,160,137,134,183,220,240,248,252,255,255,255,255,255,254,245,222,187,178,111,100,94,61,36,28,24,23,22, -22,22,21,21,10,6,10,10,12,10,13,15,20,24,28,33,37,37,38,58,104,121,140,196,240,215,178,203,205,162,90,77,115,191,208,189,171,148,112,79,55,43,37,34,35,42,57,54, -45,59,113,169,170,172,185,217,236,238,221,222,226,190,151,144,164,192,170,125,90,79,144,170,186,175,161,234,214,196,214,241,250,245,238,219,134,76,43,34,38,38,38,31,29,61,75,98, -127,144,150,164,177,125,66,61,90,135,149,127,125,125,133,130,163,169,135,149,134,150,173,142,116,90,113,172,193,176,172,200,191,148,132,185,194,205,199,214,224,226,207,179,156,144,149,165, -167,160,144,111,85,50,37,29,23,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,17,19,15,20,27,31,35,47,59,59,57,68,97,135,163,123,77,64,70,72,72,88,116, -139,206,235,252,249,245,221,187,178,150,154,157,137,113,119,176,242,255,255,255,255,255,255,255,254,243,254,214,151,129,146,207,225,186,164,164,156,160,143,129,182,213,224,228,252,255,255,255, -255,255,255,250,215,147,104,71,79,77,63,47,40,26,20,19,19,21,17,14,9,7,10,12,13,14,17,21,26,30,33,36,41,41,40,55,83,106,140,187,231,204,186,194,189,157,119,135, -149,173,183,179,183,178,134,86,65,59,56,47,42,42,45,52,59,83,128,158,171,162,163,204,222,224,221,234,228,208,186,142,86,119,158,120,78,61,80,116,206,255,255,246,210,184,225,246, -255,254,254,226,154,94,75,106,133,121,72,51,55,77,57,82,142,160,120,122,162,156,106,101,109,114,100,102,102,97,86,102,113,148,128,102,115,92,84,75,72,93,120,150,141,122,130,149, -136,126,133,155,150,169,162,162,194,212,213,212,203,210,187,172,171,165,136,95,68,44,34,28,16,9,0,0,0,5,10,2,0,0,0,0,0,0,0,5,17,24,21,22,26,31,38,43, -52,50,47,43,51,92,123,113,90,76,75,121,113,101,154,197,169,198,246,255,247,231,235,201,146,115,106,108,109,114,123,198,255,254,255,255,255,255,255,255,253,248,245,200,165,154,180,218, -200,169,147,142,135,136,126,123,182,179,193,234,254,255,255,255,255,255,255,253,207,123,58,54,61,51,45,34,30,23,22,21,15,15,14,7,6,9,13,16,19,21,24,31,35,41,40,41, -49,47,43,50,69,98,146,196,222,189,187,190,162,119,123,135,141,143,141,168,203,203,155,91,78,82,84,64,47,43,44,54,62,78,94,113,127,129,146,175,199,168,191,218,210,162,122,108, -63,70,85,68,48,41,43,77,184,255,255,254,247,250,255,255,255,254,250,247,211,171,170,210,210,192,156,142,119,71,90,151,171,143,112,154,155,126,115,132,121,87,69,83,88,88,83,88, -101,99,76,85,105,79,59,75,95,127,121,151,160,149,130,127,109,109,132,132,125,139,140,123,156,190,212,213,215,214,184,164,158,161,133,99,71,90,70,51,28,12,7,1,5,10,19,9, -0,0,0,0,0,0,2,10,24,31,28,28,29,37,43,44,54,49,42,38,49,78,109,84,66,84,77,136,118,105,157,224,226,224,249,255,249,211,199,183,153,106,73,70,71,84,107,198, -255,246,246,243,255,255,254,243,248,253,252,215,204,206,212,187,193,169,140,155,122,106,94,107,173,194,191,232,254,255,255,255,255,255,255,255,215,97,47,43,44,38,31,24,24,26,33,22, -17,15,8,6,9,14,17,24,30,35,36,41,43,48,51,55,63,52,47,50,71,94,135,186,187,164,168,156,142,100,84,92,118,130,156,191,213,221,173,116,104,112,115,85,54,47,48,54, -59,68,72,86,105,116,118,132,147,125,119,140,148,113,75,59,47,50,47,34,27,43,54,56,191,255,255,255,255,255,255,255,255,255,255,255,242,252,229,203,200,144,185,193,180,153,164,186, -162,127,118,164,160,114,119,140,100,55,45,61,79,97,93,97,104,88,91,102,79,54,63,82,112,182,162,189,199,175,141,123,108,101,109,108,136,144,134,158,199,210,214,214,212,205,200,192, -177,153,121,98,80,82,71,44,33,27,9,6,6,6,21,19,0,0,0,0,0,0,3,14,29,38,37,35,35,38,45,54,54,45,34,34,48,76,107,91,64,71,72,90,107,133,180,247, -252,183,196,222,220,204,179,148,171,148,92,95,85,82,104,157,214,212,203,197,179,219,250,234,250,255,255,250,248,235,227,206,194,177,147,148,112,112,99,123,187,210,222,229,254,255,255,255, -255,255,255,255,235,118,36,33,34,38,26,22,24,27,30,28,28,31,17,13,16,21,24,30,47,55,62,55,55,59,68,77,73,58,48,51,61,84,122,133,118,109,94,79,82,76,78,87, -94,125,172,203,196,192,175,155,150,196,192,122,70,61,57,57,59,64,73,84,98,94,71,65,72,73,57,64,71,68,50,34,31,29,24,22,22,56,109,157,234,255,255,255,255,255,255,255, -255,255,255,255,255,255,252,186,158,130,184,189,161,157,171,179,168,149,155,172,186,178,137,115,76,36,30,41,62,80,84,99,100,97,105,92,56,52,75,77,108,190,219,220,212,175,120,104, -104,101,104,113,141,170,194,205,208,182,163,185,201,204,207,183,146,108,86,79,59,42,38,37,42,37,20,9,2,5,10,7,0,0,0,0,0,0,5,13,31,48,48,45,49,51,54,72, -65,48,33,34,55,87,115,107,83,66,63,93,141,177,180,234,247,136,112,142,198,192,168,160,183,147,93,114,135,125,135,156,158,156,156,156,141,186,243,252,253,253,249,252,242,205,213,206, -217,191,134,133,105,100,132,143,201,214,215,238,253,255,255,255,255,255,254,252,243,167,51,20,21,28,23,20,23,20,16,21,30,58,38,26,27,30,35,40,54,66,71,66,71,76,79,80, -75,62,51,47,47,58,91,94,59,47,49,64,72,78,84,77,87,109,169,213,190,154,155,194,218,238,219,177,98,68,65,61,59,70,85,88,82,68,52,43,38,37,35,35,45,45,27,21, -17,16,19,14,13,54,125,207,254,255,255,255,254,254,255,255,255,255,255,255,255,248,243,214,162,151,156,143,115,87,125,169,184,176,182,165,146,129,101,65,40,20,20,28,48,72,87,91, -84,83,80,65,48,45,50,70,100,148,206,191,167,133,102,101,106,112,135,135,120,136,165,153,148,130,112,136,157,165,158,135,98,75,61,47,38,33,26,31,37,56,47,15,14,16,9,3, -0,0,0,0,0,0,6,16,34,59,65,64,71,70,68,107,107,85,55,50,82,119,128,141,108,69,82,158,176,134,155,252,218,95,104,155,204,169,141,149,153,144,116,163,179,157,149,151, -163,186,177,168,198,227,243,247,236,231,236,242,210,115,132,171,220,211,154,139,127,108,133,143,177,189,204,245,253,253,254,255,254,254,252,248,240,139,54,40,22,21,17,13,15,9,3,13, -23,38,33,33,38,41,43,50,56,63,68,73,80,80,80,82,70,59,49,44,38,43,56,48,31,29,36,44,55,71,76,79,105,113,164,218,203,164,155,204,227,226,224,173,92,69,70,71, -71,86,105,93,83,63,47,36,35,30,24,23,28,29,16,8,10,12,16,16,14,33,80,165,238,247,246,235,236,254,255,255,255,255,255,255,255,253,253,218,170,150,92,65,55,49,69,73, -139,175,180,149,80,52,52,41,27,14,14,23,43,71,94,80,68,66,55,41,36,29,29,61,88,93,146,140,130,113,108,104,109,121,132,146,134,107,87,84,90,108,100,114,126,127,132,116, -78,64,58,44,37,36,33,34,29,55,63,22,26,27,10,5,2,5,3,0,0,2,13,27,45,72,86,91,95,90,83,112,139,122,70,73,119,139,157,167,121,104,135,180,184,120,128,238, -203,87,109,167,170,144,147,139,140,168,178,197,205,162,162,160,176,187,183,193,225,238,253,246,220,233,239,226,212,125,78,118,175,190,144,121,139,151,146,132,151,179,196,211,242,252,253,253, -254,249,240,239,236,185,88,75,47,22,14,10,6,0,1,9,20,19,22,37,44,44,50,57,68,77,79,88,85,73,70,75,62,57,48,41,36,36,34,28,28,33,36,44,64,102,109,95, -116,149,196,210,203,168,151,201,221,212,211,111,61,64,73,78,73,85,107,90,69,55,42,35,31,26,21,19,16,14,5,1,2,7,10,14,23,29,52,101,162,193,208,219,236,255,255,255, -255,255,255,255,255,255,255,215,128,112,100,71,58,47,69,75,95,140,151,141,95,84,62,34,21,14,14,19,34,51,72,65,57,56,48,36,29,15,22,35,40,50,70,86,106,97,85,79, -98,108,112,146,151,122,98,79,87,98,104,100,107,115,123,97,71,82,70,52,51,52,45,44,36,57,69,59,43,34,21,9,5,5,8,6,5,10,22,31,48,78,100,115,113,113,106,111, -129,132,82,106,146,184,200,165,147,149,189,193,162,121,115,153,136,82,101,130,133,134,129,136,154,185,186,168,165,154,165,193,200,191,205,183,206,211,194,199,173,192,217,213,200,91,59,86, -123,200,199,144,130,139,125,107,129,167,190,189,232,243,246,247,245,240,234,232,226,227,158,93,71,43,26,14,13,17,13,13,16,20,30,44,48,49,57,66,86,85,78,85,80,71,69,66, -61,52,44,40,37,34,30,27,30,38,54,66,112,162,126,100,142,186,220,207,180,154,167,210,169,98,97,57,57,75,80,59,54,73,80,66,56,49,41,37,34,27,21,15,9,6,1,0, -0,0,2,12,22,30,42,62,95,129,161,219,255,255,255,255,255,255,255,255,255,255,255,214,122,113,121,108,75,58,55,69,75,95,112,112,114,99,64,31,23,20,16,15,29,41,51,51, -47,43,37,37,28,10,9,15,19,28,38,43,59,56,58,75,93,99,109,127,120,113,108,72,63,70,75,80,100,118,99,70,78,85,68,61,63,64,55,48,42,42,54,63,51,36,24,14, -5,5,6,6,9,15,24,28,45,86,113,122,133,139,112,100,119,141,119,111,132,186,194,180,197,179,193,210,153,113,99,111,95,83,88,95,102,105,112,142,169,190,183,162,153,156,175,186, -165,175,196,192,171,150,109,118,97,108,147,201,151,56,57,58,73,175,231,198,178,161,137,119,140,160,189,194,225,235,233,232,227,222,199,204,201,197,136,83,78,72,48,37,43,56,38,22, -22,30,36,49,54,55,62,75,93,84,76,73,71,73,71,68,63,57,49,44,37,38,37,37,47,57,78,123,164,189,160,127,183,225,213,196,183,186,189,128,90,54,40,44,73,98,83,62, -64,72,69,68,57,50,41,37,33,28,20,14,9,6,0,0,0,0,0,2,8,13,23,37,51,64,118,187,249,255,255,255,255,255,255,255,255,255,255,228,136,109,125,107,75,64,63,73, -76,63,77,99,92,70,52,30,24,21,15,14,21,31,36,36,35,29,24,21,15,10,8,10,19,23,22,24,34,40,56,92,83,75,88,87,88,90,91,71,62,69,69,90,119,119,97,88, -105,97,109,100,87,69,80,70,50,45,55,54,41,26,9,5,3,9,7,9,12,15,23,30,50,93,122,125,133,129,104,94,118,127,141,126,155,191,225,250,253,233,210,218,143,137,142,120, -112,94,78,87,111,111,126,156,171,177,176,186,163,164,176,180,157,167,189,179,132,104,82,83,71,68,87,133,116,73,64,78,99,186,233,226,221,203,175,169,172,168,186,200,221,220,222,210, -208,215,149,137,157,149,109,76,90,101,71,70,66,52,43,37,34,37,40,49,56,62,70,88,86,84,92,86,71,71,72,69,72,63,55,49,42,41,41,54,85,108,137,160,179,173,162,148, -189,226,204,193,211,211,149,82,57,52,45,50,69,76,57,69,65,64,76,77,61,47,41,36,30,26,20,14,9,5,0,0,0,0,0,0,2,10,22,33,43,65,92,143,190,229,255,255, -255,255,255,255,248,227,233,178,120,127,130,93,72,70,66,78,93,104,98,88,75,52,38,22,20,17,15,12,13,23,29,23,24,23,22,15,9,12,13,16,26,30,16,16,24,31,62,99, -80,71,78,80,79,71,65,69,70,66,68,92,102,88,94,100,92,111,142,129,90,61,91,75,49,41,41,35,23,13,6,6,5,15,14,14,14,19,27,34,55,86,122,148,156,140,107,97, -116,120,140,182,247,255,254,255,255,255,252,235,172,183,204,173,148,90,77,108,171,169,147,164,178,170,177,221,198,186,189,186,168,167,183,157,112,91,92,86,68,65,68,76,91,93,95,111, -161,207,241,248,245,232,203,190,186,186,196,203,205,205,210,204,187,200,179,130,108,88,93,88,94,107,80,68,62,43,36,37,34,33,38,47,58,71,85,92,86,93,108,101,78,73,78,75, -75,68,63,59,58,54,54,97,153,172,179,187,191,187,164,161,198,222,207,189,189,169,111,63,43,43,41,51,61,47,34,38,34,40,56,58,56,49,41,34,27,23,17,12,7,0,0,0, -0,0,0,0,0,15,31,51,62,90,111,135,150,186,226,248,255,255,255,255,224,178,165,134,105,119,105,70,69,75,68,77,99,122,92,75,76,47,22,20,19,16,13,10,9,21,30,23, -20,22,24,17,10,10,17,31,38,36,21,20,31,51,86,108,92,79,87,113,106,72,58,63,56,52,68,84,80,68,70,68,63,79,85,100,104,85,83,57,41,31,30,33,33,20,12,13, -21,23,23,17,19,23,29,34,51,78,128,178,175,154,112,99,102,113,132,161,201,233,255,255,255,254,252,247,193,206,222,231,189,106,119,148,180,201,183,171,176,168,173,203,229,222,190,164, -164,179,183,158,129,109,98,75,65,75,70,76,91,106,104,111,186,229,245,248,246,235,207,194,193,190,196,203,200,200,197,204,172,137,165,118,82,66,80,107,100,68,62,52,41,33,30,27, -29,30,38,45,62,77,94,101,97,97,105,98,85,86,88,82,71,64,69,80,109,98,111,176,213,203,200,219,218,203,187,197,218,220,207,191,176,155,101,62,49,36,33,36,47,45,21,17, -17,36,54,59,56,55,43,31,29,22,17,14,7,1,0,0,0,0,0,0,0,16,41,56,52,77,99,133,149,184,203,215,247,255,254,217,157,140,140,116,98,113,86,57,68,88,93,104, -104,100,85,73,64,43,26,31,31,29,20,15,20,37,38,26,35,38,42,30,17,22,38,57,56,45,29,33,61,107,140,133,93,105,151,171,140,98,95,82,55,54,63,71,80,57,54,51, -58,75,90,97,119,116,65,50,58,49,47,51,58,36,21,24,29,26,21,23,20,23,27,36,51,88,139,170,155,163,114,112,108,109,104,99,113,197,255,255,255,255,254,254,248,224,246,255, -249,231,219,233,203,197,196,164,172,169,164,193,221,226,169,141,151,171,180,180,171,134,97,76,79,76,69,82,98,94,72,86,170,238,248,253,249,239,218,203,205,198,197,205,200,193,183,162, -129,104,98,72,68,66,73,108,121,78,57,54,38,29,27,24,28,30,44,54,66,86,100,101,90,87,93,98,105,95,88,79,71,76,93,129,169,186,220,243,238,226,227,228,194,178,199,226, -247,246,224,204,180,141,108,84,68,42,27,31,40,43,22,16,21,49,62,54,45,45,41,31,27,23,17,13,8,2,0,0,0,0,0,0,0,17,49,61,38,44,77,111,127,173,199,199, -241,254,229,163,98,94,123,106,85,83,76,65,111,116,116,133,137,102,77,77,79,50,47,50,41,44,35,35,37,54,57,72,84,64,45,28,22,31,57,62,58,59,52,57,84,130,162,123, -102,156,210,197,170,134,121,114,109,94,75,70,73,58,52,52,70,90,86,73,79,95,59,55,57,55,44,47,44,31,26,22,23,22,22,23,22,24,28,37,63,90,125,156,130,133,129,127, -123,113,93,88,90,128,183,224,219,236,255,254,238,212,247,255,255,255,255,255,183,167,182,183,200,201,200,205,229,232,179,127,122,129,157,186,184,151,115,95,88,80,75,64,80,90,79,101, -170,238,252,253,249,238,217,205,211,204,200,203,196,196,150,65,72,63,49,54,64,69,73,93,113,98,65,47,40,33,29,29,33,38,44,54,70,82,92,97,87,87,88,91,98,87,78,76, -83,109,165,206,219,241,255,254,248,247,252,250,198,190,240,254,255,255,238,213,182,135,127,146,141,61,33,38,26,30,26,6,15,28,29,33,33,33,34,30,26,22,19,14,9,6,2,0, -0,0,0,0,0,23,51,54,37,40,70,93,98,147,194,204,225,222,198,168,126,121,115,97,99,76,107,126,167,171,187,186,184,139,97,86,69,51,61,61,44,49,50,56,63,62,61,78, -79,58,38,28,22,23,36,41,48,61,66,99,123,140,144,126,143,204,229,213,169,139,151,172,139,97,78,63,58,63,44,45,56,57,55,51,49,57,61,50,36,35,34,38,35,28,29,28, -27,27,26,24,27,33,35,47,75,90,108,146,134,120,133,126,122,120,122,109,88,101,128,154,168,207,249,247,239,229,248,255,255,255,255,253,197,177,179,211,239,236,236,224,218,228,213,161, -107,114,134,146,161,153,139,129,104,95,99,78,75,94,104,128,196,249,250,253,249,235,221,210,204,201,207,205,197,192,113,43,50,42,44,54,61,63,68,77,93,92,78,61,47,40,33,34, -38,40,47,55,62,78,86,87,83,91,90,85,93,79,70,71,95,165,235,255,253,254,255,255,255,255,255,252,242,243,255,255,253,255,238,221,178,155,196,196,164,83,47,54,34,20,26,1, -2,5,13,34,35,24,24,27,26,21,19,16,14,9,6,5,2,0,0,0,5,23,42,49,42,41,61,76,85,130,164,175,185,187,175,158,128,120,104,91,120,133,178,190,197,214,232,222, -185,155,136,107,79,68,73,77,58,58,62,72,85,66,47,41,42,35,23,21,10,12,17,20,26,38,59,93,137,142,121,122,137,203,225,199,168,193,201,183,118,73,76,65,49,61,45,41, -43,42,54,57,43,34,37,36,30,31,42,49,48,36,31,31,29,30,33,33,37,48,50,68,86,104,139,143,148,122,104,100,99,115,151,151,99,102,120,137,153,175,226,246,250,241,246,255, -255,255,253,243,242,206,199,210,242,249,247,212,183,185,221,213,156,123,137,116,119,130,120,120,119,114,113,101,86,91,102,129,187,240,252,250,247,239,227,218,213,205,213,210,201,187,113,65, -40,35,45,55,63,69,68,71,73,72,86,82,64,47,31,33,37,38,44,55,66,75,86,86,84,90,86,83,83,78,69,70,129,220,255,255,254,255,255,255,255,255,255,254,255,253,254,252, -250,253,252,238,203,210,255,220,143,105,101,88,49,19,20,24,13,3,8,29,40,27,23,24,27,23,21,20,17,14,12,9,9,7,8,9,16,31,41,48,42,41,52,71,109,137,147,178, -189,194,169,141,126,125,128,144,164,176,190,193,212,224,231,219,167,132,106,127,133,118,143,140,129,123,100,92,76,45,35,22,15,13,14,5,0,7,8,9,13,30,83,122,133,128,107,99, -155,207,196,135,151,249,236,156,102,98,93,72,49,48,61,61,49,43,49,58,47,31,31,35,36,49,59,55,47,45,37,30,29,35,36,42,61,71,68,75,84,118,169,179,149,112,70,70, -91,123,167,164,127,108,126,146,171,198,228,254,255,253,250,255,255,255,248,213,221,189,182,196,224,247,246,175,137,142,184,196,208,197,180,135,116,102,102,106,123,127,129,114,100,102,119,127, -147,196,250,250,250,239,227,220,215,211,212,211,177,137,111,69,35,36,45,56,71,66,61,63,58,61,85,64,48,45,28,30,35,40,45,57,69,76,83,88,90,84,82,80,77,73,68,77, -172,249,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,249,234,220,233,246,213,176,142,135,108,54,15,12,20,19,13,10,22,43,36,26,27,29,29,27,26,23,23,21,22, -21,22,27,31,37,51,63,66,59,47,58,108,136,151,172,190,198,193,157,129,142,147,164,191,191,194,178,170,196,221,226,215,190,170,156,180,180,189,201,190,198,185,128,93,71,43,27,20, -19,17,20,9,8,22,9,10,19,37,109,165,141,113,98,147,211,193,125,109,163,233,204,156,116,111,98,79,44,41,55,62,54,42,38,52,56,35,36,43,47,52,55,41,42,42,35,30, -35,41,44,61,94,91,78,70,76,113,169,182,118,80,59,68,119,170,182,160,140,147,179,215,219,226,246,255,255,255,255,255,255,255,253,208,220,225,198,194,196,227,249,179,112,128,128,129, -194,217,201,179,150,98,94,108,126,125,140,139,108,118,146,136,130,192,243,253,249,241,227,217,211,213,213,214,189,120,72,61,47,37,43,61,70,59,50,49,49,55,80,84,54,37,28,30, -36,41,48,62,69,76,83,88,90,83,80,80,75,70,69,92,208,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,250,232,234,246,243,205,192,190,171,134,56,5,8,14, -19,23,34,41,42,26,28,40,35,30,30,35,35,36,36,42,44,48,55,66,86,101,104,93,77,49,59,99,133,165,187,187,191,164,132,161,198,185,200,192,191,198,161,139,189,242,241,239, -232,227,222,212,205,206,211,218,206,182,186,151,98,61,36,23,30,43,42,28,49,55,47,36,50,58,106,165,178,141,136,197,218,180,120,143,203,220,194,163,172,162,136,90,38,42,49,49, -48,48,48,52,41,29,54,50,38,41,38,33,37,37,36,36,41,48,56,83,121,118,79,64,73,102,134,113,79,70,66,85,147,219,219,182,168,199,221,232,240,249,255,255,255,255,255,255, -255,255,255,240,236,236,205,187,203,227,236,169,126,134,150,111,112,167,178,168,163,119,92,99,136,156,155,136,115,112,135,154,184,226,242,252,248,235,227,222,221,206,205,208,155,83,52,50, -48,40,45,65,59,55,62,55,50,58,78,128,112,45,38,42,45,44,55,64,73,82,86,90,90,83,82,80,76,72,73,112,217,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, -255,255,248,238,235,245,246,241,236,232,206,132,43,12,23,36,38,31,36,55,38,21,40,47,40,35,38,50,54,54,61,70,79,86,102,133,154,143,139,125,82,61,63,78,115,156,177,191, -182,128,146,167,198,218,201,200,191,194,189,198,241,255,248,250,254,253,247,236,228,224,224,234,201,190,221,213,155,112,61,30,47,77,62,27,30,51,73,84,79,71,106,158,212,215,214,215, -164,125,109,121,190,224,220,219,221,208,155,84,55,52,57,48,42,36,43,37,22,29,57,51,37,42,40,33,34,37,38,44,48,52,64,86,105,97,68,63,76,90,93,70,62,71,76,98, -157,208,214,187,206,221,222,233,252,255,255,255,255,255,255,255,255,255,255,252,249,232,217,214,228,241,235,192,205,194,203,160,123,121,130,134,126,114,92,98,129,160,141,122,141,134,123,148, -193,227,242,245,245,234,231,227,220,201,194,180,129,87,62,56,47,47,55,64,55,58,76,64,54,71,114,160,135,73,59,55,54,56,58,68,73,80,84,88,86,82,76,75,73,71,76,120, -225,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,252,248,240,235,243,226,213,235,231,179,106,51,29,52,70,51,37,52,52,34,27,41,43,43,47,54,75,75,78,94,105, -115,134,157,163,169,169,170,147,101,75,76,86,107,142,170,217,182,160,184,146,160,217,206,235,235,239,243,247,255,255,254,255,255,255,255,252,247,240,238,234,215,231,249,229,199,186,102,78, -107,115,78,16,15,44,56,82,86,82,123,178,218,203,210,186,137,100,70,102,193,192,156,206,220,192,130,87,71,66,62,45,34,28,23,19,14,26,40,37,33,37,41,37,38,43,48,54, -57,61,65,79,102,79,61,63,71,77,75,59,52,69,84,98,147,179,192,198,206,231,253,255,255,255,255,255,255,255,255,255,255,255,255,255,252,233,233,233,241,247,239,208,207,225,220,232, -247,178,115,102,83,78,83,101,123,132,112,140,169,143,139,169,206,232,239,240,239,236,235,226,217,207,190,179,173,129,69,58,43,43,57,87,71,59,69,64,66,113,150,156,135,95,71,59, -61,61,59,66,75,77,76,78,77,73,69,72,73,83,102,136,249,255,255,255,255,255,255,255,255,255,254,255,255,255,255,255,255,253,250,248,217,203,197,175,207,214,197,120,79,63,85,97, -68,68,98,88,62,51,56,57,54,57,70,99,112,120,128,143,153,169,182,183,180,184,183,163,126,95,86,99,106,143,171,211,210,172,142,130,179,213,225,254,255,255,255,255,255,255,255,255, -255,255,255,255,254,250,249,234,229,231,234,227,217,210,168,139,150,135,80,16,8,16,24,38,68,92,155,208,179,163,161,175,173,136,154,151,167,182,147,176,211,210,147,98,75,80,80,50, -36,29,17,10,14,20,19,30,37,37,42,42,43,50,56,61,65,73,80,85,99,83,68,69,77,77,64,55,54,75,98,106,123,144,169,197,208,224,254,255,255,255,255,255,255,255,255,255, -255,255,255,255,249,239,236,241,238,240,215,170,167,219,190,198,235,196,136,90,65,58,72,95,114,107,94,168,193,135,143,165,203,235,241,243,236,232,231,221,215,194,151,169,182,104,59,50, -36,42,63,87,88,56,64,77,93,128,161,155,144,106,72,62,62,61,59,69,76,71,69,70,72,70,75,84,93,141,201,221,255,255,255,255,255,255,255,255,255,249,246,255,248,201,212,239, -241,253,255,249,227,226,226,205,187,168,164,137,97,78,97,104,91,90,93,122,116,75,90,99,68,71,83,125,148,161,168,178,187,205,211,218,213,208,199,186,160,148,104,111,122,146,146,133, -179,169,141,157,201,207,224,255,255,255,255,255,255,255,255,255,255,255,255,255,255,253,248,239,225,221,229,238,219,199,208,169,157,137,82,36,26,21,38,75,105,123,119,133,127,113,146,203, -234,238,241,224,221,224,196,173,163,172,154,107,71,77,71,45,38,30,20,14,20,28,30,34,42,48,50,50,48,54,64,70,82,95,102,109,111,95,77,72,72,69,65,59,65,91,116,118, -119,129,149,176,204,221,250,255,255,255,255,255,255,255,255,255,255,255,254,254,249,245,243,235,234,214,194,189,207,217,157,148,149,173,149,82,66,61,70,76,78,87,92,156,207,162,129,168, -219,226,238,246,234,226,224,222,211,155,121,160,162,86,52,43,34,38,66,91,78,59,77,83,104,134,146,143,157,137,92,75,65,63,66,83,79,66,66,68,70,78,102,115,151,224,255,255, -255,255,255,255,255,255,255,255,252,236,232,238,189,108,125,177,217,239,241,227,224,232,234,222,203,180,160,173,141,97,93,101,95,80,84,108,116,114,148,122,75,88,112,149,177,193,206,217, -229,245,248,246,241,234,222,205,180,176,127,99,122,125,116,92,144,180,151,133,160,180,206,255,255,255,255,255,255,255,255,255,255,255,255,255,255,252,248,241,231,232,228,232,220,184,190,219, -193,132,88,80,106,108,120,130,142,164,137,126,115,107,153,212,234,238,214,214,229,234,222,200,185,172,176,147,80,50,45,41,40,29,20,22,26,35,47,47,57,68,66,65,55,54,68,86, -99,116,135,150,141,127,107,102,84,68,68,79,86,107,133,142,135,140,142,156,201,238,249,255,255,255,255,255,255,255,255,255,255,255,250,236,234,241,240,234,234,206,193,215,221,219,167,111, -97,102,88,70,64,70,84,73,71,97,100,153,210,203,164,203,231,226,228,234,226,219,222,224,215,172,125,153,149,101,65,50,42,41,69,85,61,58,68,87,121,148,160,164,187,193,146,120, -82,70,83,108,86,58,64,77,78,90,106,134,194,253,255,255,248,255,255,255,255,255,255,255,252,232,219,167,132,107,108,173,224,220,208,196,196,215,226,208,201,196,180,171,164,123,90,78, -85,68,61,101,104,158,175,137,108,99,127,151,178,224,236,243,255,255,255,255,254,254,239,204,186,176,115,77,93,86,80,83,115,148,136,105,125,149,176,243,249,250,255,255,255,255,255,255, -255,255,255,255,253,249,248,236,234,228,225,222,224,217,214,221,213,164,121,130,149,155,141,136,140,160,146,139,119,108,170,227,231,214,192,199,213,227,219,207,211,196,173,156,85,37,31,40, -44,35,34,40,52,54,57,64,84,97,91,76,59,57,66,87,112,136,162,186,161,150,148,132,100,94,93,104,107,106,132,153,140,156,163,171,211,234,248,254,255,255,255,255,255,255,255,255, -255,246,232,219,215,234,228,226,217,196,191,214,194,207,155,106,100,62,52,55,62,71,90,101,108,122,125,142,186,214,208,233,242,233,215,213,222,218,224,225,217,186,134,127,114,95,78,63, -48,42,54,62,72,69,65,70,98,130,165,198,212,200,190,173,111,112,133,143,97,54,61,78,79,83,76,79,133,249,255,240,246,255,255,255,255,255,255,255,250,233,215,153,128,119,106,143, -176,168,184,190,172,193,210,217,187,170,184,170,133,99,73,72,92,71,63,105,122,165,161,176,171,133,111,129,182,238,252,255,255,255,255,255,255,249,193,164,178,170,133,82,68,69,70,78, -100,106,92,83,98,141,187,192,192,201,249,255,255,255,255,254,255,254,255,255,252,250,243,235,231,222,219,221,218,212,224,221,203,192,171,171,165,171,168,156,136,132,127,123,128,122,161,194, -200,205,212,203,200,212,225,206,185,191,179,135,69,43,43,51,55,45,45,57,71,79,79,77,84,90,93,83,61,57,80,105,125,144,168,192,176,165,170,155,125,105,121,129,144,146,144,160, -157,161,175,203,232,232,241,254,255,255,255,255,255,253,252,249,249,241,232,221,204,211,221,206,196,203,185,171,143,155,134,113,119,88,75,65,68,84,102,130,165,175,143,139,182,229,246,253, -253,250,238,218,225,219,221,226,218,189,141,107,106,105,94,76,52,45,43,51,66,63,58,71,90,115,135,186,191,167,176,183,158,158,172,158,99,52,49,59,59,65,65,57,78,171,228,218, -175,234,245,234,253,255,255,255,250,247,238,165,135,154,164,133,141,165,165,194,190,200,212,213,213,173,175,149,69,55,51,65,78,73,73,92,144,148,167,193,158,121,133,141,192,239,248,255, -255,255,255,255,254,227,157,153,177,177,153,97,83,78,82,94,108,107,85,76,97,149,184,155,163,204,240,254,255,255,255,241,243,249,245,246,248,243,211,210,214,218,218,227,226,222,228,240, -228,227,220,191,194,206,190,165,122,91,94,121,169,182,176,180,210,213,227,210,201,219,219,225,197,179,171,83,51,52,58,58,58,49,52,64,72,85,90,85,83,98,109,90,62,56,98,141, -137,140,180,210,185,164,192,189,154,86,75,107,176,196,184,180,175,164,186,226,232,231,240,253,255,255,255,255,254,252,248,243,238,239,246,222,186,187,199,190,189,191,153,135,148,120,99,107, -107,94,80,78,83,106,151,184,194,204,203,191,214,248,255,255,255,255,249,227,227,227,225,225,221,197,136,107,106,111,102,87,70,62,63,68,68,62,55,83,101,99,121,160,169,156,161,175, -189,172,179,154,99,63,54,57,70,73,65,55,52,69,137,156,86,189,220,229,254,255,255,255,254,255,253,194,168,175,180,137,164,182,173,219,227,220,224,218,218,200,180,100,44,37,35,43, -52,68,70,107,171,183,178,151,141,147,165,184,197,213,228,236,252,255,255,255,255,219,184,184,189,180,146,101,115,112,111,129,143,128,86,92,112,136,148,155,200,206,228,248,255,255,250,233, -217,205,214,225,226,214,189,186,196,204,219,224,234,231,236,242,245,242,222,205,198,193,173,128,104,68,79,165,204,206,193,194,225,224,242,235,222,226,226,226,215,199,142,62,52,55,59,55, -51,48,58,80,93,91,98,119,132,133,115,85,59,61,82,134,163,175,191,212,213,191,187,191,140,70,54,83,169,187,156,141,143,132,177,228,221,233,243,243,245,249,252,255,255,250,236,228, -219,242,253,231,199,193,192,155,157,148,139,149,184,164,125,120,123,94,90,100,121,154,189,219,229,241,249,239,245,252,255,255,255,255,252,235,236,238,243,245,238,231,179,132,121,106,120,108, -105,95,97,122,139,109,80,72,76,66,95,121,135,137,143,144,179,211,192,149,111,116,154,146,135,100,72,59,54,61,65,62,65,146,211,236,255,255,255,255,255,255,255,207,167,170,197,162, -207,234,206,211,232,249,248,239,235,173,94,54,35,37,42,48,51,57,73,134,178,169,162,158,157,167,171,205,200,201,210,192,228,255,255,255,254,219,203,208,194,165,127,108,126,132,137,148, -137,136,101,95,106,141,137,156,184,190,207,227,220,228,232,224,205,175,210,219,201,185,185,178,175,197,212,215,238,242,245,241,246,242,218,208,206,199,201,171,136,107,136,201,199,212,203,213, -248,240,239,239,248,250,246,242,208,134,85,61,56,63,66,68,59,62,86,83,88,104,129,148,163,165,108,78,69,68,75,107,147,184,186,186,200,190,155,154,156,92,69,79,118,154,157,116, -105,105,151,200,217,226,232,224,214,220,240,248,239,229,220,206,208,228,241,227,191,192,194,163,167,175,197,197,184,189,192,182,163,121,101,104,111,167,207,248,255,255,254,253,254,255,255,255, -255,255,255,253,254,253,254,255,254,255,243,224,201,163,175,180,160,137,135,170,190,154,127,88,57,55,70,87,102,114,112,120,150,193,217,175,153,168,199,206,155,116,90,73,59,55,55,49, -55,108,186,238,255,255,255,255,255,255,241,165,122,160,247,255,252,232,192,206,239,253,255,254,246,185,118,78,87,121,129,99,65,57,82,118,140,142,150,169,172,185,197,197,179,198,182,172, -229,254,255,255,249,219,196,206,193,161,137,130,125,142,150,153,144,136,113,95,112,137,160,175,169,197,164,140,135,170,192,194,186,184,192,208,200,170,154,135,160,189,210,219,239,240,241,245, -248,246,239,233,218,191,205,219,197,177,186,194,198,241,255,254,245,226,228,245,252,255,255,253,215,149,105,113,141,150,132,97,83,92,104,84,108,164,169,154,160,176,158,128,112,95,91,87, -125,206,219,190,185,192,164,140,187,150,99,118,153,163,158,116,119,114,137,160,175,205,213,201,185,200,226,224,214,210,198,190,185,194,213,200,177,201,214,187,154,184,218,203,182,179,185,175, -167,120,88,99,105,126,204,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,255,255,255,255,255,249,241,245,250,228,213,220,222,211,173,134,106,71,57,68,71,76,92,90,97, -132,164,157,177,207,171,164,194,169,141,111,88,71,51,50,50,49,90,161,212,254,255,255,255,255,255,212,121,92,142,233,255,255,249,247,254,255,255,255,252,246,233,185,164,189,214,204,178, -151,137,99,78,112,134,127,132,162,200,218,203,176,158,168,175,203,233,249,241,226,208,192,203,191,146,134,148,153,160,182,171,154,143,104,98,119,128,144,179,158,161,135,106,114,147,146,140, -149,141,142,170,171,143,116,102,151,187,204,215,233,235,231,241,245,241,232,221,217,211,214,208,204,192,191,191,199,236,255,255,253,249,253,255,255,255,255,252,245,205,185,201,228,227,207,185, -179,149,139,175,210,212,198,192,210,191,173,155,150,120,104,105,142,186,175,178,189,193,175,161,197,196,161,173,205,200,173,116,118,120,133,164,162,183,198,191,184,198,211,210,206,197,178,170, -169,183,196,176,163,182,189,163,127,178,213,211,200,183,162,157,161,111,86,102,106,128,167,233,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, -255,255,254,242,240,208,157,136,114,101,80,65,65,78,87,100,136,183,146,186,238,172,192,199,165,160,115,85,73,64,54,48,68,86,150,183,229,224,238,255,255,255,215,146,104,135,247,255, -255,255,255,255,255,255,255,255,255,248,239,248,204,217,164,165,194,182,147,119,119,114,113,119,163,203,173,169,160,160,171,186,165,167,191,196,193,180,177,178,170,155,157,161,161,161,172,167, -167,148,109,122,126,125,137,140,121,113,108,90,87,97,99,94,95,87,82,112,137,141,123,112,148,189,199,212,226,231,229,232,233,232,220,217,219,213,211,206,198,192,194,192,193,245,255,255, -255,255,255,255,255,255,255,255,253,238,250,228,232,227,206,219,226,218,218,225,229,213,177,175,210,205,189,182,165,113,98,112,116,142,144,118,156,185,184,162,184,201,194,190,194,185,178,123, -105,129,146,168,186,201,199,182,164,176,190,194,194,180,156,160,163,176,184,176,153,140,116,100,99,141,189,203,211,197,157,133,125,99,95,106,100,118,165,215,253,255,255,255,255,255,255,255, -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,253,252,239,196,155,178,182,155,132,87,84,86,93,108,135,172,196,212,160,150,211,231,178,132,109,77,85,97,98,92, -119,146,173,185,155,164,204,252,255,255,232,185,165,186,250,255,255,255,255,255,255,255,255,255,255,255,255,255,232,175,153,164,208,173,132,116,108,106,126,129,141,167,144,146,148,154,149,140, -133,148,160,170,165,162,158,158,155,157,179,160,147,161,161,144,157,142,99,98,98,98,101,100,100,87,78,107,119,82,90,94,95,90,85,122,118,142,143,141,162,208,218,224,232,235,238,232, -227,227,220,217,217,215,210,203,192,194,204,214,227,253,255,255,255,255,255,255,255,255,255,255,255,255,255,246,211,206,165,212,203,173,203,229,228,203,176,194,213,225,220,178,157,101,73,84, -85,102,151,127,121,144,150,149,163,175,184,185,177,162,164,157,132,133,160,190,225,222,199,185,171,173,178,183,176,165,150,160,168,176,175,175,151,144,98,77,79,112,182,207,198,155,118,119, -114,92,95,122,106,121,151,153,224,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,253,231,201,160,126,98,120,183,190,143,101,94,88,99,121, -140,154,183,187,148,146,171,222,231,156,108,78,88,71,64,76,62,173,176,162,148,185,212,236,254,255,248,198,170,207,253,255,255,255,253,254,255,255,255,255,255,255,255,249,250,200,170,175, -170,141,98,83,111,119,123,118,125,137,119,112,113,126,141,129,115,122,132,135,132,135,153,149,146,160,189,175,182,203,172,142,128,120,88,64,61,57,59,70,82,76,82,116,121,104,107,112, -93,78,87,93,94,140,147,154,194,228,234,238,247,249,246,242,239,231,231,227,218,220,208,205,193,196,203,214,240,255,255,255,255,255,255,255,255,255,255,255,255,255,248,249,226,192,167,171, -158,121,130,205,228,228,219,222,210,193,185,170,156,95,55,58,68,73,101,133,135,107,114,128,130,108,137,161,150,142,153,149,126,125,162,222,254,239,218,207,198,222,226,210,208,186,158,160, -155,170,163,155,158,153,123,102,113,158,201,206,173,118,79,95,118,101,92,115,115,109,151,127,135,218,255,255,255,255,255,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, -255,255,204,129,106,85,64,56,84,84,56,66,72,70,86,102,118,136,156,161,160,147,99,92,153,143,100,73,66,45,28,8,28,64,120,147,164,194,196,226,240,247,224,162,128,183,239,247, -243,231,245,254,255,255,255,255,255,255,255,255,255,215,186,139,85,70,57,63,76,90,102,98,99,106,90,91,99,115,148,143,116,107,104,106,113,129,139,134,140,160,184,191,225,236,186,133, -109,111,101,78,61,54,45,57,78,83,83,109,118,136,156,141,102,90,106,101,125,137,120,150,203,234,238,243,252,254,252,245,241,240,236,224,227,229,221,207,183,173,160,173,213,248,250,250, -250,254,255,255,255,255,255,255,255,255,254,255,227,183,148,76,62,52,88,165,183,229,234,229,190,123,128,163,161,130,73,43,57,70,84,128,142,105,86,86,84,55,85,116,121,133,140,127, -114,140,186,245,255,255,247,250,246,249,255,252,255,243,231,218,189,204,206,173,164,170,168,158,167,191,192,179,165,147,125,127,120,105,95,106,128,121,137,112,88,151,175,205,255,253,218,212, -254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,250,247,253,239,162,102,76,63,55,48,50,50,55,57,63,72,76,77,100,116,115,94,90,70,57,78,83,73,64,49,48,45,34, -21,12,100,172,163,168,142,134,122,125,120,82,86,128,184,204,221,225,253,255,255,255,255,255,255,255,255,255,255,190,106,83,55,42,45,56,73,82,85,83,77,79,78,86,105,135,161,136, -106,98,92,99,106,100,107,116,127,125,136,172,215,239,242,208,165,157,141,115,85,51,44,58,88,101,78,80,109,140,134,109,100,100,113,98,121,129,147,206,221,238,242,247,249,252,249,248, -246,239,229,224,225,229,221,194,157,173,170,171,168,197,213,228,242,253,255,255,255,255,255,255,255,255,255,255,213,100,77,42,24,30,54,153,187,206,217,210,191,140,127,143,149,146,111,61, -43,51,80,107,104,86,69,64,71,62,79,90,106,120,130,127,136,165,218,255,255,255,255,255,255,249,255,255,255,255,255,254,247,253,255,227,205,198,190,187,160,150,160,158,153,141,126,129, -104,92,102,121,146,126,109,104,102,125,104,126,173,197,169,203,253,255,255,255,255,255,255,255,255,255,255,255,255,246,241,245,236,242,250,200,135,94,75,63,50,49,55,54,55,65,57,51, -48,56,69,73,57,54,50,51,54,57,58,57,45,44,41,37,16,21,128,144,111,99,55,31,21,21,34,45,65,86,126,153,196,245,255,255,255,255,255,255,255,255,255,255,255,173,88,68, -59,50,54,58,66,73,70,71,71,78,84,87,113,163,158,108,87,80,80,88,94,85,83,94,112,115,121,184,194,213,224,240,246,207,196,169,118,63,52,61,84,90,78,79,97,116,139,118, -98,95,101,106,147,175,179,219,214,227,222,238,245,253,250,236,201,211,222,226,231,225,205,192,183,177,167,146,142,142,154,193,241,255,255,255,255,255,255,255,255,255,255,255,200,83,56,37, -26,23,31,71,142,170,165,151,134,127,133,142,129,135,142,94,24,30,49,71,79,69,56,47,63,79,88,94,114,122,134,143,163,187,236,255,255,255,255,255,254,254,255,255,255,255,255,255, -255,255,255,255,241,211,196,191,175,178,179,179,151,129,120,122,112,109,115,134,143,111,85,90,105,127,107,95,105,177,183,212,255,255,255,255,255,255,255,255,255,255,255,255,253,243,238,252, -254,242,229,211,178,143,107,86,71,65,68,55,50,56,44,36,36,35,41,42,44,41,43,43,47,48,49,50,47,44,38,34,24,37,83,78,44,28,21,13,10,23,44,72,63,70,76,101, -162,226,255,255,255,255,255,255,255,255,255,255,255,221,106,73,84,82,73,66,62,66,61,58,82,116,104,99,156,176,142,106,86,71,69,77,84,86,78,79,87,105,107,203,206,205,225,231, -252,210,179,167,134,83,57,55,62,71,80,72,92,116,162,148,109,129,143,146,187,190,168,139,105,154,193,215,190,210,224,177,115,161,199,204,210,211,213,212,201,156,127,102,114,129,141,175, -220,255,255,255,255,255,255,255,255,255,255,255,243,115,55,44,49,36,29,21,57,91,111,105,76,93,135,141,105,134,135,57,12,22,36,54,61,66,52,35,51,73,85,106,132,140,154,170, -196,222,252,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,247,215,199,197,203,205,198,180,147,142,153,140,133,125,118,105,121,126,119,106,106,125,122,102,118,163,167,153, -232,249,255,255,255,255,255,255,255,255,255,254,255,252,246,255,255,253,241,227,206,153,109,88,87,83,85,63,45,41,36,30,30,31,33,35,36,35,38,38,38,43,40,47,45,44,41,34, -35,49,64,52,28,23,20,31,76,113,141,122,70,59,66,84,118,175,211,252,255,255,255,255,255,255,255,255,247,193,183,151,129,112,88,73,69,75,68,66,108,167,148,134,196,197,147,126, -97,72,68,75,82,80,72,69,72,86,94,156,193,211,197,207,200,205,165,137,111,65,59,54,49,59,72,70,75,93,127,122,118,114,121,114,120,107,64,42,52,94,135,114,93,121,137,128, -88,119,146,162,168,165,194,215,214,198,177,169,171,165,171,176,187,201,241,255,255,255,255,255,255,255,255,252,182,173,149,105,72,36,24,17,38,75,106,85,55,73,137,139,100,137,86,15, -10,17,36,47,44,56,52,38,43,58,75,128,170,180,193,213,235,253,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,246,210,189,185,203,204,190,157,136,182,193,167, -148,120,109,107,114,116,133,129,129,153,150,127,146,163,161,149,196,245,255,255,255,255,255,255,255,255,253,250,241,221,228,253,255,255,253,241,220,163,108,70,61,57,55,54,44,36,31,27, -26,28,29,28,30,29,34,35,36,37,37,45,45,45,42,40,41,68,66,56,54,50,57,71,106,144,142,101,54,45,49,70,98,132,169,224,250,255,255,255,255,255,255,255,252,226,184,184, -157,127,102,79,70,82,90,95,116,191,239,231,234,224,187,139,98,82,73,76,76,72,66,65,69,87,112,125,144,190,184,190,203,193,132,105,68,48,47,45,43,52,63,56,45,63,80,80, -80,69,91,92,56,40,30,30,37,59,90,66,41,62,73,73,90,115,107,109,130,107,121,162,191,198,200,212,201,169,156,157,158,158,205,245,255,255,255,255,255,255,255,254,219,177,170,154, -90,30,22,24,31,48,61,61,44,59,130,147,135,140,43,8,12,21,35,31,30,45,55,47,38,48,71,135,193,227,238,254,255,255,254,255,255,255,255,255,255,255,255,255,255,255,255,255, -255,255,255,255,249,197,155,167,186,204,170,133,155,164,190,187,153,130,108,106,98,121,160,157,156,176,172,165,170,192,210,220,220,253,255,255,255,255,255,255,255,255,254,248,234,219,238,245, -243,254,252,231,201,162,105,66,52,47,43,41,40,35,30,28,23,24,22,22,21,21,28,34,37,40,42,47,43,42,43,40,61,91,57,66,73,99,125,128,134,147,126,88,31,19,24,52, -88,121,168,220,239,252,255,255,255,255,255,255,255,255,231,191,151,128,108,84,75,82,95,123,135,172,253,255,241,172,155,120,98,90,75,72,70,70,66,66,77,104,143,148,116,128,139,148, -182,199,134,115,73,43,34,35,36,51,61,48,40,57,71,62,52,61,78,68,34,20,24,26,29,50,82,73,49,58,58,56,78,84,82,104,105,98,123,171,198,206,207,211,193,175,163,161, -155,156,206,232,248,255,255,255,255,255,254,255,255,234,192,127,73,31,23,24,35,50,52,49,47,49,90,140,120,84,21,9,12,17,22,22,28,38,48,50,50,56,106,143,163,169,199,255, -252,214,212,255,255,255,255,255,255,255,255,255,255,255,254,255,255,255,231,217,247,227,176,168,186,193,160,161,163,140,172,197,172,147,118,109,111,136,192,203,186,179,203,227,236,249,250,232, -205,235,255,255,255,255,255,255,255,255,255,253,245,242,245,233,222,232,233,207,178,129,82,58,49,44,40,40,37,36,34,29,24,24,20,17,14,16,24,33,40,44,48,52,48,44,48,34, -59,63,52,54,59,115,139,141,149,153,137,100,36,16,13,44,80,99,147,231,218,236,255,255,255,255,255,255,255,255,246,165,140,121,102,91,82,88,126,169,187,228,255,255,219,118,98,94, -88,82,69,65,65,72,73,72,85,111,146,157,119,115,109,105,148,183,158,130,101,61,43,36,36,55,57,41,40,55,63,61,64,65,57,34,21,17,19,20,42,62,72,83,68,52,51,56, -62,61,91,134,129,150,190,197,176,177,197,203,204,192,172,140,116,129,212,221,221,255,255,255,255,254,252,255,255,255,176,122,78,45,35,31,41,56,51,37,35,27,21,44,29,15,19,16, -10,12,17,28,45,48,51,64,84,97,139,151,151,130,144,180,201,176,208,255,255,255,255,255,255,255,255,255,255,255,255,254,224,201,167,136,200,236,198,173,180,190,196,171,144,161,197,210, -198,162,126,118,163,189,203,211,205,211,232,238,249,255,254,238,210,242,218,226,250,255,255,255,255,255,255,255,249,248,238,213,200,211,218,213,183,151,101,61,43,36,37,35,36,35,33,28, -24,22,20,10,8,14,23,35,44,49,48,50,50,51,55,54,64,58,56,50,48,65,104,136,160,142,65,21,14,13,17,41,77,78,114,193,217,228,255,255,255,255,255,255,255,255,207,121, -104,101,88,88,94,153,217,248,242,250,255,255,232,119,91,84,80,78,68,62,61,71,85,85,95,116,146,151,120,101,97,101,144,172,198,162,123,83,52,48,49,47,40,37,43,43,44,51, -63,55,36,22,17,13,10,13,31,44,47,62,49,36,51,64,76,86,92,108,170,189,167,151,99,109,150,172,176,150,116,100,79,85,161,207,210,252,255,254,255,255,255,255,255,234,142,113, -95,75,57,45,45,52,51,35,20,19,7,3,13,14,23,20,12,15,35,51,54,52,65,93,122,155,153,137,149,137,133,133,184,189,226,255,255,255,255,255,255,255,255,255,255,255,255,252, -211,180,173,148,143,167,172,183,186,187,199,179,171,199,219,222,220,196,162,151,185,184,182,194,205,218,217,219,228,246,254,249,232,192,144,183,233,250,255,255,255,255,255,255,254,250,226,192, -204,219,221,206,187,186,118,52,45,38,36,36,37,35,27,26,24,21,19,14,9,16,26,37,47,51,54,52,52,55,59,69,64,64,66,66,61,54,95,130,143,75,13,7,17,19,27,40, -62,66,92,150,204,227,247,248,252,255,255,255,255,255,232,118,79,91,97,109,132,207,255,255,255,255,253,252,235,173,112,84,78,76,70,65,64,73,90,94,102,127,128,125,108,92,94,106, -140,179,205,140,101,83,65,57,58,47,41,45,36,38,35,33,37,37,24,13,7,5,5,5,14,27,28,33,29,35,57,75,98,120,107,84,83,77,66,73,52,52,80,106,113,98,76,66, -56,62,115,173,201,227,231,233,255,255,255,255,255,254,170,79,83,91,72,52,50,57,57,42,33,19,13,24,26,23,24,20,21,54,76,73,59,64,72,123,183,178,167,151,153,150,140,144, -173,196,189,235,249,255,255,255,255,255,255,255,255,252,252,255,234,190,165,160,170,161,163,189,208,208,210,221,180,197,206,191,197,176,163,158,167,149,140,156,172,179,185,191,196,212,221,233, -215,186,191,229,242,248,255,255,255,255,255,255,255,248,221,213,229,229,219,186,170,191,157,79,52,50,45,43,38,29,26,23,21,20,17,16,15,26,35,43,51,61,65,57,56,61,65,69, -77,87,92,100,116,137,129,116,90,44,33,35,30,28,31,34,49,73,109,125,170,211,234,254,255,255,255,255,255,255,222,134,84,88,126,173,226,246,255,255,255,254,254,242,169,179,157,95, -83,80,75,69,70,72,84,85,93,116,104,97,85,88,95,115,148,187,191,144,93,72,78,68,50,47,43,38,35,35,40,30,35,30,19,9,3,1,0,0,3,10,19,26,30,41,52,84, -87,106,133,102,61,41,37,54,56,51,59,66,79,80,52,48,59,87,105,136,178,192,222,232,252,255,255,255,255,254,192,125,107,93,64,54,49,45,42,41,47,47,65,71,36,30,27,22, -43,94,109,106,85,99,107,149,190,193,201,208,200,179,158,167,182,196,179,198,245,255,255,255,255,255,255,255,252,240,242,235,206,203,210,206,198,186,192,206,211,194,206,224,199,167,151,118, -129,106,105,121,133,108,95,116,134,141,150,157,161,183,203,219,201,211,242,249,254,255,255,255,255,255,255,255,255,254,248,241,239,240,227,192,169,203,187,130,98,76,64,43,33,30,28,24, -21,19,21,20,29,37,47,52,58,66,75,69,62,64,71,73,95,102,123,171,206,210,165,141,118,71,61,57,44,41,36,37,58,102,120,136,175,192,243,255,255,255,255,255,255,243,184,139, -109,100,128,171,231,243,248,255,255,255,246,228,162,171,179,102,91,90,79,73,75,70,78,82,87,114,109,82,76,97,108,115,139,204,222,176,122,92,80,79,65,55,52,59,55,41,38,35, -31,26,15,7,5,0,0,0,0,0,12,17,22,33,55,76,90,106,122,95,82,47,26,30,36,37,40,59,70,55,36,57,102,111,112,141,153,178,205,215,226,233,233,249,254,231,194,173, -140,105,80,54,36,33,33,35,59,144,146,92,65,63,50,42,62,104,141,135,108,125,142,157,190,210,220,231,225,213,199,192,218,234,238,228,253,255,255,255,255,255,255,254,248,239,233,226, -210,232,236,224,197,184,201,200,193,173,206,229,192,134,112,84,80,68,63,69,82,66,63,72,88,100,105,112,134,161,184,198,192,221,243,247,250,255,255,255,255,255,255,255,255,255,254,254, -250,245,233,219,204,208,217,204,151,99,83,44,37,33,24,22,22,23,26,29,43,56,54,59,69,72,77,76,77,73,75,86,100,100,118,178,184,177,153,147,186,168,146,102,65,56,49,50, -59,76,102,146,205,231,249,255,255,255,247,242,239,215,185,137,113,116,128,127,151,186,215,238,245,222,208,220,147,134,132,109,99,97,90,80,77,76,75,73,85,109,132,106,101,114,147,167, -160,211,245,214,151,128,91,86,72,72,93,144,99,42,37,33,24,22,13,6,6,3,3,3,1,1,7,12,19,44,70,69,76,76,69,63,59,42,20,22,31,41,58,68,61,43,37,54, -78,98,123,148,157,161,168,180,186,191,207,228,220,221,207,176,164,121,73,43,29,31,35,44,73,147,167,118,111,106,77,116,156,179,213,177,139,167,173,192,210,233,241,233,233,242,245,247, -254,255,253,233,241,255,255,255,255,255,255,253,245,239,238,234,239,243,225,204,187,186,189,179,160,161,200,208,162,105,73,70,68,52,43,37,45,43,43,47,58,65,50,45,68,87,135,183, -196,221,236,246,248,254,254,255,254,252,254,255,255,255,255,255,254,247,238,227,218,191,187,180,136,88,82,56,47,34,26,23,22,26,30,43,57,65,64,63,76,83,82,79,78,85,82,85, -100,95,94,108,119,150,183,171,165,225,247,200,111,100,80,76,55,42,57,123,193,229,249,255,255,233,217,211,206,194,164,127,112,115,115,135,156,204,205,180,192,186,205,214,168,128,119,133, -118,102,99,85,78,78,66,65,83,101,122,126,114,119,167,219,211,215,234,208,196,177,132,142,120,134,170,208,156,43,40,43,24,21,20,10,8,3,3,6,7,5,8,13,23,48,62,61, -59,55,52,54,47,34,29,36,42,51,51,50,47,47,47,45,51,78,109,121,132,135,137,143,158,179,207,212,196,196,198,191,170,126,77,50,40,44,54,69,136,179,192,187,190,178,183,214, -205,205,220,217,193,191,177,219,245,252,252,246,249,254,255,255,255,255,255,247,248,222,225,249,255,255,255,253,246,236,238,241,246,235,203,180,185,205,205,183,177,171,187,191,141,88,66,65, -50,37,31,29,41,37,29,37,43,41,26,19,24,30,52,141,192,198,218,225,233,250,254,250,249,248,248,253,253,254,254,254,254,253,245,235,215,147,137,147,148,133,112,70,40,35,33,28, -28,31,35,47,61,68,84,86,85,86,92,97,94,88,99,108,120,99,91,104,133,179,194,200,225,228,233,255,208,201,121,66,45,37,36,71,115,164,185,196,219,190,163,169,179,193,179,147, -134,122,107,134,169,190,207,186,165,167,196,198,179,140,137,185,168,99,98,88,84,93,70,61,78,127,158,154,140,119,156,211,226,215,233,197,232,238,224,222,201,220,233,220,211,100,47,80, -56,22,12,10,8,3,6,12,12,7,10,19,30,45,56,63,58,62,62,52,40,23,26,29,29,34,34,38,43,72,83,58,54,64,71,73,85,98,98,111,136,144,190,211,212,217,222,187, -143,100,83,69,63,66,69,113,218,242,241,254,246,246,255,233,201,192,208,229,221,226,220,245,255,255,255,254,255,255,255,255,255,255,255,253,219,161,178,228,246,253,253,253,250,242,240,245, -246,219,178,191,210,217,203,191,200,175,172,200,148,108,83,54,42,38,27,27,36,33,30,31,27,29,27,22,13,14,22,100,153,118,127,123,120,180,245,247,249,250,246,245,247,248,252,254, -254,253,245,240,226,171,157,153,142,149,99,54,35,35,34,34,35,35,36,43,55,56,70,93,102,100,102,118,121,98,114,162,164,107,118,157,167,222,203,224,255,254,204,213,227,228,111,55, -43,40,36,36,57,78,93,107,123,123,139,162,163,191,182,164,147,144,114,112,142,161,170,185,150,130,151,197,198,141,148,250,215,97,91,87,88,97,78,72,75,98,150,200,196,148,160,161, -178,197,190,200,238,247,255,250,240,248,248,240,211,115,70,100,105,48,16,13,8,5,8,12,14,13,16,27,41,54,63,68,78,91,57,30,17,13,12,13,15,17,21,40,75,119,116,73, -66,64,54,52,63,65,65,70,78,101,171,225,233,233,214,173,137,112,99,80,87,90,92,175,249,249,255,255,255,254,252,248,245,239,235,236,240,240,231,249,255,255,255,255,255,255,255,254, -254,253,252,240,210,196,227,238,245,254,253,252,252,250,248,249,239,206,197,219,222,215,190,180,204,196,168,171,155,120,77,48,37,31,26,27,30,31,29,33,33,36,31,23,13,13,21,45, -69,73,112,134,122,140,214,247,248,250,243,235,228,232,245,249,252,252,246,236,232,208,149,118,95,83,48,40,42,35,34,34,38,38,41,47,62,68,68,73,86,98,98,122,127,101,93,189, -192,164,183,235,204,177,173,210,250,255,198,189,193,233,133,63,49,45,40,33,41,55,70,87,91,109,147,168,151,153,144,147,133,121,101,97,116,143,151,160,139,113,115,165,184,163,176,246, -226,105,91,97,100,101,92,98,97,95,119,151,157,143,146,158,168,190,180,158,187,231,247,253,254,253,253,254,222,130,143,161,154,88,37,29,20,9,8,9,13,14,17,28,41,57,70,71, -66,59,30,12,2,0,2,7,9,13,20,35,61,85,78,61,57,61,54,51,52,59,61,62,114,135,154,229,231,197,163,163,137,121,107,98,127,154,163,245,255,254,255,255,255,254,255,250, -238,236,241,252,250,242,242,254,255,255,255,255,255,255,254,252,253,250,249,220,218,241,248,253,252,254,254,254,253,254,254,253,250,238,224,221,231,222,197,182,213,210,185,160,132,99,55,34, -34,33,34,41,42,31,33,43,49,45,22,16,13,14,15,20,42,59,78,116,135,112,148,222,246,243,236,220,213,225,240,247,246,247,243,224,179,120,73,64,58,54,49,42,41,38,36,37, -37,40,44,52,69,78,70,62,76,91,90,112,119,94,80,128,182,207,228,250,239,173,182,205,231,248,255,253,200,165,109,65,54,45,38,35,36,44,54,65,80,100,115,116,104,100,108,120, -108,95,85,82,93,116,140,130,118,118,114,125,153,185,194,241,252,151,127,144,134,126,122,126,140,135,126,125,120,106,128,156,169,163,170,177,155,208,252,255,255,255,255,255,248,221,210,182, -157,115,69,61,36,21,19,16,10,8,14,22,37,50,61,63,47,22,7,0,0,0,0,0,7,19,24,28,37,54,56,43,42,47,56,54,52,70,112,163,212,211,222,247,242,173,142,148, -135,116,100,141,221,247,249,255,254,255,255,255,255,255,255,249,222,233,248,255,255,254,254,255,254,248,235,234,241,242,229,238,248,250,240,212,228,243,243,243,250,249,255,253,253,254,254,255, -253,250,246,239,233,226,220,212,218,222,211,168,125,88,49,38,38,37,35,48,58,36,34,48,54,47,33,20,10,17,17,19,36,48,62,85,101,116,119,171,226,235,215,182,199,218,238,247, -243,243,240,222,169,88,69,65,62,59,51,42,40,37,37,40,41,45,50,59,59,66,59,56,75,87,86,91,91,88,93,127,134,136,172,201,227,156,165,189,162,210,254,225,122,87,68,63, -56,47,38,35,33,33,35,43,56,73,80,75,68,75,86,95,93,86,78,75,82,104,133,126,118,132,121,133,130,137,183,242,250,193,206,232,215,180,164,155,165,161,137,115,90,82,104,171, -234,232,221,214,215,242,255,255,255,255,255,249,242,217,207,161,116,98,94,84,56,36,31,23,14,9,10,15,28,41,44,43,29,8,0,0,0,0,0,0,3,15,24,24,29,41,58,56, -54,51,50,61,56,75,151,210,218,232,246,254,245,207,199,221,236,206,175,214,255,255,255,254,254,255,255,255,255,255,255,253,240,247,255,255,255,255,255,255,250,245,232,221,207,186,164,172, -179,210,236,225,232,238,243,243,249,252,252,250,250,253,254,254,254,255,254,250,238,231,228,224,203,197,185,147,100,76,48,45,44,36,34,41,45,31,27,40,54,51,44,29,20,21,26,23, -30,43,56,85,135,148,161,198,213,220,212,201,214,215,221,232,239,239,233,233,197,114,82,73,69,59,52,48,44,43,42,42,47,57,61,70,57,54,55,57,65,75,80,84,76,76,97,127, -100,108,118,132,162,125,140,170,125,148,215,215,127,80,62,59,54,44,36,33,30,29,28,31,41,47,54,55,55,59,68,73,84,79,73,70,77,108,137,118,113,128,118,163,142,123,171,225, -212,219,253,255,247,194,179,187,189,169,132,88,75,87,114,204,255,248,252,253,255,255,255,255,255,255,255,211,162,158,187,149,121,95,79,92,83,64,45,34,22,9,6,9,19,38,36,41, -29,8,0,1,0,0,0,0,2,13,21,24,36,50,63,65,69,70,54,56,59,66,104,172,231,239,239,253,254,255,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, -253,250,255,255,255,255,255,253,252,249,253,233,193,153,120,125,108,112,198,232,211,221,219,226,247,252,247,246,245,245,250,250,254,254,255,254,252,242,234,220,165,158,157,139,104,73,47,42, -40,35,36,37,36,27,24,33,49,49,36,31,30,36,35,31,31,45,63,104,173,162,153,173,180,187,207,214,220,219,201,192,217,200,164,197,183,112,91,79,66,56,56,54,54,54,51,52, -52,55,62,66,64,56,56,58,56,61,70,76,72,71,75,84,86,104,105,122,134,116,123,112,93,112,137,156,120,71,58,54,48,41,34,33,30,29,27,29,36,41,42,43,47,49,56,64, -76,77,73,65,77,118,148,150,134,109,104,127,122,114,149,182,160,177,231,255,242,229,222,196,186,165,134,79,63,82,116,198,255,255,255,255,255,255,255,255,255,255,253,190,116,102,144,192, -163,123,101,91,93,99,79,42,33,19,15,15,22,35,31,31,21,9,1,0,0,0,0,0,10,17,24,42,48,45,50,56,59,66,59,63,64,70,84,137,217,232,240,255,255,255,255,255, -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,253,249,252,250,247,233,196,143,113,99,102,82,84,162,197,122,97,76,85,149,235,241,236,235,226,234,242, -248,253,255,255,253,242,239,229,180,165,150,122,94,62,44,37,36,37,38,36,38,31,26,31,43,44,37,31,30,37,33,31,31,51,75,94,135,151,118,106,118,141,192,204,190,212,198,183, -187,161,123,128,125,83,57,49,49,49,52,56,58,59,58,57,56,58,64,66,66,61,57,56,55,56,63,71,76,70,66,70,72,80,100,112,129,126,109,82,76,79,84,83,73,62,54,49, -43,37,33,33,33,29,28,31,34,36,36,35,38,44,47,51,66,84,83,78,95,119,148,179,162,112,91,91,91,88,99,114,130,171,182,219,225,212,207,190,187,157,113,75,58,78,116,178, -238,255,255,255,255,255,255,255,255,255,255,218,120,93,93,143,171,123,106,109,92,120,95,55,54,58,43,24,30,37,44,38,21,5,0,0,0,0,0,3,19,24,28,43,48,41,43,48, -48,55,66,73,66,79,84,125,200,225,247,254,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,254,254,248,240,242,233,226,201,167,139,116,115,113, -111,108,97,93,58,43,42,38,52,133,218,211,215,206,208,199,212,242,250,253,250,243,234,232,211,158,128,104,79,56,47,41,36,35,37,37,45,41,27,30,34,38,37,33,26,24,24,30, -33,49,78,102,101,101,100,91,115,147,171,193,191,208,192,197,192,142,118,100,86,65,42,33,38,47,51,56,58,61,62,59,58,57,59,62,62,58,55,54,51,56,62,69,76,66,63,65, -64,69,86,108,113,100,76,64,68,72,71,68,63,58,52,45,42,35,35,34,33,31,30,30,34,34,33,31,33,36,43,48,61,85,92,92,115,121,130,167,170,125,90,84,80,80,90,98, -114,133,136,172,222,192,207,198,191,144,91,75,69,78,93,135,219,255,255,255,255,255,255,255,255,255,255,240,115,77,72,95,140,132,114,120,102,119,95,70,66,85,62,27,35,41,50,47, -27,6,0,0,0,0,0,16,20,20,21,30,37,43,52,54,51,56,65,71,78,88,98,148,224,248,250,252,248,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, -255,255,254,254,247,239,236,231,222,214,200,171,171,167,153,123,118,99,51,37,31,26,23,27,38,70,170,204,200,201,176,144,167,222,241,241,245,239,219,179,134,105,97,93,77,63,55,50, -40,35,35,36,42,38,35,34,34,35,33,28,21,20,22,26,34,52,90,115,94,72,75,100,136,167,183,193,200,206,199,211,200,143,109,94,77,58,47,35,37,43,51,55,58,62,61,59, -56,55,56,56,57,55,50,48,48,51,54,56,56,56,57,61,59,63,69,84,84,75,70,65,64,66,64,62,58,57,52,47,45,40,36,35,35,35,35,31,31,31,31,29,29,34,40,45, -58,72,80,86,93,118,143,154,176,149,105,87,85,84,88,94,113,122,129,190,236,189,194,206,183,132,84,93,98,93,104,102,179,254,255,255,255,255,255,255,255,255,255,212,108,78,69,78, -119,116,98,107,134,140,109,71,79,87,71,35,34,38,38,26,6,0,0,0,0,0,6,13,10,12,15,26,38,51,63,59,52,61,70,82,92,92,100,137,225,254,245,248,254,255,255,255, -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,235,220,226,197,189,204,201,193,193,186,158,115,80,55,34,24,19,14,14,15,26,42,87,172,199,163,85,76, -121,201,236,238,239,234,217,168,104,101,100,93,82,72,64,54,43,38,31,33,34,35,29,29,34,34,28,23,19,17,21,24,34,54,88,109,88,68,68,75,94,119,167,198,205,204,204,215, -203,144,102,97,76,57,43,36,37,42,50,54,55,59,58,57,54,54,52,50,52,48,44,43,45,47,47,43,44,45,50,58,54,58,62,69,73,69,65,62,61,58,59,58,54,54,52,50, -49,40,35,34,35,34,31,30,27,24,27,27,26,27,31,44,52,58,66,76,86,137,183,175,169,127,121,116,94,79,86,90,121,156,144,193,219,173,197,194,178,155,132,127,143,130,148,133, -161,227,252,255,255,255,255,255,255,255,255,187,108,97,92,91,97,98,87,77,116,121,80,57,68,75,64,40,31,34,28,10,0,0,0,0,0,0,0,1,3,12,22,33,50,72,70,63, -62,77,99,100,87,104,135,182,239,247,227,194,240,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,228,211,196,154,133,134,154,183,187,153,118,91, -56,34,23,20,17,13,12,13,20,33,47,98,149,119,57,52,70,121,196,229,231,227,228,197,127,111,112,106,93,83,66,52,43,40,34,30,33,31,24,24,27,27,22,19,19,19,20,27, -40,43,52,70,71,63,64,65,79,112,155,199,194,197,200,203,187,150,125,105,77,56,48,44,43,43,47,49,52,55,55,56,55,52,51,50,47,43,38,38,42,42,40,40,42,42,48,54, -52,55,57,61,68,65,58,55,54,54,57,54,50,50,49,55,55,41,31,30,29,26,26,22,22,21,22,21,23,26,28,40,49,52,62,76,101,175,208,189,184,182,163,154,125,95,84,83, -120,151,132,163,192,165,192,208,208,197,220,186,182,160,164,169,208,228,247,255,255,255,255,255,255,255,255,219,153,123,115,111,87,76,69,65,71,58,34,40,42,42,44,36,30,35,23,12, -0,0,0,0,1,0,0,1,14,27,34,54,90,114,108,78,87,113,135,114,104,128,157,199,233,236,190,156,215,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, -252,255,255,255,243,199,171,157,125,78,91,121,148,132,98,78,49,27,23,26,17,13,12,14,20,28,35,43,55,50,48,48,51,70,133,185,163,143,191,184,127,118,116,106,93,87,66,56, -48,38,37,36,34,30,26,26,26,24,21,15,14,17,19,24,35,38,43,52,58,62,70,82,106,142,185,182,144,187,189,189,170,164,146,108,92,77,68,59,48,43,45,48,54,57,56,54, -51,49,48,45,43,42,35,34,37,38,40,40,38,38,44,49,49,50,49,54,58,57,50,44,44,48,48,47,51,49,48,68,75,41,27,26,22,19,21,20,21,19,17,19,17,20,24,31, -40,47,61,94,141,172,163,139,177,236,222,186,149,127,94,72,97,107,114,142,155,156,175,201,214,227,239,226,217,192,203,233,252,255,255,255,255,255,255,255,255,255,255,255,226,140,99,93, -73,59,52,61,48,23,19,23,17,15,21,24,24,26,24,19,0,0,1,14,13,10,15,20,34,34,34,68,125,137,128,107,121,136,168,146,148,177,215,211,198,199,160,179,218,254,255,255, -255,255,255,255,255,255,255,255,255,255,255,255,255,254,254,254,254,255,254,253,246,212,167,147,109,80,86,91,116,114,80,72,49,33,22,23,22,17,16,20,31,35,31,31,29,34,40,42, -48,65,106,100,82,82,112,130,102,88,78,77,79,79,70,61,50,44,41,42,38,30,28,28,27,26,21,15,15,16,17,21,28,33,37,45,56,68,73,86,102,111,128,114,94,136,153,161, -175,184,173,150,143,114,80,65,54,49,49,48,52,56,57,56,50,47,47,43,40,37,33,35,35,34,35,35,35,34,38,44,42,44,42,42,44,41,38,35,30,30,36,42,41,44,56,78, -82,43,30,24,19,16,19,17,16,14,12,12,9,10,16,21,27,34,45,82,128,153,141,120,133,207,211,167,116,107,79,57,79,94,80,122,176,175,187,210,226,235,228,232,245,240,233,255, -255,255,255,255,255,255,255,255,255,255,255,254,242,144,71,54,50,47,35,41,47,27,20,15,14,12,14,19,20,24,30,23,6,0,31,51,49,51,57,63,48,24,24,72,135,142,148,128, -135,158,198,205,190,222,245,235,234,191,182,175,226,252,255,255,255,255,255,254,255,255,255,255,255,255,255,255,254,249,252,255,255,252,249,246,236,213,169,154,125,111,111,104,123,111,78,58, -42,30,22,20,23,21,24,30,38,35,28,28,24,27,29,31,36,61,115,105,80,71,87,98,93,82,66,71,76,73,66,58,48,42,37,40,37,34,31,30,29,28,22,19,16,14,16,19, -23,29,31,40,49,56,70,65,63,69,70,64,66,75,105,135,165,184,178,165,151,113,78,64,56,52,51,50,55,57,57,51,45,42,42,38,34,31,34,35,34,33,34,34,34,31,33,36, -34,35,35,33,34,41,34,26,22,21,22,21,24,44,68,82,80,43,35,30,22,20,21,14,9,8,6,3,1,2,8,14,17,21,26,44,79,98,122,141,100,149,170,167,129,70,56,45, -94,121,73,123,206,197,197,215,229,239,231,236,255,255,254,255,255,255,255,255,255,255,255,255,255,255,255,255,245,134,57,36,28,20,19,24,43,33,23,30,28,12,15,21,20,21,27,57, -47,17,44,63,70,69,80,83,45,19,20,71,129,156,175,178,191,180,170,175,184,201,210,215,217,199,194,176,235,249,254,255,255,255,246,250,255,255,255,255,255,255,253,252,250,245,249,238, -234,239,236,239,219,200,165,127,118,149,155,153,158,133,116,79,49,28,21,22,19,21,24,33,34,27,23,21,19,20,22,22,31,49,99,98,77,66,78,84,86,80,71,71,68,64,58,51, -44,40,37,36,36,34,33,34,31,27,22,19,14,13,16,19,20,23,24,26,27,34,51,51,45,47,57,61,62,69,83,92,119,141,139,111,88,80,72,63,56,55,54,56,52,54,54,44, -40,36,35,31,30,30,31,31,33,30,31,33,29,28,30,31,30,30,31,34,36,62,36,14,13,10,10,10,17,35,58,65,61,44,36,35,33,29,17,10,8,7,5,2,0,0,5,8, -14,16,19,21,36,51,86,128,100,85,88,134,155,76,51,59,99,148,143,177,221,192,177,213,248,253,243,248,253,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,253,238,154,79, -31,14,9,19,23,30,47,43,24,9,14,17,21,20,40,88,111,98,104,127,94,95,127,125,62,24,19,70,137,173,168,186,170,141,139,130,139,132,154,210,227,183,179,189,241,255,255,250, -247,242,219,225,255,255,255,255,255,255,249,234,220,227,212,193,179,208,222,220,217,204,176,133,130,165,175,164,164,129,95,66,43,31,24,22,17,21,27,29,21,14,15,15,16,16,19,22, -28,43,72,71,56,57,59,66,76,66,58,55,57,54,50,45,42,38,36,33,34,35,36,35,33,27,22,17,15,15,16,17,17,21,21,16,15,20,26,24,22,29,40,48,56,69,80,108, -136,144,118,92,76,70,63,58,55,54,54,55,48,43,36,30,26,26,22,21,23,24,27,30,34,34,34,34,33,28,28,31,29,27,28,27,22,22,17,7,3,1,6,7,10,20,33,40, -42,31,22,28,31,31,19,12,12,8,6,3,0,0,2,7,12,14,15,14,20,33,43,66,78,62,54,72,122,78,45,72,92,129,190,245,234,183,184,199,248,255,242,227,248,255,254,255, -255,255,255,255,255,255,255,255,255,255,255,254,254,255,246,208,111,38,35,28,16,29,55,35,17,14,15,20,28,36,62,93,128,165,190,204,141,112,139,129,65,27,27,84,129,157,170,170, -133,90,83,88,101,105,162,218,211,167,172,185,207,229,236,234,231,210,176,176,233,253,255,255,255,255,254,222,183,185,164,158,167,196,232,219,214,194,169,171,187,176,185,172,136,109,77,44, -27,24,21,19,15,16,24,16,9,7,12,20,20,17,17,21,27,40,44,47,44,43,44,50,56,55,47,47,49,47,42,40,37,35,34,33,33,34,33,30,29,30,27,23,19,16,15,15, -19,24,21,12,9,6,2,0,5,10,22,31,44,69,111,137,140,144,104,77,70,59,54,51,50,48,47,43,37,33,28,21,19,16,12,9,9,15,22,28,34,36,36,34,33,30,30,30, -29,27,23,20,15,12,10,8,3,3,3,8,14,21,36,50,47,34,21,19,19,19,17,17,20,15,10,5,1,0,6,12,10,14,15,14,17,20,22,33,57,62,52,49,106,115,64,64, -79,105,175,252,253,240,233,221,227,255,255,232,239,253,252,254,255,255,255,255,255,255,255,255,255,255,255,255,255,254,247,239,162,126,139,28,5,15,23,22,20,19,17,24,31,43,68,104, -132,150,170,191,155,98,114,109,48,23,41,93,126,158,160,162,120,88,71,66,72,92,137,163,156,165,162,165,180,196,210,212,197,157,151,158,158,194,254,255,255,254,252,226,199,187,193,197, -189,200,228,225,220,185,164,186,203,203,198,163,123,113,69,43,24,17,19,20,17,19,22,13,6,15,22,28,24,17,16,20,27,34,34,36,45,55,58,57,54,44,41,36,38,38,37,31, -29,28,29,31,33,29,30,35,42,40,36,33,20,14,10,13,17,28,27,13,6,0,0,0,0,0,9,28,50,80,76,58,50,55,45,42,41,37,37,38,38,36,37,36,34,30,24,21, -15,12,5,0,1,10,20,27,31,35,36,35,34,30,31,33,33,28,22,17,12,12,14,14,13,13,15,24,28,37,54,57,51,43,19,9,14,17,22,29,33,28,21,9,6,8,13,13, -14,15,15,14,14,13,16,22,45,70,61,51,78,97,73,71,86,104,169,235,252,255,254,233,197,221,245,255,247,243,250,247,231,249,255,255,255,255,255,255,255,255,255,255,255,255,255,235, -176,150,137,54,3,6,15,12,14,19,48,63,57,68,85,127,144,130,143,175,130,86,108,91,37,31,54,92,125,148,173,165,105,91,72,59,61,75,100,112,116,154,162,154,164,172,187,194, -168,120,129,134,121,211,255,255,255,255,248,241,240,241,238,224,213,218,226,229,219,165,162,178,197,208,193,158,139,115,79,59,30,22,26,29,26,27,26,15,20,28,26,28,28,24,22,28, -42,35,29,36,59,79,79,78,62,38,31,23,23,26,28,27,24,23,27,29,30,33,35,50,56,40,42,41,22,8,5,8,23,51,44,8,1,0,0,0,0,6,26,50,84,100,41,24, -24,22,21,21,19,21,22,23,26,28,30,31,33,31,27,21,16,8,2,0,0,7,14,24,33,35,37,38,38,34,34,35,33,29,23,17,14,12,10,10,13,14,19,24,30,42,49,61, -73,52,24,13,19,20,27,40,56,49,33,19,13,15,16,20,19,16,15,14,12,8,12,19,29,49,58,71,78,90,86,99,140,144,169,193,199,228,255,217,186,198,196,232,240,232,214,200, -191,239,255,255,255,255,255,255,255,255,255,255,255,255,255,253,167,87,72,63,26,16,20,17,31,59,99,113,102,78,83,132,156,136,121,128,100,84,101,61,24,34,57,90,120,149,160,119, -88,91,91,76,54,47,85,104,135,197,168,142,127,125,164,177,146,120,143,126,130,229,255,252,253,248,250,248,242,241,253,235,215,214,215,228,197,176,184,187,186,171,146,134,130,115,100,70, -42,36,51,56,47,48,44,36,30,27,22,29,35,33,33,43,64,45,33,40,62,71,79,78,61,43,29,22,19,19,19,26,31,28,34,38,37,41,42,52,45,33,38,43,33,13,6,12, -57,95,51,10,1,1,0,0,0,12,24,45,68,76,50,28,22,19,16,14,10,13,15,17,19,22,24,28,31,31,29,21,14,6,0,0,0,6,12,21,31,36,37,40,40,38,37,34, -34,29,26,22,17,13,9,6,6,7,10,17,34,50,55,87,97,52,40,23,24,26,28,43,71,77,55,33,26,23,22,24,24,21,17,10,7,5,7,13,23,37,45,58,75,99,107,120, -179,199,193,178,156,196,254,233,221,229,198,207,221,226,178,151,177,222,246,247,254,255,255,255,255,255,255,255,254,254,254,236,162,79,41,21,28,27,15,30,66,94,115,116,104,73,91,136, -150,127,118,115,92,83,99,55,28,37,59,91,123,146,121,98,123,135,127,94,63,50,86,115,149,197,146,113,101,84,105,113,86,93,121,127,134,184,221,242,228,240,255,241,225,224,246,250, -232,219,221,236,193,187,186,176,186,183,139,132,144,130,120,104,68,52,84,86,83,82,72,54,34,23,24,27,26,28,29,35,41,37,40,45,56,71,68,64,56,48,35,29,22,20,23,29, -35,33,35,43,43,41,38,38,35,34,38,37,31,24,16,56,109,78,31,16,9,14,13,7,9,8,8,16,36,54,50,29,24,19,14,12,9,10,13,14,14,15,17,23,28,29,28,21, -12,6,1,0,0,5,13,22,31,37,40,41,42,40,38,35,33,27,24,23,19,10,6,2,1,2,6,14,23,29,50,69,59,36,49,38,33,33,34,42,63,72,57,40,33,30,30,33, -33,29,20,9,5,2,2,10,22,34,36,45,59,83,129,163,201,217,213,183,158,198,255,255,254,249,239,218,227,231,162,156,186,193,220,239,254,255,255,255,255,255,255,255,254,250,249,236, -144,70,42,15,19,22,20,35,62,86,106,107,95,104,132,143,132,99,98,118,87,72,70,63,48,49,69,86,83,72,63,84,118,120,123,99,70,82,114,111,153,139,91,91,88,61,59,63, -72,75,128,197,179,177,205,233,238,255,243,201,197,225,248,254,254,254,254,247,211,206,196,186,196,190,144,137,137,121,141,178,132,90,97,102,92,87,100,80,44,28,23,24,22,24,27,31, -29,30,40,69,100,99,108,98,52,36,36,31,27,23,27,31,31,27,30,44,45,33,28,31,40,51,48,38,42,52,58,102,118,82,55,44,36,44,31,12,5,0,1,3,14,30,34,26, -15,8,9,13,10,10,9,7,6,6,10,21,27,33,29,24,16,8,7,6,5,9,17,23,31,38,43,41,43,41,40,37,34,28,23,21,19,14,5,0,2,6,6,5,0,2,21,23, -13,21,51,54,49,44,43,50,57,54,49,41,36,34,36,40,40,35,24,14,6,2,1,10,24,33,36,42,45,65,119,189,226,206,221,217,180,190,248,254,255,255,255,248,249,226,173,137, -165,205,221,232,253,255,254,255,255,255,254,253,255,253,249,255,160,42,30,15,19,29,15,26,44,66,102,111,123,121,128,147,146,128,125,111,97,86,69,107,102,79,82,85,76,75,58,57, -72,78,86,98,86,88,90,87,118,78,58,92,86,59,62,68,91,108,147,180,184,191,199,247,255,255,214,192,218,229,245,252,252,255,255,249,229,217,203,178,191,185,157,164,163,175,186,196, -197,189,193,187,122,133,151,127,65,34,24,22,17,20,33,30,22,24,49,88,133,129,143,136,78,35,35,41,36,19,22,28,30,34,36,50,52,29,27,48,64,63,47,44,62,86,123,140, -106,76,62,61,58,61,47,35,21,7,16,9,5,16,19,12,17,28,28,21,13,10,6,0,0,0,3,14,24,33,34,29,21,13,12,10,10,15,17,27,31,38,41,42,42,41,41,37, -35,31,24,20,17,15,8,3,2,6,1,0,0,0,2,0,5,28,55,66,75,59,49,56,57,40,34,35,36,37,40,43,49,41,30,19,10,5,2,9,24,35,36,49,65,88,120,184, -224,219,222,218,212,190,234,252,255,255,255,252,221,196,175,123,129,190,238,231,234,252,254,255,255,255,254,240,239,243,241,220,205,100,33,22,22,16,13,37,59,79,100,115,135,113,132,147, -139,112,114,92,93,114,135,175,164,147,143,119,83,56,42,40,44,54,63,73,63,58,62,64,63,51,61,95,85,73,70,80,93,102,151,190,160,165,176,229,235,203,157,165,203,243,241,250, -248,249,232,225,213,194,167,151,198,199,184,177,199,211,194,186,200,212,218,205,150,113,137,115,48,27,24,23,23,22,23,30,37,45,65,97,115,116,137,127,78,43,45,62,51,34,31,42, -68,78,70,82,56,34,71,101,101,72,52,45,66,144,165,156,125,80,64,58,55,56,100,126,87,66,56,26,16,52,45,50,79,75,55,47,26,12,0,0,0,0,0,7,20,29,34,31, -21,16,14,17,17,17,20,27,35,37,40,42,42,41,40,37,33,30,22,17,14,12,9,6,5,3,0,0,0,0,0,0,0,33,62,84,98,90,76,68,51,30,22,28,33,36,40,45, -52,47,34,22,16,13,12,14,23,31,40,62,111,158,170,180,194,200,219,203,190,178,214,243,255,255,254,228,187,173,163,141,90,143,232,226,218,253,255,255,255,255,235,183,149,208,235,178, -193,144,69,77,44,24,50,72,80,95,113,122,134,137,158,160,146,120,119,123,147,161,175,178,167,165,160,132,85,55,41,35,34,40,55,65,56,55,50,44,42,51,64,69,88,123,121,115, -142,123,146,167,133,137,154,169,162,196,210,198,220,253,248,239,228,213,205,180,153,147,137,149,189,211,182,156,201,218,204,190,186,178,190,193,141,107,128,98,43,24,21,21,38,31,21,33, -62,80,85,91,116,140,129,85,59,43,36,54,41,56,108,136,143,116,84,90,91,116,156,147,129,83,77,73,91,154,162,172,178,149,90,69,62,43,90,137,112,116,104,54,64,114,122,125, -97,68,54,42,23,3,0,0,0,0,0,5,17,26,30,29,22,20,20,20,21,20,23,30,35,38,41,42,41,38,38,37,31,26,20,15,15,14,16,13,12,5,0,0,0,0,0,0, -0,17,56,102,118,113,101,73,47,30,20,23,28,34,41,48,55,52,42,35,29,23,23,20,26,34,43,63,129,172,206,197,164,136,168,178,161,144,157,212,250,254,253,196,193,198,180,162, -100,106,197,239,247,255,255,255,255,252,217,200,157,199,228,164,187,169,112,133,102,101,116,85,49,88,140,126,128,144,149,150,140,157,153,171,192,192,189,162,149,164,164,128,88,68,50,37, -35,41,57,65,57,50,49,45,51,61,65,85,129,149,200,177,175,132,137,139,113,132,156,144,168,226,255,255,255,253,241,224,206,164,170,151,113,129,149,162,168,162,132,129,190,212,217,219, -199,168,163,171,119,107,121,84,45,31,24,30,49,33,23,41,65,94,83,98,120,130,114,91,69,33,37,61,44,78,175,214,168,120,94,86,108,148,160,156,143,93,87,108,125,146,147,165, -198,172,135,108,61,57,108,154,150,136,136,90,82,98,80,68,56,37,24,9,0,0,0,0,0,0,0,0,12,22,28,28,26,24,24,21,21,22,27,36,38,38,42,43,42,41,40,35, -37,33,26,19,17,17,21,17,13,8,0,0,0,0,0,0,0,23,73,101,112,105,70,57,44,31,26,26,31,37,47,52,57,63,68,61,52,43,34,29,30,41,61,69,115,170,210,192, -149,130,155,175,142,125,128,161,207,252,249,186,189,215,218,198,98,76,150,228,255,255,255,253,252,247,235,226,179,205,219,176,203,204,141,141,155,158,144,73,51,69,133,142,135,130,132,127, -157,187,193,203,187,191,189,140,122,162,171,130,101,85,63,41,36,37,38,44,43,41,51,59,77,82,87,109,165,179,225,191,161,142,125,121,113,130,168,177,167,233,255,224,192,178,154,148, -151,157,157,116,115,151,157,178,167,127,142,141,171,220,228,226,198,163,150,135,115,114,119,76,55,47,44,63,66,45,52,90,120,112,95,126,136,139,128,95,58,38,50,62,65,77,129,190, -171,146,125,90,125,167,186,207,182,114,133,141,154,156,151,164,171,172,189,143,111,121,165,178,164,143,126,91,43,19,27,34,34,19,9,0,0,0,0,0,0,0,0,0,8,20,28,30, -29,26,27,22,21,26,33,44,43,37,40,44,43,43,43,40,43,37,30,26,20,20,22,15,9,6,0,0,0,0,6,3,9,30,64,88,94,85,57,47,40,28,24,26,35,43,45,55, -69,90,106,93,80,59,37,30,31,48,75,91,116,129,170,214,177,169,176,142,107,111,107,120,192,242,235,208,187,212,204,154,71,59,127,220,252,255,253,247,246,245,239,226,215,220,208,199, -200,171,141,129,158,169,133,107,100,112,130,133,136,129,128,143,170,203,206,197,198,196,201,190,182,190,167,139,113,95,68,42,30,26,26,33,38,45,54,61,69,76,91,123,212,245,241,218, -212,228,205,176,130,150,184,208,226,249,249,183,146,146,143,154,153,125,88,58,76,100,158,207,186,147,147,165,201,233,232,206,143,108,134,137,111,113,123,107,66,59,70,97,77,72,104,156, -170,135,122,163,190,172,146,92,78,72,63,45,44,100,168,182,196,194,171,170,207,207,197,198,204,163,168,137,142,139,133,140,148,172,201,192,187,200,191,179,167,137,99,61,22,6,7,9, -12,7,0,0,0,0,0,0,0,0,0,2,13,22,30,31,29,29,28,26,29,36,44,51,43,36,40,42,43,43,44,45,45,41,40,42,40,29,26,26,16,9,3,3,7,10,13,17, -27,36,61,93,97,78,50,41,34,23,24,27,35,41,50,71,100,119,132,129,107,71,41,30,37,56,72,106,143,125,99,204,200,199,163,94,105,102,85,114,189,217,182,148,143,185,184,161, -126,84,126,186,210,211,228,235,233,236,233,242,233,205,200,190,186,163,143,147,162,168,150,135,142,150,142,123,122,132,141,157,170,193,196,199,240,242,248,249,238,205,163,137,109,85,58,38, -27,21,26,34,41,48,58,68,72,73,85,139,231,255,255,217,158,175,177,142,123,99,94,163,245,248,218,156,141,147,170,171,184,137,82,55,65,63,125,190,186,140,132,175,211,229,221,191, -136,116,149,164,134,111,106,114,87,63,77,107,91,106,111,155,187,177,164,201,179,135,111,109,118,91,58,37,56,180,240,233,248,245,235,255,238,194,183,176,194,175,194,189,137,87,88,147, -141,171,200,200,211,208,193,128,135,126,57,17,0,1,8,6,1,0,0,0,0,0,0,0,0,0,0,2,15,27,33,33,31,31,31,30,35,48,58,56,43,37,40,41,43,44,45,44, -44,42,48,50,56,45,35,49,34,14,16,24,26,16,15,29,43,64,95,122,101,70,47,35,31,23,27,30,37,44,57,86,135,156,151,148,129,86,50,35,49,79,101,128,158,162,150,194, -206,192,121,84,101,100,93,126,176,201,189,169,151,142,147,156,161,126,114,160,172,182,220,229,219,232,233,235,228,194,215,217,198,199,177,173,169,163,130,118,149,167,160,146,147,157,157,162, -178,193,187,219,255,255,255,255,254,221,168,134,102,73,51,40,31,28,31,40,47,57,69,83,84,79,82,123,205,252,229,175,121,102,112,102,91,68,62,135,183,158,130,104,132,182,194,186, -177,121,51,44,63,78,136,173,194,196,193,185,197,206,197,191,177,179,197,182,150,139,151,172,153,128,137,118,85,77,84,133,204,217,212,193,137,107,105,116,101,77,55,41,114,238,246,254, -255,255,250,249,246,236,233,217,197,186,196,172,130,128,169,169,143,186,190,180,190,194,162,72,87,93,33,8,2,3,9,2,0,0,0,0,0,0,0,0,0,0,0,5,16,28,35,36, -37,35,37,40,40,47,51,47,40,37,41,41,45,45,47,47,42,41,42,44,55,59,42,50,57,36,43,62,62,42,28,47,68,85,112,120,86,57,42,33,28,29,31,35,41,48,59,88, -144,185,194,190,157,104,63,47,59,91,121,143,182,207,182,191,226,218,149,127,106,94,109,111,147,189,182,169,170,148,132,137,137,120,129,163,179,187,227,232,225,227,229,236,227,204,206,220, -198,198,194,154,140,146,121,134,167,168,161,161,154,156,158,161,168,172,170,226,255,255,255,255,255,233,179,139,109,79,59,55,45,40,38,45,57,71,80,88,88,88,100,149,193,219,175,167, -121,101,134,126,85,88,119,144,123,88,73,83,134,186,176,171,125,57,30,41,65,90,167,183,206,215,191,170,191,204,201,184,165,161,172,158,161,169,191,194,186,192,201,184,118,109,137,127, -210,233,205,197,169,139,113,98,80,94,128,115,213,255,253,255,255,255,252,250,248,214,193,189,205,196,170,163,179,176,178,113,123,173,189,148,155,169,139,94,66,35,13,6,6,5,3,0, -0,0,0,0,0,0,0,0,0,0,0,6,19,30,38,42,42,41,41,43,41,45,49,47,43,42,42,42,43,45,47,45,41,37,37,38,50,70,66,61,71,68,76,114,111,129,101,76, -86,90,98,97,77,56,43,35,33,35,38,41,47,54,76,105,150,199,231,229,196,128,77,61,79,105,133,164,179,218,206,212,233,235,187,132,136,123,139,132,132,161,170,158,172,167,175,150, -104,99,149,163,164,157,199,225,225,235,219,215,218,222,197,200,206,198,178,164,136,146,167,163,171,165,161,162,134,127,153,120,85,118,144,208,255,255,255,255,255,240,196,149,118,91,77,71, -62,54,48,51,59,73,85,108,162,211,225,250,250,213,157,126,102,93,101,101,84,77,95,98,92,73,66,97,122,146,160,143,82,38,21,36,52,98,177,193,191,198,196,193,210,225,212,175, -156,162,167,185,191,193,196,189,185,197,204,205,199,221,226,222,250,250,240,239,219,185,130,92,104,193,240,238,253,254,255,255,255,254,253,254,252,162,137,168,199,228,221,217,205,176,125,76, -123,142,149,91,84,141,143,106,50,23,12,3,2,2,8,9,0,0,0,0,0,0,0,0,0,1,5,9,20,34,45,50,49,49,50,52,54,55,56,52,48,45,43,44,45,48,47,45, -41,36,36,36,43,69,94,94,82,86,104,137,148,153,107,97,93,91,100,82,63,51,44,42,45,44,47,44,49,63,95,127,182,239,248,219,173,134,98,90,123,177,173,163,173,225,226,225, -242,245,224,147,108,114,154,183,189,179,182,170,170,189,199,178,111,100,125,118,125,135,197,213,198,221,211,176,213,229,200,187,212,179,168,194,199,193,192,179,170,161,155,135,88,92,86,47, -43,79,116,172,249,252,255,255,254,252,225,184,137,106,104,115,95,66,58,62,77,88,95,125,180,250,247,242,242,225,182,111,91,77,72,69,66,62,52,64,77,68,66,79,85,115,135,102, -49,35,21,27,55,128,175,185,183,196,224,207,207,213,197,165,178,184,185,210,206,210,197,158,163,205,231,238,249,249,253,255,255,255,253,246,242,248,225,179,190,253,255,255,254,254,255,255, -255,255,255,254,248,193,184,226,219,239,234,234,219,147,115,136,163,107,116,109,84,111,104,61,41,28,13,8,6,8,13,17,6,0,0,0,0,0,0,0,1,9,12,14,23,34,43,50, -50,52,58,64,64,62,61,54,49,45,43,44,44,48,48,48,41,37,33,30,43,76,91,90,85,95,123,165,192,161,78,75,77,93,111,82,69,51,47,50,56,56,55,55,66,80,98,148, -185,222,243,229,184,144,125,123,163,212,206,172,186,232,241,232,240,245,228,142,75,66,146,204,189,173,180,173,157,201,197,171,160,137,104,78,77,140,213,208,203,221,219,184,211,232,222,197, -201,180,173,187,199,217,206,193,172,120,119,94,59,41,12,13,27,55,118,164,185,190,219,254,253,248,228,208,179,149,140,178,143,79,71,94,150,175,122,109,130,141,172,193,184,175,151,99, -86,77,72,75,93,86,64,62,58,75,77,79,94,116,106,80,45,29,23,29,66,136,187,207,222,239,220,197,203,184,150,167,207,222,215,213,200,205,199,165,183,241,252,249,254,255,255,255, -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,243,215,229,239,232,232,227,217,197,197,211,191,135,139,111,102,102,77,42,36,23,14,10,10,14,15,19, -9,0,0,0,0,0,0,0,2,14,23,21,24,33,41,43,47,55,59,61,64,64,58,55,51,48,48,48,48,50,50,47,42,36,30,30,40,57,76,79,72,90,120,172,204,168,90,69, -70,97,102,73,62,56,54,58,63,69,80,88,109,128,134,179,208,211,241,239,211,182,151,191,205,192,219,197,205,212,242,241,219,218,235,164,77,66,111,170,170,143,141,133,129,183,191,179, -172,151,107,85,92,162,212,211,206,220,229,211,214,217,226,227,200,198,201,198,196,220,228,218,183,116,86,61,41,16,21,26,30,57,120,154,129,160,208,242,254,234,200,184,179,190,200,222, -167,107,108,167,176,169,127,120,133,134,160,186,141,129,121,93,77,76,72,91,127,113,83,91,93,127,105,93,99,79,55,44,33,24,30,49,95,150,213,222,228,231,201,200,211,161,177,191, -173,218,215,214,227,224,228,232,247,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,253,247,245,234,231,220,227,220,213,214, -207,170,142,113,108,104,88,59,47,31,17,10,10,9,8,12,7,0,0,0,0,0,0,0,2,17,28,28,28,31,36,40,45,52,57,61,63,61,56,55,54,50,51,50,50,49,50,47, -37,34,27,30,35,37,49,62,57,59,88,134,176,170,119,88,95,101,86,69,61,65,66,64,69,76,93,119,147,164,167,189,220,213,228,228,222,207,210,255,243,201,200,218,229,219,235,235, -226,232,240,199,106,88,111,143,169,156,134,125,113,140,148,163,160,156,113,97,126,187,206,199,189,189,187,204,224,228,235,228,196,194,229,212,189,217,233,232,210,160,98,42,20,19,30,33, -49,70,99,118,148,196,203,229,242,229,200,176,156,168,190,231,238,217,231,235,165,160,142,162,176,196,182,150,129,146,127,95,80,80,88,125,151,125,141,164,134,119,90,87,79,58,35,28, -26,29,38,76,118,155,184,185,176,185,199,225,233,184,187,163,162,207,219,235,253,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, -255,255,255,255,255,255,255,253,248,232,215,214,221,213,220,222,211,194,169,128,115,125,134,86,47,29,21,22,10,9,10,6,0,0,0,0,0,0,0,0,0,15,30,30,31,34,36,41, -49,55,55,57,54,50,49,50,51,51,54,51,51,47,45,44,31,28,27,29,35,40,37,42,36,36,62,104,148,128,97,100,129,112,72,75,76,75,76,76,75,78,101,135,153,190,189,191, -236,226,221,204,205,207,233,255,255,238,215,255,255,254,250,247,238,234,241,214,151,133,180,206,211,173,140,140,113,121,109,135,168,160,126,128,161,197,208,196,155,137,156,168,224,241,243,236, -220,212,222,196,196,219,227,224,218,171,61,19,15,22,42,45,48,72,101,109,150,177,185,217,226,203,199,186,168,126,128,228,255,255,255,252,242,227,219,213,196,193,160,113,126,162,129,93, -84,87,113,154,190,173,175,146,88,64,64,82,65,48,36,31,30,30,44,69,101,137,142,162,155,169,190,177,196,191,154,148,180,217,217,247,255,255,255,255,255,255,255,255,255,255,255,255, -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,254,249,232,217,218,221,228,228,232,214,204,197,173,155,148,147,97,34,10,19,28,9,16,19,7, -2,1,0,0,0,0,0,0,0,14,36,40,37,38,42,43,47,51,54,55,52,49,45,49,50,52,52,51,49,45,44,37,29,27,29,29,33,35,40,41,30,31,49,87,132,94,75,87, -102,108,78,73,82,76,76,79,79,86,114,153,164,200,197,206,214,218,205,189,199,213,227,247,255,255,255,255,255,255,255,254,255,243,227,217,206,201,218,238,235,213,156,149,128,141,150,136, -151,146,118,118,136,167,197,178,128,127,155,168,210,241,240,243,235,224,217,187,206,221,226,217,199,136,29,14,22,50,59,51,42,71,105,149,171,177,199,163,155,154,183,198,179,132,144,232, -250,255,255,248,245,241,198,201,192,146,105,97,107,107,100,88,91,108,121,163,225,215,178,105,71,66,75,70,54,41,36,36,31,27,37,54,73,112,126,128,154,176,165,125,119,187,158,149, -168,200,200,249,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,254,227,185,207,214,218,226,227, -224,217,212,197,170,141,115,79,36,6,17,36,24,26,24,9,3,0,0,0,0,0,0,0,0,15,44,49,43,38,41,42,43,43,48,56,55,51,48,47,49,50,49,50,47,45,38,31, -28,27,27,28,31,38,42,43,37,40,52,90,106,87,77,76,84,98,99,82,76,73,78,82,88,94,119,150,170,192,191,199,179,189,167,178,201,218,233,229,253,255,255,255,255,255,255,254, -255,253,224,212,215,233,239,236,229,225,196,186,161,179,153,122,137,129,84,78,100,127,167,161,127,127,137,150,178,233,240,245,242,219,199,183,219,231,232,221,194,118,23,23,35,50,55,48, -47,82,107,162,213,175,172,135,113,136,161,178,153,128,158,182,172,218,242,254,249,254,211,178,162,125,105,99,108,114,105,105,119,149,129,182,238,211,160,102,79,77,82,62,47,38,36,36, -31,26,31,48,62,85,99,101,144,154,122,99,108,158,165,133,134,169,180,232,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, -255,255,255,255,253,253,255,255,255,205,146,198,203,197,192,193,214,218,206,167,146,125,87,55,35,19,19,30,51,38,26,19,7,0,0,0,0,0,0,0,0,10,40,47,41,38,38,42, -42,41,43,51,54,52,52,49,50,50,52,49,44,41,36,30,26,21,26,28,31,34,42,48,49,50,72,95,71,71,83,68,83,85,97,113,91,75,77,84,92,99,114,134,140,157,176,185, -173,200,163,171,203,226,240,249,255,255,255,255,255,255,255,255,255,248,235,212,210,242,238,232,234,227,219,220,206,218,161,107,113,93,62,72,82,99,134,134,121,132,140,162,206,236,234,246, -247,224,198,211,233,243,245,229,200,125,34,56,71,59,48,52,77,111,150,189,191,151,140,123,115,111,126,132,122,106,112,119,136,165,226,255,255,255,240,184,162,144,133,109,100,101,125,149, -157,172,169,186,182,143,115,115,94,73,62,43,35,30,29,28,24,19,22,31,43,56,66,80,102,98,85,86,104,128,134,104,109,137,177,214,243,238,249,255,255,255,255,255,255,255,255,255, -255,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,254,254,243,218,240,255,252,205,158,187,203,203,173,156,175,187,194,160,157,134,92,30,16,7,7,23,40,35,21,7, -0,0,0,0,0,0,0,0,0,5,30,42,44,41,38,41,41,41,43,48,52,56,54,51,50,51,52,49,45,43,36,31,23,20,23,24,31,41,37,49,66,72,104,86,48,43,54,49, -55,64,83,115,105,78,78,82,88,95,102,125,132,144,170,175,192,222,189,189,210,239,252,255,255,255,255,255,255,255,255,255,255,255,250,235,232,241,240,229,241,232,198,208,219,218,167,116, -105,126,105,73,63,69,99,125,113,102,112,179,234,231,225,242,248,231,224,235,246,252,252,239,207,116,47,109,127,63,35,49,85,120,163,184,164,143,120,116,165,137,105,108,115,107,80,101, -127,154,240,255,255,255,233,173,185,182,157,129,123,115,151,179,162,149,175,190,144,130,151,140,84,51,37,31,24,20,21,17,17,16,17,26,31,38,49,66,85,100,101,101,121,122,109,93, -102,147,204,218,213,217,238,255,255,255,255,255,254,255,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,253,248,243,233,224,234,227,212,191,165,180,201,196,169,153, -168,169,179,165,161,149,105,55,9,3,10,26,33,24,12,0,0,0,0,0,0,0,0,0,0,2,22,36,42,40,41,38,35,48,50,52,57,57,57,55,51,52,50,47,45,42,35,29, -26,22,22,23,43,54,44,69,85,95,121,80,40,44,45,34,35,55,72,86,88,76,76,83,90,100,106,109,108,115,154,164,191,227,207,215,225,227,253,255,255,255,255,255,255,255,255,255, -255,255,252,253,242,235,238,238,243,239,186,163,191,217,155,156,171,180,146,70,49,44,71,119,123,101,98,178,231,194,190,224,241,243,242,248,254,255,254,246,210,123,68,120,133,49,31,45, -62,86,112,126,157,142,115,144,180,157,135,125,121,91,72,93,100,118,206,255,255,245,211,204,206,168,149,139,134,137,149,153,136,147,183,208,167,149,134,100,58,37,30,22,15,12,10,12, -13,15,19,24,34,44,59,73,94,134,120,119,148,154,123,106,121,162,198,214,219,231,243,253,255,255,255,254,250,252,250,248,248,254,255,255,255,255,255,255,254,255,255,255,255,255,255,255, -255,253,239,232,238,235,201,149,135,150,164,189,211,201,183,173,179,183,182,156,132,109,59,36,9,3,12,26,23,28,10,0,0,0,0,0,0,0,0,0,0,2,16,30,44,47,51,48, -49,54,52,54,58,58,57,54,54,52,54,49,44,40,35,29,28,26,22,30,56,55,52,92,136,126,101,61,37,49,49,42,40,50,59,63,65,71,80,92,107,120,135,134,119,105,128,142, -191,236,215,228,234,243,255,255,255,255,255,255,255,255,255,255,255,255,255,255,248,238,234,243,249,247,215,172,163,215,199,210,249,194,123,80,51,43,63,97,127,120,100,171,211,164,161,201, -236,248,249,253,255,255,255,245,214,176,119,132,147,73,50,66,82,99,95,95,118,113,122,158,176,176,194,173,149,95,78,87,92,95,148,201,246,243,185,205,191,157,141,115,104,111,122,123, -129,123,140,177,175,158,107,64,42,27,21,15,7,3,3,6,7,14,22,33,44,64,84,106,119,141,126,142,156,163,153,135,148,184,201,204,219,234,245,252,254,255,254,253,249,243,241,247, -239,247,254,255,255,255,255,249,246,255,255,255,255,255,255,253,249,241,207,210,204,163,122,118,126,126,180,199,196,189,201,203,194,207,197,167,120,63,29,12,6,5,16,31,36,41,21,0, -0,5,0,0,0,0,0,0,0,6,15,27,41,51,52,54,56,54,52,55,57,56,56,56,55,56,56,52,49,41,34,29,37,35,41,58,78,73,71,106,132,135,128,64,27,40,45,56, -58,62,64,62,59,66,86,102,129,157,177,158,154,151,142,142,192,232,241,235,232,239,250,254,255,255,255,255,255,255,255,255,255,255,255,255,252,233,236,240,248,249,234,199,208,221,219,222, -224,160,108,105,84,73,69,85,118,140,119,134,165,162,171,208,234,243,249,254,255,255,255,243,213,180,164,143,116,83,59,69,73,72,52,73,80,111,162,141,129,183,198,175,141,94,80,78, -83,91,98,133,227,233,158,161,169,141,112,93,88,86,88,105,125,100,92,107,144,133,86,44,27,21,15,9,2,1,0,3,5,15,26,36,59,84,107,154,129,156,176,186,180,197,197,175, -169,190,217,229,238,242,245,243,242,240,243,243,246,248,239,239,239,246,255,255,250,241,239,227,236,254,255,255,255,255,255,247,236,227,214,208,192,163,170,191,167,161,199,213,199,194,207,213, -180,176,170,144,92,42,41,31,13,28,34,33,36,35,14,3,0,0,0,0,0,0,0,0,0,2,10,19,28,47,48,47,47,50,49,49,52,55,54,54,54,54,56,56,54,45,43,37, -61,57,72,100,121,122,133,158,133,126,149,82,28,47,65,87,95,85,77,64,63,71,91,116,143,165,192,187,193,190,167,176,203,231,242,234,228,239,235,235,254,255,255,255,255,255,255,255, -255,255,255,249,245,232,211,213,232,238,229,180,183,171,192,140,99,120,140,137,130,107,72,76,120,160,136,118,127,122,151,185,219,241,250,255,255,255,255,240,214,179,172,163,92,48,54,57, -65,48,27,47,86,140,161,147,139,136,146,180,153,85,76,80,85,93,92,115,178,178,139,141,133,106,92,83,83,84,83,95,102,94,83,80,98,87,50,27,20,16,7,2,0,0,0,1, -5,13,27,45,83,92,120,198,192,213,227,206,185,185,186,173,173,194,226,247,250,250,245,234,225,228,227,229,241,245,226,227,234,224,227,219,215,217,213,220,232,246,254,255,255,255,255,253, -247,232,231,224,214,219,221,240,225,214,219,213,212,219,213,214,191,136,125,114,54,16,34,29,19,31,34,31,37,26,5,5,2,0,0,0,0,0,3,3,0,0,5,9,16,28,36,33, -36,43,42,43,44,49,49,49,50,50,52,62,58,61,75,68,91,88,86,109,130,148,192,227,183,149,100,75,40,65,92,109,99,90,86,62,66,105,133,132,142,176,204,206,218,214,197,183, -175,208,219,232,220,233,243,243,252,255,255,255,255,255,255,255,255,255,255,231,229,234,208,196,207,233,236,175,98,118,132,107,133,184,186,173,161,100,68,75,113,129,134,122,87,88,125,156, -193,231,249,255,255,255,254,234,210,196,194,200,153,70,41,43,42,21,17,31,64,136,121,119,97,113,116,164,139,82,87,99,105,98,88,102,133,135,135,118,105,102,92,80,83,87,90,99, -101,88,73,68,66,50,31,21,16,10,2,0,0,0,0,2,7,14,29,57,88,97,126,186,235,231,234,215,189,189,204,206,217,228,242,254,254,249,243,229,213,210,203,199,206,197,191,194, -198,186,176,158,162,191,210,225,233,232,238,253,255,255,255,255,249,242,240,238,236,233,231,240,243,233,222,206,214,219,221,222,194,140,146,93,35,10,9,14,20,23,33,44,41,14,6,14, -13,7,0,0,0,0,5,6,5,1,1,2,3,12,17,22,24,31,36,37,37,37,41,43,44,44,44,59,69,76,95,99,119,127,108,121,163,191,204,212,189,128,78,85,70,79,109,137, -133,107,95,72,70,114,161,164,167,201,224,215,218,231,218,170,135,161,197,220,219,221,239,248,253,255,255,255,255,255,254,254,255,255,250,198,217,217,206,213,214,238,246,169,88,113,136,150, -207,219,199,167,130,77,66,75,98,97,109,111,79,86,108,111,132,197,247,255,255,255,250,227,205,205,206,206,178,112,71,50,26,14,22,30,34,54,59,76,78,93,106,109,93,87,86,97, -107,109,94,97,97,102,112,107,113,126,98,82,88,91,91,97,95,80,65,59,52,41,28,21,12,6,0,0,0,0,5,12,15,20,31,51,70,111,147,172,233,222,208,211,225,228,226,235, -248,254,255,255,255,253,243,226,217,190,176,175,171,163,168,180,183,168,175,155,157,187,217,228,240,238,246,255,255,255,255,254,253,252,250,250,243,233,236,240,243,238,221,213,212,208,227,221, -203,194,161,79,40,14,9,21,29,22,36,61,33,15,20,16,10,7,1,0,0,17,19,3,6,5,7,5,5,12,12,16,13,15,21,24,29,31,31,34,37,36,36,48,84,111,120,109, -154,123,102,136,183,199,199,184,144,93,72,88,115,108,123,169,161,116,84,75,75,95,147,179,198,199,211,224,227,206,211,200,146,121,167,190,210,240,246,254,255,255,255,255,255,252,246,254, -255,255,250,221,224,176,183,194,226,247,240,153,116,129,192,205,198,180,168,113,92,78,63,64,88,94,95,80,76,71,77,106,153,205,253,254,254,254,245,224,212,204,208,206,177,146,112,62, -24,17,22,31,21,21,58,71,65,58,93,83,78,75,71,78,99,104,87,86,85,93,99,101,113,118,99,85,90,93,88,80,72,68,62,56,44,35,24,19,12,3,0,0,0,5,12,20, -26,30,36,50,84,136,153,169,212,215,232,240,248,240,234,241,252,255,255,255,255,253,238,224,214,173,148,157,162,160,201,197,165,154,173,156,170,208,239,247,252,252,255,255,255,255,255,255, -255,252,250,254,249,236,238,234,234,219,218,218,207,213,217,201,193,186,139,80,57,31,23,43,48,36,42,50,31,21,16,7,5,6,1,0,14,44,36,8,2,7,13,7,6,6,10,13, -8,8,12,14,22,31,31,33,37,37,35,50,113,151,170,180,149,116,99,129,163,191,203,185,112,70,64,79,121,125,127,160,161,144,98,79,79,101,125,158,214,215,198,210,215,207,193,219, -194,142,139,164,197,248,255,255,255,255,255,255,255,252,249,255,255,255,253,248,236,190,167,177,226,231,228,183,154,182,219,203,139,114,125,99,93,98,83,79,77,70,70,69,62,66,75,109, -182,242,253,254,254,250,239,219,207,200,210,207,204,193,114,68,42,17,19,28,24,20,49,64,84,83,90,90,68,49,49,70,101,105,85,79,90,92,101,106,106,111,104,87,82,78,72,64, -59,61,56,44,35,29,23,15,8,6,5,7,8,13,17,23,31,38,43,58,101,142,154,177,206,213,232,239,240,245,247,252,254,255,255,255,255,252,229,224,207,185,185,187,176,165,205,185, -157,169,162,146,187,226,248,252,255,255,255,255,255,255,255,255,255,253,249,252,254,247,236,227,235,201,205,207,192,208,221,191,176,175,140,108,90,50,22,55,70,69,68,59,42,21,8,0, -0,0,0,1,16,22,16,12,7,9,15,15,8,5,9,12,10,8,8,14,20,27,31,28,36,36,31,57,125,171,191,200,158,132,126,147,175,201,167,106,70,61,76,91,134,150,119,118, -134,132,122,98,105,129,132,165,231,220,203,214,215,225,218,215,190,143,155,171,193,252,255,255,255,255,255,255,255,255,255,255,255,255,255,255,171,133,122,163,208,197,192,171,199,220,182,121, -85,101,116,127,130,100,84,65,45,41,50,41,52,68,73,101,178,247,253,255,254,247,228,208,203,203,205,205,197,197,128,52,57,33,22,23,21,20,38,66,98,95,78,61,42,40,44,69, -106,120,111,108,111,114,119,119,104,88,83,75,73,66,61,58,55,55,44,34,29,23,20,15,9,8,10,10,13,19,26,34,42,47,51,64,102,109,135,183,210,211,225,234,241,246,252,255, -255,255,255,255,254,245,229,205,194,207,215,194,172,173,192,155,147,169,143,160,205,231,250,252,255,255,255,255,255,255,255,255,254,250,252,254,254,255,250,252,249,214,208,217,206,213,224,172, -142,149,136,125,164,127,66,68,83,76,69,83,77,31,8,0,0,0,0,10,23,17,7,5,7,12,22,24,8,0,2,7,6,5,5,9,15,17,20,21,31,38,29,56,92,135,198,207, -192,194,162,183,205,170,143,87,44,62,92,111,141,144,120,106,123,123,130,108,113,148,190,204,205,175,178,210,222,222,229,222,197,176,177,194,221,247,255,255,255,255,255,255,255,255,255,255, -255,255,255,255,184,160,149,115,137,139,134,162,208,215,133,90,100,104,129,153,132,72,34,20,21,29,33,36,61,66,47,68,146,233,253,255,254,243,220,205,212,206,201,208,200,200,167,97, -93,75,44,29,23,20,30,73,109,90,64,49,41,43,64,104,118,115,139,168,160,148,143,143,112,86,72,64,63,59,56,55,48,43,34,27,22,17,13,9,6,6,12,13,20,24,31,42, -49,54,55,63,85,102,150,196,208,220,232,243,253,255,255,255,255,255,255,255,248,231,224,199,205,208,187,168,153,156,140,114,139,178,162,207,233,236,247,250,254,255,255,255,255,255,255,255, -252,252,252,252,254,254,255,254,253,234,218,210,207,218,219,176,161,155,169,177,185,187,179,178,189,118,111,140,128,61,14,0,0,0,0,21,29,13,0,0,1,22,31,22,7,0,0,0, -1,3,0,3,9,17,17,20,30,41,31,40,102,183,205,193,199,153,148,197,186,164,157,115,62,75,97,121,120,120,97,93,108,97,84,88,98,153,175,171,182,196,171,206,224,206,210,218, -200,191,182,201,224,241,249,253,255,255,255,255,255,255,255,255,249,232,208,220,206,192,163,106,105,105,119,167,208,218,149,105,111,134,132,115,88,34,6,6,14,27,29,49,77,79,57,72, -168,238,248,252,249,236,213,199,200,200,201,208,205,200,194,189,151,115,113,68,38,28,41,95,119,85,63,52,50,68,108,139,142,132,140,162,180,157,140,133,111,87,66,55,51,52,52,48, -42,34,27,23,19,14,8,3,1,6,12,19,23,31,38,45,48,56,62,64,73,118,177,199,208,220,235,253,255,255,255,254,255,255,255,247,229,224,211,198,177,161,162,187,161,133,143,142, -177,214,198,210,190,204,220,239,250,247,253,248,245,247,248,242,243,247,253,252,254,253,250,226,204,210,201,186,184,213,227,203,172,183,205,193,177,183,204,208,210,155,99,118,114,40,2,0, -0,0,0,9,22,14,2,0,2,40,42,23,3,0,0,0,9,19,9,12,26,41,47,47,68,55,36,71,144,212,226,211,196,150,149,158,133,140,142,123,90,79,87,119,109,141,113,62, -70,66,59,63,79,115,149,162,150,183,205,206,190,183,192,194,176,183,186,205,221,231,234,252,255,255,255,255,255,255,254,249,207,128,115,149,189,200,160,137,133,118,129,189,218,206,182,141, -116,118,112,65,42,16,2,3,14,24,27,38,64,84,84,104,178,218,240,245,241,231,199,193,196,196,201,208,206,210,206,212,192,169,179,121,76,52,70,94,97,90,82,68,73,119,172,162, -144,154,165,176,178,143,125,122,107,82,61,51,48,47,47,41,35,30,23,17,13,9,1,1,2,5,12,22,34,43,49,51,51,56,64,70,75,113,169,173,176,208,236,254,255,255,255,253, -239,238,240,225,200,194,175,163,158,155,147,172,175,142,158,153,167,192,186,172,139,168,201,218,219,204,218,221,208,198,232,243,243,245,255,255,254,250,236,204,172,178,196,198,192,210,218,197, -143,179,214,201,182,172,168,170,192,149,94,111,97,30,0,0,0,10,13,8,14,13,7,0,3,27,49,42,6,0,0,0,24,17,12,68,107,93,93,69,71,85,108,137,171,200,214,205, -148,182,161,120,90,85,88,84,73,73,80,102,102,154,132,77,62,61,63,56,71,98,139,176,158,148,193,205,165,155,160,149,130,155,176,204,197,207,238,254,255,255,255,255,255,255,254,232, -172,87,72,108,153,143,116,136,144,127,132,204,167,142,146,149,102,64,70,36,13,0,0,0,5,9,20,33,55,59,59,80,133,201,240,243,241,226,197,187,186,189,200,208,214,214,220,215, -211,221,180,134,116,97,92,82,98,121,100,100,118,144,168,168,139,119,143,143,135,128,123,105,87,75,59,51,44,41,43,38,30,24,19,14,9,5,1,1,2,6,19,36,59,66,65,59, -58,58,63,65,80,91,122,156,161,186,225,250,255,255,255,241,201,183,199,201,184,168,157,149,135,113,119,125,154,140,125,139,126,150,154,189,191,182,179,172,164,151,167,193,184,194,233,253, -255,255,254,250,246,246,227,212,213,191,183,193,201,196,173,135,106,161,200,203,208,191,151,139,165,129,93,106,79,21,0,0,0,20,16,12,13,8,3,6,9,26,49,45,13,0,0,0, -41,27,37,85,129,121,90,56,55,87,133,147,132,150,193,154,109,134,130,115,71,33,24,23,22,31,51,76,82,126,119,88,76,66,65,65,68,92,130,162,169,164,184,203,175,143,153,126, -101,120,146,192,207,203,234,254,255,255,255,255,255,255,255,224,123,68,58,73,85,85,101,134,149,148,122,140,121,105,88,83,51,28,33,23,3,0,0,0,0,2,10,22,43,35,30,43, -70,172,229,222,215,191,165,161,172,171,193,207,228,228,231,225,227,226,170,163,177,168,114,77,94,106,93,99,115,125,133,129,119,108,108,100,92,98,97,78,65,59,55,49,41,38,38,35, -26,19,13,9,3,1,0,0,1,8,28,51,84,85,73,69,68,68,68,70,79,82,100,134,183,189,204,238,252,253,243,229,208,203,205,210,184,161,150,127,118,100,97,112,114,108,127,140, -130,155,182,211,214,167,173,164,141,134,151,178,201,198,232,254,245,218,207,203,215,226,219,220,217,184,171,172,191,178,119,86,120,136,186,205,207,180,140,128,126,113,98,105,52,15,1,0, -24,43,26,21,21,17,13,12,22,37,52,55,26,0,1,20,42,44,42,33,63,99,100,61,47,59,72,91,92,113,171,130,130,109,97,128,95,17,13,16,15,17,24,42,57,95,94,72, -68,59,58,71,72,76,92,107,132,157,168,177,162,130,140,126,129,125,147,200,217,225,231,254,255,255,255,255,255,255,255,235,126,47,57,83,95,86,94,128,147,162,133,105,102,78,54,22, -7,8,20,17,9,6,1,0,0,0,0,7,17,20,23,27,65,179,228,192,170,157,139,114,134,167,194,200,228,240,239,239,236,236,231,229,218,212,156,101,92,86,76,75,87,101,99,102, -102,94,82,71,68,68,62,51,51,45,38,41,37,36,34,28,22,16,10,3,1,0,0,0,3,13,31,58,80,77,73,76,77,84,84,100,106,128,160,182,211,205,161,178,227,234,234,225, -222,220,203,161,142,126,111,104,109,102,104,114,104,114,133,119,122,187,245,242,225,215,233,225,203,160,165,191,218,231,247,255,225,192,199,220,228,227,218,217,205,200,196,178,185,157,111,91, -115,154,197,210,187,118,72,104,125,104,94,95,65,27,17,23,59,59,33,24,37,33,23,24,40,61,82,93,37,21,40,41,23,10,5,5,10,49,68,44,38,42,50,62,50,77,106,126, -155,134,127,147,105,22,20,37,36,29,28,30,42,71,83,73,58,43,37,43,49,56,65,71,84,114,130,178,175,132,126,116,119,147,157,210,219,218,236,252,255,255,255,255,255,254,252,245, -171,66,65,118,123,108,120,127,130,129,102,82,122,100,47,14,6,12,14,21,20,2,0,0,0,1,5,10,13,20,23,28,106,193,182,136,134,148,135,118,139,178,198,198,236,247,249,250, -252,252,252,248,243,232,163,115,95,71,65,62,63,70,79,88,80,65,61,57,51,48,42,40,40,30,27,27,28,26,24,20,16,14,9,3,1,0,0,1,8,16,31,45,55,61,66,72, -77,87,99,129,140,172,201,207,203,153,79,108,135,157,211,224,224,191,142,92,76,72,70,75,86,91,105,108,114,128,121,97,119,210,255,255,231,178,179,197,176,147,130,128,169,240,249,242, -220,224,227,235,221,219,215,212,204,208,185,156,140,149,141,112,144,191,206,204,177,122,76,97,115,100,86,63,76,62,37,30,71,59,44,34,40,31,30,55,76,75,80,82,66,82,68,40, -10,0,0,0,0,0,15,24,51,49,34,63,57,36,59,158,129,104,120,129,119,43,34,56,52,45,37,31,40,55,72,63,44,34,26,17,28,37,41,45,49,76,112,186,208,163,143,134, -119,142,154,184,193,204,245,253,253,254,255,254,254,252,249,240,146,78,97,156,165,115,126,128,122,129,73,50,87,63,28,20,13,12,15,29,21,3,0,0,0,7,14,17,20,19,26,52, -143,186,143,126,143,154,154,142,161,187,204,226,247,252,253,255,255,255,255,254,249,187,102,95,78,68,59,58,65,75,76,78,71,59,51,51,50,41,34,33,24,15,14,14,16,14,14,12, -12,8,5,3,2,1,6,12,19,21,30,37,44,54,62,69,77,85,95,144,172,182,194,194,148,65,48,61,66,88,182,215,186,118,83,73,65,59,61,69,83,95,100,101,113,116,101,86, -105,182,246,239,187,141,111,129,123,108,99,109,154,217,204,183,172,198,217,225,212,200,176,151,155,158,141,144,146,175,189,178,157,165,179,173,177,163,127,123,105,93,105,107,154,141,108,106, -98,51,35,34,48,40,51,91,108,95,87,93,83,71,41,16,0,0,0,0,0,0,3,24,43,34,22,44,50,58,119,183,93,114,113,113,121,69,42,80,77,48,35,27,31,37,55,52, -35,21,17,13,15,20,24,30,40,65,77,147,194,161,133,142,154,150,151,172,185,194,210,242,250,253,253,254,249,241,239,236,190,107,107,132,189,149,119,129,141,115,41,42,55,40,24,20, -14,12,20,31,14,1,1,0,1,9,17,23,26,22,36,70,169,186,135,130,119,105,137,153,190,200,212,247,253,253,255,255,255,255,255,255,250,176,88,68,63,70,71,68,87,101,85,80, -71,77,58,48,44,34,28,22,14,7,5,3,6,6,7,5,3,2,2,1,5,7,12,26,30,26,30,36,45,56,66,78,95,107,118,162,168,167,190,186,107,57,49,51,63,97,170,197, -178,136,101,104,102,86,83,83,94,109,101,97,102,97,88,91,130,176,218,176,163,132,105,132,142,106,112,149,183,184,178,158,137,150,197,198,197,169,118,98,105,127,127,162,179,197,212,186, -141,147,164,173,170,155,115,120,116,123,144,165,184,177,175,187,176,106,42,42,57,77,85,102,162,155,128,127,84,26,3,0,0,0,0,0,0,0,0,31,33,34,22,10,23,61,140,140, -87,97,109,118,126,98,73,98,91,64,43,28,29,38,45,43,29,21,15,10,12,13,17,22,36,49,45,108,205,207,154,133,142,144,148,153,170,189,189,231,242,246,247,243,239,233,231,225, -227,164,112,111,168,168,149,136,157,115,29,23,35,31,20,15,15,13,15,13,6,1,3,3,8,17,27,34,37,50,79,91,137,133,91,100,91,106,128,142,206,219,222,236,253,255,255,255, -255,255,255,255,252,187,92,57,68,83,83,72,88,111,92,78,71,82,57,41,33,26,21,13,7,0,0,0,0,0,2,0,0,0,0,0,6,12,20,30,38,34,34,38,47,58,77,92, -105,109,113,115,122,151,191,173,104,70,56,48,62,68,77,146,190,161,129,133,127,101,90,82,80,90,90,86,104,146,204,217,246,252,224,155,119,94,93,107,112,99,97,134,154,153,170,169, -157,158,163,180,179,139,92,73,91,114,113,165,199,191,189,190,180,192,197,187,161,147,150,148,160,180,182,186,178,170,183,190,183,147,112,101,119,179,164,179,229,211,175,136,107,33,2,0, -0,0,0,0,0,0,8,30,26,34,21,7,8,37,88,95,58,76,113,135,151,128,111,106,99,84,62,42,40,47,44,33,29,26,17,10,9,9,20,29,29,38,44,77,178,231,201,185, -171,178,165,156,164,189,196,225,235,232,231,226,221,196,201,197,194,146,129,154,155,146,127,123,155,112,36,21,23,21,17,15,14,17,16,12,3,3,6,8,14,26,37,50,64,86,100,113, -135,122,88,111,86,93,82,116,184,212,224,234,254,255,255,255,255,255,255,255,238,128,63,70,86,94,65,55,76,88,80,70,64,58,47,37,28,23,14,7,5,0,0,0,0,0,0,0, -0,0,0,1,8,17,28,38,54,49,36,38,50,70,85,86,79,70,59,52,68,107,141,108,66,58,56,54,58,58,68,116,150,140,120,126,104,90,87,79,76,83,90,88,109,155,235,253, -234,246,224,191,107,73,70,70,65,71,91,108,123,142,148,141,142,139,132,146,136,88,75,82,99,88,113,173,189,185,182,219,210,196,194,178,142,160,182,176,198,196,198,192,148,134,176,221, -218,213,203,212,233,247,243,240,235,212,179,150,136,66,16,0,0,0,0,0,2,15,51,70,43,41,31,16,10,21,44,56,69,87,122,137,136,139,182,161,155,144,127,87,59,65,51,29, -23,17,13,12,14,24,34,50,43,49,77,108,190,235,231,229,219,206,192,186,176,191,203,221,220,222,207,206,213,143,130,149,149,120,127,191,164,143,176,169,135,93,61,45,44,38,33,30, -24,27,26,20,12,10,12,13,21,33,44,70,99,101,79,100,144,119,88,99,71,75,82,99,175,190,194,238,255,255,255,255,255,255,255,255,222,121,69,90,113,94,70,66,76,73,80,66, -55,49,43,34,30,22,14,8,3,0,0,0,0,0,0,0,0,0,0,3,8,21,37,49,65,72,51,48,64,77,78,71,56,41,42,41,42,58,75,71,68,70,72,66,54,63,88,95, -91,90,76,82,95,97,72,71,88,130,171,125,90,106,119,150,179,182,156,150,87,61,62,58,62,93,132,113,106,112,118,121,125,129,134,129,112,83,82,107,102,92,133,186,206,224,239,229, -200,199,186,136,139,191,218,207,205,182,184,182,147,146,219,249,241,247,252,255,255,254,252,245,236,220,168,160,154,100,34,16,17,26,22,20,21,43,58,78,85,68,72,62,35,22,42,69, -144,107,123,146,148,169,226,207,201,201,179,129,106,116,71,41,24,14,22,30,26,33,37,55,78,100,121,162,207,243,249,249,246,225,204,194,193,199,205,206,205,210,201,184,198,176,125,102, -91,129,168,208,192,183,190,167,130,106,106,112,106,84,57,41,38,42,38,27,20,15,17,20,34,48,56,82,101,85,77,136,136,102,93,90,80,84,90,113,178,189,210,240,255,255,255,255, -255,255,255,254,217,135,83,98,108,83,88,79,76,79,79,66,51,50,45,36,30,21,14,8,2,0,0,0,0,1,0,0,0,0,3,12,22,37,51,65,82,87,77,69,72,63,56,58, -48,31,28,29,37,51,63,72,80,79,78,86,100,95,91,86,73,65,63,82,108,113,84,79,139,168,160,118,95,109,111,127,177,136,107,105,78,51,57,55,71,134,163,126,122,127,150,144, -122,120,105,92,80,69,80,91,80,114,156,206,229,238,242,214,193,220,169,153,180,151,190,214,196,217,206,208,217,233,255,254,253,255,255,255,255,255,255,247,239,218,170,194,193,132,52,23, -31,43,48,40,33,30,41,69,93,115,144,115,42,34,73,148,183,150,144,161,163,171,206,233,229,196,154,139,147,137,99,82,38,33,54,42,42,36,43,78,127,137,141,191,231,246,250,252, -246,228,213,204,196,198,204,201,201,198,204,170,132,157,104,65,68,149,213,226,213,200,141,141,169,141,147,148,122,82,52,43,47,55,49,35,26,20,23,30,42,54,63,77,88,85,97,134, -168,144,107,120,123,87,87,106,171,213,233,243,255,255,255,255,255,255,255,250,221,161,137,102,99,90,79,56,56,62,61,61,56,55,48,41,33,20,14,8,1,0,0,0,3,3,1,0, -0,6,13,27,59,77,87,88,101,113,79,82,109,78,44,42,35,24,20,22,29,37,55,70,86,82,73,93,123,99,84,88,65,47,57,85,119,153,162,184,234,176,154,125,137,155,180,175, -142,114,126,121,83,57,64,79,123,175,176,168,187,171,175,150,115,95,77,62,52,58,75,71,79,120,149,178,191,187,194,211,220,242,191,173,148,128,178,212,221,249,250,255,255,254,255,255, -255,255,255,255,255,255,255,253,245,229,222,218,175,126,78,36,31,35,41,38,42,30,45,71,115,189,224,173,79,97,126,163,176,167,148,162,157,162,198,222,227,165,130,128,139,142,140,128, -119,112,84,43,48,43,54,91,123,126,133,179,240,250,254,253,247,235,222,217,204,200,206,199,193,183,161,123,91,78,42,27,45,123,214,231,210,199,168,149,194,190,155,156,111,57,47,52, -59,63,52,40,33,30,30,37,45,56,68,79,93,97,88,101,150,163,121,154,151,86,88,108,172,219,245,254,255,255,255,255,255,255,254,246,224,191,187,129,109,85,50,28,41,58,64,64, -62,56,49,44,29,19,16,12,5,2,2,6,9,6,1,1,3,10,16,27,52,71,98,107,127,121,68,66,98,85,50,36,30,24,19,19,23,26,41,63,91,86,84,97,105,92,80,77, -61,48,59,73,133,186,212,247,255,245,236,219,205,190,180,160,102,107,154,135,82,69,79,123,179,219,210,197,191,182,175,139,113,91,70,54,44,48,55,73,70,92,125,140,167,173,177,211, -200,190,199,160,135,157,206,215,234,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,247,231,224,203,192,158,93,54,38,15,22,37,43,40,51,102,175,247,255,248,227,215,229,189, -141,172,175,194,180,189,194,224,226,169,118,106,105,129,157,156,190,168,99,79,78,61,65,107,143,171,161,175,240,254,254,253,245,231,219,217,210,203,204,194,194,147,57,58,38,15,10,12, -26,86,173,212,201,184,180,153,172,200,178,144,84,44,44,56,62,69,63,49,43,36,37,45,54,71,86,88,90,85,76,83,112,118,156,196,148,85,83,123,169,212,250,255,255,255,255,255, -255,255,254,252,225,197,196,134,75,54,27,27,54,70,64,54,55,54,48,41,27,21,21,15,9,7,5,8,7,6,3,5,6,14,21,24,30,40,83,113,148,79,55,56,68,69,48,36, -27,23,21,19,17,19,31,99,109,94,112,134,113,83,83,91,65,59,79,95,163,201,247,255,255,255,255,224,197,189,141,90,80,104,105,94,83,84,113,149,192,241,232,211,179,192,179,153, -127,101,78,59,41,43,49,63,61,65,97,133,143,160,179,183,160,112,177,170,146,149,189,189,233,255,255,255,255,255,255,255,255,255,255,255,255,255,255,252,247,238,222,214,211,186,95,49, -65,63,56,51,55,65,71,129,193,247,255,255,255,255,255,160,168,187,215,233,225,227,218,217,228,211,160,101,105,119,128,161,179,191,157,143,122,113,163,189,204,221,207,215,253,253,255,252, -242,231,217,208,204,206,204,196,192,107,29,30,10,3,5,2,38,87,135,200,213,161,127,116,139,167,204,182,129,84,59,56,71,79,68,50,50,44,42,50,57,73,93,85,82,90,72,72, -122,118,169,167,149,137,101,108,142,187,250,255,255,255,255,255,255,255,255,240,193,189,186,126,71,50,20,29,41,47,59,52,48,52,51,34,24,26,30,28,19,7,3,5,6,8,10,12, -10,17,26,33,31,30,61,109,139,64,45,55,68,51,31,33,31,23,22,21,19,24,49,132,158,171,182,185,144,100,93,79,54,58,92,126,165,153,212,248,255,255,255,239,186,154,114,80, -82,90,98,92,98,113,171,182,201,246,232,211,207,212,192,158,134,142,149,84,43,50,44,47,61,50,71,93,88,128,157,123,104,97,140,157,123,101,142,160,203,255,255,255,255,255,255,255, -255,255,255,255,255,255,253,249,247,236,229,218,205,200,173,132,127,136,98,70,77,93,133,169,214,247,255,255,255,255,253,178,212,215,222,240,242,248,219,179,185,225,217,158,123,135,127,193, -219,208,217,210,204,224,222,193,179,196,221,227,250,254,252,249,241,231,220,214,204,210,206,198,184,102,47,13,0,2,2,0,28,111,168,186,201,169,137,112,135,169,191,205,192,119,76,72, -80,100,80,52,44,43,43,55,63,64,73,71,79,92,82,83,99,129,142,142,185,163,114,99,130,199,248,254,255,255,255,255,255,255,252,206,168,179,191,156,85,62,31,41,52,65,97,71, -54,49,38,28,29,35,37,30,16,9,7,6,7,10,13,14,19,23,30,30,26,33,48,116,126,71,45,48,56,47,28,30,33,29,24,24,24,37,70,114,153,197,208,185,155,134,108,77, -56,54,68,91,113,123,179,240,255,255,255,252,194,151,128,114,92,76,76,98,132,154,186,205,213,208,182,171,217,229,184,142,183,196,172,95,47,57,49,33,49,38,43,49,54,86,94,70, -56,66,94,108,82,79,106,143,178,227,219,234,255,255,255,255,255,255,255,255,255,254,250,250,245,238,226,210,208,215,222,205,201,164,142,126,114,165,212,232,227,239,255,255,255,252,240,242, -189,210,232,239,250,249,173,130,146,193,201,210,199,184,180,231,233,233,240,238,239,248,234,214,204,205,213,212,234,253,252,250,241,227,218,213,207,206,204,167,120,91,41,0,0,1,2,0, -9,79,123,147,161,163,136,113,143,184,203,199,184,162,118,95,108,105,77,54,42,42,44,54,61,61,61,58,63,75,84,87,106,151,143,155,146,111,99,135,156,198,235,242,254,255,255,255, -255,255,247,198,180,201,205,171,95,88,83,101,112,128,150,112,73,51,33,33,36,42,36,26,17,13,9,8,10,12,16,21,26,29,34,30,29,50,69,101,84,43,42,44,41,40,37,37, -35,35,33,29,30,43,73,120,140,168,175,141,111,92,91,97,90,91,79,97,132,142,170,236,255,255,255,249,175,170,172,147,116,100,90,115,169,183,185,198,215,184,164,203,234,211,127,130, -247,235,144,86,82,83,62,35,34,47,45,41,45,58,76,72,54,63,78,75,69,73,95,160,184,148,155,199,252,255,255,255,254,252,253,253,253,252,252,247,235,227,226,214,213,225,227,214, -212,194,204,199,170,215,255,255,248,247,254,255,255,247,205,217,222,218,239,239,241,246,178,107,135,148,151,205,225,213,235,246,236,241,247,246,242,250,250,242,231,224,215,206,225,247,253,249, -241,225,212,204,205,205,204,173,93,41,28,8,0,2,3,0,8,41,71,91,97,128,143,113,116,150,182,206,224,197,151,106,107,79,66,58,48,48,52,55,55,56,52,50,54,59,76,73, -98,157,165,150,106,101,133,165,206,208,211,239,247,252,255,255,255,255,241,221,217,210,194,137,80,108,125,126,127,133,154,116,92,55,41,40,40,38,30,26,23,16,14,10,13,20,24,28, -30,31,36,38,47,85,112,112,79,54,43,41,40,37,40,41,40,38,37,34,36,40,56,83,108,128,125,94,66,50,52,70,106,128,116,148,179,148,139,196,255,255,252,215,193,207,165,135, -123,116,115,128,149,175,201,210,221,199,206,234,218,148,119,163,232,194,143,102,93,83,68,30,27,40,51,55,61,68,98,94,76,94,119,99,73,78,93,135,154,141,179,210,235,254,255,255, -252,231,229,231,228,233,245,224,198,199,206,215,229,235,229,225,228,238,248,243,233,246,255,255,255,255,255,255,255,252,199,213,242,229,240,246,239,234,179,133,148,170,160,198,238,236,253,252, -249,250,248,247,250,254,245,192,185,201,224,227,238,247,253,249,234,218,210,208,190,187,193,126,41,15,16,13,2,5,8,8,26,30,35,69,86,95,140,135,109,125,142,183,217,180,160,136, -107,72,72,68,57,55,61,59,59,55,47,43,44,45,45,54,108,158,129,113,134,141,158,177,208,206,222,240,236,247,255,255,255,255,239,229,234,224,194,134,87,92,104,104,109,122,134,101, -90,58,51,40,34,31,28,29,28,21,22,17,20,24,31,34,37,38,41,59,82,116,141,149,119,82,55,41,40,37,40,42,44,43,42,37,40,42,54,75,92,102,97,70,42,30,36,48, -72,102,137,156,158,177,162,163,201,233,255,189,197,199,150,129,100,87,93,122,130,165,199,211,213,213,234,234,196,135,150,201,217,186,154,165,148,123,76,17,24,42,57,73,100,113,122,106, -114,143,137,101,70,76,93,128,115,148,190,187,227,246,248,248,239,226,198,180,217,217,206,199,198,196,200,222,246,245,235,233,243,247,248,249,254,255,255,255,255,255,255,255,255,255,239,239, -247,246,250,253,246,235,213,229,215,218,214,246,250,254,250,253,253,253,253,250,254,254,241,196,205,213,221,234,241,247,246,245,228,214,206,204,179,171,153,82,33,19,21,12,8,12,17,13, -19,20,20,37,51,100,150,139,105,114,115,121,146,135,141,170,115,71,73,71,66,56,59,63,59,51,45,43,42,44,44,43,64,88,88,85,126,158,186,225,229,222,233,229,212,240,255,255, -255,255,250,245,247,236,183,116,101,100,114,130,155,165,139,95,80,62,55,41,31,33,29,30,30,28,28,26,27,42,50,45,57,55,66,115,142,151,154,148,130,90,50,42,43,41,43,44, -47,50,47,41,42,55,70,76,87,90,80,64,41,30,31,42,63,90,147,153,156,198,204,173,161,211,245,172,170,176,132,95,83,79,100,115,123,165,190,221,227,234,235,193,140,111,120,187, -220,217,215,218,205,143,61,21,29,54,77,88,144,132,137,153,168,164,141,125,92,73,94,126,146,155,170,189,175,175,163,199,210,207,180,182,205,214,194,182,178,170,183,220,241,243,238,242, -246,247,248,253,255,255,255,255,255,255,255,255,255,255,252,250,248,248,253,254,253,252,255,255,255,252,255,255,255,255,254,254,255,255,254,255,255,252,248,235,227,232,228,234,242,242,241,235, -222,219,207,199,182,161,143,125,72,24,24,14,12,17,49,30,10,9,3,13,68,112,119,101,69,71,69,76,114,151,151,140,95,71,73,70,66,56,56,58,57,52,48,45,44,45,49,47, -43,50,61,70,93,158,219,222,221,220,224,220,214,201,214,241,249,242,231,246,246,219,161,123,122,134,134,168,196,212,193,91,77,61,44,34,29,31,33,31,33,36,30,34,41,57,65,64, -73,84,97,113,153,177,172,157,125,102,58,48,48,47,48,48,49,55,52,44,48,64,61,65,97,92,82,62,40,35,36,36,41,68,102,128,176,233,224,201,205,191,198,176,177,154,91,66, -72,80,106,120,127,164,200,226,213,222,205,155,102,64,94,189,186,146,201,218,184,114,56,28,45,82,87,92,182,186,199,217,199,143,121,115,80,82,120,140,175,199,180,190,127,94,114,154, -162,164,172,168,176,199,183,153,135,136,180,211,229,236,241,241,248,254,255,255,255,255,255,255,255,255,255,255,255,255,255,254,248,248,254,255,255,252,253,255,255,255,255,255,255,255,255,254, -255,255,255,255,255,254,255,250,234,231,228,231,242,241,239,232,220,218,208,196,164,105,128,142,50,15,15,13,15,27,52,59,17,15,16,20,63,93,82,90,56,54,58,61,97,132,132,126, -98,75,80,79,64,52,57,62,65,65,56,50,45,40,40,40,37,40,54,98,121,168,226,198,200,201,206,217,215,197,212,222,239,239,234,241,238,225,171,154,122,130,150,150,179,212,179,70, -56,36,19,20,27,33,33,33,36,35,38,50,68,79,76,72,92,133,122,102,148,189,184,162,143,128,70,54,54,52,56,58,55,57,55,50,48,50,55,71,94,90,73,45,31,29,28,24, -23,37,58,97,160,211,220,214,217,203,187,196,178,128,82,65,55,66,80,111,136,184,219,193,178,177,184,175,130,148,143,157,172,135,167,205,203,133,77,50,72,102,91,101,158,224,226,226, -196,126,108,100,86,114,146,149,198,214,153,144,120,85,95,118,104,102,108,93,109,135,144,135,109,111,163,200,217,226,238,242,247,255,255,255,255,255,255,255,255,255,255,255,255,255,255,253, -247,249,253,254,254,253,252,255,255,255,255,255,255,255,255,255,255,255,255,255,253,255,255,255,252,236,231,236,233,233,235,225,217,211,208,191,108,59,121,128,34,3,7,6,12,38,64,50, -23,34,31,28,40,55,52,65,54,42,54,52,75,91,107,140,106,71,73,73,58,55,69,84,98,93,66,58,52,42,41,38,41,64,94,142,148,175,215,180,171,161,193,225,240,242,247,246, -249,243,238,238,217,205,183,165,108,108,158,163,178,208,182,65,19,13,8,13,29,42,44,43,49,47,52,72,116,113,83,82,125,163,160,179,203,198,175,127,106,108,73,65,59,59,65,68, -59,56,52,50,51,59,69,73,69,70,52,31,31,21,19,13,21,38,54,92,148,176,213,215,208,214,187,183,164,127,114,90,65,84,113,135,155,150,156,144,132,160,205,232,236,240,222,218, -220,187,162,150,161,146,97,58,68,73,82,126,133,200,207,171,144,148,158,128,150,196,205,215,212,178,150,126,100,116,101,85,90,90,94,84,82,126,134,149,128,132,162,201,211,227,236,243, -248,253,255,255,255,255,255,255,255,255,255,255,255,253,253,250,245,242,248,252,253,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,252,250,254,254,254,245,240,241,229,222,226,218, -207,207,201,189,115,41,95,112,51,16,8,9,13,48,62,27,20,28,44,57,41,51,56,76,71,44,50,52,62,73,80,111,111,79,75,85,78,84,84,97,123,105,69,62,59,56,56,52, -56,91,128,154,161,175,211,162,139,146,186,221,238,234,225,239,245,241,234,235,215,200,212,198,143,134,189,199,180,185,186,125,42,17,14,21,37,61,70,62,68,72,80,101,126,119,95,104, -129,161,186,205,214,205,140,86,71,78,79,73,62,65,70,68,63,58,54,51,61,68,63,54,41,35,28,22,23,15,9,5,3,20,45,85,135,154,186,201,183,190,213,196,151,130,134,143, -140,148,155,158,175,151,144,129,123,157,206,231,235,208,212,228,231,215,190,171,160,172,144,75,44,50,78,104,91,122,137,163,185,210,199,143,137,163,168,162,151,155,142,108,120,170,143,92, -92,95,94,84,99,107,105,150,142,150,186,225,231,240,246,249,253,254,255,255,255,255,255,255,255,255,255,255,254,249,235,238,236,236,248,252,254,255,255,255,255,255,255,255,255,255,255,255, -255,255,255,255,255,253,254,255,255,252,247,243,228,205,199,208,201,199,198,185,116,21,37,51,41,29,23,14,13,29,33,37,31,29,28,41,45,64,93,83,50,49,50,55,62,56,63,83, -109,98,99,102,90,102,102,111,112,86,68,62,62,65,61,59,68,95,143,164,177,154,182,151,143,154,190,228,225,210,210,222,232,242,238,225,224,220,218,211,186,187,208,212,184,175,183,164, -88,57,51,48,68,94,109,85,93,101,114,141,143,128,119,122,116,119,176,201,215,194,129,86,84,77,78,70,62,63,66,68,64,59,56,54,61,62,51,42,33,23,17,14,10,7,1,0, -0,0,12,51,105,128,150,161,150,167,196,206,177,154,156,168,176,157,142,148,158,155,154,134,115,158,218,220,197,168,179,206,222,210,196,197,186,168,155,82,33,35,50,47,50,72,91,133, -153,154,187,189,178,160,147,118,87,125,137,115,154,191,156,154,157,134,95,84,95,94,120,142,128,160,207,238,239,248,253,254,254,254,255,255,255,255,255,255,255,255,255,255,243,217,185,193, -211,232,240,253,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,253,252,255,255,255,250,231,210,203,176,200,197,193,194,180,109,10,10,22,41,38,28,9,5,7,13,21, -22,19,28,40,54,75,134,108,34,36,42,51,56,47,50,69,107,129,102,91,95,97,107,100,83,75,66,64,62,59,57,61,77,114,180,183,189,162,168,160,170,169,183,200,186,205,221,218, -225,238,235,219,226,234,222,204,205,208,204,206,201,187,165,108,108,99,87,85,98,120,139,107,106,125,141,179,171,132,113,130,139,126,169,194,208,199,156,123,92,80,80,72,62,61,63,69, -68,61,57,54,55,58,48,41,33,23,15,10,6,6,0,0,0,0,0,26,72,101,133,132,127,153,180,168,172,182,158,133,155,146,141,139,140,144,140,133,106,130,169,164,165,172,156,178, -200,215,196,171,183,173,133,62,26,24,34,34,30,52,59,95,134,165,183,186,170,163,148,99,66,84,114,155,162,150,172,200,161,129,100,108,118,106,130,125,132,184,215,242,245,250,254,255, -254,254,255,255,255,255,255,254,254,246,238,247,240,200,146,156,156,185,200,236,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,254,247,247,255,255,250,213,190,208,178,190, -194,190,185,177,121,12,0,3,26,34,28,12,8,3,6,7,9,13,44,61,50,79,123,116,50,36,42,48,52,49,47,69,108,146,114,91,102,119,116,83,78,83,72,68,64,54,55,66, -83,104,176,182,192,210,184,168,191,205,189,189,190,190,220,231,239,241,238,241,233,234,210,191,205,193,180,200,214,200,154,106,128,122,133,128,127,157,158,135,136,155,175,201,184,140,127,151, -137,168,201,201,208,207,192,147,107,86,82,75,66,68,66,69,68,58,56,54,54,52,44,40,33,26,19,13,8,6,5,0,0,0,1,15,52,95,140,142,144,160,208,176,178,200,161,140, -156,129,140,125,106,112,127,157,163,139,126,162,153,177,178,183,206,210,217,187,171,165,73,35,24,26,27,21,13,27,50,102,148,178,185,186,162,156,112,57,61,90,130,167,148,148,173,161, -128,114,102,95,98,97,136,142,180,227,228,239,239,248,252,253,253,254,250,252,253,253,252,249,243,235,234,239,229,211,153,130,137,142,167,212,255,255,255,255,255,255,255,255,255,255,255,255, -255,255,255,248,243,242,238,240,253,255,247,205,171,198,164,172,187,184,184,178,148,52,5,0,2,17,21,20,17,5,6,7,6,9,27,37,24,58,82,83,55,41,45,49,58,61,62,84, -125,164,149,119,111,128,112,78,78,73,71,66,61,55,56,72,94,118,165,163,165,217,178,193,211,221,189,194,196,186,225,233,245,253,248,245,241,234,179,176,192,133,114,158,176,176,148,136, -148,137,153,147,163,182,175,132,120,155,200,204,184,161,144,143,129,164,187,198,184,183,179,176,153,95,92,90,83,79,68,65,61,55,56,56,55,49,42,37,34,29,22,15,12,9,7,6, -3,0,2,15,49,92,125,162,162,173,201,208,210,171,141,156,173,149,119,114,87,94,158,190,182,139,141,185,157,206,221,215,220,219,218,210,190,128,47,34,28,27,19,14,10,33,66,111, -137,144,151,168,155,140,88,44,58,93,160,156,153,133,121,122,167,150,111,125,129,139,187,186,193,178,169,199,214,235,234,248,249,234,221,236,240,239,245,238,232,233,224,201,200,199,164,121, -170,153,160,184,235,255,255,255,255,255,254,255,255,255,255,255,255,255,253,240,228,227,242,250,247,240,233,190,156,176,162,151,178,186,182,170,133,85,40,17,3,13,20,20,10,1,3,5, -5,8,12,14,19,36,52,56,56,41,47,64,79,79,85,109,155,192,182,126,94,92,97,87,73,68,65,58,54,54,57,73,90,114,135,130,164,197,177,226,235,233,197,218,235,211,220,240, -253,254,250,249,236,199,158,164,149,94,92,111,141,168,164,135,134,146,182,192,194,178,162,120,107,133,187,205,189,182,193,192,178,151,148,161,160,163,179,198,177,127,111,112,98,70,59,61, -55,54,56,54,49,45,40,37,33,28,22,19,15,13,9,9,7,3,3,16,52,94,111,183,204,211,198,214,214,168,148,149,173,193,156,116,82,91,160,169,192,163,179,236,205,198,221,246, -250,242,239,203,118,68,38,36,41,38,37,29,33,68,70,93,128,151,156,168,168,106,64,54,61,75,114,101,109,104,126,114,151,169,137,149,140,143,171,142,104,64,70,132,177,169,158,201, -219,208,177,198,207,217,211,218,228,234,225,204,197,198,186,169,170,168,147,172,198,227,247,255,255,242,231,255,255,255,255,255,255,255,252,232,213,226,238,241,225,200,196,165,140,141,132,141, -178,184,178,160,101,80,61,40,15,12,15,16,10,1,1,5,5,7,9,10,19,40,41,33,41,47,71,87,88,85,105,132,178,207,170,94,78,75,87,87,72,72,59,48,47,49,51,58, -59,76,94,98,142,175,189,232,241,250,255,253,235,199,219,248,255,255,255,255,242,213,200,199,168,149,126,140,191,189,160,142,150,171,207,203,191,185,168,130,112,114,164,212,213,205,212,219, -162,114,141,184,167,160,175,172,172,151,137,106,72,51,50,51,50,51,50,48,43,40,38,36,33,29,26,22,19,15,14,12,10,8,8,20,58,88,118,170,193,199,206,226,218,197,177,127, -90,139,155,109,71,65,91,133,231,255,253,238,193,186,233,249,255,255,253,213,140,85,80,115,134,112,65,49,62,73,49,86,155,154,116,134,165,144,97,87,85,75,68,79,90,87,73,86, -102,135,137,105,119,97,75,52,27,26,49,85,107,91,101,143,163,162,153,170,172,192,187,182,204,221,221,219,212,225,210,180,154,161,146,160,176,208,225,229,217,179,211,255,255,255,255,255, -253,231,207,191,192,198,194,201,203,170,172,182,158,141,130,142,183,185,176,162,123,116,90,58,48,21,14,22,21,6,1,5,6,6,7,9,12,30,33,28,30,44,77,99,98,92,100,127, -162,187,164,88,86,83,84,82,70,65,51,44,41,43,40,35,34,36,43,63,100,149,213,229,227,241,255,255,250,248,254,255,255,255,255,255,247,235,238,238,232,212,194,205,227,210,190,201, -201,190,212,210,187,163,153,134,116,122,156,210,206,204,219,213,148,155,193,186,121,156,164,155,164,164,128,78,47,40,41,43,45,47,43,41,38,35,33,33,31,29,29,24,23,21,19,19, -15,14,15,22,45,66,107,151,175,141,184,208,194,143,118,99,64,83,86,65,50,45,50,99,212,255,255,250,245,252,255,255,255,255,253,246,199,168,178,218,206,187,153,142,107,62,102,163, -169,134,116,163,147,125,114,116,98,71,49,70,77,77,66,71,86,95,77,80,105,84,40,28,23,27,38,73,101,101,113,134,136,142,158,162,165,178,179,171,184,201,218,219,221,224,196,169, -171,148,132,135,156,168,167,149,122,125,167,241,255,255,255,255,248,226,200,168,168,146,140,175,206,205,193,201,172,156,161,156,173,180,165,154,140,127,108,78,75,70,48,45,40,19,9,7, -5,6,7,8,12,19,27,33,31,43,71,91,88,80,86,102,137,144,161,119,91,88,84,73,71,59,45,35,30,29,27,28,27,24,28,57,77,130,207,226,214,248,255,255,255,255,255,255, -255,255,255,255,253,250,254,236,234,206,208,231,228,215,203,205,193,190,196,205,190,130,123,155,157,170,165,197,214,208,229,217,175,194,193,154,121,161,169,153,156,148,99,71,48,40,36,36, -37,40,38,35,34,30,30,29,29,33,31,30,28,30,28,24,22,20,26,31,44,59,79,115,130,101,112,137,141,95,72,62,56,59,51,40,38,57,56,82,226,255,255,255,255,255,255,255, -255,255,255,254,240,253,217,213,186,155,199,204,178,155,178,190,157,123,129,172,149,113,126,127,84,49,36,45,59,76,75,73,90,79,82,100,90,52,27,22,28,37,56,90,130,153,163,182, -190,178,165,154,171,193,183,192,219,220,221,221,220,214,204,198,155,107,84,79,83,85,90,78,92,133,142,179,214,253,255,254,248,245,205,165,157,142,153,179,211,236,225,210,190,178,186,168, -154,161,148,142,129,115,106,90,76,78,82,72,61,49,27,15,8,8,12,13,13,20,34,44,40,48,66,58,54,68,61,71,108,106,115,86,62,72,72,79,79,59,45,31,23,19,19,22, -20,16,15,29,49,94,153,197,233,253,255,255,255,255,255,255,255,255,255,255,255,255,255,239,200,194,200,233,207,187,203,198,184,193,180,179,164,140,134,165,171,185,179,204,228,231,236,227, -231,217,197,156,160,163,170,136,99,80,78,58,48,48,40,34,33,33,35,31,27,27,26,27,30,35,36,33,34,36,34,29,28,27,33,36,50,56,47,57,66,70,54,70,70,66,54,48, -45,42,37,34,41,82,127,177,248,255,255,255,255,255,255,255,255,255,255,255,255,255,246,179,157,147,213,201,167,173,191,192,171,151,164,182,190,171,133,109,64,28,20,26,38,56,57,71, -79,77,91,94,62,34,27,26,34,52,78,104,137,175,197,227,225,197,185,178,190,205,219,225,226,208,187,197,210,211,214,194,129,98,69,43,34,36,33,45,90,128,132,121,182,254,255,253, -248,246,224,203,191,185,180,172,200,228,232,218,192,196,194,192,178,139,126,135,121,101,86,82,95,114,142,139,112,78,49,24,16,14,16,14,15,26,43,50,45,50,54,38,49,55,36,40, -57,59,41,30,44,59,65,75,80,59,36,28,22,19,19,19,16,12,8,16,31,95,143,171,219,255,255,255,255,252,254,255,255,255,255,255,255,255,252,252,211,184,196,199,189,189,208,208, -196,186,157,143,163,163,142,144,168,179,193,218,229,227,231,235,240,226,183,190,201,157,158,123,88,63,58,49,47,50,44,34,28,28,27,27,24,23,23,24,29,33,36,35,35,36,37,34, -31,33,34,37,38,40,40,40,38,38,40,42,51,51,41,42,37,36,41,34,40,83,153,226,255,255,255,255,255,255,255,255,255,255,255,255,255,248,252,213,169,169,173,157,120,99,164,206, -213,194,196,167,146,128,93,62,31,13,9,13,23,43,59,68,61,58,64,58,42,26,19,26,40,56,78,102,133,173,225,254,242,222,221,217,231,234,234,234,214,187,164,162,182,186,187,167, -143,114,85,48,27,19,14,31,70,119,129,129,227,255,255,254,248,245,231,214,220,221,191,186,214,217,213,196,199,205,206,201,184,147,119,125,112,87,76,77,121,185,203,197,171,99,61,38, -23,23,21,17,22,30,41,51,52,49,36,28,40,31,22,23,30,28,23,23,31,41,49,55,65,57,30,26,23,22,20,17,14,9,7,17,36,65,87,136,201,241,246,243,228,243,253,255, -255,255,255,255,255,255,255,255,220,197,161,121,141,189,213,194,179,171,164,169,168,167,137,140,173,175,177,208,227,226,236,238,239,228,187,205,204,182,139,95,86,62,56,54,40,38,38,30, -21,19,19,20,21,19,22,27,26,28,34,36,37,40,38,37,31,29,34,36,36,36,38,38,38,37,36,38,43,44,40,38,37,38,45,43,43,64,112,192,247,247,248,248,253,255,255,255, -255,255,255,255,255,254,255,229,187,154,84,64,56,61,79,94,196,211,206,141,70,51,55,42,23,7,5,8,19,41,70,62,43,38,33,29,29,21,19,33,43,56,85,114,148,192,247,255, -255,249,253,252,253,255,250,253,242,233,219,189,205,211,190,173,180,151,116,70,37,30,22,30,58,112,126,130,204,242,249,241,234,250,242,217,206,228,220,190,183,183,201,169,198,196,186,192, -177,136,116,102,88,76,72,83,150,199,227,224,191,144,100,77,47,33,29,24,27,34,41,45,54,38,22,19,14,14,15,16,17,17,20,23,28,31,34,41,50,49,33,27,24,23,22,19, -12,10,6,10,23,33,51,107,147,186,203,219,221,252,255,255,255,255,255,255,255,255,255,255,199,125,105,88,111,193,227,204,175,171,205,192,158,129,106,151,204,219,220,235,239,238,240,236, -243,233,207,198,187,173,114,92,80,65,62,50,33,24,29,24,14,12,14,17,16,15,21,26,28,30,34,35,38,42,41,38,35,33,33,35,36,36,37,37,38,36,37,37,38,37,37,37, -38,41,42,48,54,58,82,126,179,198,220,236,252,255,255,255,255,255,255,255,255,255,255,218,115,95,69,50,51,54,88,97,144,178,183,146,80,83,69,37,19,10,5,7,15,26,45,44, -28,26,23,20,27,26,28,44,57,76,102,133,171,221,255,255,255,255,255,255,253,255,255,255,255,255,254,247,253,255,232,206,199,171,132,82,51,47,40,42,54,87,137,142,167,210,240,234, -247,252,212,196,218,236,247,232,221,228,229,177,190,182,170,185,172,126,97,80,68,68,66,94,190,204,240,253,234,201,169,129,83,50,37,33,35,40,40,38,42,30,17,19,12,8,12,13, -14,15,20,22,23,27,30,37,42,41,33,27,26,23,22,19,15,14,7,5,10,19,36,65,85,119,143,189,243,255,255,255,255,255,255,255,255,255,255,255,185,107,104,100,113,190,249,245, -218,200,218,218,175,105,99,151,225,252,255,255,252,250,247,243,225,211,213,205,201,208,182,133,109,82,57,34,28,33,36,20,7,8,10,10,13,16,20,28,30,35,35,36,42,45,44,43, -40,35,35,34,33,35,33,35,35,35,35,36,36,36,37,37,37,35,41,47,55,56,65,82,113,139,177,234,255,255,255,255,255,255,255,255,255,255,255,206,99,78,76,78,71,63,72,94, -102,127,139,115,104,104,72,34,21,17,10,5,10,16,23,22,17,15,13,19,35,44,48,63,80,104,128,160,189,238,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,239, -217,186,161,120,84,58,57,76,82,112,157,169,182,207,241,252,255,238,201,201,221,245,250,248,249,255,240,208,203,196,182,178,161,123,92,73,66,66,69,109,196,219,255,255,250,229,199,156, -90,54,37,36,38,40,36,33,29,26,19,21,21,16,13,13,15,16,17,20,22,23,29,34,43,37,29,31,29,24,22,22,21,16,8,6,6,9,16,33,47,56,83,148,221,255,255,255, -255,255,255,255,255,255,255,255,232,136,114,127,170,214,250,249,183,190,210,208,205,134,116,178,235,255,255,255,255,255,250,235,233,183,198,218,175,201,200,126,111,82,37,22,26,35,26,8, -0,1,3,6,8,15,22,29,35,38,38,42,45,44,47,45,40,36,36,34,33,34,31,33,33,33,33,33,34,34,35,37,35,31,33,35,38,38,47,56,63,76,135,204,254,255,255,255, -255,255,255,255,255,255,255,245,125,70,77,95,84,68,62,83,88,75,84,95,94,73,56,30,22,20,10,6,6,8,9,8,8,6,5,21,47,58,78,99,116,140,163,194,222,253,255,255, -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,247,206,173,169,143,98,45,68,80,80,105,133,144,169,187,245,255,239,190,190,218,236,239,248,246,245,228,227,217,204,186,165,167, -148,120,101,84,73,64,62,87,106,136,238,255,255,245,207,150,69,40,31,33,33,34,31,29,26,24,22,20,20,17,13,14,16,16,16,20,26,26,31,35,54,63,49,35,34,28,26,20, -20,16,12,8,6,8,10,20,26,40,58,98,158,200,250,255,255,255,255,255,255,255,255,250,219,198,176,175,212,246,252,246,192,191,191,176,163,128,144,218,239,242,255,255,255,255,254,224, -198,156,201,231,173,192,163,90,87,50,19,15,20,21,7,1,0,0,0,1,6,15,23,30,35,38,40,44,45,45,45,45,40,38,35,36,31,31,30,30,29,31,31,31,31,29,27,29, -28,27,21,21,30,33,40,45,50,68,97,154,197,242,255,255,255,255,255,255,255,255,252,182,175,156,123,104,77,72,66,79,97,108,104,88,78,58,41,23,16,15,12,7,3,2,1,0, -1,2,7,21,41,57,108,147,169,192,212,235,253,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,247,179,119,116,115,107,72,70,58,52,73,119,112,126,153,200,197, -180,171,169,198,247,241,241,234,219,171,146,157,168,155,150,167,150,120,95,87,76,65,59,59,59,82,135,172,242,243,161,97,50,36,30,30,31,31,33,28,26,23,22,17,15,13,13,14, -15,19,23,26,29,36,48,50,64,78,57,35,37,34,24,24,23,22,16,12,10,14,14,24,31,38,48,77,111,151,218,249,255,255,255,255,255,255,255,253,241,206,206,234,234,248,250,253, -224,184,177,170,150,125,178,241,229,221,253,255,255,255,255,245,201,175,220,236,192,204,140,55,37,22,19,17,17,14,7,1,0,0,0,2,7,15,21,28,35,40,41,43,44,44,43,41, -36,37,34,34,30,29,29,28,27,28,28,30,30,27,23,23,23,22,20,19,27,37,45,55,52,66,95,130,156,208,247,255,255,255,255,255,255,255,254,218,173,169,158,109,73,78,65,54, -75,118,102,72,75,56,22,15,15,12,8,6,1,0,2,1,2,5,12,21,31,47,91,162,224,238,254,255,255,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,248, -217,142,114,118,118,118,68,49,66,77,100,100,114,140,153,164,215,245,240,247,255,252,235,212,153,112,83,92,120,133,148,160,149,112,91,91,79,68,59,57,57,61,84,108,176,186,106,64, -44,31,28,30,28,29,29,28,27,26,22,14,10,8,10,13,17,16,24,34,36,41,55,64,71,71,48,35,40,44,35,31,26,22,16,12,9,12,14,23,28,29,40,68,102,156,215,236, -250,255,255,255,255,255,255,255,255,238,205,234,241,248,250,253,249,231,208,184,130,154,211,240,233,245,254,255,255,255,255,255,246,252,249,247,239,205,99,48,31,26,26,22,21,13,8,3, -0,0,0,2,8,15,20,28,35,41,42,42,43,44,41,37,36,37,34,31,29,29,29,29,27,26,27,27,26,26,23,17,16,19,16,14,23,36,54,55,43,61,86,125,160,210,236,249, -255,255,255,255,255,254,255,255,233,190,120,76,59,78,62,50,72,93,82,66,59,47,22,26,24,22,14,8,2,2,8,8,6,10,20,28,35,49,78,144,169,198,255,252,218,220,255,255, -255,255,255,255,255,255,255,255,255,254,255,255,255,231,214,245,231,180,125,106,85,95,59,47,51,57,78,86,97,129,144,164,220,255,249,229,220,196,176,155,101,86,76,66,92,122,144,137, -107,88,86,88,82,69,61,55,55,58,68,86,109,93,84,63,42,30,26,24,22,23,21,24,26,23,15,9,7,6,6,10,19,19,27,49,55,48,52,71,71,57,43,36,42,50,54,43, -23,16,12,7,5,6,9,17,21,16,33,63,83,137,228,215,235,255,255,255,255,255,255,255,255,242,189,245,249,240,241,245,235,247,232,179,151,177,210,225,238,254,255,255,255,255,255,254, -253,254,252,249,254,168,73,58,40,36,30,24,22,17,9,3,0,0,0,3,12,16,22,31,37,42,43,42,43,44,42,40,36,35,34,33,30,29,28,28,27,23,22,23,22,20,17,14, -14,13,9,13,19,36,59,54,31,49,79,104,141,217,226,228,255,255,255,255,254,252,255,255,255,155,87,44,68,97,63,69,107,99,64,61,73,50,34,41,28,27,21,14,9,17,16,13, -15,22,28,41,49,59,98,132,116,133,173,194,183,220,255,255,255,255,255,255,255,255,255,255,255,254,254,226,206,170,130,189,133,136,119,108,82,62,54,42,28,30,50,75,97,128,158,165, -210,243,192,163,153,114,114,91,70,71,52,64,82,99,144,126,84,80,80,84,82,70,61,54,51,54,59,70,75,70,65,51,37,28,19,16,17,17,16,19,24,20,13,7,3,3,1,7, -21,41,52,72,97,93,64,71,59,48,42,36,43,64,77,56,30,21,15,12,9,6,7,12,13,13,27,62,63,104,191,217,229,255,255,255,255,255,255,255,255,218,198,253,250,239,225,213, -211,226,233,178,168,190,203,231,243,255,255,255,255,255,255,255,255,253,252,252,236,168,111,73,47,43,33,24,22,17,9,1,1,0,2,7,16,21,28,33,40,43,43,42,43,42,41,40, -37,37,33,29,28,26,24,26,24,21,20,20,16,12,9,8,9,7,7,6,13,36,52,47,33,49,83,92,115,179,218,221,253,255,254,255,255,255,255,255,232,109,55,47,83,123,134,148, -165,133,90,73,66,35,33,43,33,28,29,24,35,42,31,24,26,36,47,54,57,59,88,120,113,108,115,182,205,234,255,255,255,255,255,255,255,255,255,255,255,255,253,213,183,178,140,115, -139,130,139,115,83,48,37,26,20,30,47,65,80,87,128,173,185,184,153,137,132,135,139,123,101,85,58,70,71,97,134,120,95,86,94,97,88,73,61,54,52,52,58,66,64,56,44,35, -29,22,16,15,17,17,16,19,20,17,13,7,3,3,5,13,23,43,64,68,95,112,77,59,45,41,38,38,54,82,84,62,49,52,41,33,23,14,8,8,12,15,24,48,52,84,151,208, -231,248,249,252,255,255,255,255,255,235,212,253,208,189,211,184,212,228,231,194,169,186,233,250,252,255,255,255,255,255,255,255,255,253,254,254,246,182,106,82,63,58,38,29,27,20,13,6, -2,5,7,9,20,27,33,37,40,43,41,38,41,43,42,36,34,33,29,26,24,21,22,22,22,20,15,13,8,5,5,3,3,3,1,1,9,26,40,42,41,54,78,91,112,157,203,220, -236,238,236,255,255,255,255,255,254,155,42,54,68,95,140,169,169,147,127,107,68,45,31,38,34,31,36,45,73,66,47,37,37,50,80,78,62,62,88,116,122,108,126,169,198,205,241,252, -255,255,255,255,255,255,255,255,253,253,255,236,192,169,156,157,177,172,169,141,97,57,40,16,14,26,45,55,34,30,70,114,118,109,100,114,129,142,140,151,127,77,61,70,75,114,134,164, -144,122,114,102,85,72,64,57,52,55,57,56,55,48,37,28,22,19,17,17,16,17,17,15,15,16,14,10,8,7,8,17,30,40,52,65,73,86,75,50,42,42,44,55,73,88,95,108, -125,115,82,56,42,31,22,14,15,21,24,40,65,109,140,183,219,238,254,255,255,255,255,255,255,246,245,255,203,164,189,205,243,247,238,232,224,204,241,255,255,255,255,255,255,255,255,255, -254,255,255,255,250,183,129,116,101,55,35,38,35,22,17,14,8,7,10,14,23,31,40,42,44,44,41,38,37,38,38,34,31,26,22,20,16,17,21,21,19,13,10,6,0,0,0,0, -0,0,0,0,7,19,27,37,47,59,79,106,143,165,193,219,221,234,239,253,255,255,255,255,254,186,93,69,68,76,100,132,126,101,83,82,87,84,79,70,69,92,84,85,87,61,54,51, -50,69,97,95,97,99,119,143,144,125,161,194,200,194,215,248,255,255,255,255,255,255,255,255,246,247,242,217,207,211,208,198,180,191,175,155,118,79,52,28,20,22,33,20,16,26,47,55, -42,38,44,84,115,118,128,120,88,54,56,70,95,160,172,190,180,149,115,101,84,73,65,57,52,55,55,52,49,41,35,29,23,20,16,16,17,16,15,15,13,12,13,13,10,7,7,13, -27,30,40,62,71,66,62,55,51,48,57,75,83,106,163,201,206,161,127,105,65,51,43,33,26,30,33,57,105,136,161,186,199,246,255,255,255,255,255,255,255,255,255,254,213,167,228,252, -253,246,248,253,250,239,250,255,255,255,255,255,255,255,255,255,254,254,254,253,236,186,175,170,79,37,38,42,34,24,21,17,14,14,16,20,28,37,43,47,50,47,44,41,35,36,36,33, -29,23,20,16,10,12,14,16,14,10,7,3,0,0,0,0,0,0,0,2,9,23,35,45,56,70,99,147,171,184,207,221,218,218,226,236,241,241,252,254,235,192,161,115,70,51,62,83, -80,61,45,48,63,94,125,112,128,162,126,97,90,76,69,75,76,76,82,120,150,149,150,171,172,169,198,233,238,238,234,253,255,255,255,255,255,255,255,253,246,241,235,219,233,235,224,199, -184,183,168,134,95,69,65,49,17,13,10,0,7,16,16,22,14,12,30,62,86,95,105,82,54,37,45,65,102,183,194,197,191,155,136,128,105,84,71,62,55,52,52,51,48,41,35,31, -27,21,19,20,20,16,15,14,12,10,9,8,6,0,1,10,19,19,26,44,62,61,52,47,61,59,58,75,73,94,164,171,168,146,142,184,165,137,91,55,47,49,57,70,95,130,165,211, -234,250,255,255,255,246,242,246,254,250,231,222,197,221,255,252,224,239,254,253,254,255,255,255,255,255,255,255,255,255,255,255,255,253,253,247,242,173,128,136,62,42,43,41,30,26,23,20, -17,19,19,23,31,42,48,51,52,51,47,44,42,37,36,34,31,26,20,16,9,9,9,12,13,13,8,1,0,0,0,0,0,0,5,13,27,41,49,57,68,79,111,149,171,196,222,217, -200,193,207,215,213,219,240,242,247,208,155,142,80,31,38,57,58,43,37,44,57,76,105,132,155,143,162,157,133,106,95,87,90,97,119,151,205,214,194,186,212,236,246,255,255,253,239,248, -255,255,255,255,255,255,255,252,250,248,246,245,242,222,204,187,203,198,173,153,102,69,72,56,23,15,7,0,0,0,1,16,12,5,22,38,57,77,77,52,38,26,33,54,121,185,196,183, -176,171,158,167,158,127,106,82,66,63,58,59,56,45,38,35,28,22,21,21,21,20,19,16,15,14,9,8,5,2,1,10,16,19,27,41,51,58,55,45,54,78,93,77,66,66,83,100, -139,178,167,163,224,247,198,108,100,88,94,91,106,120,153,203,236,253,255,255,235,219,222,234,248,236,192,182,182,243,255,236,232,250,255,255,255,255,255,255,255,255,255,255,255,255,254,254, -253,253,255,240,190,109,64,56,57,48,40,40,33,30,24,23,24,24,27,30,37,47,55,56,54,50,49,49,47,43,37,36,33,27,21,15,12,9,8,10,12,10,2,0,0,0,0,0, -0,6,16,26,38,42,52,68,83,107,139,171,190,201,204,191,180,180,186,175,186,196,212,226,238,172,121,129,79,30,40,57,64,58,52,51,64,84,108,151,170,153,187,205,185,163,143,106, -105,130,196,229,245,246,236,234,250,254,255,255,255,255,253,254,239,238,252,255,255,255,255,254,253,253,249,248,234,200,180,184,214,197,179,183,113,64,71,48,21,14,10,2,0,0,2,15, -16,20,29,36,55,70,64,41,33,26,27,61,134,182,198,194,194,193,176,201,218,192,153,120,90,76,72,78,66,52,45,37,31,24,22,24,23,22,21,19,15,15,14,9,6,5,5,6, -12,21,37,62,77,77,63,55,54,79,147,99,70,61,79,116,171,189,194,222,227,233,255,210,204,142,111,126,151,116,139,171,213,226,206,220,191,179,199,192,213,236,210,177,186,224,240,233, -241,252,255,255,255,255,255,255,255,255,255,255,255,255,255,254,253,253,219,134,80,56,43,43,48,55,55,44,38,36,33,31,29,29,30,38,44,51,58,57,56,49,50,50,48,45,42,37, -33,29,23,17,14,12,12,13,10,6,0,0,0,0,0,0,0,8,16,16,26,37,54,70,100,147,191,183,171,196,194,164,153,154,154,125,151,189,199,225,241,191,135,104,64,51,63,82, -88,73,68,68,84,98,121,153,157,173,228,234,206,218,199,176,177,185,242,255,254,255,254,255,255,255,255,255,255,255,254,238,201,203,234,248,255,255,254,254,254,253,249,248,219,179,194,210, -213,183,167,189,155,84,57,44,28,17,13,8,3,17,37,37,37,47,48,49,59,58,52,36,24,24,33,77,147,212,232,228,221,220,214,229,232,210,165,151,130,107,106,106,76,58,50,42, -36,28,27,28,27,24,24,22,19,17,14,12,7,3,3,7,10,19,30,50,75,82,52,47,43,42,172,144,76,87,139,154,218,197,221,255,254,205,215,231,234,163,142,151,156,126,177,199, -187,158,135,135,125,155,186,163,199,226,201,187,176,185,203,205,222,255,255,245,254,255,255,255,255,255,255,255,255,255,255,254,255,241,139,78,64,58,47,41,45,65,58,50,44,42,45,47, -42,37,40,50,54,56,61,59,55,45,43,45,45,43,42,41,36,33,26,22,20,17,19,17,10,0,0,0,0,0,0,0,0,5,8,10,20,29,43,68,102,141,170,140,139,167,172,135, -139,155,155,129,169,212,207,217,234,227,172,115,88,85,85,100,94,77,73,79,97,113,135,151,149,173,219,232,227,233,232,228,227,221,248,254,255,255,255,254,255,255,254,254,254,254,245,231, -229,238,245,249,255,255,254,254,254,254,253,245,212,203,225,224,221,192,170,204,186,130,94,64,42,17,13,19,23,31,62,72,56,63,64,65,58,34,33,28,26,29,57,115,162,210,215,214, -200,194,211,227,215,187,162,173,184,163,153,127,90,73,62,50,43,36,31,31,31,31,29,26,23,22,15,12,9,7,5,8,13,16,20,30,62,76,49,41,34,23,92,175,139,164,231,196, -167,167,206,250,255,200,194,201,240,199,183,165,142,158,219,219,184,151,150,126,119,160,182,164,183,192,171,162,163,183,204,189,179,210,186,179,253,255,255,255,255,255,255,255,255,255,255,255, -255,243,157,91,80,77,55,41,44,55,45,51,50,51,47,45,65,61,62,66,58,64,68,61,54,44,41,41,44,45,42,40,35,31,28,24,22,21,20,16,8,0,0,0,0,0,0,0, -0,0,6,13,19,26,36,59,105,143,140,130,177,157,136,147,157,164,173,180,207,222,214,204,208,210,178,133,116,97,85,91,80,99,107,98,123,143,162,161,162,194,213,227,238,240,250,248, -239,241,250,253,253,254,253,252,253,254,248,250,250,249,234,242,255,255,255,255,255,255,255,255,255,255,254,254,241,228,227,232,226,218,204,207,208,186,132,76,61,38,34,51,55,37,69,88, -73,73,70,66,58,42,34,24,30,38,69,118,153,172,190,183,189,189,192,206,194,172,165,189,193,186,164,127,108,98,78,59,48,42,37,37,38,38,33,30,26,24,21,16,15,13,12,14, -14,15,20,23,44,56,35,30,29,36,88,157,189,220,249,236,163,175,203,232,247,255,254,211,191,182,191,190,165,193,239,220,189,156,134,115,114,143,149,144,160,170,155,153,167,184,194,196, -146,132,128,164,214,245,250,254,255,255,255,255,255,255,255,255,250,211,147,109,101,88,64,54,56,54,45,42,50,58,58,55,92,94,93,73,54,69,76,59,44,47,42,38,41,42,38,37, -35,34,30,23,20,19,17,13,5,0,0,0,0,0,0,0,0,0,3,13,22,29,36,55,113,158,154,162,169,128,160,186,186,171,187,210,211,208,214,200,193,150,120,106,92,80,80,85, -119,150,147,142,134,163,186,205,208,219,218,226,241,248,254,255,254,250,253,252,248,241,233,240,241,239,243,246,246,240,229,247,255,255,253,255,255,255,255,255,255,255,255,255,253,247,240,233, -231,226,218,191,185,168,120,69,66,62,66,77,69,59,94,92,71,70,64,63,59,49,41,28,27,40,55,85,129,144,167,194,206,208,213,210,199,193,200,214,207,201,170,127,114,101,75,62, -55,45,43,43,44,44,42,38,35,35,30,27,26,22,19,20,17,20,20,19,24,28,17,12,19,44,84,93,97,148,190,222,146,160,186,163,212,254,229,148,126,127,183,214,198,184,160,146, -141,113,82,83,94,132,155,125,167,198,146,160,179,196,185,196,137,146,150,175,173,192,219,245,255,255,255,255,255,255,255,255,198,146,147,148,143,119,88,80,70,88,88,59,61,65,66,70, -84,123,114,62,72,84,70,57,43,43,40,37,37,36,38,40,36,35,30,22,19,16,13,8,3,1,0,0,0,0,0,0,0,0,3,13,23,31,34,48,87,144,182,199,164,165,187,198, -183,168,198,206,185,192,212,211,183,123,101,83,61,70,84,100,126,129,144,139,127,155,207,231,238,234,226,227,239,250,255,255,255,254,252,249,246,233,219,212,185,179,196,194,219,239,238,250, -254,254,252,254,254,255,255,254,255,255,255,255,255,254,250,238,242,233,215,153,149,153,132,92,65,54,63,83,87,77,87,80,52,51,50,57,50,38,35,31,35,40,51,66,105,130,154,217, -214,193,191,189,199,212,215,220,218,190,139,135,127,92,75,64,55,50,48,49,51,51,52,51,48,45,41,38,36,33,26,24,23,22,20,16,13,9,6,7,14,20,33,57,69,84,107,149, -113,134,169,129,157,220,222,155,123,115,147,182,169,171,135,119,102,77,64,71,78,109,134,122,185,215,142,142,142,143,140,113,123,142,135,158,149,167,233,254,255,255,255,255,255,255,255,255, -184,130,160,185,172,147,111,95,91,135,142,106,73,73,77,72,95,134,143,93,87,72,58,55,44,40,35,40,40,34,36,41,35,33,27,20,16,13,9,5,3,0,0,0,0,0,0,0, -0,0,2,13,21,28,30,36,57,76,130,224,227,196,187,197,175,151,196,168,120,143,180,180,163,118,101,76,58,62,91,126,132,153,182,180,191,208,241,250,252,246,235,231,240,252,253,254, -254,250,249,248,240,241,228,193,148,137,151,151,161,213,236,236,242,241,246,252,254,253,254,253,252,254,254,254,254,255,254,253,242,236,225,173,161,155,130,101,61,65,99,99,72,79,66,62, -31,30,40,44,41,34,28,26,28,28,40,55,86,107,127,175,184,144,123,135,162,201,206,192,211,189,149,161,142,105,86,68,58,54,54,54,56,56,57,58,57,54,48,43,41,36,30,28, -24,21,16,10,6,1,0,5,10,15,21,44,65,73,100,122,108,121,115,104,127,156,179,156,123,123,137,147,154,171,147,102,83,75,68,73,80,99,102,101,168,227,151,149,135,100,102,77, -93,100,104,122,132,201,255,255,255,255,255,255,255,255,255,255,224,155,171,184,169,162,120,101,120,141,153,116,73,73,78,79,113,147,163,126,75,71,61,57,51,44,43,42,38,34,38,37, -34,27,23,20,17,17,10,5,2,0,0,0,0,0,0,0,0,0,6,14,21,28,29,33,48,90,136,194,201,187,200,198,161,150,169,114,85,99,129,156,161,122,106,105,104,109,135,168, -182,194,201,212,235,253,255,255,255,253,246,246,243,247,252,255,246,235,243,243,228,210,162,153,132,101,106,119,158,207,226,173,189,179,192,228,249,252,252,252,248,248,252,250,253,255,255,252, -243,231,229,212,171,143,120,114,116,120,120,94,31,62,91,76,38,24,35,36,36,29,22,13,9,12,23,37,62,95,121,122,121,120,106,134,163,179,198,194,210,185,165,165,121,107,85,71, -65,62,57,57,56,57,59,61,61,55,49,42,40,35,29,26,23,17,14,7,1,0,0,3,8,12,19,30,47,73,92,118,119,108,85,87,95,109,127,128,121,136,137,144,171,155,111,88, -85,75,71,79,87,105,132,133,167,211,158,172,140,91,77,73,76,66,83,123,160,222,255,255,255,255,255,255,255,255,255,255,245,168,170,185,175,169,126,111,128,118,135,101,75,72,83,79, -106,130,133,118,78,72,62,62,52,45,43,40,41,37,41,34,30,28,24,22,29,29,10,3,0,0,0,0,0,0,0,0,1,3,12,21,28,33,34,36,56,105,148,177,191,215,224,201, -187,193,148,80,70,95,168,189,167,146,136,153,158,169,184,199,203,218,232,240,250,255,255,255,255,254,246,221,204,222,243,252,242,229,224,210,193,184,156,120,109,88,87,141,197,193,171,146, -192,170,199,225,240,249,249,249,247,245,229,221,243,250,252,250,239,219,191,149,120,121,136,141,150,164,106,47,35,58,87,77,57,44,40,35,33,28,20,8,5,8,19,34,61,104,132,115, -105,104,122,158,183,192,199,205,211,198,193,179,127,102,90,78,73,72,61,56,56,59,62,62,59,54,45,38,34,28,27,22,17,14,12,6,3,0,0,0,2,9,16,27,41,63,90,101, -91,75,72,82,92,101,111,111,105,109,127,156,178,144,105,93,97,95,94,102,120,130,169,187,228,222,213,190,118,80,64,63,62,61,87,130,185,245,255,255,255,255,255,255,255,254,245,253, -222,175,171,192,194,183,128,114,109,100,125,101,62,69,78,86,94,87,104,132,109,72,65,55,42,35,43,57,61,48,41,31,27,31,29,27,31,27,9,2,0,0,0,0,0,0,0,3, -7,13,23,28,34,37,41,41,64,108,125,141,193,236,205,173,208,210,165,94,80,115,190,208,197,190,178,180,186,194,213,225,234,246,252,254,255,255,255,255,255,249,222,175,190,232,242,236, -232,227,198,177,155,161,189,165,119,85,79,147,172,189,182,169,235,217,200,220,242,254,253,250,248,213,173,177,224,242,242,246,234,221,184,111,107,153,164,125,120,154,146,92,79,83,90,62, -49,31,31,33,31,26,17,7,1,7,19,38,71,115,146,136,126,113,121,141,157,182,204,211,210,206,206,190,136,95,97,85,77,71,62,57,57,61,63,61,57,51,45,36,31,27,24,21, -14,9,9,8,6,1,0,0,1,8,19,28,38,49,68,72,68,69,72,79,91,100,99,95,92,95,125,148,137,116,105,102,142,134,120,162,198,165,180,240,255,241,208,190,129,75,64,59, -57,64,98,126,200,255,254,255,255,255,255,255,255,254,249,246,212,189,200,213,197,158,125,101,93,91,82,73,71,80,73,83,101,119,128,136,108,50,59,57,40,31,45,65,59,40,30,27, -22,28,31,23,19,15,8,2,0,0,0,0,1,6,8,13,17,26,33,35,42,44,48,48,65,94,115,143,187,227,196,184,199,192,162,123,139,150,175,186,190,191,196,197,200,208,225,238, -248,254,255,255,255,255,255,255,254,246,203,173,206,227,235,228,233,233,206,179,133,72,111,155,114,73,57,83,120,207,255,254,246,212,186,227,247,255,255,255,242,182,139,158,224,245,245,241, -242,240,203,151,175,190,167,133,162,148,114,104,116,98,64,33,17,15,22,26,27,19,13,6,2,7,23,51,77,106,144,135,142,144,153,143,151,175,205,201,204,203,200,182,143,121,111,94, -85,73,65,63,62,63,64,64,57,51,45,35,31,28,26,22,14,9,8,9,8,3,0,0,0,8,20,26,36,48,58,65,63,64,70,78,84,97,94,86,85,91,112,136,112,97,111,105, -155,137,122,167,227,226,220,247,255,246,178,143,119,79,65,66,72,77,94,118,201,255,247,247,245,255,255,254,246,249,253,252,225,218,215,210,157,125,107,98,102,82,62,76,77,72,80,104, -123,143,165,114,62,49,62,61,52,55,54,54,45,28,26,21,14,13,14,12,10,12,7,1,0,0,1,2,9,17,23,26,29,31,38,48,58,58,56,54,62,85,113,155,198,218,183,190, -193,167,126,129,139,144,146,148,176,208,224,217,212,224,238,249,255,255,255,255,255,254,252,248,245,242,229,224,236,239,224,224,232,212,154,106,92,47,58,78,63,47,42,47,83,187,255,255, -253,247,250,255,255,255,255,253,252,217,185,191,229,247,249,246 -}; - - -unsigned char stringymap[TEXSIZE * TEXSIZE] = { -79,86,98,116,137,155,173,189,207,226,243,251,247,231,201,157,106,64,37,19,7,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,7,27,49,70,112,175,212,224,233,236,231,225,215,207,209,215,221,232,242,248,251,251,252,251,251,248,246,246,246,246,246,246,246,246,246,246,246,246,246,246,247,248,248,249,240, -229,227,227,235,249,250,235,225,228,235,238,243,247,248,246,240,225,198,164,135,109,81,54,39,37,39,45,54,64,70,72,73,80,86,93,103,112,117,118,118,118,118,119,116,106,91,78,69, -57,43,30,17,7,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,0,0,0,0,0,0, -0,0,0,4,15,32,49,57,59,59,59,59,58,56,59,67,76,85,93,102,118,145,174,200,222,238,245,246,239,220,186,143,103,62,31,13,5,1,0,0,0,0,3,34,83,117,121,105, -85,71,63,53,46,41,41,41,41,41,45,54,64,69,70,71,114,133,157,179,200,217,231,240,243,242,230,201,159,121,98,87,86,87,84,76,62,46,32,18,8,2,0,0,0,0,0,0, -0,0,0,0,0,4,11,18,23,27,34,39,40,39,38,39,47,64,97,140,183,209,219,227,215,184,164,139,113,94,79,68,65,78,99,121,146,170,189,198,202,207,208,207,202,204,211,213, -212,212,212,212,212,212,212,212,212,212,212,213,213,212,213,200,182,169,153,142,138,137,140,159,188,200,202,187,158,173,203,218,227,238,242,234,228,223,205,162,119,94,82,80,78,76,76,75, -71,66,63,57,52,50,49,48,47,46,46,48,53,62,69,77,83,85,82,74,60,45,32,20,11,7,4,3,2,2,3,3,3,3,1,2,3,6,13,19,24,27,32,37,39,39,40,41, -42,42,40,38,31,18,7,1,0,0,0,0,0,1,3,8,15,26,43,60,77,87,88,85,84,84,84,85,87,98,115,122,120,118,118,119,120,124,130,142,158,178,196,214,233,247,250,245, -232,205,167,131,96,59,29,13,4,0,0,0,10,25,40,54,67,74,80,84,85,85,85,85,85,85,85,83,81,83,91,102,205,223,237,244,244,239,228,211,190,159,113,64,28,14,14,22, -34,48,62,76,86,91,91,85,75,63,51,42,35,35,40,42,42,38,30,30,40,55,69,78,82,84,86,84,83,91,110,137,177,212,238,243,229,204,184,152,108,74,61,54,51,54,59,70, -84,104,124,131,118,94,77,68,63,61,61,59,61,72,89,93,90,90,90,90,90,90,90,90,90,90,90,94,100,105,108,111,117,118,105,74,42,18,6,6,21,35,41,28,7,17,36,46, -54,74,95,93,93,111,156,204,206,179,122,74,45,38,46,51,52,53,52,50,47,46,45,41,34,25,15,7,4,9,19,34,54,70,83,97,109,118,122,124,123,117,111,104,99,100,103,104, -105,101,96,97,103,111,122,126,123,117,109,102,98,95,92,90,90,87,85,86,84,76,65,53,47,46,46,47,51,56,63,75,90,109,129,135,120,89,60,42,33,30,28,28,31,46,66,71, -67,66,65,65,64,63,63,63,65,71,81,99,127,163,198,224,241,249,250,242,227,199,161,128,99,77,60,49,44,44,45,45,41,40,48,56,63,69,70,70,71,74,77,84,102,132,162,185, -251,245,233,218,201,183,164,146,130,111,86,63,48,41,40,41,43,47,53,62,75,90,109,134,149,148,142,131,121,119,123,125,125,115,96,87,88,87,79,68,60,55,52,68,105,159,210,233, -236,210,167,124,101,102,119,129,126,117,111,111,116,117,114,110,110,115,120,121,110,91,74,59,42,27,13,3,0,0,2,4,4,4,4,4,4,4,4,4,4,4,4,6,8,12,18,30, -51,79,107,120,113,91,65,41,21,6,0,0,0,0,0,0,0,0,0,0,0,0,18,54,78,125,182,193,177,139,102,105,110,112,114,114,114,114,113,111,105,96,83,82,82,84,106,133, -156,166,171,178,193,207,220,233,240,242,240,238,236,236,237,237,237,236,233,232,233,234,233,231,224,213,194,177,166,157,145,126,103,84,71,68,76,94,116,129,129,120,113,112,115,117,112,109, -108,113,119,119,108,90,73,58,42,27,13,4,0,0,2,5,6,7,11,17,24,29,32,33,40,58,79,90,102,127,164,196,216,233,244,249,252,253,249,242,232,220,207,199,195,195,194,186, -166,152,152,153,154,160,164,165,167,172,182,198,220,240,249,252,174,152,127,111,100,93,89,91,99,108,116,119,118,115,114,114,114,114,114,114,115,119,126,136,140,135,126,117,113,109,105,104, -104,95,75,58,44,30,16,16,37,67,110,175,220,229,198,150,102,55,37,42,60,87,114,129,126,108,95,92,92,88,75,60,47,37,35,40,51,64,75,84,87,83,73,57,37,20,7,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,34,66,96,114,120,115,102,81,58,42,29,19,13,11,11,11,14,22,33,43,53,65,77,94,121,151,181,166,111,100, -94,89,88,88,88,88,88,93,100,110,144,202,222,223,236,248,252,253,253,253,253,253,252,250,246,243,242,241,241,240,239,239,239,238,235,234,232,230,229,230,234,239,243,244,241,239,235,223, -204,183,167,156,150,150,154,156,146,125,111,110,109,105,94,81,69,61,58,62,72,83,93,100,103,100,91,78,63,52,48,56,74,86,99,122,142,154,159,162,171,194,214,219,222,228,235,239, -239,241,245,248,251,253,255,255,255,255,255,254,254,253,253,253,248,243,243,244,244,246,247,249,250,252,253,253,248,234,215,195,34,23,16,14,13,13,13,17,24,34,50,67,80,87,88,88, -88,87,87,87,87,86,81,71,58,47,37,33,31,30,26,24,23,18,7,0,4,27,66,123,182,216,229,213,162,102,50,29,34,51,73,86,89,89,89,95,97,92,86,85,84,82,78,71, -61,47,31,19,14,15,21,34,50,69,86,97,99,91,74,51,32,20,15,13,13,13,13,15,22,32,38,41,41,40,35,28,18,8,3,8,21,43,67,89,108,120,120,115,106,95,86,83, -82,85,90,100,110,116,120,120,116,107,93,78,63,46,31,23,18,15,14,14,14,14,14,17,23,36,123,239,255,252,240,223,207,197,196,194,187,176,165,149,133,122,116,114,112,112,110,109, -109,106,100,97,95,94,95,99,109,129,154,171,181,193,208,226,239,247,249,249,245,237,226,215,203,190,185,185,184,183,182,178,173,167,161,158,157,160,164,170,180,190,197,199,199,199,199,204, -217,224,229,238,243,244,244,244,246,244,238,232,230,222,204,188,180,175,172,172,175,182,191,201,213,222,229,232,233,231,229,225,213,206,207,210,211,211,209,207,204,199,187,169,143,106,71,50, -0,0,0,0,0,0,0,0,0,0,0,3,8,12,13,13,13,15,17,17,18,22,27,32,38,42,42,42,41,40,39,38,37,40,53,75,121,182,220,230,208,168,128,84,52,46,56,74, -87,92,86,77,76,81,90,94,85,77,74,74,74,74,75,78,85,88,85,76,63,49,42,43,49,61,78,97,116,133,141,134,114,91,77,73,72,72,73,75,81,86,87,88,88,88,87,84, -78,66,50,35,22,20,23,27,38,56,76,90,101,111,115,116,116,116,113,107,96,86,74,60,45,33,20,11,4,0,0,0,0,0,0,0,0,0,0,0,0,0,55,167,197,160,114,78, -57,49,50,49,45,41,42,43,46,47,48,47,46,46,46,46,45,40,30,21,17,17,17,18,21,29,42,58,74,92,115,143,166,184,195,204,217,233,243,248,250,249,249,250,250,249,250,250, -251,252,252,250,249,246,244,244,246,247,249,251,253,254,255,253,247,240,233,221,208,200,196,194,191,177,158,148,144,134,121,110,102,93,80,67,57,56,58,62,71,88,108,123,134,141,145,143, -136,131,129,123,113,103,92,80,68,57,43,28,15,4,0,0,0,0,0,0,0,0,0,0,3,4,4,4,8,10,11,13,19,31,38,40,45,55,67,78,84,87,86,84,83,82,88,105, -129,170,212,233,243,230,194,150,108,84,77,79,87,95,100,98,92,86,82,84,89,89,77,52,28,17,15,15,15,15,15,20,29,43,61,75,85,88,87,87,87,85,85,87,92,101,112,119, -113,94,78,74,74,75,75,73,66,55,47,44,44,46,50,60,70,81,87,87,81,78,72,53,34,27,28,33,40,49,55,57,56,52,43,30,20,12,8,3,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,3,4,11,41,57,38,20,15,18,29,37,39,43,53,66,76,82,85,86,86,86,86,86,86,86,85,82,75,72,71,71,70,71,72,75,80,87,93,99,99, -98,99,105,115,129,143,151,155,165,172,174,174,174,173,175,175,178,182,188,194,198,201,201,200,199,196,192,193,193,190,188,182,165,146,128,113,101,96,94,91,82,66,53,47,46,46,49,58, -67,78,85,84,78,76,70,52,32,26,28,32,40,48,54,55,55,51,42,30,20,12,7,2,0,0,0,0,0,0,0,0,1,4,8,11,12,13,24,41,53,57,58,61,67,71,72,74, -79,86,87,88,88,87,80,67,52,43,43,56,74,98,146,202,230,236,215,181,149,112,86,81,84,89,88,83,82,88,93,95,96,93,87,75,59,39,19,4,0,0,0,0,0,0,0,0, -0,0,7,15,26,40,49,53,53,48,42,40,42,44,47,48,47,41,33,30,28,24,20,15,8,3,1,0,0,0,2,5,11,22,37,53,66,74,78,67,54,50,49,48,47,46,46,45, -44,31,7,0,0,0,0,0,0,0,0,0,0,0,0,0,1,4,8,11,12,13,24,41,53,57,57,58,64,69,71,73,79,85,87,87,87,86,80,68,55,47,44,43,44,44,44,44, -45,51,63,72,75,76,77,82,89,91,90,84,81,88,93,94,95,91,85,74,58,41,28,22,26,33,34,34,34,34,34,35,35,36,41,47,57,67,75,77,78,72,66,64,65,66,64,60, -55,45,36,31,27,23,19,14,7,2,0,0,0,0,2,5,11,22,37,53,65,74,78,67,54,49,48,47,46,45,45,45,44,31,7,0,0,0,0,0,0,0,0,0,0,0,0,0, -34,40,45,48,48,52,68,86,88,86,85,83,80,76,76,74,68,56,46,42,37,29,18,16,31,57,102,156,192,214,230,209,157,105,53,26,17,13,22,47,65,69,67,63,59,59,59,60, -57,47,32,16,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,29,42,45,45,43,44,46,48,49,49,48,48,47,47,44,39,30,16,3,0,0,0,0,0,0,0, -0,0,0,3,8,13,16,17,18,25,31,35,37,41,42,42,42,27,4,0,0,0,0,0,0,0,0,0,0,1,9,19,34,40,45,48,48,52,68,86,88,86,85,83,79,76,76,74, -68,56,47,43,41,33,21,10,3,0,0,0,0,0,0,0,0,2,7,12,15,15,24,48,65,69,67,63,59,59,59,60,57,47,31,16,6,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,7,28,41,44,43,41,42,45,46,47,48,47,47,47,46,43,38,30,16,3,0,0,0,0,0,0,0,0,0,0,3,8,13,16,17,18,25,31,35,37,41,42,42, -42,27,4,0,0,0,0,0,0,0,0,0,0,1,9,18,51,44,38,34,33,35,41,42,35,29,28,24,18,14,13,12,8,2,5,18,36,53,76,124,179,212,228,219,192,160,115,55, -13,0,0,0,0,0,5,28,38,34,33,30,23,14,9,6,4,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,33,44,43,42,42,42,38,35,33,33, -33,33,33,35,39,44,50,51,39,18,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,3,5,6,6,6,3,0,0,0,0,0,0,0,0,0,0,8,28,44,52, -51,44,38,34,34,35,41,42,35,29,28,25,20,16,15,15,11,5,1,1,3,4,3,3,3,2,0,0,0,0,0,0,0,0,0,0,0,0,5,28,38,34,33,30,23,14,9,6, -4,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,33,44,43,42,42,41,38,35,33,33,33,33,33,35,39,44,50,51,39,18,4,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,1,3,5,5,6,6,3,0,0,0,0,0,0,0,0,0,0,8,27,44,51,10,4,0,0,0,0,0,0,0,0,0,0,5,14,28,45, -59,80,122,166,196,214,228,237,223,192,155,103,64,41,27,20,21,23,24,25,24,23,21,17,10,3,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,2,7,9,6,6,6,5,4,2,1,1,1,1,1,2,4,8,17,33,49,51,38,20,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,3,10,23,43,52,42,28,14,7,3,2,1,1,1,0,0,0,0,0,2,7,13,18,23,24,27,33,41,50,56,58,57,52,44,37,31,27,24,23, -24,24,24,24,24,23,20,16,8,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,2,7,9,6,6,6,5,4,2,1,1, -1,1,1,1,2,5,13,29,46,47,35,17,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,7,20,39,49,38,25, -25,25,25,25,27,31,32,34,41,58,84,115,137,157,183,206,220,232,245,241,230,220,207,186,159,138,124,115,108,103,102,103,104,105,105,107,106,105,97,77,52,38,35,35,36,34,28,21, -15,10,5,2,2,2,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,2,15,34,49,52,38,18,7,4, -4,5,6,10,14,20,24,25,25,25,25,21,16,10,5,5,5,4,2,1,1,4,9,15,25,36,46,52,47,26,7,0,0,0,0,0,0,0,0,0,6,16,26,40,56,72,85,97, -103,105,108,115,121,128,130,130,128,125,120,114,109,103,100,100,102,103,104,105,106,105,99,82,62,53,52,54,58,61,57,43,25,10,2,0,0,1,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,1,12,22,27,40,57,70,71,58,41,33,32,32,33,33,36,39,44,46,47,47,47,47,45,40,35,31,30, -30,30,28,28,28,30,33,39,46,56,66,72,68,50,33,25,182,181,181,181,184,190,193,197,205,220,233,244,247,247,244,236,229,219,201,177,163,154,149,144,142,143,143,144,145,145,147,148, -150,151,152,153,154,155,154,149,137,128,125,125,125,124,115,105,95,82,68,58,56,57,56,47,40,39,39,38,37,37,38,38,37,33,25,13,3,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,1,12,33,52,58,59,64,68,70,70,73,78,83,83,83,84,84,83,81,75,61,45,41,41,39,34,32,34,39,46,50,51,47,37,25,11,1,0,0, -0,0,0,2,9,18,29,45,67,90,109,125,139,146,151,153,153,151,149,148,146,143,140,138,137,136,137,137,137,139,140,142,145,147,149,153,159,168,182,194,200,201,204,208,210,213,211,203, -185,153,125,95,72,61,54,45,39,38,38,38,37,37,38,38,37,33,25,13,3,0,0,0,0,0,0,0,0,0,0,0,5,21,40,68,115,155,177,182,181,183,188,194,199,197,194,195, -196,197,197,200,202,205,206,206,206,206,206,205,202,197,194,192,192,191,189,189,190,192,195,197,200,199,198,193,187,182,182,181,201,204,208,214,220,224,227,230,231,227,218,206,197,189,178,164, -154,146,137,128,119,111,103,100,101,107,112,117,122,127,130,131,134,136,137,140,144,151,155,156,156,156,155,155,155,157,157,158,157,154,149,144,142,143,142,137,130,126,126,126,126,128,130,131, -130,126,115,91,59,43,41,41,41,41,43,46,40,26,13,7,5,5,5,5,5,5,5,5,4,4,5,19,49,86,113,125,125,117,102,90,82,71,63,61,61,61,62,66,70,61,47,43, -43,46,47,49,48,44,38,31,22,11,3,0,0,0,0,0,7,18,32,50,73,95,113,130,145,154,157,158,158,155,151,146,141,136,132,125,116,106,98,93,94,98,103,108,113,118,122,125, -128,131,134,137,143,153,163,173,181,186,186,183,180,179,179,187,201,217,224,225,219,204,177,152,136,126,122,121,121,124,127,128,127,123,113,88,56,40,38,38,41,42,51,70,67,54,63,93, -129,169,201,219,230,220,206,201,201,200,200,203,212,222,229,232,232,229,224,220,217,214,212,211,211,211,212,213,214,212,210,209,209,209,211,211,211,210,206,204,202,201,199,199,199,198,199,198, -97,118,138,153,162,166,168,169,169,163,152,138,123,107,91,78,68,62,58,51,41,32,25,23,24,29,34,40,47,53,56,57,58,60,61,63,69,87,104,103,92,85,83,83,84,88,96,106, -117,129,139,143,144,146,149,145,135,130,129,130,134,143,151,156,159,160,160,153,130,116,114,114,114,114,117,120,111,89,73,63,58,58,58,58,58,58,58,58,58,58,60,71,84,93,90,81, -70,54,37,26,17,11,7,6,6,6,6,9,12,11,7,6,6,8,11,12,12,8,3,0,0,0,0,0,0,7,16,34,65,94,117,134,148,155,158,159,159,155,147,137,123,107,92,78, -68,62,56,49,39,31,24,22,22,26,31,37,43,49,53,54,57,58,60,62,68,86,103,102,90,83,82,81,83,87,95,104,117,131,145,160,175,197,222,228,222,209,196,187,172,164,168,172, -173,173,173,167,146,132,136,155,185,187,205,231,226,214,224,236,238,227,207,185,148,113,95,90,90,90,92,101,111,116,113,103,94,81,67,58,52,48,44,44,44,44,44,46,48,47,45,43, -43,45,47,48,48,45,42,40,39,38,37,37,39,45,56,68,139,149,154,156,156,152,146,135,117,93,72,54,38,25,16,10,6,4,4,3,3,3,3,4,4,4,5,6,8,9,9,9, -10,10,11,12,14,22,34,39,38,36,36,35,35,37,42,47,53,65,75,80,81,85,88,79,65,56,52,49,52,61,73,87,99,104,102,97,91,88,88,88,87,87,89,89,82,74,77,82, -85,85,85,85,85,85,85,85,85,85,84,78,62,42,23,11,5,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,3,14,35,65,89,115, -141,154,158,159,158,154,147,137,118,94,73,55,38,25,17,11,7,5,4,3,1,0,0,0,0,0,0,1,3,4,4,4,5,4,5,5,7,13,21,20,14,10,10,10,10,12,16,22, -30,41,53,58,59,65,83,95,105,135,154,167,185,196,200,205,210,212,211,210,207,219,237,247,248,232,243,235,218,207,193,168,143,120,101,90,84,81,80,81,81,81,80,74,59,39,20,8, -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,9,30,61,91,112,159,155,147,135,116,92,72,53,34,18,8,2,0,0,0,2, -11,21,29,38,49,58,65,69,70,69,69,69,69,69,68,69,69,70,70,74,77,83,101,120,129,131,131,131,131,131,131,131,131,131,132,133,133,133,132,126,116,106,92,77,71,69,65,57, -47,35,26,19,15,13,12,13,13,14,14,13,11,11,17,24,28,29,29,29,29,29,29,29,29,29,26,18,7,0,0,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,14,30,53,84,118,143,154,158,158,156,148,135,116,92,72,53,34,18,9,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,2,3,3,3,2,0,0,0,5,12,32,53,56,58,62,63,63,62,61,95,136,122,87,74,96,76,51,42,35,29, -27,26,26,27,27,28,28,28,28,28,26,18,7,0,0,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,14,29,53,84,117,143,155,158, -126,101,73,50,32,17,8,1,0,0,0,0,21,52,84,113,136,147,149,159,173,183,190,193,193,193,193,193,194,194,193,193,193,194,195,198,200,205,217,229,232,233,234,234,233,233,233,233, -232,232,232,233,232,232,231,229,226,220,211,200,194,191,184,168,144,115,88,64,41,22,9,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,5,9,17,31,54,84,112,136,152,158,158,152,139,124,105,76,50,32,17,8,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,5,9,17,31,54,84,112,136,152,158,159,155,148,39,20,5,0,0,0,0,0,4,23,66,129,184,218,235,243,246,243,242,243,245,247,247,248,248,248,248,247,247,248,248,248, -248,248,248,247,247,247,247,243,240,239,239,239,238,238,239,239,239,238,239,239,239,238,239,241,243,244,247,247,248,247,246,245,238,225,209,190,160,123,93,67,42,18,4,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,4,4,4,4,4,4,4,4,5,7,10,16,22,27,35,49,62,76,94,116,136,152,158,159,157,147,123,90,62, -41,24,10,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,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,1,3,3,3,3,3,3,3,3,3,5,9,16,22,26,35,49,62,76,94,116,136,152,158,159,157,149,130,99,72,6,12,20,25,28,34,50,89,133,180,225,250,253,247,238,232, -229,227,225,222,216,213,209,206,206,206,205,205,205,205,205,205,205,205,204,202,199,196,183,165,153,149,149,149,148,148,149,149,149,148,148,149,149,148,151,156,164,174,187,200,206,207,213,225, -238,245,248,248,241,227,211,191,157,106,57,25,10,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,14,23,32,44,55,61,62,62,62,62,62,62,62,64,69,80,93,103, -110,121,134,143,149,155,159,159,157,150,134,110,75,43,20,8,1,0,0,0,0,0,0,0,0,0,1,3,8,16,22,26,25,20,12,6,3,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,1,4,7,16,24,24,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,10,22,28,33,40,48,55,66,75,79,80,80,80,80,80,80,80,80,81,84,93,101,108,120,132,141,148,153,156,157,155,147,131,105,75,46,23,11, -136,156,173,183,188,197,214,238,252,255,254,241,212,178,149,134,129,125,120,111,103,94,88,86,87,87,86,84,84,84,84,84,84,84,83,79,77,72,61,46,37,34,34,34,34,34,34,34, -34,34,34,34,34,34,36,39,45,53,64,76,83,87,96,117,148,177,200,219,236,244,248,248,240,215,173,124,83,55,32,15,6,1,0,0,0,0,0,0,0,0,0,9,31,61,87,105, -118,130,139,142,143,143,143,143,143,143,143,144,147,151,155,157,158,159,160,159,157,154,147,133,109,80,52,28,11,2,0,0,0,0,0,0,0,0,3,13,31,53,71,86,108,133,150,156, -154,142,120,99,83,70,54,39,26,14,7,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,1,4,13,29,58,96,117,107,71,22,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,24,49,98,144,176,187,194,201,207,211,216,220,222,222,222,222,222,222,222,223,221,216,207,195,185, -175,168,167,166,165,162,156,144,120,93,73,71,88,108,117,124,252,255,255,254,250,244,233,219,217,210,181,146,118,90,64,47,38,32,26,20,16,12,10,12,16,17,18,16,13,10,9,8, -8,8,8,8,7,6,4,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,5,7,8,9,12,20,35,55,78,107,143,173,197,219,239,247,242,226,202,177,142,100, -65,38,19,9,4,1,0,0,0,10,32,67,110,141,153,157,159,160,159,159,159,159,159,159,159,159,159,158,158,157,153,149,146,141,131,118,104,90,71,49,28,11,2,0,0,0,0,0, -0,0,1,9,27,52,83,119,161,194,211,221,232,241,245,245,245,243,237,229,220,210,195,175,150,121,98,77,47,21,7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,2,7,31,80,136,171,166,102,35,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,23,73,131,169,203,229,229,225,231,236,237,237, -238,238,238,239,238,238,238,238,238,238,238,239,244,249,250,247,238,230,226,224,221,216,208,193,176,168,178,204,229,244,248,250,199,194,180,148,119,98,75,55,50,46,32,20,21,22,18,11, -6,3,1,0,0,0,0,0,2,5,9,9,9,7,6,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,3,7,16,32,51,75,110,158,204,232,245,248,246,235,214,185,151,112,81,61,41,24,22,40,73,113,143,156,158,156,149,142,133,122,115,113,113,112,112,113,113,112,111,108,99,85,73, -66,57,44,30,21,14,6,1,0,0,0,0,0,0,0,3,16,42,73,111,153,192,218,237,245,242,235,228,216,199,184,180,181,192,208,222,230,236,243,246,244,237,228,214,183,141,105,69, -34,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,12,38,94,163,178,135,61,18,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,13,57,122,180,222,229,213,196,174,162,164,169,172,171,166,159,151,141,134,131,131,131,131,131,131,131,132,136,144,158,172,192,206,205,201,200,198,198,198,201,204,210,214,212,206,203,201, -39,36,27,11,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,1,3,5,7,11,13,14,13,13,14,15,17,18,20,21,20,15,10,6,2,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,6,18,45,87,135,175,203,224,240,247,246,237,221,202,185,162,137,130,143,160,164,161,156,140,109,82, -66,53,41,35,33,32,32,32,32,32,32,32,30,28,31,28,17,11,6,2,0,1,0,0,1,1,1,3,10,26,48,81,130,178,212,233,245,243,233,214,184,149,124,112,98,83,72,70, -72,80,93,107,119,130,149,170,190,209,224,237,246,243,232,208,166,109,60,32,20,18,19,20,19,15,10,6,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,63, -131,175,167,125,62,36,36,36,36,34,33,34,32,31,37,64,114,165,199,205,192,171,139,123,133,146,153,156,153,137,105,78,61,48,36,29,27,27,27,27,27,27,27,26,25,21,19,21, -32,42,41,40,39,38,39,39,41,44,48,49,45,42,41,39,0,0,0,0,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,5,11,19, -28,37,47,57,67,77,85,90,91,86,78,67,54,40,30,25,25,25,25,24,21,16,10,7,5,5,5,5,6,6,6,8,14,25,41,53,56,50,40,37,38,39,44,61,85,118,159,193, -217,235,245,247,248,245,239,233,227,214,199,179,150,117,92,78,73,71,69,69,68,68,68,68,70,72,77,82,88,111,149,158,136,120,109,94,91,88,81,79,79,79,78,85,114,155,188,216, -239,245,235,218,190,153,120,93,71,57,53,57,61,65,68,70,72,72,71,70,67,65,65,70,78,89,104,129,167,198,221,241,247,232,198,159,127,106,97,94,92,85,76,66,54,40,30,25, -25,25,25,24,21,16,10,7,5,5,5,5,6,5,3,1,16,62,119,177,197,189,186,184,184,178,171,174,171,167,171,185,187,155,110,82,75,92,120,143,154,157,154,136,103,61,28,11, -5,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,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,2,2,4,9,18,30,44,61,78,95,110,122,132,139,143,144,141,136,124,114,109,108,108,108,106,102,92,80,70,64,64,64,67,72,75,78,85, -98,117,133,142,143,139,134,129,127,114,91,70,58,62,80,105,138,176,209,227,239,248,253,255,253,249,238,219,203,194,192,192,192,192,193,193,194,193,193,195,198,203,210,216,221,234,247,249, -245,241,237,229,227,225,219,217,218,218,217,221,234,245,244,232,204,164,122,91,66,49,44,48,56,67,78,89,98,107,116,120,122,121,118,112,104,95,85,74,63,54,47,45,55,71,98,143, -196,234,249,247,236,217,198,183,170,160,151,143,135,124,114,108,108,108,108,106,102,92,80,70,64,64,64,67,72,75,78,85,96,111,127,142,162,169,165,163,161,150,132,120,122,122,115,100, -80,67,73,96,124,147,156,158,153,132,95,56,25,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,4,6,12,21,31,38,51,68,77,79,79,80,83,88,97,107,118,129,139,148,157,162,165,163,161,159,159,158,157,156, -157,157,157,157,156,155,151,147,144,144,144,146,149,151,152,155,157,159,159,159,159,160,160,160,159,158,154,144,134,128,128,131,141,156,174,186,198,213,225,229,232,238,244,245,245,245,244,245, -245,245,245,246,246,246,247,248,249,251,252,253,253,252,251,251,251,248,245,237,236,235,229,227,228,228,228,229,222,189,147,111,72,43,29,28,34,44,57,71,87,101,117,132,146,155,157,156, -155,156,159,160,154,143,127,112,97,82,67,53,41,33,33,46,82,133,182,218,241,251,251,245,235,222,204,189,178,168,161,157,156,157,157,157,156,154,151,147,144,144,144,146,149,151,152,155, -157,158,159,158,156,156,156,156,154,153,149,140,130,125,123,124,129,138,148,155,159,158,150,128,90,50,21,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,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,3,27,45,52,61,75,92,104,122,147,166,175,191,210,217,218,218,218,218,220, -222,223,224,225,226,227,227,226,225,218,206,198,193,185,174,163,154,147,144,144,147,152,156,157,159,159,159,159,158,158,157,155,152,148,139,126,118,114,117,131,145,151,156,158,160,159,159,159, -159,159,158,156,150,136,120,111,117,142,174,196,209,218,227,236,243,246,248,248,248,249,250,250,248,243,235,228,225,222,223,215,182,149,130,113,109,107,99,97,96,97,96,97,86,55,28,17, -14,18,25,36,49,63,80,99,117,137,154,157,133,98,70,53,47,51,65,92,129,159,164,150,131,112,93,76,60,48,41,37,40,51,68,94,130,170,201,226,242,249,248,241,230,215,195,175, -160,152,148,147,148,151,154,156,158,158,159,158,158,158,157,155,152,148,139,126,118,114,117,131,145,151,156,158,159,159,159,159,160,159,158,153,144,121,85,46,18,3,0,0,0,0,0,0, -0,0,0,0,0,1,1,1,1,1,1,2,2,2,2,2,2,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,9,21,36,95,176,203,208, -209,215,226,232,239,244,245,245,242,235,229,228,228,229,229,229,229,229,228,228,228,227,228,229,233,239,243,243,242,236,223,205,181,148,122,109,101,98,101,109,117,122,123,124,124,120,106,88, -75,66,50,34,25,23,26,44,64,81,98,116,128,132,132,131,127,119,106,86,63,40,26,28,51,89,125,156,189,215,234,244,244,240,233,229,228,225,212,188,162,139,118,104,99,95,92,79, -48,21,11,7,6,6,5,5,5,5,5,7,6,5,6,10,17,25,35,48,62,80,101,122,144,159,140,76,20,0,0,0,0,0,0,0,13,60,133,168,159,138,117,96,77,63,52,41, -31,24,18,13,19,33,56,90,127,165,202,228,242,247,240,221,198,176,160,144,128,121,119,118,120,121,121,122,123,119,105,87,75,65,49,33,25,22,26,43,64,81,98,116,128,132,132,132, -128,121,108,89,64,38,15,2,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,2,2,3,3,3,3,3,2,2,2,2,1,1,1,0,0,0,0,0,0,0,0,0,0,0, -26,26,26,26,31,47,77,98,112,143,174,195,230,253,253,248,243,231,221,213,201,180,162,151,134,111,99,97,98,98,98,98,97,96,97,96,96,97,98,100,110,131,159,181,201,219,234,242, -242,227,208,192,170,134,98,73,54,42,38,36,36,32,21,10,3,0,0,0,0,0,0,0,3,8,16,29,39,43,44,44,42,38,37,43,57,82,104,129,167,201,217,227,239,242,229,202, -165,133,111,102,99,92,73,47,28,18,12,9,8,8,8,5,1,0,0,0,0,0,0,0,0,0,0,1,3,5,9,15,21,29,41,55,72,93,115,140,160,144,63,0,0,0,0,0, -0,0,0,0,0,0,42,136,172,157,134,111,91,71,54,40,27,19,13,7,3,1,1,3,12,31,60,97,136,176,215,237,244,241,235,225,207,190,169,139,109,83,68,60,51,39,26,15, -9,6,3,0,0,0,0,0,2,8,17,29,39,43,44,43,40,33,24,14,5,0,0,0,0,0,0,0,0,1,3,4,4,5,4,5,5,5,6,7,7,8,8,8,8,8,7,7, -6,4,5,11,6,0,0,0,3,17,25,26,26,26,26,26,183,182,183,183,189,206,224,232,232,226,211,192,165,162,163,142,127,103,84,72,58,41,29,22,16,10,6,6,6,6,4,4, -5,5,5,5,5,4,5,5,8,16,28,41,59,84,116,151,189,219,235,241,245,238,216,188,148,111,89,80,78,77,71,57,40,29,24,24,24,24,24,26,28,29,31,31,31,33,42,59, -77,92,122,161,193,221,233,240,246,242,230,217,193,153,107,63,31,14,7,5,4,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,4,7,11,15, -21,31,43,58,77,98,122,147,163,122,24,0,0,0,0,0,0,0,0,0,0,0,9,103,171,166,142,118,95,73,54,40,28,20,14,9,6,4,2,0,0,0,0,5,18,41,82,126, -162,187,203,220,235,243,244,236,218,192,174,158,135,112,99,94,89,87,87,82,66,49,39,32,27,24,22,23,24,26,26,27,29,32,35,38,41,43,44,46,45,42,37,36,43,58,72,81, -83,83,83,83,84,84,84,85,85,85,86,86,86,85,86,85,81,72,83,105,74,57,85,98,121,165,183,183,183,183,183,182,201,200,201,200,195,177,141,120,106,79,50,33,20,25,29,19, -12,6,3,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,3,10,24,51,85,112,135,168,207,231,244,244,235,224,218,217,217,214,200, -181,164,155,154,154,153,154,158,161,167,179,176,170,170,181,200,216,225,237,245,244,234,220,206,183,154,129,109,82,53,28,13,6,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,1,3,4,7,10,15,21,31,42,57,75,96,120,145,163,139,47,0,0,0,0,0,0,0,0,0,0,0,28,126,174,164,139,115,91,70,53,39, -28,19,14,9,6,4,2,1,0,0,0,0,0,0,3,15,30,46,62,85,116,143,174,206,230,242,245,245,242,236,231,228,225,223,223,220,206,190,178,168,162,157,154,154,154,155,156,161, -165,168,172,174,175,175,176,176,177,176,174,174,185,202,213,219,220,219,218,219,220,219,219,219,220,220,220,220,220,220,220,220,217,218,227,235,215,210,227,231,233,218,202,200,200,200,201,200, -40,39,40,39,35,24,9,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,0,0,0,0, -0,4,9,17,35,67,104,148,187,210,223,227,227,228,230,237,243,244,243,244,244,243,243,243,243,247,254,255,254,254,254,253,247,239,225,200,171,141,116,87,54,35,34,39,44,47,49,48, -44,39,35,33,33,32,30,17,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,4,6,9,13,19,27,38,52,68,87,108,131,155,164,126,49,4,0,0,0, -0,0,0,0,0,34,113,169,170,149,126,103,82,63,48,35,25,18,12,8,5,4,2,1,0,0,0,0,0,0,0,0,0,0,0,3,10,20,38,66,102,132,150,168,190,204,213,218, -221,222,223,226,234,241,243,243,243,244,244,244,245,247,248,249,249,248,247,247,246,246,246,247,247,248,248,249,250,247,241,237,237,236,235,235,235,235,235,234,230,230,231,231,230,231,231,230, -228,231,227,214,206,180,138,120,107,66,41,39,39,39,40,39,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,23,46,68,86,97,101,107,118,139,162,180,187,189,189,190,190,188,183,186,199,204,209,218,228,236, -240,236,224,210,199,193,187,160,110,66,36,17,10,12,22,30,38,44,48,49,49,49,46,25,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,5,7,11, -16,22,31,42,56,72,91,110,131,152,166,154,112,68,40,25,20,23,35,60,103,151,175,167,147,126,106,86,68,53,39,28,21,15,10,7,5,3,2,1,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,6,13,22,35,56,75,89,100,107,111,116,124,141,160,173,180,185,189,190,190,190,189,184,180,177,175,175,177,180,187,190,185,178,178,179,178,168,148,133,128, -131,136,138,139,140,140,138,128,116,116,116,116,116,116,114,113,109,97,81,65,55,35,15,8,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,1,2,3,3,4,5,10,19,29,38,45,50,53,58, -65,73,81,86,90,99,109,114,110,104,100,90,81,81,95,118,150,180,198,207,213,218,218,223,228,219,192,152,97,49,22,7,1,4,9,11,12,13,12,5,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,1,3,4,6,8,12,17,22,31,42,54,69,85,102,119,136,153,166,167,160,152,149,151,161,170,173,165,149,132,115,98,81,65,52,40,29,21, -15,11,8,6,3,3,1,0,0,0,0,0,0,0,0,0,0,0,1,2,4,5,6,7,11,18,25,33,42,47,50,51,51,53,60,65,73,88,103,113,114,111,105,93,82,74,70,70, -71,73,79,92,106,113,103,77,59,58,59,60,55,46,41,41,43,48,51,53,54,55,54,49,45,45,46,47,45,44,42,40,37,30,22,17,14,11,10,8,5,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,19,29,33,37,39,40,41,45,46,46,42,37,29,21,16,11,10,11,13,18,29,45,63,81,92,94,87,74,64,62,67,74,81,92,103,110,107,97,103,128,162,194,222,230,209,173,132, -84,39,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,1,3,4,6,8,11,16,22,28,37,47,59,72,84,97,110,121,132,141,146, -149,148,146,138,129,118,106,95,82,68,56,45,35,27,20,15,11,8,5,4,2,1,0,0,0,0,0,0,0,0,0,0,6,24,33,36,41,42,42,44,48,50,49,45,39,30,23,18, -15,15,17,20,24,34,52,71,88,99,101,95,85,78,77,82,84,84,89,100,108,104,90,73,60,49,42,41,42,44,46,48,48,49,50,50,50,50,50,52,53,54,54,53,53,52,49,46, -42,38,34,28,23,19,15,12,9,6,4,3,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,1,0,0,0,0,0,0,2,4,15,39,70,88,104,122,128,127,125,121,117,110,105,101,97,95,93,86,79,68,50,40,43,52,65,75,76,75,73,64,53,46,43, -39,32,29,29,30,29,33,43,53,62,71,96,143,183,215,236,232,200,149,102,63,36,18,8,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3, -5,7,10,14,18,23,30,37,45,54,62,70,78,85,90,95,96,96,94,90,84,77,69,60,52,44,36,28,21,17,13,10,7,4,3,2,1,0,1,1,1,1,1,0,0,0,0,0, -10,37,49,50,48,47,46,42,35,25,16,9,4,0,0,0,1,3,5,7,15,26,42,58,73,81,86,88,80,71,69,68,68,66,65,67,69,72,77,87,95,95,86,76,71,73,78,84, -88,89,90,94,94,89,83,76,71,70,69,67,67,64,62,58,53,47,41,35,28,22,18,14,11,8,5,3,2,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,12,25,26,27,35,54,70,90,113,126,135,159,188,202,211,222,231,233,233,233,232,233,232,232,231,231,232,231, -231,230,225,213,201,197,195,191,179,150,119,93,63,37,18,8,1,0,0,0,0,3,8,22,45,69,81,78,74,78,95,126,167,210,236,239,214,172,122,79,53,40,32,27,25,25,25,25, -25,25,25,25,21,14,7,1,0,0,0,0,0,0,1,2,3,3,4,6,8,11,15,19,24,29,34,39,44,48,51,53,56,56,55,53,49,45,40,35,30,25,21,16,13,10,8,5, -4,3,1,2,14,28,30,31,31,31,31,28,21,12,5,0,0,5,10,23,35,39,40,41,46,64,83,107,127,130,130,130,133,136,138,141,147,153,159,160,158,153,150,150,132,92,57,46, -45,47,50,54,57,61,69,82,102,122,133,131,125,121,118,117,117,116,120,132,139,139,136,126,118,110,105,102,99,97,94,90,84,76,69,62,53,39,27,18,12,8,6,4,3,2,0,0, -0,3,8,15,22,24,24,24,24,24,24,23,24,21,14,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,50,72,103,151,198,217,227,232,232,230,223, -205,187,175,162,148,142,140,139,138,140,141,143,146,147,147,147,151,157,172,193,211,217,220,223,227,236,235,228,208,176,141,103,73,48,33,27,27,33,37,45,55,62,68,69,60,44,27,18, -25,51,97,159,210,239,234,199,149,106,86,80,80,82,83,83,83,84,84,84,82,75,63,46,26,7,0,0,0,0,0,0,2,6,11,19,27,30,32,34,36,37,40,42,44,44,40,33, -29,26,26,25,24,23,21,18,16,13,11,9,8,5,4,3,2,1,0,2,23,44,49,49,49,49,49,53,58,63,66,64,59,54,59,84,116,139,155,163,180,193,191,181,168,167,168,167, -166,167,168,172,176,180,180,178,176,177,178,181,194,208,185,153,125,97,86,87,91,96,101,110,119,126,133,135,131,124,115,109,107,108,113,122,129,135,146,160,171,177,188,198,198,196,195,194, -186,177,161,140,129,113,90,62,37,15,3,2,1,0,0,0,50,61,73,88,98,98,97,96,96,96,96,97,97,93,83,66,44,22,8,6,3,0,0,0,0,0,0,0,0,0,3,7, -12,22,42,65,103,149,188,219,234,221,204,197,184,181,180,171,155,145,137,130,122,117,108,87,64,49,38,28,25,26,26,28,33,42,57,77,89,87,80,76,84,108,136,167,200,223,235,235, -224,200,173,134,85,56,47,44,33,22,15,13,10,5,1,0,0,0,0,13,47,108,175,222,233,200,150,106,78,64,58,56,58,60,60,62,67,76,84,89,83,58,27,7,2,7,21,35, -53,66,75,89,99,100,100,101,102,103,104,105,104,103,94,79,59,38,24,17,13,9,5,5,4,3,2,2,1,0,0,0,0,0,0,0,5,11,14,14,13,14,15,26,51,86,126,161, -184,192,194,193,185,164,144,131,107,72,49,36,32,34,36,39,44,52,63,76,82,79,72,67,66,70,77,82,94,128,166,196,212,212,194,182,179,174,161,149,144,140,139,142,144,143,143,146, -155,170,184,187,186,191,201,214,218,217,214,205,204,203,201,199,199,203,209,212,210,210,203,182,155,115,62,20,4,5,16,28,116,115,115,110,106,117,129,135,139,140,138,132,129,131,137,145, -140,118,108,130,129,117,108,105,101,100,103,109,110,118,136,149,161,178,203,221,236,245,246,244,233,214,213,221,223,224,225,226,228,231,232,235,234,234,232,223,207,190,170,135,97,68,57,56, -53,51,49,43,30,15,6,4,4,6,11,22,43,69,104,143,176,205,227,235,202,136,75,45,31,24,23,25,26,27,27,27,27,26,20,12,6,8,27,72,147,207,229,212,174,135,95,62, -26,6,4,2,4,11,22,41,68,91,92,73,64,82,106,117,119,117,116,115,116,125,143,161,167,168,168,168,168,169,174,177,173,156,140,129,112,81,51,33,20,21,23,14,10,11,13,12, -12,9,4,1,0,0,0,0,0,0,0,0,3,8,20,37,57,74,82,83,75,57,45,37,30,26,28,31,34,38,42,50,60,69,73,70,60,51,48,49,53,60,66,72,76,80,88,102, -125,158,184,195,199,207,215,217,217,217,218,220,220,221,222,223,222,216,207,203,200,194,181,164,150,142,136,130,128,125,120,113,106,101,102,109,104,105,127,161,188,207,205,171,136,122,115,113, -177,162,157,154,163,199,214,211,210,211,207,187,183,184,190,201,209,212,220,242,251,247,243,242,240,239,239,240,240,245,254,255,255,255,253,251,253,247,229,210,198,195,182,150,132,121,118,118, -119,120,121,126,131,136,147,171,196,210,225,236,235,220,208,199,171,118,74,46,23,11,8,7,5,4,4,3,3,4,7,14,26,47,84,149,212,237,217,188,156,130,115,105,102,101,102,102, -102,102,97,87,78,67,49,33,34,64,120,176,209,223,224,209,159,112,91,63,40,35,41,58,91,134,175,187,186,191,197,186,146,130,139,157,178,199,219,229,229,230,230,230,230,230,234,239, -243,244,245,247,244,229,206,180,151,155,170,141,116,96,79,68,67,64,55,46,36,25,17,12,5,1,0,0,0,1,0,0,0,3,8,18,32,43,52,57,60,62,62,63,65,68,70,70, -69,64,58,59,69,77,81,84,81,80,83,87,91,97,102,107,110,114,122,133,143,156,175,195,203,205,206,205,205,206,206,204,199,194,187,183,177,171,162,153,144,139,136,134,131,127,121,115, -106,95,82,68,56,45,40,48,76,121,175,206,217,224,221,205,224,237,228,215,208,185,135,101,92,93,91,78,73,68,65,68,74,83,98,122,147,158,163,168,171,174,173,170,170,172,176,170, -165,162,161,166,183,177,139,111,93,78,58,32,17,10,5,3,3,3,4,5,6,10,16,27,42,56,75,107,148,182,197,208,229,229,212,191,162,135,121,102,75,55,45,41,31,17,13,14, -20,30,48,76,119,168,207,235,247,239,222,193,155,129,120,113,107,106,109,114,117,118,116,108,92,74,67,75,90,117,156,199,232,236,231,219,205,202,209,220,231,240,250,254,254,253,254,249, -226,222,229,226,218,205,177,146,135,134,135,134,133,128,126,126,131,137,143,151,170,200,223,238,246,252,255,250,236,210,167,129,103,87,84,85,85,81,77,70,58,44,30,21,14,9,7,6, -6,7,7,8,11,16,21,27,34,42,55,66,73,75,82,101,121,127,132,161,193,202,204,201,184,166,159,147,135,133,133,134,140,148,158,169,178,184,187,191,199,202,200,199,200,200,201,201, -200,201,202,203,202,201,200,195,187,179,172,165,157,149,143,136,129,121,109,99,94,94,99,108,119,129,131,122,114,132,166,197,187,161,135,122,118,109,98,94,94,94,94,94,91,83,71,61, -57,58,57,53,48,44,42,41,44,47,47,46,46,43,33,24,21,24,31,40,54,63,67,74,82,84,82,76,68,58,47,36,27,21,16,14,11,10,9,10,13,18,20,24,32,43,48,60, -100,147,176,198,219,227,229,229,219,206,197,194,176,144,131,132,135,128,122,113,99,85,80,101,145,178,204,228,223,200,185,164,137,125,129,143,151,147,153,164,171,176,176,172,168,174,193,215, -236,247,251,255,255,255,255,251,245,233,221,211,207,208,214,223,220,194,171,154,138,128,113,103,100,99,100,100,97,88,77,68,65,66,64,59,57,65,80,101,140,181,215,241,251,251,242,225, -196,161,138,136,142,144,147,151,155,151,137,117,99,88,79,68,61,56,54,54,53,52,56,74,102,123,156,184,192,194,202,221,232,234,236,237,226,220,221,225,236,240,241,238,229,224,219,212, -210,210,205,200,193,186,180,178,181,183,183,182,182,183,183,183,182,182,182,183,183,185,189,194,198,200,199,198,193,188,183,179,178,176,170,164,164,165,166,166,154,124,105,101,112,158,193,195, -61,68,82,93,100,104,106,105,105,105,105,105,107,114,119,119,119,118,117,113,108,97,84,70,57,45,36,32,28,25,23,21,21,22,23,25,29,33,35,36,44,54,64,74,81,87,90,90, -87,83,78,74,69,65,64,66,73,79,82,82,78,72,68,66,69,74,78,89,110,128,139,158,182,204,214,222,235,244,245,244,242,232,218,207,195,180,159,135,121,123,142,184,220,240,250,251, -245,242,242,245,247,238,229,231,233,236,238,240,243,241,233,223,222,222,223,220,213,200,189,181,170,149,124,103,86,72,67,76,90,85,86,94,99,102,104,103,104,104,104,104,106,112,117,118, -118,118,117,114,109,98,84,72,66,70,93,136,178,213,237,249,250,243,232,228,228,229,229,230,232,234,234,229,222,219,218,214,209,207,205,205,203,202,206,221,237,243,246,237,231,230,228,212, -193,188,187,174,155,150,155,163,179,196,209,225,236,242,246,250,251,250,245,238,229,217,206,195,190,189,189,189,189,187,182,180,179,177,175,173,169,166,164,165,169,172,176,180,184,185,182,181, -184,185,181,177,174,171,170,179,182,188,202,199,186,153,96,59,49,43,35,31,30,29,29,28,28,28,28,28,32,42,53,63,68,74,88,107,130,150,153,149,144,133,121,112,103,100,100,99, -99,100,101,105,107,106,100,87,75,66,58,53,53,58,65,79,95,107,112,110,105,101,98,96,93,88,88,89,91,96,105,109,105,101,101,102,102,101,102,105,111,120,121,115,121,139,145,144, -151,172,188,196,202,211,221,230,230,228,226,227,231,232,220,208,207,207,208,209,207,169,125,120,120,116,112,112,111,100,82,68,71,76,78,78,77,74,72,76,88,103,113,115,111,97,75,58, -48,42,35,30,30,29,29,28,28,28,28,28,32,42,54,64,70,76,89,109,133,152,155,152,145,133,122,116,119,138,166,203,237,248,236,208,185,182,182,176,170,168,175,190,203,208,212,219, -226,230,231,231,230,229,227,214,194,182,171,152,148,153,160,158,153,153,157,161,163,166,170,174,177,181,185,186,189,192,196,203,208,215,226,236,243,248,249,245,240,238,237,236,236,231,218,213, -211,210,208,206,204,192,178,173,171,169,166,167,168,168,164,160,159,158,155,154,164,188,203,212,206,194,165,141,127,105,80,66,115,101,79,58,43,33,28,26,25,24,24,24,24,26,29,35, -45,63,86,109,132,149,151,146,141,134,126,117,109,107,110,114,121,130,143,155,158,159,158,156,151,146,137,126,117,106,93,90,100,107,111,111,107,99,89,74,57,42,37,36,39,47,57,64, -60,58,64,70,71,71,70,70,70,68,59,46,39,37,36,34,37,45,53,58,62,69,83,104,122,130,130,129,127,111,81,59,55,54,54,54,50,30,12,9,9,7,6,5,3,1,0,0, -0,0,0,1,3,3,4,7,15,31,50,67,88,109,119,118,111,100,79,58,43,33,28,26,25,24,24,24,25,27,31,37,48,66,89,112,134,152,155,151,146,139,132,123,114,112,115,129, -165,212,244,241,210,180,163,158,157,153,150,147,148,143,135,137,145,151,155,157,156,152,145,129,110,99,96,97,103,111,122,130,132,135,144,152,156,160,164,168,171,174,173,171,171,172,174,177, -180,183,189,194,202,211,222,233,239,240,241,241,242,247,250,249,249,248,248,249,250,241,228,226,224,223,221,219,219,217,215,212,209,207,203,199,190,168,131,91,61,53,56,70,88,107,118,121, -91,107,119,120,114,108,104,102,101,100,100,101,100,101,100,103,110,117,119,113,103,91,76,62,50,43,41,45,54,69,87,101,114,129,143,150,148,147,149,151,153,154,155,156,153,139,111,86, -74,71,73,82,92,100,102,99,87,69,54,43,39,41,44,45,45,45,41,38,39,39,40,41,41,40,40,40,40,40,39,39,38,36,35,34,32,30,30,30,31,30,29,28,26,22,18,16, -14,13,12,11,10,9,10,9,8,6,6,5,5,4,3,3,3,2,2,1,1,1,0,0,0,0,1,5,15,33,58,80,96,110,119,119,114,108,104,102,101,100,101,101,101,102,101,104, -112,119,122,117,108,97,84,72,62,55,54,59,68,82,98,111,124,151,190,231,250,239,203,169,160,162,166,168,166,156,135,117,111,110,115,123,133,140,144,144,137,128,121,117,118,122,128,133, -137,140,142,145,149,154,158,161,165,169,172,174,177,180,182,184,187,188,189,190,190,191,193,197,200,201,201,202,202,208,215,218,217,216,214,212,209,197,180,174,171,168,164,160,158,154,149,143, -136,126,113,98,76,53,34,23,16,12,11,12,19,33,50,64,16,32,54,72,86,97,103,105,105,105,105,104,104,105,105,104,97,80,60,42,29,19,11,7,9,18,40,67,91,109,119,122, -120,114,103,89,76,71,72,73,76,77,78,79,76,65,47,30,23,21,23,29,39,51,66,85,100,109,104,88,78,78,79,80,82,79,61,46,47,48,49,50,50,51,51,51,52,51,50,50, -49,48,47,45,44,43,40,38,36,34,33,31,29,28,27,25,23,22,20,18,16,15,14,13,12,11,9,8,7,7,6,5,5,4,4,3,2,2,2,1,0,0,0,0,0,0,1,7, -19,34,53,72,86,97,103,105,105,105,105,105,105,106,107,107,101,86,67,51,40,33,27,25,27,37,58,84,107,124,134,136,134,128,121,130,166,219,243,208,155,121,109,111,113,108,97,88, -86,89,94,102,112,121,133,147,159,166,165,157,153,156,160,163,166,168,162,158,162,165,169,172,174,177,180,183,185,186,188,189,190,191,192,192,192,192,193,192,192,191,191,189,188,186,186,184, -182,178,173,168,163,156,149,143,138,133,128,124,120,115,108,101,92,82,72,61,51,42,33,26,19,14,9,5,2,0,1,4,0,0,4,17,34,49,57,58,58,54,49,47,48,53,58,58, -51,41,33,34,39,44,51,58,68,87,111,121,116,100,81,66,54,40,27,17,11,9,9,11,11,12,14,14,15,15,14,15,16,18,20,22,24,27,31,40,54,72,81,76,72,73,75,76, -79,77,66,57,59,60,61,61,62,62,63,63,62,62,62,61,59,58,57,55,54,52,50,48,46,43,40,38,35,33,33,31,29,26,24,22,20,18,17,16,14,13,11,10,8,8,7,6, -5,4,4,3,2,2,2,2,2,1,0,0,0,0,0,0,0,0,4,17,34,49,57,58,58,55,50,48,50,56,62,63,58,49,44,47,54,61,68,77,88,106,127,138,134,121,106,93, -83,72,61,52,55,97,178,232,229,190,125,79,75,81,86,92,97,103,107,112,116,120,125,132,143,155,162,161,161,163,167,170,173,175,171,169,172,175,177,181,182,184,186,187,189,190,190,191, -191,192,193,192,192,191,191,191,190,188,187,185,184,182,180,177,174,169,164,159,154,148,142,135,130,125,120,114,110,105,99,92,85,76,66,56,47,38,29,22,17,13,9,5,3,2,0,0, -3,16,38,58,72,81,83,83,83,81,76,74,77,90,101,102,101,100,100,106,113,116,118,120,121,117,101,73,45,25,12,6,4,2,2,3,4,5,6,7,7,9,10,12,14,16,18,19, -22,25,27,30,32,34,35,37,39,44,48,51,53,56,58,61,63,64,66,67,69,70,72,72,73,74,74,74,73,74,72,72,70,68,67,65,63,61,59,58,55,54,56,56,52,48,44,39, -34,31,29,27,25,22,19,17,15,14,12,11,10,7,7,6,4,3,3,3,2,3,3,2,2,1,1,1,0,0,0,0,3,17,39,58,72,81,83,83,84,82,77,75,80,94,106,108, -108,108,110,117,126,131,134,138,140,138,125,102,81,64,55,51,50,51,54,55,56,59,88,147,204,239,226,169,127,109,106,109,115,120,125,131,135,138,141,144,147,151,155,158,161,163,166,169, -171,174,176,178,181,183,184,186,187,188,189,190,190,190,190,190,191,191,191,189,189,188,187,186,184,183,183,182,180,177,173,169,164,159,153,149,143,136,129,122,117,111,105,98,93,88,82,75, -68,61,52,44,38,31,23,19,14,10,7,4,3,1,0,0,50,74,88,86,76,67,62,61,63,69,74,75,79,93,104,105,105,104,102,97,91,85,78,70,62,47,26,9,1,0,1,1, -3,4,5,6,6,7,8,10,11,12,14,16,17,19,21,24,27,30,32,34,37,40,43,45,48,51,54,57,61,64,67,70,74,77,81,88,96,101,103,104,105,105,105,105,105,105,104,103, -102,100,98,97,92,85,75,69,64,69,86,93,90,85,80,74,62,50,41,35,31,29,27,26,24,26,31,34,36,36,35,33,30,25,19,13,7,3,1,1,1,1,0,0,0,0,0,17, -53,77,88,86,76,67,62,61,64,70,75,77,83,97,110,113,115,116,115,114,112,109,106,101,96,87,75,70,73,76,78,80,87,104,120,126,127,134,155,178,196,224,248,248,230,204,177,153, -139,139,143,146,150,153,157,159,162,165,167,169,172,174,175,178,180,182,183,185,186,187,188,189,189,189,190,190,190,190,189,189,188,187,186,184,183,181,179,178,176,176,183,185,183,180,175,170, -163,153,144,136,129,123,117,111,106,102,102,115,121,117,113,108,102,93,78,61,40,25,17,11,6,2,0,0,0,0,0,10,94,80,54,31,16,9,6,6,7,11,14,15,16,23,27,28, -28,28,26,21,16,12,9,6,3,1,0,0,1,2,3,3,4,5,6,7,8,9,10,11,13,15,17,18,20,23,26,29,32,34,37,41,44,46,49,53,58,66,77,85,90,94,99,111, -129,139,146,164,184,192,194,194,194,194,194,195,195,194,194,194,193,192,192,190,186,170,144,118,98,87,88,89,88,87,87,89,88,85,78,70,63,61,62,62,61,63,68,80,91,93,92,90, -88,85,78,69,56,39,24,13,6,3,2,2,5,14,39,79,89,75,53,31,16,9,6,7,8,13,17,19,24,31,39,43,46,50,52,53,54,55,55,58,70,90,121,154,175,182,183,184, -192,211,226,229,230,233,242,247,247,247,248,252,255,255,249,230,201,186,179,173,171,169,170,172,174,175,177,179,180,182,184,186,186,187,188,189,189,189,190,190,190,189,189,188,187,187,186,184, -183,181,179,177,175,173,170,167,165,164,169,169,166,165,164,163,160,156,149,139,131,126,123,119,115,111,119,185,220,217,216,215,213,210,205,195,170,143,132,119,103,72,39,19,6,11,34,65, -49,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,4,5,5,6,6,6,7,8,9,12,14,16,17,19,21,25,28,31,33, -36,39,42,46,50,57,69,82,104,137,167,183,187,189,193,207,224,232,235,243,249,249,249,250,250,250,250,250,250,249,250,250,250,249,249,250,249,246,235,217,194,163,129,105,92,83,74,71, -72,76,79,80,80,78,73,69,66,60,54,61,71,73,72,70,71,75,81,88,92,92,83,71,57,48,44,47,57,73,90,80,45,19,4,0,0,0,0,0,0,1,3,5,7,11,14,18, -23,28,34,40,48,60,77,105,152,195,226,243,247,248,248,248,249,247,240,238,239,237,230,215,210,210,212,217,229,242,250,254,249,243,236,227,218,207,202,202,199,194,191,189,188,187,188,189, -190,190,191,190,190,190,190,189,188,187,186,185,184,182,179,177,175,173,171,168,164,162,158,154,151,148,145,141,137,133,130,129,129,130,129,128,124,119,113,107,101,93,89,113,130,128,126,123, -122,124,132,149,176,189,186,184,185,192,189,177,146,135,127,103,119,73,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,16,26,30,33,34,34, -35,34,30,23,17,14,13,14,15,17,20,24,27,30,33,37,41,47,54,66,86,120,158,183,207,233,246,249,249,249,250,250,247,242,241,236,225,217,216,216,217,217,217,217,217,217,217,217, -216,215,214,213,216,228,241,248,250,243,224,201,187,170,144,126,114,95,80,74,64,54,45,39,35,31,25,23,24,21,21,19,18,20,24,31,43,59,74,85,88,90,90,89,87,81,62,30, -3,0,0,0,0,0,1,2,2,3,5,7,11,15,18,22,29,39,49,66,98,142,179,211,239,250,245,232,217,213,213,214,212,199,180,171,169,166,156,145,142,145,151,157,171,189,210,227, -239,247,252,253,252,248,245,245,241,233,228,221,211,201,195,193,191,191,190,189,188,188,187,186,184,183,180,178,176,174,171,168,165,162,159,155,151,146,142,138,135,132,128,124,123,124,121,117, -114,111,108,107,105,101,91,78,66,56,49,44,42,40,37,34,32,31,31,36,48,65,77,86,94,107,128,155,184,190,194,180,145,174,178,129,91,53,14,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,1,1,11,38,52,53,52,53,53,53,55,58,58,55,49,42,35,31,38,47,51,53,57,61,72,91,110,128,157,191,224,243,248,249,242,224,210,208,209,211,207, -194,183,182,177,167,163,163,165,166,167,167,167,167,166,166,164,162,160,158,155,155,164,178,195,215,234,247,250,249,247,238,230,223,202,182,168,139,105,78,62,56,54,51,44,33,23,17,15, -11,9,7,5,6,9,16,26,35,43,45,42,34,20,7,0,0,0,0,0,0,0,1,1,2,3,5,8,11,17,30,54,82,105,128,163,204,237,249,249,237,211,187,170,157,153,154,155, -155,151,147,146,145,143,139,136,135,138,141,147,153,161,171,184,197,208,221,231,240,247,248,249,251,253,253,251,245,234,225,216,208,202,197,194,191,186,182,180,178,176,172,169,166,163,160,156, -151,147,144,140,138,139,139,145,151,151,148,152,164,174,178,179,181,184,184,185,183,179,168,149,126,103,82,63,44,30,22,20,18,16,13,11,9,11,17,25,33,38,39,37,35,30,43,89, -5,28,88,144,171,180,152,113,87,63,41,33,28,26,26,26,26,26,26,26,26,31,51,73,80,83,93,98,95,94,95,97,102,106,104,108,116,121,123,124,132,154,169,171,169,171,173,185, -208,223,232,243,249,245,231,215,207,187,161,151,152,156,157,156,153,152,154,157,159,162,164,166,167,168,169,169,168,167,166,165,162,159,156,153,149,146,144,145,153,170,190,205,211,224,236,239, -244,249,249,249,239,220,195,176,170,169,167,159,135,105,90,73,54,41,36,29,19,9,4,2,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,3,6,10,19,38,71,120,168, -205,223,233,245,250,238,214,192,164,136,127,127,126,126,127,128,129,131,135,140,146,151,156,159,159,159,159,160,161,165,169,174,179,183,189,197,206,215,220,222,228,235,240,245,251,253,252,248, -244,236,230,228,222,210,196,185,178,175,171,168,165,161,157,153,152,158,165,172,181,190,200,213,219,218,218,226,235,240,244,245,246,247,246,247,246,245,243,238,229,215,195,169,131,90,58,37, -21,13,9,6,4,2,0,0,0,0,0,0,0,0,0,0,15,9,17,35,70,127,183,207,215,215,206,195,179,173,174,174,173,173,173,173,174,179,197,216,221,221,221,221,221,221,221,224, -231,232,221,218,220,222,224,227,235,246,250,250,248,248,248,249,248,244,241,234,222,206,187,177,174,170,168,170,172,174,174,174,173,172,172,173,176,179,180,182,184,184,185,185,184,184,184,182, -179,177,174,170,166,161,156,149,145,141,141,142,141,148,158,161,171,189,200,214,231,242,247,247,246,246,246,245,239,227,219,206,183,166,159,148,119,87,61,40,30,28,27,27,27,26,26,26, -25,24,24,25,24,25,30,48,71,82,94,121,157,197,233,247,244,236,231,218,193,160,132,120,115,114,118,121,123,124,126,126,127,129,129,131,134,138,144,152,160,167,172,175,177,178,182,186, -191,196,200,204,209,213,216,217,218,221,223,228,236,243,248,251,252,252,252,252,251,247,238,226,219,216,215,212,211,207,202,204,214,226,235,240,244,246,247,246,244,243,243,238,227,211,201,196, -192,187,184,182,180,179,185,203,221,233,237,233,223,212,191,162,129,102,83,63,45,35,30,27,26,25,25,25,25,25,26,24,109,114,129,143,161,187,209,224,234,245,251,253,251,250,251,250, -250,250,250,250,250,250,246,237,232,232,232,231,231,230,230,229,227,227,227,227,228,228,229,228,226,211,194,192,198,205,212,217,214,208,203,193,181,173,169,168,170,173,177,179,182,185,189,193, -196,196,195,194,193,191,190,189,189,188,187,188,188,188,189,188,187,187,185,182,180,175,171,165,159,152,145,138,132,126,120,115,114,117,120,128,144,164,184,194,192,188,187,193,213,228,234,239, -244,246,245,244,235,220,198,171,158,156,156,155,156,155,155,155,155,154,154,154,154,154,162,186,210,219,224,236,244,244,227,194,161,141,136,127,116,109,111,117,123,127,130,132,133,135,136,134, -132,132,132,132,134,135,136,140,145,151,160,170,179,187,197,206,215,220,221,221,219,218,216,216,214,214,213,212,214,217,221,227,232,236,238,237,238,245,249,250,250,250,250,249,249,248,247,248, -248,243,237,230,219,207,194,176,160,152,148,137,117,93,77,73,71,71,69,68,67,65,66,80,101,125,152,177,187,196,220,238,240,232,220,203,186,173,163,157,155,156,156,155,153,150,141,125, -227,232,238,243,245,245,240,233,226,220,204,183,175,178,181,185,190,196,199,200,203,202,188,166,156,154,155,154,153,156,158,151,139,132,126,121,118,119,119,120,117,104,96,106,126,147,165,176, -176,168,155,143,135,135,137,141,146,152,159,164,170,176,182,187,193,195,196,194,190,183,175,168,161,155,151,151,152,156,160,165,171,176,182,184,185,185,182,178,173,167,161,155,151,146,140,134, -131,127,122,119,116,116,119,119,114,107,100,94,98,111,120,136,160,175,179,190,217,234,243,246,245,245,245,245,245,245,244,244,245,245,244,245,245,244,246,245,237,230,225,212,191,167,133,106, -100,108,120,131,141,149,155,160,164,166,168,169,169,172,173,167,158,152,147,143,141,141,142,143,146,152,160,170,183,195,207,215,217,215,208,202,196,193,190,188,187,186,185,183,182,181,182,185, -190,199,205,208,211,214,220,224,223,219,216,213,212,212,212,211,205,190,170,151,135,116,97,82,67,58,55,55,56,57,54,54,58,61,61,61,60,58,56,56,54,54,60,74,90,89,104,144, -185,205,210,215,227,239,244,246,246,246,245,245,245,244,239,231,225,220,198,181,176,170,155,125,102,92,92,97,105,114,122,129,135,137,137,136,133,131,126,120,118,118,119,119,124,137,147,148, -144,138,129,119,113,112,111,112,115,121,131,140,147,150,148,138,124,114,109,109,114,121,129,138,145,153,160,168,173,178,179,178,174,166,155,142,129,117,106,96,89,84,79,77,77,81,88,97, -109,124,139,154,167,178,184,187,186,185,182,179,175,168,161,154,145,135,125,118,111,104,98,93,91,90,86,71,47,37,36,38,45,49,50,61,87,114,145,168,174,174,174,173,173,173,172,172, -173,172,172,172,172,172,170,154,122,105,116,125,123,121,122,131,142,151,158,163,167,172,176,179,182,184,185,187,189,196,201,201,198,195,189,183,179,178,177,178,180,185,191,196,200,202,201,195, -188,181,176,173,172,172,171,170,169,167,165,164,162,159,155,153,152,154,158,164,173,182,188,194,196,191,186,180,172,168,167,164,160,155,147,139,132,123,113,107,102,97,99,102,98,89,80,73, -64,55,47,44,41,40,40,40,43,47,47,35,17,17,19,27,49,74,87,89,98,119,144,160,170,174,175,175,177,184,196,212,83,85,64,42,37,36,31,17,6,14,64,108,115,110,104,95, -83,71,62,55,48,47,47,47,47,48,49,51,58,71,85,101,119,135,143,147,151,160,167,170,172,174,176,167,146,126,108,95,91,94,103,113,121,130,139,147,155,163,169,174,176,174,164,147, -125,100,75,54,38,30,26,28,30,27,26,23,21,20,22,26,32,43,57,76,100,126,149,167,180,187,192,192,189,183,177,170,158,146,132,120,110,102,93,87,83,81,77,69,56,48,42,37, -31,26,21,18,18,21,30,39,41,40,38,38,38,38,38,37,37,37,36,36,35,35,34,27,15,21,72,116,126,124,123,122,118,115,117,120,122,127,134,138,143,145,147,150,153,160,166,174, -183,190,195,196,198,202,205,207,208,209,210,205,192,180,169,161,156,156,158,159,160,160,160,159,157,155,153,150,147,145,141,136,132,127,123,122,126,138,156,180,194,193,187,174,156,146,142,138, -135,132,131,129,130,132,133,132,134,141,151,153,144,129,116,99,78,58,43,32,26,22,21,20,22,27,30,26,15,11,12,10,7,8,11,12,10,11,17,24,30,33,35,36,36,37,44,56, -1,3,1,0,0,0,0,0,0,4,38,60,51,39,29,21,12,6,1,0,0,0,0,1,2,3,5,6,8,12,17,25,38,51,62,72,83,99,118,137,151,161,167,165,153,139,125,114, -109,108,113,120,129,137,147,155,163,170,173,171,162,143,117,85,55,30,15,7,4,6,8,10,12,10,7,4,3,2,2,1,1,2,5,11,24,45,74,105,136,160,178,190,192,191,191,190, -185,179,172,163,155,148,141,135,131,126,122,119,115,112,109,100,88,81,73,63,58,56,54,50,42,31,18,8,2,0,0,1,0,0,0,0,0,0,0,0,0,10,45,69,65,58,57,57, -58,62,70,78,86,93,101,107,112,115,118,119,120,121,123,127,131,138,143,146,152,160,170,181,190,195,198,197,189,179,169,159,151,148,146,144,144,144,143,142,140,138,136,133,129,126,122,119, -118,117,118,122,129,143,160,172,169,152,127,104,88,78,73,69,65,61,58,55,55,58,62,63,71,89,111,133,153,161,160,154,141,127,115,104,95,89,85,83,83,83,83,83,83,84,84,76, -67,61,55,48,45,45,43,41,34,24,13,3,0,0,0,0,0,0,0,0,0,0,0,5,9,14,21,28,28,26,24,24,23,23,23,22,20,14,10,7,5,3,2,3,5,6,8,9, -11,13,16,21,26,35,45,59,77,93,110,129,147,162,170,171,165,157,150,147,148,152,159,166,171,173,167,153,127,93,58,29,13,6,4,5,6,6,6,4,3,2,0,0,0,0,0,0, -0,0,0,0,0,3,16,41,76,114,148,176,197,198,189,181,177,176,176,177,175,171,166,161,158,154,150,146,144,142,139,129,117,111,105,100,104,104,100,100,95,82,69,53,34,19,7,2, -1,2,1,0,0,0,1,7,12,18,28,39,42,45,50,56,64,72,80,88,94,96,99,103,104,105,107,108,109,109,108,107,105,106,105,104,105,108,113,121,131,140,151,163,175,184,189,188, -181,172,160,150,142,138,135,133,131,127,126,123,120,119,121,128,135,143,151,157,160,160,148,126,101,77,60,50,44,40,35,32,28,24,21,18,14,15,21,34,53,75,94,110,122,126,121,114, -108,109,116,124,126,123,119,117,117,117,116,116,117,118,118,109,98,93,90,87,93,94,93,93,89,77,64,48,30,15,5,0,0,0,0,0,3,24,51,68,78,84,89,94,98,100,100,100, -100,101,102,101,96,88,79,70,57,45,35,26,22,21,21,24,26,27,30,32,36,41,46,54,67,81,96,113,134,157,181,194,197,198,196,192,187,186,188,189,186,177,159,129,88,49,22,8, -5,4,3,3,3,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,10,30,64,103,141,182,214,210,184,161,150,146,143,139,133,125,118,111,105,99,94,88,84,78,70, -62,57,54,54,58,58,54,56,57,56,60,63,58,51,31,6,0,1,0,0,1,23,51,69,80,86,92,100,107,111,115,120,125,130,135,139,140,139,137,134,128,122,117,111,107,105,104,103, -102,101,100,99,99,99,100,104,110,119,128,139,153,171,189,199,200,199,195,187,177,171,168,163,157,153,150,149,149,150,155,160,161,158,151,140,125,104,80,60,47,40,37,35,31,28,25,22, -18,15,14,18,27,42,63,81,90,87,77,64,49,37,27,20,17,20,29,39,45,45,43,42,42,43,43,43,44,44,44,38,33,32,33,36,44,46,43,47,49,49,56,60,55,48,29,5, -0,0,0,0,11,67,116,124,119,116,114,110,107,105,105,105,105,105,106,107,111,117,120,122,121,117,110,100,93,90,90,92,93,95,97,99,103,107,111,119,129,138,146,152,159,167,174,181, -185,190,193,197,198,199,199,196,187,169,137,95,52,20,6,3,2,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,7,24,58,100,145,202,237,231, -201,167,147,133,122,112,102,93,85,77,70,63,55,48,42,36,30,26,22,19,17,15,12,10,9,9,13,20,26,34,28,9,3,4,2,1,11,66,115,123,119,117,115,114,113,114,117,120, -124,129,134,138,145,152,157,161,162,160,156,150,144,141,140,140,138,138,138,137,136,137,139,143,148,153,157,160,163,168,173,177,179,179,179,179,178,177,176,172,165,160,156,155,153,149,141,129, -113,98,83,69,58,48,43,40,37,33,28,24,20,17,15,14,18,28,43,61,80,92,92,76,52,31,16,8,3,2,8,18,25,27,28,31,35,37,35,29,22,16,13,10,8,5,3,3, -3,1,0,0,0,0,0,0,0,2,6,12,19,28,23,4,0,0,0,0,6,47,78,67,51,44,40,34,29,28,28,28,28,28,28,30,36,45,54,65,79,92,103,113,119,122,123,124, -125,126,128,130,132,134,135,135,134,132,130,131,131,131,131,132,137,144,153,160,168,175,179,177,165,139,99,55,20,4,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -1,1,1,1,1,0,1,0,0,7,30,69,118,176,230,251,246,228,208,188,169,158,150,144,139,133,126,122,118,111,98,83,68,57,49,44,41,39,37,35,33,34,50,74,82,83,82,82, -80,80,80,79,84,116,138,130,120,116,113,110,109,109,112,116,119,123,127,132,138,146,153,160,168,175,181,185,187,187,186,187,186,185,185,185,184,184,184,182,180,177,174,172,169,164,160,163, -170,175,176,174,171,167,164,162,160,161,161,160,156,149,138,131,128,125,124,127,131,136,146,156,162,158,149,140,133,129,130,137,149,161,170,173,174,172,162,143,128,124,127,134,139,141,150,164, -171,174,175,173,174,177,176,171,163,152,144,136,124,111,99,90,75,52,33,25,20,12,6,0,0,0,0,0,0,0,0,0,26,13,8,7,5,9,13,8,2,0,0,0,0,0,0,0, -0,0,0,0,0,0,3,6,11,19,28,39,49,54,57,58,60,61,64,67,69,72,73,73,72,72,74,78,83,89,95,103,113,122,132,142,152,161,165,163,147,115,72,31,7,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,2,17,50,99,155,212,246,252,251,250,246,239,235,233,232,231,230,229,228,227,224,216,204, -189,175,166,163,161,161,160,159,158,161,184,213,219,218,218,218,218,217,218,218,217,218,218,216,216,216,216,216,217,217,218,219,219,220,221,222,222,223,224,224,226,228,230,232,233,234,234,234, -234,233,233,233,233,233,232,231,229,228,227,226,226,223,221,223,229,234,237,239,239,235,232,231,231,231,231,231,231,228,226,227,229,229,229,227,225,223,222,220,215,201,182,170,169,175,181,184, -180,171,160,147,127,105,101,116,135,145,163,192,218,231,237,241,244,246,247,247,247,245,242,240,238,238,240,241,240,233,224,210,191,173,155,134,109,84,65,62,74,91,105,110,105,91,67,43, -154,138,129,123,117,105,95,85,69,48,31,25,22,16,8,2,1,1,0,0,0,7,13,11,8,5,4,4,7,9,12,14,16,18,22,25,28,32,35,41,47,57,68,78,87,95,104,112, -121,130,140,150,157,165,169,165,146,112,67,27,6,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,13,43,86,136,199,241, -249,249,247,243,239,240,240,239,238,238,236,236,235,235,239,244,246,247,246,246,246,246,246,245,245,246,247,240,231,229,229,229,228,228,229,228,228,228,228,227,228,228,228,229,229,229,230,230, -230,231,231,231,231,233,234,233,233,232,232,231,231,232,232,232,232,231,231,230,230,230,230,229,229,230,231,232,233,234,236,238,237,238,238,234,227,218,206,190,174,160,151,146,145,151,156,153, -145,136,129,122,117,115,113,111,106,100,94,94,92,86,74,58,38,20,10,4,0,0,0,0,1,4,12,32,58,80,97,110,120,130,134,132,153,184,202,208,206,197,193,197,209,225,235,238, -239,238,237,232,221,207,197,199,211,225,234,235,234,226,207,180,245,242,238,236,235,233,226,213,196,177,162,153,142,126,104,89,83,74,55,32,22,36,49,49,46,38,30,22,16,13,13,15, -17,19,22,28,36,44,51,62,78,95,111,122,129,135,141,147,154,161,167,173,178,182,183,178,160,126,80,37,11,3,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0, -0,0,0,0,0,0,0,0,0,1,14,45,89,131,187,233,243,240,227,198,175,168,163,157,153,148,142,138,134,132,139,151,163,175,180,180,179,179,177,176,177,176,167,135,106,99,99,100, -98,98,98,97,96,97,97,96,98,99,98,100,101,101,102,106,107,108,111,111,116,134,144,145,143,141,135,130,125,121,119,118,117,116,117,117,118,122,125,129,137,146,153,157,159,160,164,166, -166,162,157,146,131,121,111,102,97,93,91,89,88,89,89,88,86,83,81,81,82,85,88,88,86,82,73,62,45,27,14,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -2,4,5,4,14,40,69,86,95,91,83,78,80,92,108,120,134,144,154,166,182,202,219,233,239,233,228,228,230,236,244,248,194,201,200,197,197,206,222,232,238,242,244,242,239,236,230,226, -221,210,187,158,130,114,108,108,107,93,71,57,51,46,43,43,45,48,56,70,87,99,106,111,119,124,126,126,130,136,142,148,155,161,167,173,178,183,184,181,167,138,94,49,17,4,1,1, -1,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,4,22,59,102,145,197,226,219,201,177,149,129,119,110,101,92,84,76,68,61,56,53,53, -54,57,58,55,51,50,49,46,45,43,37,23,12,9,9,8,7,7,6,5,4,5,5,5,6,6,6,8,9,10,12,14,17,19,21,23,27,45,58,61,66,72,74,74,71,65,60,57, -56,55,60,70,83,92,95,97,102,102,98,94,92,92,92,92,92,90,87,86,85,85,85,85,86,86,85,84,83,83,82,81,80,80,78,77,74,67,58,50,42,32,21,14,7,3,2,1, -2,2,4,7,9,9,10,10,10,9,9,8,6,3,1,0,0,0,0,0,0,0,1,4,6,7,6,5,5,5,6,7,12,20,28,31,35,48,71,101,131,141,134,128,127,134,152,176, -53,73,85,87,81,80,92,111,130,147,163,179,191,200,206,214,225,236,242,243,237,226,218,217,214,195,154,116,93,75,64,60,60,63,75,93,104,107,104,98,92,85,81,81,86,95,103,111, -120,129,138,148,156,164,170,172,165,144,108,64,27,6,0,0,0,0,0,0,0,0,0,1,1,2,2,3,3,3,3,3,3,3,3,4,4,4,3,3,4,17,46,89,134,182,214,207, -184,164,148,135,123,113,104,95,87,78,70,62,55,49,43,38,32,29,24,21,17,15,13,11,9,7,5,4,4,3,2,2,1,0,0,0,0,0,0,0,0,0,0,0,1,3,3,5, -7,10,11,13,14,16,18,20,23,29,36,46,54,58,61,62,61,62,70,85,92,93,87,75,62,49,37,30,27,26,26,26,27,28,28,27,27,26,25,25,25,24,23,22,22,21,20,19, -18,18,18,17,17,17,22,33,42,47,53,57,59,59,60,60,60,61,66,75,81,83,83,83,83,83,83,80,75,67,59,51,38,24,12,3,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,3,11,23,29,28,25,24,25,35,0,3,6,7,7,9,11,16,22,27,31,36,46,60,71,79,94,121,150,178,202,218,223,224,228,238,237,219,195,164,129,100, -78,56,44,44,49,50,49,48,50,52,58,65,76,89,99,107,116,125,134,143,152,161,167,171,170,159,136,99,57,23,5,0,0,0,0,0,1,2,3,5,6,8,9,10,12,12,12,13, -12,12,12,11,11,11,10,11,22,49,89,132,174,205,206,195,188,181,171,156,139,120,104,93,84,76,69,62,55,48,43,38,33,30,26,22,18,16,15,12,10,8,6,6,6,4,4,3, -2,1,0,0,0,3,7,10,9,6,4,2,1,0,1,3,6,7,9,10,11,12,12,13,13,13,13,15,17,20,25,25,24,24,28,33,33,29,24,17,11,6,5,6,11,16,19,19, -20,20,20,19,19,18,14,9,5,3,3,3,3,2,4,7,10,12,17,25,40,62,91,116,129,134,136,139,140,140,140,140,140,140,143,145,146,146,146,146,146,146,146,146,145,142,140,136, -126,109,87,63,38,16,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,4,14,28,44,60,71,77,75,66,56,44,32,21,15,12, -19,42,79,115,143,164,173,175,183,209,234,245,248,245,235,221,203,171,122,67,35,29,31,37,44,55,72,91,111,126,135,142,147,153,159,166,171,176,180,182,182,179,167,144,109,69,36,15, -5,3,3,4,6,7,9,11,12,13,13,13,14,14,15,15,15,15,14,12,10,10,14,28,55,92,130,165,190,195,189,188,189,192,192,188,177,158,134,113,94,79,67,58,52,46,40,36, -32,28,24,20,17,15,12,11,9,7,6,5,4,2,1,0,2,6,16,31,46,61,73,80,79,71,60,50,38,26,15,6,2,3,5,7,8,8,9,9,9,10,10,9,8,13,25,22, -11,5,3,3,2,3,2,2,3,9,21,39,57,71,76,76,76,75,75,75,76,74,69,58,48,43,43,43,42,45,57,72,81,87,91,101,119,138,154,159,151,133,119,113,112,112,112,112, -111,110,107,99,91,89,89,89,89,89,89,92,98,105,112,122,134,145,148,143,124,92,61,36,18,6,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -45,64,87,104,113,115,114,113,116,120,125,123,122,126,129,134,149,170,198,216,222,224,225,227,227,231,235,239,243,247,253,255,255,254,242,201,135,92,65,55,65,86,108,127,134,134,135,140, -146,151,157,163,169,174,181,187,190,191,189,179,161,132,98,64,36,18,9,6,6,8,9,11,10,6,5,5,5,5,5,5,4,4,3,3,7,18,40,70,106,137,162,178,181,176,170,166, -164,164,168,175,183,186,180,165,145,123,101,81,64,50,42,36,32,29,25,21,20,18,18,18,16,13,10,9,8,10,21,31,44,63,89,106,116,120,119,118,118,120,120,118,112,102,86,64, -39,18,6,3,3,4,5,5,5,5,5,5,5,15,42,51,42,28,19,15,13,13,13,18,29,48,69,86,89,83,77,76,75,75,76,75,75,77,81,85,87,87,87,87,86,90,102,114, -119,115,104,97,96,95,94,92,71,44,30,25,24,24,24,23,23,22,20,15,11,10,10,11,10,11,11,12,15,20,24,33,48,68,92,116,138,146,139,122,97,71,50,30,15,6,2,1, -1,1,1,1,2,2,5,7,7,4,4,3,3,4,9,19,113,117,115,107,102,103,115,138,164,186,203,208,216,235,245,247,245,233,208,173,145,127,118,117,117,118,118,120,124,133,148,166, -190,221,248,255,241,216,176,136,114,101,96,96,91,87,91,97,105,113,121,130,138,147,156,166,176,182,186,186,182,172,154,129,99,68,43,25,12,6,2,2,0,0,0,0,0,0,0,1, -3,8,16,29,51,76,107,135,157,172,180,179,174,167,160,151,143,136,131,131,138,151,163,173,176,173,163,145,124,104,92,86,82,80,78,76,75,77,85,91,87,78,70,67,66,78,97,106, -111,120,117,104,86,69,57,49,50,58,68,80,93,107,117,121,111,87,59,37,20,10,3,0,0,0,0,0,0,2,15,31,44,50,49,47,47,48,49,52,59,61,57,52,38,24,18,16, -17,18,17,16,17,17,23,32,41,44,45,45,44,45,49,51,49,42,31,23,18,15,13,13,8,1,0,1,3,5,6,5,5,5,5,4,3,1,0,0,0,0,0,0,0,0,0,0, -1,7,16,32,59,90,116,135,144,143,133,116,95,76,66,65,66,67,66,65,65,68,76,83,80,70,64,60,59,64,77,93,126,129,138,153,173,198,220,238,248,244,231,223,204,176,156,146, -144,144,134,117,96,74,51,32,18,11,7,6,7,10,16,25,47,88,150,205,231,245,246,228,192,141,110,92,73,66,72,80,89,97,105,113,122,132,140,148,157,166,173,179,183,185,182,175, -161,142,120,98,77,60,48,40,35,32,33,37,42,47,53,60,71,85,101,120,140,157,171,180,184,183,180,174,168,160,151,143,135,126,117,108,102,101,104,114,127,141,153,163,168,165,160,158, -157,156,155,154,155,156,159,161,155,140,130,124,122,120,112,105,95,74,47,26,12,4,0,0,0,2,6,12,20,32,49,73,101,121,128,122,107,89,69,51,40,34,29,27,26,25,23,26, -34,45,60,81,97,103,103,103,98,92,85,81,77,76,77,77,76,77,77,76,77,77,76,77,79,78,79,80,79,79,79,79,77,77,77,76,77,79,82,87,92,96,101,106,112,115,117,117, -116,116,117,115,111,105,97,90,85,81,79,79,79,78,79,79,78,77,77,77,81,90,104,121,140,156,170,179,183,181,180,185,190,191,188,180,169,161,160,162,158,147,141,140,143,143,139,134, -205,219,232,242,247,250,248,231,188,129,89,71,46,22,10,11,25,48,73,96,112,120,117,104,86,71,56,41,27,19,14,12,12,18,36,70,110,164,216,240,245,232,217,197,153,107,83,80, -86,93,101,109,117,125,134,142,149,157,164,172,179,185,189,192,191,187,182,174,165,155,149,144,140,137,137,139,142,147,153,161,169,178,187,194,200,203,203,201,196,189,181,171,160,151,143,135, -126,117,109,100,92,84,77,75,78,87,104,128,156,171,171,170,167,163,159,153,142,133,127,118,101,83,74,70,67,62,50,38,21,9,2,0,1,8,17,29,48,67,76,76,77,77,79,86, -104,142,180,198,203,204,200,192,184,177,171,165,160,157,155,154,154,155,167,193,211,216,216,216,215,215,215,216,216,216,217,217,216,217,217,216,216,216,216,217,216,216,216,217,216,217,217,217, -217,217,217,219,220,222,226,231,233,234,235,237,238,238,239,239,238,238,238,238,238,237,234,231,228,224,220,219,217,216,217,217,217,217,217,217,215,215,214,215,217,221,225,232,240,243,244,247, -249,249,247,242,229,213,203,200,198,199,204,212,217,214,205,202,253,250,241,231,222,202,155,91,36,6,0,0,0,0,0,0,0,1,9,22,40,63,86,106,118,121,121,116,103,92,81,75, -73,71,64,59,64,86,126,172,214,234,243,249,241,211,173,146,132,126,129,135,141,147,152,157,162,166,170,175,182,187,192,196,198,201,203,204,204,204,205,205,203,201,199,198,197,197,198,201, -202,204,204,204,203,203,202,201,199,196,190,183,173,164,157,149,140,131,124,119,114,110,106,105,110,119,131,142,151,154,146,129,107,91,82,69,53,42,36,29,20,14,13,18,25,30,36,52, -67,76,78,79,86,111,140,162,188,210,216,217,217,217,217,216,219,230,241,244,246,249,251,253,255,255,254,254,252,251,249,249,249,248,248,246,238,235,233,234,234,233,233,234,234,234,236,237, -238,238,238,237,238,238,238,238,238,238,237,238,239,240,240,240,240,240,240,241,242,241,243,243,242,240,238,237,235,234,234,234,234,234,234,234,235,238,240,242,245,246,245,243,241,238,238,237, -235,234,234,234,234,235,235,235,237,239,241,242,244,243,242,239,234,229,228,229,230,231,237,240,242,243,245,246,248,249,250,251,185,144,113,97,83,51,15,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,5,14,31,47,63,79,96,111,118,122,124,125,125,126,124,122,123,127,139,159,177,193,221,246,255,250,236,212,183,168,165,168,171,174,177,179,179,176,176,177,179,183,187, -191,195,197,198,200,201,202,203,203,203,202,200,200,199,198,198,196,194,191,188,185,182,179,177,177,177,178,180,181,179,175,172,168,164,161,158,158,159,160,166,170,172,169,155,130,104,76,51, -31,22,17,14,11,11,17,34,60,77,87,111,138,152,166,192,210,216,217,218,222,234,243,245,244,235,229,228,228,228,228,228,226,212,187,174,171,172,175,178,182,187,192,198,205,209,210,212, -212,213,210,196,178,170,170,170,170,169,170,170,170,170,171,171,171,171,171,170,171,171,171,170,169,166,157,149,145,141,140,140,139,139,138,132,127,121,119,117,114,110,105,103,101,100,100,100, -99,100,100,100,101,104,108,116,127,138,149,161,168,169,170,170,170,169,169,170,172,176,180,186,191,194,192,182,165,145,128,113,102,96,97,98,98,105,128,158,173,174,171,170,168,175,191,202, -31,7,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,5,11,21,35,48,60,68,72,76,84,92,98,100,100,101,104,108,114,134,169,207,236,250, -249,225,192,169,153,140,139,142,145,146,147,147,149,153,158,163,167,171,175,177,180,183,185,187,188,189,189,189,189,188,187,186,183,181,177,173,169,163,158,154,150,148,147,148,151,151,150,148, -148,146,142,137,134,134,135,143,151,151,143,132,117,98,76,54,35,26,31,50,72,90,121,162,199,216,222,233,243,245,246,243,234,230,228,228,226,214,190,171,145,114,99,97,97,97,97,97, -93,75,50,37,35,35,35,35,37,39,43,51,61,71,80,86,89,91,95,94,91,90,90,89,88,89,89,89,89,88,81,73,70,70,70,69,69,69,69,69,65,58,48,36,28,22,20,21, -21,21,18,14,10,8,7,6,6,5,5,5,5,5,5,4,4,4,4,4,3,2,3,5,11,20,33,50,66,76,80,85,92,94,93,92,92,96,103,116,129,133,127,116,102,85,64,43, -24,11,4,3,4,5,12,24,34,36,35,35,35,42,61,65,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,2,4,8,15,23,31,35, -36,39,43,48,52,54,50,45,41,40,42,46,59,85,125,179,227,246,241,227,202,165,141,124,115,113,116,120,126,132,139,144,149,153,157,160,164,167,169,171,172,173,174,174,174,172,171,169, -167,164,160,158,157,156,155,154,153,151,149,147,144,141,138,134,131,126,118,110,101,91,82,77,76,75,71,72,81,92,99,102,107,125,152,182,208,221,234,245,246,235,228,217,194,176,166,141, -112,99,97,96,92,74,50,33,20,9,5,5,5,5,5,5,4,1,0,0,0,0,0,0,0,0,0,3,9,18,25,28,29,30,33,37,39,39,34,25,18,15,13,12,12,12,8,4, -3,3,4,6,8,11,12,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,7,17,25,34,41,48,54,58,62,65,66,68, -70,68,63,57,51,43,37,36,42,45,44,49,61,76,84,85,76,59,37,16,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,4,5,4,4,4,4,2,0,0,0,0,0, -0,0,0,0,0,0,0,0,4,24,36,42,46,49,50,51,52,53,54,55,57,59,59,56,50,44,42,41,42,45,56,85,137,192,228,245,251,241,226,202,172,151,138,131,126,124,126,129, -133,137,142,145,148,151,154,155,156,158,159,159,159,158,157,156,156,156,159,165,173,178,180,180,178,175,172,167,160,153,145,139,135,131,127,123,119,112,101,87,75,64,56,58,77,101,119,151, -195,231,248,251,243,231,214,185,150,113,95,78,53,37,29,18,7,3,4,7,8,6,3,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,23,34,38,41,44,47,48, -48,49,49,49,49,50,49,42,32,23,17,13,11,11,11,13,17,20,23,27,33,38,39,39,36,31,26,20,13,6,0,0,0,0,0,0,1,1,1,1,1,3,4,4,4,5,6,8, -12,20,34,56,81,100,111,117,119,119,117,113,106,98,92,88,86,86,86,85,84,79,70,58,45,32,16,6,8,18,34,52,71,84,87,75,51,25,10,2,0,0,0,0,0,0,0,0, -21,28,40,50,56,56,56,55,55,53,46,35,30,25,14,7,6,14,24,26,26,25,25,25,38,61,70,67,64,60,57,58,61,66,69,70,66,59,56,58,62,64,65,68,71,74,76,79, -89,111,140,174,212,236,248,252,243,229,213,197,177,156,139,134,133,136,141,146,149,150,150,151,154,159,164,165,166,165,166,169,173,179,186,193,195,194,190,185,180,174,168,163,157,148,137,125, -115,106,102,98,98,104,113,123,138,153,166,178,198,214,219,231,244,239,216,191,170,152,129,95,62,36,24,20,21,24,26,26,21,24,35,47,55,57,57,57,57,56,48,36,30,26,23,27, -47,78,93,95,95,95,95,94,104,121,122,101,80,63,43,31,30,34,38,40,36,33,37,44,50,51,49,48,48,48,48,49,50,51,50,47,45,40,39,40,47,60,68,71,69,65,61,54, -42,29,30,36,38,35,32,32,34,45,56,58,58,59,63,72,84,100,121,138,149,150,145,140,133,126,121,117,110,101,89,78,68,61,57,58,61,70,78,84,86,82,67,43,22,9,2,4, -13,31,55,77,88,83,70,54,37,24,17,17,21,25,28,28,83,84,84,83,82,84,90,97,100,102,103,104,112,121,125,138,145,161,178,182,181,180,179,179,181,185,187,186,188,190,191,193, -196,199,201,202,196,183,161,129,96,78,68,60,58,60,62,62,60,60,63,74,99,129,167,209,233,245,250,248,240,222,198,183,173,161,153,149,146,146,145,144,147,154,162,165,164,165,166,170, -173,175,176,170,160,152,143,137,132,129,125,124,124,127,129,129,129,132,138,141,140,152,172,193,218,237,248,252,251,244,237,226,199,155,108,83,87,103,118,127,123,109,97,90,93,100,103,104, -99,92,89,89,86,85,85,85,84,84,83,90,108,135,167,189,208,226,230,231,230,230,229,229,230,230,229,221,212,199,166,127,99,92,86,73,63,53,47,46,46,45,42,39,39,38,36,32, -26,21,23,29,35,46,73,97,127,166,187,192,195,200,205,206,187,143,105,83,63,51,48,49,52,67,82,85,85,85,90,99,107,114,119,111,98,85,74,68,66,64,63,67,74,83,88,90, -87,80,71,64,58,57,57,61,69,83,97,99,89,73,54,38,30,30,37,51,74,99,117,127,123,110,97,91,93,101,104,103,70,61,61,81,117,141,165,185,192,196,198,204,214,228,241,253, -255,252,249,247,247,247,246,246,246,242,230,221,219,220,221,221,221,219,218,218,222,231,241,244,225,203,179,136,91,68,62,58,57,57,56,52,54,61,79,108,137,169,199,223,241,250,248,240, -228,207,182,163,158,157,153,146,144,142,137,132,127,123,123,124,123,121,118,112,104,98,93,88,85,81,79,83,92,108,128,151,180,206,226,234,236,242,248,251,249,241,227,213,202,189,179,162, -136,113,97,87,88,99,114,127,134,130,116,102,94,92,92,92,90,79,62,43,30,28,27,25,26,40,85,156,207,237,250,241,227,201,176,167,165,165,164,162,163,162,168,187,204,220,238,244, -235,225,205,168,135,116,101,87,80,74,66,55,47,44,39,33,41,71,115,154,177,198,220,230,231,219,208,209,211,214,214,216,229,235,216,185,132,68,22,9,11,19,27,28,29,27,29,33, -33,33,32,23,15,10,7,5,5,5,5,8,13,22,34,46,60,71,79,83,85,86,84,82,81,85,97,112,125,132,129,116,104,99,93,85,86,97,112,125,133,129,115,100,93,90,89,88, -99,123,162,205,228,229,219,203,195,198,198,199,203,217,241,250,250,250,246,241,239,239,241,241,243,243,228,191,147,109,82,68,63,60,57,58,65,81,111,158,201,221,238,243,216,171,131,111, -103,100,93,83,79,81,83,86,92,103,118,136,160,195,227,239,245,248,241,232,230,230,227,220,219,213,196,180,160,145,142,141,140,138,137,136,134,132,130,127,128,134,137,153,175,195,213,226, -239,245,241,232,228,221,205,191,170,141,120,107,104,104,104,96,88,86,79,66,61,59,57,52,50,47,38,27,20,18,17,16,14,8,2,0,0,0,0,27,80,142,204,229,208,180,139,114, -130,141,123,92,72,67,71,73,74,74,75,77,75,78,99,138,168,184,212,228,224,212,190,158,135,121,118,120,116,108,115,141,184,225,243,233,218,205,177,152,132,101,84,81,76,68,59,55, -78,133,178,211,234,207,127,55,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,6,13,21,28,35,42,51,57,62,66,71,80,90,100,102,95, -87,85,77,63,57,56,54,50,47,44,35,23,16,17,35,66,228,232,222,188,134,96,69,45,37,39,39,39,41,53,90,114,126,150,168,169,153,134,123,119,122,151,203,228,220,186,132,71, -27,3,0,0,0,2,7,20,43,63,101,162,215,238,226,200,172,130,85,62,58,60,63,65,67,67,65,62,65,84,117,140,168,200,225,236,236,237,245,254,255,255,251,247,239,232,230,229, -229,229,229,228,228,228,228,226,230,238,240,244,251,253,254,253,251,245,226,198,173,145,107,75,50,32,24,22,25,26,24,20,17,15,12,8,6,6,4,2,0,0,0,0,0,0,0,0, -0,0,0,7,24,56,111,178,226,230,193,114,50,22,5,7,36,75,100,93,63,33,16,11,10,10,10,6,1,0,0,5,17,36,82,135,189,236,252,248,240,229,224,226,224,212,219,237, -234,201,147,98,73,62,49,40,38,35,29,22,14,8,4,3,4,12,28,59,121,198,235,213,166,103,44,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,1,4,7,10,13,18,22,24,23,19,15,15,12,7,5,4,3,0,0,0,0,8,50,102,162,208,134,104,70,32,8,0,0,0,0,0,0,0,0,0,6,12, -21,44,79,117,126,96,56,26,10,14,48,98,150,200,230,222,181,123,68,27,6,1,2,3,3,4,8,25,65,127,187,215,232,222,163,99,65,58,65,69,70,70,67,66,66,66,61,56, -66,89,116,132,134,138,163,204,223,218,202,208,225,234,235,236,235,235,235,235,234,234,234,233,237,244,243,236,226,218,212,208,206,210,221,228,226,217,199,174,146,115,79,53,44,39,37,34, -29,28,28,25,17,8,3,2,1,0,0,0,0,1,9,20,38,62,92,138,178,212,232,211,151,87,37,3,0,0,6,9,18,39,75,114,125,96,59,41,33,27,24,25,31,50,82,101, -111,142,174,192,218,230,210,201,208,216,221,225,225,206,178,139,89,41,16,8,9,16,27,32,33,34,31,29,28,26,24,22,18,14,10,6,12,50,120,179,223,233,199,131,66,32,9,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,5,8,10,10,8,8,7,7,6,4,0,0,0,0,0,0,0,0,0,0,0,0,0,2,25,71,137,206,233,224,182, -6,0,0,0,0,0,0,0,0,0,3,17,40,64,77,82,89,98,110,135,155,153,133,104,73,49,30,23,29,53,100,156,208,231,217,174,117,60,17,2,2,4,5,4,5,15,38,66, -110,181,229,226,204,194,198,201,202,202,202,201,201,195,169,124,86,56,46,49,51,55,66,87,104,99,88,94,112,125,128,129,128,127,126,126,123,123,121,120,122,131,130,121,111,107,103,101, -104,113,132,154,173,190,208,225,234,237,227,211,203,195,193,189,184,182,182,178,163,138,120,117,110,107,106,102,97,109,144,173,198,219,229,229,207,172,117,54,11,0,0,13,38,62,76,83, -95,108,126,157,187,199,197,199,197,192,186,185,192,208,224,228,228,221,203,188,166,112,53,39,43,50,54,59,59,43,25,11,4,6,11,18,26,46,69,77,80,81,81,81,80,75,69,60, -50,40,31,25,17,10,13,32,72,134,201,232,219,189,140,82,38,11,1,0,0,0,0,0,0,0,0,8,21,33,39,44,53,64,72,75,75,75,77,76,75,70,60,44,26,12,4,0, -0,0,0,0,0,12,51,88,118,173,222,230,187,123,74,29,0,0,0,0,0,0,1,9,20,36,61,90,113,122,119,116,114,108,103,97,94,99,111,122,124,119,111,101,88,71,53,48, -73,118,172,217,233,211,147,75,29,14,12,19,27,33,39,44,51,78,129,173,201,211,211,210,209,210,212,212,214,220,236,239,218,168,111,71,53,41,39,41,42,41,41,44,47,50,50,49, -48,48,47,46,47,49,49,49,53,62,77,94,107,114,114,113,110,106,98,91,89,88,92,103,117,141,175,196,203,206,207,209,211,209,206,207,215,224,227,227,227,227,226,227,227,228,223,205, -181,152,121,82,43,17,3,6,20,44,76,105,129,148,165,183,202,217,225,232,240,242,240,236,231,232,232,230,222,204,168,134,116,84,50,32,18,3,0,0,0,0,1,8,16,25,35,45, -53,60,67,71,76,89,105,113,119,126,131,135,136,133,128,120,108,92,75,58,43,31,19,11,5,13,50,110,162,202,229,225,194,148,116,90,65,50,44,42,45,55,72,93,111,122,124,127, -133,149,163,166,165,170,180,186,186,179,167,157,141,119,95,69,49,44,49,69,98,145,204,228,229,216,163,95,35,2,0,0,11,11,12,15,22,32,50,75,96,112,122,119,100,72,52,45, -40,32,25,19,14,15,25,43,63,83,98,108,114,119,117,105,90,82,87,107,150,202,235,223,183,143,105,91,98,106,114,118,119,117,118,123,129,127,114,96,83,78,77,77,80,92,127,169, -213,240,233,208,177,118,78,72,72,74,76,83,87,88,88,88,88,86,84,85,90,96,100,108,121,132,140,141,134,122,112,105,95,84,73,66,61,57,53,50,47,45,49,55,62,74,82,91, -100,104,104,103,113,130,138,136,135,134,127,126,130,131,112,85,65,50,42,43,47,64,102,136,160,190,216,226,226,229,234,234,224,207,193,174,139,108,93,85,90,105,118,125,129,128,121,108, -94,81,68,51,41,39,41,41,46,56,72,87,99,108,117,124,130,137,144,151,153,155,157,161,168,174,178,179,180,180,178,172,163,151,138,124,110,93,78,67,60,52,50,59,75,99,140,180, -215,236,238,234,225,216,210,208,208,212,218,222,222,218,215,214,217,230,235,234,234,234,234,233,229,228,230,235,243,243,234,215,196,195,208,225,238,238,206,160,132,95,46,16,8,9,10,11, -82,82,84,91,100,109,118,121,112,99,78,49,24,7,1,0,0,0,0,0,0,0,0,0,4,11,19,26,36,56,82,104,121,130,131,127,127,142,176,211,234,244,226,184,146,117,100,91, -90,93,94,99,110,120,124,120,113,108,99,92,92,95,100,112,137,174,216,241,254,235,185,145,133,132,134,134,134,133,133,134,133,131,134,142,151,162,180,202,220,222,216,209,201,195,192,191, -188,186,185,184,184,183,183,184,181,174,157,124,103,104,111,117,126,135,144,150,154,158,161,161,159,157,154,151,155,176,192,196,198,198,202,209,214,225,242,248,246,238,218,202,189,168,136,100, -70,45,32,21,7,0,0,0,1,9,19,27,39,57,79,99,110,117,122,120,116,114,114,115,117,121,122,119,115,113,111,111,119,131,146,165,183,192,192,182,163,143,129,123,126,140,160,178, -189,188,182,177,174,165,153,142,136,130,127,125,121,118,118,124,140,159,173,191,207,217,221,224,224,220,215,208,204,200,198,199,191,161,128,117,117,117,114,110,107,110,128,147,177,222,244,247, -249,252,255,255,251,229,169,119,102,98,96,89,83,82,82,82,117,117,117,115,110,101,85,60,38,22,10,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,28,62,98,134,162, -189,202,207,212,213,208,199,190,190,215,242,243,218,175,117,60,27,16,17,25,37,53,76,101,126,141,134,126,125,125,127,131,134,133,138,151,187,231,242,209,171,135,118,112,108,104,103,102, -106,129,172,208,222,231,236,229,212,204,201,201,201,201,201,201,201,201,202,202,202,201,202,201,203,208,219,231,229,228,228,228,229,230,231,232,233,234,235,239,240,242,243,246,245,240,231,227, -227,227,226,222,219,210,179,145,120,89,53,37,30,19,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,11,23,35,46,62,78,86,88,88,88,85,75,63,52,44,43,48,57, -75,98,127,154,176,180,156,110,60,29,15,12,14,25,50,94,144,181,195,192,182,165,145,129,117,108,98,85,75,70,67,66,65,64,66,69,69,68,69,69,66,58,50,43,40,39,39,39, -33,16,3,1,1,2,2,1,2,2,8,17,26,66,126,143,136,129,133,159,190,223,231,203,167,127,103,105,112,114,116,116,45,45,45,40,32,23,12,2,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,9,28,68,129,186,219,228,226,218,205,197,196,197,199,204,213,223,226,229,235,242,250,252,239,200,143,74,24,4,0,5,11,25,45,61,60,56,55,57,58,63, -69,65,57,50,53,84,139,201,229,207,189,191,194,191,189,188,196,220,233,211,186,163,127,89,58,50,49,48,48,47,47,46,46,45,45,44,43,44,43,43,44,48,65,100,118,119,119,118, -118,116,117,116,116,116,116,118,120,122,125,125,119,97,79,73,74,74,73,66,59,47,25,7,0,0,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,10,14,15,15,15,13,10,8,9,13,21,34,53,76,107,138,164,170,141,80,22,0,0,0,0,0,0,0,12,64,133,180,190,174,144,113,85,63,45,32,20,12,9,5,5, -5,4,4,3,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,7,15,10,3,3,12,31,80,156,209,232,212,145,80,46,41,42,43, -5,3,4,4,2,1,1,2,3,3,3,3,3,3,3,2,2,2,1,1,7,32,87,143,182,218,231,208,166,124,93,71,52,43,44,44,45,50,64,90,113,121,121,127,144,175,212,244, -252,226,182,111,41,20,14,12,12,9,7,5,4,5,5,6,8,8,8,7,7,13,44,124,211,247,254,254,246,217,203,202,198,176,123,64,37,25,14,8,6,5,5,4,4,3,2,2, -2,1,1,1,0,0,0,0,0,0,0,1,2,4,10,16,13,6,4,4,4,4,3,2,1,0,1,0,1,1,2,2,2,2,2,2,0,0,0,0,2,2,3,3,3,3,3,3, -4,4,4,4,5,5,4,6,6,6,6,7,7,7,8,7,8,9,9,8,8,8,9,9,9,11,14,17,24,32,46,65,90,120,150,172,165,118,46,0,0,0,0,0,0,0,0,0, -29,103,165,186,174,144,110,79,54,34,21,12,7,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,4,7, -5,2,0,0,0,1,19,53,111,193,231,193,118,79,45,16,113,86,67,60,60,59,59,59,59,59,59,59,59,59,60,62,62,64,73,98,138,190,231,239,225,191,143,99,71,59,54,53, -53,54,54,46,38,36,37,38,41,42,42,44,49,60,92,155,225,254,255,244,199,166,150,143,132,108,83,68,57,49,45,44,45,57,76,89,103,133,175,214,229,219,201,168,121,67,48,48, -43,30,14,6,5,6,6,7,7,7,7,6,6,5,5,4,4,4,4,3,3,3,3,2,2,2,1,0,0,0,10,31,44,41,39,41,45,49,51,48,42,39,38,39,43,52,59,60, -60,60,60,60,60,60,61,61,61,61,61,61,61,61,62,62,62,62,63,63,64,64,65,71,70,64,61,61,62,62,63,63,63,65,65,58,51,49,50,50,50,51,53,55,60,66,84,106, -128,152,175,191,186,149,80,18,0,0,0,0,0,0,0,4,50,122,174,187,170,139,105,76,51,32,19,12,7,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,0,0,0,1,6,16,22,23,24,28,34,38,40,37,41,77,149,220,236,229,204,158,244,227,196,173,173,158,137,131,133,134,135,137,143,154,169,179, -183,189,208,236,249,238,205,168,138,104,84,81,82,83,84,85,85,86,81,63,46,42,42,42,41,41,41,41,41,43,56,84,123,171,207,217,234,245,247,249,249,243,233,223,216,210,205,204, -205,216,228,234,235,235,223,188,135,86,56,30,11,3,2,2,2,4,6,6,6,6,6,6,6,6,5,4,5,4,4,3,3,3,3,2,3,2,2,2,2,1,0,0,0,0,9,38, -65,75,77,83,91,99,105,108,110,110,111,112,115,119,119,118,119,119,119,120,120,121,121,121,121,121,122,122,122,122,123,123,123,123,122,122,122,122,124,127,118,100,90,90,90,92,92,93, -94,95,91,75,59,56,57,57,57,57,59,61,65,71,91,119,141,160,183,200,206,194,155,96,42,13,3,1,2,9,27,68,124,170,191,186,168,142,114,87,62,42,25,14,6,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,2,12,24,34,41,50,63,74,84,91,95,96,109,144,176,199,229,247, -172,211,237,245,249,238,216,205,206,210,213,218,225,234,238,238,237,236,226,197,148,104,77,65,53,35,28,28,28,29,29,29,29,28,25,15,7,6,6,6,6,6,6,6,6,7,14,25, -29,38,58,76,99,117,130,141,154,175,198,211,220,223,227,232,234,224,206,193,185,169,146,122,102,88,74,65,55,38,21,10,6,3,4,5,5,5,5,5,5,5,4,4,3,3,2,3, -2,3,2,2,1,1,1,1,0,0,0,0,0,0,7,30,52,52,45,46,51,55,59,67,76,84,88,93,97,98,93,91,92,95,100,106,114,120,122,122,122,123,123,124,124,124,126,125, -122,118,112,104,99,96,97,96,87,72,66,65,62,57,51,48,48,48,46,38,30,30,31,31,31,30,30,33,35,40,51,68,85,104,129,155,175,186,187,173,147,119,99,92,97,114,139,167, -187,194,189,179,169,160,148,133,119,102,84,70,56,35,16,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,6, -16,21,23,27,34,41,48,57,68,76,79,80,82,83,96,128,19,49,93,156,217,244,252,249,236,213,195,182,169,150,123,103,96,87,65,34,9,1,1,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,3,5,6,9,14,23,36,49,61,68,74,84,95,90,77,71,77,86,96,109,123,137,146,145,141,126,101,75, -52,28,11,3,1,3,3,4,3,3,3,3,3,3,2,2,2,1,1,2,1,0,0,0,0,0,0,0,0,0,6,16,18,11,5,4,6,9,16,26,37,54,78,101,119,136,142,144, -148,154,162,172,184,191,193,194,194,194,194,195,195,195,196,196,193,186,177,162,149,145,145,145,144,143,143,141,133,116,93,75,61,53,48,44,41,38,36,36,37,36,34,35,35,36,38,41, -49,59,75,94,115,135,153,166,175,179,178,179,181,184,184,180,173,161,146,133,125,123,123,127,134,145,151,148,141,124,99,72,49,25,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,3,5,5,3,2,3,3,3,6,9,12,13,13,12,8,4,7,0,0,0,14,57,106,161,213,233,216,167,94,38,12,4,2, -0,0,0,0,1,2,3,1,0,0,1,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,1,1,0,0,0,3,16,27,34, -40,45,51,59,68,78,89,104,121,139,153,154,150,151,149,140,128,105,70,37,15,4,1,1,1,1,2,2,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,2,6,14,21, -25,27,29,33,46,68,93,114,132,157,188,208,221,231,235,235,236,239,241,243,245,246,246,246,246,245,245,246,246,246,246,246,246,245,244,241,236,234,235,235,236,236,236,236,232,223,206,186, -167,151,137,123,108,91,78,69,63,57,54,52,50,50,49,49,49,53,57,66,77,89,101,114,125,134,139,142,141,138,132,123,112,101,91,85,83,84,88,99,112,130,144,149,151,154,151,140, -127,104,69,35,13,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,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,4,9,14,23,43,89,149,202,231,214,161,119,123,137,133,125,124,127,127,127,126,117,101,84,72,63,60,59,59,60,60,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61, -61,61,61,61,61,60,59,59,62,70,81,98,133,170,187,193,194,197,203,208,210,210,209,210,210,209,207,195,157,114,91,89,102,123,129,118,95,68,42,16,2,0,0,0,0,0,0,0, -0,0,0,2,3,5,8,12,20,27,32,39,51,70,91,113,128,136,140,147,165,191,213,225,232,240,247,247,243,238,235,234,233,230,227,223,217,213,212,212,214,216,217,218,219,219,219,221, -223,229,235,242,246,246,246,246,247,246,246,247,248,251,251,249,245,240,235,227,216,200,184,169,152,136,123,114,108,104,103,101,98,97,97,98,99,102,105,107,110,110,111,108,103,100,101,101, -99,103,109,114,113,106,97,91,84,76,70,69,72,76,79,86,102,122,127,111,83,54,28,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,59,62,70,83,94,99,98,98,108,132,173,220,243,243,250,255,255,254,249,247,248,247,248,246,240,226,209,187,162,145,133,125, -121,117,115,116,117,117,118,119,119,119,119,119,119,119,119,118,117,116,116,116,116,121,132,143,167,202,225,239,247,243,237,238,235,234,229,222,214,209,204,201,200,197,200,216,225,199,161,126, -109,121,148,171,180,174,156,124,88,61,46,35,26,23,22,24,27,29,31,36,49,67,79,94,117,135,145,155,171,192,210,224,232,234,235,238,242,246,247,243,238,231,218,199,180,167,163,165, -168,164,161,161,159,158,158,158,162,166,169,170,172,173,174,177,181,188,194,203,210,212,213,213,214,214,215,216,222,231,239,245,249,251,254,254,254,253,249,245,235,223,207,190,175,164,157,152, -149,146,144,142,140,138,137,135,134,131,130,127,126,126,135,141,136,136,130,109,85,66,48,33,21,12,7,4,4,5,6,10,21,46,79,109,123,122,103,68,32,8,0,0,0,0,0,0, -0,0,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,10,19,28,38,48,121,120,121,118,112,106,104,103,98,90,88,105,131,147,164,179, -192,196,164,146,147,146,149,160,180,203,222,235,236,227,210,194,178,146,111,90,83,80,74,67,64,64,64,64,64,64,66,68,76,87,95,105,128,171,209,227,238,232,207,183,153,126,120,120, -106,94,79,61,51,51,56,61,69,81,104,146,201,234,243,239,228,220,222,229,235,240,243,241,230,212,190,163,137,122,119,121,126,131,130,135,158,186,201,212,226,234,238,240,244,247,247,245, -241,238,236,233,226,211,190,171,162,156,145,135,130,129,131,133,133,131,129,125,118,114,114,114,113,111,110,114,117,120,123,126,129,130,128,132,137,140,142,143,144,145,146,148,153,163,174,188, -200,209,217,226,235,243,247,250,250,249,243,231,212,190,170,148,129,114,104,98,93,90,87,85,83,81,82,87,95,97,105,106,90,75,59,34,15,7,1,0,0,0,0,0,0,0,0,0, -0,0,9,32,58,87,114,124,106,73,41,19,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,1,5,18,37,57,76,94,105,112,118, -70,67,61,49,37,31,34,43,48,48,45,44,44,43,40,36,36,34,16,7,8,8,9,12,20,38,63,101,145,177,201,216,223,227,210,187,176,169,148,115,100,99,99,100,99,104,110,124, -153,182,196,207,223,227,204,178,143,86,43,25,16,13,15,14,6,4,9,21,43,75,104,124,139,162,188,210,226,235,242,247,250,251,250,249,247,247,249,254,255,255,252,246,238,231,227,228, -229,230,229,231,239,246,247,247,244,238,234,231,225,211,192,173,156,146,143,140,132,120,109,107,117,126,127,122,113,103,93,83,71,67,62,52,42,39,45,57,67,71,75,80,85,88,89,88, -89,90,89,92,95,100,102,103,106,113,124,132,136,145,161,180,187,192,196,204,215,225,233,240,245,248,250,249,244,235,221,198,167,131,96,68,50,38,30,26,22,19,18,19,22,24,25,23, -15,9,4,2,2,2,2,4,8,11,12,12,12,12,12,12,12,12,9,6,6,16,41,78,111,123,115,92,65,43,23,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,2,7,16,28,43,60,84,105,114,116,111,102,92,83,5,3,1,1,9,25,47,67,78,82,82,82,81,78,72,60,45,30,17,7,1,0,0,1,11,25,38,52,70,86,102,115, -127,152,180,198,204,208,221,229,229,228,228,229,228,229,229,229,220,202,188,174,151,99,46,23,9,0,0,0,0,0,0,3,22,57,103,141,175,205,226,236,242,247,251,252,248,245,242,238, -231,224,217,208,197,186,186,196,213,228,235,241,246,248,248,245,241,238,236,232,223,210,200,190,171,151,138,128,115,95,78,68,69,75,83,92,103,111,116,117,111,93,72,53,37,25,17,11, -5,5,5,8,18,38,61,84,99,108,113,119,124,128,129,127,123,119,116,114,113,116,124,139,164,191,213,222,226,231,239,245,245,244,242,241,242,242,244,246,248,249,251,252,253,253,252,249, -242,224,191,147,104,67,41,25,16,11,8,6,4,3,2,3,9,18,30,40,44,46,51,66,84,91,95,94,92,87,79,74,72,71,68,60,45,28,15,17,38,69,98,117,121,114,97,71, -46,30,22,18,13,8,4,2,1,1,1,1,1,3,6,12,21,32,42,55,72,87,99,105,103,88,69,53,37,25,17,11,0,4,16,35,60,80,87,81,70,63,62,63,65,70,80,93, -102,106,101,83,65,54,50,57,73,85,88,86,81,74,72,74,80,89,94,89,74,63,76,103,116,117,116,117,117,114,106,95,69,42,29,20,10,0,0,0,0,0,0,0,4,18,46,85, -135,184,222,240,248,252,253,251,251,248,242,231,220,212,202,184,159,138,126,121,117,111,103,96,101,111,121,139,158,180,193,196,192,187,181,172,158,136,118,104,89,77,69,66,63,65,73,89, -107,120,125,122,111,94,79,65,45,23,8,0,0,0,0,0,1,8,21,42,70,92,102,103,98,99,105,114,123,133,146,159,169,174,173,167,163,171,198,228,245,251,247,242,240,239,231,220, -219,221,221,218,213,208,204,203,207,216,226,233,236,239,243,248,251,253,250,236,206,164,117,75,47,27,14,8,6,12,27,46,63,78,87,90,90,92,103,125,141,147,147,148,149,146,131,110, -93,82,80,85,88,85,68,46,28,21,28,50,74,97,114,119,113,101,93,90,82,67,53,45,41,39,36,35,36,41,50,63,78,90,97,99,93,82,70,59,41,21,7,0,0,0,0,0, -52,63,76,85,85,72,55,39,31,30,37,45,51,56,68,89,112,133,141,128,114,107,100,90,79,61,45,33,23,17,15,17,28,46,69,84,83,67,45,28,14,6,3,2,1,0,0,0, -0,0,1,1,1,0,0,0,0,5,18,44,81,124,164,201,230,246,250,246,236,218,195,179,172,161,142,123,114,120,126,119,100,75,53,44,47,64,83,94,91,79,67,64,72,88,104,114, -116,114,112,117,117,108,100,95,93,91,90,91,97,109,123,133,139,143,144,133,113,89,69,52,42,36,30,26,24,24,27,35,50,64,80,94,97,87,74,67,69,79,95,111,123,135,149,166, -182,199,210,213,218,232,247,245,229,211,195,187,184,183,179,175,179,186,194,200,200,195,188,180,175,174,175,177,178,180,188,199,215,233,246,250,248,238,215,181,144,104,67,48,50,67,84,92, -89,80,66,53,48,48,56,68,75,77,77,78,86,101,110,106,90,68,50,41,47,63,80,88,81,63,47,45,52,64,82,97,105,108,111,120,123,113,106,104,104,102,98,95,97,99,102,107, -113,118,122,115,101,83,72,66,61,57,52,44,34,28,31,38,156,149,135,120,104,95,96,101,102,99,96,91,87,85,86,86,85,82,74,60,54,54,50,36,19,7,1,0,0,0,0,0, -0,2,14,36,60,81,89,84,71,57,48,41,39,39,39,40,46,53,56,57,55,52,50,53,64,90,128,168,202,225,237,246,248,239,215,176,136,97,64,46,38,31,22,13,12,23,42,65, -84,92,85,65,41,27,30,47,66,80,83,84,91,99,105,108,104,94,81,74,73,73,75,78,80,81,85,99,132,175,200,204,205,207,210,211,211,207,193,167,148,129,112,109,108,102,99,103, -106,105,100,91,81,75,78,90,105,120,134,144,153,161,169,179,195,218,237,245,248,245,223,196,181,175,173,173,174,174,177,178,179,181,185,192,200,205,207,205,200,194,187,181,176,170,167,165, -171,188,208,223,236,246,248,244,235,217,189,161,136,116,95,74,54,37,22,13,10,10,12,14,15,15,15,15,18,31,51,73,91,97,91,72,50,40,48,68,88,101,103,106,113,123,134,147, -158,166,170,173,173,168,167,174,183,186,183,181,182,181,179,178,179,181,186,188,189,189,188,188,190,190,189,178,154,145,152,157,238,231,222,218,215,214,215,212,202,187,161,124,89,65,47,31, -21,13,6,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,22,42,63,77,85,87,88,88,87,87,86,87,86,90,95,104,121,143,164,183,209,232,243,248,248,244,233, -204,159,105,59,30,13,4,0,0,0,0,0,0,10,26,46,69,94,116,124,113,85,51,32,40,67,103,140,172,195,201,204,209,208,203,192,185,183,184,185,186,190,197,212,232,236,224,219, -219,219,220,221,223,227,237,245,243,233,221,219,219,205,178,152,132,123,117,114,115,120,125,131,136,139,144,149,159,176,200,218,235,250,255,248,230,201,183,179,180,182,183,185,185,186,187,188, -189,189,188,189,191,195,200,204,206,207,205,203,198,193,186,178,169,163,161,168,182,207,231,244,250,252,250,239,211,177,153,134,120,105,88,78,74,73,73,73,72,72,73,72,74,80,91,105, -122,139,156,163,157,146,139,139,144,150,156,171,196,216,228,238,245,249,249,246,242,239,236,237,238,240,245,247,248,248,248,248,248,248,249,249,250,251,251,251,252,252,252,251,244,241,244,243, -235,241,245,245,244,244,246,246,245,241,229,204,167,125,80,44,26,18,12,6,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,16,27,36,41,43,46,52,59, -66,80,104,127,154,186,213,230,240,247,252,251,241,219,186,146,94,45,16,3,0,0,0,0,0,1,10,28,49,68,80,86,88,91,102,127,151,157,152,158,180,202,220,229,219,203,198,198, -202,207,218,226,229,226,222,221,221,222,223,217,181,132,102,95,97,97,97,98,102,110,129,153,172,202,219,218,222,236,243,227,212,210,209,209,207,207,207,207,207,207,209,214,223,235,247,253, -254,247,232,209,190,184,187,188,190,190,191,192,192,192,192,193,193,194,194,193,192,193,192,192,193,194,193,191,186,179,169,160,149,142,138,138,159,199,230,244,249,253,254,254,251,245,242,235, -227,219,206,198,195,195,195,195,195,195,196,200,204,209,213,215,215,217,222,228,236,239,240,240,238,234,232,239,246,248,245,242,239,240,243,241,233,223,212,196,180,181,192,194,192,190,190,191, -191,191,192,192,193,196,198,199,199,199,200,211,228,236,233,230,107,128,152,171,178,179,182,192,209,226,239,246,241,226,197,160,137,121,101,78,57,38,27,20,13,9,6,5,5,5,5,6, -6,6,5,5,5,5,4,4,3,4,5,11,26,53,85,115,144,174,201,218,230,240,243,243,241,233,215,188,164,145,122,93,61,36,23,15,13,14,18,24,32,46,67,84,88,80,64,50, -47,66,105,163,209,225,237,245,241,222,191,153,116,86,77,76,80,91,111,137,148,136,114,100,92,82,71,57,31,15,12,11,11,12,12,12,14,19,24,28,33,48,59,60,64,93,147,190, -200,201,201,202,203,205,207,210,217,228,243,251,253,253,250,241,221,201,190,187,188,191,192,193,193,193,194,195,194,195,195,195,195,195,195,194,194,194,192,191,189,185,182,177,170,165,167,176, -189,208,219,223,232,231,215,207,207,211,220,234,245,251,252,249,246,247,247,246,245,247,247,248,248,249,251,252,253,253,251,250,249,248,248,248,250,249,249,248,250,249,245,240,233,223,212,200, -193,190,184,176,170,153,126,99,83,73,62,54,48,46,45,47,46,46,47,47,48,52,56,57,57,58,58,68,89,105,104,98,49,59,75,92,109,117,117,121,135,155,184,216,236,246,247,240, -235,228,216,200,179,153,134,117,99,85,75,71,70,70,70,70,70,70,70,70,70,70,70,70,70,71,75,91,128,171,205,228,242,247,251,250,247,239,220,193,164,134,96,59,41,48,65,79, -88,95,99,97,92,85,81,84,87,89,81,61,39,27,33,56,103,171,218,228,203,179,158,125,106,97,87,82,81,83,83,84,83,82,80,76,64,45,24,11,4,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,8,22,45,70,82,89,97,104,112,123,136,156,193,225,244,242,235,226,214,199,185,183,186,189,192,193,194,195,195,195,195,195,195,195,195,195, -194,195,195,193,193,193,191,190,187,183,180,182,190,208,229,242,243,232,214,201,174,125,87,71,66,68,81,108,141,168,181,188,199,214,226,228,228,226,224,224,225,224,222,217,212,209,207,206, -207,206,206,205,198,187,172,166,173,179,180,177,172,166,156,145,134,122,104,86,70,50,28,14,9,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,16,29,39,44, -129,133,136,137,138,141,143,143,143,146,155,176,200,223,239,244,245,246,248,248,245,239,233,225,216,206,198,194,193,193,193,193,194,194,193,193,193,194,193,193,193,194,197,210,229,243,248,247, -246,241,233,237,243,243,231,204,154,84,33,9,0,0,3,17,39,68,101,128,143,134,111,96,89,74,58,58,82,126,175,208,228,213,160,98,45,24,12,1,1,9,19,30,44,64,84,101, -104,98,91,81,73,64,51,38,31,21,12,8,1,0,0,0,0,0,0,2,8,15,29,51,69,78,87,99,112,124,131,134,137,144,158,174,191,210,224,236,250,246,230,213,208,207,206,204, -203,204,201,199,197,195,194,193,194,194,194,194,194,193,192,192,192,192,190,190,189,187,185,183,182,189,207,228,242,247,233,205,174,140,111,93,72,52,38,29,22,18,16,22,32,42,51,62, -84,115,147,170,182,177,162,152,147,138,126,115,105,96,90,88,87,87,85,82,75,64,50,42,42,48,55,63,74,88,96,97,92,83,71,59,48,38,22,7,3,4,8,6,2,0,0,0, -0,0,1,3,8,11,19,28,36,42,55,71,89,107,120,126,126,121,115,112,111,111,111,111,115,122,128,134,144,163,187,205,213,218,226,233,240,242,241,242,245,246,246,247,248,248,247,247, -248,248,248,248,248,248,247,248,248,248,248,248,246,234,209,178,157,134,107,107,124,141,172,209,232,210,167,130,87,48,33,30,19,12,25,52,83,105,114,120,121,123,153,199,232,241,226,190, -141,80,30,6,0,1,2,6,11,18,30,55,88,124,165,200,209,208,208,208,210,210,207,202,195,172,147,127,92,66,61,61,63,67,78,94,123,150,179,210,228,234,237,240,240,238,232,228, -225,225,234,241,243,235,227,225,209,189,186,190,198,206,214,220,224,225,223,221,216,209,202,196,193,190,190,189,190,188,187,187,186,185,184,181,181,182,188,196,210,233,248,243,221,191,158,131, -112,97,83,70,58,47,38,30,24,19,15,12,10,10,9,9,13,23,42,67,96,113,116,116,115,105,96,91,85,77,64,53,42,33,26,20,16,13,11,11,14,21,33,50,69,84,92,93, -92,91,94,99,106,112,104,85,73,76,82,77,56,40,37,37,41,46,55,66,78,89,102,115,125,130,138,145,147,144,136,130,38,33,28,25,25,25,25,25,28,35,47,61,77,95,116,143, -162,174,183,193,204,210,209,207,207,205,205,204,204,205,204,205,205,205,205,205,205,206,206,205,205,206,206,199,179,140,94,56,35,21,9,2,3,7,21,54,118,183,212,231,229,207,196,194, -166,119,93,101,120,151,189,211,217,227,240,228,188,149,120,100,84,73,67,62,58,58,59,63,69,81,115,173,215,233,238,226,216,219,223,226,230,233,236,237,243,251,252,248,235,220,216,216, -216,220,225,234,246,250,247,238,239,241,239,237,235,238,245,249,252,253,252,244,231,193,148,124,113,115,133,153,171,186,199,212,221,225,228,228,229,227,222,214,206,196,188,183,181,179,178,177, -176,174,175,182,199,217,232,242,247,239,212,178,151,134,121,111,99,88,75,63,52,41,33,26,21,16,13,10,8,8,7,7,7,6,7,10,21,41,60,74,79,73,69,70,77,85,90,91, -89,82,75,68,63,62,62,65,72,80,87,91,87,75,61,57,66,86,108,127,143,155,158,155,152,152,154,152,141,127,124,123,126,130,135,141,143,144,143,138,132,126,117,102,86,68,51,43, -0,0,0,0,0,0,0,0,4,20,47,73,87,92,95,99,104,110,119,128,140,153,162,170,172,165,149,128,108,94,84,82,82,82,82,81,81,82,82,81,81,82,81,73,55,30,13,4, -3,2,4,7,9,9,8,7,16,39,66,107,148,181,207,213,220,232,227,226,226,224,214,196,190,176,132,72,33,23,32,44,58,70,77,83,84,84,85,94,117,156,214,239,216,190,161,135, -132,140,146,149,153,156,159,159,160,175,192,206,223,229,229,228,228,226,219,208,185,158,135,111,105,106,99,88,79,85,104,123,145,178,197,201,215,231,220,195,175,152,151,164,175,182,188,195, -200,205,209,212,216,219,221,223,221,214,204,194,184,177,177,181,186,191,205,227,243,246,238,224,206,181,158,147,141,134,126,118,109,98,84,71,59,48,40,34,30,26,24,22,20,18,14,12, -11,9,8,8,7,8,11,16,19,17,15,17,22,32,43,54,65,77,83,88,90,90,90,87,82,75,65,50,37,31,38,58,91,124,143,151,151,144,136,129,120,118,127,133,133,131,131,131, -129,126,118,109,97,89,82,74,66,59,49,34,19,8,1,0,12,12,12,12,12,13,20,38,65,87,93,84,65,50,41,35,29,27,28,31,39,51,66,87,117,145,155,144,124,93,63,47, -39,32,29,29,29,29,29,29,29,30,33,38,39,41,48,56,60,63,68,77,82,82,82,82,80,79,78,80,87,97,104,104,116,144,149,147,136,110,72,41,30,21,4,0,0,0,0,0, -3,8,13,21,34,61,108,166,211,231,222,173,132,127,132,137,140,139,137,136,136,136,132,123,110,100,99,102,112,119,123,123,119,114,104,91,75,67,71,74,73,72,69,60,48,39,34,27, -26,44,59,66,90,143,197,226,244,244,236,229,222,207,192,181,176,179,181,183,188,194,197,205,217,227,233,232,227,223,228,236,240,244,249,252,246,236,225,216,211,207,206,207,206,203,202,201, -198,191,180,165,148,131,115,103,95,92,89,88,87,84,74,68,65,58,53,57,53,38,22,11,7,6,7,7,6,7,8,10,14,19,24,30,34,35,35,33,30,29,31,37,51,76,106,133, -147,141,122,101,83,66,48,36,28,30,41,53,62,73,84,87,86,82,74,67,61,62,69,75,76,75,72,64,52,42,34,23,71,71,73,77,85,93,103,116,122,103,63,27,9,2,0,0, -0,0,0,0,0,0,11,34,67,107,144,157,158,154,141,127,117,109,104,103,103,103,103,102,102,105,111,118,122,128,137,143,135,123,117,115,113,112,112,112,113,114,115,115,114,114,115,115, -115,118,124,132,129,112,84,55,34,22,14,7,3,1,0,0,6,20,35,63,119,182,224,232,216,191,165,151,155,158,150,136,118,101,92,90,98,111,124,131,133,128,122,117,114,112,106,100, -96,92,89,86,86,87,84,77,74,74,76,81,86,88,88,82,73,73,77,83,95,113,140,166,192,208,216,225,232,241,241,233,225,224,225,226,227,230,231,236,244,251,255,255,255,255,255,255, -255,255,254,253,252,252,251,252,253,253,253,254,254,255,255,255,255,255,253,248,239,227,212,191,170,154,144,137,133,130,128,124,122,122,128,137,135,120,94,65,46,35,25,18,14,12,11,11, -10,10,10,10,9,12,22,37,55,76,97,116,132,145,146,134,110,82,58,46,38,32,28,29,35,49,63,77,90,99,104,105,105,104,103,102,100,97,91,81,71,68,71,78,85,87,87,82, -98,104,115,128,141,139,126,103,69,32,5,0,0,0,0,0,0,0,0,2,12,33,56,75,85,92,97,100,104,115,126,132,141,148,149,148,148,147,150,157,169,180,184,184,183,185,188,186, -171,149,132,123,120,117,105,88,70,55,47,42,42,46,55,61,66,78,97,112,122,137,143,136,124,111,96,84,79,79,84,103,139,177,201,220,238,231,205,181,171,174,179,181,173,147,110,68, -35,17,9,9,14,29,63,108,147,167,166,153,133,109,90,80,76,72,68,66,62,52,36,22,19,20,27,40,57,69,79,91,100,107,119,135,150,153,143,129,110,98,101,114,132,163,193,216, -226,226,226,226,227,230,233,234,236,241,244,242,238,243,246,240,235,234,234,233,234,233,233,233,233,232,229,228,226,225,224,222,214,208,214,225,237,245,247,242,230,214,200,190,182,171,161,144, -125,119,128,136,141,149,152,143,130,116,101,86,76,69,66,66,66,65,66,66,66,75,94,118,137,151,160,167,174,167,148,132,132,138,146,152,154,157,162,168,177,185,189,190,188,184,180,180, -180,180,181,181,177,166,152,140,122,93,70,62,65,70,77,90,156,164,171,174,168,153,132,106,71,43,30,26,26,26,34,56,79,96,109,121,136,150,154,149,138,127,118,112,112,122,141,163, -183,192,189,186,187,193,202,217,231,240,240,236,233,233,233,232,229,225,221,218,216,216,212,198,175,147,116,80,53,40,35,37,40,49,61,72,86,115,152,175,185,191,194,201,212,222,230,242, -251,246,235,222,199,176,162,156,156,161,170,174,160,116,56,11,0,0,0,0,0,0,15,64,122,154,155,136,113,98,94,94,91,87,84,80,74,62,48,41,41,46,57,72,86,93,98,105, -117,131,141,140,125,97,74,59,50,50,59,69,79,90,103,120,132,140,150,161,171,177,175,166,157,154,160,159,150,157,162,152,146,147,146,146,146,144,142,141,139,136,130,123,117,113,110,102, -88,77,82,95,119,146,175,205,227,238,241,243,244,241,236,225,206,188,179,173,167,166,170,172,169,167,165,161,157,154,152,152,152,153,152,152,153,159,167,170,171,175,185,202,220,227,226,227, -235,241,245,246,248,250,251,252,251,249,246,245,243,244,246,248,248,249,249,248,248,245,243,245,245,239,225,207,187,167,156,152,238,238,239,239,236,232,229,223,214,202,192,185,183,185,196,216, -231,238,243,245,245,242,238,234,231,230,228,226,225,223,220,213,206,203,202,203,206,208,209,211,212,204,173,136,120,119,118,118,117,118,133,162,173,167,167,182,200,211,220,220,213,204,195,193, -194,197,201,208,213,222,231,237,239,240,240,240,232,219,209,191,165,141,127,121,116,114,106,94,91,102,123,141,139,102,41,2,0,0,0,0,0,1,5,35,89,129,143,139,133,131,124,108, -93,85,81,80,83,87,89,88,87,88,86,85,88,92,96,104,121,135,142,131,103,74,56,49,49,54,63,71,82,94,105,117,131,149,166,176,175,164,146,133,122,112,104,95,87,83,81,76, -74,74,72,70,70,68,66,64,62,59,56,52,47,42,38,33,28,24,21,21,23,30,45,71,101,127,148,161,170,184,201,221,236,242,244,243,241,237,233,227,218,212,209,207,208,209,207,206, -206,206,207,208,211,218,221,220,219,223,228,238,243,243,242,239,228,216,208,203,202,199,191,184,179,176,178,187,196,202,203,199,195,194,194,195,199,207,215,223,227,227,228,233,239,242,239,237, -151,160,163,164,165,168,175,182,190,198,209,218,223,229,229,218,208,204,203,202,197,190,186,185,185,183,178,170,159,148,131,105,80,66,61,58,56,55,54,54,55,51,32,15,12,16,24,33, -42,48,52,65,76,76,72,79,99,114,134,162,189,219,237,239,236,234,232,228,223,227,236,239,243,243,240,233,209,165,119,82,53,42,42,47,57,66,66,66,75,89,106,125,130,110,66,21, -1,0,0,0,0,0,16,60,113,150,164,162,149,122,87,56,37,28,22,21,24,33,41,44,44,40,32,23,20,21,24,30,43,54,69,85,94,97,97,96,95,98,103,109,119,138,153,165, -174,183,187,186,178,168,159,156,153,148,139,125,110,99,90,81,71,64,59,55,51,47,45,44,43,42,39,36,35,37,40,46,52,56,55,53,50,48,47,48,52,57,62,61,54,55,69,96, -125,149,164,174,185,199,211,223,234,239,241,242,243,243,243,243,243,243,244,243,239,225,208,204,204,209,209,199,184,165,145,129,114,103,94,85,79,70,62,62,69,81,98,111,110,96,75,56, -49,48,48,48,56,70,85,94,92,86,89,100,118,127,127,135,10,16,20,25,33,44,59,73,83,87,91,95,102,114,120,112,102,98,97,95,93,92,91,93,95,104,114,122,124,122,120,113, -101,91,83,73,63,55,51,50,49,49,50,54,61,78,95,108,116,120,120,119,118,118,117,116,116,116,117,117,107,114,138,142,130,123,120,112,102,106,127,142,156,179,200,211,226,233,222,201, -164,128,98,82,87,96,95,100,110,120,129,138,144,138,119,89,58,36,27,26,35,57,94,134,162,170,161,137,103,68,42,25,16,10,5,2,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,8,20,36,51,66,81,90,95,98,101,108,123,134,136,133,132,131,130,128,126,125,125,126,131,139,144,145,141,138,131,122,112,104,95,85,77,72,70,67,67,65,64,70,84,100,111, -119,122,122,121,120,119,119,117,116,115,114,106,85,66,61,64,71,78,83,87,91,97,110,130,153,169,179,188,191,193,197,199,201,202,202,198,187,166,150,148,145,142,134,123,109,89,69,63, -66,68,70,75,77,78,81,84,85,89,83,64,40,18,3,0,0,0,0,0,0,0,2,3,0,0,1,2,4,3,3,5,0,0,0,0,0,0,2,8,12,13,12,12,13,19,23,21, -17,16,17,18,20,21,23,24,26,34,47,64,81,94,103,112,122,128,130,131,130,129,128,127,127,127,128,128,131,133,130,122,112,106,103,102,102,101,100,100,99,98,100,102,95,88,87,88, -85,83,83,84,84,84,86,87,87,91,101,107,125,156,189,218,241,242,219,179,144,121,98,83,81,94,110,123,135,143,146,143,136,125,119,121,130,147,164,171,163,141,111,79,54,38,26,19, -12,8,5,3,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,2,4,8,14,21,27,33,38,41,45,53,57,58,55,55,56,56,56,56,54,53,53,58,67,80,94,103,110,118, -126,131,133,134,133,130,128,128,126,126,125,126,128,129,124,115,104,96,94,92,92,92,92,91,90,91,96,98,93,89,87,88,87,87,86,88,89,90,91,94,96,98,102,105,107,108,110,111, -106,103,103,102,101,93,83,79,78,79,81,83,88,90,94,104,110,111,117,128,140,146,144,123,98,78,48,18,3,1,1,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,2,3,5,7,10,11,13,14,16,18,20,24,30,35,40,49,60,69,77,87,96,103,108,109,110,110,111,110,106,93,76,63, -54,49,46,45,44,43,42,40,38,36,37,37,39,41,42,40,39,38,36,38,43,46,46,41,34,29,27,26,27,29,39,61,102,149,200,230,228,215,196,153,90,58,52,58,72,88,104,117, -124,128,131,134,138,143,148,149,143,126,104,81,53,28,14,9,6,5,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,9,15,14,10,12,17,19,22,24, -25,26,27,27,27,26,25,25,24,23,24,26,28,32,34,42,51,59,66,76,85,92,96,97,97,97,96,95,90,73,54,38,27,22,19,18,18,18,17,17,16,17,20,24,26,30,32,33, -33,32,33,36,42,47,47,43,36,33,33,33,33,33,34,32,27,23,21,21,22,18,15,14,15,18,21,24,31,40,52,63,66,63,66,75,86,99,107,110,100,78,58,41,26,12,1,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,4,5,7,10,13,14,14,14,14,14,13,10,6,5,4,5,6,8,10,13,15,17,21,24,27,29,31,31,32,34,35, -36,38,40,43,47,51,53,54,56,57,57,58,56,52,48,47,47,46,46,45,44,42,41,38,35,34,31,28,26,24,22,20,17,15,13,11,10,10,8,7,4,3,2,1,0,0,0,0, -0,10,44,93,135,167,198,226,218,182,144,103,74,68,62,59,62,66,70,73,74,75,77,82,93,104,113,117,109,79,46,23,11,4,1,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,4,13,22,33,51,68,84,95,95,75,61,51,46,45,46,47,46,46,46,45,45,45,40,32,23,16,12,9,8,8,8,9,10,11,13,17,20,20,22,21,21,21,20,17,11,5,3, -2,1,1,1,1,1,1,1,1,1,1,1,2,2,2,3,3,3,3,2,3,4,5,5,5,5,5,5,5,5,5,4,5,5,5,5,5,5,5,6,6,6,6,6,6,5,7,9, -10,9,9,11,15,21,30,49,72,84,87,86,85,77,54,27,9,3,1,0,0,0,0,0,0,0,0,0,0,1,1,1,77,81,87,96,105,110,111,111,111,111,111,108,99,85,77,71, -61,50,40,32,28,30,32,33,34,35,35,37,41,46,49,50,52,53,53,53,55,56,57,57,59,60,61,64,66,67,68,69,69,69,69,68,64,61,58,55,51,48,45,42,38,35,33,30, -27,23,22,25,32,46,58,63,64,63,61,60,58,55,58,62,61,58,57,59,66,77,96,138,189,222,237,232,215,202,175,137,96,66,56,46,38,31,25,20,19,22,30,48,77,97,98,88, -77,65,57,48,41,37,37,39,43,50,56,65,76,83,84,87,104,123,138,148,156,164,180,196,205,215,220,217,212,207,203,200,197,194,190,187,186,185,186,180,162,139,112,80,55,44,32,17, -7,2,0,0,1,1,0,0,0,0,1,1,1,2,2,2,2,2,1,1,0,0,1,1,1,2,2,2,3,2,2,2,2,2,3,8,19,36,51,58,60,61,61,61,60,58,61,65, -65,66,66,66,67,66,66,66,66,67,66,62,56,49,42,31,19,10,5,4,5,5,5,6,11,18,30,49,73,94,103,99,83,70,62,53,45,40,40,40,40,40,44,52,62,67,69,69, -72,68,65,59,54,52,51,50,48,46,49,56,70,97,137,163,163,158,153,151,155,161,157,142,124,107,97,102,112,118,120,121,123,123,123,124,127,128,132,136,139,141,146,149,150,152,153,153, -154,154,153,151,147,139,128,117,106,93,84,80,74,67,58,53,52,60,70,83,96,105,103,99,96,95,94,93,94,103,120,126,124,122,122,122,120,119,117,118,127,144,167,197,219,229,241,244, -230,206,188,164,143,119,90,65,47,35,29,29,38,54,67,77,87,96,100,103,103,108,126,147,172,193,200,205,209,210,209,211,223,231,235,234,233,232,228,222,215,209,205,207,209,212,215,218, -222,223,224,223,220,215,212,211,218,225,227,221,207,198,179,147,111,70,43,24,9,6,9,16,22,27,35,40,41,42,41,42,43,43,42,39,32,19,9,4,1,1,2,2,3,4,6,11, -18,30,46,63,80,90,92,89,88,88,89,89,91,102,120,126,125,124,124,124,125,125,124,125,125,124,124,124,122,120,117,106,88,64,38,17,6,4,5,6,6,5,2,3,12,29,43,56, -72,81,86,89,89,88,88,88,88,88,88,86,81,78,76,76,52,53,52,49,45,44,43,42,47,67,87,108,137,175,214,231,233,235,237,239,235,237,242,242,238,233,229,230,231,229,229,230, -231,231,230,230,232,234,236,238,239,239,241,242,242,241,242,243,243,243,242,242,241,238,234,227,217,205,197,193,190,181,165,148,140,144,153,154,140,112,85,66,56,51,46,45,45,58,77,80, -76,74,74,73,73,72,71,70,68,67,69,80,95,108,132,168,206,225,231,233,232,230,224,213,198,188,183,182,181,181,182,184,187,190,194,197,200,208,226,235,231,221,214,210,205,206,209,208, -196,176,163,156,150,143,124,102,85,69,57,51,47,50,54,61,71,81,92,103,113,117,117,118,124,132,147,171,187,199,214,230,234,222,204,177,146,124,111,98,87,83,82,84,85,86,87,90, -92,90,88,88,87,78,65,55,49,47,48,49,52,58,64,76,92,112,131,136,121,92,63,45,38,34,33,33,36,51,71,76,72,71,72,71,70,69,69,69,69,69,70,74,81,88,97,109, -119,121,108,79,47,23,10,4,3,4,5,4,3,3,4,8,14,22,29,36,43,45,44,44,44,45,44,39,34,38,45,51,107,108,109,112,119,126,139,162,193,221,230,229,223,205,170,151, -152,156,161,163,157,166,190,214,229,238,244,249,252,251,252,251,251,249,248,247,246,246,245,244,243,243,243,243,242,243,244,243,243,243,243,243,245,247,250,253,254,254,254,254,254,253,248,238, -224,211,195,172,148,124,106,90,75,58,43,32,23,22,23,23,21,20,19,17,18,16,15,14,14,12,12,11,13,15,21,38,67,99,129,153,161,165,174,184,194,199,200,199,198,198,199,198, -198,197,197,195,197,193,166,132,103,85,85,92,103,116,126,130,125,119,115,114,113,112,110,107,101,92,78,61,47,41,39,40,42,46,52,61,73,88,106,131,145,144,139,134,130,134,147,165, -187,207,218,232,241,243,235,216,183,139,97,76,60,48,42,42,45,45,45,51,67,92,116,131,131,122,115,114,118,120,115,112,112,116,122,123,112,95,78,63,48,33,19,9,3,3,6,7, -7,7,9,11,18,27,33,36,36,36,36,38,41,45,51,62,85,111,128,137,130,111,88,67,45,22,8,3,2,0,1,1,0,1,1,1,2,3,5,10,17,26,38,52,67,85,97,104, -109,116,130,163,198,214,228,241,234,212,189,171,153,134,121,121,123,127,131,135,140,146,156,166,173,175,175,183,196,207,211,210,204,196,186,181,178,175,172,172,173,174,177,179,180,183,185,186, -188,191,195,200,205,211,217,223,225,225,226,225,226,231,240,247,249,246,236,213,186,159,136,124,120,114,103,87,69,52,38,28,24,23,21,19,18,16,16,14,13,12,12,11,9,7,4,3, -4,13,35,65,94,114,122,123,120,109,93,80,68,59,54,52,52,52,55,62,72,78,73,73,81,93,104,112,115,111,102,95,89,85,84,84,84,84,85,89,98,107,115,117,116,114,112,113, -113,113,113,114,115,119,126,136,140,134,125,116,111,106,103,101,103,101,91,95,112,136,162,197,224,227,211,193,166,126,80,40,19,14,22,39,60,87,113,129,125,108,95,91,92,87,75,61, -48,38,36,41,52,65,77,85,88,84,74,60,46,37,38,46,61,81,93,103,134,164,178,182,182,182,181,181,181,181,180,181,194,201,199,209,219,222,222,215,196,154,111,74,46,26,16,13, -13,14,17,25,35,44,54,68,80,93,104,112,115,111,105,103,186,202,218,237,243,236,215,168,111,67,54,63,76,87,93,97,101,105,110,114,120,124,125,122,117,114,112,112,118,126,133,136, -134,128,122,121,121,123,125,128,131,136,141,145,151,155,161,168,176,184,191,195,195,194,193,194,195,193,190,187,186,188,197,207,217,229,243,249,244,227,192,151,128,123,126,130,129,121,105,84, -66,54,48,45,43,42,40,40,45,51,56,57,56,53,47,38,28,17,11,15,27,47,70,91,108,118,118,113,105,94,85,81,81,82,87,96,106,112,118,119,115,106,93,79,65,48,35,29, -27,30,34,37,38,38,38,41,47,57,71,86,99,104,103,98,93,90,88,87,85,84,81,71,59,47,38,34,33,31,27,25,24,18,9,2,0,3,14,37,77,128,169,189,211,227,222,197, -167,145,127,121,118,113,106,102,100,91,87,90,97,97,94,86,74,60,46,34,23,19,24,37,57,82,110,132,152,171,187,199,212,223,229,231,231,219,209,207,209,213,214,215,215,215,213,211, -217,215,203,199,200,205,210,220,238,249,243,222,192,157,127,107,99,101,105,114,124,129,133,133,132,135,133,128,122,125,138,155,252,250,247,243,238,235,226,202,171,135,95,67,50,36,30,29, -34,43,52,61,70,80,91,101,111,119,122,125,128,130,133,134,137,136,134,131,132,135,137,142,146,152,157,166,175,182,191,198,204,206,206,202,200,201,202,201,197,191,186,184,180,177,175,176, -180,189,206,223,237,247,248,231,205,181,165,156,157,163,167,160,143,124,112,108,105,103,102,102,106,109,108,107,105,104,102,97,90,78,62,45,32,29,31,36,45,63,82,95,106,115,119,120, -119,118,115,108,97,84,73,60,47,42,45,56,73,89,98,105,116,130,145,151,152,152,152,152,152,153,154,156,159,160,155,142,123,104,92,75,54,39,35,36,39,42,42,42,41,41,41,41, -40,35,26,16,12,11,11,10,11,19,36,56,87,128,174,213,233,240,236,225,217,212,203,189,173,159,155,168,185,189,189,186,182,176,166,145,118,99,96,106,126,151,183,212,234,243,240,229, -211,189,174,167,150,122,109,108,112,116,116,116,117,117,116,115,116,109,91,77,67,65,66,71,99,141,180,215,236,244,239,227,218,217,218,220,219,217,214,208,208,216,222,226,229,237,247,251, -141,125,117,114,113,121,149,181,207,224,227,215,193,160,133,102,80,77,78,81,91,107,122,136,145,150,154,157,159,162,163,165,167,169,169,167,167,170,172,176,180,184,190,196,202,207,211,213, -213,213,212,212,214,213,208,200,190,184,180,176,172,167,164,161,160,163,170,180,193,214,237,250,253,248,237,218,198,182,173,168,158,140,125,121,119,118,116,113,105,93,85,80,76,74,77,82, -90,97,101,99,92,88,83,64,46,39,39,44,51,57,62,63,61,57,47,36,32,36,44,54,75,112,152,185,208,224,230,234,237,241,244,244,243,243,243,243,243,242,242,242,242,242,242,240, -233,225,218,205,178,152,137,127,116,107,103,102,102,102,103,103,103,103,99,93,90,89,89,89,90,89,91,98,105,116,138,168,196,221,239,248,253,255,255,252,248,243,241,245,249,250,250,249, -249,248,246,240,232,230,229,229,227,223,215,200,175,152,138,130,118,98,81,76,75,75,74,73,66,56,49,46,46,47,52,61,70,80,87,87,82,79,74,56,38,36,46,68,102,147,191,224, -242,251,255,252,249,248,248,248,248,250,250,244,223,206,186,165,8,7,10,12,13,16,36,66,94,126,162,190,217,235,242,239,226,212,188,159,147,145,137,130,127,127,131,134,137,140,142,144, -147,152,160,167,170,173,178,183,189,195,199,200,204,210,215,217,219,220,220,218,214,209,203,197,193,191,188,184,180,176,172,168,164,161,159,157,159,168,184,205,223,237,247,250,244,231,214,197, -179,151,129,115,106,97,91,84,76,69,63,59,55,51,46,45,47,53,64,75,84,90,92,81,68,63,62,60,59,59,61,66,71,70,64,78,108,143,172,191,212,233,244,243,235,223,214,210, -203,193,182,179,178,179,184,190,195,196,196,198,200,201,205,215,227,236,242,249,252,249,242,228,209,188,178,177,177,177,177,177,177,180,185,187,189,189,189,191,193,193,192,193,195,203,218,232, -242,246,248,246,241,232,228,228,230,232,232,228,219,216,217,219,220,221,221,205,176,156,142,123,107,90,72,55,46,45,46,49,48,41,35,32,31,27,23,19,12,9,6,6,6,6,8,11, -17,28,42,58,71,78,80,69,54,51,56,75,109,157,202,230,241,227,189,148,126,123,124,125,124,126,125,101,61,40,26,14,30,37,43,46,46,50,66,82,85,83,87,94,105,123,145,177, -202,222,239,236,225,211,176,138,116,107,104,107,111,115,118,121,124,127,132,137,142,146,155,170,182,188,193,197,201,206,210,214,216,216,214,212,209,208,206,205,203,200,198,195,192,189,186,183, -179,175,171,166,162,162,167,174,181,192,209,226,240,248,251,250,244,229,212,193,169,146,129,116,102,90,82,77,71,66,60,54,48,44,41,40,42,43,46,48,52,64,76,85,97,116,136,157, -176,187,197,214,232,243,245,243,236,217,182,144,113,90,83,85,90,86,80,78,79,82,95,110,112,109,108,107,104,101,103,109,115,121,128,149,180,203,219,232,241,243,243,243,243,243,243,243, -243,243,244,244,245,245,245,247,249,249,249,248,248,248,244,234,217,196,175,155,130,106,99,99,101,101,97,83,68,62,62,65,64,66,64,48,22,18,32,41,43,42,41,42,46,49,50,51, -51,50,50,49,46,41,33,21,8,3,3,4,5,5,5,5,4,4,5,8,11,17,29,46,65,103,158,206,232,235,213,180,148,93,35,10,3,3,3,3,2,2,0,0,0,0,1,12, -52,41,33,30,31,34,41,43,36,31,29,28,25,24,30,43,58,82,130,175,199,222,237,228,210,187,157,138,125,115,113,116,119,121,124,127,131,135,145,161,171,176,182,188,194,197,202,206, -209,211,212,213,213,213,212,210,209,207,205,203,201,198,195,193,191,188,185,181,177,178,182,182,178,176,178,183,193,206,219,229,242,250,252,249,240,225,213,205,190,167,142,124,112,103,97,92, -87,81,77,74,74,77,91,113,133,153,171,184,198,217,231,240,245,246,243,234,218,191,161,139,117,84,47,24,20,33,46,53,52,46,39,36,35,36,43,45,38,33,31,29,24,21,20,20, -18,15,16,25,43,65,88,115,145,168,174,174,173,173,173,173,173,173,172,172,173,172,175,182,184,183,182,179,171,160,137,106,76,53,37,26,17,11,9,8,9,8,6,3,0,0,0,0, -0,0,0,0,0,8,33,44,43,44,44,43,39,35,34,35,35,36,36,37,42,47,53,54,42,22,8,4,4,5,5,5,4,2,1,7,33,80,135,178,205,225,230,200,150,101,55,27, -19,21,27,27,28,28,28,28,28,29,26,27,33,49,61,61,132,89,60,33,12,0,0,0,0,0,0,4,9,17,26,35,44,53,66,87,109,140,179,211,232,243,241,231,213,179,152,138, -132,130,132,135,138,142,146,152,155,161,169,178,186,193,200,205,209,212,215,218,220,220,220,219,218,217,215,214,211,208,204,202,199,196,193,192,190,188,187,184,180,178,175,172,169,170,174,180, -193,210,224,236,246,251,252,251,250,244,232,218,203,196,192,190,187,184,184,186,188,195,212,228,238,244,246,245,243,238,226,207,188,167,145,121,91,62,38,25,18,13,15,26,45,55,45,31, -17,12,7,7,7,7,7,5,4,3,4,6,9,14,19,25,29,29,32,38,45,54,62,68,76,81,79,73,68,65,63,62,63,64,63,63,63,61,60,57,49,43,42,39,35,29,19,10, -4,2,2,2,2,3,2,3,3,2,2,3,2,3,2,2,2,2,2,2,2,3,8,9,7,7,7,6,5,4,3,3,3,4,4,4,6,11,20,36,52,54,42,24,8,2,1,1, -9,24,52,112,183,223,228,209,180,149,98,45,13,1,13,61,115,160,182,184,183,183,183,183,183,183,183,187,193,199,194,175,231,225,215,188,146,92,49,29,23,22,28,43,60,78,94,107, -117,123,128,137,147,156,164,172,184,200,216,229,243,246,236,222,207,194,187,184,184,186,186,182,178,179,186,194,201,207,211,215,221,228,236,241,244,244,244,244,244,244,243,243,241,237,232,225, -218,213,207,202,199,196,194,192,190,188,186,183,181,179,178,176,177,179,184,193,207,220,226,229,235,244,250,252,252,250,249,249,248,248,248,248,248,247,244,236,225,213,199,186,172,150,124,99, -80,63,48,37,28,24,24,26,33,43,52,58,52,31,12,5,4,5,5,6,5,5,6,8,14,23,34,47,63,78,90,102,108,109,112,117,123,128,129,128,126,122,116,111,106,102,100,100, -102,103,105,106,107,106,100,80,57,44,40,39,40,39,33,26,20,15,9,6,6,7,5,4,2,1,1,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,1, -1,1,1,1,1,1,1,3,14,33,47,50,38,27,44,79,126,172,206,232,218,170,116,78,54,39,27,23,35,72,145,214,233,218,204,200,201,202,204,206,209,212,214,215,210,204,203,214, -101,131,165,201,226,228,208,190,177,151,139,143,152,160,166,170,172,174,178,184,195,202,202,202,202,203,206,211,222,236,247,253,254,252,248,246,244,244,243,242,240,239,240,242,244,245,245,246, -250,252,252,251,250,250,250,250,249,249,249,248,249,251,252,251,249,246,241,231,221,214,208,204,200,199,197,195,194,192,191,190,188,187,186,185,186,188,189,190,193,201,210,220,226,228,228,227, -227,225,223,220,217,211,199,181,168,157,148,141,132,115,97,88,83,77,69,62,59,61,63,64,63,57,46,33,19,8,7,6,6,6,7,10,17,25,36,52,74,97,115,130,143,150,153,155, -155,153,150,148,145,142,139,135,133,133,132,133,133,135,138,140,144,147,150,152,155,156,156,152,141,131,129,129,130,126,118,109,102,97,89,83,81,81,79,73,66,65,64,64,62,62,64,64, -63,59,49,32,11,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,13,28,51,81,115,155,200,230,239,231,211,174,126,94,81,79,81,90,109,140,186,226,239,203, -143,97,77,72,73,76,81,84,84,80,71,61,50,41,42,60,6,21,46,85,138,191,223,236,245,249,244,237,232,231,231,231,233,234,237,241,245,246,245,245,245,246,246,246,246,247,249,250, -252,254,254,252,247,243,242,243,244,246,247,248,250,250,252,251,250,247,244,242,241,241,241,240,240,239,239,238,239,241,243,246,248,251,252,253,251,247,242,236,231,225,221,218,216,212,207,203, -200,200,199,199,196,195,193,191,188,186,184,187,193,201,206,206,203,195,185,174,164,154,142,135,130,128,126,127,128,119,106,99,95,92,89,84,78,70,60,50,37,25,16,10,8,7,8,8, -14,24,38,57,81,102,119,135,150,159,162,162,162,159,155,150,145,139,134,127,117,108,100,96,95,98,102,106,111,115,120,124,127,130,133,136,142,149,154,156,156,155,155,156,159,167,177,191, -206,220,226,224,223,223,223,221,217,217,217,217,216,217,217,217,216,215,207,187,144,103,80,66,63,63,65,66,61,49,39,35,35,38,39,39,42,50,79,123,153,177,194,211,229,242,234,208, -178,144,114,91,77,74,84,103,137,180,218,240,238,198,134,75,48,45,48,50,49,43,37,30,22,12,4,0,0,0,0,0,65,88,111,129,144,155,166,173,187,206,215,223,224,220,217,213, -207,204,199,189,165,151,150,152,154,157,160,162,165,167,169,169,171,173,171,164,156,160,169,174,175,179,186,194,201,208,216,221,225,230,233,235,236,237,238,237,236,235,235,235,236,237,238,239, -240,241,243,245,247,250,252,253,254,253,251,249,247,244,239,231,225,220,219,217,216,215,214,212,210,208,206,205,205,203,198,190,181,167,153,141,131,121,114,111,107,105,102,101,101,96,89,84, -77,71,66,61,53,43,33,25,20,16,13,11,12,18,27,40,64,91,118,139,153,161,163,165,164,159,153,143,130,114,101,88,78,72,66,58,50,42,35,33,33,36,41,46,51,54,57,57, -62,71,83,91,98,113,129,130,128,135,153,167,183,212,232,243,245,239,234,233,234,234,235,234,231,229,229,229,230,234,236,238,240,241,242,246,250,243,230,218,215,216,217,218,214,208,200,197, -200,202,203,203,207,214,230,240,232,222,210,200,187,159,121,88,71,59,53,60,88,134,179,208,227,226,193,147,94,42,15,9,11,12,16,17,17,13,7,4,3,2,2,2,3,9,19,31, -144,154,158,159,158,153,146,135,118,98,85,79,73,66,60,56,53,52,51,46,40,39,42,46,50,53,55,57,59,62,63,64,66,67,69,70,75,84,96,104,110,118,130,142,153,165,175,186, -195,203,211,215,218,220,222,221,220,219,219,219,220,222,225,228,230,230,230,229,229,231,233,236,240,243,247,249,250,251,253,253,251,247,244,240,235,231,229,227,226,224,220,215,207,196,185,176, -165,157,147,140,134,129,125,121,118,113,110,106,103,98,93,87,80,73,64,55,48,39,32,26,22,19,20,28,48,75,98,118,138,155,163,164,164,160,154,143,127,103,83,66,49,37,30,26, -23,23,22,21,21,21,25,31,35,37,37,37,38,46,67,99,134,163,181,187,190,192,197,202,209,219,228,230,230,215,186,153,122,102,94,96,97,100,102,96,86,82,81,81,83,91,101,113, -123,128,128,134,156,178,201,216,218,217,217,217,215,214,217,218,217,214,214,213,210,202,183,152,127,111,99,87,71,51,40,45,77,124,165,193,217,229,215,180,135,86,42,15,3,1,3,5, -5,5,4,4,4,5,3,2,2,3,7,18,39,68,96,117,159,156,148,135,116,92,72,53,34,18,9,3,0,0,0,3,6,9,13,17,21,26,29,32,35,36,36,37,37,38,39,40, -41,43,45,48,53,57,64,73,83,96,109,121,134,146,157,167,175,183,189,194,198,201,204,205,206,207,207,208,209,210,211,212,214,215,215,215,216,217,216,218,219,220,223,224,226,229,233,237, -238,237,238,240,242,243,243,242,241,241,238,232,225,218,213,208,204,199,196,194,192,192,186,171,153,136,126,118,113,108,102,95,88,80,70,60,52,44,36,34,38,49,68,95,126,149,158,163, -163,158,152,141,122,100,81,65,48,35,31,35,43,53,65,77,90,101,106,109,120,136,150,157,158,157,155,156,163,180,204,219,219,214,208,205,205,203,201,196,184,164,141,122,106,73,43,26, -18,15,16,16,16,17,17,15,11,10,9,8,8,10,13,16,21,22,21,21,23,30,43,54,55,55,55,54,52,51,53,56,55,52,54,54,51,43,33,24,22,29,43,65,102,137,165,190, -215,233,232,202,159,113,63,30,12,2,1,3,5,6,6,6,6,5,4,4,4,4,5,7,17,33,56,86,120,145,156,159,126,101,73,50,32,17,7,1,0,0,0,0,0,0,0,3, -6,8,12,14,16,19,22,26,33,45,60,67,67,67,67,68,69,70,71,73,77,81,86,87,83,83,90,102,115,128,141,152,161,170,177,182,187,191,194,196,198,200,202,202,204,204,205,206, -207,209,210,211,212,212,214,215,215,215,215,216,217,217,218,218,218,219,219,220,222,225,228,230,229,228,229,231,233,233,232,231,229,226,222,216,209,197,179,159,143,134,128,122,118,112,107,99, -92,84,76,68,63,62,67,80,103,126,146,159,165,165,160,144,118,95,78,64,62,53,43,45,66,99,135,164,183,196,207,215,222,227,229,231,232,230,225,221,219,218,218,217,216,209,191,159, -123,92,73,65,64,63,62,59,54,45,33,26,23,19,19,20,20,19,18,18,16,16,15,14,14,14,14,13,12,11,10,8,8,7,6,6,5,3,2,1,1,0,0,0,0,0,0,8, -22,28,24,21,20,27,39,58,96,132,156,168,171,166,156,149,139,116,82,45,19,5,0,0,2,3,4,4,5,4,4,4,5,6,7,10,14,22,36,57,86,114,137,153,160,161,157,149, -41,23,9,2,0,0,3,10,19,30,43,55,70,94,115,122,124,125,126,127,128,130,132,142,155,172,182,184,184,184,184,184,184,185,185,186,187,188,190,190,185,169,157,151,139,124,123,132, -144,153,162,169,175,179,183,186,190,192,194,195,197,198,199,201,203,205,206,207,209,210,211,212,214,215,215,216,216,217,217,217,218,218,219,219,219,218,217,216,216,214,212,209,207,204,200,195, -189,184,177,169,160,151,145,141,138,134,132,129,125,122,120,116,112,110,112,113,117,125,138,152,164,168,168,165,157,135,101,76,80,98,111,138,169,164,152,159,179,201,217,224,223,216,203,187, -163,143,138,140,139,130,112,98,91,89,88,86,86,83,76,64,52,40,33,31,30,30,30,29,29,28,29,28,28,28,27,26,25,24,24,22,22,21,20,18,18,17,16,16,15,14,14,13, -12,11,11,10,9,8,8,9,10,16,29,48,70,94,121,151,169,170,166,161,161,169,177,176,157,125,88,56,29,12,4,2,2,1,1,3,5,7,8,8,8,9,9,9,11,16,21,26, -32,40,53,67,79,97,118,138,153,159,161,159,152,133,103,75,0,0,0,0,6,18,41,74,111,141,158,162,158,152,144,141,141,142,143,144,144,145,144,137,122,99,74,68,69,68,69,69, -70,71,71,72,74,76,79,89,117,153,172,187,202,203,174,141,127,132,144,152,160,165,170,174,178,181,184,186,188,190,192,194,196,198,200,201,203,204,207,208,210,210,211,213,213,214,215,215, -216,217,217,218,218,217,217,216,215,213,212,208,204,201,198,195,191,189,187,184,180,176,173,170,167,164,161,159,159,160,164,165,165,167,171,173,174,175,175,174,170,162,145,118,93,91,108,145, -182,181,172,151,110,92,94,97,96,93,89,87,87,85,78,66,50,42,42,42,44,44,43,40,39,38,39,39,38,38,39,39,40,40,40,40,39,39,38,38,37,36,35,34,33,32,32,31, -30,29,28,26,25,24,23,22,21,21,19,18,17,16,15,15,15,13,12,11,11,10,13,20,36,63,97,127,142,139,124,96,76,78,88,93,91,78,56,37,14,0,0,0,0,4,14,23, -32,45,56,63,65,65,65,65,65,66,66,67,72,83,96,106,113,124,136,145,151,157,160,161,159,151,136,112,82,51,27,11,0,0,0,1,2,6,9,15,25,32,36,33,24,13,6,4, -5,6,7,8,9,10,11,12,12,9,9,9,8,8,8,8,8,8,10,11,12,14,19,24,30,41,54,69,93,138,190,213,188,151,126,132,141,148,155,160,165,169,172,174,177,179,182,185, -187,190,192,193,195,197,200,201,203,204,205,207,208,209,210,211,211,212,213,213,213,214,214,213,212,210,208,207,209,212,214,216,215,216,215,213,211,209,207,205,203,202,200,198,198,199,199,197, -194,192,189,185,181,175,165,151,128,97,73,94,145,182,179,151,95,54,42,34,28,27,28,29,31,32,34,35,36,38,40,41,42,44,45,45,46,46,47,48,49,50,49,49,48,48,48,48, -48,47,47,46,46,45,44,44,43,43,42,42,41,40,39,37,36,35,34,32,31,29,28,26,25,24,22,21,19,19,17,17,16,15,14,13,12,12,12,13,17,22,26,29,28,23,15,5, -0,0,0,0,0,0,0,0,0,0,1,11,32,62,89,106,119,131,140,143,144,144,144,145,145,145,145,146,148,153,157,159,160,161,161,161,159,156,149,135,111,82,54,31,15,6,3,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,2,2,3,4,5,9,13,15,14,13,11,9,9,9,8,8,10,11,12,14,16,21,25,30,35,42,49,58,80,129, -181,213,173,125,120,127,135,143,148,153,158,161,164,167,170,173,176,179,181,183,185,188,190,192,194,196,197,199,199,201,203,203,204,205,206,207,207,207,207,206,206,207,210,215,222,227,228,227, -225,223,221,218,216,214,212,210,209,208,206,204,203,201,196,191,185,179,167,154,139,123,102,79,54,55,132,190,155,93,51,33,27,29,32,35,37,39,40,42,43,44,45,46,47,49,49,50, -51,52,53,53,54,55,56,57,57,57,58,58,57,57,57,57,57,56,56,55,54,55,55,55,57,57,58,60,61,62,60,59,57,55,53,48,45,42,40,38,35,32,29,28,26,24,23,22, -20,19,19,18,17,17,15,15,13,10,8,7,6,6,5,5,6,5,5,4,3,3,2,1,3,13,34,69,111,141,154,158,160,160,160,160,159,159,159,160,160,160,160,160,160,159,155,152, -148,144,134,120,107,93,75,53,32,15,6,2,2,3,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,2,3,3,3,4,4,5,7,10,10,10,9,8,7,6, -6,6,5,6,7,9,10,13,16,20,25,31,39,46,53,59,73,127,201,201,173,150,124,122,129,136,141,145,148,151,156,159,162,166,168,170,173,176,178,180,182,184,186,187,189,191,193,193, -195,196,197,198,198,198,198,201,205,213,222,228,229,229,226,222,217,211,204,197,193,190,187,185,184,182,179,177,172,165,154,141,132,120,104,87,72,58,45,43,85,171,186,94,36,28,31,34, -37,39,40,42,43,45,46,47,49,51,51,53,54,56,56,58,59,60,61,61,62,63,63,65,66,67,69,70,71,74,77,78,79,79,78,78,78,79,82,86,91,94,101,107,112,113,113,113, -111,108,102,95,87,80,74,70,64,58,53,50,46,45,44,42,42,40,39,36,35,34,34,33,30,27,23,19,16,13,9,8,7,6,6,4,4,3,4,15,38,74,113,144,157,159,157,151, -144,135,124,117,115,115,115,115,115,115,115,115,112,104,91,80,71,63,50,37,26,19,12,7,4,2,2,3,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,2,1,1,2,2,3,2,3,4,5,5,5,5,4,5,6,7,8,10,14,18,22,25,26,28,28,29,31,34,40,47,53,58,91,150,183,206,191,131,108,114,121,126,130,134,138,142, -144,148,151,155,159,160,162,165,168,169,171,173,175,178,178,180,181,182,183,184,186,190,197,208,218,225,227,227,225,218,204,191,181,171,161,153,147,142,138,135,132,129,125,123,118,110,101,92, -83,75,64,56,62,84,112,155,198,156,64,31,35,39,39,41,42,45,45,47,49,50,52,54,56,57,59,61,62,64,65,66,67,68,70,72,73,74,77,81,85,89,93,99,105,112,120,127, -132,133,133,136,138,142,147,156,162,168,175,184,187,188,189,188,187,185,179,170,160,152,145,139,130,120,111,105,102,101,99,98,97,96,94,90,86,84,83,81,73,61,46,33,22,15,11,10, -9,8,6,6,9,20,44,80,119,147,158,160,156,140,108,79,63,51,38,32,30,31,31,31,31,31,31,31,29,24,18,14,10,8,6,5,3,3,4,4,5,4,4,3,3,4,4,3, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,3,3,3,2,2,3,7,12,21,30,42,54,66,77,83,84,81,75,68,59,55,57, -63,68,71,76,86,115,184,208,163,124,106,108,115,121,123,128,134,143,154,162,166,165,163,164,166,164,160,159,159,162,162,164,166,168,172,177,185,198,211,219,222,222,220,212,198,180,164,152, -144,137,131,125,120,115,112,109,105,102,98,95,90,85,79,73,71,73,95,133,174,193,186,160,94,44,36,41,43,44,44,46,48,50,52,54,56,58,60,62,64,65,67,69,71,73,74,76, -79,82,86,90,95,100,107,117,127,136,146,155,164,173,184,194,201,204,207,209,212,216,222,228,233,234,237,240,241,240,239,239,239,238,236,232,227,222,219,215,207,199,192,187,185,183,183,182, -183,186,187,187,185,183,181,181,177,166,148,124,98,76,58,48,44,42,45,54,72,102,135,160,170,169,164,148,117,75,39,21,13,8,4,3,1,1,1,1,1,2,1,2,2,2,2,3, -3,3,4,5,4,3,5,5,5,3,3,3,3,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,1,1,1,0,2, -6,15,27,41,59,76,93,109,122,131,137,139,137,131,123,121,125,128,132,133,131,125,130,172,213,216,179,146,141,144,148,154,165,177,187,194,195,195,195,196,198,198,196,194,194,195,196,197, -199,203,207,213,222,229,231,226,222,212,197,175,155,142,135,129,125,120,116,111,105,100,97,94,91,87,84,84,88,92,106,137,160,180,197,182,140,89,62,48,40,42,44,45,47,48,49,51, -54,57,59,61,64,65,68,70,72,75,77,79,82,85,88,94,100,110,119,131,140,150,161,176,190,200,209,217,223,228,234,240,241,243,244,245,246,248,251,252,253,253,253,253,253,253,252,252, -251,251,251,252,251,250,250,248,246,245,242,241,241,240,241,241,242,244,246,246,246,245,245,246,246,246,244,239,229,214,196,178,164,156,160,170,185,199,202,202,200,193,173,147,118,91,72,63, -57,48,37,28,21,15,12,11,11,11,11,12,13,11,9,6,5,4,5,4,5,4,4,4,4,4,2,2,2,2,3,3,23,17,14,14,11,6,4,1,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,4,8,17,29,42,57,72,87,101,116,129,140,149,155,159,161,163,165,167,169,171,172,172,169,166,175,202,229,231,220,216,217,219, -221,222,223,224,226,229,233,237,242,247,251,250,249,249,249,249,250,251,252,252,253,253,253,251,244,236,229,218,202,191,186,184,180,175,173,171,162,141,117,108,107,113,135,163,185,193,201,189, -165,140,101,64,48,46,46,46,48,48,48,50,52,54,56,59,61,64,66,69,72,74,77,80,84,89,94,99,104,110,119,131,145,160,176,190,200,208,218,229,237,242,244,246,248,248,249,251, -251,251,252,252,252,252,253,253,253,253,253,252,252,251,251,251,251,251,251,252,253,253,253,252,252,252,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,254,254,254,254,252, -247,243,243,243,243,241,239,236,232,226,220,214,206,194,182,173,165,151,132,116,98,80,70,66,66,66,66,68,71,68,53,38,31,29,30,31,31,30,30,30,31,29,23,22,29,30,27,27, -121,110,99,94,91,81,69,55,36,22,17,15,12,7,2,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,5,7,11,17,21,24,29,35,42,49,60,74,90,106,123,136,145,150, -152,153,155,158,161,167,172,173,174,174,181,199,218,228,234,237,240,246,252,255,255,254,251,248,246,243,239,230,225,224,225,225,225,225,226,224,219,210,202,203,210,215,221,223,214,200,189,182, -174,167,161,161,176,194,199,196,197,198,190,168,140,122,102,74,58,52,48,49,51,51,50,51,51,52,54,57,58,60,63,66,69,72,75,79,83,87,92,100,108,119,131,140,148,159,172,187, -201,216,228,236,241,243,245,249,250,250,250,250,250,250,249,248,247,246,247,247,246,245,244,241,239,238,236,233,232,233,234,235,235,235,238,241,243,244,246,247,248,250,250,250,250,250,250,250, -250,249,249,247,246,246,246,247,249,250,252,253,254,253,253,253,253,254,253,254,254,253,251,248,246,246,247,247,248,246,243,240,237,233,224,214,202,186,176,172,173,172,173,176,183,183,166,145, -136,134,134,135,136,136,135,135,135,132,120,118,140,143,129,126,221,216,207,199,199,201,198,190,178,167,164,158,145,122,98,81,69,57,43,27,13,11,17,18,10,2,0,0,1,3,4,5, -5,5,4,3,2,2,3,4,6,10,18,26,39,54,65,70,73,75,77,80,89,102,114,124,133,143,158,178,208,231,240,242,243,243,231,204,180,165,153,145,144,145,150,160,167,170,172,172, -170,166,158,146,132,116,104,101,105,110,113,110,102,92,86,81,77,73,70,70,77,90,101,104,102,94,74,59,53,51,52,52,52,52,52,53,52,52,53,54,55,57,60,62,65,67,71,74, -78,84,89,97,104,114,125,139,155,171,187,199,206,214,224,233,241,246,249,250,251,251,250,250,248,246,245,243,240,237,234,227,223,219,219,217,216,213,208,202,196,191,185,180,177,178,180,179, -179,180,182,188,193,199,205,211,217,221,224,225,225,223,219,214,210,208,204,199,197,196,195,198,201,204,209,220,227,231,233,230,225,219,214,212,212,214,214,216,217,221,224,225,226,228,236,242, -244,245,246,246,245,242,238,238,237,238,238,240,242,244,242,236,234,234,234,234,234,234,233,234,234,232,226,226,238,237,227,223,248,248,246,244,244,245,246,248,249,249,247,243,233,216,201,190, -181,168,149,121,100,103,125,131,115,95,77,63,48,30,14,3,0,0,0,0,0,0,0,0,0,0,0,0,0,3,6,8,8,10,12,16,20,29,44,72,113,162,206,231,234,212,185,165, -150,136,105,73,59,55,52,54,57,63,71,82,90,95,97,96,94,90,84,77,72,68,68,68,68,67,67,66,65,65,63,61,59,58,56,55,53,49,47,47,47,47,48,49,50,51,51,51, -52,52,53,53,53,55,56,58,60,63,66,69,72,76,82,88,96,108,122,136,150,163,178,195,210,224,234,240,243,245,248,250,251,251,250,249,247,246,244,240,233,226,221,216,211,204,199,191, -185,181,179,177,176,172,168,161,155,150,144,138,134,130,129,126,124,123,123,124,127,129,133,137,143,147,149,150,148,144,137,131,127,124,121,118,116,114,109,105,104,102,105,113,123,134,142,142, -131,116,104,97,94,95,100,108,118,127,133,135,140,151,170,184,192,203,215,227,235,241,244,245,245,245,245,245,246,248,250,248,243,239,237,236,236,235,236,237,239,242,246,248,248,248,247,248, -247,251,252,251,252,251,250,247,245,242,241,241,237,231,229,228,227,226,219,211,211,222,238,244,243,238,231,221,206,183,152,125,105,92,83,81,87,94,96,96,96,96,96,96,95,95,96,96, -96,97,98,99,101,109,143,189,222,228,204,165,116,69,46,38,34,32,31,31,34,36,37,38,40,40,41,42,44,44,45,47,51,54,57,60,65,68,69,70,71,67,62,58,54,52,50,48, -47,46,45,45,44,43,42,43,44,45,46,46,47,48,49,50,51,52,53,55,56,58,60,63,66,70,75,80,87,95,105,118,135,156,176,193,206,217,228,238,244,248,250,251,251,251,251,250, -248,246,241,235,228,225,219,211,203,195,191,186,181,175,171,167,163,161,159,158,156,153,151,147,144,140,136,132,129,125,122,119,116,113,111,108,105,103,100,98,97,96,95,93,90,86,82,80, -77,73,72,68,66,63,58,54,49,46,44,43,44,49,53,53,48,42,41,39,40,40,43,48,54,56,52,48,50,59,70,78,88,103,122,144,167,189,199,203,205,205,206,209,214,217,209,190, -167,150,145,144,146,148,153,160,165,174,185,194,198,210,227,240,154,178,201,213,210,201,192,188,189,191,193,196,199,199,194,187,181,177,181,189,194,192,188,187,188,188,183,178,180,196,214,224, -228,226,223,223,226,229,230,230,229,230,230,230,230,230,230,229,230,230,230,230,231,231,227,203,155,103,57,29,17,15,16,19,20,21,23,24,24,25,26,27,27,28,28,28,29,31,39,51, -61,69,73,78,79,80,81,82,82,82,80,74,69,64,56,49,45,40,39,37,37,36,38,38,39,40,42,44,45,46,48,49,51,53,55,58,59,62,65,69,75,83,93,106,122,137,152,170, -191,211,227,237,243,245,248,250,251,251,250,249,247,246,244,240,233,225,217,208,200,196,191,186,181,178,176,173,171,168,167,165,164,163,162,160,158,156,154,152,149,147,143,141,137,135,131,128, -125,122,118,114,110,107,102,99,95,92,87,84,80,76,73,69,66,61,58,54,52,49,45,42,39,37,33,31,30,31,35,45,52,57,60,61,60,61,60,60,61,59,56,49,45,40,34,30, -28,31,38,49,66,83,89,92,94,97,103,108,109,102,86,66,49,41,38,37,39,41,46,51,54,60,69,79,84,93,112,132,22,34,51,60,58,53,52,54,56,56,56,55,54,52,47,43, -40,39,41,44,45,43,40,39,38,33,26,24,29,47,71,94,110,121,130,133,127,120,117,118,117,118,117,118,118,118,118,117,119,118,119,118,120,115,88,50,21,8,6,8,10,12,13,14, -15,17,18,18,18,19,19,19,20,22,24,30,39,51,62,69,67,62,57,54,51,50,57,57,51,52,60,67,70,73,74,73,70,64,61,59,59,60,60,49,38,39,41,42,44,47,48,51, -52,55,58,61,64,69,75,84,96,113,134,157,178,195,209,222,234,243,248,250,251,251,251,249,248,246,240,234,230,226,222,214,206,199,193,187,184,182,181,180,179,178,178,177,177,176,175,175, -174,173,172,171,168,167,165,163,160,158,155,152,149,146,142,139,135,131,128,124,120,115,112,107,102,98,94,90,85,81,77,72,69,66,62,58,54,51,47,44,42,41,40,43,50,58,67,70, -66,59,52,46,41,40,44,43,34,35,42,48,52,55,55,52,48,43,40,40,43,44,44,31,17,17,20,21,21,16,12,7,5,5,5,5,5,5,5,6,6,8,10,12,15,16,19,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,1,2,2,3,4,2,2,1,1,1,2,1,1,2,2,2,1, -2,1,2,2,2,3,2,1,2,4,7,10,16,22,29,34,38,42,47,49,49,52,53,54,54,54,55,58,60,59,52,39,28,22,21,21,29,43,55,40,22,21,24,27,32,38,46,53, -60,66,69,71,72,74,71,54,37,37,39,42,45,47,49,52,55,59,63,69,78,88,102,118,139,165,192,214,229,239,243,247,249,251,251,249,247,245,243,237,231,224,215,207,202,199,196,193, -189,187,185,184,184,185,186,187,187,187,187,187,187,187,186,186,185,184,183,182,180,178,176,174,172,169,167,164,160,157,153,149,146,142,138,133,129,125,120,116,111,106,103,99,97,97,98,97, -96,94,94,92,89,87,86,84,80,78,77,77,77,74,64,50,37,29,24,22,27,40,50,34,12,9,11,14,19,24,30,37,43,48,52,52,53,52,48,27,5,2,2,2,2,2,3,3, -3,4,3,4,5,4,3,3,3,4,4,3,3,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,4,7,9,12,17,25,32,40,48,54,56,56,56,57,64,68,73,82,95,100,97,91,82,68,53,42,36,34, -34,36,44,58,75,84,71,38,15,14,16,17,17,18,19,21,24,29,33,36,38,40,40,37,35,37,40,43,45,48,53,58,64,72,82,95,111,130,152,175,197,219,236,245,249,251,251,251, -250,248,243,236,228,223,217,211,204,197,192,189,187,187,187,188,189,190,191,192,193,195,196,197,197,198,198,198,198,198,197,196,196,194,194,192,190,188,186,184,182,180,177,174,170,168,164,160, -155,152,148,145,140,136,132,129,127,127,127,127,127,126,124,120,116,113,113,114,114,119,126,128,124,116,106,92,77,64,56,52,49,49,54,65,79,87,72,38,14,10,9,8,8,7,6,8, -9,12,16,17,17,17,16,8,3,3,3,3,3,3,4,4,4,4,4,4,5,5,4,4,4,5,4,3,3,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,0,0,0,0,0,0,0,0,0,0,0,0,6,24,33,37,41,44,45,46,50,52,52,48,44,36,29,24, -21,19,22,24,28,38,54,71,87,99,100,93,81,71,69,73,74,73,77,89,95,89,73,54,37,24,15,12,13,15,16,17,19,20,22,23,24,26,28,32,36,39,43,46,51,57,64,76, -90,108,127,146,168,191,211,227,238,245,249,251,251,249,246,244,239,230,218,207,199,193,190,188,186,185,185,186,189,191,193,195,197,198,200,202,204,205,205,206,207,207,207,208,207,207,206,206, -205,204,203,202,200,198,196,194,191,189,186,183,180,177,174,169,168,170,169,167,165,162,158,155,152,149,145,139,132,123,113,106,99,93,90,87,86,90,98,110,119,126,125,117,105,94,90,91, -91,87,89,97,103,96,77,57,40,24,13,9,8,7,7,7,6,6,5,4,3,2,1,2,2,3,3,3,3,3,3,4,4,4,4,4,5,5,4,4,4,5,4,3,3,3,3,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,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0, -10,37,49,50,49,49,49,46,40,32,23,15,9,4,2,2,3,4,5,6,12,23,37,54,67,74,78,78,70,58,51,47,44,39,36,36,38,37,43,53,61,60,48,34,28,28,34,41, -46,48,52,58,61,57,51,45,45,47,52,59,68,81,98,120,145,170,190,209,224,236,244,248,250,251,250,246,241,233,224,218,210,199,189,183,180,180,181,183,185,188,191,193,196,198,201,204, -206,208,209,210,212,213,214,214,215,215,216,216,216,215,215,214,213,213,211,210,209,207,206,203,201,198,196,192,189,186,182,178,179,183,184,180,176,172,168,162,155,147,138,129,120,112,105,100, -94,90,85,82,81,84,90,100,108,110,111,108,99,86,77,71,65,59,54,51,50,48,50,58,65,62,49,33,24,23,28,33,36,37,38,41,41,35,24,13,7,4,2,2,1,1,2,2, -2,2,2,2,3,3,3,3,4,4,4,3,3,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,1,14,27,30,31,31,31,30,28,22,14,8,4,3,9,15,29,42,44,44,43,40,37,34,30,25,26,26,26,30,34,37,41,49,58,65,65,57,46,38,35,30,23,15,9, -5,3,3,3,4,7,13,28,52,77,91,89,80,72,67,67,67,68,77,97,109,114,113,107,103,103,108,116,131,148,168,191,212,229,239,245,248,250,250,249,248,244,238,226,212,200,191,185, -181,177,176,175,178,181,184,188,192,195,199,202,205,207,210,212,214,215,217,218,219,220,221,222,222,222,222,222,222,222,222,222,221,220,219,218,218,219,218,216,214,212,210,207,203,198,193,189, -185,183,181,180,180,177,172,167,162,156,150,143,136,131,126,121,118,116,113,111,112,115,116,113,104,92,82,76,68,59,50,41,34,29,27,23,22,21,24,36,57,81,93,88,77,68,61,58, -56,55,61,78,88,88,82,70,57,46,37,30,28,28,28,29,29,29,29,29,25,18,11,5,3,3,5,3,3,3,3,3,0,3,8,15,22,24,24,24,24,24,24,24,24,21,15,6, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,23,43,48,48,49,49,49,50,51,50,45,38,28,17,12,28,46,50,50,50,50,51,51,52,52,54,54,53, -51,52,55,60,67,72,72,66,59,54,53,52,51,49,45,39,33,29,29,31,35,39,43,51,62,70,79,83,79,70,58,53,53,55,66,89,110,127,145,158,167,177,187,199,210,221,232,241, -247,251,252,252,251,250,248,241,232,219,205,191,178,171,168,168,171,174,179,184,189,194,198,202,205,208,211,214,216,217,219,219,220,220,221,222,223,223,223,224,224,224,224,224,224,225,225,225, -225,224,224,223,224,226,226,224,223,222,219,217,215,213,209,204,199,192,187,187,189,186,181,177,173,169,164,160,156,152,148,142,137,133,129,128,128,128,124,117,108,100,95,91,87,83,76,68, -59,52,49,49,49,50,52,57,64,71,77,77,69,55,37,27,22,20,25,39,51,60,73,84,89,90,89,87,86,86,86,87,87,87,87,86,85,78,66,49,30,11,3,1,2,1,1,1, -51,61,74,89,99,101,101,101,101,101,101,101,101,98,88,70,48,26,10,4,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,11,13,13,14,14,14,16,23,31,39,46, -51,50,46,43,38,31,25,21,19,18,18,21,25,28,30,31,34,42,55,68,74,70,62,54,49,48,52,54,56,59,63,67,71,72,72,72,73,72,72,68,61,55,56,62,69,76,82,88, -93,100,111,128,149,168,184,195,205,216,228,237,243,246,249,250,251,250,249,246,242,236,229,222,212,198,180,167,162,164,171,181,191,197,202,209,214,216,218,220,222,224,225,227,227,228,227,226, -224,222,220,219,218,218,216,216,215,215,215,215,215,216,217,218,219,220,221,222,223,224,224,223,222,221,220,218,216,215,213,212,209,206,202,198,193,186,180,173,168,162,157,152,149,145,140,135, -130,129,130,131,130,121,110,98,90,85,84,82,80,79,79,81,81,79,77,75,71,68,65,59,46,33,26,22,19,13,9,6,5,4,3,4,6,9,16,26,37,46,55,62,63,63,63,64, -64,64,64,65,70,79,87,92,86,61,30,11,5,9,21,33,119,120,120,115,107,105,105,105,105,105,105,105,105,108,117,129,125,103,77,63,56,44,30,22,16,12,11,11,11,13,14,13, -12,10,5,1,0,0,0,0,0,0,0,0,0,1,4,10,19,30,41,49,51,48,42,35,31,27,26,29,34,39,45,55,67,78,87,93,92,87,84,83,81,82,83,83,84,85,86,92, -97,100,101,99,98,98,100,104,107,113,123,136,149,162,173,180,184,188,195,206,219,229,234,236,238,242,246,248,249,249,249,247,242,235,224,213,201,189,181,179,184,191,190,184,182,190,202,211, -214,215,217,218,219,221,223,223,225,226,226,226,226,226,224,224,220,215,208,203,199,194,189,185,182,180,180,180,182,184,187,191,195,199,203,208,211,213,216,219,220,221,220,220,218,217,214,211, -209,208,207,205,202,197,191,184,178,172,166,160,155,150,146,144,144,142,138,130,115,101,89,81,75,69,65,61,57,54,53,53,55,55,52,48,43,40,41,43,41,36,35,35,36,34,34,33, -32,30,25,19,14,10,5,3,2,3,6,8,9,9,9,10,10,9,9,9,13,19,30,49,75,96,95,76,63,75,96,109,85,70,56,42,31,28,28,28,28,28,28,28,28,31,46,76, -100,111,117,118,117,113,105,97,88,83,80,80,82,85,81,72,70,66,56,46,37,26,18,11,5,0,0,0,0,0,0,0,0,0,6,15,27,38,46,51,55,60,67,77,88,100,109,116, -122,127,133,145,156,164,169,171,170,171,171,171,171,170,171,171,171,171,172,174,177,182,189,198,206,211,218,225,231,237,240,242,242,243,244,246,249,249,250,249,248,247,247,245,242,239,233,222, -208,191,175,162,154,147,146,152,166,189,208,214,215,218,220,217,209,206,208,209,210,212,214,216,217,217,215,212,207,202,195,191,185,177,168,160,152,145,138,132,128,125,124,125,129,133,138,142, -149,157,164,173,181,187,196,203,208,213,216,218,219,219,219,217,214,209,206,203,202,200,198,195,191,186,182,178,173,168,163,156,149,138,126,114,103,96,90,85,80,74,69,64,59,54,50,45, -41,37,36,40,47,58,74,94,109,111,109,109,110,110,109,108,107,105,100,91,82,72,57,40,25,14,7,4,1,0,0,0,0,0,0,1,1,2,7,23,53,98,139,150,147,151,144,122, -56,36,25,22,23,25,25,24,24,24,24,24,21,16,13,18,29,44,60,69,73,85,97,103,109,112,113,114,115,113,96,78,75,79,84,86,86,83,77,70,58,42,29,18,10,5,1,0, -0,0,0,0,0,4,11,22,38,61,87,113,137,157,170,177,184,192,203,215,225,230,231,231,231,231,231,231,231,231,232,232,233,234,235,238,239,241,242,243,245,247,249,249,250,251,251,251, -251,251,252,252,251,250,248,247,245,242,236,228,218,207,194,181,167,155,147,145,148,157,167,180,192,202,208,209,209,213,215,212,206,205,207,209,212,213,214,212,209,204,197,186,173,158,143,129, -115,102,91,82,73,68,63,60,58,57,57,59,61,64,67,70,77,88,100,113,127,141,155,168,180,191,200,207,213,217,221,224,224,221,214,208,202,197,194,190,187,182,178,173,167,161,154,145, -135,127,119,113,108,101,95,89,83,78,72,66,61,57,53,53,56,64,76,90,100,107,108,113,126,128,121,115,114,113,113,112,111,111,115,119,123,124,122,113,99,82,67,55,41,30,28,28, -29,30,30,33,41,54,71,91,110,125,133,128,119,126,124,104,89,85,87,94,99,103,103,101,101,101,101,100,97,89,77,67,63,62,62,55,47,42,39,40,43,46,46,47,46,42,29,18, -16,21,29,39,49,61,69,78,85,88,84,77,68,58,45,34,24,17,13,11,10,13,24,43,75,117,156,186,206,220,228,231,235,238,242,244,245,246,246,246,246,246,245,246,247,247,247,248, -249,250,250,250,249,249,248,248,248,248,248,247,246,244,241,240,240,239,238,236,229,222,217,216,217,216,211,206,197,189,181,178,178,180,181,185,192,200,207,212,211,202,192,186,187,193,203,211, -215,217,218,219,219,217,213,205,194,181,165,145,125,104,84,65,52,39,30,23,18,14,11,10,10,9,10,10,10,10,11,12,16,20,29,39,54,70,87,108,128,148,166,183,195,206,215,224, -231,235,232,225,221,213,203,196,190,185,180,175,168,161,153,145,139,133,126,119,113,106,100,93,87,82,80,80,82,84,87,96,107,115,115,108,95,80,63,53,56,55,48,43,42,40,40,39, -37,38,42,50,57,69,85,102,115,121,123,122,115,107,104,106,113,119,121,124,132,142,151,156,149,116,80,51,34,42,65,84,56,72,87,98,103,106,106,105,105,105,105,105,108,114,119,119, -119,118,117,115,110,100,86,72,59,46,38,33,29,27,25,23,23,23,24,26,30,34,34,34,42,51,61,71,79,84,87,85,83,79,76,76,78,88,108,136,173,207,230,241,246,248,249,249, -249,249,248,246,243,240,239,239,240,240,241,242,243,243,244,243,243,241,239,237,236,236,236,236,236,235,231,225,219,209,199,193,190,188,185,177,163,148,138,135,138,143,147,152,158,163,164,168, -180,190,194,199,204,207,210,212,212,206,199,195,195,195,199,204,210,215,217,216,211,204,192,176,155,132,108,84,63,46,32,23,16,11,8,7,5,5,4,3,2,2,1,1,1,0,1,0, -2,2,3,6,10,17,27,41,60,81,107,132,156,177,194,209,225,237,244,243,242,242,233,221,213,207,203,198,193,186,179,173,168,162,153,145,139,133,128,122,117,115,120,126,128,128,126,123, -116,99,80,61,46,35,29,25,22,20,17,15,14,13,12,10,9,9,8,8,9,11,17,27,42,57,69,84,98,106,107,112,128,141,144,148,152,154,153,153,146,121,93,69,49,34,30,36, -51,43,35,31,30,29,29,28,28,28,28,28,32,42,53,63,68,74,88,108,131,151,154,151,145,134,123,113,105,100,100,100,100,101,102,104,106,105,99,85,73,63,55,49,49,53,61,75, -93,108,120,130,144,164,188,210,230,242,249,250,249,248,246,245,243,239,235,230,221,213,210,208,208,208,207,203,200,197,194,191,188,185,184,184,184,184,184,184,183,178,170,159,147,133,122,114, -111,110,107,102,92,83,77,75,77,80,84,91,99,107,113,120,132,143,149,157,166,173,178,185,194,204,210,214,215,214,213,212,210,209,205,197,186,169,147,122,95,69,46,28,15,9,5,3, -2,2,2,3,3,3,3,3,3,3,3,3,2,2,3,4,4,4,5,5,6,7,9,13,19,31,49,72,99,126,153,177,199,220,239,248,250,252,251,244,230,221,213,205,199,195,194,192, -186,179,176,173,168,163,158,154,150,146,140,130,118,108,95,82,68,54,44,38,35,32,30,28,25,22,20,18,16,15,14,13,12,11,9,8,8,7,5,4,4,6,10,15,23,29,32,34, -45,55,57,62,69,74,75,80,93,108,119,121,117,105,87,71,115,101,79,58,43,33,28,26,25,24,24,24,24,26,29,35,45,63,86,109,132,149,151,147,142,135,127,118,110,108,111,115, -121,131,143,154,157,157,157,154,150,144,135,123,113,102,91,93,108,127,149,172,192,213,231,240,244,247,246,240,229,216,204,196,186,176,166,155,141,129,123,120,119,118,112,104,100,98,96,95, -95,95,96,97,97,98,99,98,97,94,86,78,70,64,58,56,55,56,57,57,56,56,57,60,64,69,73,78,84,89,96,103,110,117,124,131,138,146,154,161,170,182,193,202,210,217,220,220, -217,211,198,181,159,132,103,73,47,26,12,5,1,1,0,1,1,1,1,1,1,1,1,1,1,1,2,2,1,1,2,2,2,3,3,4,4,4,6,6,7,11,19,32,54,80,108,139, -166,189,215,238,250,253,253,252,243,229,220,206,190,181,177,174,166,159,155,153,147,141,136,129,125,117,105,90,79,70,63,56,52,47,44,41,38,34,31,29,26,23,21,19,17,16,15,13, -12,11,10,10,9,8,7,6,6,6,5,3,2,3,2,2,3,4,4,4,7,8,8,11,19,34,53,70,89,108,119,122,91,107,119,120,114,108,104,102,101,100,100,101,100,101,100,103, -110,117,119,113,103,91,76,62,51,43,41,45,54,69,87,100,113,129,142,149,147,146,147,149,151,151,152,154,151,140,120,112,126,153,185,214,232,243,248,250,249,246,235,211,177,147,124,110, -99,88,71,57,46,38,34,32,32,32,31,31,32,32,33,32,33,34,35,35,35,38,38,38,39,37,35,33,33,33,33,35,36,39,41,45,48,50,55,59,64,69,75,81,87,93,100,106, -113,119,127,133,140,147,155,161,168,175,182,189,196,202,208,209,207,199,185,162,131,98,65,38,19,8,3,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1, -1,1,1,2,1,2,2,2,3,3,5,10,21,39,64,94,125,154,180,207,235,251,254,253,253,248,239,232,217,196,183,175,166,156,145,136,129,122,115,108,102,95,88,82,76,71,66,60, -57,52,47,43,40,35,32,30,27,24,22,20,18,16,15,14,12,11,11,10,9,9,8,7,7,7,6,6,5,5,5,4,3,3,3,2,3,3,2,1,0,1,3,8,17,33,50,65, -16,32,54,72,86,97,102,104,104,104,104,104,104,104,105,104,97,80,60,42,29,19,11,7,9,18,40,67,91,109,119,121,120,113,102,86,74,68,69,70,71,73,77,82,89,97,108,131, -165,198,224,238,245,248,247,244,239,230,206,166,124,98,82,75,71,63,37,16,11,10,9,9,8,9,9,10,10,11,11,11,12,13,13,14,15,16,17,18,19,20,21,22,24,26,27,31, -33,37,40,43,47,51,56,61,66,71,77,83,90,96,103,109,115,122,130,137,145,151,158,165,172,178,184,190,194,197,198,193,186,172,151,123,91,59,32,14,5,2,1,1,1,1,1,1, -1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,4,12,27,52,83,116,147,174,202,232,250,253,253,254,252,249,245,233,219,208, -200,189,169,150,142,136,128,121,115,109,103,97,92,88,82,77,71,65,59,52,47,42,37,33,30,26,23,21,18,16,15,14,13,12,10,9,9,8,7,7,6,6,6,6,5,6,4,4, -4,4,3,4,4,4,3,2,3,3,2,1,1,1,2,6,0,0,3,17,34,49,59,62,62,57,50,48,48,53,59,59,54,44,35,36,40,45,50,58,68,87,111,121,115,99,80,65, -52,37,24,13,7,5,6,8,11,19,34,57,89,126,164,199,224,238,245,246,245,239,227,204,180,157,128,91,62,49,43,40,40,36,18,6,4,5,5,6,6,6,7,7,7,8,8,8, -9,10,10,11,12,12,14,16,17,17,18,20,22,25,27,30,34,38,41,45,49,53,57,62,68,73,79,85,91,97,104,111,118,125,132,139,147,154,160,168,174,181,187,191,195,197,193,184, -169,146,117,85,54,28,11,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,2,10,26, -52,84,120,150,176,200,229,247,253,253,253,253,251,247,241,233,224,215,200,185,178,172,165,158,152,147,143,139,134,130,126,121,115,107,97,86,78,68,60,52,45,38,31,27,21,19,18,16, -15,14,14,13,12,11,10,9,9,8,7,6,5,4,4,4,4,3,3,4,4,4,3,2,3,3,3,3,3,2,1,0,1,15,40,66,87,103,116,124,123,116,106,100,96,101,110,114, -116,114,112,114,119,120,120,121,121,118,100,72,45,23,11,5,1,0,0,1,3,7,12,21,34,57,89,130,170,202,226,239,245,247,244,237,223,199,165,126,89,61,39,22,11,6,5,4, -4,5,5,5,5,4,5,6,6,7,7,7,8,8,9,9,9,9,10,11,13,13,14,16,17,19,27,31,33,33,34,34,35,37,40,45,49,53,58,62,68,73,79,86,91,98,104,111, -118,125,133,140,148,155,162,170,176,182,188,192,195,194,187,175,155,129,98,65,36,15,4,1,1,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,3,12,31,60,95,129,159,183,207,230,248,252,252,252,252,250,248,244,240,234,228,225,224,221,215,210,205,203,201,199,197,195,193,190, -186,178,167,154,143,131,118,107,94,81,72,62,52,44,41,37,34,32,32,30,30,29,29,27,25,22,19,15,12,9,8,7,5,4,4,6,6,6,5,5,6,6,6,6,5,2,0,0, -68,97,126,154,173,186,200,210,211,206,202,199,187,175,178,183,185,180,166,148,130,115,100,86,73,56,34,16,9,7,7,8,10,12,16,21,29,40,56,77,104,137,174,206,229,240,245,246, -244,237,221,194,158,118,81,51,29,17,9,6,4,2,2,2,2,3,5,5,5,4,4,6,6,6,7,8,9,8,8,10,10,10,11,12,13,14,15,16,16,27,53,65,67,66,66,64, -58,51,48,48,50,55,61,66,73,81,91,101,108,115,122,127,133,137,141,145,150,156,163,170,177,183,189,192,193,190,181,168,149,121,86,50,23,7,2,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,1,6,18,43,76,111,145,173,197,220,238,250,252,252,252,251,250,249, -248,247,247,248,248,247,246,243,242,241,241,240,239,239,238,237,236,233,227,220,213,205,196,186,174,162,155,144,130,122,117,112,104,98,93,89,88,87,87,86,83,78,75,71,65,60,55,50, -46,42,37,33,29,25,23,23,25,26,26,23,16,11,15,28,194,202,213,229,237,242,245,247,247,246,245,245,242,233,233,235,236,233,219,190,154,127,103,80,62,50,45,44,44,45,45,46, -49,56,65,78,93,113,139,165,188,211,230,241,246,246,243,235,219,191,155,114,75,45,25,13,6,4,2,3,4,4,3,3,3,3,4,5,5,5,4,5,7,7,7,8,8,9,8,10, -11,10,11,12,13,14,15,16,17,24,43,53,57,63,68,75,80,82,78,77,76,81,87,94,100,108,118,132,144,151,156,161,165,168,169,171,172,171,172,174,179,184,189,192,193,191,185,172, -146,109,68,34,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,0,0,0,0,0,2, -12,32,62,99,134,163,188,216,236,246,252,252,252,251,251,251,251,251,251,252,252,252,251,251,250,250,250,250,250,250,250,249,249,248,247,245,244,243,240,237,232,226,218,208,197,192,191,192, -191,190,188,185,183,182,182,183,180,175,169,166,162,155,147,141,137,135,131,125,116,105,96,91,93,102,109,106,101,111,138,167,248,247,248,248,248,247,247,247,247,247,248,248,248,248,248,248, -248,248,248,240,221,202,184,163,144,132,127,125,125,125,126,127,132,140,153,166,180,197,215,228,237,243,246,246,242,232,214,186,150,110,73,43,23,11,4,2,1,1,2,3,4,4,4,3, -3,3,3,4,5,5,6,6,6,7,7,8,8,9,9,10,10,11,12,13,14,15,15,16,18,19,21,24,27,31,36,42,54,66,76,84,89,93,95,97,101,102,105,117,130,138,143,148, -154,162,171,180,187,191,193,194,194,196,198,201,203,201,192,168,133,93,55,26,9,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,0,0,0,0,0,2,8,27,55,91,127,158,181,206,234,247,251,252,252,251,251,251,251,251,251,251,252,251,249,246,244,243,243,243,242,242,241,241, -241,243,245,245,246,247,248,248,247,246,243,239,235,234,233,234,235,236,237,238,238,237,237,237,235,232,226,222,219,212,204,198,197,200,203,205,205,203,200,198,204,218,226,226,228,235,245,249, -247,247,247,247,247,247,247,247,247,247,246,246,247,248,248,249,249,249,249,249,247,243,238,228,218,212,211,213,213,214,213,213,215,220,226,231,235,239,244,246,247,245,242,233,212,181,143,104, -68,40,22,10,4,1,0,0,0,2,2,3,3,4,4,3,3,4,3,4,5,5,5,6,6,7,8,8,9,9,10,10,10,11,12,13,13,15,16,16,18,20,21,23,24,27,30,32, -36,40,46,54,60,64,67,70,74,78,82,90,98,103,110,118,124,132,143,153,165,178,189,198,203,207,210,211,209,201,184,157,122,86,53,25,8,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,0,0,0,0,0,2,9,26,54,89,126,157,180,197,224,246,251,252,252,251,250,250, -250,249,248,245,241,235,228,219,214,210,208,206,204,203,201,201,204,209,216,221,226,231,236,239,240,243,246,247,247,247,247,247,246,246,246,247,247,246,246,247,246,245,244,243,242,239,235,233, -234,236,238,240,241,242,244,245,249,252,252,252,252,252,251,249,248,248,247,247,248,246,245,238,227,211,195,187,187,190,194,198,207,222,235,235,235,238,245,247,247,246,247,248,247,247,247,247, -247,247,248,249,249,249,246,241,235,226,208,178,139,99,63,36,19,9,3,0,0,0,0,0,0,0,0,1,1,1,2,2,2,3,3,4,5,5,5,6,6,7,8,9,9,9,10,10, -11,11,11,13,14,15,16,16,18,19,21,24,26,28,31,33,37,39,41,45,49,54,58,64,69,75,81,86,93,99,107,114,120,126,134,141,149,158,168,178,187,194,199,200,198,190,176,154, -125,91,56,28,10,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,0,0,0,0,0,2, -10,28,58,94,129,160,182,199,222,245,253,252,251,250,248,244,242,238,232,217,201,191,180,171,162,155,151,147,143,139,136,134,135,141,148,156,165,174,184,193,201,212,224,232,236,236,236,237, -236,236,236,236,236,236,236,236,237,240,242,245,245,246,246,246,247,247,247,247,247,247,248,248,249,249,250,250,250,249,248,248,216,209,204,202,200,188,172,150,124,97,76,68,67,67,68,73, -84,110,142,147,142,145,165,193,206,208,213,221,227,233,237,241,242,243,242,239,235,227,214,202,190,174,145,106,66,36,18,8,3,0,0,3,8,13,19,23,24,25,25,25,26,24,20,14, -8,2,2,2,3,5,5,5,6,7,7,9,9,9,10,11,11,12,12,12,14,15,16,17,18,20,21,24,26,28,30,33,37,40,42,46,50,55,59,64,70,75,80,87,93,100,106,113, -120,127,134,141,148,155,162,169,176,182,188,191,192,188,178,160,134,101,66,36,14,4,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,4,14,36,68,104,139,168,190,211,232,250,253,252,249,247,239,231,222,213,195,171,156,148,139,131,122,116,109,104,98,94,89,84, -83,84,85,88,92,98,106,114,125,140,157,171,181,184,185,186,186,185,184,184,183,184,184,185,190,198,208,217,223,229,234,237,242,247,247,248,248,248,248,248,247,245,238,231,227,226,225,222, -113,96,86,81,74,63,50,36,23,13,8,7,7,7,8,12,20,35,57,63,55,47,57,77,94,111,130,148,159,162,163,170,180,184,181,172,157,140,129,122,113,104,90,74,56,41,34,35, -41,48,56,67,77,88,97,100,101,101,101,102,102,100,94,83,66,42,23,11,4,2,3,4,5,6,7,7,9,9,9,10,12,12,12,12,13,15,16,17,18,20,22,23,25,28,30,33, -35,38,40,45,49,53,57,62,68,73,79,86,92,98,105,111,118,125,132,140,147,154,160,168,175,181,187,190,192,190,183,169,146,116,81,49,23,8,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,2,8,24,51,87,125,159,185,207,228,246,253,252,250,248,242,232,221, -209,192,170,151,137,129,122,114,107,101,95,88,82,76,71,66,62,59,56,54,53,53,54,57,62,69,80,89,96,99,100,99,99,98,97,95,95,96,96,98,103,114,126,140,152,164,175,183, -194,208,214,215,215,214,214,210,198,177,151,136,138,146,145,133,26,17,12,8,6,4,3,1,0,0,0,0,0,0,0,2,8,17,29,38,38,32,33,42,55,72,85,87,80,71,64,61, -63,67,65,60,58,61,63,52,36,29,30,38,50,62,78,100,121,134,135,129,123,118,112,107,105,105,105,105,106,108,114,120,124,115,97,75,52,29,15,10,6,4,4,6,7,7,8,8, -9,10,10,11,12,13,14,15,16,18,19,22,24,27,31,33,38,45,50,54,59,62,67,70,73,75,79,84,90,96,103,110,117,123,130,137,145,152,159,166,172,180,185,189,193,193,189,178, -160,134,103,69,40,17,5,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,1,6,19, -43,76,114,150,178,200,219,242,251,249,248,243,235,225,219,213,207,199,187,172,155,137,123,112,103,95,89,83,77,71,66,60,55,51,47,43,39,37,34,33,33,34,35,36,39,40,40,40, -42,44,45,45,45,45,45,44,43,45,51,57,66,76,84,91,98,105,111,112,112,111,108,100,85,65,53,53,62,67,60,43,2,0,0,0,0,0,0,0,0,0,0,3,10,16,23,34, -48,61,71,79,88,89,90,93,99,106,112,108,99,95,92,77,60,49,40,35,38,46,45,34,21,18,26,43,65,91,117,135,138,126,103,76,57,44,35,29,28,28,28,28,29,31,40,54, -75,99,114,122,119,104,84,66,51,38,32,29,28,31,33,33,34,34,35,35,34,31,28,27,25,25,28,36,44,52,56,61,67,75,80,84,87,90,94,97,98,98,99,97,91,94,101,108, -115,121,128,135,142,149,157,163,170,176,182,188,192,194,193,186,175,155,128,96,65,36,16,5,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,2,6,18,40,71,106,140,167,187,206,232,246,241,238,230,215,201,192,187,183,184,188,192,191,187,175,160,144,129,116,105,98,91,87,83,78, -74,70,67,62,57,51,44,39,35,31,31,35,41,45,46,48,53,56,57,59,59,58,57,56,53,49,46,36,23,22,26,28,29,29,30,30,30,30,27,24,19,15,15,18,20,17,12,6, -0,0,0,0,0,0,0,0,0,3,27,59,79,91,100,108,116,119,120,119,118,118,118,119,120,122,124,127,130,138,146,145,139,132,122,111,106,104,99,96,93,98,107,115,119,119,111,90, -64,40,20,8,1,0,0,0,0,0,0,0,0,0,0,3,10,24,41,63,88,109,122,130,133,128,121,114,106,105,107,108,108,109,108,109,108,103,97,94,90,90,95,101,99,93,88,83, -77,72,70,70,74,77,81,86,94,102,108,104,91,91,98,104,111,117,124,132,139,146,153,160,166,173,179,185,190,194,195,193,186,173,154,128,98,67,39,19,7,1,1,1,0,0,1,1, -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,1,1,3,8,21,43,71,103,135,161,181,196,221,240,233,226,219,202,189,181,174,168,161, -156,155,156,162,169,176,179,181,179,172,164,155,147,142,140,137,134,132,129,127,123,116,108,102,96,93,96,99,95,85,76,69,60,51,45,42,42,40,40,41,45,50,51,38,13,4,4,4, -4,4,6,6,6,6,5,3,2,3,4,4,2,1,0,0,0,0,0,0,0,0,0,0,0,11,64,111,119,113,106,97,85,72,64,56,49,46,46,46,47,47,48,50,57,68,80,95, -114,129,136,139,142,150,156,158,158,158,157,143,112,79,48,20,3,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,7,24,52,89,133,160,163,158,142,121,112,110,111, -112,112,113,113,117,123,126,127,131,139,151,155,148,134,124,112,94,79,70,64,62,64,67,71,78,86,93,96,95,97,103,108,112,117,124,129,136,142,149,156,162,168,175,181,187,192,195,196, -194,187,176,158,134,105,76,48,27,12,6,3,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,1,2,6,14,30,52,80,109, -138,163,182,196,214,232,230,219,211,199,189,183,177,170,164,156,148,141,134,131,132,142,158,181,195,194,188,174,156,146,141,139,136,134,131,130,131,133,134,134,135,141,151,154,145,129,116,100, -79,60,46,34,29,25,24,23,27,31,34,29,20,15,14,11,8,8,6,4,3,3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,39,60,52,39,30,21, -13,6,2,0,0,0,0,0,0,0,0,0,1,3,7,13,25,38,48,54,62,76,94,111,126,134,140,134,116,92,66,42,24,11,3,0,0,0,0,0,0,0,0,0,0,0,0,0, -5,11,21,34,53,81,111,132,134,114,85,62,45,37,36,36,38,39,39,40,43,50,57,63,72,92,116,139,159,167,168,163,153,142,134,127,122,120,119,120,124,127,131,135,138,143,147,146, -145,147,149,150,154,159,164,169,172,174,176,179,183,188,192,196,197,196,190,181,166,145,120,92,66,43,26,14,5,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,1,0,1,2,6,14,27,47,72,100,128,153,173,189,200,212,223,221,212,206,198,190,184,177,172,165,158,152,147,143,141,141,146,156,170,179,176,160,136,114,98,87,81,77, -73,70,66,64,64,66,69,71,77,94,116,137,156,163,162,157,145,130,119,108,100,93,89,87,86,87,87,86,86,87,87,78,69,65,59,50,48,48,46,44,37,26,15,5,0,0,0,0, -0,0,0,0,0,0,1,5,9,14,21,28,28,26,24,24,23,23,23,22,18,12,8,4,1,0,0,0,0,0,0,0,0,0,0,2,17,32,47,70,113,141,160,173,182,186,187,180, -169,157,142,106,68,38,21,14,10,8,9,11,12,17,28,43,60,79,95,109,120,122,110,84,54,28,13,7,7,7,7,8,8,9,10,10,10,13,23,38,58,81,102,118,132,137,134,130, -125,127,136,144,148,148,146,146,149,151,153,156,160,163,166,164,160,162,164,167,174,178,182,187,188,188,188,187,187,188,190,194,197,199,198,196,189,177,162,140,118,93,69,47,30,17,9,4, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,9,18,31,49,71,98,125,152,174,192,203,211,217,221,217,209,204,199,194,188,183,178,172,167,165,166, -168,171,175,178,179,177,167,146,122,100,84,73,66,61,56,52,48,44,40,36,32,31,36,47,64,84,102,116,128,131,127,120,114,114,122,129,130,128,122,121,120,120,119,118,119,119,119,111, -100,95,92,89,94,95,93,94,89,77,65,48,30,16,5,0,0,0,0,0,3,24,51,68,78,84,89,94,98,100,100,100,100,101,101,100,95,87,77,68,54,41,29,20,13,9,11,23, -35,63,98,134,163,170,175,180,178,169,166,170,180,192,206,215,216,216,217,220,216,200,178,154,131,116,103,89,83,88,100,111,117,117,112,101,86,63,37,16,5,2,4,6,7,8,9,9, -8,8,10,18,30,48,70,89,99,97,89,78,67,57,52,49,49,53,63,75,82,85,87,89,93,96,100,104,109,114,117,118,119,123,128,136,146,152,156,163,169,174,181,187,189,192,191,191, -194,198,200,201,200,199,194,185,171,153,131,110,88,67,49,35,24,16,11,7,4,4,3,1,1,1,0,0,0,0,1,1,3,5,8,14,21,32,46,64,84,107,130,152,173,191,205,215, -221,225,228,226,221,218,215,212,209,203,199,197,193,191,192,194,193,188,181,172,158,140,118,100,87,79,74,69,64,60,55,51,47,42,40,41,48,62,80,96,103,99,89,76,62,50,41,34, -30,33,41,50,55,55,53,52,51,51,50,49,49,48,48,43,37,36,35,38,45,46,44,47,49,49,56,60,55,48,29,5,0,0,0,0,11,67,116,124,119,116,114,110,107,105,105,105, -105,105,105,107,110,116,118,120,118,112,103,92,84,101,147,185,200,208,200,179,154,137,132,128,116,111,112,116,120,125,130,135,135,136,138,145,155,172,190,204,210,214,215,207,186,163,144,118, -86,58,34,18,9,1,0,0,0,0,0,0,1,2,3,6,12,25,43,66,85,96,97,85,67,47,35,28,23,22,24,26,28,30,33,37,40,44,47,51,54,59,64,68,73,78,83,89, -93,98,105,112,119,124,130,137,144,150,158,166,174,182,185,185,189,194,198,200,204,211,215,212,204,194,182,167,150,132,114,96,80,66,53,44,36,30,26,23,21,20,19,19,21,22,26,30, -36,44,54,66,79,96,114,132,150,168,184,196,206,213,219,223,225,226,225,224,223,222,221,218,214,209,207,203,201,196,188,179,166,152,139,124,113,102,93,87,82,77,71,66,61,56,51,49, -50,57,69,85,99,107,104,92,71,49,34,23,17,14,11,11,10,9,8,8,8,7,8,7,6,5,4,3,3,3,2,2,1,1,0,1,0,0,0,0,1,3,7,13,21,29,23,4, -0,0,0,0,8,49,79,68,52,45,40,34,29,28,28,28,28,27,27,28,33,40,47,57,71,92,115,146,187,219,206,172,155,137,120,113,110,110,109,106,103,96,89,84,77,66,56,50, -50,51,50,48,50,53,56,59,61,68,88,121,154,176,182,180,169,148,112,73,56,50,49,50,50,50,46,43,44,47,57,78,98,109,112,104,87,67,47,30,20,16,17,19,21,24,25,27, -29,31,32,35,38,42,45,49,52,56,61,65,70,74,80,85,90,95,101,107,113,118,125,131,137,143,149,154,161,167,172,177,183,189,193,197,201,210,215,214,210,208,203,197,189,178,168,156, -143,131,119,109,99,91,85,81,78,77,78,79,81,85,91,98,106,116,127,138,152,164,176,187,197,204,211,216,218,218,217,216,215,212,210,207,204,202,198,194,188,182,177,173,167,160,149,139, -128,120,112,105,100,94,89,83,77,72,67,62,60,59,65,76,92,105,111,108,96,77,56,37,25,18,16,15,15,15,14,12,11,10,9,8,8,7,7,6,5,4,3,3,3,3,2,3, -3,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,20,48,109,159,181,187,160,106,59,44, -43,43,44,45,44,44,41,36,28,21,14,8,3,16,57,96,113,101,69,38,17,6,2,0,0,0,0,0,4,18,31,53,83,109,144,168,174,176,176,178,177,180,183,185,191,197,203,203, -189,161,124,82,46,25,16,15,16,17,18,20,21,23,25,26,28,31,32,34,37,40,43,47,51,55,58,62,67,71,76,81,85,91,96,102,108,114,119,125,131,137,143,148,154,159,165,170, -176,181,186,190,195,200,204,206,207,208,209,208,207,204,201,196,190,184,177,171,164,159,155,151,148,146,147,149,151,154,158,163,170,176,183,190,196,202,208,210,214,215,216,216,215,213,210,207, -203,199,195,191,187,182,177,171,165,160,154,148,142,136,129,123,118,112,106,100,95,89,84,79,76,74,76,82,91,102,112,116,113,101,81,61,43,30,23,21,20,19,18,16,16,15,13,12, -11,10,10,9,8,8,7,5,5,4,3,3,4,4,3,3,2,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,21,34,37,37,45,53,49,44,42,39,35,33,33,33,34,34, -49,77,97,112,127,155,171,179,160,110,75,40,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,80,148,174,161,126,88,57,35,22,15,13,12,12,12,12,11,10,9,8,7, -6,8,19,36,51,65,75,84,93,105,118,126,128,122,109,86,59,37,23,15,12,13,14,14,16,18,18,19,20,22,24,26,28,30,31,33,36,38,41,44,48,51,56,59,63,68,72,77, -81,86,91,97,102,108,113,119,125,130,136,142,147,152,158,163,169,173,178,183,188,191,195,199,203,205,208,210,211,212,212,212,211,210,208,206,204,202,201,199,198,196,197,197,198,199,201,203, -205,208,210,213,214,215,217,216,216,215,214,213,211,208,205,203,199,195,191,187,182,177,173,168,163,158,152,147,142,136,131,125,120,115,109,104,100,100,100,102,106,113,119,122,123,117,104,87, -66,48,36,30,27,24,23,21,19,18,16,16,15,13,12,11,11,10,9,9,8,6,5,5,4,4,4,4,4,3,3,2,1,1,0,0,0,0,0,0,0,0,0,0,0,0,5,11, -169,175,176,175,191,211,206,204,205,207,209,209,206,196,186,178,172,163,151,140,134,123,111,89,53,31,20,10,5,3,0,0,0,0,0,1,5,8,11,18,30,59,110,174,208,169,120,90, -74,69,69,71,72,72,72,72,72,73,73,73,73,73,73,72,72,72,71,69,71,75,79,82,83,79,71,59,44,27,13,5,2,3,6,9,10,10,12,12,13,15,16,17,18,20,22,24, -26,29,31,32,33,36,39,42,45,48,52,56,60,65,68,72,77,81,86,91,96,101,107,113,118,124,129,135,140,145,150,156,161,166,170,175,179,184,188,191,196,199,202,204,207,209,211,212, -213,215,215,215,216,218,219,219,219,218,218,217,217,217,217,218,218,218,218,219,218,217,217,216,216,217,217,215,214,212,210,208,206,203,201,197,194,191,187,184,180,177,173,169,165,161,158,153, -149,145,141,138,136,135,135,133,130,124,113,100,84,66,52,43,35,31,29,27,25,22,21,19,16,15,14,14,13,11,11,11,10,10,9,8,7,6,5,5,4,4,5,3,3,3,1,0, -0,0,0,0,0,0,0,0,0,11,36,69,98,128,147,157,79,58,55,54,63,74,73,75,84,100,128,160,187,209,211,196,152,96,49,28,21,19,21,25,33,41,45,44,39,33,28,27, -28,28,33,48,66,86,104,123,152,194,204,162,100,68,68,72,74,74,75,75,76,76,76,75,75,76,76,76,76,76,76,75,75,75,74,73,71,64,56,48,40,30,22,15,11,6,6,7, -9,10,11,15,19,21,21,22,23,24,25,25,25,24,24,24,23,25,28,30,32,34,37,39,42,46,49,53,57,61,65,68,73,76,81,86,91,96,100,106,112,117,122,127,132,137,143,148, -152,158,162,167,171,175,180,183,187,190,194,197,199,202,204,207,209,211,211,212,214,217,218,219,220,221,221,222,222,221,220,220,219,219,219,219,220,220,220,219,218,216,214,211,208,207,205,203, -201,198,195,192,189,186,182,179,175,172,169,165,161,157,154,150,146,142,138,133,128,120,110,101,91,79,67,58,50,44,41,38,35,34,33,33,33,31,29,28,26,25,24,22,18,16,13,11, -8,7,6,6,5,6,5,4,3,2,2,1,0,0,0,0,0,0,0,1,12,31,56,80,123,159,175,173,159,134,110,97,0,0,0,0,0,0,0,0,0,0,0,5,19,50,79,108, -145,170,172,164,158,133,86,51,38,44,53,65,82,99,119,142,151,153,161,179,200,222,236,243,243,223,164,100,65,45,20,9,10,13,14,14,14,14,13,14,14,14,14,14,14,14,14,14, -13,14,13,13,13,14,20,31,40,47,53,59,62,63,64,65,65,66,71,80,87,90,91,92,92,93,93,91,87,80,75,68,57,46,38,33,31,31,34,37,40,43,46,50,53,56,61,64, -68,72,77,80,86,90,95,99,104,110,115,119,125,130,135,139,143,149,153,157,162,166,170,174,178,181,184,187,190,193,196,198,200,202,204,205,207,208,210,210,211,212,213,215,216,216,216,216, -215,215,215,216,216,216,214,211,207,202,196,192,189,185,182,179,176,172,167,163,159,155,150,146,141,136,132,127,122,117,112,107,102,97,92,87,83,79,79,84,88,89,91,93,92,91,89,86, -84,83,87,93,96,98,96,96,95,94,92,90,84,76,67,57,43,29,15,7,1,0,0,0,1,4,2,2,0,1,3,11,31,60,95,134,161,175,176,168,140,99,60,27,11,1,0,0, -0,0,0,0,0,2,7,9,9,5,1,0,0,0,0,0,2,22,61,97,123,165,202,207,207,207,207,207,210,218,218,214,210,205,195,178,161,151,146,142,137,132,139,162,175,175,143,76, -39,18,8,9,11,10,7,2,0,0,0,0,0,0,1,4,8,11,15,23,39,60,90,116,129,134,136,139,141,142,143,144,143,143,146,149,150,150,150,151,152,152,152,152,152,150,148,146, -137,123,104,83,63,45,36,34,37,39,42,46,49,52,56,59,64,68,72,77,80,84,89,94,98,102,107,112,117,121,126,131,135,139,143,148,153,158,164,168,171,174,176,178,180,183,186,188, -191,192,194,196,197,199,199,201,201,202,202,202,203,203,203,203,202,202,202,202,200,197,195,191,187,184,181,178,177,175,173,169,166,162,158,154,149,145,138,131,125,120,115,110,105,100,97,93, -91,89,87,90,97,109,129,147,155,157,158,159,158,157,156,155,153,153,154,155,155,155,154,154,153,152,154,157,163,170,174,173,162,140,116,96,78,63,62,86,120,132,132,132,132,136,143,159, -174,176,161,127,94,64,36,20,4,0,0,0,0,0,0,0,0,5,15,30,46,61,73,80,79,71,60,48,35,22,9,7,39,89,141,170,169,175,189,199,183,151,136,115,84,78,76,58, -43,32,21,10,2,0,0,0,0,5,22,54,87,123,177,204,201,169,114,83,71,69,67,58,49,45,44,44,44,45,56,69,78,83,86,96,113,133,149,154,146,129,116,111,111,112,113,114, -115,114,111,103,96,94,95,95,96,97,98,101,108,116,122,131,144,155,159,154,138,111,85,64,50,43,41,41,43,48,51,55,58,62,66,70,74,78,81,86,90,95,99,104,108,113,117,121, -127,133,141,153,163,173,181,185,188,187,185,185,182,181,180,179,181,182,184,186,188,189,190,191,191,192,192,193,192,193,196,195,192,189,187,186,185,183,181,178,176,176,177,181,184,186,185,184, -181,178,175,173,169,165,160,151,142,135,132,128,124,122,125,132,136,137,136,141,153,166,177,179,171,155,142,135,132,131,129,128,126,124,121,112,104,100,99,99,98,98,98,101,110,128,149,175, -201,218,226,225,219,208,198,182,154,136,132,130,130,125,115,95,63,33,12,0,0,0,0,0,0,0,0,0,0,0,0,0,45,65,88,106,116,120,119,117,116,116,114,112,115,120,128,158, -187,170,119,64,51,48,43,38,18,2,0,0,0,3,31,42,33,21,12,9,9,9,10,14,26,45,66,82,83,76,76,96,123,174,206,200,161,104,86,90,94,93,93,91,91,94,111,137, -151,153,152,154,155,155,151,136,101,66,43,30,23,21,23,25,27,28,27,23,19,18,19,21,21,21,23,26,30,36,42,49,64,84,107,130,151,159,154,138,117,98,81,66,55,51,50,52, -55,59,63,66,71,75,80,85,89,92,95,98,103,108,115,123,138,154,170,182,189,193,194,194,197,199,201,202,200,198,194,188,183,176,175,176,177,178,179,181,181,182,183,182,182,184,192,193, -191,186,182,179,178,176,174,174,176,180,186,190,189,185,180,177,174,172,169,166,163,162,160,161,159,156,153,150,147,146,152,158,159,154,144,136,133,129,127,123,104,79,66,59,56,53,51,49, -47,44,41,35,29,27,27,26,25,24,23,23,25,28,34,43,65,92,118,139,158,167,159,133,98,70,50,30,15,5,0,0,0,0,0,0,1,2,5,7,7,5,4,3,3,4,10,20, -114,116,110,98,80,63,51,45,54,80,122,166,202,214,213,197,151,96,55,29,12,1,0,0,0,0,0,0,0,1,14,31,45,51,51,48,47,47,48,51,58,61,57,50,37,23,16,14, -15,26,57,105,159,178,137,88,86,97,96,104,142,167,182,199,195,187,177,175,187,204,205,196,187,179,156,123,85,43,21,9,5,4,4,5,5,3,3,3,5,6,8,9,11,12,14,16, -17,23,33,49,76,107,132,150,159,158,150,136,119,104,97,97,98,102,105,107,111,117,125,134,134,131,129,130,133,137,145,156,169,180,180,175,168,162,159,158,161,167,174,181,188,195,200,202, -200,192,184,177,172,170,168,169,170,170,171,171,171,171,174,179,183,184,183,182,180,178,178,176,178,177,173,168,160,151,145,142,139,135,131,128,124,121,121,122,124,123,120,117,114,110,109,108, -103,95,82,72,64,57,52,49,42,34,31,29,29,28,27,24,22,20,18,16,13,10,8,8,8,9,8,7,6,6,5,4,5,9,17,32,58,86,110,128,139,139,130,112,90,71,60,57, -58,58,59,59,61,65,73,82,80,71,65,62,61,65,78,94,95,91,87,72,62,60,78,114,147,171,175,151,106,71,59,67,89,109,114,106,89,69,46,26,11,3,0,0,0,0,0,0, -8,21,30,33,33,32,32,30,25,16,7,3,0,0,1,2,4,9,30,56,86,156,222,214,206,216,213,197,181,156,137,94,72,63,53,47,60,100,135,136,150,184,216,234,232,207,180,149, -124,107,95,85,77,64,49,32,18,11,8,8,9,10,11,13,14,15,16,17,22,34,52,74,99,120,138,154,163,164,162,163,166,168,169,170,173,176,180,184,180,171,167,165,166,167,168,167, -160,148,135,127,123,122,123,126,128,132,136,142,148,155,165,176,189,197,200,197,191,184,176,168,164,161,160,159,159,158,157,158,160,163,167,167,165,164,162,159,155,149,142,137,133,130,126,122, -119,116,112,109,105,101,97,94,91,87,83,80,75,72,67,64,60,58,58,66,79,96,110,115,113,110,111,111,105,103,102,100,99,98,97,95,89,80,66,50,29,10,4,2,3,4,5,6, -5,4,4,16,40,74,104,119,128,136,148,160,166,163,160,159,160,160,161,161,162,163,163,162,150,132,123,119,117,118,119,114,164,174,176,176,176,174,169,146,110,75,29,1,0,18,43,65, -97,143,166,168,161,147,136,123,106,91,73,52,28,11,5,2,1,2,3,3,1,1,1,0,0,0,0,0,0,1,7,26,62,115,173,194,197,199,201,196,197,188,177,127,88,73,67,58, -54,50,48,48,50,63,95,112,114,124,145,170,199,225,239,247,247,242,234,227,221,212,197,172,143,120,107,99,97,98,94,90,90,97,104,107,107,107,108,114,122,130,141,154,168,174,171,172, -172,172,171,167,161,155,152,149,138,127,123,123,125,126,123,115,104,100,99,101,104,108,112,115,117,120,123,125,127,130,134,138,148,160,173,184,192,196,195,191,183,176,170,163,157,153,150,148, -147,146,145,143,141,139,138,136,132,129,127,124,122,120,117,115,112,110,107,104,100,97,93,89,85,82,79,76,74,74,72,70,67,67,75,91,118,152,186,205,211,215,217,218,219,220,220,220, -219,219,219,219,218,217,211,203,178,136,103,63,36,20,8,4,2,2,3,10,39,91,133,153,167,180,194,206,220,228,229,229,229,228,227,225,222,219,217,214,197,174,172,174,174,173,170,167, -96,72,48,46,44,37,22,3,0,0,24,75,137,171,177,172,166,151,142,158,180,197,206,213,216,217,213,206,180,151,129,102,82,69,56,47,45,43,44,47,55,65,71,76,81,89,120,172, -207,209,184,165,169,169,159,150,147,142,135,129,132,133,130,126,122,118,116,115,115,115,123,128,121,109,98,88,86,92,108,130,153,175,194,205,215,229,242,247,247,245,241,238,236,234,232,229, -227,229,232,234,234,235,234,235,236,238,238,235,228,214,188,154,122,104,99,93,84,78,77,76,72,68,70,72,76,78,79,80,82,86,90,93,95,98,102,105,109,112,114,116,119,121,123,124, -126,128,134,142,151,162,174,183,189,191,190,187,182,176,171,167,165,162,158,154,151,148,147,145,144,142,140,138,135,135,137,139,139,136,134,132,130,127,124,121,119,116,111,109,113,115,113,111, -110,108,108,111,114,119,131,142,140,134,126,120,117,115,113,112,111,111,110,110,116,124,136,154,183,207,215,210,194,171,138,99,70,52,41,38,42,50,60,73,93,120,140,152,160,162,155,138, -120,108,102,93,82,75,77,90,118,138,133,129,129,130,123,111,0,0,0,0,0,0,0,3,54,124,173,174,135,77,47,32,21,9,2,9,25,48,63,74,86,97,115,143,177,197,209,216, -215,207,191,182,184,187,188,195,206,213,215,216,218,220,219,200,176,169,171,181,188,192,194,194,191,186,176,168,162,156,150,145,140,134,127,117,105,91,81,73,62,50,39,29,20,15,12,12, -15,24,35,44,56,85,115,132,146,159,168,178,184,186,188,192,192,190,187,187,190,194,196,203,209,216,227,232,234,240,232,201,154,104,58,40,41,45,48,51,54,57,60,63,65,67,70,72, -75,79,82,87,91,99,115,134,145,149,151,152,154,155,157,158,159,160,160,161,162,165,169,177,183,189,194,198,197,192,187,184,183,182,182,181,180,179,178,176,176,175,174,172,171,171,171,170, -169,167,165,164,163,161,159,157,154,149,137,127,121,115,112,110,109,105,102,94,84,74,69,64,56,47,38,31,26,21,20,18,17,16,15,14,16,21,29,42,62,83,108,138,162,183,205,216, -213,200,170,140,124,120,122,135,144,149,149,134,109,81,53,27,9,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,26,73,142,186,153,78,25,1,0,0,0, -0,0,0,0,0,0,0,0,0,1,8,18,35,52,69,92,115,136,164,174,174,171,171,160,143,130,125,125,126,126,117,112,125,145,163,177,185,189,190,188,183,177,167,158,149,141,134,128, -122,114,105,93,83,73,64,54,47,40,34,28,23,19,15,12,8,4,2,0,0,0,2,5,12,22,36,53,70,81,85,90,97,100,99,98,99,103,110,124,136,145,148,147,151,172,195,218, -232,220,156,81,47,40,43,47,49,52,53,56,59,63,70,79,95,113,129,139,147,165,196,221,230,231,232,232,232,233,233,233,233,234,233,233,234,234,233,233,234,234,234,234,229,216,199,184, -175,163,156,155,156,156,156,153,152,151,150,150,148,145,140,132,128,126,124,122,120,118,116,113,109,101,90,79,69,62,58,57,54,53,49,42,36,32,29,27,24,22,20,19,18,18,16,14, -13,12,11,8,7,6,5,7,12,19,31,47,62,73,84,104,130,154,187,209,204,186,151,126,124,126,121,111,98,79,59,37,19,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,7,37,78,131,173,176,133,55,6,0,0,0,0,0,1,1,1,2,2,2,2,3,3,3,4,6,9,16,24,30,33,34,36,44,50,52,53,48,39,32,31,32,35,42,50,61,79, -103,130,153,168,179,184,186,184,179,173,167,161,156,150,145,139,133,125,117,108,99,92,83,74,65,57,49,42,36,30,25,21,16,13,10,10,15,23,30,36,43,51,58,62,67,71,73,75, -78,76,71,67,61,54,49,49,55,59,60,66,79,95,112,133,165,212,239,211,156,95,52,39,41,46,51,62,84,112,138,162,190,212,226,232,236,243,248,243,238,236,237,237,237,237,238,238, -238,239,239,239,239,239,239,239,239,238,238,241,246,249,243,234,227,207,173,150,134,124,118,110,104,100,95,93,91,89,85,79,78,75,73,72,72,71,70,67,63,57,51,46,44,41,40,38, -37,34,32,30,29,28,25,25,23,21,19,18,16,15,14,12,11,10,9,11,19,27,35,41,48,54,60,63,65,67,67,67,68,67,74,98,120,153,184,175,136,103,77,60,59,71,82,83, -75,58,36,16,3,0,0,0,0,0,0,0,0,0,0,0,97,148,176,170,138,83,34,6,0,1,1,0,0,0,0,0,1,2,3,3,3,5,5,5,13,32,44,49,53,57,58,59, -60,60,60,61,62,63,63,60,53,47,47,48,53,62,78,99,126,151,173,187,197,202,204,202,199,196,191,186,180,174,167,161,154,148,141,134,124,114,104,94,85,77,70,62,55,48,43,40, -38,41,50,68,90,107,116,121,122,121,119,116,110,103,96,93,93,93,94,93,93,88,81,69,58,45,31,24,27,38,53,70,90,123,176,222,240,221,160,98,71,80,111,147,187,219,235,243, -247,242,235,231,228,218,196,164,147,145,145,144,145,145,146,148,149,150,150,151,152,153,153,153,156,165,170,176,191,214,237,252,255,252,241,223,199,175,162,154,149,139,123,102,89,84,80,79, -78,78,78,79,82,84,83,81,78,73,67,59,52,44,37,33,29,28,27,28,28,27,24,23,22,22,22,20,18,18,18,21,24,31,43,63,87,105,116,120,122,121,118,114,107,100,92,88, -87,86,84,81,78,81,99,141,175,183,177,154,121,101,81,83,92,97,90,72,49,25,10,2,0,0,0,0,1,4,19,54,172,143,95,70,56,51,53,56,57,56,49,37,33,29,17,7, -2,2,2,3,5,6,6,7,21,46,55,53,49,45,43,44,49,54,59,60,58,56,61,70,78,81,82,85,93,109,132,158,180,194,205,213,220,225,226,226,224,224,222,220,218,215,210,205, -201,197,194,191,184,170,154,142,135,130,126,117,110,103,101,102,108,119,135,149,156,156,151,145,138,131,125,120,114,105,93,83,73,68,67,67,71,79,88,94,96,93,80,57,38,29,24,26, -36,51,78,118,167,218,242,228,203,202,221,238,246,241,228,217,195,170,157,154,153,145,129,116,111,110,107,100,98,95,89,82,79,79,81,82,82,83,84,84,93,109,115,114,115,126,152,199, -230,231,236,247,248,241,235,234,235,232,219,193,167,154,147,140,129,120,114,110,105,102,100,98,98,98,104,110,103,93,85,80,76,74,73,67,59,52,46,44,45,56,66,68,68,68,73,81, -92,107,125,142,151,152,147,142,135,128,122,117,111,102,89,78,68,61,59,58,61,68,75,80,91,106,117,136,157,168,175,173,174,179,175,168,169,161,150,139,133,134,133,134,141,151,172,186, -92,83,81,84,84,85,85,85,85,87,88,90,99,108,95,71,49,35,31,32,32,30,26,26,31,40,42,44,49,56,61,68,76,86,93,95,91,84,80,80,83,86,98,130,169,203,225,237, -241,242,243,244,246,248,248,248,248,248,248,248,248,249,249,249,249,248,248,246,244,236,225,218,211,206,200,188,173,155,143,139,136,137,138,129,115,101,88,81,78,74,72,75,81,88,93,95, -92,86,78,73,67,67,69,73,81,94,107,109,99,84,69,56,52,61,82,114,153,197,238,255,255,255,254,243,217,188,168,158,145,125,121,120,119,119,120,121,123,125,126,129,136,143,135,117, -100,91,87,88,87,85,82,82,86,92,92,92,95,99,108,129,152,160,173,200,223,235,239,239,239,241,247,248,242,236,231,226,214,200,191,185,177,175,174,173,174,176,194,213,212,209,210,213, -213,211,207,184,154,127,105,91,85,86,91,90,89,88,92,103,111,118,123,114,101,88,77,70,68,65,65,68,75,82,88,90,87,80,71,64,58,57,58,62,69,82,95,98,93,91,96,93, -93,109,138,162,174,187,198,205,206,197,189,185,180,176,159,132,71,59,47,36,30,29,29,29,29,31,38,53,77,106,126,134,132,119,102,93,91,89,87,85,86,87,88,93,100,105,107,108, -108,108,106,106,109,114,119,126,137,162,202,234,250,254,254,254,254,253,253,253,252,252,252,252,251,251,251,251,252,252,251,251,251,250,249,248,249,251,251,252,251,249,246,240,231,213,190,168, -142,117,95,73,57,45,36,30,26,23,21,22,26,33,43,54,67,78,86,90,92,94,93,91,91,95,105,119,131,139,142,144,154,175,201,223,236,245,250,244,233,234,247,246,208,158,126,111, -100,87,78,72,68,68,70,71,72,76,82,94,114,137,153,160,159,148,135,127,124,122,120,119,119,118,119,121,126,130,130,128,126,125,124,131,147,163,173,175,175,179,195,216,230,236,238,240, -244,246,246,245,245,246,246,246,245,246,250,254,246,226,218,217,215,210,216,228,234,230,219,208,195,174,139,107,88,77,69,57,42,36,32,23,17,13,9,8,8,7,7,10,14,23,34,46, -60,72,80,84,87,88,87,86,85,90,103,119,132,138,132,117,103,98,94,89,91,101,114,127,133,127,112,98,89,87,87,88,12,6,1,0,0,0,0,0,0,0,0,5,13,29,53,86, -124,144,131,102,84,82,87,91,94,96,96,95,90,83,77,74,69,65,63,70,94,126,157,183,208,235,239,227,219,216,220,226,232,235,236,236,236,237,237,237,237,237,236,235,233,231,229,226, -224,222,219,216,217,221,225,227,227,230,235,240,245,249,247,239,224,203,175,149,124,109,94,72,51,36,26,22,20,19,18,18,21,29,36,43,50,57,66,74,81,95,111,130,154,177,200,221, -237,247,250,243,231,215,189,149,113,103,131,177,221,223,188,138,86,53,37,34,35,35,35,38,41,45,47,51,58,71,90,116,146,162,152,128,113,110,113,114,115,115,113,110,104,97,90,85, -79,73,67,66,71,78,86,93,100,109,124,141,156,164,169,176,188,198,201,199,199,199,198,198,198,198,198,193,157,100,75,67,61,56,63,88,117,144,170,186,200,219,229,224,214,206,196,166, -120,69,38,22,7,0,0,0,0,0,0,0,0,0,0,1,6,13,21,28,36,44,53,60,66,71,77,87,99,110,113,104,95,91,80,66,59,57,54,50,48,44,35,25,20,17,16,16, -0,0,0,0,0,0,0,0,0,0,1,1,1,1,4,17,46,85,110,106,80,56,45,43,46,48,50,49,47,45,47,51,62,88,121,150,194,225,234,233,227,203,165,146,147,153,164,178, -191,202,209,213,218,222,225,227,227,226,225,222,219,216,215,213,210,208,205,201,198,195,194,191,188,185,185,188,196,210,223,233,244,249,248,242,233,226,216,192,161,133,113,104,100,98,97,98, -100,106,107,104,103,105,109,115,129,160,190,212,227,235,237,234,225,210,181,140,108,84,61,39,27,22,25,45,107,177,219,233,212,169,114,73,65,80,78,86,102,106,108,111,112,108,109,117, -135,158,170,164,147,132,126,123,121,113,99,83,71,62,53,50,48,48,47,46,44,42,42,43,45,50,57,67,74,79,84,91,96,100,97,90,85,85,84,82,82,79,75,64,43,23,15,14, -13,12,12,13,15,21,29,38,47,71,110,146,165,175,190,217,234,221,199,174,136,97,67,44,23,7,1,0,0,0,0,0,0,0,0,0,0,0,1,4,8,11,15,20,25,28,27,21, -17,16,13,8,6,5,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,3,10,16,21,31,54,91,130,140,115,80,58,47,44,46,54,66,79,101,133, -172,211,235,241,230,199,173,159,148,134,121,121,129,139,149,159,172,183,195,203,210,217,222,225,225,225,224,223,222,219,218,217,216,213,210,208,204,199,195,191,186,179,173,167,163,162,165,171, -185,201,214,225,234,239,243,248,244,237,231,227,225,224,225,227,231,234,234,232,230,230,230,231,235,243,246,240,224,205,181,154,128,100,68,43,30,25,23,22,22,23,22,21,25,43,81,140, -196,227,231,212,205,223,221,223,228,223,223,226,227,223,222,222,222,226,232,238,238,233,227,224,221,214,198,178,162,145,123,111,109,109,109,107,100,87,72,61,54,46,38,33,32,32,32,33, -34,33,31,28,27,30,36,37,35,32,26,21,19,17,16,15,15,14,14,13,12,10,8,6,4,4,6,14,20,25,34,65,115,163,188,211,228,229,220,204,174,138,116,90,56,31,15,7, -5,5,7,9,9,9,8,9,9,9,6,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,4,19,43,67,83,90, -99,108,123,147,166,168,160,153,151,148,149,169,190,206,223,239,241,219,183,164,138,112,107,109,113,119,127,133,141,150,157,166,175,185,195,203,210,217,225,229,229,230,230,229,229,227,225,222, -220,217,215,213,210,207,204,200,195,190,186,179,172,164,156,150,146,145,146,150,157,159,170,196,214,218,221,224,228,233,239,247,253,254,254,255,255,255,255,255,253,252,248,242,234,223,208,191, -172,148,120,87,56,39,32,27,23,21,20,21,20,18,18,28,51,92,150,202,219,235,232,232,235,229,230,235,239,240,242,243,243,245,245,247,249,250,249,246,243,243,245,246,244,240,230,223, -222,222,222,222,218,205,188,171,159,138,105,77,56,42,32,28,25,23,21,19,20,34,55,62,60,59,57,52,48,42,33,24,16,11,9,8,7,7,7,6,5,4,2,1,0,0,0,0, -4,17,30,52,84,119,152,177,206,224,228,226,212,192,166,146,135,124,112,103,99,96,93,89,85,81,73,58,38,21,10,5,4,11,21,25,26,28,29,27,25,21,8,1,0,0,0,0, -71,84,96,97,87,63,40,34,40,55,78,105,127,137,137,137,137,135,135,141,165,195,224,242,249,249,249,248,240,231,213,192,164,130,109,103,105,109,115,122,127,134,142,151,161,170,177,186, -193,200,207,212,216,220,224,228,229,230,230,231,231,230,231,229,227,223,221,218,215,212,210,207,203,200,195,191,186,180,173,166,158,150,142,134,128,123,120,126,138,149,161,171,180,185,190,203, -219,225,224,223,223,224,228,232,236,239,239,239,239,239,241,245,246,244,234,210,174,139,117,97,71,46,29,21,18,16,16,15,14,16,28,51,66,85,85,98,122,135,152,170,183,182,178,177, -174,171,168,164,162,165,171,179,184,190,201,212,219,228,234,234,233,231,230,231,233,240,244,245,243,237,221,201,177,150,131,119,110,96,79,65,54,55,62,58,52,53,55,57,59,61,61,57, -48,36,26,17,13,10,9,9,8,8,8,8,9,7,6,4,3,2,0,0,4,13,23,37,69,106,138,176,208,230,241,247,248,246,240,231,226,221,217,207,195,184,175,170,162,150,138,130, -132,157,178,182,181,184,188,183,180,171,142,119,110,103,95,79,222,221,227,231,229,221,206,196,193,202,215,222,219,212,206,205,203,202,201,211,230,236,224,203,186,184,189,184,176,175,172,164, -156,151,147,142,140,143,147,151,158,168,178,188,197,203,208,213,216,221,224,227,228,230,230,228,228,229,229,229,229,229,231,231,232,231,230,228,227,224,222,220,218,215,213,211,208,205,201,197, -192,186,179,174,172,170,164,160,161,164,168,166,157,144,134,129,129,130,124,118,116,117,122,128,136,143,146,151,155,157,164,179,198,217,235,247,250,243,235,224,203,170,134,97,63,44,35,30, -27,26,25,29,34,44,61,87,109,125,135,132,115,91,75,69,65,59,54,49,45,47,55,69,86,105,123,136,147,163,175,176,172,165,158,149,149,163,182,195,204,223,240,248,250,246,241,236, -232,222,206,190,177,168,157,136,113,105,103,103,105,111,116,122,128,129,127,124,120,114,111,109,109,109,111,113,110,98,83,73,69,65,62,63,70,77,79,83,93,105,116,121,120,117,124,135, -140,153,175,190,200,204,211,220,229,233,236,240,244,247,247,248,249,246,235,227,226,226,226,220,215,220,227,229,231,233,233,230,212,196,183,180,187,206,225,234,235,231,219,208,203,201,201,202, -203,205,208,205,177,140,109,89,84,89,98,105,113,128,146,160,170,177,182,184,184,185,188,192,195,200,203,205,206,207,208,209,211,215,219,223,229,234,236,237,237,237,237,236,236,236,236,236, -236,237,238,239,239,238,236,235,234,232,230,229,227,225,223,220,218,214,210,206,203,198,193,187,180,170,155,135,117,102,93,86,80,75,73,71,69,70,71,71,72,74,75,77,80,82,86,93, -104,122,147,180,208,226,236,244,253,253,244,226,197,172,155,136,117,104,98,99,107,116,125,129,122,109,90,65,42,27,21,20,21,20,20,20,21,21,22,22,26,33,42,49,59,76,97,115, -124,130,133,132,129,130,135,141,148,164,184,205,224,236,245,249,251,252,252,251,250,250,250,245,236,232,229,229,229,228,229,230,231,234,237,240,241,240,238,237,237,237,238,237,233,222,204,186, -176,166,154,145,139,129,121,115,108,97,79,54,33,17,10,7,7,10,18,27,34,38,44,57,75,95,112,118,124,132,139,146,150,139,130,132,135,137,141,139,137,142,153,161,166,172,188,212, -126,119,115,113,112,112,108,94,83,72,57,48,46,50,53,58,62,69,75,78,70,64,68,74,79,83,86,90,93,99,108,119,130,141,153,165,172,175,179,183,184,184,183,181,182,184,187,190, -193,198,202,207,213,221,227,233,238,241,241,239,240,239,239,240,240,239,238,238,237,234,232,231,230,229,227,223,220,218,215,212,208,205,200,195,188,179,172,163,152,140,127,115,106,100,96,92, -90,87,86,85,84,84,84,84,83,83,83,81,81,79,76,74,72,72,74,84,99,115,130,149,178,209,233,249,254,252,248,238,221,204,183,157,131,112,93,68,48,33,22,15,13,15,15,16, -17,17,17,18,19,19,19,18,18,18,17,17,19,21,28,39,49,59,74,89,100,109,122,133,146,159,177,202,222,234,242,246,248,249,248,247,247,249,249,247,245,246,245,244,244,244,243,244, -245,244,243,241,240,237,235,234,234,234,234,233,237,244,246,241,238,233,222,210,197,174,149,121,98,90,77,54,31,18,18,29,54,83,98,98,98,94,77,48,22,3,0,0,0,0,2,7, -12,17,28,39,44,48,58,69,79,89,101,111,114,116,129,139,43,44,44,39,31,21,10,1,0,0,0,1,4,8,12,18,25,33,41,49,58,67,74,80,84,88,91,94,97,100,103,107, -111,116,123,130,137,141,146,151,155,158,162,166,171,175,180,183,189,194,198,202,206,210,215,220,225,230,231,231,231,232,231,232,232,231,228,227,225,223,222,220,219,217,217,214,211,208,206,203, -199,195,189,184,178,171,163,156,148,140,133,126,120,114,110,106,103,102,99,99,98,97,97,96,96,95,95,94,93,91,89,86,82,76,69,62,56,51,48,48,57,77,108,148,182,203,220,236, -244,246,239,216,173,129,93,64,44,29,20,16,15,15,15,16,15,15,15,15,16,16,16,17,17,17,16,16,16,15,14,15,19,31,51,80,114,151,184,203,217,230,240,243,237,229,218,202, -186,176,160,147,144,144,141,130,124,128,127,124,122,123,122,125,128,125,120,117,116,117,127,140,154,161,163,164,174,194,215,226,233,237,241,243,243,240,233,219,209,212,212,202,187,171,167,181, -200,218,230,226,221,223,225,211,178,124,94,76,47,22,8,0,0,0,0,0,0,0,2,5,10,16,27,38,44,44,44,43,5,5,5,5,2,1,1,3,4,5,7,10,13,17,21,26, -33,41,49,58,66,72,79,86,91,93,96,99,101,103,107,110,115,119,123,127,131,136,140,145,150,155,161,167,172,176,180,184,189,193,198,202,205,209,212,214,218,220,221,224,224,225,224,225, -225,224,223,221,220,220,220,219,217,217,216,215,213,210,207,205,202,199,194,190,184,179,172,165,158,152,144,138,132,126,122,118,115,113,111,110,109,109,108,108,107,106,106,105,103,102,100,98, -94,87,80,73,65,55,48,39,30,24,23,32,47,64,88,118,151,185,217,239,241,229,212,194,174,150,126,108,99,98,98,96,92,90,90,90,90,90,90,91,91,91,91,90,90,90,90,95, -111,142,175,203,226,240,244,240,231,219,200,170,135,111,92,72,57,48,38,29,24,23,21,17,17,15,12,9,8,11,13,15,21,34,50,73,95,120,157,186,203,214,215,215,217,221,226,231, -234,237,241,244,246,248,250,252,252,253,254,255,255,255,255,247,225,195,155,109,85,93,125,170,209,230,231,226,209,177,141,101,55,19,3,1,1,1,1,0,0,0,0,0,0,3,5,5, -58,58,58,58,58,58,58,60,61,63,64,66,69,72,75,79,85,91,97,104,109,114,121,128,132,130,129,131,133,134,137,140,143,147,149,148,148,151,155,159,163,167,171,176,180,184,190,197, -202,206,210,213,214,216,219,222,224,224,224,225,225,224,225,225,225,224,223,223,220,220,220,219,217,216,215,215,214,212,209,207,205,203,199,194,190,184,178,172,165,158,152,146,140,134,130,127, -124,122,120,119,119,118,118,117,117,116,115,115,113,111,108,106,104,100,96,92,88,84,81,74,66,58,54,50,51,58,66,72,83,102,134,174,208,228,240,247,248,246,241,235,231,230,230,229, -227,226,225,225,226,225,226,227,227,226,226,226,226,226,226,228,236,246,250,245,230,210,182,155,135,115,95,74,59,53,56,64,68,70,74,73,67,63,63,65,62,53,47,51,61,79,93,102, -118,149,179,204,221,232,241,240,233,228,226,226,226,226,226,225,225,225,225,225,225,226,227,229,231,229,219,210,201,187,163,122,76,42,18,3,0,0,5,20,54,98,120,144,180,212,238,238, -213,164,111,81,70,63,58,51,43,39,38,38,42,51,57,58,140,140,140,140,140,139,137,132,126,122,121,123,125,127,130,132,136,141,145,149,153,156,161,165,162,150,145,146,147,148,150,152, -154,157,158,150,144,146,150,154,158,161,166,170,174,179,187,198,205,209,215,221,223,224,226,229,232,232,233,233,232,232,233,234,233,232,229,229,228,225,223,222,220,218,216,215,214,212,210,208, -206,204,201,197,192,188,182,175,169,163,157,151,145,140,137,133,130,128,127,126,125,125,125,124,124,123,123,122,120,118,114,111,109,108,108,106,107,109,111,112,113,112,114,115,117,122,122,120, -119,120,122,131,145,161,178,193,206,219,231,238,242,243,243,243,245,245,245,245,245,245,245,246,244,241,240,240,240,240,240,240,233,219,194,157,119,91,71,59,52,49,47,46,45,49,64,85, -96,102,113,123,124,120,121,130,142,153,166,186,207,224,233,236,242,248,249,244,233,221,196,162,132,113,102,98,97,95,95,95,96,96,97,97,97,97,98,100,102,94,75,60,47,30,13,1, -0,0,0,0,0,0,0,0,0,0,2,10,25,55,128,209,242,252,240,219,203,189,176,158,142,135,133,131,129,131,135,138,199,199,199,199,199,199,193,177,148,117,92,80,76,77,80,83, -88,93,99,104,110,115,120,122,117,107,103,104,105,107,109,111,114,117,117,115,114,118,122,126,131,136,141,146,150,155,163,171,176,181,189,197,202,206,209,213,217,222,225,228,232,233,235,238, -239,239,237,236,235,235,233,231,231,228,225,223,220,216,212,208,205,202,200,197,193,187,182,177,171,165,159,154,148,144,141,137,135,133,131,130,130,129,129,129,128,127,126,125,124,121,118,113, -111,108,102,98,94,89,87,88,91,92,92,92,91,84,75,70,70,70,69,68,69,71,75,80,88,98,110,121,127,130,130,130,133,136,136,135,136,136,136,136,129,119,115,114,114,114,115,113, -101,81,58,33,17,12,11,10,10,10,10,10,10,11,17,27,34,37,46,61,75,95,127,159,196,226,242,251,254,249,243,240,238,226,206,185,167,155,138,118,105,92,77,66,56,38,21,10, -5,2,3,4,4,4,4,5,4,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,106,147,162,187,209,223,234,239,233,220,211,208,206,202,198,196,198, -56,57,56,55,56,55,50,46,40,32,24,18,16,17,20,24,30,36,44,50,57,63,68,72,74,74,74,76,77,78,79,83,85,88,91,94,98,103,106,110,115,119,124,129,134,139,143,148, -153,157,162,168,173,178,182,188,192,198,202,207,212,217,220,223,227,227,226,226,226,228,229,230,232,235,236,235,234,231,225,219,212,205,199,194,190,185,181,175,169,164,159,153,149,144,141,138, -136,134,133,132,131,131,130,130,129,128,128,126,125,122,119,115,110,103,95,86,77,66,57,49,44,38,32,28,24,18,13,10,8,8,7,7,7,7,6,7,7,7,9,11,12,13,12,13, -14,15,15,14,14,15,15,15,12,9,8,8,8,8,8,8,5,1,0,0,0,1,1,1,1,0,0,0,0,2,2,2,2,7,22,53,101,162,210,232,243,238,220,196,166,138,119,115, -117,106,87,77,79,87,97,109,123,137,145,144,138,122,97,71,47,24,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,1,22,46, -42,25,31,50,73,100,109,92,76,68,65,68,84,93,79,62,0,0,0,0,0,0,0,0,0,0,0,3,6,10,14,19,24,32,41,48,53,59,64,67,70,72,73,73,73,74,75,76, -78,80,83,86,89,92,96,100,104,108,113,118,122,126,130,135,140,144,149,154,158,163,169,174,178,184,188,192,196,200,204,207,210,212,214,217,218,219,221,224,227,230,233,234,233,234,234,231, -226,220,210,199,190,183,176,171,166,161,155,150,145,142,139,136,134,133,131,130,130,130,129,129,128,127,126,125,124,121,117,113,107,100,92,83,73,63,53,43,34,26,19,15,10,6,4,3, -1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,2,2,2,2,2,2,3,3,3,4,7,9,9,9,9,9,10,10,11,11,10,13,21,29,32,35,39,47,62,77,83, -86,100,140,185,221,241,235,216,185,136,89,55,28,13,9,10,15,19,23,34,46,57,70,87,106,126,142,148,151,154,151,139,127,104,69,35,13,2,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,2,9,8,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,6,12,18,22,24,25,31,39,45,47,49,52,56,60, -65,75,86,92,95,99,102,104,107,109,110,110,111,110,110,111,112,112,114,116,117,120,122,126,128,131,134,137,141,144,147,151,153,157,161,164,169,173,177,181,186,190,193,196,198,201,206,211, -214,218,221,223,224,223,221,218,217,215,214,212,212,212,212,213,216,221,221,214,204,193,178,167,159,153,149,145,140,137,134,131,130,128,127,127,126,126,125,125,124,124,123,121,120,116,112,108, -103,96,88,80,70,60,51,42,33,25,19,13,8,5,4,3,5,5,6,12,18,23,26,32,48,72,100,115,117,117,117,117,118,121,116,97,82,80,81,81,81,81,91,112,122,120,118,119, -119,118,119,118,117,115,125,150,169,175,177,184,194,207,220,224,225,231,244,249,239,211,165,127,100,77,62,51,42,42,50,58,64,76,91,100,101,96,90,85,81,74,70,69,72,76,79,86, -102,122,127,111,83,54,28,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -59,62,70,83,94,100,101,103,108,115,118,120,121,123,124,125,126,127,129,129,128,129,130,132,136,141,145,148,149,150,150,150,151,150,151,151,152,153,155,157,159,160,162,164,166,168,170,171, -173,174,177,179,182,185,188,192,195,200,204,207,209,213,219,224,224,225,223,219,213,208,203,199,195,192,190,189,188,186,185,185,187,192,200,207,211,208,198,182,163,148,140,135,131,128,126,124, -123,122,121,120,120,119,119,118,117,116,116,114,112,109,105,100,95,90,82,74,65,55,47,38,29,22,20,22,27,34,41,50,60,63,68,80,97,123,151,175,203,226,242,246,246,245,246,246, -246,247,246,236,222,220,220,219,220,220,227,240,244,240,239,239,239,239,239,238,238,236,240,250,254,255,255,255,255,252,248,245,245,242,229,205,178,149,128,119,118,118,118,118,116,118,132,140, -135,134,127,105,81,61,44,30,20,11,7,4,4,5,6,10,21,46,79,109,123,122,103,68,32,8,0,0,0,0,0,0,0,0,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,10,20,29,39,48,121,120,121,118,112,106,106,106,103,98,97,100,103,107,110,113,115,114,113,114,117,119,119,119,118,117,117,116,113,111,107,105, -104,103,102,102,103,104,106,107,109,112,114,115,118,122,127,133,139,146,153,158,162,165,169,173,173,168,170,178,186,192,198,201,199,198,195,189,186,184,182,180,178,177,175,173,172,172,170,169, -166,164,166,170,178,186,194,196,186,167,149,134,123,116,114,113,112,111,110,111,110,110,110,109,108,107,107,105,102,100,96,91,87,80,73,65,57,49,43,38,43,54,68,84,98,107,114,118, -118,117,125,154,194,230,246,242,227,206,179,161,159,158,158,158,157,154,164,197,211,210,210,210,210,210,220,237,240,235,233,232,233,233,234,234,233,227,223,217,199,190,187,180,171,157,141,134, -132,126,108,87,73,67,66,66,67,67,70,78,85,91,100,101,85,70,52,28,11,4,0,0,0,0,0,0,0,0,0,0,0,0,9,32,58,87,114,124,106,73,41,19,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,2,7,20,41,61,80,97,107,114,119,70,67,61,49,37,32,37,47,56,59,63,69,77,84,90,98, -108,120,130,139,146,148,147,142,135,124,113,104,95,87,79,70,60,50,44,42,43,44,44,46,49,51,53,57,62,72,89,113,143,170,189,200,203,204,205,208,208,199,193,197,199,197,190,183, -173,165,163,163,165,167,168,167,168,168,166,164,163,162,160,159,156,152,148,145,140,141,149,164,177,182,175,162,145,130,117,106,101,98,96,96,95,95,95,96,96,95,94,93,91,88,85,80, -77,71,66,63,63,67,73,82,98,114,120,120,114,104,93,80,83,128,183,227,231,196,146,115,91,72,57,49,49,45,39,30,22,16,15,32,43,44,44,43,43,45,63,98,115,113,112,111, -107,102,99,98,97,90,82,71,51,42,39,34,28,21,14,12,11,10,7,4,3,4,4,4,4,4,5,9,12,15,18,16,9,3,0,0,0,0,0,3,8,11,12,12,12,12,12,12, -12,12,9,6,6,16,41,78,111,123,115,93,66,43,23,8,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,4,12,23,38,54,72,95,114,121,121,114,104,93,84, -5,3,1,2,9,28,51,73,88,96,103,112,119,127,135,142,151,158,158,154,150,151,157,164,168,164,153,144,137,131,124,113,97,77,56,38,30,28,28,29,31,34,36,38,40,44,48,55, -65,78,89,99,104,108,111,116,126,152,175,183,185,191,203,213,215,205,191,178,170,166,168,174,181,184,183,183,181,178,173,170,172,177,179,176,170,168,168,171,179,189,199,204,203,197,188,177, -166,155,144,133,118,107,98,91,85,83,82,82,81,79,78,80,84,87,89,96,103,112,116,118,113,97,77,58,40,25,20,59,147,220,226,180,107,63,54,65,75,79,80,80,80,78,73,61, -46,31,17,6,0,0,0,0,10,25,40,55,68,73,75,73,64,47,28,11,3,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, -4,13,26,35,39,41,48,63,81,91,93,93,91,87,79,74,72,71,68,60,45,28,15,17,38,69,98,118,123,115,99,73,49,32,24,20,15,11,5,3,3,3,3,3,4,7,13,25, -41,56,68,82,99,113,120,121,114,95,73,54,38,25,17,11,0,5,16,37,63,84,93,91,84,85,95,110,126,142,158,165,154,121,83,58,47,47,57,81,118,154,172,172,162,149,136,126, -121,117,105,82,56,36,24,21,21,24,26,27,29,29,31,33,35,35,38,40,43,48,53,58,63,70,79,87,96,108,131,160,187,209,225,231,227,217,212,210,208,208,209,211,215,221,217,213, -219,224,227,230,235,240,243,241,238,237,237,240,243,245,247,248,248,246,243,237,225,213,199,176,155,137,117,101,97,98,104,113,123,129,131,127,117,103,88,75,56,33,15,4,4,25,94,191, -231,181,105,64,61,76,86,81,70,63,62,63,65,70,80,93,102,106,101,83,64,54,50,56,73,85,88,86,81,76,74,77,82,87,80,59,32,12,1,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,7,22,42,60,75,84,87,87,89,100,122,139,144,145,146,148,145,130,111,93,82,80,85,89,85,69,46,28,21,29,50,75,98,116,123, -118,108,103,102,97,83,69,63,61,61,61,62,66,76,93,113,133,143,145,138,123,103,84,67,47,24,8,0,0,0,0,0,49,61,76,88,89,77,59,49,49,62,83,107,129,149,162,147, -92,34,8,5,5,6,8,10,29,81,141,168,160,136,111,91,81,82,95,105,101,85,62,43,28,21,19,19,20,20,22,23,27,31,34,36,38,39,42,47,51,58,67,82,101,122,139,147, -150,149,149,159,177,195,205,218,225,224,224,223,220,214,214,214,199,178,162,159,165,173,183,191,190,183,177,174,175,179,185,189,190,194,201,216,230,236,243,249,247,239,219,185,164,152,137,129, -129,130,129,120,102,82,66,57,50,44,46,76,125,178,228,224,155,88,73,83,86,72,52,36,28,29,37,46,51,57,68,89,112,133,141,128,114,107,100,90,79,61,45,33,23,17,15,18, -29,47,72,88,87,72,49,29,13,5,2,0,0,0,0,0,1,3,4,5,4,2,0,0,0,1,7,19,37,60,81,89,87,78,63,50,45,45,52,66,73,74,74,75,84,100,109,106, -90,68,50,42,48,64,81,89,82,64,48,46,53,67,85,100,106,108,111,123,131,125,120,119,120,119,119,121,126,132,135,141,144,146,144,129,103,77,60,51,44,38,33,28,25,25,27,34, -106,104,97,86,72,63,62,72,87,103,120,136,151,163,163,124,51,5,2,6,6,7,7,6,6,38,109,157,158,134,106,80,58,43,42,54,73,90,97,92,81,67,58,53,52,52,53,55, -61,69,73,74,75,71,69,70,75,88,107,120,127,127,119,108,99,92,89,86,88,93,98,109,122,123,119,114,106,100,110,124,134,138,131,113,94,82,82,94,108,119,122,121,119,120,123,127, -124,115,104,101,108,114,128,151,171,196,228,241,238,230,202,167,149,138,126,119,118,119,119,122,133,153,181,223,244,235,198,144,108,101,98,86,70,59,54,59,68,76,82,86,87,87,87,87, -85,83,74,60,54,54,50,36,19,7,1,0,0,0,0,0,0,2,14,36,61,81,89,85,73,59,49,43,41,41,41,42,47,54,57,58,56,50,44,42,44,55,73,85,90,86,70,49, -30,17,7,2,1,1,1,4,5,5,5,5,9,21,42,65,85,93,86,65,41,27,30,47,67,84,88,87,87,88,92,95,93,81,64,55,55,55,60,65,67,69,73,80,88,88,81,75, -76,83,93,99,102,101,98,96,97,97,96,95,94,95,99,105,116,108,98,92,90,91,93,94,95,98,102,110,126,143,151,129,70,17,0,0,2,2,1,2,12,58,123,158,151,126,99,74, -53,37,24,17,19,31,49,67,81,90,92,93,93,94,94,94,94,94,94,95,96,100,108,122,129,141,154,143,113,83,62,55,57,61,64,67,68,69,68,66,64,62,59,58,60,67,78,91, -109,127,143,151,141,117,87,67,60,65,72,73,73,73,76,88,103,112,105,81,59,51,51,54,65,87,125,164,186,211,233,239,238,233,222,212,213,218,221,227,236,244,245,228,187,157,135,124, -120,115,106,96,88,88,87,85,79,71,62,52,46,44,39,31,22,14,7,2,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,7,22,42,63,77,85,87,88,88,88,88,88, -88,86,85,85,85,86,94,107,112,122,134,120,83,42,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,27,46,69,94,116,126,115,87,53,30,23,31,41,44,44,44,48,61, -80,91,84,57,31,20,21,23,30,44,59,71,81,82,79,78,78,80,86,94,102,108,108,107,109,110,116,121,124,127,131,130,77,75,71,64,56,49,44,39,37,40,49,64,86,110,132,143, -127,88,48,26,17,16,24,43,80,126,152,149,131,105,81,60,43,29,20,14,8,5,6,10,20,31,40,46,48,48,48,48,42,37,35,35,38,45,61,83,90,97,112,120,110,86,62,49, -44,44,46,48,50,50,50,50,49,51,57,70,86,101,110,113,115,119,129,143,156,154,137,116,91,64,44,36,32,30,29,35,50,73,101,119,118,106,96,89,91,95,94,91,90,100,122,147, -162,177,200,213,216,214,212,205,191,169,146,121,99,96,95,92,87,81,76,68,55,46,37,29,19,12,6,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,7,18,28,37,42,44,44,44,44,38,32,29,28,28,35,51,78,95,109,125,128,113,85,59,44,38,36,31,22,13,1,0,0,0,0,10,28,49,68,81,86, -89,94,107,125,141,139,120,97,69,40,19,10,6,3,3,9,26,54,86,106,105,92,81,75,79,87,87,83,77,74,74,74,74,74,74,75,78,84,89,89,90,90,92,94,95,95,91,84, -18,18,17,14,10,9,9,10,14,20,30,43,60,79,101,121,137,142,135,123,114,115,123,136,148,149,137,119,97,77,58,43,30,20,14,9,6,4,2,0,0,0,1,2,2,3,3,3, -2,1,2,3,4,5,9,15,19,23,34,57,85,103,103,91,75,62,54,49,48,48,52,57,62,74,92,105,109,102,89,77,69,66,68,74,84,91,100,115,128,116,91,76,69,62,57,56, -60,73,96,128,142,130,105,89,80,67,51,39,31,27,26,28,30,35,46,55,58,58,57,52,42,33,28,26,27,27,25,21,19,18,18,15,9,6,3,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,17,105,132,136,156,171,177,182,190,200,206,204,199, -191,185,179,172,162,134,94,65,47,47,63,78,84,79,67,55,47,45,47,55,67,76,86,104,118,104,77,62,54,46,42,41,45,58,85,120,136,123,97,80,71,57,39,26,18,15,15,15, -15,15,15,15,17,22,27,27,27,27,27,27,27,26,23,19,44,50,55,59,59,60,62,63,62,60,58,61,69,76,82,88,97,110,121,128,132,134,133,129,119,106,92,77,62,48,36,25, -17,12,8,5,3,1,0,0,0,0,0,0,0,0,0,0,0,1,1,2,3,3,3,3,5,7,9,13,27,52,76,93,103,110,114,112,108,102,99,101,103,104,97,80,59,40,27,22, -19,17,17,18,19,20,26,42,71,88,90,91,93,95,97,99,99,97,95,89,78,58,39,27,21,15,10,8,8,10,8,7,5,4,2,0,0,0,0,0,0,0,1,6,13,24,34,38, -43,48,55,58,59,59,59,58,55,48,41,39,38,36,30,20,11,5,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,22,113,135,125,102,79,58,53,54,62,80,100,115,125,132,140,149,159,181,199,203,197,183,157,111,64,33,6,0,0,0,0,2,4,6,12,31,61,79,82,83,85,88,90,91, -91,89,87,82,69,50,28,16,9,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,6,13,24,34,39,131,134,138,140,140,140,141,142,140,137,134,132,131,128,119,106, -94,88,86,85,82,79,76,72,66,59,51,42,33,26,19,14,10,7,5,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,2,2,3,4,4,6,6,7,11,19,33, -53,81,111,137,151,143,122,109,101,88,68,49,33,21,13,11,9,8,7,6,7,7,6,6,10,18,27,37,51,69,86,95,94,87,77,67,56,46,30,16,11,12,15,14,10,6,6,5, -5,5,6,7,11,14,21,30,38,44,55,72,90,108,120,125,128,133,137,140,140,140,140,140,138,134,128,126,126,124,117,102,85,69,53,35,19,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,4,17,38,65,96,124,138,133,121,124,143,160,178,187,175,156,105,48, -17,0,0,0,0,0,0,0,2,11,20,30,45,64,81,90,88,81,71,61,51,39,23,8,3,5,8,7,2,0,0,0,0,0,1,3,7,12,19,29,36,43,55,71,89,108,121,127, -124,120,115,112,112,112,112,112,117,124,130,132,133,134,137,138,131,122,114,105,93,77,60,46,35,27,22,19,16,13,9,7,5,3,2,1,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,1,1,2,2,2,4,4,5,6,6,10,18,36,62,92,110,112,112,110,99,90,86,80,70,58,45,33,22,16,12,10,10,9,10,13,20,32,49,67,83,93,94, -94,95,98,103,110,116,108,89,77,80,87,81,61,44,41,41,44,48,57,68,79,90,103,116,125,130,138,145,147,144,136,132,129,125,117,112,112,112,112,112,116,123,128,130,131,135,143,151, -152,146,138,124,102,73,43,21,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,26,53,84,103,104,102,100,91,92,111,132,149,180,191,174,137,86,47,27,14,2,2,7,15,28,46,65,81,90,92,91,92,95,100,107,113,106,86,74,76,84,78,58,43,41,42, -44,49,58,69,80,91,103,116,124,129,136,142,144,141,133,127,44,33,26,23,24,25,25,25,29,36,48,63,78,91,107,126,139,142,141,140,139,132,118,98,74,48,26,12,6,3,3,2, -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,1,1,2,3,3,3,3,3,7,18,39,58,73,77,71,66,68,74,84,89,89, -87,79,72,65,60,59,59,64,70,78,85,89,85,72,59,55,65,85,108,128,145,156,160,157,154,154,156,154,142,129,125,125,127,131,136,141,144,144,144,138,131,126,117,102,86,68,52,44, -40,34,28,25,25,25,25,25,28,36,48,61,76,90,106,129,149,157,159,160,160,152,133,106,75,43,19,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,0,0,0,0,0,0,0,0,0,0,0,1,12,33,53,68,73,66,60,60,66,75,92,119,146,176,197,197,189,171,128,91,75,72,78,84,79,67,54,50, -60,81,105,125,141,153,156,156,155,158,163,166,164,160,161,162,163,167,171,175,178,179,179,177,174,171,163,150,125,97,74,60,106,64,28,9,0,0,0,0,3,20,47,73,88,92,95,98, -102,107,113,118,125,134,141,146,143,126,97,64,35,14,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,5,9,11,11,11,11,11,11,12,12,12,11,8,6, -5,3,3,3,1,2,4,9,12,10,9,10,15,24,36,47,60,71,77,83,85,85,84,83,78,71,61,47,34,28,34,55,89,122,143,151,151,145,138,130,121,120,128,134,134,131,132,132, -130,126,118,109,98,89,82,74,66,59,49,34,19,8,1,0,0,0,0,0,0,0,0,0,4,20,47,74,87,92,95,98,103,109,116,123,131,142,150,154,149,129,98,63,33,13,2,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,5,9,11,11,11,11,11,11,11,11,11,9,6,3,2,0,0,0,0,0,1,6,9,8,6,7,13,22,33,43, -54,70,89,113,133,162,196,206,195,157,112,80,67,60,64,80,108,136,155,163,167,168,172,184,195,203,210,221,232,239,242,241,241,240,239,238,236,234,232,229,227,226,223,216,198,175,159,140, -232,203,164,122,78,49,39,45,65,84,92,83,65,50,42,35,29,28,30,32,39,51,65,85,114,142,153,143,122,88,56,40,31,25,22,21,21,21,21,21,21,23,27,34,38,42,50,58, -62,64,69,78,82,82,82,82,82,82,82,83,83,79,71,64,60,53,48,51,47,32,14,3,0,0,0,0,0,0,0,0,5,11,16,23,27,28,28,26,23,23,26,32,47,73,104,131, -146,141,122,100,83,66,50,38,30,30,42,54,64,75,85,89,88,84,77,69,63,64,71,77,77,75,72,64,52,42,34,22,12,12,12,12,12,13,20,38,65,87,93,84,65,50,42,35, -29,28,28,31,38,51,65,86,116,144,154,144,122,88,57,40,31,25,22,21,21,21,21,21,21,23,27,34,38,42,50,58,62,64,69,78,82,82,82,82,82,82,82,82,82,79,70,63, -59,51,47,50,46,30,13,1,0,0,0,0,0,0,0,0,4,10,14,19,22,26,41,68,111,160,185,183,187,195,206,216,221,222,222,223,226,229,233,240,244,246,247,248,247,241,236,237, -237,236,236,235,234,235,237,238,238,238,238,240,244,246,245,242,233,247,250,241,220,198,182,170,153,118,69,27,6,0,0,0,0,0,0,0,0,0,12,35,68,108,145,158,160,156,143,130, -120,111,107,106,106,106,106,106,107,108,114,122,126,132,141,146,139,126,121,119,117,117,117,117,117,117,117,117,117,118,120,120,120,120,125,132,130,114,87,58,37,24,14,7,2,0,0,0, -0,0,0,0,1,5,15,30,49,71,93,113,131,144,145,131,103,66,36,18,9,3,0,1,11,27,45,60,76,86,89,90,90,89,88,87,87,88,85,78,74,74,76,82,87,88,88,82, -72,72,74,78,86,93,104,117,123,103,63,27,9,2,0,0,0,0,0,0,0,0,12,35,68,108,145,158,160,156,143,130,120,111,107,105,105,105,105,105,105,106,112,119,124,130,139,144, -137,123,118,116,114,114,115,114,115,115,116,116,116,117,119,119,119,120,126,135,132,116,89,60,39,26,16,9,4,2,1,1,1,1,0,0,1,4,12,25,45,78,122,150,162,171,175,177, -181,193,215,236,247,247,241,224,204,195,193,189,177,161,154,153,152,152,152,150,151,151,147,142,139,139,140,151,172,189,199,212,151,183,214,237,251,255,254,245,220,172,110,56,26,14,6,0, -0,0,0,0,10,31,56,75,87,94,99,101,105,117,129,134,137,140,141,141,141,141,141,141,141,141,138,134,131,133,136,130,105,76,61,52,47,46,46,46,45,44,42,41,41,46,54,60, -64,78,107,132,146,160,163,154,141,128,114,102,91,85,83,78,69,61,58,56,57,67,89,115,136,151,158,160,155,125,84,52,24,5,0,0,0,9,25,45,66,82,87,85,76,65,58,59, -62,63,63,63,61,52,36,22,19,20,27,40,57,68,77,90,98,104,115,129,143,142,130,107,74,36,9,0,0,0,0,0,0,0,0,1,11,32,57,76,88,94,100,101,106,117,129,133, -135,138,139,140,140,141,142,145,149,150,148,144,142,144,146,142,120,94,82,73,67,67,67,63,59,54,48,45,46,54,62,66,69,81,101,116,127,141,148,140,126,113,96,81,69,62,60,59, -60,60,60,59,60,69,90,115,134,146,153,158,165,168,181,200,218,233,239,231,206,179,156,129,113,111,110,100,85,69,61,62,65,67,67,66,63,55,40,28,24,26,32,47,69,85,99,119, -118,137,158,172,179,184,198,220,237,240,226,193,159,132,104,69,45,39,43,56,74,91,91,77,58,42,29,20,19,28,38,46,54,61,65,66,65,65,65,65,64,62,56,47,42,41,42,37, -21,6,1,0,0,0,0,0,0,6,18,28,36,37,40,62,95,119,161,183,187,197,208,218,222,224,226,225,224,223,223,221,213,201,183,168,163,160,157,147,133,122,125,133,128,100,70,49, -36,28,30,38,49,67,83,88,81,65,46,33,29,38,54,69,76,78,78,77,72,61,48,41,41,46,57,72,86,94,97,104,115,128,138,135,116,83,52,27,7,0,0,0,0,0,0,0, -2,12,29,49,73,90,90,76,57,40,26,17,18,28,42,57,76,96,114,129,134,138,148,164,179,184,181,178,175,175,175,173,165,157,155,153,152,152,151,144,134,115,90,76,74,81,85,78, -62,48,43,42,48,66,94,117,130,139,143,143,141,139,138,138,138,138,137,137,139,145,151,152,154,164,180,200,216,232,244,245,233,213,184,144,110,97,95,90,80,63,44,31,27,36,53,68, -75,77,77,76,71,60,47,40,40,45,55,70,85,92,96,102,119,131,137,128,105,84,83,105,144,188,226,243,245,241,232,212,194,187,182,176,168,156,140,117,93,87,87,83,79,78,77,78, -79,80,81,81,81,81,81,79,74,68,58,42,28,23,22,20,16,11,5,1,1,8,26,57,97,145,164,169,172,173,173,173,160,146,108,69,57,56,63,75,85,97,110,120,129,133,135,141, -156,174,196,206,210,211,200,173,137,98,67,59,71,81,89,91,89,85,85,87,88,82,65,45,27,15,16,31,56,80,89,84,78,75,75,77,81,87,89,88,87,88,86,85,88,92,96,103, -119,133,139,127,96,61,37,22,13,12,13,14,18,27,36,49,64,89,116,131,129,110,86,68,60,57,58,59,67,81,96,124,159,182,201,216,221,223,229,237,241,242,242,242,242,241,241,241, -241,241,242,242,242,242,243,242,241,235,226,222,222,222,220,213,197,174,149,127,109,89,74,72,81,94,104,112,119,123,125,126,126,127,131,141,155,171,179,182,194,213,230,242,248,240,219,189, -156,128,108,94,87,80,64,44,27,15,16,31,56,80,89,84,78,75,75,77,81,87,89,88,87,87,86,85,88,92,96,102,42,52,65,80,87,86,84,82,88,110,145,179,203,222,240,250, -254,254,251,246,241,237,237,232,223,225,228,228,224,222,219,219,218,216,216,216,215,214,215,215,210,207,199,181,163,157,157,155,153,142,131,129,142,166,186,196,184,144,113,88,69,60,57,40, -18,9,0,0,0,0,0,0,2,8,14,21,26,30,32,33,37,44,56,66,81,101,122,145,162,162,135,95,64,48,47,54,61,65,62,57,49,37,25,24,33,48,68,85,88,73,48,26, -17,15,15,16,22,32,41,44,44,40,32,23,20,21,24,29,42,52,65,80,88,88,86,80,75,73,72,75,83,101,118,130,141,153,158,155,146,144,155,167,179,194,204,210,215,224,229,238, -243,242,235,226,221,219,212,196,178,170,170,170,171,173,177,181,185,189,189,189,189,190,191,195,200,211,226,238,243,245,248,252,252,250,247,242,233,219,199,185,185,186,180,174,170,170,169,169, -169,172,182,198,216,231,238,242,243,235,221,203,174,131,91,71,65,64,61,55,48,37,25,24,33,48,68,85,88,73,48,26,17,15,15,16,22,32,41,44,44,40,32,23,20,21,24,29, -0,0,5,15,29,42,56,67,73,74,78,85,99,121,146,170,192,216,237,248,252,254,255,255,251,246,244,244,245,245,244,244,244,241,240,239,237,235,234,234,237,244,249,250,250,252,253,255, -255,253,252,253,253,246,229,203,177,151,134,117,91,69,59,55,53,53,53,53,47,42,41,46,53,56,57,57,57,57,57,60,66,71,71,72,82,87,83,85,96,106,109,102,87,68,54,54, -59,63,66,71,75,77,80,84,88,88,81,64,39,16,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,15,29,43,56,68,75,76,75,74,79,94,104,104, -98,96,93,94,127,194,233,244,249,252,253,252,249,245,240,229,210,188,166,144,130,121,109,92,77,72,71,72,79,94,110,122,129,132,133,133,133,133,134,135,139,146,160,170,167,165,180,205, -227,240,247,251,253,254,255,255,255,255,254,251,248,247,247,245,245,245,245,244,241,232,217,204,187,163,138,116,93,66,50,50,57,62,66,71,74,77,80,84,88,88,81,64,39,16,2,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,10,14,14,12,11,14,30,62,110,166,210,237,247,241,227,207,182,150,127,119,124,134,142,147,154, -161,166,168,171,171,171,171,171,174,182,191,202,212,214,211,209,209,217,228,239,245,248,248,247,243,235,223,208,194,183,169,149,129,113,101,95,91,87,84,84,83,82,82,82,82,82,82,81, -78,74,73,74,77,72,61,57,57,62,68,72,79,83,88,99,106,106,112,124,136,145,142,123,93,60,32,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,4,10,14,15,15,14,15,20,23,20,15,14,12,21,109,224,235,218,200,177,158,149,146,140,138,133,128,124,121,120,119,116,114,112,112,112,112,112,115,118,114,105, -95,88,86,86,86,86,86,86,86,87,93,97,92,90,95,110,130,150,169,186,199,211,220,226,229,233,242,250,253,254,254,252,248,242,235,224,206,175,136,105,84,74,72,74,80,84,90,101, -107,107,113,125,137,145,142,124,93,60,32,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,6,26,63,113,166,211, -237,240,225,189,140,96,64,39,20,10,6,8,12,17,21,29,40,48,56,66,76,83,87,89,89,90,93,99,99,89,73,63,61,69,86,112,136,157,175,191,209,226,236,240,241,241,238,227, -213,193,171,158,143,119,99,82,66,57,54,54,52,51,52,51,46,41,41,40,39,36,32,30,31,33,36,41,49,56,61,62,59,54,57,66,77,90,101,103,92,73,53,36,17,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,3,55,125,115,80,57,37,22,17,16,17,19,26, -34,43,51,62,73,81,85,86,88,88,88,87,82,66,46,31,21,15,14,14,14,14,14,14,14,14,16,19,21,25,26,27,28,32,38,48,61,73,81,86,88,95,117,149,177,195,210,227, -238,241,241,238,230,212,184,151,115,84,59,41,34,37,45,57,60,57,60,69,82,95,103,104,95,76,56,37,19,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,1,3,6,10,16,25,48,90,149,199,231,245,239,209,159,106,56,21,5,0,0,0,0,0,0,0,0,0,0,0,0,0,3,6,10,12,12,13,13,13,12,10,5,0,0, -0,0,2,7,15,26,37,53,84,124,161,196,217,229,240,246,248,247,244,242,236,225,212,200,186,171,166,161,150,147,148,148,146,147,147,147,147,147,147,147,148,147,146,154,167,168,157,132, -114,111,111,114,107,74,49,56,87,122,146,154,140,115,82,54,34,17,6,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,4,4,4,4,4,4,2,0,0,0,0, -0,0,0,0,7,16,12,2,0,0,0,0,0,0,0,0,0,0,1,3,7,11,13,13,14,14,14,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,5,18,35,51,71,105,144,173,191,204,219,234,242,240,229,211,181,146,104,62,32,16,9,5,3,4,8,15,25,42,64,87,109,119,98,56,18,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -}; - - -unsigned char linesmap[TEXSIZE * TEXSIZE] = { -93,102,35,124,79,0,74,178,178,69,24,168,206,164,100,25,8,34,71,85,11,0,94,248,249,232,251,235,50,0,0,0,0,90,169,68,154,248,248,115,12,0,3,36,19,0,0,0, -0,0,0,0,16,38,5,0,0,10,79,102,76,26,45,79,48,138,179,138,18,0,0,0,0,18,198,248,216,95,22,0,13,37,37,13,0,0,5,123,124,6,60,79,8,0,0,0, -0,3,64,209,248,203,26,39,12,88,149,55,19,0,0,0,3,70,71,43,23,38,5,81,243,248,248,249,251,190,30,25,93,102,35,124,79,0,74,178,178,69,24,168,206,164,116,224, -248,249,250,250,135,0,0,0,52,164,120,65,207,248,149,0,0,90,169,68,2,0,8,39,12,0,3,36,19,0,0,0,0,0,0,0,84,249,248,90,0,10,79,102,76,26,45,79, -48,138,179,138,18,18,198,248,198,18,0,8,79,83,22,0,13,37,37,13,0,0,5,123,124,6,60,79,8,0,0,0,0,3,50,50,2,0,8,39,12,88,149,55,19,0,0,0, -3,70,71,43,93,61,5,0,0,0,0,27,179,160,30,25,25,47,2,3,6,73,178,178,74,0,10,48,175,209,162,27,3,42,39,54,82,13,0,127,252,251,241,50,0,0,0,0, -1,47,121,149,22,94,248,249,155,14,33,19,0,0,0,0,0,0,0,0,0,16,39,3,9,79,102,76,27,32,0,16,84,54,138,179,138,18,0,0,0,0,26,216,250,199,46,22, -3,43,43,4,0,5,123,124,6,0,0,60,78,8,0,0,1,62,209,248,203,18,0,8,37,14,110,156,22,0,0,3,70,71,5,110,124,21,108,243,248,248,249,250,147,132,123,5, -25,47,2,3,6,73,178,178,74,0,10,48,175,209,162,51,221,249,249,250,250,133,0,52,164,120,65,207,248,194,18,0,1,47,121,149,22,0,0,34,100,14,33,19,0,0,0,0, -0,0,0,0,0,104,249,248,96,79,102,76,27,32,0,16,84,54,138,179,138,18,18,198,248,198,26,82,70,6,30,22,3,43,43,4,0,5,123,124,6,0,0,60,78,8,0,0, -1,47,50,2,0,0,0,8,37,14,110,156,22,0,0,3,70,71,5,156,249,224,62,6,0,0,22,145,97,132,123,5,5,0,0,0,72,178,178,74,0,10,33,39,95,173,202,155, -57,9,10,33,55,82,64,220,251,249,248,90,11,3,0,0,1,22,4,88,148,19,106,252,250,128,26,0,37,19,0,0,0,0,0,0,0,0,12,40,79,102,76,27,32,3,0,0, -20,89,56,138,179,138,18,0,0,9,82,84,199,248,198,49,49,9,12,38,11,123,124,6,0,0,0,0,66,79,8,0,19,203,248,203,18,0,0,0,8,58,26,86,141,16,3,70, -71,3,0,7,122,165,244,249,248,249,250,149,36,7,122,122,5,0,0,0,72,178,178,74,0,10,33,39,95,173,202,155,85,222,248,249,250,250,151,163,120,65,207,248,196,21,0,0, -1,22,4,88,148,19,19,149,93,58,26,0,37,19,0,0,0,0,0,0,0,0,101,249,250,156,76,27,32,3,0,0,20,89,56,138,179,138,18,18,198,248,216,84,3,0,0,33, -49,9,12,38,11,123,124,6,0,0,0,0,66,79,8,0,1,22,4,0,0,0,0,0,8,58,26,86,141,16,3,70,71,3,81,243,252,252,224,61,6,22,148,100,36,7,122,122, -149,13,0,74,178,178,74,0,10,34,40,88,28,22,167,207,158,31,0,13,33,97,230,251,235,122,248,248,101,36,3,0,0,0,0,0,83,140,140,147,249,249,112,62,156,39,0,0, -0,0,0,0,0,0,8,82,102,77,26,32,3,0,0,8,44,29,87,56,138,179,138,18,9,82,71,2,18,198,248,206,54,21,0,19,143,127,6,0,0,0,0,0,12,84,77,24, -198,248,203,18,0,0,0,3,34,23,34,12,76,137,86,71,3,0,0,0,85,249,252,248,250,250,149,36,3,0,5,128,149,13,0,74,178,178,74,0,10,34,40,88,28,22,167,207, -158,67,221,248,249,250,253,178,62,207,248,194,34,36,3,0,0,0,0,0,83,140,140,84,34,23,34,62,156,39,0,0,0,0,0,0,0,0,8,149,251,250,107,32,3,0,0,8, -44,29,87,56,138,179,138,18,26,216,250,198,18,0,6,34,39,21,0,19,143,127,6,0,0,0,0,0,12,84,77,7,0,0,0,0,0,0,0,3,34,23,34,12,76,137,86,71, -3,81,243,248,248,252,249,88,55,150,99,36,3,0,5,128,141,113,76,178,178,74,0,10,34,40,88,28,0,6,50,168,203,156,33,0,64,226,251,239,50,0,94,248,248,102,36,3, -0,0,0,0,18,168,169,52,106,248,249,203,64,0,0,0,0,0,0,0,0,12,79,102,79,48,32,2,0,0,10,57,33,0,19,88,56,138,179,142,94,71,2,0,0,24,206,248, -198,49,28,123,131,43,6,0,0,0,0,0,0,14,95,216,248,203,18,0,0,0,3,36,19,0,8,36,16,130,177,25,0,0,0,81,243,248,252,252,249,160,36,2,0,0,10,66, -141,113,76,178,178,74,0,10,34,40,88,28,0,6,50,168,203,156,69,226,249,252,251,250,227,248,194,18,0,19,36,3,0,0,0,0,18,168,169,52,19,0,58,174,64,0,0,0, -0,0,0,0,0,12,79,102,147,249,245,91,0,0,10,57,33,0,19,88,56,138,179,142,94,84,198,248,198,24,38,13,0,33,28,123,131,43,6,0,0,0,0,0,0,14,83,79, -14,0,0,0,0,0,3,36,19,0,8,36,16,130,177,25,81,243,248,248,248,243,160,121,140,117,36,2,0,0,10,66,0,142,179,178,74,0,10,33,40,88,28,0,6,38,13,21, -165,204,150,79,219,251,234,85,82,13,0,94,248,248,102,36,3,0,0,22,147,83,105,154,19,124,252,249,115,13,0,0,0,0,0,3,8,73,102,76,26,38,36,6,0,10,62,36, -0,0,0,20,88,54,142,203,170,20,0,0,6,38,31,198,248,199,148,136,6,14,35,6,0,0,0,0,0,18,201,250,220,29,0,0,0,3,36,19,0,0,0,8,88,74,89,148, -22,0,81,243,248,248,249,251,189,41,36,6,0,10,62,37,0,142,179,178,74,0,10,33,40,88,28,0,6,38,13,21,165,204,150,104,245,251,250,250,250,220,18,0,0,0,19,36, -3,0,0,22,147,83,105,154,19,48,159,59,38,13,0,0,0,0,0,3,8,73,102,76,26,122,249,243,90,10,62,36,0,0,0,20,88,54,142,203,170,20,18,198,248,206,31,0, -0,6,140,136,6,14,35,6,0,0,0,0,0,0,14,83,85,12,0,0,0,3,36,19,0,0,0,8,88,74,89,182,244,248,248,248,243,81,27,179,158,41,36,6,0,10,62,37, -72,170,178,74,0,10,33,40,88,28,0,6,38,14,0,0,20,159,204,234,251,231,49,32,55,82,13,0,94,248,248,102,36,3,22,148,90,36,19,81,152,149,125,248,248,114,13,0, -0,0,0,6,35,46,69,28,32,1,13,34,16,60,37,0,0,0,0,0,17,82,99,168,180,138,18,6,38,14,0,18,199,252,226,53,24,0,13,38,6,0,0,0,18,198,248,206, -90,84,12,0,3,36,19,0,0,0,3,68,71,36,12,88,148,96,243,248,249,249,250,147,132,121,17,34,16,60,37,0,72,170,178,74,0,10,33,40,88,28,0,6,38,14,0,0, -20,159,203,194,149,235,248,249,250,250,112,0,0,0,0,19,36,3,22,148,90,36,19,81,152,149,48,0,2,38,13,0,0,0,0,6,35,46,69,28,32,1,107,249,244,129,37,0, -0,0,0,0,17,82,99,168,180,138,18,24,206,248,198,18,5,123,124,38,24,0,13,38,6,0,0,0,0,0,0,13,78,84,12,0,3,36,19,0,0,0,3,68,71,36,89,247, -252,249,248,243,106,31,145,97,132,121,17,34,16,60,37,0,178,178,74,0,10,33,40,88,28,0,6,38,14,0,0,0,0,70,235,254,245,66,0,13,33,55,82,13,0,94,248,248, -102,55,149,89,36,19,0,46,174,152,16,98,249,248,113,14,0,0,0,0,10,33,24,30,3,0,0,20,82,41,0,0,0,0,0,0,6,82,102,56,138,179,141,53,14,0,0,5, -132,226,248,198,48,24,0,14,38,6,0,18,198,248,203,18,13,78,84,16,32,19,0,0,0,3,70,71,2,5,38,13,141,250,249,248,249,251,152,33,7,122,122,25,73,38,0,74, -178,178,74,0,10,33,63,100,28,0,6,38,14,0,0,0,0,66,195,209,172,219,248,248,249,250,250,107,0,0,0,0,19,55,149,89,36,19,0,46,174,152,16,7,44,10,36,14, -0,0,0,0,10,33,24,30,3,0,0,111,250,245,90,0,0,0,0,0,6,82,102,56,138,179,141,53,31,198,248,199,132,124,6,1,33,24,0,14,38,6,0,0,0,0,0,0, -13,78,84,16,32,19,0,0,0,3,70,71,2,84,245,248,250,252,244,81,32,162,104,33,7,122,122,25,73,38,0,74,178,74,0,10,33,40,88,28,0,6,38,14,0,0,0,0, -56,223,252,243,211,156,24,0,13,33,54,80,28,0,94,248,249,191,110,34,18,0,53,157,48,81,148,26,138,250,248,113,14,0,0,0,0,28,56,10,0,0,10,59,109,140,11,0, -0,0,0,9,82,66,24,86,56,140,190,144,18,0,6,122,124,23,198,248,198,47,12,0,14,38,23,198,249,203,18,1,63,133,86,96,27,0,0,0,3,70,71,3,0,0,7,107, -244,250,252,250,251,156,56,10,0,5,127,153,46,32,78,178,178,74,0,10,33,63,233,204,18,6,38,14,0,0,0,0,52,157,124,176,245,252,211,231,248,249,250,250,112,0,0,0, -24,155,110,34,18,0,53,157,48,81,148,26,70,68,6,36,14,0,0,0,0,28,56,10,0,0,10,59,166,252,243,90,0,0,0,9,82,66,24,86,56,140,190,144,18,18,199,252, -225,23,0,0,1,32,12,0,14,38,5,0,22,2,0,1,63,133,86,96,27,0,0,0,3,70,71,3,81,243,248,249,248,247,177,83,170,110,56,10,0,5,127,153,46,32,78,178, -74,0,10,33,40,88,28,0,6,38,14,0,0,0,0,56,226,251,228,57,163,204,144,17,0,12,30,74,99,16,0,102,252,250,119,45,1,0,55,52,0,0,88,148,25,138,250,248, -113,14,0,0,24,30,11,38,8,9,62,37,11,129,142,11,0,0,9,82,71,3,0,17,86,78,142,179,137,30,117,124,13,0,18,198,248,198,20,0,0,31,205,249,214,22,0,4, -131,179,153,90,82,12,0,3,70,71,3,0,0,0,81,243,249,248,252,253,190,44,9,38,8,9,66,140,112,86,190,180,74,0,10,33,40,100,204,248,199,53,14,0,0,0,0,52, -167,118,64,211,252,243,152,67,230,248,249,250,251,100,0,13,141,89,45,45,1,0,55,52,0,0,88,148,25,70,68,6,36,14,0,0,24,30,11,38,8,9,62,37,11,180,252,243, -86,0,9,82,71,3,0,17,86,78,142,179,137,30,126,225,248,198,18,0,0,0,2,0,0,14,32,44,53,4,0,4,131,179,153,90,82,12,0,3,70,71,3,81,243,248,248,248, -245,88,120,209,159,44,9,38,8,9,66,140,112,86,190,180,4,8,33,40,88,28,0,6,38,14,0,0,0,0,56,228,251,229,36,0,19,163,204,144,17,0,48,63,56,82,13,7, -124,249,248,100,36,3,0,0,0,0,0,88,148,24,138,250,248,113,12,21,33,1,0,8,38,61,35,0,0,5,129,141,6,8,82,71,2,0,0,3,46,90,56,136,179,169,118,16, -61,16,0,18,198,248,198,18,18,198,249,217,27,0,0,0,24,156,183,137,87,82,18,66,70,3,0,0,0,81,243,248,248,251,251,203,160,22,0,8,38,61,35,0,142,179,175,99, -4,8,33,40,88,28,18,199,249,201,18,0,0,0,52,167,134,72,207,248,198,170,204,144,67,239,249,250,250,250,98,7,47,36,16,16,36,3,0,0,0,0,0,88,148,24,70,68, -6,36,12,21,33,1,0,8,38,61,35,0,0,5,180,252,243,92,82,71,2,0,0,3,46,90,56,136,179,169,118,33,212,248,198,18,0,0,0,0,0,0,49,69,10,0,0,0, -24,156,183,137,87,82,18,66,70,3,81,243,248,248,248,243,83,80,182,179,160,22,0,8,38,61,35,0,142,179,175,99,40,34,39,88,28,0,6,38,14,0,0,0,0,56,227,251, -230,84,14,1,47,36,162,204,145,56,53,16,31,55,81,17,32,106,248,248,102,36,3,0,0,0,0,0,98,150,24,138,250,248,120,39,0,0,0,8,61,56,7,0,0,0,5,127, -140,83,70,2,0,0,6,38,10,16,88,62,171,179,134,15,30,64,14,1,62,203,248,202,202,249,214,34,35,6,0,3,36,38,142,179,136,82,100,68,0,0,0,0,81,243,248,248, -250,252,187,58,87,148,22,8,61,56,7,72,170,179,142,12,40,34,39,88,28,0,6,53,201,248,203,18,0,52,164,118,78,218,248,194,62,36,162,204,145,98,242,248,249,250,247,97, -32,19,0,0,19,36,3,0,0,0,0,0,98,150,24,70,68,6,47,39,0,0,0,8,61,56,7,0,0,0,5,179,252,247,132,2,0,0,6,38,10,16,88,62,171,179,134,15, -46,212,248,171,48,22,0,0,0,45,53,17,35,6,0,3,36,38,142,179,136,82,100,68,0,81,243,248,248,248,243,81,59,190,154,58,87,148,22,8,61,56,7,72,170,179,142,12, -43,58,86,27,0,6,38,14,0,0,0,0,59,227,251,228,31,27,58,53,47,4,18,162,208,168,19,0,13,32,55,95,28,0,94,248,248,102,36,3,0,0,0,0,0,89,148,24, -136,250,249,111,15,0,10,62,35,9,38,10,0,0,0,10,163,167,12,0,0,6,38,14,0,0,22,165,141,135,179,138,18,28,58,53,46,23,202,248,249,216,21,0,14,36,9,34, -19,0,20,145,179,163,101,79,11,0,0,81,243,248,248,250,252,187,54,31,14,88,152,79,35,9,101,181,178,76,112,125,43,58,86,27,0,6,38,14,18,198,248,203,66,164,120,64, -207,249,208,68,47,4,18,162,208,168,73,239,248,249,250,247,100,0,0,0,0,19,36,3,0,0,0,0,0,89,148,24,67,76,30,32,15,0,10,62,35,9,38,10,0,0,0,10, -200,253,243,86,0,6,38,14,0,0,22,165,141,135,179,138,18,44,190,75,46,6,0,0,46,55,4,0,14,36,9,34,19,0,20,145,179,163,101,79,88,243,248,248,248,243,81,60, -190,155,54,31,14,88,152,79,35,9,101,181,178,76,112,125,142,93,53,1,5,38,14,0,0,0,0,59,227,251,228,31,0,1,59,76,17,0,1,57,178,170,22,0,0,13,52,62, -79,13,0,94,248,248,102,36,3,0,0,0,0,0,88,148,42,147,250,248,103,11,62,37,0,0,10,39,10,0,9,75,65,130,140,10,5,38,14,0,0,5,122,131,88,57,138,179, -138,19,59,76,17,18,202,249,250,203,26,22,0,14,58,21,0,0,0,24,177,199,135,84,85,12,81,243,248,248,250,252,187,52,0,6,22,11,128,163,23,69,181,190,81,0,14,139, -142,93,53,1,5,38,14,0,0,18,194,249,236,130,65,207,248,194,73,76,17,0,1,57,178,170,22,63,239,248,250,250,247,86,0,0,0,0,19,36,3,0,0,0,0,0,88,148, -42,84,66,7,20,11,62,37,0,0,10,39,10,0,9,75,65,181,252,243,89,38,14,0,0,5,122,131,88,57,138,179,138,19,59,76,17,0,1,46,54,5,9,22,0,14,58,21, -0,0,0,24,177,199,135,138,247,248,248,248,243,81,62,190,155,52,0,6,22,11,128,163,23,69,181,190,81,0,14,139,168,136,13,36,36,11,0,0,0,0,59,229,251,228,27,0, -3,50,44,28,59,16,39,51,19,55,84,12,0,31,28,29,54,82,13,0,94,248,248,102,34,3,0,0,0,0,0,102,160,28,138,250,248,127,36,0,0,0,0,10,33,16,79,68, -1,5,129,141,41,11,0,0,5,122,122,5,17,87,60,138,180,161,58,28,73,202,249,216,203,248,203,99,31,24,28,32,6,0,3,70,87,149,179,130,82,138,243,248,248,249,251,187, -52,0,0,0,7,59,36,81,156,173,175,81,35,16,29,44,168,136,13,36,36,11,0,0,0,0,66,233,251,217,210,248,195,64,44,28,59,16,39,51,19,55,84,12,68,241,249,249, -250,247,82,0,0,0,0,19,34,3,0,0,0,0,0,102,160,28,69,66,12,57,36,0,0,0,0,10,33,16,79,68,1,5,182,252,245,89,0,0,5,122,122,5,17,87,60,138, -180,161,58,28,59,16,39,52,4,0,22,87,31,24,28,32,6,0,3,70,87,149,203,249,250,250,248,243,81,52,186,155,52,0,0,0,7,59,36,81,156,173,175,81,35,16,29,44, -32,122,125,46,38,20,23,0,0,59,229,251,225,27,0,4,52,46,1,0,26,73,49,1,0,0,50,82,40,14,0,12,32,55,82,13,0,94,248,248,101,35,3,0,0,0,24,31, -88,148,23,138,250,249,90,0,0,0,0,0,14,93,73,1,0,0,11,144,142,25,23,5,122,122,5,0,0,17,85,60,159,193,138,34,204,250,213,19,18,198,248,205,112,42,0,13, -34,11,68,70,3,25,150,179,168,247,250,248,249,248,169,52,0,0,0,10,60,34,0,69,179,179,86,0,16,52,43,86,32,122,125,46,38,20,23,0,0,52,164,130,209,248,248,199, -66,46,1,0,26,73,49,1,0,0,50,82,40,82,239,248,249,228,107,13,0,0,0,0,18,35,3,0,0,0,24,31,88,148,23,70,94,33,0,0,0,0,0,0,14,93,73,1, -0,0,11,190,252,244,97,5,122,122,5,0,0,17,85,60,159,193,138,18,26,73,49,1,0,0,0,30,101,42,0,13,34,11,68,70,3,99,250,253,252,250,247,89,40,105,128,52, -0,0,0,10,60,34,0,69,179,179,86,0,16,52,43,86,0,5,129,127,30,58,8,0,59,230,251,225,27,0,4,53,48,2,0,2,44,59,55,15,0,0,0,70,89,11,0,0, -13,33,55,82,13,0,94,248,248,102,36,3,0,24,33,1,0,88,152,74,146,250,248,90,0,0,0,9,80,73,35,8,0,0,14,14,135,150,26,119,122,5,0,0,0,0,20,102, -85,138,184,229,250,215,69,15,0,18,199,249,208,98,30,0,14,88,70,2,0,0,26,184,251,252,250,250,248,151,52,0,0,0,10,62,37,0,74,178,173,123,135,31,31,44,100,34, -0,5,129,127,30,58,8,0,52,164,120,65,210,248,248,219,62,2,0,2,44,59,55,15,0,0,0,70,89,11,72,243,223,60,55,82,13,0,0,0,0,19,36,3,0,24,33,1, -0,88,152,74,82,66,2,0,0,0,0,9,80,73,35,8,0,0,14,14,186,253,244,162,122,5,0,0,0,0,20,102,85,138,179,139,59,59,55,15,0,0,3,30,44,86,30,0, -14,88,70,2,81,243,249,252,253,249,134,89,98,102,52,0,0,0,10,62,37,0,74,178,173,123,135,31,31,44,100,34,10,0,5,131,139,20,36,61,230,251,225,27,0,4,54,47, -1,0,2,49,51,3,25,64,16,1,35,15,48,84,13,0,0,13,33,55,82,13,0,94,248,248,102,31,24,32,1,0,0,10,129,163,25,138,250,248,90,0,9,82,71,1,8,37, -7,0,0,17,35,123,178,118,3,0,0,0,0,4,49,53,82,72,229,253,236,36,25,64,16,1,52,202,248,205,99,29,62,73,35,5,0,0,81,244,252,253,252,248,151,58,0,0, -0,10,62,37,0,74,178,178,72,0,93,162,58,86,35,32,10,0,5,131,139,20,36,54,163,120,65,207,248,198,209,249,207,18,2,49,51,3,25,64,16,1,35,15,48,84,13,68, -27,13,33,55,82,13,0,0,0,0,18,31,24,32,1,0,0,10,129,163,25,69,70,3,0,0,9,82,71,1,8,37,7,0,0,17,35,180,252,249,83,0,0,0,0,4,49,53, -82,58,138,193,162,21,25,64,16,1,36,19,0,30,87,29,62,73,35,84,243,248,248,249,250,203,144,106,102,58,0,0,0,10,62,37,0,74,178,178,72,0,93,162,58,86,35,32, -39,8,17,41,124,113,68,233,251,220,27,0,5,54,46,1,0,4,49,51,3,0,0,26,61,42,15,0,0,50,85,17,0,0,13,33,55,82,13,0,94,248,248,112,53,1,0,0, -10,62,37,88,148,23,138,250,248,95,82,71,2,0,0,7,37,8,17,36,6,115,170,136,9,0,0,0,5,54,46,0,32,216,251,235,185,138,18,26,61,42,15,18,198,248,206,113, -75,0,12,38,6,81,243,248,249,252,253,198,90,78,12,0,10,62,37,0,74,178,178,74,0,10,33,114,185,47,0,10,39,8,17,41,124,113,61,172,119,63,207,248,195,68,58,194, -248,208,67,51,3,0,0,26,61,42,15,0,0,50,85,17,0,0,13,33,55,82,13,0,0,0,0,33,53,1,0,0,10,62,37,88,148,23,70,70,0,8,82,71,2,0,0,7, -37,8,17,36,6,115,206,252,243,81,0,0,5,54,46,0,15,83,86,159,180,138,18,26,61,42,15,0,0,0,38,102,75,0,89,245,248,248,248,243,101,172,209,171,90,78,12,0, -10,62,37,0,74,178,178,74,0,10,33,114,185,47,0,10,8,46,38,2,0,138,237,251,224,29,0,5,54,46,0,0,0,43,51,3,0,0,0,0,48,66,15,0,0,0,50,42, -0,0,0,13,33,55,82,13,0,94,248,250,135,36,32,30,62,37,0,0,112,157,22,136,250,250,135,2,0,0,0,0,7,46,38,7,122,119,18,127,142,11,0,5,54,46,0,18, -198,249,224,74,138,179,138,18,48,66,15,0,18,201,250,212,94,29,0,14,107,243,248,248,249,248,215,194,117,77,82,23,58,37,0,74,189,185,74,0,10,33,40,88,106,148,22,0, -8,46,38,2,0,134,182,122,84,207,248,195,66,46,0,14,194,249,217,24,0,0,0,0,48,66,15,0,0,0,50,42,0,0,0,13,33,55,82,13,0,0,21,82,70,36,32,30, -62,37,0,0,112,157,22,67,67,77,69,2,0,0,0,0,7,46,38,7,122,119,18,180,252,243,81,5,54,46,0,0,0,48,102,61,138,179,138,18,48,66,15,0,0,13,78,65, -81,101,243,248,249,248,243,81,42,120,196,194,117,77,82,23,58,37,0,74,189,185,74,0,10,33,40,88,106,148,22,0,17,38,36,10,57,229,253,233,41,34,12,54,45,0,0,0, -0,14,3,0,0,0,3,36,15,24,64,18,0,0,0,0,0,0,0,0,13,33,55,82,12,19,147,251,250,108,96,174,55,0,0,0,24,130,155,31,158,251,248,90,0,0,0,0, -16,38,40,127,122,5,0,5,129,140,16,54,45,0,18,198,248,205,38,85,62,138,180,154,32,24,64,14,11,96,209,248,204,102,30,81,244,249,248,249,248,151,80,158,168,109,77,102, -42,0,74,178,185,120,20,8,33,40,88,28,0,88,148,22,17,38,36,10,50,149,173,148,210,249,197,65,45,0,0,0,14,197,248,207,22,0,3,36,15,24,64,18,0,0,0,0, -0,0,0,0,13,33,55,82,12,19,84,102,89,28,96,174,55,0,0,0,24,130,155,31,102,98,5,0,0,0,0,0,16,38,40,127,122,5,0,5,185,252,243,115,45,0,0,0, -0,10,21,85,62,138,180,154,32,24,64,14,11,84,50,0,101,247,249,248,248,245,84,41,101,102,80,158,168,109,77,102,42,0,74,178,185,120,20,8,33,40,88,28,0,88,148,22, -55,1,9,86,234,251,217,137,122,21,69,44,0,0,0,0,0,0,0,31,3,1,34,19,0,0,27,64,18,0,0,0,0,0,0,0,0,13,33,53,82,84,102,152,248,248,132,124, -148,22,0,0,0,19,127,182,80,135,250,248,90,0,0,15,34,6,126,140,9,0,0,0,5,130,158,49,0,18,198,248,203,18,0,16,85,62,150,184,138,18,23,64,85,48,18,198, -248,205,150,244,248,248,250,248,151,52,0,36,150,170,142,84,80,82,178,178,74,20,63,43,39,88,28,0,0,0,88,156,55,1,9,76,164,118,66,230,252,199,79,44,0,0,0,0, -0,14,194,249,207,23,34,19,0,0,27,64,18,0,0,0,0,0,0,0,0,13,33,53,82,84,102,92,21,7,64,124,148,22,0,0,0,19,127,182,80,64,68,3,0,0,0,15, -34,6,126,140,9,0,0,0,5,186,253,245,77,0,0,0,0,0,0,16,85,62,150,184,138,18,23,64,85,48,0,81,243,249,250,249,243,88,63,100,102,52,0,36,150,170,142,84, -80,82,178,178,74,20,63,43,39,88,28,0,0,0,88,156,149,19,59,233,251,217,22,5,126,150,53,32,6,0,0,0,0,0,47,102,63,31,16,0,0,0,0,26,63,18,0,0, -0,0,0,0,0,0,9,43,93,102,90,17,98,250,249,100,111,149,22,0,0,6,84,151,156,22,138,250,248,90,20,35,6,122,122,8,2,0,0,0,8,57,148,139,28,198,248,203, -18,0,0,0,16,98,71,138,179,143,27,89,86,14,0,18,198,248,247,250,249,249,248,151,54,0,0,0,42,177,189,108,128,204,182,74,0,7,43,73,90,25,0,0,0,0,20,112, -149,19,48,164,121,64,207,248,224,155,53,32,6,0,0,0,0,0,55,218,250,213,37,0,0,0,0,26,63,18,0,0,0,0,0,0,0,0,9,43,93,102,90,17,6,62,34,15, -111,149,22,0,0,6,84,151,156,22,70,70,3,0,20,35,6,122,122,8,2,0,0,0,8,57,195,252,243,77,0,0,0,0,0,0,16,98,71,138,179,143,27,89,86,14,81,243, -248,248,249,247,99,37,101,102,54,0,0,0,42,177,189,108,128,204,182,74,0,7,43,73,90,25,0,0,0,0,20,112,81,157,230,251,217,22,0,0,42,145,122,18,38,6,0,0, -0,0,27,92,102,70,0,0,0,0,0,0,26,62,18,0,0,0,0,0,0,0,19,85,102,96,78,20,58,117,248,248,102,112,149,22,9,82,67,22,128,156,22,138,250,248,102,8, -122,122,5,0,0,0,0,0,38,45,5,138,229,248,203,18,0,0,0,3,31,30,82,63,143,137,92,47,22,63,18,0,93,246,248,249,250,248,150,58,30,6,0,10,62,69,155,179, -183,196,132,10,6,33,39,90,72,17,0,0,0,1,21,3,81,152,153,115,64,207,248,194,54,145,122,18,38,6,0,0,0,0,27,98,218,250,207,27,0,0,0,0,26,62,18,0, -0,0,0,0,0,0,19,85,102,96,78,20,58,37,0,0,19,112,149,22,9,82,67,22,128,156,22,69,70,3,19,8,122,122,5,0,0,0,0,0,38,45,5,185,252,243,77,0, -0,0,0,3,31,30,82,63,143,137,92,47,22,124,244,248,248,248,243,99,92,100,102,58,30,6,0,10,62,69,155,179,183,196,132,10,6,33,39,90,72,17,0,0,0,1,21,3, -62,236,253,219,18,0,0,0,4,5,122,122,19,38,6,0,0,0,0,48,94,102,62,2,0,0,0,11,71,62,62,18,0,0,0,0,0,22,86,102,91,44,56,102,43,0,94,248, -248,102,109,153,96,71,2,0,22,130,156,22,138,250,248,169,122,5,0,0,0,0,0,0,4,0,18,199,252,232,29,0,0,0,3,36,19,0,15,81,65,82,50,0,0,26,64,93, -243,248,248,249,248,151,66,0,13,34,16,60,37,0,98,179,179,137,76,84,40,39,87,25,18,64,22,0,0,0,0,0,47,178,186,77,207,248,194,14,4,5,122,122,19,38,6,0, -0,0,0,48,100,218,250,207,27,0,0,11,71,62,62,18,0,0,0,0,0,22,86,102,91,44,56,102,43,0,0,0,0,19,109,153,96,71,2,0,22,130,156,22,69,70,5,122, -122,5,0,0,0,0,0,0,4,0,0,5,185,252,243,77,0,0,3,36,19,0,15,81,65,82,50,0,81,244,250,248,248,243,81,39,100,102,66,0,13,34,16,60,37,0,98,179, -179,137,76,84,40,39,87,25,18,64,22,0,0,0,0,0,232,251,227,156,22,0,0,0,0,0,5,122,122,19,38,6,0,3,36,14,22,92,102,63,2,0,11,80,102,71,26,64, -19,0,0,0,22,86,102,90,16,16,66,70,78,13,0,94,248,248,104,148,177,24,0,0,0,22,130,156,20,139,253,252,94,0,0,0,0,0,0,0,0,18,198,248,204,139,142,11, -0,3,36,19,0,0,0,26,102,75,0,0,0,0,99,246,248,248,249,248,151,66,80,29,0,20,73,38,0,70,173,174,168,179,111,83,88,82,25,0,0,22,64,22,0,0,0,52, -162,116,126,235,249,194,14,0,0,0,5,122,122,19,38,6,0,3,36,14,22,98,216,250,207,27,11,80,102,71,26,64,19,0,0,0,22,86,102,90,16,16,66,70,78,13,0,0, -0,0,22,148,177,24,0,0,0,22,130,156,20,70,158,124,5,0,0,0,0,0,0,0,0,0,0,0,5,185,252,243,72,3,36,19,0,0,0,26,102,75,0,81,243,248,249,250, -244,81,42,101,102,66,80,29,0,20,73,38,0,70,173,174,168,179,111,83,88,82,25,0,0,22,64,22,0,0,0,66,251,213,18,88,148,22,0,0,0,0,0,5,122,122,19,36, -9,34,19,0,0,23,92,102,61,18,80,102,78,9,27,86,64,19,0,22,87,102,90,17,6,59,42,30,55,82,13,0,94,248,250,139,110,149,22,0,0,0,22,128,144,121,192,250, -248,90,0,0,0,0,0,0,18,198,248,203,18,5,129,141,14,34,19,0,0,0,13,80,55,77,48,0,0,81,243,249,250,250,248,151,52,0,29,87,37,53,42,32,71,168,178,68, -43,169,188,128,102,86,8,0,0,0,22,64,22,0,52,163,119,65,207,250,229,35,0,0,0,0,0,5,122,122,19,36,9,34,19,0,0,23,98,216,250,210,99,102,78,9,0,25, -64,19,0,22,87,102,90,17,6,59,42,30,55,82,13,0,0,9,79,76,110,149,22,0,0,0,22,128,144,121,154,71,1,0,0,0,0,0,0,0,0,0,0,0,0,5,187,252, -243,96,19,0,0,0,13,80,55,77,114,243,248,248,248,244,119,54,100,102,52,0,29,87,37,53,42,32,71,168,178,68,43,169,188,128,102,86,8,0,0,0,22,64,22,0,66,240, -166,18,0,0,88,148,22,0,0,0,0,0,5,122,122,19,58,21,0,0,0,0,23,90,102,94,102,75,9,39,217,239,90,58,35,85,102,89,16,6,62,37,0,12,33,55,82,11, -7,146,250,248,101,112,149,22,0,0,0,22,178,185,27,133,250,248,90,0,0,0,0,18,198,248,203,18,0,0,5,129,152,25,0,0,0,13,84,50,0,14,85,48,81,244,248,248, -250,248,151,50,0,0,0,36,102,55,0,84,180,169,74,0,10,75,181,204,119,74,84,12,0,0,0,22,64,67,162,119,65,207,248,194,98,148,22,0,0,0,0,0,5,122,122,19, -58,21,0,0,0,0,23,95,216,250,229,94,9,13,4,0,25,58,35,85,102,89,16,6,62,37,0,12,33,55,82,11,7,82,71,1,16,112,149,22,0,0,0,22,178,185,27,62, -62,2,0,0,0,0,0,0,0,0,0,0,0,0,5,187,253,244,72,0,0,13,84,50,0,90,247,249,248,248,243,81,56,102,102,50,0,0,0,36,102,55,0,84,180,169,74,0, -10,75,181,204,119,74,84,12,0,0,0,22,64,80,234,251,0,0,0,0,0,88,148,22,0,0,0,0,0,5,124,139,33,34,6,0,0,0,0,34,102,102,97,24,31,223,249,248, -239,99,97,102,86,16,6,62,37,0,0,0,13,33,53,78,78,68,96,248,248,102,112,150,23,0,5,121,124,128,154,22,136,250,248,90,0,0,18,198,248,203,18,0,0,0,3,37, -137,140,11,0,13,84,50,0,0,0,22,147,245,248,249,249,248,151,82,16,0,0,10,56,56,84,95,178,173,95,4,8,34,40,120,178,179,100,78,86,12,0,0,0,67,182,121,62, -207,248,194,14,0,88,148,22,0,0,0,0,0,5,124,139,33,34,6,0,0,0,0,34,107,216,251,216,27,19,36,3,0,38,97,102,86,16,6,62,37,0,0,0,13,33,53,78, -78,68,2,0,0,19,112,150,23,0,5,121,124,128,154,22,67,69,3,0,0,0,0,0,0,0,0,0,0,0,3,37,191,252,243,72,13,84,50,0,81,243,248,251,249,244,101,43, -99,102,82,16,0,0,10,56,56,84,95,178,173,95,4,8,34,40,120,178,179,100,78,86,12,0,0,0,81,239,251,213,0,0,0,0,0,0,88,150,31,0,0,0,0,3,40,132, -122,19,38,6,0,0,13,79,102,100,102,80,83,243,248,249,249,244,143,102,32,6,62,37,0,0,0,0,0,10,36,92,102,15,0,94,248,248,102,102,145,34,121,124,4,22,130,158, -20,138,250,248,90,18,198,248,203,18,0,0,0,3,36,19,5,129,139,24,83,50,0,0,0,0,82,245,249,248,250,248,151,49,22,63,18,9,62,37,0,95,205,187,71,12,40,34, -40,88,28,52,170,179,98,66,83,13,0,58,160,121,98,210,248,194,14,0,0,0,88,150,31,0,0,0,0,3,40,132,122,19,38,6,0,0,13,79,102,106,213,250,215,27,18,30, -24,84,102,102,32,6,62,37,0,0,0,0,0,10,36,92,102,15,0,0,0,0,19,102,145,34,121,124,4,22,130,158,20,70,70,3,0,0,0,0,0,0,0,0,0,3,36,19, -5,187,252,244,132,50,0,81,243,248,248,249,245,81,53,112,103,49,22,63,18,9,62,37,0,95,205,187,71,12,40,34,40,88,28,52,170,179,98,66,83,13,0,72,234,251,221,35, -21,0,0,0,0,0,0,86,151,22,0,0,3,36,19,5,122,122,19,38,3,12,83,102,72,30,90,102,83,91,243,249,250,251,244,90,54,62,53,93,13,0,0,0,0,7,82,82, -54,80,13,0,94,248,248,90,81,175,135,6,0,0,21,134,154,22,138,250,248,216,248,203,18,0,0,0,3,36,19,0,0,5,134,173,55,0,0,0,0,81,243,248,249,250,251,195, -72,0,0,22,60,62,34,0,74,178,187,138,28,4,39,58,86,26,0,0,53,171,179,88,50,84,63,163,113,62,211,250,199,14,0,0,0,0,0,86,151,22,0,0,3,36,19,5, -122,122,19,38,3,12,83,102,72,30,96,213,250,214,27,34,94,102,85,36,54,62,53,93,13,0,0,0,0,7,82,82,54,80,13,0,0,0,0,0,81,175,135,6,0,0,21,134, -154,22,69,70,3,0,0,0,0,0,0,0,3,36,19,0,0,5,190,253,245,72,81,243,248,248,248,243,99,57,173,167,72,0,0,22,60,62,34,0,74,178,187,138,28,4,39,58, -86,26,0,0,53,171,179,88,50,84,77,235,251,213,35,62,64,22,0,0,0,0,0,0,88,149,22,3,36,19,0,0,5,122,122,15,42,84,102,75,8,0,20,92,102,79,109,247, -251,251,248,239,107,83,147,179,93,0,0,0,9,82,68,16,32,55,82,13,0,94,248,248,155,155,138,20,0,0,0,18,128,156,22,146,250,248,219,18,0,0,0,3,36,19,0,0, -0,13,85,152,138,11,0,0,81,243,248,248,249,251,202,55,14,34,2,7,63,70,18,74,178,178,74,28,89,52,38,90,53,2,0,0,0,57,171,179,79,89,188,115,62,207,248,199, -74,22,0,0,0,0,0,0,88,149,22,3,36,19,0,0,5,122,122,15,42,84,102,75,8,0,20,97,213,250,222,103,102,96,17,5,64,83,147,179,93,0,0,0,9,82,68,16, -32,55,82,13,0,0,0,0,100,155,138,20,0,0,0,18,128,156,22,69,70,3,0,0,0,0,0,3,36,19,0,0,0,13,85,202,252,242,245,248,248,248,243,81,47,176,176,55, -14,34,2,7,63,70,18,74,178,178,74,28,89,52,38,90,53,2,0,0,0,57,171,179,79,100,240,251,213,18,0,20,45,61,22,0,0,0,0,0,0,90,148,55,19,0,0,0, -0,5,122,128,91,102,75,6,0,16,13,18,88,102,101,156,247,249,248,250,242,171,198,148,25,0,0,9,82,71,3,0,13,33,54,82,17,0,94,251,252,99,84,148,22,0,0,0, -21,130,164,203,250,250,248,90,0,0,3,36,19,0,0,0,13,84,50,5,129,142,11,81,243,248,248,249,251,202,72,14,0,14,19,60,33,22,119,184,178,74,0,6,52,91,90,22, -9,38,5,4,9,0,58,167,178,170,124,107,209,248,195,70,45,61,22,0,0,0,0,0,0,90,148,55,19,0,0,0,0,5,122,128,91,102,75,6,0,16,13,18,94,213,251,232, -100,27,14,60,49,148,198,148,25,0,0,9,82,71,3,0,13,33,54,82,17,0,0,110,133,14,84,148,22,0,0,0,21,130,156,22,69,70,3,0,0,0,3,36,19,0,0,0, -13,84,50,5,209,252,248,248,248,244,90,45,175,176,72,14,0,14,19,60,33,22,119,184,178,74,0,6,52,91,90,22,9,38,5,4,9,0,58,167,184,236,251,223,28,0,3,59, -4,20,64,22,0,0,0,0,0,3,113,155,22,0,0,0,0,0,19,166,175,80,35,4,0,5,36,9,40,102,102,101,109,243,250,250,252,250,171,78,21,0,9,82,71,2,0,0, -0,12,34,70,82,22,121,179,248,248,90,88,148,22,0,0,0,38,227,252,208,146,250,248,90,3,36,19,0,0,0,13,84,50,0,0,5,129,177,243,248,248,250,251,202,56,3,34, -16,7,61,37,0,74,185,198,89,0,10,33,39,90,90,29,14,13,38,37,9,10,23,96,183,203,118,216,250,198,77,71,4,20,64,22,0,0,0,0,0,3,113,155,22,0,0,0, -0,0,19,166,175,80,35,4,0,5,36,9,40,107,213,251,221,30,61,52,138,179,149,78,21,0,9,82,71,2,0,0,0,12,34,70,82,22,121,135,12,0,0,88,148,22,0,0, -0,22,130,156,22,69,70,3,0,3,36,19,0,0,0,13,84,50,0,81,243,252,252,248,245,82,66,175,176,56,3,34,16,7,61,37,0,74,185,198,89,0,10,33,39,90,90,29, -14,13,38,37,9,10,23,107,239,254,225,61,82,19,66,71,0,0,22,64,22,0,0,0,3,36,19,91,147,22,0,0,0,15,86,105,160,125,17,38,6,0,0,45,88,102,102,102, -79,128,250,252,253,252,235,72,60,26,78,71,2,0,0,0,0,4,42,37,57,166,143,11,94,248,248,90,88,148,22,0,18,198,248,229,164,22,138,250,248,112,19,0,0,0,13,84, -50,0,0,0,0,85,249,252,248,249,251,202,64,0,0,1,36,65,36,0,74,178,178,90,62,27,29,41,87,24,26,99,153,54,43,40,13,37,62,145,139,193,241,250,206,110,70,1, -0,0,22,64,22,0,0,0,3,36,19,91,147,22,0,0,0,15,86,105,160,125,17,38,6,0,0,45,88,102,107,210,250,226,71,138,179,138,18,23,60,26,78,71,2,0,0,0, -0,4,42,37,57,166,143,11,0,0,0,0,88,148,22,0,0,0,22,130,156,22,69,69,8,34,19,0,0,0,13,84,50,0,81,243,248,248,252,252,242,102,174,176,64,0,0,1, -36,65,36,0,74,178,178,90,62,27,29,41,87,24,26,99,153,54,43,40,13,37,76,230,252,242,184,78,48,102,70,1,0,0,0,22,64,22,0,3,36,19,0,0,91,147,22,0, -16,86,102,72,11,124,110,16,38,3,22,89,102,85,31,88,102,92,179,253,252,249,248,234,75,101,76,0,0,0,0,0,6,38,12,19,144,161,88,13,0,94,248,248,90,88,150,39, -198,248,203,38,130,156,22,137,250,248,90,0,0,13,84,50,0,0,0,0,5,217,248,252,252,251,200,57,28,18,0,10,60,37,0,74,178,178,74,0,28,70,52,84,28,0,0,30, -124,179,59,19,61,65,159,51,26,219,253,237,129,84,78,11,0,0,0,22,64,22,0,3,36,19,0,0,91,147,22,0,16,86,102,72,11,124,110,16,38,3,22,89,102,85,31,93, -210,251,237,187,138,18,0,0,27,101,76,0,0,0,0,0,6,38,12,19,144,161,88,13,0,0,0,0,0,88,150,22,0,0,0,22,130,156,22,68,86,18,0,0,0,13,84,50, -0,81,243,248,248,248,243,208,252,250,197,57,28,18,0,10,60,37,0,74,178,178,74,0,28,70,52,84,28,0,0,30,124,179,59,19,61,78,234,249,205,78,175,180,121,84,78,11, -12,0,0,0,22,63,23,31,19,0,0,0,0,91,147,37,90,102,69,6,0,9,42,1,10,46,89,102,82,37,18,62,106,185,199,182,249,248,248,248,238,114,58,20,0,0,0,4, -36,14,1,128,141,39,55,82,13,0,94,248,248,90,118,233,249,203,18,0,22,129,157,48,142,250,248,90,13,84,50,0,46,22,0,0,0,27,221,249,253,221,61,0,2,32,24,58, -37,0,74,178,178,74,0,10,29,53,102,43,0,0,0,0,52,125,169,62,66,172,56,18,207,248,210,200,199,79,63,87,12,0,0,0,22,63,23,31,19,0,0,0,0,91,147,37, -90,102,69,6,0,9,42,1,10,46,89,102,82,37,18,62,111,235,253,239,42,0,0,9,78,76,58,20,0,0,0,4,36,14,1,128,141,39,55,82,13,0,0,0,0,1,107,156, -22,0,0,0,22,129,157,48,75,67,3,0,13,84,50,0,112,244,248,248,248,243,81,47,229,254,243,72,2,32,24,58,37,0,74,178,178,74,0,10,29,53,102,43,0,0,0,0, -52,125,169,62,79,237,249,203,18,0,69,198,199,79,63,87,87,12,0,0,0,22,75,33,0,0,0,0,0,0,103,184,114,93,23,0,0,0,0,0,22,91,102,83,10,8,72,55, -146,206,185,80,101,248,248,250,250,230,66,64,23,0,0,2,7,2,116,130,8,14,34,55,82,13,0,94,248,248,216,251,234,39,0,0,0,22,137,161,22,138,250,248,143,50,0,0, -24,64,20,0,0,0,68,243,198,146,135,11,0,11,72,44,0,74,178,178,74,0,10,34,41,83,44,58,23,0,0,2,3,29,118,172,161,56,54,208,248,195,80,121,180,169,22,64, -87,12,0,0,0,22,75,33,0,0,0,0,0,0,103,184,114,93,23,0,0,0,0,0,22,91,102,83,10,8,72,55,146,208,235,251,221,27,9,82,71,1,20,64,23,0,0,2, -7,2,116,130,8,14,34,55,82,13,0,0,0,0,4,109,154,22,0,0,0,22,137,161,22,69,66,19,82,50,0,81,244,250,248,248,243,81,46,173,171,200,252,239,68,11,72,44, -0,74,178,178,74,0,10,34,41,83,44,58,23,0,0,2,3,29,118,178,234,249,211,24,0,3,70,121,180,169,22,64,64,87,12,0,3,30,34,60,22,0,0,0,0,17,88,158, -175,44,61,19,0,0,0,24,92,102,84,38,13,59,52,152,183,145,102,102,65,114,250,250,248,248,230,64,55,5,0,0,2,117,130,8,0,0,14,33,55,82,13,0,105,248,248,219, -121,156,22,0,3,30,34,128,156,22,138,251,249,90,0,0,0,23,64,18,0,46,175,178,54,2,130,140,21,59,36,30,87,178,178,74,0,10,34,40,88,28,0,23,55,5,0,0, -0,0,72,193,170,62,210,249,196,78,71,3,71,60,1,0,64,87,12,0,3,30,34,60,22,0,0,0,0,17,88,158,175,44,61,19,0,0,0,24,92,102,84,38,13,59,52,152, -183,145,107,208,250,223,98,71,2,0,0,23,55,5,0,0,2,117,130,8,0,0,14,33,55,82,13,0,0,0,0,1,111,156,22,0,3,30,34,128,156,22,69,102,48,0,81,243, -248,249,250,244,81,46,175,176,54,2,191,252,240,111,36,30,87,178,178,74,0,10,34,40,88,28,0,23,55,5,0,0,0,0,84,241,252,213,31,36,11,68,71,3,71,60,1,0, -0,64,86,16,31,19,0,22,64,22,0,0,18,89,102,69,96,146,42,64,18,0,12,89,102,81,9,17,73,53,138,180,154,30,16,88,102,96,144,248,248,248,248,230,45,0,0,3, -118,128,8,0,0,0,0,13,33,55,82,30,198,248,248,248,92,112,155,23,36,19,0,22,127,161,88,146,250,248,90,0,0,0,24,56,57,175,176,55,0,0,5,132,158,40,0,76, -189,184,74,0,10,34,42,88,28,0,0,0,4,0,0,0,0,55,158,69,128,238,249,197,97,71,2,0,0,0,0,0,0,64,86,16,31,19,0,22,64,22,0,0,18,89,102,69, -96,146,42,64,18,0,12,89,102,81,9,17,73,53,138,180,154,30,16,94,208,251,230,32,0,0,0,0,4,0,0,3,118,128,8,0,0,0,0,13,33,55,82,13,0,0,0,0, -3,112,155,23,36,19,0,22,127,161,88,83,64,83,243,248,248,248,244,119,57,175,176,55,0,0,5,193,253,241,68,76,189,184,74,0,10,34,42,88,28,0,0,0,4,0,0,0, -0,69,233,250,227,175,55,14,88,71,2,0,0,0,0,0,0,0,63,98,26,0,0,0,22,64,18,17,89,102,69,4,0,93,145,43,62,28,76,102,80,9,8,59,58,153,181,138, -21,36,10,26,102,102,67,110,248,248,248,248,230,41,4,119,127,7,0,0,0,0,0,0,13,33,69,216,248,203,105,248,248,92,110,167,36,0,0,0,31,155,173,24,137,250,248,90, -0,0,0,60,176,176,45,0,0,0,9,66,166,136,78,178,179,100,16,8,33,42,88,28,0,0,0,0,0,0,0,0,55,159,50,18,213,251,235,113,74,35,5,0,0,0,0,0, -0,0,63,98,26,0,0,0,22,64,18,17,89,102,69,4,0,93,145,43,62,28,76,102,80,9,8,59,58,153,181,138,21,36,10,26,107,208,250,221,31,0,0,0,0,0,4,119, -127,7,0,0,0,0,0,0,13,33,55,82,13,0,0,0,0,2,110,167,36,0,0,0,31,155,173,24,128,246,248,248,248,243,81,60,176,176,45,0,0,0,9,66,210,252,244,199, -179,100,16,8,33,42,88,28,0,0,0,0,0,0,0,0,69,234,249,203,46,121,171,104,74,35,5,0,0,0,0,0,0,2,30,70,84,12,0,0,0,18,67,91,102,68,4,0, -0,0,93,145,42,87,102,78,9,8,62,52,138,183,156,24,0,1,35,80,69,86,102,68,115,248,248,248,248,231,142,126,6,0,0,0,0,0,0,8,0,30,206,250,220,30,0,94, -248,248,112,117,154,22,0,13,80,61,125,156,22,138,250,248,90,0,46,174,176,82,12,0,0,10,58,81,102,182,192,179,74,2,38,42,40,88,28,0,0,0,0,0,0,0,0,55, -159,50,18,207,248,201,138,189,56,12,38,6,0,0,0,0,0,2,30,70,84,12,0,0,0,18,67,91,102,68,4,0,0,0,93,145,42,87,102,78,9,8,62,52,138,183,156,24, -0,1,35,80,69,91,208,250,221,31,0,0,0,4,121,126,6,0,0,0,0,0,0,8,0,13,33,55,82,13,0,0,0,2,34,117,154,22,0,13,80,61,125,188,244,250,250,248, -243,81,46,174,176,82,12,0,0,10,58,81,102,218,253,250,122,2,38,42,40,88,28,0,0,0,0,0,0,0,0,69,234,249,203,18,0,30,131,189,56,12,38,6,0,0,0,0, -3,36,17,0,64,87,12,0,0,18,92,102,75,4,0,0,0,0,0,93,145,45,85,24,6,62,52,138,179,138,31,38,3,7,79,86,14,14,89,102,68,115,248,248,248,252,240,47, -0,0,0,0,0,0,0,29,40,198,248,210,69,82,13,0,96,249,248,91,111,154,32,84,50,0,21,130,157,24,138,250,248,120,175,176,45,24,59,13,8,62,35,12,128,204,205,105, -1,8,32,58,92,25,0,0,0,0,0,0,0,0,55,159,50,18,207,248,195,75,76,118,172,57,14,38,6,0,0,0,3,36,17,0,64,87,12,0,0,18,92,102,75,4,0,0, -0,0,0,93,145,45,85,24,6,62,52,138,179,138,31,38,3,7,79,86,14,14,93,208,250,221,31,0,6,122,124,6,0,0,0,0,0,0,0,29,24,0,13,33,55,82,13,0, -3,36,18,1,111,154,32,84,50,0,95,249,252,249,250,246,83,45,175,176,45,24,59,13,8,62,35,12,128,204,231,251,239,69,32,58,92,25,0,0,0,0,0,0,0,0,69,234, -249,203,18,0,3,65,76,118,172,57,14,38,6,0,0,0,36,19,0,0,0,64,87,10,18,90,102,74,49,3,0,0,0,0,0,0,95,145,39,57,60,50,138,179,138,18,0,12, -36,80,68,8,33,13,15,89,102,69,120,248,252,252,248,221,41,0,0,0,0,0,0,19,205,249,203,42,112,71,82,15,33,106,248,248,90,115,185,66,0,0,0,23,124,149,25,134, -250,253,204,47,0,0,25,59,60,34,0,74,181,202,146,89,46,30,40,84,52,13,0,0,0,0,0,0,0,53,159,50,18,207,248,195,80,70,1,28,125,173,58,14,38,6,0,3, -36,19,0,0,0,64,87,10,18,90,102,74,49,3,0,0,0,0,0,0,95,145,39,57,60,50,138,179,138,18,0,12,36,80,68,8,33,13,15,93,208,250,221,40,122,116,6,0, -0,0,0,0,0,0,0,1,33,24,0,25,112,71,82,15,33,18,0,0,0,115,185,66,0,81,243,249,251,252,244,125,83,173,176,47,0,0,25,59,60,34,0,74,181,202,146,174, -249,241,93,84,52,13,0,0,0,0,0,0,0,67,234,249,203,18,0,3,70,70,1,28,125,173,58,14,38,6,0,3,19,0,0,0,0,0,60,83,88,102,66,4,2,0,0,0, -0,0,0,0,0,95,147,76,81,143,179,138,18,0,0,7,83,88,7,0,3,36,13,15,89,102,73,187,252,248,248,248,221,36,0,0,0,0,18,198,248,210,40,93,183,150,66,88, -24,0,94,248,248,143,134,154,22,0,0,0,4,88,145,71,203,253,249,90,0,0,7,65,70,12,74,178,178,81,78,102,94,63,83,26,0,36,19,0,0,0,0,0,44,148,48,18, -207,248,195,80,71,3,0,0,29,124,173,58,14,36,9,34,19,0,0,0,0,0,60,83,88,102,66,4,2,0,0,0,0,0,0,0,0,95,147,76,81,143,179,138,18,0,0,7, -83,88,7,0,3,36,13,15,92,208,250,237,141,1,0,0,0,0,0,0,0,0,0,0,1,33,24,93,183,150,66,88,24,0,0,0,12,82,134,154,96,243,248,248,248,247,180,71, -172,176,48,0,0,0,7,65,70,12,74,178,178,81,78,102,176,250,244,82,0,36,19,0,0,0,0,0,59,231,249,203,18,0,3,70,71,3,0,0,29,124,173,58,14,36,9,34, -0,0,0,0,0,0,22,101,102,67,0,0,0,0,0,0,0,0,0,0,0,10,128,150,151,197,144,18,0,0,9,82,68,16,36,6,0,3,36,13,15,92,176,160,131,248,248,248, -248,221,31,0,0,18,198,248,203,19,33,46,140,183,159,65,75,13,0,102,250,249,91,111,156,22,0,0,0,0,113,209,173,145,250,248,90,10,58,33,28,118,182,178,74,0,18,88, -102,102,58,0,0,3,36,19,0,0,0,53,148,40,18,207,248,195,80,70,3,0,0,0,0,29,118,168,59,14,58,21,0,0,0,0,0,0,22,101,102,67,0,0,0,0,0,0, -0,0,0,0,0,10,128,150,151,197,144,18,0,0,9,82,68,16,36,6,0,3,36,13,15,95,230,253,222,36,0,0,0,0,0,0,0,0,0,0,0,1,33,46,140,183,159,65, -75,13,0,13,84,49,2,157,250,249,248,248,243,81,113,209,173,81,64,2,0,10,58,33,28,118,182,178,74,0,18,88,102,180,250,239,63,3,36,19,0,0,0,68,231,249,203,18, -0,3,70,70,3,0,0,0,0,29,118,168,59,14,58,21,6,0,0,0,0,22,91,102,87,80,11,0,0,0,0,5,1,0,0,0,10,62,48,162,179,152,73,12,0,9,82,71, -3,0,14,38,7,0,3,36,18,131,170,106,70,128,248,248,248,248,221,27,18,198,248,203,18,0,1,32,41,153,187,147,62,78,26,80,126,248,248,92,112,156,22,0,0,45,169,190, -154,23,138,250,248,128,35,0,74,188,197,82,0,10,29,51,102,102,88,44,4,0,3,36,19,0,55,159,48,18,207,248,195,80,69,1,0,0,0,0,0,0,9,73,168,82,28,34, -6,0,0,0,0,22,91,102,87,80,11,0,0,0,0,5,1,0,0,0,10,62,48,162,179,152,73,12,0,9,82,71,3,0,14,38,7,0,3,36,18,131,171,206,250,222,36,0, -0,0,0,0,0,0,0,0,0,0,1,32,41,153,187,147,62,78,26,80,50,0,81,243,251,252,249,243,81,45,169,190,154,23,69,67,15,59,35,0,74,188,197,82,0,10,29,51, -102,102,173,249,239,63,3,36,19,0,69,234,249,203,18,0,3,70,69,1,0,0,0,0,0,0,9,73,168,82,28,34,38,6,0,0,23,92,102,62,7,62,87,12,0,0,19,32, -2,0,0,10,62,52,138,179,159,134,46,59,20,79,71,2,0,0,0,14,38,6,0,8,142,131,20,88,102,70,132,248,248,248,248,228,206,248,203,18,0,0,0,1,54,54,142,182, -144,69,102,54,0,94,248,248,92,112,156,20,43,175,175,62,85,148,23,138,251,249,90,53,179,178,97,60,20,30,38,85,36,76,102,90,44,2,0,3,36,70,159,50,18,207,248,196, -80,68,3,41,14,0,0,0,0,0,0,1,90,172,60,15,38,6,0,0,23,92,102,62,7,62,87,12,0,0,19,32,2,0,0,10,62,52,138,179,159,134,46,59,20,79,71,2, -0,0,0,14,38,6,0,8,142,131,20,91,205,250,222,36,0,0,2,43,14,0,0,0,0,0,0,1,54,54,142,182,144,69,102,54,0,81,243,248,248,251,250,95,43,175,175,62, -85,148,23,70,96,36,0,53,179,178,97,60,20,30,38,85,36,76,102,177,249,239,63,3,36,83,234,249,203,18,0,6,70,68,3,41,14,0,0,0,0,0,0,1,90,172,60,15, -14,38,3,21,96,102,63,2,0,0,64,87,11,15,36,4,0,0,10,62,52,138,179,139,25,92,143,51,99,72,1,0,0,0,0,0,14,38,11,123,126,41,13,15,88,102,70,138, -248,248,249,249,248,208,18,0,0,0,2,34,20,29,42,145,186,174,84,76,12,0,94,248,248,92,105,160,174,173,62,0,0,88,152,74,146,250,248,100,124,79,0,37,68,44,85,30, -0,10,79,102,90,43,2,0,57,173,65,18,207,248,194,57,68,2,47,51,6,0,0,0,0,0,2,34,20,69,168,60,14,38,3,21,96,102,63,2,0,0,64,87,11,15,36,4, -0,0,10,62,52,138,179,139,25,92,143,51,99,72,1,0,0,0,0,0,14,38,11,123,126,41,13,15,91,205,250,222,41,3,50,50,6,0,0,0,0,0,2,34,20,29,42,145, -186,174,84,76,89,243,248,248,248,243,152,160,174,173,62,0,0,88,152,74,82,66,2,15,124,79,0,37,68,44,85,30,0,10,79,102,177,249,239,58,71,237,249,203,18,0,0,46, -68,2,47,51,6,0,0,0,0,0,2,34,20,69,168,60,61,14,35,22,87,65,2,0,0,0,0,62,88,40,0,0,0,10,62,52,138,179,138,22,36,7,102,176,93,56,10,0, -0,0,0,0,0,19,143,127,6,3,36,9,16,88,102,70,140,249,249,248,248,219,27,0,0,2,35,21,0,1,30,48,178,195,142,63,82,13,0,94,248,248,118,193,209,76,0,0, -0,10,129,163,25,138,250,248,111,8,8,29,57,102,38,0,0,0,10,79,102,90,44,57,159,52,51,210,248,194,14,6,3,48,50,2,0,0,0,0,0,2,35,21,0,1,71,167, -61,14,35,22,87,65,2,0,0,0,0,62,88,40,0,0,0,10,62,52,138,179,138,22,36,7,102,176,93,56,10,0,0,0,0,0,0,19,143,127,6,3,36,9,16,91,205,250, -223,81,50,2,0,0,0,0,0,2,35,21,0,1,30,48,178,195,142,124,247,248,248,248,243,81,43,193,209,76,0,0,0,10,129,163,25,69,69,4,33,8,8,29,57,102,38,0, -0,0,10,79,102,177,249,244,238,249,210,32,0,0,0,6,3,48,50,2,0,0,0,0,0,2,35,21,0,1,71,167,168,62,14,35,15,2,0,0,0,0,0,15,78,84,11,0, -10,62,52,138,179,138,18,0,8,37,81,140,144,50,58,4,0,0,0,0,5,123,131,43,6,0,2,7,0,16,86,102,100,232,248,248,248,248,212,27,2,35,20,0,0,0,12,86, -74,147,183,143,63,82,13,0,94,249,253,200,133,151,22,0,10,62,37,88,148,24,138,250,248,115,36,37,83,56,51,4,0,0,0,10,79,102,126,175,52,18,207,248,194,14,0,1, -49,50,2,0,0,0,0,0,2,35,20,0,0,0,1,71,168,62,14,35,15,2,0,0,0,0,0,15,78,84,11,0,10,62,52,138,179,138,18,0,8,37,81,140,144,50,58,4, -0,0,0,0,5,123,131,43,6,0,2,7,0,16,90,202,250,227,42,0,0,0,0,0,2,35,20,0,0,0,12,86,74,147,205,250,250,250,248,243,81,46,174,170,133,151,22,0, -10,62,37,88,148,24,70,68,9,38,36,37,83,56,51,4,0,0,0,10,79,102,198,252,249,214,20,7,0,0,0,1,49,50,2,0,0,0,0,0,2,35,20,0,0,0,1,71, -70,167,62,14,36,5,0,0,0,0,19,34,4,63,84,23,58,52,138,179,138,18,0,0,8,81,88,11,99,142,31,2,0,0,0,5,123,124,6,15,38,6,0,0,0,0,18,109, -221,250,229,248,248,248,248,207,59,20,0,0,0,13,84,48,28,45,148,183,141,63,82,13,44,204,253,250,93,110,154,30,62,37,0,0,88,148,24,137,250,249,126,88,28,0,16,2, -0,0,0,0,10,117,197,123,58,207,248,194,14,0,2,50,50,2,0,0,0,0,0,2,36,20,0,0,0,0,0,1,70,167,62,14,36,5,0,0,0,0,19,34,4,63,84,23, -58,52,138,179,138,18,0,0,8,81,88,11,99,142,31,2,0,0,0,5,123,124,6,15,38,6,0,0,0,0,18,101,202,250,222,41,0,0,0,2,36,20,0,0,0,13,84,48, -28,111,250,253,252,250,247,90,44,175,176,60,4,110,154,30,62,37,0,0,88,148,24,68,69,36,56,88,28,0,16,2,0,0,0,0,10,127,242,251,249,240,58,0,0,0,2,50, -50,2,0,0,0,0,0,2,36,20,0,0,0,0,0,1,1,70,168,63,14,38,6,0,0,19,36,3,0,0,64,102,58,138,179,138,18,0,0,9,82,69,13,36,10,99,141,17, -0,0,5,123,124,6,0,0,15,38,6,0,0,2,60,210,250,224,84,151,248,248,248,249,211,22,0,0,13,84,48,0,0,33,46,150,183,140,57,89,174,176,133,248,248,91,112,175, -55,0,0,0,0,88,148,32,146,250,250,125,7,0,0,0,0,0,0,0,55,163,113,113,224,249,194,14,0,2,50,50,2,0,0,0,0,0,3,36,20,0,0,0,0,0,0,0, -1,70,168,63,14,38,6,0,0,19,36,3,0,0,64,102,58,138,179,138,18,0,0,9,82,69,13,36,10,99,141,17,0,0,5,123,124,6,0,0,15,38,6,0,0,2,45,54, -88,202,250,227,41,0,3,36,20,0,0,0,13,84,48,0,81,245,249,252,253,250,120,89,174,176,62,0,0,1,112,175,55,0,0,0,0,88,148,32,83,77,80,54,7,0,0,0, -0,0,0,0,69,235,251,224,183,249,239,58,0,2,50,50,2,0,0,0,0,0,3,36,20,0,0,0,0,0,0,0,0,1,69,166,63,14,38,4,17,36,3,0,0,9,54,82, -174,183,138,18,0,0,8,82,71,3,0,10,39,11,100,142,14,1,123,124,6,0,0,0,0,15,38,4,1,64,209,248,206,98,102,72,151,248,249,248,248,207,18,13,84,56,9,0, -0,1,33,47,151,182,151,170,174,66,0,94,248,248,129,112,148,22,0,0,0,0,94,161,58,158,250,248,114,11,0,0,0,0,0,55,159,50,27,222,251,216,55,1,1,50,50,2, -0,0,0,0,0,3,35,19,0,0,0,0,0,6,13,0,0,1,69,166,63,14,38,4,17,36,3,0,0,9,54,82,174,183,138,18,0,0,8,82,71,3,0,10,39,11,100,142, -14,1,123,124,6,0,0,0,0,15,38,4,1,50,50,0,15,90,202,250,226,41,35,19,0,0,0,13,84,56,9,81,243,248,249,249,250,205,151,170,174,66,0,0,0,9,60,112, -148,22,0,0,0,0,94,161,58,102,75,8,36,11,0,0,0,0,0,69,234,249,205,91,102,177,249,239,55,50,50,2,0,0,0,0,0,3,35,19,0,0,0,0,0,6,13,0, -0,0,1,69,166,65,11,47,36,2,0,0,10,62,52,138,194,177,30,0,0,9,81,71,2,0,0,0,10,39,11,98,130,119,119,6,0,0,0,0,0,0,14,33,63,209,248,203, -18,16,86,102,72,168,248,248,248,248,209,96,48,9,60,20,0,0,1,32,42,162,209,201,87,75,12,0,101,250,249,90,88,148,22,0,0,10,30,113,184,50,135,250,248,114,11,0, -0,0,55,159,50,18,207,248,213,110,90,41,45,49,2,0,0,0,0,0,3,36,18,0,0,0,0,0,0,14,62,20,0,0,1,69,166,65,11,47,36,2,0,0,10,62,52,138, -194,177,30,0,0,9,81,71,2,0,0,0,10,39,11,98,130,119,119,6,0,0,0,0,0,0,14,33,48,49,2,0,0,16,89,199,250,230,54,0,0,0,13,84,48,9,122,244, -248,248,248,245,111,162,209,201,87,75,12,0,11,62,37,0,88,148,22,0,0,10,30,113,184,50,64,67,9,37,11,0,0,0,69,234,249,203,18,10,79,102,181,249,242,92,2,0, -0,0,0,0,3,36,18,0,0,0,0,0,0,14,62,20,20,0,0,1,69,165,75,41,36,5,0,7,60,52,138,179,138,65,84,11,7,82,71,2,0,0,0,0,0,9,39,12, -159,179,20,0,0,0,0,0,0,0,0,68,212,248,203,18,0,0,14,85,102,78,160,248,248,248,250,217,18,0,22,60,16,0,0,0,61,175,207,197,131,59,81,20,56,118,248,248, -90,88,148,22,10,33,38,88,108,148,24,138,250,248,114,11,0,55,159,50,18,207,248,194,24,78,102,96,65,3,0,0,0,0,0,3,36,19,0,0,0,0,0,0,0,0,23,64, -20,0,0,1,69,165,75,41,36,5,0,7,60,52,138,179,138,65,84,11,7,82,71,2,0,0,0,0,0,9,39,12,159,179,20,0,0,0,0,0,0,0,0,54,65,6,0,0, -0,0,14,88,199,250,226,41,0,13,84,50,0,81,244,250,248,248,243,81,61,175,207,197,131,59,81,20,56,37,0,0,0,88,148,22,10,33,38,88,108,148,24,70,67,9,37,11, -0,69,234,249,203,18,0,0,10,78,102,183,250,239,54,0,0,0,0,3,36,19,0,0,0,0,0,0,0,0,23,64,64,19,0,0,0,76,176,66,13,38,6,4,38,138,179,138, -18,0,48,79,78,68,2,0,0,0,0,0,0,0,14,141,120,96,137,15,0,0,0,0,0,2,64,209,248,210,21,0,0,0,0,42,88,102,72,160,248,250,249,248,203,18,0,19, -59,18,0,45,174,172,95,154,183,134,58,87,33,0,94,248,248,90,88,152,53,38,88,30,0,88,148,24,138,250,248,114,64,159,50,18,207,248,194,14,0,12,93,102,88,42,2,0, -0,0,3,36,19,0,0,0,0,0,0,0,90,122,0,23,64,19,0,0,0,76,176,66,13,38,6,4,38,138,179,138,18,0,48,79,78,68,2,0,0,0,0,0,0,0,14,141, -120,96,137,15,0,0,0,0,0,2,50,48,16,35,4,0,0,0,0,42,91,199,250,230,50,84,50,0,81,243,248,248,250,244,81,45,174,172,95,154,183,134,58,87,33,0,0,0, -0,0,88,152,53,38,88,30,0,88,148,24,70,67,9,37,77,234,249,203,18,0,0,0,0,12,93,102,180,249,239,54,0,0,3,36,19,0,0,0,0,0,0,0,0,0,0,23, -24,64,18,0,18,33,65,166,66,14,38,23,138,179,138,18,0,0,6,94,102,15,0,0,0,0,0,0,0,5,123,129,42,11,102,140,15,0,0,0,2,64,209,248,203,51,74,6, -0,3,36,15,14,86,102,77,188,249,248,248,248,198,18,0,23,56,57,175,176,60,27,52,157,183,132,58,80,13,0,94,248,248,96,110,164,102,30,0,0,0,88,148,24,138,250,249, -201,59,18,207,248,194,14,0,2,46,51,77,102,91,43,2,0,3,36,19,0,0,0,0,0,0,0,90,248,248,45,0,24,64,18,0,18,33,65,166,66,14,38,23,138,179,138,18, -0,0,6,94,102,15,0,0,0,0,0,0,0,5,123,129,42,11,102,140,15,0,0,0,2,49,50,2,0,35,74,6,0,3,36,15,14,89,199,250,238,81,0,81,243,248,248,248, -244,119,57,175,176,60,27,52,157,183,132,58,80,13,0,0,0,0,10,110,164,102,30,0,0,0,88,148,24,70,68,75,237,249,203,18,0,0,0,0,2,46,51,77,102,181,249,239, -54,3,36,19,0,0,0,0,0,0,0,0,0,0,0,0,0,25,60,31,32,2,0,67,166,62,29,156,181,138,18,0,0,9,82,66,48,82,13,0,0,0,0,0,5,123,124,6, -9,39,11,102,140,15,0,2,66,209,248,203,18,6,71,76,10,33,19,0,0,12,84,102,91,164,248,248,248,248,194,18,0,60,176,176,60,0,0,33,53,157,183,131,58,82,13,0, -94,248,249,114,146,161,22,0,0,0,0,88,148,21,162,253,249,124,209,248,194,14,0,2,50,50,25,121,88,102,91,42,5,34,19,0,0,0,0,0,0,0,90,248,248,94,0,0, -0,25,60,31,32,2,0,67,166,62,29,156,181,138,18,0,0,9,82,66,48,82,13,0,0,0,0,0,5,123,124,6,9,39,11,102,140,15,0,2,52,50,1,0,0,6,71,76, -10,33,19,0,0,12,87,197,250,230,108,243,248,248,248,243,81,60,176,176,60,0,0,33,53,157,183,131,58,82,13,0,0,10,34,38,146,161,22,0,0,0,0,88,148,21,116,240, -249,211,28,0,0,0,0,2,50,50,25,121,88,102,181,249,239,81,19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,75,18,0,0,1,62,154,150,183,156,24,0,0, -9,82,71,2,0,50,84,13,0,0,0,5,123,124,6,0,0,9,39,12,102,140,17,61,216,250,203,18,0,0,2,70,90,19,0,0,0,10,80,92,102,77,169,248,248,248,248,194, -56,174,176,87,15,0,0,1,33,54,159,183,130,57,82,12,7,115,249,250,110,88,148,22,0,0,0,0,81,152,150,158,250,248,249,197,14,0,2,50,50,24,148,91,13,79,102,90, -59,17,0,0,0,0,0,0,0,90,248,248,94,0,0,0,0,0,36,75,18,0,0,1,62,154,150,183,156,24,0,0,9,82,71,2,0,50,84,13,0,0,0,5,123,124,6,0, -0,9,39,12,102,140,17,46,82,67,2,0,0,0,2,70,90,19,0,0,0,10,80,95,197,250,248,248,248,248,243,81,45,174,176,87,15,0,0,1,33,54,159,183,130,57,82,12, -7,34,38,88,30,88,148,22,0,0,0,0,81,160,231,251,217,26,37,12,0,0,2,50,50,24,148,91,13,79,102,183,250,235,54,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,18,31,27,62,16,0,0,14,156,186,152,26,38,4,8,82,71,2,0,0,0,51,84,13,0,5,123,124,6,0,0,0,0,9,39,10,103,168,212,248,217,83,3,0,0,2,32, -76,74,5,0,13,84,47,15,85,102,77,169,248,248,248,249,235,179,59,24,62,16,0,0,1,33,56,160,183,128,56,83,40,36,150,249,248,90,88,148,22,0,0,0,48,174,151,35, -232,250,248,122,10,1,50,50,24,148,88,0,0,10,78,102,92,40,2,0,0,0,0,0,90,248,248,94,0,0,0,0,0,18,31,27,62,16,0,0,14,156,186,152,26,38,4,8, -82,71,2,0,0,0,51,84,13,0,5,123,124,6,0,0,0,0,9,39,10,103,162,61,9,68,70,3,0,0,2,32,76,74,5,0,13,84,47,15,141,250,250,248,248,243,81,42, -172,176,59,24,62,16,0,0,1,33,56,160,183,128,56,83,40,36,88,30,0,0,88,148,22,0,0,0,63,237,252,207,83,68,10,38,10,1,50,50,24,148,88,0,0,10,78,102, -184,249,234,54,0,0,0,0,0,0,0,0,0,0,0,0,19,36,3,0,27,64,16,18,138,179,156,154,64,12,37,80,70,2,0,0,6,32,0,49,84,17,123,124,6,0,0,0, -0,0,0,8,34,66,227,252,206,21,70,70,2,1,36,17,1,70,73,21,82,50,0,0,14,84,102,78,173,248,249,253,253,209,9,0,27,64,16,0,0,1,33,58,161,182,131,76, -86,83,28,94,248,249,93,88,148,22,0,55,157,46,93,235,249,221,248,248,112,52,48,24,148,88,0,0,0,0,38,83,102,91,42,2,0,0,0,90,248,248,94,0,0,0,0,0, -19,36,3,0,27,64,16,18,138,179,156,154,64,12,37,80,70,2,0,0,6,32,0,49,84,17,123,124,6,0,0,0,0,0,0,8,34,52,132,140,15,3,70,70,2,1,36,17, -1,70,73,21,82,50,0,81,244,250,251,250,248,111,46,172,173,62,0,0,27,64,16,0,0,1,33,58,161,182,131,76,86,83,28,0,6,33,4,88,148,22,0,69,233,249,219,156, -26,46,4,6,34,52,48,24,148,88,0,0,0,0,38,83,102,184,249,234,54,0,0,0,0,0,0,0,0,0,0,0,36,3,0,0,0,28,77,146,179,138,15,61,165,74,82,88, -6,0,0,6,38,15,0,0,55,167,130,6,0,0,0,0,0,0,0,1,64,212,248,224,147,14,3,69,68,33,18,0,0,1,70,102,49,0,0,0,0,14,84,102,75,191,253,253, -250,248,194,9,0,28,63,18,0,0,1,33,57,166,191,97,95,86,8,3,118,248,248,90,88,136,69,151,50,18,207,250,229,35,94,248,249,132,32,148,88,0,0,0,3,36,16,9, -79,102,91,42,2,0,90,248,248,94,0,0,0,0,0,18,36,3,0,0,0,28,77,146,179,138,15,61,165,74,82,88,6,0,0,6,38,15,0,0,55,167,130,6,0,0,0,0, -0,0,0,1,49,65,11,105,139,14,3,69,68,33,18,0,0,1,70,102,49,0,81,243,248,248,250,250,250,235,189,174,59,0,0,0,0,28,63,18,0,0,1,33,57,166,191,97, -95,86,8,3,38,15,0,0,88,136,82,232,249,203,18,88,148,22,0,1,49,65,32,148,88,0,0,0,3,36,16,9,79,102,184,249,234,54,0,0,0,0,0,0,0,0,0,18, -3,0,0,0,0,18,151,188,138,18,0,1,63,186,117,15,33,4,4,35,14,0,0,5,123,149,82,11,0,0,0,0,0,0,3,59,209,248,210,27,105,138,14,3,81,68,2,0, -0,10,70,81,63,5,0,0,0,0,13,80,99,175,230,249,248,248,248,190,9,0,29,32,0,0,0,1,33,80,103,85,50,49,77,40,12,94,248,248,90,114,179,65,18,207,248,194, -98,148,24,122,249,249,195,94,0,0,0,2,33,18,0,0,9,75,96,85,39,92,248,248,94,0,0,0,0,0,15,35,3,0,0,0,0,18,151,188,138,18,0,1,63,186,117,15, -33,4,4,35,14,0,0,5,123,149,82,11,0,0,0,0,0,0,3,44,47,10,35,9,105,138,14,3,81,68,2,0,0,10,70,81,63,84,243,248,248,248,244,136,196,253,247,93, -0,0,0,0,0,0,29,32,0,0,0,1,33,80,103,85,50,49,77,40,12,0,0,0,0,124,238,250,203,18,0,0,88,148,24,44,47,31,163,94,0,0,0,2,33,18,0,0, -9,75,96,181,249,234,54,0,0,0,0,0,0,0,15,35,0,0,0,0,18,138,179,138,18,0,0,9,77,100,164,71,10,36,36,10,0,0,5,123,124,6,43,81,12,0,0,0, -0,3,63,208,248,203,24,37,11,105,140,46,17,60,67,0,11,81,43,2,62,74,5,0,0,0,0,51,173,173,95,178,248,248,248,248,185,9,0,0,0,0,0,9,30,52,90,22, -7,35,62,79,12,0,94,248,249,183,112,146,211,248,194,14,0,90,168,60,108,252,250,114,11,0,3,35,16,0,0,0,0,9,74,96,145,249,248,94,0,0,0,0,0,18,34,2, -0,0,0,0,18,138,179,138,18,0,0,9,77,100,164,71,10,36,36,10,0,0,5,123,124,6,43,81,12,0,0,0,0,3,48,44,3,0,6,37,11,105,140,46,17,60,67,0, -11,81,43,2,124,246,248,248,248,243,81,51,173,224,250,231,50,0,0,0,0,0,0,0,0,0,0,9,30,52,90,22,7,35,62,79,12,0,0,0,68,230,251,231,39,0,0,0, -0,90,168,60,21,148,92,37,11,0,3,35,16,0,0,0,0,9,74,96,184,249,234,54,0,0,0,0,0,18,34,2,0,0,0,18,138,179,138,18,0,0,9,82,69,6,62,164, -73,42,43,4,0,5,123,124,6,0,0,49,84,12,0,0,1,62,209,248,203,18,0,6,38,14,125,147,13,3,66,69,77,48,0,0,3,70,78,8,0,0,46,175,176,98,102,80, -182,248,248,248,130,0,0,0,0,0,10,34,38,84,52,17,4,42,40,54,82,13,0,129,252,249,102,224,252,200,14,0,1,47,117,141,140,147,248,248,114,14,33,19,0,0,0,0, -0,0,10,141,251,250,122,2,0,0,0,0,19,36,3,0,0,0,0,18,138,179,138,18,0,0,9,82,69,6,62,164,73,42,43,4,0,5,123,124,6,0,0,49,84,12,0,0, -1,47,50,2,0,0,0,6,38,14,125,147,13,3,66,69,77,48,0,81,243,250,250,248,243,81,46,175,176,98,197,250,230,50,0,0,0,0,0,0,0,0,10,34,38,84,52,17, -4,42,40,54,82,13,0,69,234,249,203,100,148,22,0,0,1,47,117,141,140,83,0,8,37,14,33,19,0,0,0,0,0,0,10,79,102,187,249,230,54,0,0,0,19,36,3,0, -0,0,20,138,179,138,18,0,0,9,82,71,3,0,0,64,174,78,12,38,11,123,124,6,0,0,0,0,58,86,12,0,19,203,248,203,18,0,24,3,6,58,26,105,140,25,15,102, -87,0,0,0,0,2,70,64,3,45,175,176,60,17,82,96,77,187,248,126,0,0,0,0,0,10,34,38,88,30,0,33,49,9,10,33,55,82,65,159,126,248,248,248,217,155,22,0, -1,22,22,168,168,18,94,248,248,128,26,0,0,0,0,0,0,0,90,248,250,158,90,43,2,0,0,19,36,3,0,0,0,0,20,138,179,138,18,0,0,9,82,71,3,0,0,64, -174,78,12,38,11,123,124,6,0,0,0,0,58,86,12,0,1,22,4,0,0,0,24,3,6,58,26,105,140,25,15,102,87,0,81,243,248,248,250,246,83,45,175,176,60,17,82,192, -250,231,50,0,0,0,0,0,0,10,34,38,88,30,0,33,49,9,10,33,55,82,79,234,249,203,18,0,95,149,22,0,1,22,22,168,168,18,0,0,8,58,26,0,0,0,0,0, -0,0,0,10,79,102,187,249,230,54,0,19,36,3,0,0,52,14,131,179,138,18,0,0,9,82,71,2,0,0,6,34,69,163,69,18,141,127,6,0,0,0,0,0,11,78,84,29, -198,248,203,18,0,1,62,69,31,21,34,12,103,156,97,48,64,69,3,0,0,0,0,16,66,174,176,62,0,0,11,78,96,83,95,0,0,0,0,0,10,34,38,88,30,0,6,34, -39,21,0,13,33,98,190,61,18,223,248,249,109,111,149,23,0,23,147,81,81,147,22,96,249,249,112,12,0,0,0,0,0,90,248,248,100,79,102,90,43,1,18,36,3,0,0,11, -52,14,131,179,138,18,0,0,9,82,71,2,0,0,6,34,69,163,69,18,141,127,6,0,0,0,0,0,11,78,84,12,0,0,0,0,0,1,62,69,31,21,34,12,103,156,97,48, -64,128,243,248,248,248,243,92,66,174,176,62,0,0,11,78,192,250,231,50,0,0,0,0,10,34,38,88,30,0,6,34,39,21,0,13,33,109,241,249,203,18,16,40,17,111,149,23, -0,23,147,81,81,147,22,3,34,23,34,12,0,0,0,0,0,0,0,0,10,79,102,187,249,230,68,36,3,0,0,11,38,3,64,131,18,0,0,9,82,71,2,0,0,6,38,13, -0,61,151,140,122,42,6,0,0,0,0,0,0,13,90,217,248,203,18,0,0,0,5,86,76,0,7,34,24,142,169,22,2,70,70,3,0,0,0,43,175,176,63,0,0,0,7,59, -83,102,76,8,0,0,0,10,34,38,88,30,0,6,38,13,0,33,24,0,65,171,94,94,209,248,228,249,248,102,108,152,54,141,88,0,0,88,149,55,106,248,248,115,13,0,0,0, -90,248,248,94,0,10,79,102,89,50,32,2,0,0,10,62,38,3,64,131,18,0,0,9,82,71,2,0,0,6,38,13,0,61,151,140,122,42,6,0,0,0,0,0,0,13,78,84, -12,0,0,0,0,0,5,86,76,0,7,34,24,142,169,22,83,246,250,248,248,243,81,43,175,176,63,0,0,0,7,59,83,194,250,231,54,0,0,10,34,38,88,30,0,6,38,13, -0,33,24,0,78,237,250,220,28,11,85,50,0,18,108,152,54,141,88,0,0,88,149,55,19,0,8,39,13,0,0,0,0,0,0,0,0,10,79,102,186,249,233,56,0,0,10,62, -0,0,0,1,0,0,9,82,71,2,0,0,6,38,14,0,0,1,142,186,72,14,35,6,0,0,0,0,0,18,201,250,220,29,0,0,0,3,34,19,67,70,0,16,99,56,88,148, -22,3,70,71,6,0,46,175,176,66,31,6,0,10,62,35,13,82,102,77,9,0,10,33,38,88,30,0,6,38,14,0,0,1,33,73,159,60,46,217,250,213,58,94,248,248,118,157, -186,95,0,0,0,3,112,156,22,94,248,248,115,13,0,90,248,248,94,4,6,0,10,77,109,146,49,2,0,10,62,37,0,0,0,1,0,0,9,82,71,2,0,0,6,38,14,0, -0,1,142,186,72,14,35,6,0,0,0,0,0,0,13,78,84,12,0,0,0,3,34,19,67,70,0,16,99,56,88,182,244,248,250,250,243,81,46,175,176,66,31,6,0,10,62,35, -13,82,194,250,231,54,10,33,38,88,30,0,6,38,14,0,0,1,33,86,234,249,209,67,79,80,47,0,0,0,43,157,186,95,0,0,0,3,112,156,22,0,0,7,39,13,0,0, -0,0,0,4,6,0,10,77,109,210,249,230,54,10,62,37,0,0,0,0,0,9,82,71,2,0,0,6,38,14,0,0,5,123,116,69,161,74,13,38,6,0,0,0,18,198,248,206, -90,84,12,0,3,36,19,0,3,66,69,75,51,32,12,88,148,22,3,70,75,51,175,176,62,0,13,34,16,60,37,0,79,128,92,102,76,19,30,38,88,30,0,6,38,14,0,0, -0,0,56,171,69,22,209,249,216,103,10,0,94,249,251,191,143,137,22,0,3,36,19,88,148,22,94,248,248,115,98,248,248,94,0,7,38,10,0,25,95,176,169,45,14,60,37,0, -0,0,0,0,0,9,82,71,2,0,0,6,38,14,0,0,5,123,116,69,161,74,13,38,6,0,0,0,0,0,0,13,78,84,12,0,3,36,19,0,3,66,69,75,51,32,89,247, -252,249,248,246,132,51,175,176,62,0,13,34,16,60,37,0,79,128,92,191,250,232,77,38,88,30,0,6,38,14,0,0,0,0,69,237,249,203,26,41,94,94,10,0,0,30,101,156, -143,137,22,0,3,36,19,88,148,22,0,0,7,39,13,0,0,0,0,7,38,10,0,25,95,176,221,249,231,98,37,0,0,0,0,0,9,82,71,2,0,0,6,38,14,0,0,5, -123,124,6,1,61,165,74,14,38,6,0,18,198,248,203,18,13,78,84,16,32,19,0,0,0,15,102,87,0,5,38,13,88,148,23,0,85,176,176,60,0,0,0,20,73,38,0,74, -178,179,63,80,102,87,44,84,30,0,6,38,14,0,0,0,0,55,159,51,52,211,248,214,77,53,81,11,27,160,252,250,102,111,149,24,36,19,0,0,88,148,22,94,248,248,249,248, -94,0,0,0,10,35,24,29,15,82,175,168,74,35,0,0,0,0,0,0,9,82,71,2,0,0,6,38,14,0,0,5,123,124,6,1,61,165,74,14,38,6,0,0,0,0,0,0, -13,78,84,16,32,19,0,0,0,15,102,87,0,85,245,248,250,252,244,81,85,176,176,60,0,0,0,20,73,38,0,74,178,179,63,80,191,250,234,120,30,0,6,38,14,0,0,0, -0,69,234,249,210,36,11,85,67,53,81,11,27,105,161,87,19,111,149,24,36,19,0,0,88,148,22,0,0,7,38,13,0,0,0,0,10,35,24,29,15,82,175,220,250,234,50,0, -0,0,0,9,82,71,2,0,0,6,38,14,0,0,5,123,124,6,0,0,0,60,159,75,14,38,23,198,249,203,18,0,0,12,75,96,27,0,0,0,13,82,48,64,69,2,6,39, -14,88,145,69,168,176,75,7,0,0,10,59,43,32,78,178,178,74,0,20,90,102,101,36,0,6,38,14,0,0,0,0,55,159,50,22,207,249,216,59,11,32,52,84,103,160,150,248, -248,101,110,162,38,0,0,0,0,88,148,22,150,248,248,166,12,0,0,0,0,28,57,10,0,8,83,175,170,45,2,0,0,0,0,9,82,71,2,0,0,6,38,14,0,0,5,123, -124,6,0,0,0,60,159,75,14,38,5,0,22,2,0,0,0,12,75,96,27,0,0,0,13,82,48,64,128,243,248,249,248,247,180,69,168,176,75,7,0,0,10,59,43,32,78,178, -178,74,0,20,90,191,251,234,54,6,38,14,0,0,0,0,69,234,249,203,18,39,90,47,11,32,52,84,103,160,88,0,0,18,110,162,38,0,0,0,0,88,148,22,0,0,7,38, -12,0,0,0,0,28,57,10,0,8,83,175,221,249,230,50,122,0,9,82,71,2,0,0,6,38,14,0,0,5,123,126,14,0,0,0,0,0,33,154,76,31,205,249,214,22,0,0, -0,1,38,81,82,12,0,13,84,50,0,2,70,70,2,6,38,11,112,209,175,52,9,37,8,9,62,37,0,84,190,180,74,0,10,29,46,102,102,73,16,34,14,0,0,0,0,58, -162,50,22,207,248,214,62,0,0,10,50,113,189,96,0,94,248,248,119,118,148,22,0,0,0,0,88,186,249,248,248,248,116,12,0,0,24,30,11,38,8,6,60,91,175,169,47,2, -0,0,9,82,71,2,0,0,6,38,14,0,0,5,123,126,14,0,0,0,0,0,33,154,76,14,32,44,53,4,0,0,0,1,38,81,82,12,0,13,84,50,0,83,246,250,248,248, -245,88,112,209,175,52,9,37,8,9,62,37,0,84,190,180,74,0,10,29,46,102,191,250,235,81,14,0,0,0,0,72,235,249,203,18,12,83,50,0,0,10,50,113,189,96,0,0, -0,1,45,118,148,22,0,0,0,0,88,148,22,0,0,12,41,12,0,0,24,30,11,38,8,6,60,91,175,221,249,230,248,95,82,70,2,0,0,6,38,14,0,0,5,123,124,21, -61,15,0,36,72,9,0,30,161,216,249,217,27,0,0,0,3,36,15,10,78,81,26,80,50,0,0,0,3,70,70,1,2,66,168,190,160,20,0,8,38,61,35,0,74,178,182,100, -2,9,33,38,84,39,76,102,90,20,0,0,0,0,55,165,99,36,207,248,214,62,0,0,0,24,111,178,124,81,13,0,96,249,248,100,111,149,22,0,0,0,90,250,252,105,94,249, -250,115,10,21,33,1,0,8,38,61,32,11,82,175,169,47,0,8,82,70,2,0,0,6,38,14,0,0,5,123,124,21,61,15,0,36,72,9,0,30,154,77,49,69,10,0,0,0, -3,36,15,10,78,81,26,80,50,0,81,243,248,250,250,243,82,66,168,190,160,20,0,8,38,61,35,0,74,178,182,100,2,9,33,38,84,39,76,191,250,236,54,0,0,0,69,235, -251,206,18,13,83,50,0,0,0,24,111,178,124,81,13,0,3,36,16,16,111,149,22,0,0,0,0,86,141,16,0,43,76,39,10,21,33,1,0,8,38,61,32,11,82,175,221,249, -249,250,134,2,0,0,6,38,14,0,0,5,123,124,6,0,30,63,16,72,102,78,8,18,205,252,227,34,35,6,0,3,36,19,0,0,10,77,102,68,37,0,0,0,0,3,69,64, -46,174,175,64,86,148,22,8,61,56,7,74,178,178,74,10,38,33,37,88,30,0,16,92,102,77,10,0,0,55,159,48,49,219,248,212,98,16,0,0,0,80,174,98,31,55,81,17, -32,106,248,248,102,112,149,22,0,90,248,248,142,136,22,98,250,250,121,36,0,0,0,8,61,56,7,0,10,82,175,168,50,77,69,2,0,0,6,38,14,0,0,5,123,124,6,0, -30,63,16,72,102,78,8,0,30,171,115,17,35,6,0,3,36,19,0,0,10,77,102,68,37,5,217,248,248,248,246,124,46,174,175,64,86,148,22,8,61,56,7,74,178,178,74,10, -38,33,37,88,30,0,16,92,188,250,235,54,0,69,234,249,209,76,21,76,88,16,0,0,0,80,174,98,31,55,81,17,32,19,0,0,19,112,149,22,0,0,0,0,76,136,22,6, -67,73,48,36,0,0,0,8,61,56,7,0,10,82,175,215,205,250,248,90,0,6,38,14,0,0,5,123,124,6,0,0,0,28,57,56,90,102,88,200,249,219,162,79,14,36,9,34, -19,0,0,0,10,81,88,104,159,53,0,0,0,0,0,84,175,174,57,31,14,88,152,79,35,9,101,181,178,74,0,6,37,56,86,29,0,6,34,23,78,102,78,10,55,159,48,22, -207,249,209,83,43,5,0,0,64,170,90,0,13,32,55,95,28,0,94,248,248,102,112,149,105,248,248,94,0,85,147,22,95,250,250,114,12,0,10,62,35,9,38,10,0,10,80,175, -175,87,4,0,0,6,38,14,0,0,5,123,124,6,0,0,0,28,57,56,90,102,75,11,43,77,155,79,14,36,9,34,19,0,0,0,10,81,88,104,159,53,27,221,248,243,81,84, -175,174,57,31,14,88,152,79,35,9,101,181,178,74,0,6,37,56,86,29,0,6,34,23,78,188,250,235,110,234,249,203,18,27,62,73,43,5,0,0,64,170,90,0,13,32,55,95, -28,0,0,0,0,19,112,149,22,0,0,0,0,85,147,22,1,76,85,37,12,0,10,62,35,9,38,10,0,10,80,175,175,200,249,248,93,38,14,0,0,5,123,124,6,0,0,0, -0,1,59,73,30,89,221,250,214,21,29,152,79,14,58,21,0,0,0,13,84,48,12,77,120,162,52,0,0,0,45,172,175,90,0,4,22,11,128,163,23,69,181,190,81,0,11,34, -34,90,55,1,5,38,14,0,11,80,102,117,163,48,22,207,248,194,70,74,17,0,1,64,171,91,0,0,0,13,52,68,81,13,0,94,248,248,102,163,252,249,94,0,0,0,88,148, -42,113,250,250,105,9,62,37,0,0,10,39,10,0,19,105,175,168,46,1,5,38,14,0,0,5,123,124,6,0,0,0,0,1,59,73,30,76,102,88,53,3,29,152,79,14,58,21, -0,0,0,13,84,48,12,77,120,162,52,27,217,81,45,172,175,90,0,4,22,11,128,163,23,69,181,190,81,0,11,34,34,90,55,1,5,38,14,0,11,80,188,251,252,249,203,18, -0,1,59,74,17,0,1,64,171,91,0,0,0,13,52,68,81,13,0,0,0,0,19,112,149,22,0,0,0,0,88,148,42,30,66,76,23,9,62,37,0,0,10,39,10,0,19,105, -80,175,201,249,249,98,0,0,5,123,124,6,0,0,0,0,3,50,44,28,68,204,250,224,86,5,0,29,153,100,28,32,6,0,13,84,50,0,0,13,77,119,162,53,0,46,175,175, -56,64,69,0,6,59,36,81,156,173,175,81,35,16,30,33,84,28,8,36,36,11,0,0,0,10,117,197,114,31,207,248,195,61,44,28,59,16,58,170,91,0,0,0,3,31,27,30, -55,82,13,0,94,248,248,248,251,188,22,0,0,0,0,102,162,22,96,250,250,126,35,0,0,0,0,10,33,16,76,68,80,175,169,47,32,12,0,0,5,123,124,6,0,0,0,0, -3,50,44,28,54,28,89,102,92,22,0,29,153,100,28,32,6,0,13,84,50,0,0,13,77,119,162,53,5,46,175,175,56,64,69,0,6,59,36,81,156,173,175,81,35,16,30,33, -84,28,8,36,36,11,0,0,0,10,127,249,251,246,69,0,3,50,44,28,59,16,58,170,91,0,0,0,3,31,27,30,55,82,13,0,0,0,0,19,110,149,22,0,0,0,0,102, -162,22,2,66,68,55,35,0,0,0,0,10,33,16,76,68,9,82,175,202,249,248,105,5,123,124,6,0,0,0,0,4,52,46,1,18,204,250,214,92,102,72,5,0,61,160,80,13, -34,20,83,50,0,0,0,0,16,77,118,158,83,169,175,55,0,2,67,70,55,33,0,69,179,179,86,0,16,52,40,81,25,0,6,42,38,20,23,0,0,55,163,114,90,208,248,195, -63,46,1,0,26,89,169,88,0,0,0,3,36,18,0,12,32,55,82,13,0,150,248,248,157,111,149,22,0,0,24,31,88,148,22,102,251,250,90,0,0,0,0,0,14,93,72,0, -9,82,175,171,49,17,24,5,123,124,6,0,0,0,0,4,52,46,1,0,26,69,52,99,235,214,22,0,61,160,80,13,34,20,83,50,0,0,0,0,12,77,118,158,83,169,175,55, -0,2,67,70,55,33,0,69,179,179,86,0,16,52,40,81,25,0,6,42,38,20,23,0,0,69,235,251,236,248,239,57,52,46,1,0,26,89,169,88,0,0,0,3,36,18,0,12, -32,55,82,13,0,0,0,0,18,111,149,22,0,0,24,31,88,148,22,12,96,82,1,0,0,0,0,0,14,93,72,0,0,10,83,175,201,250,248,169,124,6,0,0,0,0,4,53, -48,2,18,198,249,215,66,28,81,102,70,34,17,28,152,81,18,94,52,0,0,0,0,81,217,38,73,133,208,182,52,0,0,0,12,96,83,1,74,178,173,123,135,32,31,42,99,35, -0,0,14,9,26,58,8,0,55,159,48,30,208,248,195,64,48,2,0,2,62,173,124,15,0,0,3,36,19,0,0,0,13,33,55,82,98,248,248,248,248,102,112,150,28,24,33,1, -0,88,152,76,117,250,250,92,0,0,0,9,80,72,36,9,0,10,83,175,169,61,7,123,124,6,0,0,0,0,4,53,48,2,0,2,44,59,52,44,216,251,214,50,17,28,152,81, -18,94,52,0,0,0,0,0,0,12,73,133,208,182,52,0,0,0,12,96,83,1,74,178,173,123,135,32,31,42,99,35,0,0,14,9,26,58,8,0,69,234,249,205,22,140,248,242, -95,2,0,2,62,173,124,15,0,0,3,36,19,0,0,0,13,33,55,82,13,0,0,0,0,19,112,150,28,24,33,1,0,88,152,76,36,66,69,3,0,0,0,9,80,72,36,9, -10,0,8,87,173,197,252,252,94,0,0,0,0,4,54,47,1,18,198,249,213,21,25,59,30,82,102,75,2,0,28,152,82,32,35,6,0,0,81,243,248,221,88,184,170,168,50,0, -0,10,60,36,65,123,179,178,72,0,94,162,57,86,37,30,7,0,0,17,33,16,36,60,159,48,22,207,248,195,65,47,1,0,2,66,170,90,25,64,16,1,36,19,0,0,0,0, -0,13,33,126,250,248,94,94,248,248,102,109,88,32,1,0,0,10,129,164,22,96,250,250,163,95,14,82,70,1,8,39,10,0,8,87,173,163,138,122,6,0,0,0,0,4,54,47, -1,0,2,49,51,3,25,59,46,216,251,215,20,0,28,152,82,32,35,6,0,0,0,0,0,0,68,184,170,168,50,0,0,10,60,36,65,123,179,178,72,0,94,162,57,86,37,30, -7,0,0,17,33,16,36,73,234,249,203,18,0,4,164,249,239,58,2,66,170,90,25,64,16,1,36,19,0,0,0,0,0,13,33,55,82,13,0,0,0,0,18,109,88,32,1,0, -0,10,129,164,22,2,70,72,114,95,14,82,70,1,8,39,39,8,13,38,84,205,221,249,248,90,0,0,5,54,46,1,18,199,249,213,21,0,0,26,57,48,86,102,68,4,0,27, -152,82,14,38,6,81,243,248,248,250,245,157,87,113,162,52,10,62,37,0,75,199,199,76,0,10,33,113,185,50,0,7,37,8,17,36,3,0,66,173,53,22,207,248,195,65,46,1, -0,4,67,170,90,0,0,26,61,42,15,0,0,0,0,0,0,0,98,249,250,146,13,0,94,248,248,112,55,2,0,0,10,62,37,88,148,20,96,252,253,199,94,70,2,0,0,10, -39,8,13,38,84,205,201,51,2,0,0,0,5,54,46,1,0,4,49,51,3,0,0,26,57,63,217,251,213,22,0,27,152,82,14,38,6,0,0,0,0,60,190,154,87,113,162,52, -10,62,37,0,75,199,199,76,0,10,33,113,185,50,0,7,37,8,17,36,3,0,79,237,249,203,18,0,5,54,46,140,248,239,110,170,90,0,0,26,61,42,15,0,0,0,0,0, -0,0,13,33,55,82,13,0,0,0,0,35,55,2,0,0,10,62,37,88,148,20,3,150,199,169,94,70,2,0,0,10,8,46,38,5,124,158,170,199,249,248,90,5,54,46,0,18, -198,249,213,21,0,0,0,0,48,62,32,83,102,67,4,0,27,151,83,14,107,243,248,248,250,252,187,50,14,77,117,167,98,37,0,74,189,185,121,67,14,31,38,88,108,148,22,0, -7,46,38,2,0,55,159,59,57,208,248,195,66,46,0,0,0,61,170,90,0,0,0,0,48,66,15,0,0,0,0,1,55,94,248,248,115,55,82,13,0,94,249,249,101,35,1,9, -62,37,0,0,111,145,117,207,253,251,133,1,0,0,0,0,8,46,38,5,124,158,170,167,47,3,0,5,54,46,0,0,0,43,51,3,0,0,0,0,48,62,48,216,251,213,21,0, -27,151,83,14,38,6,0,0,60,190,155,50,14,77,117,167,98,37,0,74,189,185,121,67,14,31,38,88,108,148,22,0,7,46,38,2,0,69,234,249,211,24,0,5,54,46,0,0, -135,250,250,128,0,0,0,0,48,66,15,0,0,0,0,1,55,6,0,13,33,55,82,13,0,0,24,29,17,35,1,9,62,37,0,0,111,145,117,179,187,124,66,1,0,0,0,0, -17,38,40,128,124,12,80,176,201,249,248,125,45,0,18,198,248,206,22,0,0,0,3,36,15,24,59,34,85,102,66,3,0,26,151,138,244,249,248,250,252,187,52,0,0,10,75,133, -173,48,69,178,185,118,21,69,82,40,86,30,0,88,148,22,16,38,36,10,55,159,48,22,210,249,197,65,45,0,0,0,22,154,91,0,0,0,3,36,15,24,64,18,0,0,0,83, -206,251,248,94,13,33,55,82,12,20,115,248,248,100,36,58,36,0,0,0,24,173,185,160,158,250,250,91,0,0,0,0,17,38,40,128,124,12,80,176,169,46,9,54,45,0,0,0, -0,14,4,0,0,0,3,36,15,24,59,49,217,251,213,21,0,26,151,84,14,37,4,59,190,155,52,0,0,10,75,133,173,48,69,178,185,118,21,69,82,40,86,30,0,88,148,22, -16,38,36,10,69,234,249,203,31,35,12,54,45,0,0,0,22,207,250,239,58,0,3,36,15,24,64,18,0,0,0,83,179,110,3,0,13,33,55,82,12,20,33,1,0,16,36,58, -36,0,0,0,24,173,185,160,101,93,65,2,0,0,0,0,36,6,127,142,10,0,10,82,175,200,250,249,90,18,198,248,198,18,0,0,0,3,33,19,0,0,27,59,35,86,102,64, -2,0,99,250,250,248,251,252,187,52,0,0,0,8,58,83,112,166,176,173,73,20,61,43,77,102,31,0,0,0,88,154,52,1,9,83,161,48,22,207,248,198,79,44,0,0,0,22, -148,88,0,0,0,3,33,19,0,0,27,64,18,0,0,122,252,253,168,3,0,13,33,54,89,39,0,94,248,248,132,54,0,0,0,5,114,185,189,180,77,100,250,250,92,0,0,19, -36,6,127,142,10,0,10,82,175,168,71,41,0,0,0,0,0,0,0,0,0,3,33,19,0,0,27,59,51,217,251,212,20,0,26,151,84,10,79,190,155,52,0,0,0,8,58,83, -112,166,176,173,73,20,61,43,77,102,31,0,0,0,88,154,52,1,9,95,234,249,203,18,0,16,69,44,0,0,0,22,148,88,135,248,239,65,33,19,0,0,27,64,18,0,0,48, -164,185,117,3,0,13,33,54,89,39,0,0,0,8,64,54,0,0,0,5,114,185,189,180,77,10,68,70,3,0,0,19,8,123,124,9,2,0,0,10,84,175,202,249,248,216,248,198, -18,0,0,0,3,36,18,0,0,0,0,26,59,36,86,102,63,82,243,249,252,252,251,187,54,0,0,0,10,62,34,12,125,201,183,104,0,7,44,71,82,74,64,3,0,0,19,111, -148,20,51,160,49,22,207,248,196,64,49,32,6,0,22,148,88,0,0,0,3,36,18,0,0,0,0,26,64,18,90,248,249,206,204,117,3,0,10,44,83,170,74,1,100,250,249,100, -35,3,6,116,179,162,108,146,157,22,96,250,250,91,17,36,8,123,124,9,2,0,0,10,84,175,172,45,2,0,0,0,0,0,0,0,3,36,18,0,0,0,0,26,59,52,217,251, -212,20,0,25,142,119,183,154,54,0,0,0,10,62,34,12,125,201,183,104,0,7,44,71,82,74,64,3,0,0,19,111,148,20,66,234,249,203,18,0,8,53,49,32,6,0,22,148, -88,0,0,135,248,241,77,0,0,0,0,26,64,18,0,0,41,179,204,117,3,0,10,44,83,170,74,1,10,62,34,15,35,3,6,116,179,162,108,146,157,22,3,70,70,2,17,36, -123,124,6,0,0,0,0,0,37,95,175,205,249,248,216,18,0,0,0,3,36,19,0,0,0,0,0,0,26,59,38,87,151,246,248,248,250,253,205,58,30,6,0,10,62,37,0,74, -182,199,155,147,56,33,38,90,72,21,66,70,3,0,21,3,81,153,148,44,22,207,248,194,50,45,0,13,38,28,148,88,0,0,0,3,36,19,0,0,0,0,0,0,26,132,248,248, -94,41,180,204,117,4,21,55,154,195,169,27,58,117,248,248,102,41,119,179,162,107,66,22,128,157,22,96,250,250,104,7,123,124,6,0,0,0,0,0,37,95,175,169,48,3,0,0, -0,0,0,3,36,19,0,0,0,0,0,0,26,59,53,218,251,212,19,0,79,209,181,58,30,6,0,10,62,37,0,74,182,199,155,147,56,33,38,90,72,21,66,70,3,0,21,3, -81,160,231,249,203,18,0,0,38,45,0,13,38,28,148,88,0,0,0,3,148,248,239,63,0,0,0,0,26,64,18,0,0,41,180,204,117,4,21,55,154,195,169,27,58,37,0,0, -19,41,119,179,162,107,66,22,128,157,22,3,69,70,21,7,124,6,0,0,0,0,0,0,1,14,95,237,253,249,248,90,0,0,3,36,19,0,0,0,0,0,0,0,0,26,58,108, -247,251,250,250,251,190,160,85,13,34,16,60,37,0,74,178,178,82,76,118,173,82,87,28,18,61,22,66,70,3,0,0,50,174,150,37,207,248,194,14,4,0,0,0,35,164,92,0, -0,0,3,36,19,0,0,0,0,0,0,0,90,249,250,106,0,0,41,180,203,125,57,140,183,152,74,102,43,0,94,248,248,173,189,163,104,70,2,0,22,130,157,22,96,250,250,170, -124,6,0,0,0,0,0,0,1,14,82,175,170,48,4,0,0,0,3,36,19,0,0,0,0,0,0,0,0,26,58,54,218,251,211,74,186,160,160,85,13,34,16,60,37,0,74,178, -178,82,76,118,173,82,87,28,18,61,22,66,70,3,0,0,64,237,252,207,18,0,0,0,4,0,0,0,35,164,92,0,0,0,3,36,19,130,248,239,63,0,0,0,0,26,64,18, -0,0,41,180,203,125,57,140,183,152,74,102,43,0,0,0,7,129,189,163,104,70,2,0,22,130,157,22,3,70,72,124,9,0,0,0,0,0,0,0,0,18,200,250,233,183,249,248, -90,3,36,19,0,0,0,0,0,0,0,0,0,0,98,246,249,250,251,252,186,52,24,150,87,20,73,38,0,74,178,178,74,0,19,83,122,189,73,0,0,22,61,22,66,70,3,55, -157,44,96,235,249,194,14,0,0,0,0,22,148,97,38,6,0,3,36,19,0,0,0,0,0,0,0,90,248,248,110,64,19,0,0,40,181,207,170,179,134,34,66,70,78,13,0,99, -252,253,198,114,69,2,0,0,0,22,130,157,20,97,253,253,96,0,0,0,0,0,0,0,0,0,10,85,159,132,41,6,0,3,36,19,0,0,0,0,0,0,0,0,0,0,25,58, -55,217,251,241,161,52,24,150,87,20,73,38,0,74,178,178,74,0,19,83,122,189,73,0,0,22,61,22,66,70,3,69,233,249,219,156,22,0,0,0,0,0,0,22,148,97,38,6, -0,3,36,19,0,0,130,248,239,68,0,0,0,0,26,64,19,0,0,40,181,207,170,179,134,34,66,70,78,13,0,8,121,179,165,114,69,2,0,0,0,22,130,157,20,4,159,160, -70,3,0,0,0,0,0,0,18,198,248,200,27,122,176,249,248,112,19,0,0,0,0,0,0,0,0,0,0,81,243,249,250,251,252,187,81,0,0,24,154,114,43,32,78,178,178,74, -0,10,30,46,102,121,161,52,0,0,22,61,22,66,109,160,48,22,207,250,229,31,0,0,0,0,22,148,88,0,14,36,9,34,19,0,0,0,0,0,0,0,90,248,248,94,0,25, -64,19,0,23,79,193,204,168,28,59,42,30,55,82,21,121,207,252,251,139,32,2,0,0,0,0,22,128,145,121,169,250,250,92,0,0,0,0,0,0,0,0,0,8,9,122,130,41, -9,34,19,0,0,0,0,0,0,0,0,0,0,0,0,25,53,96,241,252,216,18,0,24,154,114,43,32,78,178,178,74,0,10,30,46,102,121,161,52,0,0,22,61,22,66,120,234, -249,203,18,88,148,22,0,0,0,0,22,148,88,0,14,36,9,34,19,0,0,0,0,130,248,239,68,0,0,0,0,25,64,19,0,23,79,193,204,168,28,59,42,30,55,82,21,121, -179,160,101,75,32,2,0,0,0,0,22,128,145,121,120,74,70,70,3,0,0,0,0,18,198,248,198,18,0,5,122,176,250,248,90,0,0,0,0,0,0,0,0,0,81,244,248,248, -250,252,185,96,102,56,0,9,79,64,0,84,190,180,74,0,10,34,39,83,40,74,119,162,52,0,0,22,61,72,183,102,23,207,248,194,95,148,22,0,0,22,148,88,0,0,0,14, -58,21,0,0,0,0,0,0,0,90,248,248,94,16,4,0,25,60,35,48,139,179,192,203,145,37,0,12,33,62,166,182,158,159,250,248,101,36,3,0,0,0,0,22,178,185,27,96, -250,250,92,0,0,0,0,0,0,0,0,0,0,5,122,129,62,21,0,0,0,0,0,0,0,0,0,0,0,16,3,0,74,191,160,219,251,211,18,9,79,64,0,84,190,180,74,0, -10,34,39,83,40,74,119,162,52,0,0,22,61,85,239,251,203,18,0,0,88,148,22,0,0,22,148,88,0,0,0,14,58,21,0,0,0,0,0,0,126,248,239,68,0,16,4,0, -25,60,35,48,139,179,192,203,145,37,0,12,33,62,166,182,158,104,70,1,16,59,172,18,0,0,0,22,178,185,27,3,3,70,70,3,0,0,18,198,248,198,18,0,0,0,8,139, -180,249,248,90,0,0,0,0,0,0,11,92,243,248,249,250,252,187,78,45,91,102,59,55,36,0,74,177,182,101,4,8,34,39,87,30,0,13,78,120,163,51,0,0,71,182,66,75, -219,248,194,9,0,88,147,18,18,147,88,0,0,0,3,32,28,34,6,0,0,0,0,0,90,248,248,104,0,19,36,3,0,38,90,154,179,127,59,191,207,120,5,0,19,139,195,185, -99,67,96,248,248,102,36,5,0,0,5,120,125,128,154,22,96,250,250,92,0,0,0,0,0,0,0,0,0,0,8,139,136,38,6,0,0,0,0,0,0,0,11,16,0,18,30,62, -189,155,78,60,218,251,211,69,36,0,74,177,182,101,4,8,34,39,87,30,0,13,78,120,163,51,0,0,85,239,249,215,76,2,0,0,0,88,147,18,18,147,88,0,0,0,3,32, -28,34,6,0,0,0,0,0,0,126,248,240,68,19,36,3,0,38,90,154,179,127,59,191,207,120,5,0,19,139,195,185,99,67,2,0,0,177,249,199,18,0,5,120,125,128,154,22, -19,3,70,70,3,18,198,248,198,18,0,0,0,3,36,24,118,168,249,248,90,0,0,0,0,0,85,245,248,248,250,252,185,49,22,57,46,92,102,72,0,66,165,165,71,12,40,34, -38,87,30,0,0,0,12,66,116,153,38,41,149,64,79,211,250,210,12,0,0,0,84,135,135,84,0,0,0,3,36,19,0,14,38,6,0,0,0,90,248,248,97,36,19,0,18,32, -24,46,149,190,135,21,61,65,171,197,111,16,108,162,160,109,102,15,0,94,248,248,102,21,0,6,109,120,4,22,128,146,19,96,250,250,92,0,0,0,0,0,0,0,0,3,36,24, -118,117,43,6,0,0,0,0,0,0,5,36,18,0,68,184,153,49,22,57,60,218,251,214,18,66,165,165,71,12,40,34,38,87,30,0,0,0,12,66,116,153,38,56,232,249,216,38, -66,69,3,0,0,0,84,135,135,84,0,0,0,3,36,19,0,14,38,6,0,0,0,0,0,0,129,249,240,72,18,32,24,46,149,190,135,21,61,65,171,197,111,16,108,162,160,109, -102,15,0,0,0,18,202,248,198,23,109,120,4,22,128,146,152,21,3,70,83,199,248,198,18,0,0,0,3,36,19,0,6,109,172,249,248,90,0,0,0,81,243,248,249,250,252,181, -68,0,0,22,56,69,96,102,109,165,165,66,0,8,39,57,85,28,0,0,0,0,0,0,50,109,157,151,34,22,211,250,198,73,70,3,0,0,21,150,150,21,0,5,110,71,19,0, -0,0,14,38,6,0,90,248,248,94,0,3,36,18,0,35,74,142,168,133,69,62,34,0,34,169,195,161,154,135,98,81,54,80,13,0,94,248,248,90,5,118,111,6,0,0,22,121, -152,21,96,250,250,92,0,0,0,0,0,0,3,36,19,0,6,109,125,42,6,0,0,0,0,0,0,3,29,70,186,148,68,0,0,22,56,82,219,251,222,171,165,66,0,8,39,57, -85,28,0,0,0,0,0,0,50,109,164,232,249,203,38,59,18,66,70,3,0,0,21,150,150,21,0,5,110,71,19,0,0,0,14,38,6,0,0,0,0,0,0,128,249,240,72,35, -74,142,168,133,69,62,34,0,34,169,195,161,154,135,98,81,54,80,13,0,0,0,18,198,248,224,121,6,0,0,22,121,128,157,22,21,214,250,199,18,0,0,0,3,36,19,0,0, -0,5,125,176,249,248,90,0,81,243,248,248,250,252,186,49,14,34,2,7,63,66,48,140,209,193,74,0,10,33,41,88,55,2,0,0,0,0,0,0,0,90,191,164,65,207,248,198, -64,21,66,70,3,27,147,81,81,144,34,119,142,31,0,0,0,0,0,14,38,94,248,248,94,0,0,0,3,32,35,49,157,189,129,19,63,70,18,0,0,48,191,202,172,97,69,16, -31,56,83,11,0,94,248,248,169,123,6,0,0,0,0,22,128,157,22,96,250,250,92,0,0,0,0,3,36,19,0,0,0,5,125,130,42,6,0,0,0,0,0,0,61,191,154,49, -14,34,2,7,63,66,63,229,254,241,87,0,10,33,41,88,55,2,0,0,0,0,0,0,0,102,241,252,213,18,0,18,57,21,66,70,3,27,147,81,81,144,34,119,142,31,0,0, -0,0,0,14,38,6,0,0,0,0,0,0,124,249,241,107,157,189,129,19,63,70,18,0,0,48,191,202,172,97,69,16,31,56,83,11,0,0,0,23,225,252,199,18,0,0,0,22, -22,130,164,203,248,214,83,3,0,0,3,36,19,0,0,0,3,69,65,122,175,249,248,141,243,248,248,250,252,187,68,14,0,14,19,60,33,21,115,193,206,146,49,10,32,40,88,23, -10,38,5,4,9,0,0,0,55,158,83,128,237,249,194,9,21,61,22,66,70,118,91,0,0,85,180,141,20,0,0,0,0,0,0,0,99,249,248,94,0,22,56,6,0,23,76,157, -179,135,30,60,33,22,64,20,13,124,179,193,202,149,9,0,13,35,59,81,17,0,97,252,252,94,0,0,0,0,0,0,22,130,157,22,96,250,250,92,0,0,3,36,19,0,0,0, -3,69,65,122,129,42,6,0,0,15,14,59,190,155,68,14,0,14,19,60,33,21,115,198,244,252,209,27,32,40,88,23,10,38,5,4,9,0,0,0,69,233,250,226,168,52,0,0, -21,61,22,66,70,118,91,0,0,85,180,141,20,0,0,0,0,0,0,0,14,38,6,0,0,22,56,6,0,134,250,248,200,135,30,60,33,22,64,20,13,124,179,193,202,149,9,0, -13,35,59,81,17,0,5,123,134,199,248,198,18,0,0,0,0,38,227,252,203,21,70,70,2,1,36,19,0,0,0,3,70,71,5,5,122,175,249,248,248,248,251,252,187,52,3,34, -16,7,61,37,0,74,185,196,111,94,102,65,39,87,29,0,0,13,37,37,9,10,23,55,159,48,22,217,251,233,59,0,0,22,61,22,66,81,3,0,4,115,162,144,20,0,0,0, -0,0,0,90,248,248,116,3,9,80,102,54,18,55,153,189,135,17,61,37,0,0,24,74,142,179,145,116,183,194,122,6,0,11,34,70,82,27,132,173,248,248,90,0,0,0,0,0, -0,22,130,157,22,96,250,250,91,1,36,19,0,0,0,3,70,71,5,5,122,129,39,6,0,2,79,191,155,52,3,34,16,7,61,37,0,74,185,196,121,219,251,212,54,87,29,0, -0,13,37,37,9,10,23,69,234,249,203,65,120,163,52,0,0,22,61,22,66,81,3,0,4,115,162,144,20,0,0,0,0,0,0,0,0,14,35,3,9,80,102,54,18,55,202,253, -249,85,61,37,0,0,24,74,142,179,145,116,183,194,122,6,0,11,34,70,82,27,132,124,6,18,198,248,198,18,0,0,18,198,248,227,164,22,3,69,68,33,17,0,0,0,3,70, -70,3,0,0,5,165,250,249,248,250,252,187,60,0,0,1,36,65,36,0,74,178,178,90,56,56,96,100,93,26,0,0,0,4,44,40,13,37,64,159,48,22,207,248,206,123,163,52, -0,0,22,61,22,66,70,7,123,141,26,85,148,22,0,0,0,0,90,248,248,94,10,40,79,102,77,54,65,153,179,127,45,65,36,0,0,0,15,144,197,157,92,76,39,170,204,124, -6,4,42,37,61,173,135,6,94,248,248,90,0,0,0,0,0,0,22,130,157,22,96,250,250,112,17,0,0,0,3,70,70,3,0,0,5,122,129,42,4,60,190,155,60,0,0,1, -36,65,36,0,74,178,178,90,56,70,220,251,219,42,0,0,0,4,44,40,13,37,77,234,249,203,18,0,51,119,163,52,0,0,22,61,22,66,70,7,123,141,26,85,148,22,0,0, -0,0,0,0,0,0,10,40,79,102,77,54,65,153,179,187,249,246,98,0,0,0,15,144,197,157,92,76,39,170,204,124,6,4,42,37,61,173,135,6,0,0,18,198,248,198,18,0, -198,248,198,38,130,157,22,4,86,76,1,0,0,3,70,71,4,0,0,0,81,243,252,252,251,253,210,52,28,18,0,10,60,37,0,79,178,178,74,0,28,64,73,102,101,43,0,0, -6,38,11,19,61,65,159,48,22,207,248,194,9,51,119,163,52,0,0,22,61,22,69,159,141,23,0,0,88,148,22,0,1,90,248,248,94,0,8,82,102,78,31,53,167,185,124,19, -60,37,0,0,0,15,134,179,156,112,80,4,0,35,178,204,128,39,12,23,151,154,85,13,0,94,248,248,90,0,4,0,0,0,0,22,130,157,22,96,250,250,90,0,0,3,70,71, -4,0,0,0,0,5,122,122,88,188,155,52,28,18,0,10,60,37,0,79,178,178,74,0,28,64,86,221,251,208,18,0,6,38,11,19,61,78,234,249,203,18,0,0,0,51,119,163, -52,0,0,22,61,22,69,159,141,23,0,0,88,148,22,0,1,0,0,0,0,0,8,82,102,78,31,53,167,185,124,19,154,249,243,72,0,15,134,179,156,112,80,4,0,35,178,204, -128,39,12,23,151,154,85,13,0,0,0,18,198,248,199,18,248,198,18,0,22,129,158,48,19,67,70,1,1,70,70,4,44,22,0,81,243,248,248,252,253,252,250,90,2,32,24,58, -37,0,79,202,187,74,0,10,29,52,100,70,94,102,44,1,34,14,0,24,72,172,53,22,207,248,194,9,0,0,62,118,161,52,0,0,22,64,136,166,80,2,0,0,0,88,148,24, -120,249,248,94,0,10,79,102,80,51,56,154,180,139,34,58,37,0,0,0,15,135,179,148,91,80,60,19,0,0,34,177,208,129,20,132,135,36,55,82,13,0,94,248,248,90,30,19, -0,0,0,0,22,129,158,48,106,250,250,91,1,70,70,4,44,22,0,0,0,0,1,142,209,153,54,0,2,32,24,58,37,0,79,202,187,74,0,10,29,52,100,83,219,251,208,19, -34,14,0,24,85,237,249,203,18,0,0,0,0,0,62,118,161,52,0,0,22,64,136,166,80,2,0,0,0,88,148,24,46,22,0,0,0,10,79,102,80,51,56,154,180,139,34,58, -37,118,248,243,83,135,179,148,91,80,60,19,0,0,34,177,208,129,20,132,135,36,55,82,13,0,0,0,18,198,249,225,241,35,0,0,0,22,137,162,22,3,68,65,65,69,3,0, -24,64,94,243,248,248,250,251,211,185,249,248,90,11,72,44,0,74,178,188,138,28,6,33,40,84,46,54,58,99,102,46,3,0,0,57,159,60,58,208,248,194,9,0,0,0,1,58, -114,162,53,0,5,135,161,37,64,62,1,0,0,0,88,186,249,250,107,0,10,79,102,76,31,63,169,181,121,19,72,44,0,0,0,17,136,179,146,94,76,4,20,64,23,0,0,34, -177,203,166,116,3,14,34,55,82,13,0,94,248,248,92,36,19,0,0,0,0,22,137,162,22,96,250,250,132,69,3,0,24,64,20,0,0,0,59,184,190,144,34,6,0,11,72,44, -0,74,178,188,138,28,6,33,40,84,46,54,72,220,251,208,21,0,0,71,234,249,211,24,0,0,0,0,0,0,1,58,114,162,53,0,5,135,161,37,64,62,1,0,0,0,88,148, -44,64,20,0,10,79,102,76,31,63,169,181,121,19,72,44,0,0,118,249,249,202,146,94,76,4,20,64,23,0,0,34,177,203,166,116,3,14,34,55,82,13,0,0,0,102,248,249, -249,202,18,0,3,30,34,127,157,22,5,98,98,5,0,0,0,97,246,248,248,250,252,185,58,121,175,249,248,128,36,30,87,178,178,74,28,89,52,38,96,111,22,22,49,42,100,101, -42,2,57,159,48,22,210,249,196,9,0,0,0,0,0,0,62,120,158,53,115,140,39,58,26,21,0,0,0,0,90,250,252,121,60,28,77,102,78,33,58,157,183,139,24,59,36,30, -18,0,25,138,179,144,93,75,5,0,0,23,55,5,0,0,39,194,204,124,5,0,14,33,55,82,13,0,94,248,248,48,36,19,0,0,3,30,34,127,157,22,97,251,251,93,0,0, -0,23,64,18,0,60,193,230,152,121,129,39,16,59,36,30,87,178,178,74,28,89,52,38,96,111,22,22,49,58,220,251,207,20,71,234,249,203,31,38,6,0,0,0,0,0,0,0, -62,120,158,53,115,140,39,58,26,21,0,0,0,0,0,88,148,43,60,28,77,102,78,33,58,157,183,139,24,59,36,30,18,0,25,192,253,249,142,75,5,0,0,23,55,5,0,0, -39,194,204,124,5,0,14,33,55,82,13,0,90,248,248,217,199,249,202,19,36,19,0,22,128,158,81,66,65,68,3,0,81,243,249,250,250,252,187,50,0,5,122,178,250,249,90,76, -189,184,74,0,6,52,91,90,109,179,139,18,4,0,39,102,96,67,159,48,22,207,248,197,46,6,0,0,0,0,0,0,0,65,120,184,150,19,0,22,63,18,0,0,0,90,248,248, -150,148,50,98,102,76,14,53,157,179,119,27,73,38,0,2,36,19,93,179,144,93,74,4,0,0,0,0,4,0,0,5,115,125,171,204,126,7,0,13,33,55,82,13,0,94,126,0, -3,36,18,1,36,19,0,22,128,158,81,136,250,250,92,0,0,0,24,56,71,194,231,249,248,125,122,133,77,38,0,76,189,184,74,0,6,52,91,90,109,179,139,18,4,0,54,221, -251,216,235,249,203,18,0,14,38,6,0,0,0,0,0,0,0,65,120,184,150,19,0,22,63,18,0,0,0,0,0,0,88,148,50,98,102,76,14,53,157,179,119,27,73,38,0,2, -36,19,93,179,195,251,247,80,0,0,0,0,4,0,0,5,115,125,171,204,126,7,0,13,33,55,82,98,248,248,94,18,18,198,249,208,32,0,0,0,22,152,180,22,1,70,70,83, -243,248,248,250,252,186,40,0,0,0,15,153,185,249,250,205,179,100,16,8,33,38,89,91,49,139,179,138,18,0,0,40,83,159,48,22,207,248,194,9,14,38,6,0,0,0,0,0, -0,5,149,179,153,50,0,0,22,64,22,0,90,248,248,94,0,94,180,115,97,25,36,159,179,118,16,59,43,32,6,0,3,36,28,97,96,74,4,0,0,0,0,0,0,0,5,123, -124,1,31,176,204,127,7,0,13,33,55,82,13,0,0,0,0,2,34,45,15,0,0,0,22,152,180,22,95,250,250,92,0,0,0,74,194,231,249,248,248,248,103,153,143,37,75,178, -179,100,16,8,33,38,89,91,49,139,179,138,18,0,0,56,220,252,249,206,18,0,0,0,14,38,6,0,0,0,0,0,0,5,149,179,153,50,0,0,22,64,22,0,0,0,0,0, -0,94,180,115,97,25,36,159,179,118,16,59,43,32,6,0,3,36,28,97,96,155,248,243,77,0,0,0,0,0,5,123,124,1,31,176,204,127,7,0,13,33,126,250,248,94,0,0, -0,20,206,249,201,18,0,3,66,76,126,156,22,3,129,246,248,248,250,252,186,78,12,0,0,10,62,40,112,186,253,253,138,2,38,42,39,87,26,25,90,47,138,179,138,18,0,57, -159,48,22,207,248,194,9,8,0,14,38,6,0,0,0,0,5,124,139,71,115,162,52,0,0,22,64,104,248,248,94,0,10,79,155,180,50,84,165,179,117,16,62,37,0,14,38,6, -0,1,34,82,71,4,0,0,0,0,0,0,0,5,123,124,6,0,0,32,176,204,128,11,0,13,33,55,82,13,0,0,0,2,34,45,15,0,0,3,66,76,126,156,22,96,250,250, -92,0,60,194,231,250,248,248,248,192,69,40,112,146,183,179,74,2,38,42,39,87,26,25,90,47,138,179,138,18,0,71,235,249,248,202,18,0,0,8,0,14,38,6,0,0,0,0, -5,124,139,71,115,162,52,0,0,22,64,22,0,0,0,0,10,79,155,180,50,84,165,179,117,16,62,37,0,14,38,6,0,1,34,82,71,4,113,248,243,81,0,0,0,5,123,124, -6,0,0,32,176,204,128,11,0,98,249,250,146,13,0,0,3,36,34,198,249,202,19,70,70,2,20,130,158,96,243,250,250,250,252,187,40,24,59,13,8,62,37,0,74,179,210,251, -248,95,32,56,92,26,0,0,28,90,47,138,179,133,69,152,48,22,207,248,194,9,0,29,24,0,14,38,6,0,0,5,125,142,23,0,66,120,162,55,1,0,104,250,249,94,0,10, -79,102,79,88,143,166,197,123,14,62,37,0,0,0,14,38,4,6,78,87,18,0,0,5,0,0,0,0,2,118,123,6,0,0,0,0,32,176,204,143,26,0,13,33,55,82,13,0, -3,36,18,1,36,16,1,70,70,2,20,130,158,22,96,250,250,131,196,233,249,249,250,248,187,69,37,0,74,179,183,101,4,8,32,56,92,26,0,0,28,90,47,138,179,133,82,232, -249,206,202,248,198,18,0,29,24,0,14,38,6,0,0,5,125,142,23,0,66,120,162,55,1,0,22,64,23,0,0,10,79,102,79,88,143,166,197,123,14,62,37,0,0,0,14,38, -4,6,78,87,18,0,0,113,248,243,81,0,2,118,123,6,0,0,0,0,32,176,204,143,107,248,248,115,55,82,13,0,31,19,0,18,198,249,215,81,3,0,0,23,165,250,249,248, -251,252,187,42,0,0,25,59,60,34,0,74,177,171,140,169,249,249,115,84,52,13,0,0,0,28,90,48,132,179,179,60,22,207,248,194,9,0,0,1,33,24,0,14,38,6,5,123, -142,24,0,0,0,66,121,145,15,90,248,249,128,1,10,79,102,79,10,36,171,179,132,59,60,34,0,0,0,0,0,12,36,79,70,8,33,19,122,194,9,0,0,4,109,111,5,0, -0,0,0,0,0,32,176,204,144,26,0,13,33,55,81,17,31,19,0,0,2,33,75,68,3,0,0,23,124,150,23,94,251,253,239,249,248,248,249,201,67,34,0,74,177,171,140,119, -43,33,38,84,52,13,0,0,0,28,90,48,132,184,238,249,203,18,18,198,248,198,18,1,33,24,0,14,38,6,5,123,142,24,0,0,0,66,121,145,15,0,0,23,55,1,10,79, -102,79,10,36,171,179,132,59,60,34,0,0,0,0,0,12,36,79,70,8,33,19,0,0,108,248,243,84,109,111,5,0,0,0,0,0,0,32,176,222,252,248,94,13,33,55,81,17, -27,0,0,0,20,213,250,202,18,0,0,81,243,250,252,250,251,186,42,0,0,0,7,65,70,12,74,178,178,71,6,125,184,250,250,107,0,36,19,0,0,0,27,90,96,179,179,143, -211,248,194,9,0,0,0,0,1,33,24,0,14,41,126,139,20,0,0,0,0,0,66,94,98,248,248,94,2,10,79,102,79,10,39,161,179,142,138,80,70,12,0,0,0,0,0,7, -83,88,7,0,3,141,248,248,194,9,5,121,119,2,0,0,0,0,0,0,0,0,32,174,204,145,26,0,13,32,55,95,27,0,0,0,2,69,86,18,0,0,0,0,4,88,141,80, -214,252,249,248,248,248,182,72,70,12,74,178,178,71,6,125,142,61,86,26,0,36,19,0,0,0,27,90,108,238,253,230,34,0,0,18,198,248,198,18,1,33,24,0,14,41,126,139, -20,0,0,0,0,0,66,94,13,0,0,0,2,10,79,102,79,10,39,161,179,142,138,80,70,12,0,0,0,0,0,7,83,88,7,0,3,36,19,0,0,108,248,249,162,2,0,0, -0,0,0,0,0,0,110,252,254,186,26,0,13,32,55,95,79,13,0,3,70,83,200,249,202,18,81,243,248,248,252,253,190,42,0,0,0,10,58,33,28,118,182,178,74,0,10,37, -142,201,250,248,90,3,36,19,0,0,0,74,189,87,144,241,252,198,9,0,0,0,0,0,0,1,33,24,11,129,152,25,0,0,0,0,0,0,0,133,250,248,94,0,9,79,102,78, -10,41,162,179,111,16,124,162,48,62,13,0,0,0,9,81,64,16,36,6,99,248,249,248,248,195,128,124,5,0,8,51,11,0,0,0,0,0,0,30,174,204,146,26,0,13,52,62, -79,13,0,3,70,70,8,33,19,0,0,0,0,0,121,212,236,249,248,248,248,183,65,33,28,118,182,178,74,0,10,37,142,169,57,2,0,3,36,19,0,0,0,86,240,250,230,184, -138,18,0,0,18,198,248,198,18,1,33,24,11,129,152,25,0,0,0,0,0,0,0,66,84,10,0,0,9,79,102,78,10,41,162,179,111,16,124,162,48,62,13,0,0,0,9,81, -64,16,36,6,0,3,36,19,0,5,179,252,243,86,8,51,11,0,0,0,0,90,248,249,204,204,146,26,0,13,52,62,55,80,19,66,71,3,18,199,249,217,243,248,248,250,251,203, -155,22,0,0,10,62,35,0,74,188,197,82,0,10,33,40,91,136,174,249,248,90,3,36,19,0,52,159,74,105,217,252,237,142,18,0,0,0,0,0,0,0,1,32,96,139,32,33, -3,0,0,0,0,0,90,248,250,147,8,8,79,102,77,14,41,168,179,110,14,62,35,88,148,51,63,12,0,9,82,70,0,0,14,38,15,194,248,249,248,252,223,20,0,0,53,102, -77,9,0,0,0,0,0,0,30,174,204,145,29,29,27,30,55,80,19,66,71,3,0,3,36,19,0,0,0,60,187,241,252,249,248,248,248,134,35,0,74,188,197,82,0,10,33,40, -91,136,127,42,7,0,3,36,19,0,66,234,250,221,64,138,179,138,18,0,0,18,198,248,198,18,1,32,96,139,32,33,3,0,0,0,0,0,0,0,66,84,8,8,79,102,77,14, -41,168,179,110,14,62,35,88,148,51,63,12,0,9,82,70,0,0,14,38,7,0,3,36,23,123,124,112,248,243,121,102,77,9,0,0,90,248,248,94,30,174,204,145,29,29,27,30, -32,54,102,70,1,0,0,18,214,249,248,248,250,252,187,56,87,148,22,10,62,37,0,74,178,178,97,60,20,30,39,88,28,5,122,176,249,248,90,3,36,67,159,53,22,212,250,206, -142,179,139,58,14,0,0,0,0,0,0,1,64,40,0,12,35,6,0,0,0,90,248,248,94,64,78,78,102,76,27,28,32,156,114,13,62,37,0,0,88,148,52,59,20,79,71,3, -0,0,0,14,38,15,190,248,252,252,248,194,14,0,14,80,102,75,13,40,14,0,0,0,0,33,173,203,155,42,0,14,32,54,102,70,1,0,0,0,3,36,18,0,60,196,236,250, -250,252,249,205,250,249,90,74,178,178,97,60,20,30,39,88,28,5,122,129,43,6,0,3,36,80,234,249,203,42,90,49,138,179,139,58,14,0,18,198,248,198,18,1,64,40,0,12, -35,6,0,0,0,0,0,0,0,64,78,78,102,76,27,28,32,156,114,13,62,37,0,0,88,148,52,59,20,79,71,3,0,0,0,14,38,6,0,8,142,134,6,0,108,248,244,139, -102,75,13,116,248,248,94,0,0,29,173,203,155,42,0,14,14,82,86,76,12,0,0,81,243,248,249,250,252,187,57,0,0,88,152,79,37,0,74,178,179,74,0,37,68,46,85,28, -0,0,5,122,176,249,248,90,54,173,68,22,207,248,200,97,48,138,194,161,23,0,0,0,0,0,2,34,20,29,24,0,14,38,6,0,90,248,248,94,0,11,97,102,76,26,32,4, -0,19,15,62,37,0,0,2,3,88,148,54,99,72,1,0,0,0,0,0,14,38,20,222,252,249,248,248,194,14,0,11,79,102,90,50,4,0,0,0,86,217,53,180,205,146,28,0, -14,82,86,76,12,0,0,0,0,3,32,71,195,236,250,248,248,250,223,83,117,248,250,205,179,74,0,37,68,46,85,28,0,0,5,122,130,42,6,0,68,237,249,203,18,0,26,91, -48,138,194,161,23,0,0,18,198,248,198,50,20,29,24,0,14,38,6,0,0,0,0,0,0,11,97,102,76,26,32,4,0,19,15,62,37,0,0,2,3,88,148,54,99,72,1,0, -0,0,0,0,14,38,11,123,126,41,19,0,0,104,248,243,138,102,148,249,248,94,0,0,0,0,29,180,205,146,28,0,64,73,34,54,82,13,81,243,248,248,250,253,239,69,0,0, -0,10,129,163,23,69,178,179,99,8,8,29,58,102,36,0,0,0,0,5,122,176,249,249,193,55,54,210,248,194,9,25,84,79,158,180,138,18,0,0,0,2,35,21,0,1,33,23, -0,14,38,94,248,248,94,0,10,78,102,93,82,36,1,0,0,10,62,37,0,0,0,4,36,7,93,180,96,56,10,0,0,0,0,0,0,19,143,132,191,248,249,248,248,194,14,0, -13,95,102,73,6,0,0,86,243,248,225,66,172,204,147,29,64,73,34,54,82,13,0,0,0,0,50,198,236,250,248,248,248,174,132,163,23,138,253,253,154,8,8,29,58,102,36,0, -0,0,0,5,122,130,39,68,234,249,210,32,0,0,0,25,84,79,158,180,138,18,0,0,18,198,249,203,18,1,33,23,0,14,38,6,0,0,0,0,10,78,102,93,82,36,1,0, -0,10,62,37,0,0,0,4,36,7,93,180,96,56,10,0,0,0,0,0,0,19,143,127,6,3,36,15,0,0,104,248,244,186,251,250,98,0,0,0,0,2,34,43,172,204,147,29, -83,0,11,33,55,137,244,248,248,249,250,236,250,201,18,0,10,62,37,81,156,173,175,74,9,41,36,38,82,54,51,4,0,0,0,0,5,113,182,252,249,104,207,248,194,9,0,0, -61,102,50,138,179,138,18,0,2,35,20,0,0,0,0,30,20,0,99,249,248,94,0,10,79,102,75,28,78,82,9,0,10,62,37,0,0,0,0,0,8,37,81,133,150,54,58,4, -0,0,0,0,5,123,131,43,15,190,248,248,248,248,194,16,46,52,80,102,74,7,90,243,248,249,248,217,33,172,203,168,83,0,11,33,55,82,13,0,0,22,162,233,250,248,248,248, -174,66,37,81,156,173,204,250,248,116,36,38,82,54,51,4,0,0,0,0,5,113,147,234,249,203,20,7,0,0,0,0,61,102,50,138,179,138,18,0,2,51,202,248,198,18,0,30, -20,0,14,38,6,0,0,10,79,102,75,28,78,82,9,0,10,62,37,0,0,0,0,0,8,37,81,133,150,54,58,4,0,0,0,0,5,123,131,43,6,0,2,7,0,0,0,106, -249,250,250,158,74,7,0,0,2,35,20,0,29,172,203,168,149,27,0,13,104,245,250,248,249,250,149,48,199,249,202,26,62,37,0,69,179,179,86,0,8,36,58,88,26,0,16,2, -0,0,0,0,0,53,179,183,249,248,248,194,9,0,2,50,44,27,88,50,138,179,138,20,36,20,0,0,0,0,0,0,32,105,248,248,118,3,9,79,102,76,27,30,6,66,80,21, -58,37,0,0,0,0,0,0,8,81,88,11,88,148,36,2,0,0,0,5,123,124,6,15,38,15,185,248,248,248,248,206,64,0,11,83,102,137,243,248,249,248,243,81,0,27,186,209, -149,27,0,13,33,55,82,13,22,160,229,249,248,249,248,170,66,37,0,69,179,179,86,94,248,249,127,88,26,0,16,2,0,0,0,0,0,67,238,252,211,24,0,0,0,0,2,50, -44,27,88,50,138,179,138,20,36,20,18,198,248,198,18,0,32,24,0,14,38,3,9,79,102,76,27,30,6,66,80,21,58,37,0,0,0,0,0,0,8,81,88,11,88,148,36,2, -0,0,0,5,123,124,6,15,38,6,0,0,0,0,2,122,249,248,245,144,102,72,5,0,36,20,0,0,0,27,186,209,203,148,29,81,244,249,250,251,250,148,36,3,18,198,249,212, -52,0,74,178,173,123,135,31,33,38,88,54,7,0,0,0,0,0,0,0,52,155,55,124,239,249,248,96,0,2,50,50,2,0,25,90,51,138,180,154,36,0,0,0,0,0,0,0, -90,249,249,94,11,40,79,102,76,27,32,4,0,0,66,102,41,0,0,0,0,0,0,9,82,69,13,36,10,88,148,22,0,0,5,123,124,6,0,0,15,38,15,185,248,248,249,249, -194,18,0,13,144,251,250,249,248,243,77,0,3,68,83,171,203,148,29,0,13,33,55,97,164,232,249,248,248,248,175,69,36,0,74,178,173,123,135,31,115,249,250,125,7,0,0,0, -0,0,0,0,66,232,249,226,139,42,6,0,0,2,50,50,2,0,25,90,51,138,180,154,36,0,0,18,198,248,198,18,0,33,24,0,11,40,79,102,76,27,32,4,0,0,66,102, -41,0,0,0,0,0,0,9,82,69,13,36,10,88,148,22,0,0,5,123,124,6,0,0,15,38,6,0,0,2,122,249,248,156,248,244,144,102,72,34,17,0,0,0,3,68,83,171, -171,204,183,245,248,248,250,251,180,41,0,0,0,26,212,249,198,87,178,178,72,0,93,162,58,88,27,6,39,11,0,0,0,0,0,52,159,53,22,208,252,235,249,248,91,50,50,2, -0,0,0,24,89,52,151,185,138,18,0,0,0,6,13,90,248,248,115,20,8,82,102,77,26,32,3,0,0,9,55,73,76,9,0,0,0,0,8,82,71,3,0,10,39,11,88,148, -20,1,123,124,6,0,0,0,0,15,38,13,185,249,249,248,248,194,18,94,248,250,251,250,243,77,0,3,69,76,13,27,171,204,149,29,0,13,52,180,238,249,248,248,248,165,64,37, -0,74,178,178,72,0,93,162,58,149,249,248,115,11,0,0,0,0,0,66,234,249,203,23,122,130,42,4,1,50,50,2,0,0,0,24,89,52,151,185,138,18,0,0,18,199,248,198, -18,1,33,20,8,82,102,77,26,32,3,0,0,9,55,73,76,9,0,0,0,0,8,82,71,3,0,10,39,11,88,148,20,1,123,124,6,0,0,0,0,15,38,4,1,122,249,248, -94,0,99,248,244,144,102,77,3,0,0,3,69,76,13,27,27,197,252,252,248,249,250,160,70,80,12,0,11,62,52,198,250,238,184,74,0,10,30,114,185,48,0,0,10,39,11,0, -0,0,52,159,53,22,207,248,195,127,175,249,249,122,2,0,0,0,0,0,25,101,62,138,179,138,18,0,0,14,130,248,248,94,0,36,84,102,79,48,32,2,0,0,10,62,36,0, -56,80,10,0,0,9,81,71,2,0,0,0,10,39,11,86,135,121,118,6,0,0,0,0,0,0,14,33,56,198,248,248,248,248,215,248,248,249,250,248,122,3,1,70,68,15,59,20, -27,170,204,149,26,20,164,237,250,250,248,248,162,66,37,0,74,178,178,74,0,10,30,114,185,48,94,248,248,115,11,0,0,0,66,234,249,203,18,0,5,122,129,37,48,49,2,0, -0,0,0,0,25,101,62,138,179,138,18,0,0,31,212,248,198,18,0,36,84,102,79,48,32,2,0,0,10,62,36,0,56,80,10,0,0,9,81,71,2,0,0,0,10,39,11,86, -135,121,118,6,0,0,0,0,0,0,14,33,121,249,248,94,0,0,0,99,248,249,147,102,70,3,1,70,68,15,59,20,94,244,252,254,252,249,145,40,32,54,81,20,56,37,0,87, -238,253,214,18,10,33,39,88,107,148,22,0,0,9,39,11,0,52,159,53,22,207,248,194,9,5,122,189,250,248,90,0,0,0,0,3,30,39,86,52,138,179,138,18,0,90,249,250, -105,0,10,78,102,81,25,38,36,5,0,7,60,37,0,0,0,57,81,8,7,82,71,2,0,0,0,0,0,9,39,11,152,179,27,0,0,0,0,0,0,0,0,54,65,15,180,248, -248,248,248,248,249,248,240,134,102,68,96,150,9,0,23,64,19,26,170,204,152,157,233,249,249,250,250,166,60,37,0,74,178,178,74,0,10,33,39,88,107,148,22,94,248,248,115,11, -0,66,234,249,203,18,0,0,0,5,122,150,69,6,0,0,0,0,0,3,30,39,86,52,138,179,138,18,0,0,39,212,248,198,27,78,102,81,25,38,36,5,0,7,60,37,0,0, -0,57,81,8,7,82,71,2,0,0,0,0,0,9,39,11,152,179,27,0,0,0,0,0,0,0,0,125,250,248,94,0,0,0,0,3,121,248,248,146,102,68,96,150,9,0,23,64, -246,248,249,252,252,200,50,0,12,33,54,87,33,0,74,178,184,214,248,200,49,39,88,28,0,88,148,22,0,0,9,39,61,159,53,22,207,248,194,9,0,2,54,147,176,249,248,90, -0,0,3,36,19,0,24,90,52,138,179,138,101,248,248,106,56,27,77,102,75,45,45,0,13,38,6,4,22,0,0,0,0,0,55,76,78,68,2,0,0,0,0,0,0,0,14,141, -119,85,145,22,0,0,0,0,0,2,50,48,16,36,14,180,248,248,248,249,248,241,75,14,83,102,102,128,122,5,0,23,64,18,21,168,210,244,249,248,248,249,178,87,33,0,74,178, -178,74,0,10,33,39,88,28,0,88,148,22,94,248,248,115,74,234,249,203,18,0,0,0,0,2,54,147,130,40,5,0,0,0,3,36,19,0,24,90,52,138,179,138,18,0,0,36, -210,249,215,113,75,45,45,0,13,38,6,4,22,0,0,0,0,0,55,76,78,68,2,0,0,0,0,0,0,0,14,141,119,85,145,22,0,0,0,0,0,2,122,249,248,117,5,0, -0,0,3,36,19,102,248,248,144,102,102,128,122,5,0,97,249,250,249,249,206,207,150,30,0,13,33,54,80,83,178,178,74,18,200,249,207,100,28,0,0,0,88,148,22,0,0,59, -174,62,22,207,248,194,9,0,2,50,50,7,122,176,249,248,90,3,36,19,0,0,0,23,89,52,138,206,252,249,94,0,30,97,102,74,27,29,31,23,0,14,38,6,0,0,0,0, -0,0,8,97,102,11,0,0,0,0,0,0,0,5,123,129,42,11,88,148,22,0,0,0,2,50,50,2,0,16,38,112,248,248,249,248,248,225,133,5,70,100,102,69,124,122,5,0, -24,64,34,157,246,254,252,248,248,159,33,54,80,83,178,178,74,0,10,33,39,88,28,0,0,0,88,148,22,94,248,249,243,249,203,18,0,0,0,0,2,50,50,7,122,130,43,5, -0,3,36,19,0,0,0,23,89,52,138,179,138,18,0,0,45,220,251,214,43,29,31,23,0,14,38,6,0,0,0,0,0,0,8,97,102,11,0,0,0,0,0,0,0,5,123,129, -42,11,88,148,22,0,0,0,2,122,249,248,94,16,38,5,0,3,36,19,0,80,172,248,250,127,102,69,124,122,85,243,248,249,251,151,49,170,204,151,31,0,13,33,113,203,182,74, -0,10,49,207,250,204,18,0,0,0,0,88,148,19,48,159,60,58,209,248,194,9,0,2,50,50,2,0,5,123,176,249,248,112,19,0,0,0,0,0,23,90,124,252,253,181,18,8, -73,102,94,38,28,2,0,33,24,0,14,38,6,0,0,0,0,9,81,66,54,78,9,0,0,0,0,0,5,123,124,6,9,39,11,88,148,22,0,2,50,50,2,0,0,0,113,249, -248,249,248,248,248,248,225,166,70,23,88,102,70,124,122,6,0,45,185,235,249,252,254,252,166,0,13,33,113,203,182,74,0,10,33,39,88,28,0,0,0,0,0,88,148,19,133,252, -249,225,28,0,0,0,0,2,50,50,2,0,5,123,131,43,8,34,19,0,0,0,0,0,23,90,53,138,179,138,18,8,73,113,219,249,204,20,0,33,24,0,14,38,6,0,0,0, -0,9,81,66,54,78,9,0,0,0,0,0,5,123,124,6,9,39,11,88,148,22,0,2,122,249,248,94,0,0,15,36,8,34,19,0,0,11,124,194,162,23,88,102,70,166,249,248, -249,250,157,75,17,25,169,204,153,30,0,83,188,194,132,12,7,33,39,100,204,248,198,18,0,0,0,0,81,152,149,48,22,209,249,197,9,0,2,50,50,2,0,0,0,7,81,111, -250,248,90,0,0,0,0,0,0,104,250,250,181,179,142,87,96,74,42,71,18,0,0,1,33,24,0,14,38,6,0,0,9,82,71,2,0,58,80,8,0,0,0,5,123,124,6,0, -0,9,39,12,88,148,24,50,50,2,0,0,0,108,248,248,250,248,246,248,248,248,250,233,134,5,18,89,102,69,124,116,34,162,236,250,248,249,252,233,153,30,0,83,188,194,132,12, -7,33,39,88,28,0,0,0,0,0,0,0,81,159,231,249,248,248,115,12,0,0,2,50,50,2,0,0,0,7,81,26,58,20,0,0,0,0,0,0,0,22,89,53,138,179,142,87, -96,74,58,214,248,198,18,1,33,24,0,14,38,6,0,0,9,82,71,2,0,58,80,8,0,0,0,5,123,124,6,0,0,9,39,12,88,148,24,122,249,248,94,0,0,0,0,15, -58,20,0,0,0,3,74,159,124,5,18,89,151,246,252,252,251,147,31,27,62,16,25,169,204,147,93,178,182,98,54,83,40,38,88,28,18,198,248,198,18,0,0,0,46,178,179,45, -207,248,196,47,10,1,50,50,2,0,0,0,0,0,3,32,113,249,248,90,0,0,0,0,90,248,249,150,51,142,203,182,84,27,27,28,62,16,0,0,1,33,24,0,14,38,4,8, -82,71,2,0,0,0,59,80,8,0,5,123,124,6,0,0,0,0,9,39,10,88,169,68,2,0,0,0,108,248,248,249,249,241,74,176,248,250,250,248,228,132,5,18,90,102,65,122, -191,234,249,249,250,248,155,169,204,147,93,178,182,98,54,83,40,38,88,28,0,0,1,0,0,0,0,0,61,238,253,209,105,248,248,115,10,1,50,50,2,0,0,0,0,0,3,32, -30,34,5,0,0,0,0,0,0,0,22,90,51,142,203,182,84,27,27,44,212,248,198,18,1,33,24,0,14,38,4,8,82,71,2,0,0,0,59,80,8,0,5,123,124,6,0,0, -0,0,9,39,10,88,200,250,248,94,0,0,0,0,3,32,30,34,5,0,3,70,71,8,122,122,5,93,247,251,250,252,186,131,7,0,27,64,15,23,162,204,192,176,70,11,37,68, -86,83,26,0,6,49,199,248,198,18,0,52,162,117,128,235,249,194,9,8,34,52,48,2,0,0,0,0,0,3,36,19,0,104,249,248,90,0,0,90,248,248,94,20,82,98,185,201, -150,48,3,0,27,64,16,0,0,1,33,24,0,12,37,80,70,2,0,0,6,32,2,58,80,13,123,124,6,0,0,0,0,0,0,8,34,52,120,149,22,0,0,113,248,248,249,248, -239,70,35,18,197,250,248,248,248,228,132,5,20,91,114,179,244,251,248,248,249,172,15,23,162,204,192,176,70,11,37,68,86,83,26,0,6,33,4,0,0,0,0,66,234,251,226,157, -22,94,248,248,112,52,48,2,0,0,0,0,0,3,36,19,0,16,38,5,0,0,0,0,0,0,0,20,82,98,185,201,150,48,3,0,43,212,248,198,18,1,33,24,0,12,37,80, -70,2,0,0,6,32,2,58,80,13,123,124,6,0,0,0,0,0,0,8,34,123,251,252,108,0,0,0,0,3,36,19,0,16,35,10,68,71,3,0,5,122,165,243,248,250,251,251, -83,123,122,5,0,28,64,17,88,194,204,166,25,7,38,56,96,85,8,3,38,15,18,198,248,198,66,164,120,68,207,250,229,31,0,1,50,65,12,0,0,0,0,0,3,36,19,0, -0,0,104,249,248,90,90,248,248,94,0,7,81,102,97,148,188,139,18,0,0,28,64,18,0,0,1,33,20,6,83,88,7,0,0,6,38,15,0,0,63,164,128,6,0,0,0,0, -0,0,0,1,50,65,12,88,148,22,118,248,248,249,248,239,58,0,15,87,77,177,248,248,248,248,228,132,1,39,197,245,250,252,252,248,140,28,64,17,88,194,204,166,25,7,38,56, -96,85,8,3,38,15,0,0,0,0,66,235,251,213,18,88,148,22,94,248,249,132,12,0,0,0,0,0,3,36,19,0,0,0,16,38,5,0,0,0,0,0,0,7,81,102,97,148, -188,139,18,0,0,44,212,248,198,18,1,33,20,6,83,88,7,0,0,6,38,15,0,0,63,164,128,6,0,0,0,0,0,0,0,1,122,250,248,150,148,22,0,0,3,36,19,0, -0,0,15,87,70,2,0,0,0,85,249,252,248,249,252,185,102,65,125,122,11,0,30,97,175,172,175,203,155,51,38,88,51,52,81,42,11,0,0,18,198,249,235,130,68,207,248,194, -95,148,24,50,48,11,37,12,0,0,0,3,36,19,0,0,0,0,0,104,249,248,248,248,94,0,10,79,102,79,85,71,138,179,138,18,0,0,30,32,0,0,0,0,33,86,66,16, -36,5,5,38,14,0,0,5,123,154,83,8,0,0,0,0,0,0,2,50,48,11,37,12,88,197,249,248,249,248,239,54,0,3,67,75,35,13,176,248,248,248,248,227,130,157,240,251, -251,250,252,195,11,0,30,97,175,172,175,203,155,51,38,88,51,52,81,42,11,0,0,0,0,66,235,251,213,18,0,0,88,148,24,126,249,248,114,12,0,0,0,3,36,19,0,0, -0,0,0,16,38,5,0,0,0,0,10,79,102,79,85,71,138,179,138,18,0,0,46,205,248,198,18,0,33,86,66,16,36,5,5,38,14,0,0,5,123,154,83,8,0,0,0,0, -0,0,2,122,249,248,117,12,88,148,22,3,36,19,0,0,0,3,67,75,35,4,0,0,81,243,248,252,252,249,155,98,93,102,35,124,79,0,74,178,178,69,24,168,206,164,100,25, -8,34,71,85,11,0,0,0,66,235,251,213,210,248,194,9,0,90,169,68,2,0,8,39,12,0,3,36,19,0,0,0,0,0,0,0,156,249,248,150,0,10,79,102,76,26,60,197, -69,138,179,138,18,0,0,0,0,0,0,8,79,83,22,0,13,37,37,13,0,0,5,123,124,6,60,79,8,0,0,0,0,3,50,50,2,0,8,39,128,250,252,250,248,234,54,0, -3,70,71,43,23,38,10,176,248,248,248,249,243,246,249,249,250,251,151,124,79,0,74,178,178,69,24,168,206,164,100,25,8,34,71,85,11,0,0,0,66,235,251,213,18,0,0,0, -0,90,169,68,96,248,248,115,12,0,3,36,19,0,0,0,0,0,0,0,16,38,5,0,0,10,79,102,76,26,45,79,48,138,179,138,18,0,0,18,198,248,198,26,79,83,22,0, -13,37,37,13,0,0,5,123,124,6,60,79,8,0,0,0,0,3,122,249,248,94,8,39,12,88,149,55,19,0,0,0,3,70,71,43,23,38,5,81,243,248,248,249,251,190,30,25, -25,47,2,3,6,73,178,178,74,0,10,48,175,209,162,27,3,42,39,54,82,13,0,52,164,130,213,248,248,198,9,0,1,47,121,149,22,0,0,34,100,14,33,19,0,0,0,0, -0,0,0,90,248,248,249,248,96,79,102,76,27,48,198,248,202,54,138,179,138,18,0,0,0,0,9,82,70,6,30,22,3,43,43,4,0,5,123,124,6,0,0,60,78,8,0,0, -1,47,50,2,0,0,0,126,249,248,251,252,236,54,0,3,70,71,5,110,124,21,39,11,176,248,249,252,250,251,252,248,249,153,2,3,6,73,178,178,74,0,10,48,175,209,162,27, -3,42,39,54,82,13,0,66,235,251,213,18,0,0,0,0,1,47,121,149,22,94,248,249,155,14,33,19,0,0,0,0,0,0,0,0,0,16,39,3,9,79,102,76,27,32,0,16, -84,54,138,179,138,18,0,0,18,198,248,216,83,6,30,22,3,43,43,4,0,5,123,124,6,0,0,60,78,8,0,0,1,120,249,248,94,0,0,8,37,14,110,156,22,0,0,3, -70,71,5,110,124,21,108,243,248,248,249,250,147,132,123,5,5,0,0,0,72,178,178,74,0,10,33,39,95,173,202,155,57,9,10,33,55,82,60,163,120,68,210,248,248,201,18,0, -1,22,4,88,148,19,19,149,93,58,26,0,37,19,0,0,0,0,90,248,248,94,101,249,250,156,76,27,48,199,248,203,36,89,56,138,179,138,18,0,0,9,82,71,3,0,0,33, -49,9,12,38,11,123,124,6,0,0,0,0,66,79,8,0,1,22,4,0,0,0,126,248,248,250,249,238,165,16,3,70,71,3,0,7,122,122,19,38,11,183,252,250,249,248,252,252, -132,0,0,0,72,178,178,74,0,10,33,39,95,173,202,155,57,9,10,33,55,82,74,235,251,213,18,0,11,3,0,0,1,22,4,88,148,19,106,252,250,128,26,0,37,19,0,0, -0,0,0,0,0,0,12,40,79,102,76,27,32,3,0,0,20,89,56,138,179,138,18,0,0,26,216,250,199,18,0,33,49,9,12,38,11,123,124,6,0,0,0,0,66,79,8,0, -90,248,248,94,0,0,0,0,8,58,26,86,141,16,3,70,71,3,0,7,122,165,244,249,248,249,250,149,36,7,122,122,149,13,0,74,178,178,74,0,10,34,40,88,28,22,167,207, -158,31,0,13,33,94,189,116,65,207,248,198,204,249,199,18,0,0,0,0,83,140,140,84,34,23,34,62,156,39,0,0,0,90,248,248,94,0,8,146,251,250,107,48,199,248,203,26, -44,29,87,56,138,179,138,18,9,82,71,2,0,0,6,34,39,21,0,19,143,127,6,0,0,0,0,0,12,84,77,7,0,0,0,0,0,126,248,248,249,249,233,64,76,137,86,71, -3,0,0,0,5,122,122,15,55,174,247,249,248,248,248,241,159,13,0,74,178,178,74,0,10,34,40,88,28,22,167,207,158,31,0,13,33,105,240,251,213,18,0,0,17,36,3,0, -0,0,0,0,83,140,140,147,249,249,112,62,156,39,0,0,0,0,0,0,0,0,8,82,102,77,26,32,3,0,0,8,44,29,87,56,138,179,138,18,9,82,84,198,248,198,23,34, -39,21,0,19,143,127,6,0,0,0,0,0,12,84,77,94,248,248,94,0,0,0,0,3,34,23,34,12,76,137,86,71,3,0,0,0,85,249,252,248,250,250,149,36,3,0,5,128, -141,113,76,178,178,74,0,10,34,40,88,28,0,6,50,168,203,156,33,0,60,175,127,108,209,248,194,9,18,202,249,199,18,0,0,0,18,168,169,52,19,0,58,174,64,0,0,0, -90,248,248,94,0,12,79,102,144,249,249,216,248,203,27,57,33,0,19,88,56,138,179,142,94,71,2,0,0,6,38,13,0,33,28,123,131,43,6,0,0,0,0,0,0,14,83,79, -14,0,0,0,130,248,248,249,248,230,56,36,16,130,177,25,0,0,0,0,0,5,117,121,165,241,249,248,248,248,248,250,233,125,76,178,178,74,0,10,34,40,88,28,0,6,50,168, -203,156,33,0,74,237,251,222,28,0,0,0,0,19,36,3,0,0,0,0,18,168,169,52,106,248,249,203,64,0,0,0,0,0,0,0,0,12,79,102,79,48,32,2,0,0,10,57, -33,0,19,88,56,138,179,142,94,71,2,18,198,248,206,30,0,33,28,123,131,43,6,0,0,0,0,0,0,14,144,250,248,94,0,0,0,0,3,36,19,0,8,36,16,130,177,25, -0,0,0,81,243,248,252,252,249,160,36,2,0,0,10,66,0,142,179,178,74,0,10,33,40,88,28,0,6,38,13,21,165,204,150,75,156,121,82,217,250,197,9,0,0,18,202,249, -199,18,0,22,147,83,105,154,19,48,159,59,38,13,0,0,126,248,94,3,8,73,102,76,26,127,249,248,219,28,62,36,0,0,0,20,88,54,142,203,170,20,0,0,6,38,14,0, -0,6,140,136,6,14,35,6,0,0,0,0,0,0,14,83,85,12,0,130,248,248,249,248,230,50,0,8,88,74,89,148,22,0,0,4,6,0,27,195,247,249,249,248,248,248,250,249, -248,234,186,178,74,0,10,33,40,88,28,0,6,38,13,21,165,204,150,88,233,251,216,67,82,13,0,0,0,0,19,36,3,0,0,22,147,83,105,154,19,124,252,249,115,13,0,0, -0,0,0,3,8,73,102,76,26,38,36,6,0,10,62,36,0,0,0,20,88,54,142,203,170,20,0,0,24,206,248,198,18,6,140,136,6,14,35,6,0,0,0,0,0,90,248,250, -148,12,0,0,0,3,36,19,0,0,0,8,88,74,89,148,22,0,81,243,248,248,249,251,189,41,36,6,0,10,62,37,72,170,178,74,0,10,33,40,88,28,0,6,38,14,0,0, -20,159,203,194,128,64,209,249,207,89,13,0,0,0,18,202,249,199,39,148,90,36,19,81,152,149,48,0,2,38,13,0,0,50,0,6,35,46,69,28,47,198,248,249,248,129,37,0, -0,0,0,0,17,82,99,168,180,138,18,6,38,14,0,0,5,123,124,38,24,0,13,38,6,0,0,0,0,0,0,13,78,84,136,248,248,249,248,230,45,0,3,68,71,36,12,88, -148,22,0,6,37,31,168,246,251,252,248,249,128,191,249,248,250,253,241,89,0,10,33,40,88,28,0,6,38,14,0,0,20,159,206,241,251,212,27,32,55,82,13,0,0,0,0,19, -36,3,22,148,90,36,19,81,152,149,125,248,248,114,13,0,0,0,0,6,35,46,69,28,32,1,13,34,16,60,37,0,0,0,0,0,17,82,99,168,180,138,18,6,38,31,198,248, -199,132,124,38,24,0,13,38,6,0,0,0,90,248,248,102,78,84,12,0,3,36,19,0,0,0,3,68,71,36,12,88,148,96,243,248,249,249,250,147,132,121,17,34,16,60,37,0, -178,178,74,0,10,33,40,88,28,0,6,38,14,0,0,0,0,66,195,209,173,213,248,197,41,55,82,13,0,0,0,18,202,250,231,101,36,19,0,46,174,152,16,7,44,10,36,14, -0,0,0,0,10,33,24,46,199,248,203,117,250,249,90,0,0,0,0,0,6,82,102,56,138,179,141,53,14,0,0,5,123,124,6,1,33,24,0,14,38,6,0,0,0,0,0,0, -13,172,250,248,249,248,230,45,0,3,70,71,2,5,38,13,88,148,23,0,32,183,246,249,248,252,252,132,73,42,171,250,253,253,250,207,31,33,40,88,28,0,6,38,14,0,0,0, -0,79,242,254,237,47,0,13,33,55,82,13,0,0,0,0,19,55,149,89,36,19,0,46,174,152,16,98,249,248,113,14,0,0,0,0,10,33,24,30,3,0,0,20,82,41,0,0, -0,0,0,0,6,82,102,56,138,179,141,53,14,0,18,199,252,226,23,1,33,24,0,14,38,6,0,90,248,248,94,0,13,78,84,16,32,19,0,0,0,3,70,71,2,5,38,13, -141,250,249,248,249,251,152,33,7,122,122,25,73,38,0,74,178,74,0,10,33,40,88,28,0,6,38,14,0,0,0,0,52,157,124,177,245,252,200,9,13,33,54,80,28,0,0,0, -40,233,251,206,35,0,53,157,48,81,148,26,70,68,6,36,14,0,0,0,0,28,70,200,248,203,27,59,163,252,248,90,0,0,0,9,82,66,24,86,56,140,190,144,18,0,6,122, -124,6,0,0,1,32,12,0,14,38,5,0,22,2,0,1,169,252,251,251,249,230,41,0,3,70,71,3,0,0,7,39,13,88,141,83,189,246,250,248,248,248,184,153,46,32,81,229, -253,250,248,248,213,63,88,28,0,6,38,14,0,0,0,0,66,233,252,238,206,156,24,0,13,33,54,80,28,0,0,0,24,155,110,34,18,0,53,157,48,81,148,26,138,250,248,113, -14,0,0,0,0,28,56,10,0,0,10,59,109,140,11,0,0,0,0,9,82,66,24,86,56,140,190,144,18,0,6,132,225,248,198,18,1,32,12,0,14,38,93,248,249,96,0,1, -63,133,86,96,27,0,0,0,3,70,71,3,0,0,7,107,244,250,252,250,251,156,56,10,0,5,127,153,46,32,78,178,74,0,10,33,40,88,28,0,6,38,14,0,0,0,0,52, -167,118,67,211,252,243,148,17,0,12,30,74,99,16,0,13,141,101,208,249,198,18,55,52,0,0,88,148,25,70,68,6,36,14,0,0,24,46,200,249,205,26,62,37,11,175,252,248, -90,0,9,82,71,3,0,17,86,78,142,179,137,30,117,124,13,0,0,0,0,0,2,0,0,14,32,44,53,4,0,142,252,253,252,251,235,51,0,3,70,71,3,0,0,0,0,7, -38,11,120,221,249,249,248,249,248,113,66,140,112,86,190,182,192,248,248,249,249,223,52,0,6,38,14,0,0,0,0,66,236,251,213,36,163,204,144,17,0,12,30,74,99,16,0,13, -141,89,45,45,1,0,55,52,0,0,88,148,25,138,250,248,113,14,0,0,24,30,11,38,8,9,62,37,11,129,142,11,0,0,9,82,71,3,0,17,86,78,142,179,137,30,117,124, -30,198,248,198,18,0,2,0,0,99,249,249,128,4,0,4,131,179,153,90,82,12,0,3,70,71,3,0,0,0,81,243,249,248,252,253,190,44,9,38,8,9,66,140,112,86,190,180, -4,8,33,40,88,28,0,6,38,14,0,0,0,0,52,167,134,75,207,248,198,166,204,144,17,0,48,63,56,82,13,7,47,36,32,202,249,199,18,0,0,0,0,88,148,24,70,68, -6,36,12,21,48,198,248,205,54,61,35,0,0,5,175,252,248,96,82,71,2,0,0,3,46,90,56,136,179,169,118,16,61,16,0,0,0,0,0,0,0,0,49,69,10,0,144,248, -249,252,253,241,114,82,18,66,70,3,0,0,0,0,0,0,3,80,201,250,253,249,248,248,130,61,35,0,142,179,175,99,9,170,249,249,250,249,207,32,38,14,0,0,0,0,66,236, -251,215,18,0,19,163,204,144,17,0,48,63,56,82,13,7,47,36,16,16,36,3,0,0,0,0,0,88,148,24,138,250,248,113,12,21,33,1,0,8,38,61,35,0,0,5,129,141, -6,8,82,71,2,0,0,3,46,90,56,136,179,169,118,16,61,32,198,248,198,18,0,0,90,248,249,138,10,0,0,0,24,156,183,137,87,82,18,66,70,3,0,0,0,81,243,248, -248,251,251,203,160,22,0,8,38,61,35,0,142,179,175,99,40,34,39,88,28,0,6,38,14,0,0,0,0,52,164,118,82,218,248,194,55,36,162,204,145,56,53,16,31,55,81,17, -32,19,0,18,202,249,199,18,0,0,0,0,98,150,24,70,68,6,47,54,198,248,203,26,61,56,7,0,0,0,5,174,252,250,135,2,0,0,6,38,10,16,88,62,171,179,134,15, -30,64,14,1,48,22,0,0,0,45,53,17,35,147,248,248,249,249,240,191,136,82,100,68,0,0,0,0,0,0,0,0,59,207,249,250,250,252,249,109,61,56,7,72,170,179,142,12, -40,38,181,250,249,248,248,214,39,0,0,0,0,66,235,251,216,70,14,1,47,36,162,204,145,56,53,16,31,55,81,17,32,19,0,0,19,36,3,0,0,0,0,0,98,150,24,138, -250,248,120,39,0,0,0,8,61,56,7,0,0,0,5,127,140,83,70,2,0,0,6,38,10,16,88,62,171,179,134,15,30,64,31,198,249,203,18,90,248,249,127,17,35,6,0,3, -36,38,142,179,136,82,100,68,0,0,0,0,81,243,248,248,250,252,187,58,87,148,22,8,61,56,7,72,170,179,142,12,43,58,86,27,0,6,38,14,0,0,0,0,52,164,120,68, -207,249,208,60,47,4,18,162,208,168,19,0,13,32,55,95,28,0,0,0,18,202,249,199,18,0,0,0,0,89,148,24,67,76,46,205,248,203,27,62,35,9,38,10,0,0,0,10, -197,253,248,90,0,6,38,14,0,0,22,165,141,135,179,138,18,28,58,53,46,6,0,0,46,55,4,0,155,249,248,249,248,221,58,145,179,163,101,79,11,0,0,0,0,0,0,60, -208,249,250,249,248,250,194,79,35,9,101,181,178,76,112,125,43,58,89,172,248,248,249,248,212,27,0,0,66,235,251,213,18,27,58,53,47,4,18,162,208,168,19,0,13,32,55,95, -28,0,0,0,0,19,36,3,0,0,0,0,0,89,148,24,136,250,249,111,15,0,10,62,35,9,38,10,0,0,0,10,163,167,12,0,0,6,38,14,0,0,22,165,141,135,179,138, -18,28,58,68,208,248,216,248,249,128,4,0,14,36,9,34,19,0,20,145,179,163,101,79,11,0,0,81,243,248,248,250,252,187,54,31,14,88,152,79,35,9,101,181,178,76,112,125, -142,93,53,1,5,38,14,0,0,0,0,52,164,120,68,207,248,194,66,76,17,0,1,57,178,170,22,0,0,13,52,62,79,13,0,0,0,18,202,249,199,18,0,0,0,0,88,148, -42,96,213,248,207,28,62,37,0,0,10,39,10,0,9,75,65,176,252,248,93,38,14,0,0,5,122,131,88,57,138,179,138,19,59,76,17,0,1,46,54,5,9,158,248,248,250,248, -221,36,0,24,177,199,135,84,85,12,0,0,0,0,62,208,249,250,248,248,248,106,128,163,23,69,181,190,81,0,14,139,142,93,53,6,164,249,248,248,248,212,27,66,235,251,213,18, -0,1,59,76,17,0,1,57,178,170,22,0,0,13,52,62,79,13,0,0,0,0,19,36,3,0,0,0,0,0,88,148,42,147,250,248,103,11,62,37,0,0,10,39,10,0,9,75, -65,130,140,10,5,38,14,0,0,5,122,131,88,57,138,179,138,19,59,76,34,216,248,249,137,5,9,22,0,14,58,21,0,0,0,24,177,199,135,84,85,12,81,243,248,248,250,252, -187,52,0,6,22,11,128,163,23,69,181,190,81,0,14,139,168,136,13,36,36,11,0,0,0,0,52,164,120,72,207,248,195,57,44,28,59,16,39,51,19,55,84,12,0,31,28,29, -54,82,13,0,0,0,18,202,249,199,18,0,0,0,0,102,168,204,250,217,29,57,36,0,0,0,0,10,33,16,79,68,1,5,175,252,249,97,0,0,5,122,122,5,17,87,60,138, -180,161,58,28,59,16,39,52,4,0,162,250,249,249,249,225,41,0,3,70,87,149,179,130,82,84,12,0,0,52,205,249,250,248,248,248,103,59,36,81,156,173,175,81,35,16,29,44, -168,136,13,36,41,166,248,248,248,248,223,236,251,213,18,0,3,50,44,28,59,16,39,51,19,55,84,12,0,31,28,29,54,82,13,0,0,0,0,19,34,3,0,0,0,0,0,102, -160,28,138,250,248,127,36,0,0,0,0,10,33,16,79,68,1,5,129,141,41,11,0,0,5,122,122,5,17,87,60,138,180,161,58,28,128,248,249,250,199,18,22,87,31,24,28,32, -6,0,3,70,87,149,179,130,82,138,243,248,248,249,251,187,52,0,0,0,7,59,36,81,156,173,175,81,35,16,29,44,32,122,125,46,38,20,23,0,0,52,164,120,72,207,248,195, -59,46,1,0,26,73,49,1,0,0,50,82,40,14,0,12,32,55,82,13,0,0,0,18,202,249,199,18,0,0,24,47,218,252,208,83,94,33,0,0,0,0,0,0,14,93,73,1, -0,0,11,185,252,248,105,5,122,122,5,0,0,17,85,60,159,193,138,18,26,73,49,1,0,154,248,249,251,249,221,42,34,11,68,70,3,25,150,179,127,82,84,12,40,151,249,250, -248,248,248,100,60,34,0,69,179,179,86,0,16,52,43,86,32,122,125,46,38,25,170,248,248,249,252,251,217,18,0,4,52,46,1,0,26,73,49,1,0,0,50,82,40,14,0,12, -32,55,82,13,0,0,0,0,18,35,3,0,0,0,24,31,88,148,23,138,250,249,90,0,0,0,0,0,14,93,73,1,0,0,11,144,142,25,23,5,122,122,5,0,0,17,85,60, -159,193,138,101,249,250,134,198,248,198,18,30,101,42,0,13,34,11,68,70,3,25,150,179,168,247,250,248,249,248,169,52,0,0,0,10,60,34,0,69,179,179,86,0,16,52,43,86, -0,5,129,127,30,58,8,0,52,164,120,72,207,248,195,60,48,2,0,2,44,59,55,15,0,0,0,70,89,11,0,0,13,33,55,82,13,0,0,0,18,202,249,199,18,24,48,198, -248,221,160,74,82,66,2,0,0,0,0,9,80,73,35,8,0,0,14,14,179,253,249,167,122,5,0,0,0,0,20,102,85,138,179,139,59,59,55,15,158,248,248,249,249,233,57,0, -14,88,70,2,0,0,26,152,179,126,78,89,145,248,250,248,248,248,96,62,37,0,74,178,173,123,135,31,31,44,100,34,0,5,129,127,30,58,13,162,249,252,251,249,219,27,4,53, -48,2,0,2,44,59,55,15,0,0,0,70,89,11,0,0,13,33,55,82,13,0,0,0,0,19,36,3,0,24,33,1,0,88,152,74,146,250,248,90,0,0,0,9,80,73,35,8, -0,0,14,14,135,150,26,119,122,5,0,0,0,0,20,102,85,138,206,252,250,131,55,32,198,248,199,46,44,86,30,0,14,88,70,2,0,0,26,184,251,252,250,250,248,151,52,0, -0,0,10,62,37,0,74,178,181,163,135,31,31,44,100,34,10,0,5,131,139,20,36,54,163,120,72,207,248,195,61,47,1,0,2,49,51,3,25,64,16,1,35,15,48,84,13,0, -0,13,33,55,82,13,0,0,0,18,202,249,203,62,198,248,203,27,129,163,25,69,70,3,0,0,9,82,71,1,8,37,7,0,0,17,35,172,252,252,92,0,0,0,0,4,49,53, -82,58,138,193,162,21,29,182,248,248,249,248,221,53,87,29,62,73,35,5,0,0,0,27,153,179,144,153,248,250,248,248,243,96,62,37,0,74,178,178,72,0,93,162,58,86,35,32, -10,0,5,131,139,20,36,72,245,251,249,248,248,218,75,47,1,0,2,49,51,3,25,64,16,1,35,15,48,84,13,0,0,13,33,55,82,13,0,0,0,0,18,31,24,32,1,0, -0,10,129,163,25,138,250,248,90,0,9,82,71,1,8,37,7,0,0,17,35,123,178,118,3,0,0,0,0,4,49,53,82,127,252,253,196,21,25,64,33,198,249,202,18,30,87,29, -62,73,35,5,0,0,81,244,252,253,252,248,151,58,0,0,0,10,62,37,0,74,178,186,231,243,145,162,58,86,35,32,39,8,17,41,124,113,61,172,119,71,207,248,195,61,46,1, -0,4,49,51,3,0,0,26,61,42,15,0,0,50,85,17,0,0,13,33,55,82,13,0,0,0,18,206,250,238,248,203,27,62,37,88,148,23,70,70,0,8,82,71,2,0,0,7, -37,8,17,36,6,115,201,252,248,90,0,0,5,54,46,0,15,83,86,159,180,140,165,249,250,249,248,217,27,0,38,102,75,0,12,38,6,0,0,0,30,172,223,251,250,250,248,243, -97,62,37,0,74,178,178,74,0,10,33,114,185,47,0,10,39,8,17,41,124,113,76,236,251,236,248,248,248,250,224,28,0,4,49,51,3,0,0,26,61,42,15,0,0,50,85,17, -0,0,13,33,55,82,13,0,0,0,0,33,53,1,0,0,10,62,37,88,148,23,138,250,248,95,82,71,2,0,0,7,37,8,17,36,6,115,170,136,9,0,0,0,5,54,46,0, -100,250,251,194,180,138,18,26,61,57,201,248,198,18,38,102,75,0,12,38,6,81,243,248,249,252,253,198,90,78,12,0,10,62,37,0,74,178,186,231,248,248,245,159,185,47,0,10, -8,46,38,2,0,134,182,122,91,207,248,195,61,46,0,0,0,43,51,3,0,0,0,0,48,66,15,0,0,0,50,42,0,0,0,13,33,55,82,13,0,0,21,105,243,249,241,62, -62,37,0,0,112,157,22,67,67,77,69,2,0,0,0,0,7,46,38,7,122,119,18,174,252,248,90,5,54,46,0,0,0,48,102,61,140,227,252,249,249,250,219,27,0,13,78,65, -81,29,0,14,38,6,0,0,42,120,202,247,251,250,247,101,58,37,0,74,189,185,74,0,10,33,40,88,106,148,22,0,8,46,38,2,0,143,239,251,217,25,158,248,250,249,248,217, -27,43,51,3,0,0,0,0,48,66,15,0,0,0,50,42,0,0,0,13,33,55,82,13,0,0,21,82,70,36,32,30,62,37,0,0,112,157,22,136,250,250,135,2,0,0,0,0, -7,46,38,7,122,119,18,127,142,11,0,5,54,46,0,90,248,249,158,61,138,179,138,18,48,66,32,198,248,201,90,65,81,29,0,14,107,243,248,248,249,248,215,194,117,77,82,23, -58,37,0,74,189,185,128,243,248,249,249,247,153,148,22,0,17,38,36,10,50,149,173,152,210,249,197,61,45,0,0,0,0,14,3,0,0,0,3,36,15,24,64,18,0,0,0,0, -0,0,0,0,13,33,55,82,12,19,96,221,250,241,251,237,69,0,0,0,24,130,155,31,102,98,5,0,0,0,0,0,16,38,40,127,122,5,0,5,176,252,248,125,45,0,0,0, -0,10,21,88,184,252,253,252,249,216,84,14,11,84,50,0,29,90,30,0,14,37,4,41,101,102,80,168,243,248,137,102,42,0,74,178,185,120,20,8,33,40,88,28,0,88,148,22, -17,38,36,10,64,231,253,232,33,34,16,178,249,248,248,248,217,39,3,0,0,0,3,36,15,24,64,18,0,0,0,0,0,0,0,0,13,33,55,82,12,19,84,102,89,28,96,174, -55,0,0,0,24,130,155,31,158,251,248,90,0,0,0,0,16,38,40,127,122,5,0,5,129,140,16,54,45,0,90,248,248,100,21,85,62,138,180,154,32,24,64,31,200,250,209,18, -29,90,30,81,244,249,248,249,248,151,80,158,168,109,77,102,42,0,74,178,185,120,20,87,245,249,250,249,243,141,148,22,55,1,9,76,164,118,73,230,252,199,75,44,0,0,0,0, -0,0,0,31,3,1,34,19,0,0,27,64,18,0,0,0,0,0,0,0,0,13,33,53,82,96,221,250,207,41,212,251,231,39,0,0,0,19,127,182,80,64,68,3,0,0,0,15, -34,6,126,140,9,0,0,0,5,177,253,249,90,0,0,0,0,0,5,172,250,250,252,253,235,43,23,64,85,48,0,0,0,30,90,30,0,10,63,100,102,52,0,36,161,196,142,84, -80,82,178,178,74,20,63,43,39,88,28,0,0,0,88,156,55,1,9,89,235,251,213,132,122,21,69,44,158,248,248,248,248,221,27,31,3,1,34,19,0,0,27,64,18,0,0,0, -0,0,0,0,0,13,33,53,82,84,102,92,21,7,64,124,148,22,0,0,0,19,127,182,80,135,250,248,90,0,0,15,34,6,126,140,9,0,0,0,5,130,158,49,0,90,248,248, -94,0,0,16,85,62,150,184,138,18,23,64,97,209,248,198,18,30,143,244,248,248,250,248,151,52,0,36,150,170,142,84,80,82,178,178,74,20,63,43,107,247,249,248,248,243,141,156, -149,19,48,164,121,72,207,248,224,154,53,32,6,0,0,0,0,0,47,102,63,31,16,0,0,0,0,26,63,18,0,0,0,0,0,0,0,0,9,43,104,221,250,207,24,62,50,201, -251,231,39,0,0,6,84,151,156,22,70,70,3,0,20,35,6,122,122,8,2,0,0,0,8,57,187,252,248,90,0,0,0,5,167,248,248,251,250,233,187,143,27,89,86,14,0,0, -0,0,30,89,27,37,101,102,54,0,0,0,42,177,189,108,128,204,182,74,0,7,43,73,90,25,0,0,0,0,20,112,149,19,62,234,251,213,18,5,126,150,53,32,6,158,248,248, -248,248,227,118,63,31,16,0,0,0,0,26,63,18,0,0,0,0,0,0,0,0,9,43,93,102,90,17,6,62,34,15,111,149,22,0,0,6,84,151,156,22,138,250,248,90,20,35, -6,122,122,8,2,0,0,0,8,57,148,139,98,248,248,94,0,0,0,0,16,98,71,138,179,143,27,89,86,31,198,248,198,93,244,250,249,249,248,151,54,0,0,0,42,177,189,108, -128,204,182,74,0,7,43,73,90,98,243,248,248,248,244,157,136,152,153,115,72,207,248,194,50,145,122,18,38,6,0,0,0,0,27,92,102,70,0,0,0,0,0,0,26,62,18,0, -0,0,0,0,0,0,19,97,221,251,219,36,58,37,0,18,202,251,231,39,9,82,67,22,128,156,22,69,70,3,19,8,122,122,5,0,0,0,0,0,38,45,5,175,252,248,90,0, -5,171,248,248,249,249,223,82,143,137,92,47,22,63,18,0,0,0,0,26,92,100,102,58,30,6,0,10,62,69,155,179,183,196,132,10,6,33,39,90,72,17,0,0,0,1,21,3, -81,159,232,251,213,18,0,0,42,145,122,18,38,6,158,248,248,248,249,233,118,70,0,0,0,0,0,0,26,62,18,0,0,0,0,0,0,0,19,85,102,96,78,20,58,37,0,0, -19,112,149,22,9,82,67,22,128,156,22,138,250,248,102,8,122,122,5,0,0,0,0,0,38,45,5,173,252,248,94,0,0,0,0,3,31,30,82,63,143,137,92,47,22,63,35,198, -248,247,248,249,250,248,150,58,30,6,0,10,62,69,155,179,183,196,132,10,6,33,39,90,72,17,81,243,248,248,248,243,245,203,186,84,207,248,194,9,4,5,122,122,19,38,6,0, -0,0,0,48,94,102,62,2,0,0,0,11,71,62,62,18,0,0,0,0,0,22,98,221,250,212,70,102,43,0,0,0,18,202,251,232,107,71,2,0,22,130,156,22,69,70,5,122, -122,5,0,0,0,0,0,0,4,0,0,5,176,252,248,93,171,248,248,249,248,207,36,81,65,82,50,0,0,26,64,18,0,0,0,39,100,102,66,0,13,34,16,60,37,0,98,179, -179,137,76,84,40,39,87,25,18,64,22,0,0,0,0,0,62,238,253,217,18,0,0,0,4,5,122,122,19,38,6,154,248,248,248,249,233,121,62,2,0,0,0,11,71,62,62,18, -0,0,0,0,0,22,86,102,91,44,56,102,43,0,0,0,0,19,109,153,96,71,2,0,22,130,156,22,138,250,248,169,122,5,0,0,0,0,0,0,4,0,90,248,252,183,11,0, -0,0,3,36,19,0,15,81,65,82,50,0,0,26,64,105,247,248,248,249,248,151,66,0,13,34,16,60,37,0,98,179,179,137,76,84,40,39,87,25,18,64,22,81,243,248,248,248, -252,248,170,235,249,194,9,0,0,0,5,122,122,19,38,6,0,3,36,14,22,92,102,63,2,0,11,80,102,71,26,64,19,0,0,0,22,98,221,250,206,32,66,70,78,13,0,0, -0,18,203,252,237,40,0,0,0,22,130,156,20,70,158,124,5,0,0,0,0,0,0,0,0,0,0,0,5,176,252,248,248,248,249,248,207,22,0,26,102,75,0,0,0,0,26,64, -18,0,42,101,102,66,80,29,0,20,73,38,0,70,173,174,168,179,111,83,88,82,25,0,0,22,64,22,0,0,0,66,234,251,227,156,22,0,0,0,0,0,5,122,122,19,38,6, -154,248,249,248,249,233,121,63,2,0,11,80,102,71,26,64,19,0,0,0,22,86,102,90,16,16,66,70,78,13,0,0,0,0,22,148,177,24,0,0,0,22,130,156,20,139,253,252, -94,0,0,0,0,0,0,0,0,90,248,248,97,129,142,11,0,3,36,19,0,0,0,26,102,75,0,0,0,0,99,246,248,248,249,250,158,66,80,29,0,20,73,38,0,70,173,174, -168,179,111,83,88,82,25,0,0,22,64,22,81,243,248,249,251,249,247,250,229,31,0,0,0,0,0,5,122,122,19,36,9,34,19,0,0,23,92,102,61,18,80,102,78,9,0,25, -64,19,0,22,99,221,250,207,24,59,42,30,55,82,13,0,0,9,91,215,251,231,39,0,0,0,22,128,144,121,154,71,1,0,0,0,0,0,0,0,0,0,0,0,0,14,230,252, -248,249,248,207,18,0,13,80,55,77,48,0,0,0,0,25,56,54,100,102,52,0,29,87,37,53,42,32,71,168,178,68,43,169,188,128,102,86,8,0,0,0,22,64,22,0,66,234, -251,213,18,88,148,22,0,0,0,0,0,5,122,122,19,36,9,168,248,248,248,249,233,121,61,18,80,102,78,9,0,25,64,19,0,22,87,102,90,17,6,59,42,30,55,82,13,0, -0,9,79,76,110,149,22,0,0,0,22,128,144,121,192,250,248,90,0,0,0,0,0,0,90,248,248,94,0,5,129,141,14,34,19,0,0,0,13,80,55,77,48,0,0,81,243,249, -250,250,250,251,210,18,29,87,37,53,42,32,71,168,178,68,43,169,188,128,102,86,8,0,0,0,22,64,22,81,245,252,249,248,248,247,145,148,22,0,0,0,0,0,5,122,122,19, -58,21,0,0,0,0,23,90,102,94,102,75,9,13,4,0,25,58,35,97,221,250,206,24,62,37,0,12,33,55,82,11,7,82,71,19,202,236,161,22,0,0,0,22,178,185,27,62, -62,2,0,0,0,0,0,0,0,0,0,0,9,176,248,252,253,248,219,18,0,13,84,50,0,14,85,48,0,15,3,0,56,102,102,50,0,0,0,36,102,55,0,84,180,169,74,0, -10,75,181,204,119,74,84,12,0,0,0,22,64,80,234,251,213,18,0,0,88,148,22,0,0,0,0,0,5,122,122,19,58,21,154,248,248,248,249,233,121,94,102,75,9,13,4,0, -25,58,35,85,102,89,16,6,62,37,0,12,33,55,82,11,7,82,71,1,16,112,149,22,0,0,0,22,178,185,27,133,250,248,90,0,0,0,0,90,248,248,94,0,0,0,5,129, -152,25,0,0,0,13,84,50,0,14,85,48,81,244,248,248,250,248,158,209,248,198,18,36,102,55,0,84,180,169,74,0,10,75,181,204,119,74,84,12,0,0,0,22,64,67,192,248, -247,248,248,248,243,141,148,22,0,0,0,0,0,5,124,139,33,34,6,0,0,0,0,34,102,102,97,24,0,19,36,3,0,38,108,221,250,202,24,62,37,0,0,0,13,33,53,78, -78,68,2,0,18,44,112,150,23,0,5,121,124,128,154,22,67,69,3,0,0,0,0,0,0,0,0,9,180,248,248,249,252,252,248,90,13,84,50,0,0,0,22,96,36,15,29,43, -99,102,82,16,0,0,10,56,56,84,95,178,173,95,4,8,34,40,120,178,179,100,78,86,12,0,0,0,81,239,251,213,18,0,0,0,0,88,148,22,0,0,0,0,0,5,124,139, -33,34,6,154,248,248,248,249,235,124,97,24,0,19,36,3,0,38,97,102,86,16,6,62,37,0,0,0,13,33,53,78,78,68,2,0,0,19,112,150,23,0,5,121,124,128,154,22, -136,250,248,90,0,0,90,248,248,94,0,0,0,0,3,37,137,140,11,0,13,84,50,0,0,0,22,147,245,248,249,249,248,151,82,33,198,248,200,70,56,84,95,178,173,95,4,8, -34,40,120,178,179,100,78,86,12,0,0,0,67,182,121,137,248,247,248,248,248,243,141,150,31,0,0,0,0,3,40,132,122,19,38,6,0,0,13,79,102,100,102,80,16,0,18,30, -24,96,221,251,205,23,62,37,0,0,0,0,0,10,36,92,102,15,0,0,0,0,19,102,145,34,121,124,4,22,130,158,20,70,70,3,0,0,0,0,0,0,9,180,248,248,249,248, -199,181,252,248,144,50,0,0,0,0,1,44,35,0,53,112,103,49,22,63,18,9,62,37,0,95,205,187,71,12,40,34,40,88,28,52,170,179,98,66,83,13,0,72,234,251,221,35, -0,0,0,0,0,0,88,150,31,0,0,0,0,3,40,132,122,19,38,6,149,248,248,250,251,234,124,80,16,0,18,30,24,84,102,102,32,6,62,37,0,0,0,0,0,10,36,92, -102,15,0,0,0,0,19,102,145,34,121,124,4,22,130,158,20,138,250,248,90,90,248,248,94,0,0,0,0,3,36,19,5,129,139,24,83,50,0,0,0,0,82,245,249,248,250,248, -151,49,22,63,34,200,250,206,18,95,205,187,71,12,40,34,40,88,28,52,170,179,98,66,83,13,0,58,160,121,106,241,199,87,243,248,248,248,243,139,151,22,0,0,3,36,19,5, -122,122,19,38,3,12,83,102,72,30,90,102,83,15,0,34,105,221,250,206,68,62,53,93,13,0,0,0,0,7,82,82,54,80,13,0,0,0,0,0,81,175,135,6,0,0,21,134, -154,22,69,70,3,0,0,0,0,9,185,248,248,249,248,198,18,5,179,253,250,90,0,0,0,0,0,1,27,57,173,167,72,0,0,22,60,62,34,0,74,178,187,138,28,4,39,58, -86,26,0,0,53,171,179,88,50,84,77,235,251,213,35,62,21,0,0,0,0,0,0,86,151,22,0,0,3,36,19,5,122,122,19,38,3,154,250,251,250,249,233,124,83,15,0,34, -94,102,85,36,54,62,53,93,13,0,0,0,0,7,82,82,54,80,13,0,0,0,0,0,81,175,135,6,0,0,21,134,154,22,138,250,248,248,248,94,0,0,0,0,3,36,19,0, -0,5,134,173,55,0,0,0,0,81,243,248,249,250,251,195,72,0,0,22,60,75,206,248,214,184,187,138,28,4,39,58,86,26,0,0,53,171,179,88,50,84,63,163,113,62,202,250, -67,22,81,243,248,248,248,243,141,149,22,3,36,19,0,0,5,122,122,15,42,84,102,75,8,0,20,92,102,79,35,96,221,251,202,22,64,83,147,179,93,0,0,0,9,82,68,16, -32,55,82,13,0,0,0,0,100,155,138,20,0,0,0,18,128,156,22,69,70,3,0,0,9,185,248,248,249,248,194,18,0,13,85,190,252,248,90,0,0,0,0,0,47,176,176,55, -14,34,2,7,63,70,18,74,178,178,74,28,89,52,38,90,53,2,0,0,0,57,171,179,79,100,240,251,213,18,0,20,64,22,0,0,0,0,0,0,88,149,22,3,36,19,0,0, -5,122,122,15,42,84,191,250,248,248,248,233,124,79,35,84,102,96,17,5,64,83,147,179,93,0,0,0,9,82,68,16,32,55,82,13,0,0,0,0,100,155,138,20,0,0,0,18, -128,156,22,178,250,248,150,0,0,0,0,3,36,19,0,0,0,13,85,152,138,11,0,0,81,243,248,248,249,251,202,55,14,34,2,7,63,70,34,214,253,238,87,28,89,52,38,90, -53,2,0,0,0,57,171,179,79,89,188,115,62,198,248,207,45,61,22,81,243,248,248,248,243,142,148,55,19,0,0,0,0,5,122,128,91,102,75,6,0,16,13,18,88,102,112,221, -250,204,31,60,49,148,198,148,25,0,0,9,82,71,3,0,13,33,54,82,17,0,0,110,133,14,84,148,22,0,0,0,21,130,156,22,69,70,3,9,190,248,248,249,248,194,18,0, -13,84,50,5,175,252,248,90,0,15,14,45,175,176,72,14,0,14,19,60,33,22,119,184,178,74,0,6,52,91,90,22,9,38,5,4,9,0,58,167,184,236,251,223,28,0,3,59, -45,61,22,0,0,0,0,0,0,90,148,55,19,0,0,0,0,5,122,128,91,102,75,151,248,248,248,248,233,124,101,102,82,27,14,60,49,148,198,148,25,0,0,9,82,71,3,0, -13,33,54,82,17,0,0,110,133,14,84,148,22,0,0,0,21,130,191,249,250,250,248,90,0,0,3,36,19,0,0,0,13,84,50,5,129,142,11,81,243,248,248,249,251,202,72,14, -0,14,19,60,33,22,119,190,238,250,198,24,52,91,90,22,9,38,5,4,9,0,58,167,178,170,124,107,200,248,204,73,4,20,64,22,81,243,248,248,248,243,158,155,22,0,0,0, -0,0,19,166,175,80,35,4,0,5,36,9,40,102,118,235,204,21,61,52,138,179,149,78,21,0,9,82,71,2,0,0,0,12,34,70,82,22,121,135,12,0,0,88,148,22,0,0, -0,22,130,156,22,69,73,191,248,248,249,248,194,14,0,13,84,50,0,0,5,175,252,248,90,2,66,175,176,56,3,34,16,7,61,37,0,74,185,198,89,0,10,33,39,90,90,29, -14,13,38,37,9,10,23,107,239,254,225,61,82,19,66,71,4,20,64,22,0,0,0,0,0,3,113,155,22,0,0,0,0,0,19,166,175,80,35,4,144,248,249,248,249,235,127,101, -29,4,61,52,138,179,149,78,21,0,9,82,71,2,0,0,0,12,34,70,82,22,121,135,12,0,0,88,148,22,0,0,0,104,251,252,108,138,250,248,90,3,36,19,0,0,0,13, -84,50,0,0,5,129,177,243,248,248,250,251,202,56,3,34,16,7,61,37,0,74,185,198,101,198,248,206,54,90,90,29,14,13,38,37,9,10,23,96,183,203,118,208,250,207,80,71, -0,0,22,64,22,81,243,248,248,249,244,143,147,22,0,0,0,15,86,105,160,125,17,38,6,0,0,45,88,102,102,118,91,59,50,138,179,138,18,23,60,26,78,71,2,0,0,0, -0,4,42,37,57,166,143,11,0,0,0,0,88,148,22,0,0,0,22,130,156,22,69,161,248,249,248,194,14,0,13,84,50,0,0,0,0,5,175,252,248,117,174,176,64,0,0,1, -36,65,36,0,74,178,178,90,62,27,29,41,87,24,26,99,153,54,43,40,13,37,76,230,252,242,184,78,48,102,70,1,0,0,22,64,22,0,0,0,3,36,19,91,147,22,0,0, -0,15,86,105,160,125,17,38,6,144,248,249,250,251,235,127,79,59,50,138,179,138,18,23,60,26,78,71,2,0,0,0,0,4,42,37,57,166,143,11,0,0,0,0,88,148,22,0, -90,248,248,176,156,22,138,250,248,112,19,0,0,0,13,84,50,0,0,0,0,85,249,252,248,249,251,202,64,0,0,1,36,65,36,0,74,178,178,90,62,43,204,249,218,41,26,99, -153,54,43,40,13,37,62,145,139,193,238,250,213,113,70,1,0,0,0,22,64,22,81,243,249,248,248,243,143,147,22,0,16,86,102,72,11,124,110,16,38,3,22,89,102,85,31,88, -102,92,138,179,138,18,0,0,27,101,76,0,0,0,0,0,6,38,12,19,144,161,88,13,0,0,0,0,0,88,150,22,0,0,0,22,130,156,22,68,170,248,194,9,0,13,84,50, -0,0,0,0,0,0,5,172,252,253,203,57,28,18,0,10,60,37,0,74,178,178,74,0,28,70,52,84,28,0,0,30,124,179,59,19,61,78,234,249,205,78,175,180,121,84,78,11, -0,0,0,22,64,22,0,3,36,19,0,0,91,147,22,0,16,86,102,72,11,124,110,16,38,3,154,250,251,250,249,233,127,92,138,179,138,18,0,0,27,101,76,0,0,0,0,0, -6,38,12,19,144,161,88,13,0,0,0,0,0,88,150,105,248,248,94,22,130,156,22,137,250,248,90,0,0,13,84,50,0,0,0,0,81,243,248,252,252,251,200,57,28,18,0,10, -60,37,0,74,178,178,74,0,28,70,66,217,249,198,18,30,124,179,59,19,61,65,159,51,26,213,253,240,130,84,78,11,12,0,0,0,22,63,23,102,244,248,248,248,243,143,147,37, -90,102,69,6,0,9,42,1,10,46,89,102,82,37,18,62,106,185,199,140,18,0,0,9,78,76,58,20,0,0,0,4,36,14,1,128,141,39,55,82,13,0,0,0,0,1,107,156, -22,0,0,0,22,129,157,48,75,140,12,0,13,84,50,0,46,22,0,0,0,0,0,47,223,254,250,90,2,32,24,58,37,0,74,178,178,74,0,10,29,53,102,43,0,0,0,0, -52,125,169,62,79,237,249,203,18,0,69,198,199,79,63,87,12,0,0,0,22,63,23,31,19,0,0,0,0,91,147,37,90,102,69,6,0,9,42,1,10,46,89,188,250,249,248,250, -235,196,199,140,18,0,0,9,78,76,58,20,0,0,0,4,36,14,1,128,141,39,55,82,13,0,0,0,0,1,160,252,249,94,0,0,22,129,157,48,142,250,248,90,13,84,50,0, -46,22,0,81,243,248,248,249,253,221,61,0,2,32,24,58,37,0,74,178,178,74,0,10,29,53,102,58,198,248,198,18,52,125,169,62,66,172,56,18,198,248,217,202,199,79,63,87, -87,12,0,0,0,22,75,33,81,243,248,248,248,243,150,184,114,93,23,0,0,0,0,0,22,91,102,83,10,8,72,55,146,206,185,80,4,0,9,82,71,1,20,64,23,0,0,2, -7,2,116,130,8,14,34,55,82,13,0,0,0,0,4,109,154,22,0,0,0,22,137,161,22,69,66,19,82,50,0,0,24,64,20,0,0,0,46,173,171,186,252,248,90,11,72,44, -0,74,178,178,74,0,10,34,41,83,44,58,23,0,0,2,3,29,118,178,234,249,211,24,0,3,70,121,180,169,22,64,87,12,0,0,0,22,75,33,0,0,0,0,0,0,103,184, -114,93,23,0,0,0,0,0,22,91,102,83,144,248,250,250,252,249,196,80,4,0,9,82,71,1,20,64,23,0,0,2,7,2,116,130,8,14,34,55,82,13,0,0,0,90,248,251, -191,22,0,0,0,22,137,161,22,138,250,248,143,50,0,0,24,64,94,243,248,248,249,251,198,146,135,11,0,11,72,44,0,74,178,178,74,0,10,34,41,83,44,58,39,198,248,198, -21,29,118,172,161,56,54,200,248,203,83,121,180,169,22,64,64,87,12,0,3,30,34,60,22,81,243,248,248,248,247,188,175,44,61,19,0,0,0,24,92,102,84,38,13,59,52,152, -183,145,102,102,65,17,80,71,2,0,0,23,55,5,0,0,2,117,130,8,0,0,14,33,55,82,13,0,0,0,0,1,111,156,22,0,3,30,34,128,156,22,69,102,48,0,0,0, -0,23,64,18,0,46,175,176,54,2,175,252,248,128,36,30,87,178,178,74,0,10,34,40,88,28,0,23,55,5,0,0,0,0,84,241,252,213,31,36,11,68,71,3,71,60,1,0, -64,87,12,0,3,30,34,60,22,0,0,0,0,17,88,158,175,44,61,19,0,0,0,24,92,102,84,38,13,167,250,252,253,252,238,127,65,17,80,71,2,0,0,23,55,5,0,0, -2,117,130,8,0,0,14,33,55,82,13,0,90,248,248,94,111,156,22,0,3,30,34,128,156,22,138,251,249,90,0,0,0,97,246,248,248,249,251,202,54,2,130,140,21,59,36,30, -87,178,178,74,0,10,34,40,88,28,0,23,55,22,198,248,198,18,72,193,170,62,201,249,205,81,71,3,71,60,1,0,0,64,86,16,31,19,0,22,64,22,81,243,248,250,251,246, -146,146,42,64,18,0,12,89,102,81,9,17,73,53,138,180,154,30,16,88,102,96,67,1,0,0,0,0,4,0,0,3,118,128,8,0,0,0,0,13,33,55,82,13,0,0,0,0, -3,112,155,23,36,19,0,22,127,161,88,83,64,2,0,0,0,0,24,56,57,175,176,55,0,0,5,177,253,249,90,76,189,184,74,0,10,34,42,88,28,0,0,0,4,0,0,0, -0,69,233,250,227,175,55,14,88,71,2,0,0,0,0,0,0,64,86,16,31,19,0,22,64,22,0,0,18,89,102,69,96,146,42,64,18,0,12,89,102,81,9,17,73,53,202,253, -252,249,248,236,127,96,67,1,0,0,0,0,4,0,0,3,118,128,8,0,0,0,0,13,33,55,82,98,248,248,94,0,3,112,155,23,36,19,0,22,127,161,88,146,250,248,90,0, -81,243,249,250,250,251,202,55,0,0,5,132,158,40,0,76,189,184,74,0,10,34,42,88,28,0,0,0,4,0,18,198,248,210,165,69,128,235,249,206,100,71,2,0,0,0,0,0, -0,0,63,98,26,0,0,0,22,64,18,93,247,251,250,248,243,145,145,43,62,28,76,102,80,9,8,59,58,153,181,138,21,36,10,26,102,102,67,3,0,0,0,0,0,0,4,119, -127,7,0,0,0,0,0,0,13,33,55,82,13,0,0,0,0,2,110,167,36,0,0,0,31,155,173,24,68,70,3,0,0,0,0,60,176,176,45,0,0,0,9,66,199,252,250,205, -179,100,16,8,33,42,88,28,0,0,0,0,0,0,0,0,69,234,249,203,46,121,171,104,74,35,5,0,0,0,0,0,0,0,63,98,26,0,0,0,22,64,18,17,89,102,69,4, -0,93,145,43,62,28,76,102,80,9,8,59,58,153,181,202,249,249,248,249,238,127,67,3,0,0,0,0,0,0,4,119,127,7,0,0,0,0,0,0,13,33,126,250,248,94,0,0, -0,2,110,167,36,0,0,0,31,155,173,24,137,250,248,141,243,248,248,250,251,201,45,0,0,0,9,66,166,136,78,178,179,100,16,8,33,42,88,28,0,0,0,0,0,0,0,18, -210,252,209,35,205,251,237,114,74,35,5,0,0,0,0,0,0,2,30,70,84,12,0,0,0,18,67,91,151,246,248,248,248,243,145,145,42,87,102,78,9,8,62,52,138,183,156,24, -0,1,35,80,69,86,102,68,4,0,0,0,0,4,121,126,6,0,0,0,0,0,0,8,0,13,33,55,82,13,0,0,0,2,34,117,154,22,0,13,80,61,125,156,22,69,70,3, -0,0,46,174,176,82,12,0,0,10,58,81,102,209,253,253,138,2,38,42,40,88,28,0,0,0,0,0,0,0,0,69,234,249,203,18,0,30,131,189,56,12,38,6,0,0,0,0, -0,2,30,70,84,12,0,0,0,18,67,91,102,68,4,0,0,0,93,145,42,87,102,78,9,8,62,52,138,183,156,24,140,248,249,250,250,238,127,68,4,0,0,0,0,4,121,126, -6,0,0,0,0,0,0,8,0,98,249,250,146,13,0,0,0,2,34,117,154,22,0,13,80,61,125,156,22,138,250,248,248,248,249,251,201,82,12,0,0,10,58,81,102,182,192,179, -74,2,38,42,40,88,28,0,0,0,0,0,0,0,0,55,165,209,248,238,248,209,140,189,56,12,38,6,0,0,0,0,3,36,17,0,64,87,12,0,0,18,92,102,75,84,243,248, -248,248,243,145,145,45,85,24,6,62,52,138,179,138,31,38,3,7,79,86,14,14,89,102,68,4,0,0,6,122,124,6,0,0,0,0,0,0,0,29,24,0,13,33,55,82,13,0, -3,36,18,1,111,154,32,84,50,0,21,130,157,24,70,69,4,45,175,176,45,24,59,13,8,62,35,12,128,204,223,251,248,95,32,58,92,25,0,0,0,0,0,0,0,0,69,234, -249,203,18,0,3,65,76,118,172,57,14,38,6,0,0,0,3,36,17,0,64,87,12,0,0,18,92,102,75,4,0,0,0,0,0,93,145,45,85,24,6,62,52,138,179,138,31,38, -3,138,250,250,248,248,239,127,68,4,0,0,6,122,124,6,0,0,0,0,0,0,0,29,106,248,248,115,55,82,13,0,3,36,18,1,111,154,32,84,50,0,21,130,157,98,248,250, -248,249,251,202,45,24,59,13,8,62,35,12,128,204,205,105,1,8,32,58,92,25,0,0,0,0,0,0,0,0,55,159,50,35,238,248,239,91,76,118,172,57,14,38,6,0,0,0, -36,19,0,0,0,64,87,10,18,90,102,74,49,3,81,243,248,248,248,243,146,145,39,57,60,50,138,179,138,18,0,12,36,80,68,8,33,13,15,89,102,69,4,5,122,116,6,0, -0,0,0,0,0,0,0,1,33,24,0,25,112,71,82,15,33,18,0,0,0,115,185,66,0,0,0,23,124,149,25,64,83,173,176,47,0,0,25,59,60,34,0,74,181,202,146,150, -249,249,116,84,52,13,0,0,0,0,0,0,0,67,234,249,203,18,0,3,70,70,1,28,125,173,58,14,38,6,0,3,36,19,0,0,0,64,87,10,18,90,102,74,49,3,0,0, -0,0,0,0,95,145,39,57,60,50,138,179,138,18,0,12,36,80,167,248,249,248,248,239,127,69,4,5,122,116,6,0,0,0,0,0,0,0,0,91,249,249,94,25,112,71,82,15, -33,18,0,0,0,115,185,66,0,0,0,23,165,250,249,250,250,253,219,47,0,0,25,59,60,34,0,74,181,202,146,89,46,30,40,84,52,13,0,0,0,0,0,0,0,53,159,50, -18,198,248,239,250,214,19,28,125,173,58,14,38,6,0,3,19,0,0,0,0,0,60,83,88,102,66,4,2,0,0,81,243,248,248,248,243,146,147,76,81,143,179,138,18,0,0,7, -83,88,7,0,3,36,13,15,89,102,73,125,122,1,0,0,0,0,0,0,0,0,0,0,1,33,24,93,183,150,66,88,24,0,0,0,12,82,134,154,22,0,0,0,4,88,145,71, -172,176,48,0,0,0,7,65,70,12,74,178,178,81,78,102,153,250,250,106,0,36,19,0,0,0,0,0,59,231,249,203,18,0,3,70,71,3,0,0,29,124,173,58,14,36,9,34, -19,0,0,0,0,0,60,83,88,102,66,4,2,0,0,0,0,0,0,0,0,95,147,76,81,143,179,138,18,0,0,7,83,88,7,135,248,249,248,248,239,127,73,125,122,1,0,0, -0,0,0,0,0,0,90,248,248,115,24,93,183,150,66,88,24,0,0,0,12,82,134,154,22,0,0,81,243,250,252,250,252,253,249,90,0,0,7,65,70,12,74,178,178,81,78,102, -94,63,83,26,0,36,19,0,0,0,0,0,44,148,48,18,198,248,203,95,214,248,198,18,29,124,173,58,14,36,9,34,0,0,0,0,0,0,22,101,102,67,0,0,0,0,0,0, -81,243,248,248,248,243,169,150,151,197,144,18,0,0,9,82,68,16,36,6,0,3,36,13,15,92,176,160,10,0,0,0,0,0,0,0,0,0,0,0,0,1,33,46,140,183,159,65, -75,13,0,13,84,49,2,111,156,22,0,0,0,0,113,209,173,81,64,2,0,10,58,33,28,118,182,178,74,0,18,88,102,158,250,248,90,3,36,19,0,0,0,68,231,249,203,18, -0,3,70,70,3,0,0,0,0,29,118,168,59,14,58,21,0,0,0,0,0,0,22,101,102,67,0,0,0,0,0,0,0,0,0,0,0,10,128,150,151,197,144,18,0,0,9,82, -68,16,36,6,130,248,249,248,248,239,190,160,10,0,0,0,0,0,0,0,0,90,248,248,94,1,33,46,140,183,159,65,75,13,0,13,84,49,2,111,156,22,81,243,248,248,251,253, -199,145,250,248,90,10,58,33,28,118,182,178,74,0,18,88,102,102,58,0,0,3,36,19,0,0,0,53,148,40,18,198,248,203,83,70,21,198,248,198,18,29,118,168,59,14,58,21, -6,0,0,0,0,22,91,102,87,80,11,0,0,0,0,5,1,81,243,248,248,250,246,192,179,152,73,12,0,9,82,71,3,0,14,38,7,0,3,36,18,131,170,106,70,5,0,0, -0,0,0,0,0,0,0,0,0,0,1,32,41,153,187,147,62,78,26,80,50,0,0,3,112,156,22,0,0,45,169,190,154,23,69,67,15,59,35,0,74,188,197,82,0,10,29,51, -102,102,149,249,248,90,3,36,19,0,69,234,249,203,18,0,3,70,69,1,0,0,0,0,0,0,9,73,168,82,28,34,6,0,0,0,0,22,91,102,87,80,11,0,0,0,0,5, -1,0,0,0,10,62,48,162,179,152,73,12,0,9,82,71,3,0,14,38,7,130,248,249,248,252,246,132,70,5,0,0,0,0,0,0,90,248,248,94,0,0,1,32,41,153,187,147, -62,78,26,80,50,0,0,3,112,187,244,248,248,249,251,211,154,23,138,250,248,128,35,0,74,188,197,82,0,10,29,51,102,102,88,44,4,0,3,36,19,0,55,159,48,18,198,248, -203,83,69,1,0,18,198,248,198,18,9,73,168,82,28,34,38,6,0,0,23,92,102,62,7,62,87,12,0,0,19,32,2,0,81,243,250,250,252,251,190,134,46,59,20,79,71,2, -0,0,0,14,38,6,0,8,142,131,20,88,102,70,5,0,0,0,2,43,14,0,0,0,0,0,0,1,54,54,142,182,144,69,102,54,0,0,0,0,3,112,156,20,43,175,175,62, -85,148,23,70,96,36,0,53,179,178,97,60,20,30,38,85,36,76,102,151,249,248,90,3,36,83,234,249,203,18,0,6,70,68,3,41,14,0,0,0,0,0,0,1,90,172,60,15, -38,6,0,0,23,92,102,62,7,62,87,12,0,0,19,32,2,0,0,10,62,52,138,179,159,134,46,59,20,79,71,2,0,0,0,14,38,6,130,248,252,252,248,239,129,70,5,0, -0,0,2,118,248,248,94,0,0,0,0,1,54,54,142,182,144,69,102,54,0,0,0,0,83,248,252,249,249,251,201,62,85,148,23,138,251,249,90,53,179,178,97,60,20,30,38,85, -36,76,102,90,44,2,0,3,36,70,159,50,18,198,248,204,83,68,3,41,14,0,18,198,248,198,18,1,90,172,60,15,14,38,3,21,96,102,63,2,0,0,64,87,11,15,36,4, -0,0,10,123,246,252,253,252,244,143,143,51,99,72,1,0,0,0,0,0,14,38,11,123,126,41,13,15,88,102,70,6,0,3,50,50,6,0,0,0,0,0,2,34,20,29,42,145, -186,174,84,76,12,0,0,0,0,3,105,160,174,173,62,0,0,88,152,74,82,66,2,15,124,79,0,37,68,44,85,30,0,10,79,102,151,249,248,90,71,237,249,203,18,0,0,46, -68,2,47,51,6,0,0,0,0,0,2,34,20,69,168,60,14,38,3,21,96,102,63,2,0,0,64,87,11,15,36,4,0,0,10,62,52,138,179,139,25,92,143,51,99,72,1,0, -0,0,0,0,14,38,11,190,252,249,248,248,238,129,70,6,0,3,122,249,248,94,0,0,0,0,2,34,20,29,42,145,186,174,84,76,12,0,0,81,243,248,250,253,251,199,62,0, -0,88,152,74,146,250,248,100,124,79,0,37,68,44,85,30,0,10,79,102,90,43,2,0,57,173,65,18,198,248,203,60,68,2,47,51,6,0,0,18,198,248,198,50,20,69,168,60, -61,14,35,22,87,65,2,0,0,0,0,62,88,40,0,0,0,10,62,52,175,251,252,249,249,243,151,176,93,56,10,0,0,0,0,0,0,19,143,127,6,3,36,9,16,88,102,70, -11,47,50,2,0,0,0,0,0,2,35,21,0,1,30,48,178,195,142,63,82,13,0,0,0,0,43,193,209,76,0,0,0,10,129,163,25,69,69,4,33,8,8,29,57,102,38,0, -0,0,10,79,102,151,249,249,241,249,210,32,0,0,0,6,3,48,50,2,0,0,0,0,0,2,35,21,0,1,71,167,61,14,35,22,87,65,2,0,0,0,0,62,88,40,0,0, -0,10,62,52,138,179,138,22,36,7,102,176,93,56,10,0,0,0,0,0,0,19,143,127,129,248,249,248,248,238,132,70,11,120,249,248,94,0,0,0,0,2,35,21,0,1,30,48, -178,195,142,63,82,13,81,243,248,248,249,252,224,76,0,0,0,10,129,163,25,138,250,248,111,8,8,29,57,102,38,0,0,0,10,79,102,90,44,57,159,52,51,201,248,203,18,6, -3,48,50,2,0,0,0,0,18,198,249,203,18,1,71,167,168,62,14,35,15,2,0,0,0,0,0,15,78,84,11,0,10,62,52,138,179,175,244,248,248,249,247,177,144,50,58,4, -0,0,0,0,5,123,131,43,6,0,2,7,0,16,86,102,88,48,1,0,0,0,0,0,2,35,20,0,0,0,12,86,74,147,183,143,63,82,13,0,0,46,174,170,133,151,22,0, -10,62,37,88,148,24,70,68,9,38,36,37,83,56,51,4,0,0,0,10,79,102,179,252,249,219,20,7,0,0,0,1,49,50,2,0,0,0,0,0,2,35,20,0,0,0,1,71, -168,62,14,35,15,2,0,0,0,0,0,15,78,84,11,0,10,62,52,138,179,138,18,0,8,37,81,152,218,64,58,4,0,0,0,0,5,123,131,43,6,126,248,248,248,248,238,132, -147,249,248,94,0,0,0,0,2,35,20,0,0,0,12,86,74,147,183,143,63,137,244,248,248,249,251,197,133,151,22,0,10,62,37,88,148,24,138,250,248,115,36,37,83,56,51,4, -0,0,0,10,79,102,126,175,52,18,198,248,203,18,0,1,49,50,2,0,0,0,0,0,2,51,202,248,198,18,1,71,70,167,62,14,36,5,0,0,0,0,19,34,4,63,84,23, -58,52,138,179,138,18,81,243,248,250,250,243,148,142,31,2,0,0,0,5,123,124,6,15,38,6,0,0,0,0,18,98,102,70,5,0,0,0,0,2,36,20,0,0,0,13,84,48, -28,45,148,183,141,63,82,13,44,175,176,60,4,110,154,30,62,37,0,0,88,148,24,68,69,36,56,88,28,0,16,2,0,0,0,0,10,127,242,251,249,248,90,0,0,0,2,50, -50,2,0,0,0,0,0,2,36,20,0,0,0,0,0,1,70,167,62,14,36,5,0,0,0,0,19,34,4,63,84,23,58,52,138,179,138,18,0,0,8,81,88,175,251,230,47,2, -0,0,0,5,123,124,6,15,38,6,126,248,248,248,248,243,251,250,97,0,0,0,0,2,36,20,0,0,0,13,84,48,28,45,148,183,178,246,250,248,249,251,202,60,4,110,154,30, -62,37,0,0,88,148,24,137,250,249,126,88,28,0,16,2,0,0,0,0,10,117,197,123,58,198,248,203,18,0,2,50,50,2,0,0,0,0,0,2,36,20,18,198,248,198,18,1, -1,70,168,63,14,38,6,0,0,19,36,3,0,0,64,102,58,138,179,138,18,0,0,87,247,250,248,249,243,148,141,17,0,0,5,123,124,6,0,0,15,38,6,0,0,2,45,54, -85,102,72,6,0,0,3,36,20,0,0,0,13,84,48,0,0,33,46,150,183,140,57,89,174,176,62,0,0,1,112,175,55,0,0,0,0,88,148,32,83,77,80,54,7,0,0,0, -0,0,0,0,69,235,251,224,158,249,248,90,0,2,50,50,2,0,0,0,0,0,3,36,20,0,0,0,0,0,0,0,1,70,168,63,14,38,6,0,0,19,36,3,0,0,64,102, -58,138,179,138,18,0,0,9,82,69,13,52,200,251,230,33,0,0,5,123,124,6,0,0,15,38,6,126,248,248,249,250,250,177,72,6,0,0,3,36,20,0,0,0,13,84,48,0, -0,33,46,183,251,252,250,250,251,202,62,0,0,1,112,175,55,0,0,0,0,88,148,32,146,250,250,125,7,0,0,0,0,0,0,0,55,163,113,113,218,249,203,18,0,2,50,50, -2,0,0,0,0,0,3,36,20,0,0,18,198,248,198,18,18,1,69,166,63,14,38,4,17,36,3,0,0,9,54,82,174,183,138,18,0,0,8,82,129,243,248,248,249,243,149,142, -14,1,123,124,6,0,0,0,0,15,38,4,1,50,50,0,15,86,102,72,5,0,35,19,0,0,0,13,84,56,9,0,0,1,33,47,151,182,151,170,174,66,0,0,0,9,60,112, -148,22,0,0,0,0,94,161,58,102,75,8,36,11,0,0,0,0,0,69,234,249,205,91,102,151,249,248,91,50,50,2,0,0,0,0,0,3,35,19,0,0,0,0,0,6,13,0, -0,1,69,166,63,14,38,4,17,36,3,0,0,9,54,82,174,190,146,18,0,0,8,82,71,3,0,10,54,200,251,230,31,1,123,124,6,0,0,0,0,15,38,4,127,249,249,248, -248,238,132,72,5,0,35,19,0,0,0,13,84,56,9,0,0,1,103,245,252,253,253,251,200,66,0,0,0,9,60,112,148,22,0,0,0,0,94,161,58,158,250,248,114,11,0,0, -0,0,0,55,159,50,27,216,251,221,58,1,1,50,50,2,0,0,0,0,0,3,35,19,0,0,0,0,18,199,248,198,198,18,1,69,166,65,11,47,36,2,0,0,10,62,52,138, -194,177,30,0,0,9,81,71,2,81,243,248,248,249,243,148,130,119,119,6,0,0,0,0,0,0,14,33,48,49,2,0,0,16,86,102,72,35,16,0,0,0,13,84,48,9,60,20, -0,0,1,32,42,162,209,201,87,75,12,0,11,62,37,0,88,148,22,0,0,10,30,113,184,50,64,67,9,37,11,0,0,0,69,234,249,203,18,10,79,102,151,249,249,122,2,0, -0,0,0,0,3,36,18,0,0,0,0,0,0,14,62,20,0,0,1,69,166,65,11,47,36,2,0,0,10,62,52,138,200,244,205,18,0,9,81,71,2,0,0,0,10,54,200,251, -227,128,119,6,0,0,0,0,0,0,14,33,121,249,248,248,248,248,238,134,72,35,16,0,0,0,13,84,48,9,60,20,0,81,243,249,249,252,253,218,87,75,12,0,11,62,37,0, -88,148,22,0,0,10,30,113,184,50,135,250,248,114,11,0,0,0,55,159,50,18,198,248,219,113,90,41,45,49,2,0,0,0,0,0,3,36,18,0,0,0,0,0,0,31,212,248, -248,198,18,1,69,165,75,41,36,5,0,7,60,52,138,179,138,65,84,11,7,82,71,2,0,0,81,243,248,248,249,243,190,179,20,0,0,0,0,0,0,0,0,54,65,6,0,0, -0,0,14,85,102,78,4,0,0,13,84,50,0,0,22,60,16,0,0,0,61,175,207,197,131,59,81,20,56,37,0,0,0,88,148,22,10,33,38,88,108,148,24,70,67,9,37,11, -0,69,234,249,203,18,0,0,10,78,102,155,250,248,90,0,0,0,0,3,36,19,0,0,0,0,0,0,0,0,23,64,20,0,0,1,69,165,75,41,36,5,0,7,60,52,138,179, -146,212,250,200,24,82,71,2,0,0,0,0,0,9,54,200,252,238,36,0,0,0,0,0,0,0,0,125,250,248,169,248,248,248,248,238,134,78,4,0,0,13,84,50,0,0,22,60, -92,243,248,248,250,251,222,197,131,59,81,20,56,37,0,0,0,88,148,22,10,33,38,88,108,148,24,138,250,248,114,11,0,55,159,50,18,198,248,203,27,78,102,96,65,3,0,0, -0,0,0,3,36,19,0,0,0,0,0,0,0,0,39,212,212,248,198,18,0,76,176,66,13,38,6,4,38,138,179,138,18,0,48,79,78,68,2,0,0,0,0,81,243,248,248,252, -249,146,137,15,0,0,0,0,0,2,50,48,16,35,4,0,0,0,0,42,88,102,72,4,11,84,50,0,0,0,0,19,59,18,0,45,174,172,95,154,183,134,58,87,33,0,0,0, -0,0,88,152,53,38,88,30,0,88,148,24,70,67,9,37,77,234,249,203,18,0,0,0,0,12,93,102,150,249,248,90,0,0,3,36,19,0,0,0,0,0,0,0,0,0,0,23, -64,19,0,0,0,76,176,66,13,38,6,4,38,138,179,138,18,18,209,250,216,81,2,0,0,0,0,0,0,0,14,149,225,251,229,32,0,0,0,0,0,2,122,249,248,116,4,122, -248,248,248,249,238,134,72,4,11,84,50,0,0,0,0,94,246,248,248,249,251,198,95,154,183,134,58,87,33,0,0,0,0,0,88,152,53,38,88,30,0,88,148,24,138,250,248,114, -64,159,50,18,198,248,203,18,0,12,93,102,88,42,2,0,0,0,3,36,19,0,0,0,0,0,0,0,0,0,0,40,40,212,248,198,35,33,65,166,66,14,38,23,138,179,138,18, -0,0,6,94,102,15,0,0,0,0,0,0,81,243,252,252,249,243,150,140,15,0,0,0,2,49,50,2,0,35,74,6,0,3,36,15,14,86,102,74,78,48,0,0,0,0,0,0, -23,56,57,175,176,60,27,52,157,183,132,58,80,13,0,0,0,0,10,110,164,102,30,0,0,0,88,148,24,70,68,75,237,249,203,18,0,0,0,0,2,46,51,77,102,151,249,248, -90,3,36,19,0,0,0,0,0,0,0,0,0,0,0,0,24,64,18,0,18,33,65,166,66,14,38,23,138,179,138,18,0,0,24,219,251,201,18,0,0,0,0,0,0,5,123,129, -58,200,251,230,32,0,0,0,2,122,249,248,94,35,74,6,122,248,249,248,248,238,134,74,78,48,0,0,0,0,81,243,249,250,250,251,202,60,27,52,157,183,132,58,80,13,0,0, -0,0,10,110,164,102,30,0,0,0,88,148,24,138,250,249,201,59,18,198,248,203,18,0,2,46,51,77,102,91,43,2,0,3,36,19,0,0,0,0,0,0,0,0,0,0,0,0, -0,41,212,225,55,2,0,67,166,62,29,156,181,138,18,0,0,9,82,66,48,82,13,0,0,0,0,0,5,165,249,248,248,249,243,150,140,15,0,2,52,50,1,0,0,6,71,76, -10,33,19,0,0,12,84,102,87,4,0,0,0,0,0,0,0,60,176,176,60,0,0,33,53,157,183,131,58,82,13,0,0,10,34,38,146,161,22,0,0,0,0,88,148,21,116,240, -249,211,28,0,0,0,0,2,50,50,25,121,88,102,151,249,248,112,19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,60,31,32,2,0,67,166,62,29,156,181,138,18,0, -0,9,82,79,209,250,201,18,0,0,0,0,5,123,124,6,9,54,200,251,229,32,0,2,124,249,248,94,0,6,71,76,10,136,248,248,248,248,241,134,87,4,0,0,0,81,243,248, -248,250,251,202,60,0,0,33,53,157,183,131,58,82,13,0,0,10,34,38,146,161,22,0,0,0,0,88,148,21,162,253,249,124,200,248,203,18,0,2,50,50,25,121,88,102,91,42, -5,34,19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,51,94,18,0,0,1,62,154,150,183,156,24,0,0,9,82,71,2,0,50,84,13,0,0,0,5,123,124,85,243, -248,248,249,243,151,140,17,46,82,67,2,0,0,0,2,70,90,19,0,0,0,10,80,92,102,73,7,0,0,0,0,0,45,174,176,87,15,0,0,1,33,54,159,183,130,57,82,12, -7,34,38,88,30,88,148,22,0,0,0,0,81,160,231,251,217,26,37,12,0,0,2,50,50,24,148,91,13,79,102,150,250,248,90,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,36,75,18,0,0,1,62,154,150,183,156,24,0,0,9,82,71,2,18,209,250,201,18,0,0,5,123,124,6,0,0,9,54,200,251,229,34,120,250,250,95,0,0,0,2,70, -90,19,118,248,248,248,250,242,134,73,7,0,81,243,248,248,249,251,202,87,15,0,0,1,33,54,159,183,130,57,82,12,7,34,38,88,30,88,148,22,0,0,0,0,81,152,150,158, -250,248,249,205,18,0,2,50,50,24,148,91,13,79,102,90,59,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,31,27,62,16,0,0,14,156,186,152,26,38,4,8, -82,71,2,0,0,0,51,84,13,0,5,123,124,6,0,81,243,248,248,249,243,151,162,61,9,68,70,3,0,0,2,32,76,74,5,0,13,84,47,15,85,102,74,7,0,0,0,42, -172,176,59,24,62,16,0,0,1,33,56,160,183,128,56,83,40,36,88,30,0,0,88,148,22,0,0,0,63,237,252,207,83,68,10,38,10,1,50,50,24,148,88,0,0,10,78,102, -152,249,248,90,0,0,0,0,0,0,0,0,0,0,0,0,0,18,31,27,62,16,0,0,14,156,186,152,26,38,4,8,82,71,2,0,0,18,209,250,201,18,5,123,124,6,0,0, -0,0,9,54,200,251,241,250,248,137,70,3,0,0,2,32,76,74,5,118,248,250,249,248,241,134,74,86,243,248,248,249,251,202,59,24,62,16,0,0,1,33,56,160,183,128,56,83, -40,36,88,30,0,0,88,148,22,0,0,0,48,174,151,35,227,250,248,125,10,1,50,50,24,148,88,0,0,10,78,102,92,40,2,0,0,0,0,0,0,0,0,0,0,0,0,0, -19,36,3,0,27,64,16,18,138,179,156,154,64,12,37,80,70,2,0,0,6,32,0,49,84,17,123,124,6,0,0,0,81,243,248,248,249,245,171,140,15,3,70,70,2,1,36,17, -1,70,73,21,82,50,0,0,14,84,102,74,7,0,46,172,173,62,0,0,27,64,16,0,0,1,33,58,161,182,131,76,86,83,28,0,6,33,4,88,148,22,0,69,233,249,219,156, -26,46,4,6,34,52,48,24,148,88,0,0,0,0,38,83,102,152,249,248,90,0,0,0,0,0,0,0,0,0,0,0,19,36,3,0,27,64,16,18,138,179,156,154,64,12,37,80, -70,2,0,0,6,32,18,209,250,202,132,124,6,0,0,0,0,0,0,8,50,224,252,252,113,3,70,70,2,1,36,17,1,70,73,21,162,249,248,248,248,241,173,247,248,248,249,251, -200,62,0,0,27,64,16,0,0,1,33,58,161,182,131,76,86,83,28,0,6,33,4,88,148,22,0,55,157,46,93,231,249,226,248,248,112,52,48,24,148,88,0,0,0,0,38,83, -102,91,42,2,0,0,0,0,0,0,0,0,0,0,0,0,36,3,0,0,0,28,77,146,179,138,15,61,165,74,82,88,6,0,0,6,38,15,0,0,55,167,130,6,0,0,0,0, -0,81,243,248,249,250,243,153,139,14,3,69,68,33,18,0,0,1,70,102,49,0,0,0,0,14,84,102,71,50,175,174,59,0,0,0,0,28,63,18,0,0,1,33,57,166,191,97, -95,86,8,3,38,15,0,0,88,136,82,232,249,203,18,88,148,22,0,1,49,65,32,148,88,0,0,0,3,36,16,9,79,102,152,249,248,90,0,0,0,0,0,0,0,0,0,18, -36,3,0,0,0,28,77,146,179,138,15,61,165,74,82,88,6,0,0,6,38,15,0,18,210,253,228,23,0,0,0,0,0,0,0,1,122,250,248,251,229,31,3,69,68,33,18,0, -0,1,70,102,49,113,248,248,248,248,250,251,250,249,251,200,59,0,0,0,0,28,63,18,0,0,1,33,57,166,191,97,95,86,8,3,38,15,0,0,88,136,69,151,50,18,198,250, -233,39,94,248,249,132,32,148,88,0,0,0,3,36,16,9,79,102,91,42,2,0,0,0,0,0,0,0,0,0,0,18,3,0,0,0,0,18,151,188,138,18,0,1,63,186,117,15, -33,4,4,35,14,0,0,5,123,149,82,11,0,0,0,0,0,0,83,245,249,248,249,243,153,138,14,3,81,68,2,0,0,10,70,81,63,5,0,0,0,0,13,80,99,173,173,58, -0,0,0,0,0,0,29,32,0,0,0,1,33,80,103,85,50,49,77,40,12,0,0,0,0,124,238,250,203,18,0,0,88,148,24,44,47,31,163,94,0,0,0,2,33,18,0,0, -9,75,96,148,249,248,90,0,0,0,0,0,0,0,15,35,3,0,0,0,0,18,151,188,138,18,0,1,63,186,117,15,33,4,4,35,14,0,0,5,132,232,250,200,18,0,0,0, -0,0,3,119,249,248,126,200,251,229,31,3,81,68,2,0,0,10,70,81,63,5,113,248,248,248,248,250,251,251,200,58,0,0,0,0,0,0,29,32,0,0,0,1,33,80,103,85, -50,49,77,40,12,0,0,0,0,114,179,65,18,198,248,203,100,148,24,122,249,249,195,94,0,0,0,2,33,18,0,0,9,75,96,85,39,2,0,0,0,0,0,0,0,0,15,35, -0,0,0,0,18,138,179,138,18,0,0,9,77,100,164,71,10,36,36,10,0,0,5,123,124,6,43,81,12,0,0,0,0,3,48,111,243,248,248,249,243,153,140,46,17,60,67,0, -11,81,43,2,62,74,5,0,0,0,0,51,173,173,89,8,0,0,0,0,0,0,0,0,0,0,0,9,30,52,90,22,7,35,62,79,12,0,0,0,68,230,251,231,39,0,0,0, -0,90,168,60,21,148,92,37,11,0,3,35,16,0,0,0,0,9,74,96,147,249,248,90,0,0,0,0,0,18,34,2,0,0,0,0,18,138,179,138,18,0,0,9,77,100,164,71, -10,36,36,10,0,0,5,123,124,23,208,250,201,18,0,0,0,3,121,249,248,94,6,52,201,251,229,61,17,60,67,0,11,81,43,2,62,74,5,157,248,248,248,249,253,211,89,8, -0,0,0,0,0,0,0,0,0,0,0,9,30,52,90,22,7,35,62,79,12,0,0,0,53,143,112,146,203,248,203,18,0,90,168,60,108,252,250,114,11,0,3,35,16,0,0,0, -0,9,74,96,85,41,1,0,0,0,0,0,0,18,34,2,0,0,0,18,138,179,138,18,0,0,9,82,69,6,62,164,73,42,43,4,0,5,123,124,6,0,0,49,84,12,0,0, -1,47,50,2,81,243,248,248,249,244,166,147,13,3,66,69,77,48,0,0,3,70,78,8,0,0,46,175,176,98,102,74,6,0,0,0,0,0,0,0,0,0,10,34,38,84,52,17, -4,42,40,54,82,13,0,69,234,249,203,100,148,22,0,0,1,47,117,141,140,83,0,8,37,14,33,19,0,0,0,0,0,0,10,79,102,151,249,248,90,0,0,0,19,36,3,0, -0,0,0,18,138,179,138,18,0,0,9,82,69,6,62,164,73,42,43,4,0,5,123,124,6,0,18,209,250,201,18,0,1,120,249,248,94,0,0,6,53,201,251,231,30,3,66,69, -77,48,0,0,3,70,134,243,248,248,249,253,253,246,134,74,6,0,0,0,0,0,0,0,0,0,10,34,38,84,52,17,4,42,40,54,82,13,0,55,159,49,18,218,252,208,18,0, -1,47,117,141,140,147,248,248,114,14,33,19,0,0,0,0,0,0,10,79,102,90,44,2,0,0,0,0,19,36,3,0,0,0,20,138,179,138,18,0,0,9,82,71,3,0,0,64, -174,78,12,38,11,123,124,6,0,0,0,0,58,86,12,0,1,22,4,0,0,81,244,248,248,250,244,153,140,25,15,102,87,0,0,0,0,2,70,64,3,45,175,176,60,17,82,96, -70,8,0,0,0,0,0,0,0,10,34,38,88,30,0,33,49,9,10,33,55,82,79,234,249,203,18,0,95,149,22,0,1,22,22,168,168,18,0,0,8,58,26,0,0,0,0,0, -0,0,0,10,79,102,151,249,248,90,0,19,36,3,0,0,0,0,20,138,179,138,18,0,0,9,82,71,3,0,0,64,174,78,12,38,11,123,124,6,0,0,0,18,211,250,201,18, -90,248,248,94,0,0,24,3,6,72,204,251,230,41,15,102,87,0,0,0,0,83,246,250,248,249,253,253,250,248,244,132,70,8,0,0,0,0,0,0,0,10,34,38,88,30,0,33, -49,9,10,33,55,82,65,159,50,18,198,248,223,157,22,0,1,22,22,168,168,18,94,248,248,128,26,0,0,0,0,0,0,0,0,10,79,102,90,43,2,0,0,19,36,3,0,0, -52,14,131,179,138,18,0,0,9,82,71,2,0,0,6,34,69,163,69,18,141,127,6,0,0,0,0,0,11,78,84,12,0,0,0,0,0,1,123,246,249,248,249,243,151,156,97,48, -64,69,3,0,0,0,0,16,66,174,176,62,0,0,11,78,96,76,8,0,0,0,0,0,10,34,38,88,30,0,6,34,39,21,0,13,33,109,241,249,203,18,16,40,17,111,149,23, -0,23,147,81,81,147,22,3,34,23,34,12,0,0,0,0,0,0,0,0,10,79,102,151,249,248,101,36,3,0,0,11,52,14,131,179,138,18,0,0,9,82,71,2,0,0,6,34, -69,163,69,18,141,127,6,0,0,0,0,0,28,216,250,218,248,248,94,0,0,1,62,69,31,21,50,201,251,233,109,48,64,69,3,0,81,243,248,248,250,251,224,250,248,248,248,244, -132,76,8,0,0,0,0,0,10,34,38,88,30,0,6,34,39,21,0,13,33,98,190,61,18,198,248,211,34,111,149,23,0,23,147,81,81,147,22,96,249,249,112,12,0,0,0,0, -0,0,0,0,10,79,102,90,43,1,18,36,3,0,0,11,38,3,64,131,18,0,0,9,82,71,2,0,0,6,38,13,0,61,151,140,122,42,6,0,0,0,0,0,0,13,78,84, -12,0,0,0,0,0,5,140,247,248,248,249,244,177,169,22,2,70,70,3,0,0,0,43,175,176,63,0,0,0,7,59,83,102,76,8,0,0,0,10,34,38,88,30,0,6,38,13, -0,33,24,0,78,237,250,220,28,11,85,50,0,18,108,152,54,141,88,0,0,88,149,55,19,0,8,39,13,0,0,0,0,0,0,0,0,10,79,102,150,249,249,92,0,0,10,62, -38,3,64,131,18,0,0,9,82,71,2,0,0,6,38,13,0,61,151,140,122,42,6,0,0,0,0,0,0,30,228,250,248,105,0,0,0,0,5,86,76,0,7,50,204,252,236,39, -2,70,70,83,243,248,248,249,251,202,63,108,248,248,248,250,244,137,76,8,0,0,0,10,34,38,88,30,0,6,38,13,0,33,24,0,65,171,94,94,200,248,220,65,0,18,108,152, -54,141,88,0,0,88,149,55,106,248,248,115,13,0,0,0,0,0,0,0,0,10,79,102,89,50,32,2,0,0,10,62,0,0,0,1,0,0,9,82,71,2,0,0,6,38,14,0, -0,1,142,186,72,14,35,6,0,0,0,0,0,0,13,78,84,12,0,0,0,3,34,19,127,246,248,248,251,246,141,148,22,3,70,71,6,0,46,175,176,66,31,6,0,10,62,35, -13,82,102,77,9,0,10,33,38,88,30,0,6,38,14,0,0,1,33,86,234,249,209,67,79,80,47,0,0,0,43,157,186,95,0,0,0,3,112,156,22,0,0,7,39,13,0,0, -0,0,0,4,6,0,10,77,109,186,249,248,90,10,62,37,0,0,0,1,0,0,9,82,71,2,0,0,32,183,31,0,0,1,142,186,72,14,35,6,0,0,0,0,0,90,248,250, -250,201,18,0,0,3,34,19,67,70,0,16,110,210,233,160,22,3,129,246,248,248,249,251,202,66,31,6,108,248,250,249,248,244,137,77,9,0,10,33,38,88,30,0,6,38,14,0, -0,1,33,73,159,60,46,210,250,219,62,0,0,0,43,157,186,95,0,0,0,3,112,156,22,94,248,248,115,13,0,0,0,0,0,4,6,0,10,77,109,146,49,2,0,10,62,37, -0,0,0,0,0,9,82,71,2,0,0,6,38,14,0,0,5,123,116,69,161,74,13,38,6,0,0,0,0,0,0,13,78,84,12,0,3,36,19,0,3,126,246,250,249,249,243,141, -148,22,3,70,75,51,175,176,62,0,13,34,16,60,37,0,79,128,92,102,76,19,30,38,88,30,0,6,38,14,0,0,0,0,69,237,249,203,26,41,94,94,10,0,0,30,101,156, -143,137,22,0,3,36,19,88,148,22,0,0,7,39,13,0,0,0,0,7,38,10,0,25,95,176,201,249,248,129,37,0,0,0,0,0,0,9,82,71,2,0,0,6,183,248,198,18, -5,123,116,69,161,74,13,38,6,0,0,0,90,248,248,113,216,250,201,18,3,36,19,0,3,66,69,75,51,48,38,88,148,96,243,250,250,249,251,202,62,0,13,34,16,140,249,248, -250,252,245,140,76,19,30,38,88,30,0,6,38,14,0,0,0,0,56,171,69,18,200,249,222,106,10,0,0,30,101,156,143,137,22,0,3,36,19,88,148,22,94,248,248,115,13,0, -0,0,0,7,38,10,45,25,95,176,169,45,14,60,37,0,0,0,0,0,9,82,71,2,0,0,6,38,14,0,0,5,123,124,6,1,61,165,74,14,38,6,0,0,0,0,0,0, -13,78,84,16,32,19,0,0,0,15,151,247,248,248,249,244,141,148,23,0,85,176,176,60,0,0,0,20,73,38,0,74,178,179,63,80,102,87,44,84,30,0,6,38,14,0,0,0, -0,69,234,249,210,36,11,85,67,53,81,11,27,105,161,87,19,111,149,24,36,19,0,0,88,148,22,0,0,7,38,13,0,0,0,0,10,35,24,29,15,82,175,200,250,249,90,0, -0,0,0,0,9,82,71,2,0,0,6,38,31,198,248,199,132,124,6,1,61,165,74,14,38,6,0,90,248,248,94,0,30,216,250,202,47,19,0,0,0,15,102,87,0,5,38,13, -141,250,249,248,250,251,202,60,0,0,0,20,73,38,104,250,253,253,249,244,140,87,44,84,30,0,6,38,14,0,0,0,0,55,159,51,48,202,248,220,80,53,81,11,27,105,161,87, -19,111,149,24,36,19,0,0,88,148,22,94,248,248,115,13,0,0,0,0,10,112,249,137,15,82,175,168,74,35,0,0,0,0,0,9,82,71,2,0,0,6,38,14,0,0,5,123, -124,6,0,0,0,60,159,75,14,38,5,0,22,2,0,0,0,12,75,96,27,0,0,0,13,82,48,124,246,248,248,249,244,141,145,69,168,176,75,7,0,0,10,59,43,32,78,178, -178,74,0,20,90,102,101,36,0,6,38,14,0,0,0,0,69,234,249,203,18,39,90,47,11,32,52,84,103,160,88,0,0,18,110,162,38,0,0,0,0,88,148,22,0,0,7,38, -12,0,0,0,0,28,57,10,0,8,83,175,201,249,248,90,0,0,0,9,82,71,2,0,0,6,38,14,0,18,199,252,226,23,0,0,0,60,159,75,14,38,93,248,249,96,0,0, -0,29,215,251,204,18,0,0,13,82,48,64,69,2,6,107,244,250,252,250,251,201,75,7,0,0,10,59,43,32,78,209,253,250,248,248,245,140,101,36,0,6,38,14,0,0,0,0, -55,159,50,18,198,249,221,62,11,32,52,84,103,160,88,0,0,18,110,162,38,0,0,0,0,88,148,22,94,248,248,114,12,0,0,0,90,249,250,100,0,8,83,175,170,45,2,0, -27,0,9,82,71,2,0,0,6,38,14,0,0,5,123,126,14,0,0,0,0,0,33,154,76,14,32,44,53,4,0,0,0,1,38,81,82,12,0,13,84,50,0,2,129,246,248,248, -249,243,157,209,175,52,9,37,8,9,62,37,0,84,190,180,74,0,10,29,46,102,102,73,16,34,14,0,0,0,0,72,235,249,203,18,12,83,50,0,0,10,50,113,189,96,0,0, -0,1,45,118,148,22,0,0,0,0,88,148,22,0,0,12,41,12,0,0,24,30,11,38,8,6,60,91,175,201,249,248,90,0,9,82,71,2,0,0,6,38,14,0,0,5,132,226, -248,198,18,0,0,0,33,154,76,99,249,249,128,4,0,0,0,1,53,216,250,201,18,13,84,50,0,2,70,70,82,243,249,248,251,253,200,52,9,37,8,9,62,37,0,84,190,180, -148,248,248,249,249,245,140,73,16,34,14,0,0,0,0,58,162,50,18,198,248,220,65,0,0,10,50,113,189,96,0,0,0,1,45,118,148,22,0,0,0,0,88,148,22,94,248,248, -116,12,0,90,249,249,101,38,8,6,60,91,175,169,62,172,176,8,82,70,2,0,0,6,38,14,0,0,5,123,124,21,61,15,0,36,72,9,0,30,154,77,49,69,10,0,0,0, -3,36,15,10,78,81,26,80,50,0,0,0,3,129,246,248,248,250,251,211,160,20,0,8,38,61,35,0,74,178,182,100,2,9,33,38,84,39,76,102,90,20,0,0,0,0,69,235, -251,206,18,13,83,50,0,0,0,24,111,178,124,81,13,0,3,36,16,16,111,149,22,0,0,0,0,86,141,16,0,43,76,39,10,21,33,1,0,8,38,61,32,11,82,175,201,249, -248,95,82,70,2,0,0,6,38,14,0,0,5,123,124,37,212,248,198,51,72,9,0,30,190,250,249,138,10,0,0,0,3,36,15,28,216,250,204,93,50,0,0,0,3,129,246,248, -248,250,251,211,160,20,0,8,38,61,35,0,74,178,182,100,2,110,249,249,250,249,244,143,90,20,0,0,0,0,55,165,99,32,198,248,220,65,0,0,0,24,111,178,124,81,13,0, -3,36,16,16,111,149,22,0,0,0,0,86,141,16,94,249,250,115,96,248,249,94,0,8,38,61,32,11,82,181,235,249,65,77,69,2,0,0,6,38,14,0,0,5,123,124,6,0, -30,63,16,72,102,78,8,0,30,171,115,17,35,6,0,3,36,19,0,0,10,77,102,68,37,0,0,0,0,3,128,246,249,253,253,246,139,148,22,8,61,56,7,74,178,178,74,10, -38,33,37,88,30,0,16,92,102,77,10,0,0,69,234,249,209,76,21,76,88,16,0,0,0,80,174,98,31,55,81,17,32,19,0,0,19,112,149,22,0,0,0,0,76,136,22,6, -67,73,48,36,0,0,0,8,61,56,7,0,10,82,175,200,249,250,134,2,0,0,6,38,14,0,0,5,123,124,6,0,46,212,248,214,113,78,8,90,249,252,166,17,35,6,0,3, -36,19,0,0,27,215,251,213,52,0,0,0,81,243,250,250,249,251,200,64,86,148,22,8,61,56,7,74,178,178,74,10,38,33,122,250,249,248,248,245,143,77,10,0,0,55,159,48, -46,212,248,219,100,16,0,0,0,80,174,98,31,55,81,17,32,19,0,0,19,112,149,22,0,0,0,0,76,136,22,98,250,250,249,249,94,0,0,8,61,56,7,0,27,216,253,238, -175,87,4,0,0,6,38,14,0,0,5,123,124,6,0,0,0,28,57,56,90,102,75,11,43,77,155,79,14,36,9,34,19,0,0,0,10,81,88,104,159,53,0,0,0,0,0,139, -251,253,250,249,244,141,152,79,35,9,101,181,178,74,0,6,37,56,86,29,0,6,34,23,78,102,78,10,69,234,249,203,18,27,62,73,43,5,0,0,64,170,90,0,13,32,55,95, -28,0,0,0,0,19,112,149,22,0,0,0,0,85,147,22,1,76,85,37,12,0,10,62,35,9,38,10,0,10,80,175,205,250,248,90,0,6,38,14,0,0,5,123,124,6,0,0, -0,44,211,250,218,113,138,248,249,143,155,79,14,36,9,34,19,0,0,0,10,94,218,251,233,67,0,81,243,248,248,250,251,200,57,31,14,88,152,79,35,9,101,181,178,74,0,6, -37,56,86,117,248,248,249,249,244,143,78,10,55,159,48,18,198,249,216,86,43,5,0,0,64,170,90,0,13,32,55,95,28,0,0,0,0,19,112,149,22,0,0,0,0,85,147,22, -150,250,250,165,12,0,10,62,35,9,38,27,198,248,219,181,175,168,46,1,5,38,14,0,0,5,123,124,6,0,0,0,0,1,59,73,30,76,102,88,53,3,29,152,79,14,58,21, -0,0,0,13,84,48,12,77,120,162,52,0,0,0,45,172,201,247,248,248,249,243,169,163,23,69,181,190,81,0,11,34,34,90,55,1,5,38,14,0,11,80,102,126,235,249,203,18, -0,1,59,74,17,0,1,64,171,91,0,0,0,13,52,68,81,13,0,0,0,0,19,112,149,22,0,0,0,0,88,148,42,30,66,76,23,9,62,37,0,0,10,39,10,0,19,105, -175,200,249,248,93,38,14,0,0,5,123,124,6,0,0,0,0,1,73,214,249,228,251,250,127,3,29,152,79,14,58,21,0,0,0,13,84,48,30,215,251,234,126,243,248,248,249,251, -201,90,0,4,22,11,128,163,23,69,181,190,81,0,11,34,34,90,55,1,102,249,248,248,248,244,143,117,163,48,18,198,248,203,73,74,17,0,1,64,171,91,0,0,0,13,52,68, -81,13,0,0,0,0,19,112,149,22,0,0,0,0,88,186,249,249,250,250,105,9,62,37,0,0,27,207,248,203,36,105,80,175,169,47,32,12,0,0,5,123,124,6,0,0,0,0, -3,50,44,28,54,28,89,102,73,5,0,29,153,100,28,32,6,0,13,84,50,0,0,13,77,119,162,53,0,46,175,175,56,125,246,248,248,250,245,136,156,173,175,81,35,16,30,33, -84,28,8,36,36,11,0,0,0,10,127,242,251,205,18,0,3,50,44,28,59,16,58,170,91,0,0,0,3,31,27,30,55,82,13,0,0,0,0,19,110,149,22,0,0,0,0,102, -162,22,2,66,68,55,35,0,0,0,0,10,33,16,76,68,80,175,201,249,249,98,0,0,5,123,124,6,0,0,0,0,3,50,44,44,224,249,250,165,73,5,0,29,153,100,28,32, -6,0,13,84,50,0,0,30,215,251,252,249,248,249,251,201,56,64,69,0,6,59,36,81,156,173,175,81,35,16,30,33,84,28,8,36,36,106,248,248,248,248,247,213,114,27,198,248, -204,64,44,28,59,16,58,170,91,0,0,0,3,31,27,30,55,82,13,0,0,0,0,19,110,149,22,0,0,0,90,250,252,108,96,250,250,126,35,0,0,18,198,248,210,33,76,68, -9,82,175,171,49,17,24,5,123,124,6,0,0,0,0,4,52,46,1,0,26,69,52,80,102,72,5,0,61,160,80,13,34,20,83,50,0,0,0,0,12,77,118,158,83,169,175,55, -0,2,127,246,250,249,248,247,203,179,86,0,16,52,40,81,25,0,6,42,38,20,23,0,0,69,235,251,218,24,0,4,52,46,1,0,26,89,169,88,0,0,0,3,36,18,0,12, -32,55,82,13,0,0,0,0,18,111,149,22,0,0,24,31,88,148,22,12,96,82,1,0,0,0,0,0,14,93,72,0,9,82,175,202,249,248,105,5,123,124,6,0,0,0,0,4, -52,46,1,90,249,250,250,216,113,72,5,0,61,160,80,13,34,20,83,50,0,0,0,0,100,249,251,252,250,251,201,55,0,2,67,70,55,33,0,69,179,179,86,0,16,52,40,81, -25,0,6,42,38,20,109,248,248,249,252,246,135,200,248,204,66,46,1,0,26,89,169,88,0,0,0,3,36,18,0,12,32,55,82,13,0,0,0,0,18,111,149,22,0,90,249,249, -150,148,22,102,251,250,90,0,18,198,248,203,31,93,72,0,0,10,83,175,169,61,7,123,124,6,0,0,0,0,4,53,48,2,0,2,44,59,52,28,81,102,70,34,17,28,152,81, -18,94,52,0,0,0,0,0,0,12,73,133,208,182,52,0,0,0,12,147,247,248,250,253,251,165,135,32,31,42,99,35,0,0,14,9,26,58,8,0,69,234,249,205,22,0,4,53, -48,2,0,2,62,173,124,15,0,0,3,36,19,0,0,0,13,33,55,82,13,0,0,0,0,19,112,150,28,24,33,1,0,88,152,76,36,66,69,3,0,0,0,9,80,72,36,9, -0,10,83,175,201,250,248,169,124,6,0,0,0,0,4,53,48,2,90,248,249,140,210,249,216,113,70,34,17,28,152,81,18,94,52,0,0,0,0,81,243,248,250,252,253,205,52,0, -0,0,12,96,83,1,74,178,173,123,135,32,31,42,99,35,0,0,14,9,26,58,8,94,249,252,249,248,246,248,204,67,48,2,0,2,62,173,124,15,0,0,3,36,19,0,0,0, -13,33,55,82,13,0,0,0,0,19,112,150,108,249,249,94,0,88,152,76,117,250,250,104,198,248,203,26,80,72,36,9,10,0,8,87,173,163,138,122,6,0,0,0,0,4,54,47, -1,0,2,49,51,3,25,59,30,82,102,75,2,0,28,152,82,32,35,6,0,0,0,0,0,0,68,184,170,168,50,0,0,10,60,36,125,249,253,253,250,243,146,162,57,86,37,30, -7,0,0,17,33,16,36,73,234,249,203,18,0,4,54,47,1,0,2,66,170,90,25,64,16,1,36,19,0,0,0,0,0,13,33,55,82,13,0,0,0,0,18,109,88,32,1,0, -0,10,129,164,22,2,70,72,114,95,14,82,70,1,8,39,10,0,8,87,173,197,252,252,94,0,0,0,0,4,54,47,1,90,248,249,126,3,42,211,249,216,113,75,2,0,28,152, -82,32,35,6,0,0,81,243,248,248,250,252,197,168,50,0,0,10,60,36,65,123,179,178,72,0,94,162,57,86,37,30,7,0,0,17,33,16,36,60,194,249,248,248,248,246,121,47, -1,0,2,66,170,90,25,64,16,1,36,19,0,0,0,0,0,13,33,55,82,13,0,0,0,0,18,161,250,249,94,0,0,10,129,164,22,96,250,250,251,223,31,82,70,1,8,39, -39,8,13,38,84,205,201,51,2,0,0,0,5,54,46,1,0,4,49,51,3,0,0,26,57,48,86,102,68,4,0,27,152,82,14,38,6,0,0,0,0,60,190,154,87,113,162,52, -10,62,37,0,75,216,252,250,248,248,245,158,185,50,0,7,37,8,17,36,3,0,79,237,249,203,18,0,5,54,46,1,0,4,67,170,90,0,0,26,61,42,15,0,0,0,0,0, -0,0,13,33,55,82,13,0,0,0,0,35,55,2,0,0,10,62,37,88,148,20,3,150,199,169,94,70,2,0,0,10,39,8,13,38,84,205,221,249,248,90,0,0,5,54,46,1, -90,248,249,126,3,0,0,42,211,249,217,113,68,4,0,27,152,82,14,38,6,81,243,248,248,250,252,187,87,113,162,52,10,62,37,0,75,199,199,76,0,10,33,113,185,50,0,7, -37,8,17,36,3,0,66,173,53,105,248,248,248,250,242,72,0,4,67,170,90,0,0,26,61,42,15,0,0,0,0,0,0,0,13,33,55,82,13,0,0,0,90,249,250,95,0,0, -10,62,37,88,148,37,217,252,253,204,94,70,2,0,0,10,8,46,38,5,124,158,170,167,47,3,0,5,54,46,0,0,0,43,51,3,0,0,0,0,48,62,32,83,102,67,4,27, -43,151,83,14,38,6,0,0,60,190,155,50,14,77,117,167,98,37,0,74,189,185,164,246,248,249,249,247,155,148,22,0,7,46,38,2,0,69,234,249,211,24,0,5,54,46,0,0, -0,61,170,90,0,0,0,0,48,66,15,0,0,0,0,1,55,6,0,13,33,55,82,13,0,0,24,29,17,35,1,9,62,37,0,0,111,145,117,179,187,124,66,1,0,0,0,0, -8,46,38,5,124,158,170,199,249,248,90,5,54,46,0,90,248,249,126,3,0,0,0,0,63,212,249,216,113,67,4,0,27,151,83,14,107,243,248,248,250,252,187,50,14,77,117,167, -98,37,0,74,189,185,121,67,14,31,38,88,108,148,22,0,7,46,38,2,0,55,159,59,53,200,248,248,250,249,248,243,72,61,170,90,0,0,0,0,48,66,15,0,0,0,0,1, -55,6,0,13,33,55,82,13,0,90,249,249,105,35,1,9,62,37,0,0,120,230,252,245,253,251,133,1,0,0,0,0,17,38,40,128,124,12,80,176,169,46,9,54,45,0,0,0, -0,14,4,0,0,0,3,36,15,24,59,34,85,102,86,221,198,42,151,84,14,37,4,59,190,155,52,0,0,10,75,133,173,48,69,178,185,118,21,128,247,249,250,249,243,141,148,22, -16,38,36,10,69,234,249,203,31,35,12,54,45,0,0,0,22,154,91,0,0,0,3,36,15,24,64,18,0,0,0,83,179,110,3,0,13,33,55,100,209,86,33,1,0,16,36,58, -36,0,0,0,24,173,185,160,101,93,65,2,0,0,0,0,17,38,40,128,124,12,80,176,201,249,248,125,45,0,90,248,248,103,4,0,0,0,3,36,15,41,211,249,217,113,66,3, -0,26,151,138,244,249,248,250,252,187,52,0,0,10,75,133,173,48,69,178,185,118,21,69,82,40,86,30,0,88,148,22,16,38,36,10,55,159,48,18,201,249,205,134,249,248,248,248, -244,182,91,0,0,0,3,36,15,24,64,18,0,0,0,83,179,110,3,0,13,33,55,82,98,248,249,94,0,16,36,58,36,0,0,18,203,253,241,166,158,250,250,91,0,0,0,0, -36,6,127,142,10,0,10,82,175,168,71,41,0,0,0,0,0,0,0,0,0,3,33,19,0,0,27,59,35,86,113,212,248,198,42,151,84,10,79,190,155,52,0,0,0,8,58,83, -112,166,176,173,73,20,61,43,133,248,249,248,248,243,141,154,52,1,9,95,234,249,198,18,0,16,69,44,0,0,0,22,148,88,0,0,0,3,33,19,0,0,27,64,18,0,0,48, -164,185,117,3,0,13,56,225,250,241,72,0,0,8,64,54,0,0,0,5,114,185,189,180,77,10,68,70,3,0,0,19,36,6,127,142,10,0,10,82,175,200,250,249,90,90,248,248, -94,0,0,0,0,3,33,19,0,0,43,211,249,217,113,64,2,0,99,250,250,248,251,252,187,52,0,0,0,8,58,83,112,166,176,173,73,20,61,43,77,102,31,0,0,0,88,154, -52,1,9,83,161,48,18,198,248,206,82,44,90,248,248,249,252,247,72,0,0,3,33,19,0,0,27,64,18,0,0,48,164,185,117,3,0,13,33,125,250,249,94,0,0,8,64,54, -0,0,18,199,251,239,193,180,77,100,250,250,92,0,0,19,8,123,124,9,2,0,0,10,84,175,172,45,2,0,0,0,0,0,0,0,3,36,18,0,0,0,0,26,59,36,86,113, -212,248,198,41,142,119,183,154,54,0,0,0,10,62,34,12,125,201,183,104,0,7,44,71,82,131,246,248,248,248,244,156,148,20,66,234,249,198,18,0,8,53,49,32,6,0,22,148, -88,0,0,0,3,36,18,0,0,0,0,26,64,18,0,0,41,179,204,117,3,5,219,249,251,253,244,69,10,62,34,15,35,3,6,116,179,162,108,146,157,22,3,70,70,2,17,36, -8,123,124,9,2,0,0,10,84,175,202,249,248,248,248,94,0,0,0,0,3,36,18,0,0,0,0,42,211,249,217,113,63,82,243,249,252,252,251,187,54,0,0,0,10,62,34,12, -125,201,183,104,0,7,44,71,82,74,64,3,0,0,19,111,148,20,51,160,49,18,198,248,205,68,49,32,6,90,249,252,250,248,243,77,3,36,18,0,0,0,0,26,64,18,0,0, -41,179,204,117,3,0,97,249,251,202,74,1,10,62,34,15,35,3,33,236,238,169,108,146,157,22,96,250,250,91,17,36,123,124,6,0,0,0,0,0,37,95,175,169,48,3,0,0, -0,0,0,3,36,19,0,0,0,0,0,0,26,59,38,87,113,212,248,198,91,209,181,58,30,6,0,10,62,37,0,74,182,199,155,147,56,33,38,90,72,21,126,246,248,248,248,243, -136,160,231,249,198,18,0,0,38,45,0,13,38,28,148,88,0,0,0,3,36,19,0,0,0,0,0,0,26,64,18,0,0,41,180,204,117,4,95,246,252,253,253,241,103,37,0,0, -19,41,119,179,162,107,66,22,128,157,22,3,69,70,21,7,123,124,6,0,0,0,0,0,37,95,175,220,249,248,150,0,0,0,0,3,36,19,0,0,0,0,0,0,42,211,249,218, -158,246,248,248,250,253,205,58,30,6,0,10,62,37,0,74,182,199,155,147,56,33,38,90,72,21,66,70,3,0,21,3,81,153,148,44,18,198,248,203,53,45,0,13,38,28,186,247, -248,248,248,243,102,19,0,0,0,0,0,0,26,64,18,0,0,41,180,204,117,49,248,250,191,195,169,27,58,37,0,0,19,41,119,187,168,107,66,22,128,157,22,96,250,250,104,7, -124,6,0,0,0,0,0,0,1,14,82,175,170,48,4,0,0,0,3,36,19,0,0,0,0,0,0,0,0,26,58,39,88,113,211,250,240,167,160,85,13,34,16,60,37,0,74,178, -178,82,76,118,173,82,87,28,18,61,22,126,246,248,248,248,245,242,252,202,18,0,0,0,4,0,0,0,35,164,92,0,0,0,3,36,19,0,0,0,0,0,0,0,0,26,64,18, -0,0,41,180,203,125,57,179,251,252,250,251,242,54,0,0,7,129,189,163,104,70,2,0,22,130,157,22,3,70,72,124,124,6,0,0,0,0,0,0,1,14,144,253,253,249,248,90, -0,0,3,36,19,0,0,0,0,0,0,0,0,42,211,249,250,251,250,250,251,190,160,85,13,34,16,60,37,0,74,178,178,82,76,118,173,82,87,28,18,61,22,66,70,3,0,0, -50,174,150,33,198,248,203,18,4,0,0,0,35,164,92,90,243,248,248,249,244,77,0,0,0,0,0,0,0,26,64,18,0,0,41,180,203,125,155,182,183,152,74,102,43,0,0,0, -7,129,189,163,104,70,2,0,22,130,157,22,96,250,250,170,96,0,0,0,0,0,0,0,0,0,10,85,159,132,41,6,0,3,36,19,0,0,0,0,0,0,0,0,0,0,25,58, -40,86,125,241,252,210,40,150,87,20,73,38,0,74,178,178,74,0,19,83,122,189,73,0,0,22,61,22,126,246,248,249,252,249,227,156,22,0,0,0,0,0,0,22,148,97,38,6, -0,3,36,19,0,0,0,0,0,0,0,0,0,0,26,64,19,0,0,40,181,207,170,179,177,245,250,250,250,240,54,8,121,179,165,114,69,2,0,0,0,22,130,157,20,4,159,160, -9,0,0,0,0,0,0,0,0,90,248,250,195,177,249,248,90,3,36,19,0,0,0,0,0,0,0,0,0,0,109,249,249,250,251,252,186,52,24,150,87,20,73,38,0,74,178,178, -74,0,19,83,122,189,73,0,0,22,61,22,66,70,3,55,157,44,93,231,249,203,18,0,0,0,0,22,148,97,38,6,90,243,249,248,248,243,77,0,0,0,0,0,0,0,26,64, -19,0,0,40,181,207,170,179,134,34,66,70,78,13,0,8,121,179,165,114,69,2,0,0,0,22,130,157,20,97,253,253,250,92,0,0,0,0,0,0,0,0,0,8,9,122,130,41, -9,34,19,0,0,0,0,0,0,0,0,0,0,0,0,25,53,84,191,162,216,248,198,40,154,114,43,32,78,178,178,74,0,10,30,46,102,121,161,52,0,0,22,61,22,126,248,252, -249,248,243,141,148,22,0,0,0,0,22,148,88,0,14,36,9,34,19,0,0,0,0,0,0,0,0,0,0,0,0,25,64,19,0,23,79,193,204,168,28,128,249,249,250,250,236,149, -179,160,101,75,32,2,0,0,0,0,22,128,145,121,120,74,70,3,0,0,0,0,0,0,90,248,248,99,9,122,176,249,248,112,19,0,0,0,0,0,0,0,0,0,0,81,243,249, -250,251,253,191,81,0,0,24,154,114,43,32,78,178,178,74,0,10,30,46,102,121,161,52,0,0,22,61,22,66,109,160,48,18,198,250,233,39,0,0,0,0,22,148,88,0,14,36, -9,112,244,248,248,248,243,77,0,0,0,0,0,0,0,25,64,19,0,23,79,193,204,168,28,59,42,30,55,82,21,121,179,160,101,75,32,2,0,0,0,0,22,128,145,121,177,250, -250,250,92,0,0,0,0,0,0,0,0,0,0,5,122,129,62,21,0,0,0,0,0,0,0,0,0,0,0,16,3,0,74,191,153,96,113,211,248,200,92,64,0,84,190,180,74,0, -10,34,39,83,40,74,119,162,52,0,0,22,61,85,243,251,248,248,248,243,141,148,22,0,0,22,148,88,0,0,0,14,58,21,0,0,0,0,0,0,0,0,0,0,0,16,4,0, -25,60,35,48,139,179,192,203,145,37,90,248,249,250,253,248,178,104,70,1,16,36,3,0,0,0,0,22,178,185,27,3,70,70,3,0,0,0,0,90,248,248,94,0,0,5,122,176, -250,248,90,0,0,0,0,0,0,0,0,0,81,244,248,248,250,253,252,219,113,56,0,9,79,64,0,84,190,180,74,0,10,34,39,83,40,74,119,162,52,0,0,22,61,72,183,102, -19,198,248,203,100,148,22,0,0,22,148,88,0,0,0,14,58,21,86,243,248,248,248,243,81,0,0,0,0,16,4,0,25,60,35,48,139,179,192,203,145,37,0,12,33,62,166,182, -158,104,70,1,16,36,3,0,0,0,0,22,178,185,27,154,96,250,250,92,0,0,0,0,0,0,0,0,0,0,8,139,136,38,6,0,0,0,0,0,0,0,11,16,0,18,30,62, -189,155,78,45,91,113,211,250,206,18,74,177,182,101,4,8,34,39,87,30,0,13,78,120,163,51,0,0,85,239,249,223,246,248,248,248,243,141,147,18,18,147,88,0,0,0,3,32, -28,34,6,0,0,0,0,0,0,0,11,16,0,19,36,3,0,38,90,154,179,127,59,191,207,120,5,94,248,251,253,253,240,104,2,0,0,19,36,5,0,0,5,120,125,128,154,22, -3,70,70,3,0,0,90,248,248,94,0,0,0,0,8,139,180,249,248,90,0,0,0,0,0,0,11,92,243,248,249,250,252,191,216,249,218,113,59,55,36,0,74,177,182,101,4,8, -34,39,87,30,0,13,78,120,163,51,0,0,71,182,66,72,212,248,203,18,0,88,147,18,18,147,88,0,0,0,3,32,28,34,6,86,243,248,248,248,243,81,11,16,0,19,36,3, -0,38,90,154,179,127,59,191,207,120,5,0,19,139,195,185,99,67,2,0,0,19,36,5,0,0,5,120,125,128,154,22,19,96,250,250,92,0,0,0,0,0,0,0,0,3,36,24, -118,117,43,6,0,0,0,0,0,0,5,36,18,0,68,184,153,49,22,57,46,92,113,214,248,212,172,165,71,12,40,34,38,87,30,0,0,0,12,66,116,153,38,56,232,249,212,38, -126,246,248,248,248,243,138,135,135,84,0,0,0,3,36,19,0,14,38,6,0,0,0,0,0,0,5,36,19,0,18,32,24,46,149,190,135,21,61,65,171,197,111,16,165,252,252,251, -251,232,45,0,0,0,19,21,0,6,109,120,4,22,128,146,19,3,70,70,3,90,248,248,94,0,0,0,0,3,36,24,118,168,249,248,90,0,0,0,0,0,85,245,248,248,250,252, -185,49,38,211,249,218,113,72,0,66,165,165,71,12,40,34,38,87,30,0,0,0,12,66,116,153,38,41,149,64,76,203,250,217,21,0,0,0,84,135,135,84,0,0,0,3,36,19, -0,14,38,6,86,243,248,248,248,243,81,36,19,0,18,32,24,46,149,190,135,21,61,65,171,197,111,16,108,162,160,109,102,15,0,0,0,0,19,21,0,6,109,120,4,22,128,146, -152,21,96,250,250,92,0,0,0,0,0,0,3,36,19,0,6,109,125,42,6,0,0,0,0,0,0,3,29,70,186,148,68,0,0,22,56,69,96,113,222,253,235,79,0,8,39,57, -85,28,0,0,0,0,0,0,50,109,164,232,249,198,38,59,18,126,246,248,248,248,244,184,150,21,0,5,110,71,19,0,0,0,14,38,6,0,0,0,0,0,0,3,36,18,0,35, -74,142,168,133,69,62,34,0,34,169,195,161,154,183,251,250,250,250,231,41,0,0,0,0,5,118,111,6,0,0,22,121,152,21,3,70,135,248,248,94,0,0,0,0,3,36,19,0, -6,109,172,249,248,90,0,0,0,81,243,248,249,250,252,181,68,0,0,38,210,250,219,113,109,165,165,66,0,8,39,57,85,28,0,0,0,0,0,0,50,109,157,151,34,18,203,250, -207,80,70,3,0,0,21,150,150,21,0,5,110,71,19,0,0,0,14,38,6,86,243,248,248,221,27,3,36,18,0,35,74,142,168,133,69,62,34,0,34,169,195,161,154,135,98,81, -54,80,13,0,0,0,0,0,5,118,111,6,0,0,22,121,128,157,22,96,250,250,92,0,0,0,0,3,36,19,0,0,0,5,125,130,42,6,0,0,0,0,0,0,61,191,154,49, -14,34,2,7,63,66,48,140,212,241,250,198,27,33,41,88,55,2,0,0,0,0,0,0,0,102,241,252,209,18,0,18,57,21,126,246,248,249,252,247,136,144,34,119,142,31,0,0, -0,0,0,14,38,6,0,0,0,0,0,0,3,32,35,49,157,189,129,19,63,70,18,0,0,48,191,202,172,97,151,248,249,250,250,231,41,0,0,5,123,123,6,0,0,0,0,22, -128,157,22,92,250,250,96,0,0,0,0,3,36,19,0,0,0,5,125,176,249,248,90,0,81,243,248,248,250,252,186,49,14,34,2,7,76,213,249,229,212,193,74,0,10,33,41,88, -55,2,0,0,0,0,0,0,0,90,191,164,62,198,248,207,71,21,66,70,3,27,147,81,81,144,34,119,142,31,0,0,0,0,0,14,38,6,81,243,221,27,0,0,3,32,35,49, -157,189,129,19,63,70,18,0,0,48,191,202,172,97,69,16,31,56,83,11,0,0,0,5,123,123,6,0,0,0,0,22,22,130,157,22,96,250,250,92,0,0,3,36,19,0,0,0, -3,69,65,122,129,42,6,0,0,15,14,59,190,155,68,14,0,14,19,60,33,21,115,193,206,154,209,248,205,55,88,23,10,38,5,4,9,0,0,0,69,233,250,225,168,52,0,0, -21,61,22,126,246,252,251,248,243,139,180,141,20,0,0,0,0,0,0,0,14,38,6,0,0,22,56,6,0,23,76,157,179,135,30,60,33,22,64,20,13,124,179,193,202,149,9,113, -248,249,250,250,223,41,5,123,124,6,0,0,0,0,0,0,22,130,192,249,248,138,70,3,0,0,3,36,19,0,0,0,3,69,65,122,175,249,248,141,243,248,248,250,252,187,68,14, -0,14,19,60,33,38,223,253,244,154,49,10,32,40,88,23,10,38,5,4,9,0,0,0,55,158,83,127,234,249,203,18,21,61,22,66,70,118,91,0,0,85,180,141,20,0,0,0, -0,0,0,0,14,38,6,77,27,22,56,6,0,23,76,157,179,135,30,60,33,22,64,20,13,124,179,193,202,149,9,0,13,35,59,81,17,0,5,123,124,6,0,0,0,0,0,0, -0,22,130,157,22,96,250,250,91,1,36,19,0,0,0,3,70,71,5,5,122,129,39,6,0,2,79,191,155,52,3,34,16,7,61,37,0,74,185,196,111,94,113,212,249,218,45,0, -0,13,37,37,9,10,23,69,234,249,198,65,120,163,52,0,0,22,61,22,126,247,248,248,248,249,191,144,20,0,0,0,0,0,0,0,0,14,35,3,9,80,102,54,18,55,153,189, -135,17,61,37,0,0,24,74,142,179,145,116,183,194,122,6,118,248,249,250,250,225,149,124,6,0,0,0,0,0,0,0,0,63,251,252,108,3,70,70,2,1,36,19,0,0,0,3, -70,71,5,5,122,175,249,248,248,248,251,252,187,52,3,34,16,7,61,37,0,74,190,242,251,219,113,65,39,87,29,0,0,13,37,37,9,10,23,55,159,48,18,209,251,236,66,0, -0,22,61,22,66,81,3,0,4,115,162,144,20,0,0,0,0,0,0,0,0,14,35,3,9,80,102,54,18,55,153,189,135,17,61,37,0,0,24,74,142,179,145,116,183,194,122,6, -0,11,34,70,82,27,132,124,6,0,0,0,0,0,0,0,0,0,22,130,157,22,96,250,250,112,17,0,0,0,3,70,70,3,0,0,5,122,129,42,4,60,190,155,60,0,0,1, -36,65,36,0,74,178,178,90,56,56,96,111,219,249,198,18,0,4,44,40,13,37,77,234,249,198,18,0,51,119,163,52,0,0,22,61,22,126,246,248,252,252,245,139,148,22,0,0, -0,0,0,0,0,0,10,40,79,102,77,54,65,153,179,127,45,65,36,0,0,0,15,144,197,157,92,76,39,170,204,124,6,124,249,249,250,253,240,36,0,0,0,0,0,0,0,0, -0,0,137,176,157,22,3,69,68,33,17,0,0,0,3,70,70,3,0,0,5,165,250,249,248,250,252,187,60,0,0,1,36,65,36,0,74,178,178,102,211,250,220,111,93,26,0,0, -0,4,44,40,13,37,64,159,48,18,198,248,213,128,163,52,0,0,22,61,22,66,70,7,123,141,26,85,148,22,0,0,0,0,0,0,0,0,10,40,79,102,77,54,65,153,179,127, -45,65,36,0,0,0,15,144,197,157,92,76,39,170,204,124,6,4,42,37,61,173,135,6,0,0,0,0,0,0,0,0,0,0,0,22,130,157,22,96,250,250,90,0,0,3,70,71, -4,0,0,0,0,5,122,122,88,188,155,52,28,18,0,10,60,37,0,79,178,178,74,0,28,64,73,102,112,208,248,198,24,38,11,19,61,78,234,249,198,18,0,0,0,51,119,163, -52,0,0,22,61,22,128,251,252,248,248,243,141,148,22,0,1,0,0,0,0,0,8,82,102,78,31,53,167,185,124,19,60,37,0,0,0,15,134,179,156,112,80,4,0,35,178,204, -128,39,132,248,253,253,250,223,27,0,0,0,0,0,4,0,0,0,0,22,130,157,22,4,86,76,1,0,0,3,70,71,4,0,0,0,81,243,252,252,251,253,210,52,28,18,0,10, -60,37,0,79,178,178,74,0,44,212,250,221,112,43,0,0,6,38,11,19,61,65,159,48,18,198,248,203,18,51,119,163,52,0,0,22,61,22,69,159,141,23,0,0,88,148,22,0, -1,0,0,0,0,0,8,82,102,78,31,53,167,185,124,19,60,37,0,0,0,15,134,179,156,112,80,4,0,35,178,204,128,39,12,23,151,154,85,13,0,0,0,0,0,0,4,0, -0,0,0,0,22,129,158,48,106,250,250,91,1,70,70,4,44,22,0,0,0,0,1,142,209,153,54,0,2,32,24,58,37,0,79,202,187,74,0,10,29,52,100,70,94,113,208,248, -206,31,0,24,85,237,249,198,18,0,0,0,0,0,62,118,161,52,0,0,22,64,136,194,247,248,248,248,243,141,148,24,46,22,0,0,0,10,79,102,80,51,56,154,180,139,34,58, -37,0,0,0,15,135,179,148,91,80,60,19,0,0,34,177,208,129,20,194,252,249,250,250,223,27,0,0,0,1,30,19,0,0,0,0,22,129,158,48,19,67,70,1,1,70,70,4, -44,22,0,81,243,248,248,252,253,252,250,90,2,32,24,58,37,0,79,202,187,74,0,10,29,66,220,250,219,113,44,1,34,14,0,24,72,172,53,18,198,248,203,18,0,0,62,118, -161,52,0,0,22,64,136,166,80,2,0,0,0,88,148,24,46,22,0,0,0,10,79,102,80,51,56,154,180,139,34,58,37,0,0,0,15,135,179,148,91,80,60,19,0,0,34,177, -208,129,20,132,135,36,55,82,13,0,0,0,0,1,30,19,19,0,0,0,0,22,137,162,22,96,250,250,132,69,3,0,24,64,20,0,0,0,59,183,190,144,34,6,0,11,72,44, -0,74,178,188,138,28,6,33,40,84,46,54,58,99,113,208,248,198,18,71,234,249,207,24,0,0,0,0,0,0,1,58,114,162,53,0,5,135,161,37,125,246,248,248,248,243,141,148, -44,64,20,0,10,79,102,76,31,63,169,181,121,19,72,44,0,0,0,17,136,179,146,94,76,4,20,64,23,0,0,34,177,203,166,116,136,248,249,250,250,219,27,0,0,0,4,36, -19,0,0,0,0,22,137,162,22,3,68,65,65,69,3,0,24,64,94,243,248,248,250,251,211,185,249,248,90,11,72,44,0,74,178,188,138,28,6,33,40,84,60,210,250,220,113,46, -3,0,0,57,159,60,54,199,248,203,18,0,0,0,1,58,114,162,53,0,5,135,161,37,64,62,1,0,0,0,88,148,44,64,20,0,10,79,102,76,31,63,169,181,121,19,72,44, -0,0,0,17,136,179,146,94,76,4,20,64,23,0,0,34,177,203,166,116,3,14,34,55,82,13,0,0,0,0,4,36,36,19,0,0,3,30,34,127,157,22,97,251,251,93,0,0, -0,23,64,18,0,60,191,154,58,121,129,39,16,59,36,30,87,178,178,74,28,89,52,38,96,111,22,22,49,42,100,112,207,248,214,235,249,198,31,38,6,0,0,0,0,0,0,0, -62,120,158,53,115,140,39,58,26,95,243,248,248,248,243,141,148,43,60,28,77,102,78,33,58,157,183,139,24,59,36,30,18,0,25,138,179,144,93,75,5,0,0,23,55,5,0,0, -39,194,204,124,5,135,248,249,250,250,214,27,0,0,0,3,36,19,0,0,3,30,34,127,157,22,5,98,98,5,0,0,0,97,246,248,248,250,252,185,58,121,175,249,248,128,36,30, -87,178,178,74,28,89,52,38,96,111,22,39,209,249,220,112,42,2,57,159,48,18,201,249,204,18,0,0,0,0,0,0,62,120,158,53,115,140,39,58,26,21,0,0,0,0,0,88, -148,43,60,28,77,102,78,33,58,157,183,139,24,59,36,30,18,0,25,138,179,144,93,75,5,0,0,23,55,5,0,0,39,194,204,124,5,0,14,33,55,82,13,0,0,0,0,3, -3,36,18,1,36,19,0,22,128,158,81,136,250,250,92,0,0,0,24,56,71,190,155,50,0,5,122,133,77,38,0,76,189,184,74,0,6,52,91,90,109,179,139,18,4,0,39,102, -108,216,252,249,202,18,0,14,38,6,0,0,0,0,0,0,0,65,120,184,150,19,0,22,63,18,81,243,248,248,248,243,141,148,50,98,102,76,14,53,157,179,119,27,73,38,0,2, -36,19,93,179,144,93,74,4,0,0,0,0,4,0,0,5,115,125,171,204,126,7,140,248,249,250,250,209,27,0,0,0,3,36,18,1,36,19,0,22,128,158,81,66,65,68,3,0, -81,243,249,250,250,252,187,50,0,5,122,178,250,249,90,76,189,184,74,0,6,52,91,90,109,179,139,18,21,198,249,221,108,67,159,48,18,198,248,206,53,6,0,0,0,0,0,0, -0,65,120,184,150,19,0,22,63,18,0,0,0,0,0,0,88,148,50,98,102,76,14,53,157,179,119,27,73,38,0,2,36,19,93,179,144,93,74,4,0,0,0,0,4,0,0,5, -115,125,171,204,126,7,0,13,33,55,82,13,0,0,0,0,0,2,34,45,15,0,0,0,22,152,180,22,95,250,250,92,0,0,0,74,191,154,40,0,0,0,15,153,143,37,75,178, -179,100,16,8,33,38,89,91,49,139,179,138,18,0,0,40,95,235,249,248,202,18,0,0,14,38,6,0,0,0,0,0,0,5,149,179,153,50,0,0,22,64,22,81,243,248,248,248, -243,145,180,115,97,25,36,159,179,118,16,59,43,32,6,0,3,36,28,97,96,74,4,0,0,0,0,0,0,0,5,123,124,1,31,176,204,127,7,149,248,249,250,250,209,18,0,0, -0,2,34,45,15,0,0,0,22,152,180,22,1,70,70,83,243,248,248,250,252,186,40,0,0,0,15,153,185,249,250,205,179,100,16,8,33,38,89,91,49,139,179,138,18,18,198,249, -217,165,48,18,198,248,203,18,14,38,6,0,0,0,0,0,0,5,149,179,153,50,0,0,22,64,22,0,0,0,0,0,0,94,180,115,97,25,36,159,179,118,16,59,43,32,6,0, -3,36,28,97,96,74,4,0,0,0,0,0,0,0,5,123,124,1,31,176,204,127,7,0,13,33,55,82,13,0,0,0,0,2,34,45,15,0,0,3,66,76,126,156,22,96,250,250, -92,0,60,190,154,78,12,0,0,10,62,40,112,146,183,179,74,2,38,42,39,87,26,25,90,47,138,179,138,18,0,71,234,249,202,202,248,198,18,8,0,14,38,6,0,0,0,0, -5,124,139,71,115,162,52,0,0,22,64,22,81,243,248,248,248,247,187,180,50,84,165,179,117,16,62,37,0,14,38,6,0,1,34,82,71,4,0,0,0,0,0,0,0,5,123,124, -6,0,0,32,176,204,128,11,154,248,249,250,250,209,18,0,0,2,34,45,15,0,0,3,66,76,126,156,22,3,129,246,248,248,250,252,186,78,12,0,0,10,62,40,112,186,253,253, -138,2,38,42,39,87,26,25,90,47,138,179,138,18,18,211,252,209,35,198,248,203,18,8,0,14,38,6,0,0,0,0,5,124,139,71,115,162,52,0,0,22,64,22,0,0,0,0, -10,79,155,180,50,84,165,179,117,16,62,37,0,14,38,6,0,1,34,82,71,4,0,0,0,0,0,0,0,5,123,124,6,0,0,32,176,204,128,11,0,13,33,55,82,13,0,0, -3,36,18,1,36,16,1,70,70,2,20,130,158,22,96,250,250,131,191,154,40,24,59,13,8,62,37,0,74,179,183,101,4,8,32,56,92,26,0,0,28,90,47,138,179,133,82,232, -249,198,18,18,198,248,198,45,24,0,14,38,6,0,0,5,125,142,23,0,66,120,162,55,1,0,22,64,23,81,243,248,250,251,247,141,143,166,197,123,14,62,37,0,0,0,14,38, -4,6,78,87,18,0,0,0,0,0,0,0,2,118,123,6,0,0,0,0,32,176,204,143,26,158,248,249,250,250,206,18,3,36,18,1,36,16,1,70,70,2,20,130,158,96,243,250, -250,250,252,187,40,24,59,13,8,62,37,0,74,179,210,251,248,95,32,56,92,26,0,0,28,90,47,138,179,133,69,160,209,248,238,248,203,18,0,29,24,0,14,38,6,0,0,5, -125,142,23,0,66,120,162,55,1,0,22,64,23,0,0,10,79,102,79,88,143,166,197,123,14,62,37,0,0,0,14,38,4,6,78,87,18,0,0,0,0,0,0,0,2,118,123,6, -0,0,0,0,32,176,204,143,26,0,13,33,55,82,13,0,31,19,0,122,91,33,75,68,3,0,0,23,124,150,23,94,251,253,191,42,0,0,25,59,60,34,0,74,177,171,140,119, -43,33,38,84,52,13,0,0,0,28,90,48,132,184,238,249,198,18,0,0,18,198,248,198,48,24,0,14,38,6,5,123,142,24,0,0,0,66,121,145,15,0,0,23,55,1,87,247, -251,250,248,244,198,179,132,59,60,34,0,0,0,0,0,12,36,79,70,8,33,19,0,0,0,0,0,4,109,111,5,0,0,0,0,0,0,32,176,204,144,26,158,248,249,250,250,202, -47,19,0,0,2,33,75,68,3,0,0,23,165,250,249,248,251,252,187,42,0,0,25,59,60,34,0,74,177,171,140,169,249,249,115,84,52,13,0,0,0,28,90,48,132,179,179,60, -35,238,248,239,35,0,0,1,33,24,0,14,38,6,5,123,142,24,0,0,0,66,121,145,15,0,0,23,55,1,10,79,102,79,10,36,171,179,132,59,60,34,0,0,0,0,0,12, -36,79,70,8,33,19,0,0,0,0,0,4,109,111,5,0,0,0,0,0,0,32,176,204,144,26,0,13,33,55,81,17,27,0,45,248,248,134,86,18,0,0,0,0,4,88,141,80, -210,252,249,90,0,0,7,65,70,12,74,178,178,71,6,125,142,61,86,26,0,36,19,0,0,0,27,90,108,238,253,227,34,0,0,0,0,18,198,248,198,48,24,0,14,41,126,139, -20,0,0,0,0,0,66,94,13,0,0,0,2,10,79,151,247,248,249,252,251,178,138,80,70,12,0,0,0,0,0,7,83,88,7,0,3,36,19,0,0,0,5,121,119,2,0,0, -0,0,0,0,0,0,32,174,204,145,31,158,248,249,250,251,200,18,0,0,2,69,86,18,0,0,0,81,243,250,252,250,251,186,42,0,0,0,7,65,70,12,74,178,178,71,6,125, -184,250,250,107,0,36,19,0,0,0,27,90,96,179,179,141,202,248,239,248,198,18,0,0,1,33,24,0,14,41,126,139,20,0,0,0,0,0,66,94,13,0,0,0,2,10,79,102, -79,10,39,161,179,142,138,80,70,12,0,0,0,0,0,7,83,88,7,0,3,36,19,0,0,0,5,121,119,2,0,0,0,0,0,0,0,0,32,174,204,145,26,0,13,32,55,95, -79,13,0,96,250,250,95,33,19,0,0,0,0,0,121,209,159,120,248,248,90,10,58,33,28,118,182,178,74,0,10,37,142,169,57,2,0,3,36,19,0,0,0,86,240,250,227,184, -138,18,0,0,0,0,18,198,248,198,48,24,11,129,152,25,0,0,0,0,0,0,0,66,84,10,0,0,9,79,102,78,88,245,252,253,251,243,165,162,48,62,13,0,0,0,9,81, -64,16,36,6,0,3,36,19,0,5,123,124,5,0,8,51,11,0,0,0,0,0,0,30,174,204,146,31,162,248,250,250,250,197,14,3,70,70,8,33,19,0,81,243,248,248,252,253, -190,42,0,0,0,10,58,33,28,118,182,178,74,0,10,37,142,201,250,248,90,3,36,19,0,0,0,74,189,87,142,238,252,207,35,198,248,198,18,0,0,1,33,24,11,129,152,25, -0,0,0,0,0,0,0,66,84,10,0,0,9,79,102,78,10,41,162,179,111,16,124,162,48,62,13,0,0,0,9,81,64,16,36,6,0,3,36,19,0,5,123,124,5,0,8,51, -11,0,0,0,0,0,0,30,174,204,146,26,0,13,52,62,55,80,19,66,139,248,248,92,36,19,0,0,0,60,183,179,155,22,94,248,248,130,35,0,74,188,197,82,0,10,33,40, -91,136,127,42,7,0,3,36,19,0,66,234,250,218,64,138,179,138,18,0,0,0,0,18,198,248,198,48,96,139,32,33,3,0,0,0,0,0,0,0,66,84,8,8,79,102,77,14, -41,195,251,251,248,250,245,141,148,51,63,12,0,9,82,70,0,0,14,38,7,0,3,36,23,123,124,6,0,0,53,102,77,9,0,0,0,0,0,0,30,174,204,145,34,177,249,249, -250,250,198,73,71,3,0,3,36,94,243,248,248,250,251,203,155,22,0,0,10,62,35,0,74,188,197,82,0,10,33,40,91,136,174,249,248,90,3,36,19,0,52,159,74,102,209,252, -238,146,18,18,198,248,198,18,0,0,1,32,96,139,32,33,3,0,0,0,0,0,0,0,66,84,8,8,79,102,77,14,41,168,179,110,14,62,35,88,148,51,63,12,0,9,82,70, -0,0,14,38,7,0,3,36,23,123,124,6,0,0,53,102,77,9,0,0,0,0,0,0,30,174,204,145,29,29,27,30,32,54,102,70,1,94,248,248,92,36,18,0,60,190,154,56, -87,148,22,100,250,249,90,74,178,178,97,60,20,30,39,88,28,5,122,129,43,6,0,3,36,80,234,249,198,42,90,49,138,179,139,58,14,0,0,0,18,198,248,198,77,40,0,12, -35,6,0,0,0,0,0,0,0,64,78,78,102,76,27,28,32,156,159,243,250,249,248,243,141,148,52,59,20,79,71,3,0,0,0,14,38,6,0,8,142,134,6,0,0,0,14,80, -102,75,13,40,14,0,0,0,0,29,173,203,155,46,171,248,249,250,251,211,10,0,0,0,83,245,248,248,250,252,187,56,87,148,22,10,62,37,0,74,178,178,97,60,20,30,39,88, -28,5,122,176,249,248,90,3,36,67,159,53,18,204,250,209,146,179,139,58,31,198,248,198,18,0,0,1,64,40,0,12,35,6,0,0,0,0,0,0,0,64,78,78,102,76,27,28, -32,156,114,13,62,37,0,0,88,148,52,59,20,79,71,3,0,0,0,14,38,6,0,8,142,134,6,0,0,0,14,80,102,75,13,40,14,0,0,0,0,29,173,203,155,42,0,14, -14,82,86,76,12,0,94,248,248,92,32,71,190,155,57,0,0,88,152,79,117,248,250,205,179,74,0,37,68,46,85,28,0,0,5,122,130,42,6,0,68,237,249,198,18,0,26,91, -48,138,194,161,23,0,0,0,0,18,198,249,202,45,24,0,14,38,6,0,0,0,0,0,0,11,97,102,76,26,32,4,0,19,15,123,245,248,248,248,243,141,148,54,99,72,1,0, -0,0,0,0,14,38,11,123,126,41,19,0,0,0,0,11,79,102,90,50,4,0,0,0,0,0,29,180,205,146,33,176,248,250,250,250,193,9,0,81,243,248,249,250,252,187,57,0, -0,88,152,79,37,0,74,178,179,74,0,37,68,46,85,28,0,0,5,122,176,249,248,90,54,173,68,18,198,248,204,102,48,138,194,161,23,18,198,248,198,18,2,34,20,29,24,0, -14,38,6,0,0,0,0,0,0,11,97,102,76,26,32,4,0,19,15,62,37,0,0,2,3,88,148,54,99,72,1,0,0,0,0,0,14,38,11,123,126,41,19,0,0,0,0,11, -79,102,90,50,4,0,0,0,0,0,29,180,205,146,28,0,64,73,34,54,82,13,0,94,248,248,123,191,155,55,0,0,0,10,129,163,23,138,253,253,154,8,8,29,58,102,36,0, -0,0,0,5,122,130,39,68,234,249,206,32,0,0,0,25,84,79,158,180,138,18,0,0,0,2,51,203,248,198,48,23,0,14,38,6,0,0,0,0,10,78,102,93,82,36,1,0, -0,10,62,37,81,243,248,248,249,243,142,180,96,56,10,0,0,0,0,0,0,19,143,127,6,3,36,15,0,0,0,0,13,95,102,73,6,0,0,0,0,2,34,43,172,204,147,37, -196,250,249,250,250,184,87,243,248,248,250,252,187,55,0,0,0,10,129,163,23,69,178,179,99,8,8,29,58,102,36,0,0,0,0,5,122,176,249,249,193,55,51,201,248,198,18,25, -84,79,158,180,138,18,18,198,248,198,51,21,0,1,33,23,0,14,38,6,0,0,0,0,10,78,102,93,82,36,1,0,0,10,62,37,0,0,0,4,36,7,93,180,96,56,10,0, -0,0,0,0,0,19,143,127,6,3,36,15,0,0,0,0,13,95,102,73,6,0,0,0,0,2,34,43,172,204,147,29,83,0,11,33,55,82,13,0,94,249,252,179,75,15,0,0, -10,62,37,81,156,173,204,250,248,116,36,38,82,54,51,4,0,0,0,0,5,113,147,234,249,198,20,7,0,0,0,0,61,102,50,138,179,138,18,0,2,35,20,18,198,248,198,45, -20,0,14,38,6,0,0,10,79,102,75,28,78,82,9,0,10,62,37,0,0,81,243,248,248,226,99,133,150,54,58,4,0,0,0,0,5,123,131,43,6,0,2,7,0,0,0,2, -46,52,80,102,74,7,0,0,2,35,20,0,29,172,203,168,89,180,248,249,250,250,247,248,248,249,250,174,75,15,0,0,10,62,37,81,156,173,175,74,9,41,36,38,82,54,51,4, -0,0,0,0,5,113,182,252,249,102,198,248,198,18,0,0,61,102,50,138,179,138,18,18,198,249,202,18,0,0,0,30,20,0,14,38,6,0,0,10,79,102,75,28,78,82,9,0, -10,62,37,0,0,0,0,0,8,37,81,133,150,54,58,4,0,0,0,0,5,123,131,43,6,0,2,7,0,0,0,2,46,52,80,102,74,7,0,0,2,35,20,0,29,172,203,168, -149,27,0,13,33,55,82,13,22,187,250,249,94,34,16,9,62,37,0,69,179,179,86,94,248,249,127,88,26,0,16,2,0,0,0,0,0,67,238,252,206,24,0,0,0,0,2,50, -44,27,88,50,138,179,138,20,36,20,0,0,18,198,248,198,48,24,0,14,38,3,9,79,102,76,27,30,6,66,80,21,58,37,0,0,0,0,81,243,222,100,88,11,88,148,36,2, -0,0,0,5,123,124,6,15,38,6,0,0,0,0,2,50,50,0,11,83,102,72,5,0,36,20,0,0,0,27,186,209,149,35,185,248,249,250,250,248,249,250,149,33,6,34,16,9, -62,37,0,69,179,179,86,0,8,36,58,88,26,0,16,2,0,0,0,0,0,53,179,183,249,248,248,198,18,0,2,50,44,27,88,50,138,179,138,20,51,202,248,198,18,0,0,0, -32,24,0,14,38,3,9,79,102,76,27,30,6,66,80,21,58,37,0,0,0,0,0,0,8,81,88,11,88,148,36,2,0,0,0,5,123,124,6,15,38,6,0,0,0,0,2,50, -50,0,11,83,102,72,5,0,36,20,0,0,0,27,186,209,203,148,29,0,13,33,55,97,153,98,117,248,248,91,36,65,36,0,74,178,173,123,135,31,115,249,250,125,7,0,0,0, -0,0,0,0,66,232,249,223,139,42,6,0,0,2,50,50,2,0,25,90,51,138,180,154,36,0,0,0,0,18,198,248,198,49,24,0,11,40,79,102,76,27,32,4,0,0,66,102, -41,0,0,0,0,0,0,83,101,69,13,36,10,88,148,22,0,0,5,123,124,6,0,0,15,38,6,0,0,2,50,50,2,0,0,13,84,102,72,34,17,0,0,0,3,68,83,171, -203,148,37,209,248,249,250,251,252,150,36,3,0,1,36,65,36,0,74,178,173,123,135,31,33,38,88,54,7,0,0,0,0,0,0,0,52,155,55,123,236,249,248,102,0,2,50,50, -2,0,25,90,51,138,180,154,36,18,198,248,198,18,0,0,0,33,24,0,11,40,79,102,76,27,32,4,0,0,66,102,41,0,0,0,0,0,0,9,82,69,13,36,10,88,148,22, -0,0,5,123,124,6,0,0,15,38,6,0,0,2,50,50,2,0,0,13,84,102,72,34,17,0,0,0,3,68,83,171,171,204,149,29,0,13,52,171,145,41,0,94,248,248,129,37, -0,74,178,178,72,0,93,162,58,149,249,248,115,11,0,0,0,0,0,66,234,249,198,23,122,130,42,4,1,50,50,2,0,0,0,24,89,52,151,185,138,18,0,0,0,6,30,198, -248,198,48,20,8,82,102,77,26,32,3,0,0,9,55,73,76,9,0,0,0,0,8,82,71,3,0,10,39,11,88,148,20,1,123,124,6,0,0,0,0,15,38,4,1,50,50,2, -0,0,0,0,13,83,102,77,3,0,0,3,69,76,13,27,171,204,183,245,248,248,250,253,252,185,5,0,0,9,60,37,0,74,178,178,72,0,93,162,58,88,27,6,39,11,0,0, -0,0,0,52,159,53,18,199,252,236,249,248,91,50,50,2,0,0,0,24,89,52,151,185,138,18,18,198,248,199,30,0,0,1,33,20,8,82,102,77,26,32,3,0,0,9,55,73, -76,9,0,0,0,0,8,82,71,3,0,10,39,11,88,148,20,1,123,124,6,0,0,0,0,15,38,4,1,50,50,2,0,0,0,0,13,83,102,77,3,0,0,3,69,76,13,27, -27,170,204,149,26,20,152,116,70,80,12,0,101,250,249,90,74,178,178,74,0,10,30,114,185,48,94,248,248,115,11,0,0,0,66,234,249,198,18,0,5,122,129,37,48,49,2,0, -0,0,0,0,25,101,62,138,179,138,18,0,0,14,62,36,198,248,198,52,84,102,79,48,32,2,0,0,10,62,36,0,56,80,10,0,0,9,81,71,2,0,0,0,10,39,11,86, -135,121,118,6,0,0,0,0,0,0,14,33,48,49,2,0,0,0,0,0,0,42,88,102,70,3,1,70,68,15,59,20,27,197,252,252,248,249,252,251,250,250,171,5,11,62,37,0, -74,178,178,74,0,10,30,114,185,48,0,0,10,39,11,0,0,0,52,159,53,18,198,248,199,132,175,249,249,122,2,0,0,0,0,0,25,101,62,138,179,138,18,18,198,248,212,36, -0,0,0,36,84,102,79,48,32,2,0,0,10,62,36,0,56,80,10,0,0,9,81,71,2,0,0,0,10,39,11,86,135,121,118,6,0,0,0,0,0,0,14,33,48,49,2,0, -0,0,0,0,0,42,88,102,70,3,1,70,68,15,59,20,19,26,170,204,152,144,92,40,32,54,81,20,56,118,248,250,205,178,74,0,10,33,39,88,107,148,22,94,248,248,115,11, -0,66,234,249,198,18,0,0,0,5,122,150,69,6,0,0,0,0,0,3,30,39,86,52,138,179,138,18,0,0,22,60,33,198,248,215,113,81,25,38,36,5,0,7,60,37,0,0, -0,57,81,8,7,82,71,2,0,0,0,0,0,9,39,11,152,179,27,0,0,0,0,0,0,0,0,54,65,6,0,0,0,0,0,3,36,15,14,86,102,68,96,150,9,0,23,64, -94,244,252,254,252,249,228,249,249,250,250,169,60,37,0,74,178,178,74,0,10,33,39,88,107,148,22,0,0,9,39,11,0,52,159,53,18,198,248,198,18,5,122,189,250,248,90,0, -0,0,0,3,30,39,86,52,138,179,138,18,18,198,249,212,33,0,10,78,102,81,25,38,36,5,0,7,60,37,0,0,0,57,81,8,7,82,71,2,0,0,0,0,0,9,39,11, -152,179,27,0,0,0,0,0,0,0,0,54,65,6,0,0,0,0,0,3,36,15,14,86,102,68,96,150,9,0,23,64,64,18,21,168,203,173,50,0,12,33,54,87,33,0,140,253, -253,138,0,10,33,39,88,28,0,88,148,22,94,248,248,115,74,234,249,198,18,0,0,0,0,2,54,147,130,40,5,0,0,0,3,36,19,0,24,90,52,138,179,138,18,0,0,19, -56,43,215,251,215,60,45,0,13,38,6,4,22,0,0,0,0,0,55,76,78,68,2,0,0,0,0,0,0,0,14,141,119,85,145,22,0,0,0,0,0,2,50,48,16,36,5,0, -0,0,3,36,19,12,4,14,83,102,102,128,122,5,0,97,246,248,249,252,252,200,64,194,248,249,250,250,171,5,74,178,178,74,0,10,33,39,88,28,0,88,148,22,0,0,9,39, -61,159,53,18,198,248,198,18,0,2,54,147,176,249,248,90,0,0,3,36,19,0,24,90,52,138,179,138,18,18,198,248,210,43,77,102,75,45,45,0,13,38,6,4,22,0,0,0, -0,0,55,76,78,68,2,0,0,0,0,0,0,0,14,141,119,85,145,22,0,0,0,0,0,2,50,48,16,36,5,0,0,0,3,36,19,12,4,14,83,102,102,128,122,5,0,23, -24,64,34,140,184,207,150,30,0,13,33,54,80,83,178,206,250,248,96,33,39,88,28,0,0,0,88,148,22,94,248,249,243,249,198,18,0,0,0,0,2,50,50,7,122,130,43,5, -0,3,36,19,0,0,0,23,89,52,138,179,138,18,0,0,30,97,113,214,249,204,47,23,0,14,38,6,0,0,0,0,0,0,8,97,102,11,0,0,0,0,0,0,0,5,123,129, -42,11,88,148,22,0,0,0,2,50,50,2,0,16,38,5,0,3,36,19,0,80,124,5,70,100,102,69,124,122,85,243,249,250,249,249,206,207,150,45,203,248,249,250,250,190,178,178, -74,0,10,33,39,88,28,0,0,0,88,148,22,0,0,59,174,62,18,198,248,198,18,0,2,50,50,7,122,176,249,248,90,3,36,19,0,0,0,23,89,52,138,179,138,18,18,198, -249,220,113,74,27,29,31,23,0,14,38,6,0,0,0,0,0,0,8,97,102,11,0,0,0,0,0,0,0,5,123,129,42,11,88,148,22,0,0,0,2,50,50,2,0,16,38,5, -0,3,36,19,0,80,124,5,70,100,102,69,124,122,5,0,0,45,173,102,49,170,204,151,31,0,13,33,113,203,182,74,94,248,249,115,88,28,0,0,0,0,0,88,148,19,133,252, -249,222,28,0,0,0,0,2,50,50,2,0,5,123,131,43,8,34,19,0,0,0,0,0,23,90,53,138,179,138,18,8,73,102,94,53,204,248,198,49,24,0,14,38,6,0,0,0, -0,9,81,66,54,78,9,0,0,0,0,0,5,123,124,6,9,39,11,88,148,22,0,2,50,50,2,0,0,0,15,36,8,34,19,0,0,11,124,158,70,23,88,102,70,166,249,248, -248,249,251,151,49,170,204,151,47,207,248,249,251,254,227,74,0,10,33,39,88,28,0,0,0,0,0,88,148,19,48,159,60,54,200,248,198,18,0,2,50,50,2,0,5,123,176,249, -248,112,19,0,0,0,0,0,23,90,53,138,179,138,18,26,214,251,219,53,28,2,0,33,24,0,14,38,6,0,0,0,0,9,81,66,54,78,9,0,0,0,0,0,5,123,124,6, -9,39,11,88,148,22,0,2,50,50,2,0,0,0,15,36,8,34,19,0,0,11,124,158,70,23,88,102,70,124,122,6,34,145,111,75,17,25,169,204,153,30,0,83,188,194,132,12, -7,115,249,250,108,0,0,0,0,0,0,0,81,159,231,249,248,248,115,12,0,0,2,50,50,2,0,0,0,7,81,26,58,20,0,0,0,0,0,0,0,22,89,53,138,179,142,87, -96,74,42,71,35,198,248,198,48,24,0,14,38,6,0,0,9,82,71,2,0,58,80,8,0,0,0,5,123,124,6,0,0,9,39,12,88,148,24,50,50,2,0,0,0,0,0,15, -58,20,0,0,0,3,74,159,124,5,18,89,151,246,252,252,249,250,157,75,17,25,169,204,153,46,207,250,253,253,252,154,7,33,39,88,28,0,0,0,0,0,0,0,81,152,149,48, -18,200,249,200,18,0,2,50,50,2,0,0,0,7,81,111,250,248,90,0,0,0,0,0,0,22,89,53,138,179,142,87,107,215,249,214,35,0,0,1,33,24,0,14,38,6,0,0, -9,82,71,2,0,58,80,8,0,0,0,5,123,124,6,0,0,9,39,12,88,148,24,50,50,2,0,0,0,0,0,15,58,20,0,0,0,3,74,159,124,5,18,89,102,69,124,116, -179,97,31,27,62,16,25,169,204,147,93,178,182,98,54,83,40,38,149,249,248,90,1,0,0,0,0,0,61,238,253,204,105,248,248,115,10,1,50,50,2,0,0,0,0,0,3,32, -30,34,5,0,0,0,0,0,0,0,22,90,51,142,203,182,84,27,27,28,62,33,198,248,198,48,24,0,14,38,4,8,82,71,2,0,0,0,59,80,8,0,5,123,124,6,0,0, -0,0,9,39,10,88,169,68,2,0,0,0,0,0,3,32,30,34,5,0,3,70,71,8,122,122,5,93,247,251,250,252,251,147,31,27,62,16,25,169,204,147,107,241,253,251,250,250, -162,38,88,28,0,0,1,0,0,0,0,0,46,178,179,41,198,248,200,54,10,1,50,50,2,0,0,0,0,0,3,32,113,249,248,90,0,0,0,0,0,0,22,90,51,142,203,182, -84,43,204,249,212,33,0,0,1,33,24,0,14,38,4,8,82,71,2,0,0,0,59,80,8,0,5,123,124,6,0,0,0,0,9,39,10,88,169,68,2,0,0,0,0,0,3,32, -30,34,5,0,3,70,71,8,122,122,5,18,90,102,65,122,154,131,7,0,27,64,15,23,162,204,192,176,70,11,37,68,86,83,26,94,248,249,93,0,0,0,0,66,234,251,224,157, -22,94,248,248,112,52,48,2,0,0,0,0,0,3,36,19,0,16,38,5,0,0,0,0,0,0,0,20,82,98,185,201,150,48,3,0,27,64,32,198,248,198,48,24,0,12,37,80, -70,2,0,0,6,32,2,58,80,13,123,124,6,0,0,0,0,0,0,8,34,52,120,149,22,0,0,0,0,3,36,19,0,16,35,10,68,71,3,0,5,122,165,243,248,250,251,251, -186,131,7,0,27,64,15,23,162,204,192,185,220,248,249,250,250,178,26,0,6,33,4,0,0,0,0,52,162,117,126,231,249,198,18,8,34,52,48,2,0,0,0,0,0,3,36,19, -0,104,249,248,90,0,0,0,0,0,0,20,82,98,185,201,150,48,21,198,249,212,32,0,0,1,33,24,0,12,37,80,70,2,0,0,6,32,2,58,80,13,123,124,6,0,0,0, -0,0,0,8,34,52,120,149,22,0,0,0,0,3,36,19,0,16,35,10,68,71,3,0,5,122,122,5,20,91,114,164,83,123,122,5,0,28,64,17,88,194,204,166,25,7,38,56, -96,85,8,3,118,248,248,90,0,0,66,236,251,209,18,88,148,22,94,248,249,132,12,0,0,0,0,0,3,36,19,0,0,0,16,38,5,0,0,0,0,0,0,7,81,102,97,148, -188,139,18,0,0,28,64,34,198,248,198,48,20,6,83,88,7,0,0,6,38,15,0,0,63,164,128,6,0,0,0,0,0,0,0,1,50,65,12,88,148,22,0,0,3,36,19,0, -0,0,15,87,70,2,0,0,0,85,249,252,248,249,252,185,83,123,122,5,0,28,64,17,88,194,204,166,49,213,249,250,251,250,139,3,38,15,0,0,0,0,52,164,120,65,198,250, -231,39,0,1,50,65,12,0,0,0,0,0,3,36,19,0,0,0,104,249,248,90,0,0,0,0,0,7,81,102,97,148,188,139,18,18,198,249,212,34,0,0,1,33,20,6,83,88, -7,0,0,6,38,15,0,0,63,164,128,6,0,0,0,0,0,0,0,1,50,65,12,88,148,22,0,0,3,36,19,0,0,0,15,87,70,2,0,0,0,5,122,122,1,39,186,154, -102,65,125,122,11,0,30,97,175,172,175,203,155,51,38,88,51,52,81,42,11,94,248,248,90,66,245,251,213,18,0,0,88,148,24,126,249,248,98,12,0,0,0,3,36,19,0,0, -0,0,0,16,38,5,0,0,0,0,10,79,102,79,85,71,138,179,138,18,0,0,30,32,18,198,248,198,49,86,66,16,36,5,5,38,14,0,0,5,123,154,83,8,0,0,0,0, -0,0,2,50,48,11,37,12,88,148,22,3,36,19,0,0,0,3,67,75,35,4,0,0,81,243,248,252,252,249,155,98,102,65,125,122,11,0,30,97,175,172,175,203,155,73,223,250, -250,250,250,155,11,0,0,0,0,52,164,120,79,229,248,198,100,148,24,50,48,11,37,12,0,0,0,3,36,19,0,0,0,0,0,104,249,248,148,0,0,0,10,79,102,79,85,71, -138,179,138,18,18,198,249,205,18,0,0,0,33,86,66,16,36,5,5,38,14,0,0,5,123,154,83,8,0,0,0,0,0,0,2,50,48,11,37,12,88,148,22,3,36,19,0,0, -0,3,67,75,35,4,0,0,0,0,5,117,121,135,110,98 -}; - - -#endif diff --git a/kscreensaver/kdesavers/Flux.cpp b/kscreensaver/kdesavers/Flux.cpp deleted file mode 100644 index d401b782..00000000 --- a/kscreensaver/kdesavers/Flux.cpp +++ /dev/null @@ -1,967 +0,0 @@ -//============================================================================ -// -// Terence Welsh Screensaver - Flux -// http://www.reallyslick.com/ -// -// Ported to KDE by Karl Robillard -// -/* - * Copyright (C) 2002 Terence M. Welsh - * - * Flux is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * Flux is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ -//============================================================================ - - -/* - TODO - - [ ] Regular and others are messed up after Sparkler. - Insane seems to reset them. -*/ - - -#include <stdio.h> -#include <stdlib.h> -#include <math.h> -#include <time.h> -#include <tqtimer.h> -#include "Flux.h" -#include "Flux.moc" - - -#define NUMCONSTS 8 -#define PIx2 6.28318530718f -#define DEG2RAD 0.0174532925f - - -void hsl2rgb(float h, float s, float l, float &r, float &g, float &b) -{ - // hue influence - if(h < 0.166667){ // full red, some green - r = 1.0; - g = h * 6.0f; - b = 0.0; - } - else { - if(h < 0.5){ // full green - g = 1.0; - if(h < 0.333333){ // some red - r = 1.0f - ((h - 0.166667f) * 6.0f); - b = 0.0; - } - else{ // some blue - b = (h - 0.333333f) * 6.0f; - r = 0.0; - } - } - else{ - if(h < 0.833333){ // full blue - b = 1.0; - if(h < 0.666667){ // some green - g = 1.0f - ((h - 0.5f) * 6.0f); - r = 0.0; - } - else{ // some red - r = (h - 0.666667f) * 6.0f; - g = 0.0; - } - } - else{ // full red, some blue - r = 1.0; - b = 1.0f - ((h - 0.833333f) * 6.0f); - g = 0.0; - } - } - } - - // saturation influence - r = 1.0f - (s * (1.0f - r)); - g = 1.0f - (s * (1.0f - g)); - b = 1.0f - (s * (1.0f - b)); - - // luminosity influence - r *= l; - g *= l; - b *= l; -} - - -// Useful random number macros -// Don't forget to initialize with srand() -inline int myRandi(int x){ - return((rand() * x) / RAND_MAX); -} -inline float myRandf(float x){ - return(float(rand() * x) / float(RAND_MAX)); -} - - -//---------------------------------------------------------------------------- - - -// Flux context to allow many instances. -static FluxWidget* _fc = 0; - -static int whichparticle; - - -// This class is poorly named. It's actually a whole trail of particles. -class particle -{ -public: - - particle(); - ~particle(); - float update(float *c); - -private: - - float** vertices; - short trails; - short counter; - float offset[3]; -}; - - -particle::particle() -{ - // Offsets are somewhat like default positions for the head of each - // particle trail. Offsets spread out the particle trails and keep - // them from all overlapping. - offset[0] = cos(PIx2 * float(whichparticle) / float(_fc->dParticles)); - offset[1] = float(whichparticle) / float(_fc->dParticles) - 0.5f; - offset[2] = sin(PIx2 * float(whichparticle) / float(_fc->dParticles)); - whichparticle++; - - // Initialize memory and set initial positions out of view of the camera - trails = _fc->dTrail; - vertices = new float*[ trails ]; - - int i; - for(i=0; i<trails; i++) - { - vertices[i] = new float[5]; // 0,1,2 = position, 3 = hue, 4 = saturation - vertices[i][0] = 0.0f; - vertices[i][1] = 3.0f; - vertices[i][2] = 0.0f; - vertices[i][3] = 0.0f; - vertices[i][4] = 0.0f; - } - - counter = 0; -} - - -particle::~particle() -{ - for(int i=0; i<trails; i++) - delete[] vertices[i]; - delete[] vertices; -} - - -float particle::update(float *c) -{ - int i, p, growth; - float rgb[3]; - float cx, cy, cz; // Containment variables - float luminosity; - static float expander = 1.0f + 0.0005f * float(_fc->dExpansion); - static float blower = 0.001f * float(_fc->dWind); - //static float otherxyz[3]; - float depth = 0; - - // Record old position - int oldc = counter; - float oldpos[3]; - oldpos[0] = vertices[oldc][0]; - oldpos[1] = vertices[oldc][1]; - oldpos[2] = vertices[oldc][2]; - - counter ++; - if(counter >= _fc->dTrail) - counter = 0; - - // Here's the iterative math for calculating new vertex positions - // first calculate limiting terms which keep vertices from constantly - // flying off to infinity - cx = vertices[oldc][0] * (1.0f - 1.0f / (vertices[oldc][0] * vertices[oldc][0] + 1.0f)); - cy = vertices[oldc][1] * (1.0f - 1.0f / (vertices[oldc][1] * vertices[oldc][1] + 1.0f)); - cz = vertices[oldc][2] * (1.0f - 1.0f / (vertices[oldc][2] * vertices[oldc][2] + 1.0f)); - // then calculate new positions - vertices[counter][0] = vertices[oldc][0] + c[6] * offset[0] - cx - + c[2] * vertices[oldc][1] - + c[5] * vertices[oldc][2]; - vertices[counter][1] = vertices[oldc][1] + c[6] * offset[1] - cy - + c[1] * vertices[oldc][2] - + c[4] * vertices[oldc][0]; - vertices[counter][2] = vertices[oldc][2] + c[6] * offset[2] - cz - + c[0] * vertices[oldc][0] - + c[3] * vertices[oldc][1]; - - // Pick a hue - vertices[counter][3] = cx * cx + cy * cy + cz * cz; - if(vertices[counter][3] > 1.0f) - vertices[counter][3] = 1.0f; - vertices[counter][3] += c[7]; - // Limit the hue (0 - 1) - if(vertices[counter][3] > 1.0f) - vertices[counter][3] -= 1.0f; - if(vertices[counter][3] < 0.0f) - vertices[counter][3] += 1.0f; - // Pick a saturation - vertices[counter][4] = c[0] + vertices[counter][3]; - // Limit the saturation (0 - 1) - if(vertices[counter][4] < 0.0f) - vertices[counter][4] = -vertices[counter][4]; - vertices[counter][4] -= float(int(vertices[counter][4])); - vertices[counter][4] = 1.0f - (vertices[counter][4] * vertices[counter][4]); - - // Bring particles back if they escape - if(!counter){ - if((vertices[0][0] > 1000000000.0f) || (vertices[0][0] < -1000000000.0f) - || (vertices[0][1] > 1000000000.0f) || (vertices[0][1] < -1000000000.0f) - || (vertices[2][2] > 1000000000.0f) || (vertices[0][2] < -1000000000.0f)){ - vertices[0][0] = myRandf(2.0f) - 1.0f; - vertices[0][1] = myRandf(2.0f) - 1.0f; - vertices[0][2] = myRandf(2.0f) - 1.0f; - } - } - - // Draw every vertex in particle trail - p = counter; - growth = 0; - luminosity = _fc->lumdiff; - for(i=0; i<_fc->dTrail; i++){ - p ++; - if(p >= _fc->dTrail) - p = 0; - growth++; - - // assign color to particle - hsl2rgb(vertices[p][3], vertices[p][4], luminosity, rgb[0], rgb[1], rgb[2]); - glColor3fv(rgb); - - glPushMatrix(); - if(_fc->dGeometry == 1) // Spheres - glTranslatef(vertices[p][0], vertices[p][1], vertices[p][2]); - else{ // Points or lights - depth = _fc->cosCameraAngle * vertices[p][2] - _fc->sinCameraAngle * vertices[p][0]; - glTranslatef(_fc->cosCameraAngle * vertices[p][0] + _fc->sinCameraAngle - * vertices[p][2], vertices[p][1], depth); - } - if(_fc->dGeometry){ // Spheres or lights - switch(_fc->dTrail - growth){ - case 0: - glScalef(0.259f, 0.259f, 0.259f); - break; - case 1: - glScalef(0.5f, 0.5f, 0.5f); - break; - case 2: - glScalef(0.707f, 0.707f, 0.707f); - break; - case 3: - glScalef(0.866f, 0.866f, 0.866f); - break; - case 4: - glScalef(0.966f, 0.966f, 0.966f); - } - } - switch(_fc->dGeometry){ - case 0: // Points - switch(_fc->dTrail - growth){ - case 0: - glPointSize(float(_fc->dSize * (depth + 200.0f) * 0.001036f)); - break; - case 1: - glPointSize(float(_fc->dSize * (depth + 200.0f) * 0.002f)); - break; - case 2: - glPointSize(float(_fc->dSize * (depth + 200.0f) * 0.002828f)); - break; - case 3: - glPointSize(float(_fc->dSize * (depth + 200.0f) * 0.003464f)); - break; - case 4: - glPointSize(float(_fc->dSize * (depth + 200.0f) * 0.003864f)); - break; - default: - glPointSize(float(_fc->dSize * (depth + 200.0f) * 0.004f)); - } - glBegin(GL_POINTS); - glVertex3f(0.0f,0.0f,0.0f); - glEnd(); - break; - case 1: // Spheres - case 2: // Lights - glCallList(1); - } - glPopMatrix(); - vertices[p][0] *= expander; - vertices[p][1] *= expander; - vertices[p][2] *= expander; - vertices[p][2] += blower; - luminosity += _fc->lumdiff; - } - - // Find distance between new position and old position and return it - oldpos[0] -= vertices[counter][0]; - oldpos[1] -= vertices[counter][1]; - oldpos[2] -= vertices[counter][2]; - return(float(sqrt(oldpos[0] * oldpos[0] + oldpos[1] * oldpos[1] + oldpos[2] * oldpos[2]))); -} - - -// This class is a set of particle trails and constants that enter -// into their equations of motion. -class flux -{ -public: - - flux(); - ~flux(); - void update(); - - particle *particles; - int randomize; - float c[NUMCONSTS]; // constants - float cv[NUMCONSTS]; // constants' change velocities - int currentSmartConstant; - float oldDistance; -}; - - -flux::flux() -{ - whichparticle = 0; - - particles = new particle[_fc->dParticles]; - randomize = 1; - - float instability = _fc->dInstability; - int i; - for(i=0; i<NUMCONSTS; i++) - { - c[i] = myRandf(2.0f) - 1.0f; - cv[i] = myRandf(0.000005f * instability * instability) - + 0.000001f * instability * instability; - } - - currentSmartConstant = 0; - oldDistance = 0.0f; -} - - -flux::~flux() -{ - delete[] particles; -} - - -void flux::update() -{ - int i; - - // randomize constants - if(_fc->dRandomize){ - randomize --; - if(randomize <= 0){ - for(i=0; i<NUMCONSTS; i++) - c[i] = myRandf(2.0f) - 1.0f; - int temp = 101 - _fc->dRandomize; - temp = temp * temp; - randomize = temp + myRandi(temp); - } - } - - // update constants - for(i=0; i<NUMCONSTS; i++){ - c[i] += cv[i]; - if(c[i] >= 1.0f){ - c[i] = 1.0f; - cv[i] = -cv[i]; - } - if(c[i] <= -1.0f){ - c[i] = -1.0f; - cv[i] = -cv[i]; - } - } - - // update all particles in this flux field - float dist; - for(i=0; i<_fc->dParticles; i++) - dist = particles[i].update(c); - - // use dist from last particle to activate smart constants - _fc->dSmart = 0; - if(_fc->dSmart){ - const float upper = 0.4f; - const float lower = 0.2f; - int beSmart = 0; - if(dist > upper && dist > oldDistance) - beSmart = 1; - if(dist < lower && dist < oldDistance) - beSmart = 1; - if(beSmart){ - cv[currentSmartConstant] = -cv[currentSmartConstant]; - currentSmartConstant ++; - if(currentSmartConstant >= _fc->dSmart) - currentSmartConstant = 0; - } - oldDistance = dist; - } -} - - -//---------------------------------------------------------------------------- - - -FluxWidget::FluxWidget( TQWidget* parent, const char* name ) - : TQGLWidget(parent, name), _fluxes(0) -{ - setDefaults( Regular ); - - _frameTime = 1000 / 60; - _timer = new TQTimer( this ); - connect( _timer, TQT_SIGNAL(timeout()), this, TQT_SLOT(nextFrame()) ); -} - - -FluxWidget::~FluxWidget() -{ - // Free memory - delete[] _fluxes; -} - - -void FluxWidget::paintGL() -{ - // clear the screen - glLoadIdentity(); - - if(dBlur) // partially - { - int viewport[4]; - glGetIntegerv(GL_VIEWPORT, viewport); - float viewRatio = float(viewport[2]) / float(viewport[3]); - - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glEnable(GL_BLEND); - glDisable(GL_DEPTH_TEST); - glColor4f(0.0f, 0.0f, 0.0f, 0.5f - (float(sqrt(sqrt(double(dBlur)))) * 0.15495f)); - glBegin(GL_TRIANGLE_STRIP); - glVertex3f(-3.0f * viewRatio, -3.0f, 0.0f); - glVertex3f(3.0f * viewRatio, -3.0f, 0.0f); - glVertex3f(-3.0f * viewRatio, 3.0f, 0.0f); - glVertex3f(3.0f * viewRatio, 3.0f, 0.0f); - glEnd(); - } - else // completely - { - glClear(GL_COLOR_BUFFER_BIT); - } - - cameraAngle += 0.01f * float(dRotation); - if(cameraAngle >= 360.0f) - cameraAngle -= 360.0f; - if(dGeometry == 1) // Only rotate for spheres - glRotatef(cameraAngle, 0.0f, 1.0f, 0.0f); - else - { - cosCameraAngle = cos(cameraAngle * DEG2RAD); - sinCameraAngle = sin(cameraAngle * DEG2RAD); - } - - // set up blend modes for rendering particles - switch(dGeometry) - { - case 0: // Blending for points - glBlendFunc(GL_SRC_ALPHA, GL_ONE); - glEnable(GL_BLEND); - glEnable(GL_POINT_SMOOTH); - glHint(GL_POINT_SMOOTH_HINT, GL_NICEST); - break; - - case 1: // No blending for spheres, but we need z-buffering - glDisable(GL_BLEND); - glEnable(GL_DEPTH_TEST); - glClear(GL_DEPTH_BUFFER_BIT); - break; - - case 2: // Blending for lights - glBlendFunc(GL_ONE, GL_ONE); - glEnable(GL_BLEND); - } - - // Update particles - if( _fluxes ) - { - _fc = this; - int i; - for(i=0; i<dFluxes; i++) - _fluxes[i].update(); - } - - glFlush(); -} - - -void FluxWidget::resizeGL( int w, int h ) -{ - glViewport(0, 0, w, h ); - - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - gluPerspective(100.0, (float) w / (float) h, 0.01, 200); - glTranslatef(0.0, 0.0, -2.5); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); -} - - -// Window initialization -void FluxWidget::initializeGL() -{ - //resizeGL( width(), height() ); - - updateParameters(); - - _timer->start( _frameTime, true ); -} - - -#ifdef UNIT_TEST -void FluxWidget::keyPressEvent( TQKeyEvent* e ) -{ - if( e->key() == TQt::Key_0 ) { setDefaults( 0 ); updateParameters(); } - if( e->key() == TQt::Key_1 ) { setDefaults( 1 ); updateParameters(); } - if( e->key() == TQt::Key_2 ) { setDefaults( 2 ); updateParameters(); } - if( e->key() == TQt::Key_3 ) { setDefaults( 3 ); updateParameters(); } - if( e->key() == TQt::Key_4 ) { setDefaults( 4 ); updateParameters(); } - if( e->key() == TQt::Key_5 ) { setDefaults( 5 ); updateParameters(); } -} -#endif - - -void FluxWidget::nextFrame() -{ - updateGL(); - _timer->start( _frameTime, true ); -} - - -/** - May be called at any time - makes no OpenGL calls. -*/ -void FluxWidget::setDefaults( int which ) -{ - switch(which) - { - case Hypnotic: - dFluxes = 2; - dParticles = 10; - dTrail = 40; - dGeometry = 2; - dSize = 15; - dRandomize = 80; - dExpansion = 20; - dRotation = 0; - dWind = 40; - dInstability = 10; - dBlur = 30; - break; - - case Insane: - dFluxes = 4; - dParticles = 30; - dTrail = 8; - dGeometry = 2; - dSize = 25; - dRandomize = 0; - dExpansion = 80; - dRotation = 60; - dWind = 40; - dInstability = 100; - dBlur = 10; - break; - - case Sparklers: - dFluxes = 3; - dParticles = 20; - dTrail = 6; - dGeometry = 1; - dSize = 20; - dComplexity = 3; - dRandomize = 85; - dExpansion = 60; - dRotation = 30; - dWind = 20; - dInstability = 30; - dBlur = 0; - break; - - case Paradigm: - dFluxes = 1; - dParticles = 40; - dTrail = 40; - dGeometry = 2; - dSize = 5; - dRandomize = 90; - dExpansion = 30; - dRotation = 20; - dWind = 10; - dInstability = 5; - dBlur = 10; - break; - - case Galactic: - dFluxes = 1; - dParticles = 2; - dTrail = 1500; - dGeometry = 2; - dSize = 10; - dRandomize = 0; - dExpansion = 5; - dRotation = 25; - dWind = 0; - dInstability = 5; - dBlur = 0; - break; - - case Regular: - default: - dFluxes = 1; - dParticles = 20; - dTrail = 40; - dGeometry = 2; - dSize = 15; - dRandomize = 0; - dExpansion = 40; - dRotation = 30; - dWind = 20; - dInstability = 20; - dBlur = 0; - break; - } -} - - -/** - Called after dGeometry, dTrail, or dFluxes is changed - (such as with setDefaults). -*/ -void FluxWidget::updateParameters() -{ - int i, j; - float x, y, temp; - - srand((unsigned)time(NULL)); - rand(); rand(); rand(); rand(); rand(); - - cameraAngle = 0.0f; - - glFrontFace(GL_CCW); - glEnable(GL_CULL_FACE); - glClearColor(0.0f, 0.0f, 0.0f, 1.0f); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - if(dGeometry == 0) - { - glDisable(GL_LIGHTING); - glDisable(GL_COLOR_MATERIAL); - glDisable(GL_TEXTURE_2D); - - glEnable(GL_POINT_SMOOTH); - //glHint(GL_POINT_SMOOTH_HINT, GL_NICEST); - } - else if(dGeometry == 1) // Spheres and their lighting - { - glNewList(1, GL_COMPILE); - GLUquadricObj* qobj = gluNewQuadric(); - gluSphere(qobj, 0.005f * dSize, dComplexity + 2, dComplexity + 1); - gluDeleteQuadric(qobj); - glEndList(); - - glDisable(GL_TEXTURE_2D); - glEnable(GL_LIGHTING); - glEnable(GL_LIGHT0); - - float ambient[4] = {0.0f, 0.0f, 0.0f, 0.0f}; - float diffuse[4] = {1.0f, 1.0f, 1.0f, 0.0f}; - float specular[4] = {1.0f, 1.0f, 1.0f, 0.0f}; - float position[4] = {500.0f, 500.0f, 500.0f, 0.0f}; - - glLightfv(GL_LIGHT0, GL_AMBIENT, ambient); - glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse); - glLightfv(GL_LIGHT0, GL_SPECULAR, specular); - glLightfv(GL_LIGHT0, GL_POSITION, position); - glEnable(GL_COLOR_MATERIAL); - glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); - } - else if(dGeometry == 2) // Init lights - { - for(i=0; i<LIGHTSIZE; i++) - { - for(j=0; j<LIGHTSIZE; j++) - { - x = float(i - LIGHTSIZE / 2) / float(LIGHTSIZE / 2); - y = float(j - LIGHTSIZE / 2) / float(LIGHTSIZE / 2); - temp = 1.0f - float(sqrt((x * x) + (y * y))); - if(temp > 1.0f) - temp = 1.0f; - if(temp < 0.0f) - temp = 0.0f; - lightTexture[i][j] = (unsigned char) (255.0f * temp * temp); - } - } - - glDisable(GL_LIGHTING); - glDisable(GL_COLOR_MATERIAL); - - glEnable(GL_TEXTURE_2D); - glBindTexture(GL_TEXTURE_2D, 1); - glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexImage2D(GL_TEXTURE_2D, 0, 1, LIGHTSIZE, LIGHTSIZE, 0, - GL_LUMINANCE, GL_UNSIGNED_BYTE, lightTexture); - - temp = float(dSize) * 0.005f; - glNewList(1, GL_COMPILE); - glBindTexture(GL_TEXTURE_2D, 1); - glBegin(GL_TRIANGLES); - glTexCoord2f(0.0f, 0.0f); - glVertex3f(-temp, -temp, 0.0f); - glTexCoord2f(1.0f, 0.0f); - glVertex3f(temp, -temp, 0.0f); - glTexCoord2f(1.0f, 1.0f); - glVertex3f(temp, temp, 0.0f); - glTexCoord2f(0.0f, 0.0f); - glVertex3f(-temp, -temp, 0.0f); - glTexCoord2f(1.0f, 1.0f); - glVertex3f(temp, temp, 0.0f); - glTexCoord2f(0.0f, 1.0f); - glVertex3f(-temp, temp, 0.0f); - glEnd(); - glEndList(); - } - - // Initialize luminosity difference - lumdiff = 1.0f / float(dTrail); - - _fc = this; - delete[] _fluxes; - _fluxes = new flux[dFluxes]; -} - - -//---------------------------------------------------------------------------- - - -#ifndef UNIT_TEST -#include <klocale.h> -#include <kglobal.h> -#include <kconfig.h> - - -// libkscreensaver interface -extern "C" -{ - KDE_EXPORT const char* kss_applicationName = "kflux.kss"; - KDE_EXPORT const char* kss_description = I18N_NOOP( "Flux" ); - KDE_EXPORT const char* kss_version = "1.0"; - - KDE_EXPORT KScreenSaver* kss_create( WId id ) - { - return new KFluxScreenSaver( id ); - } - - KDE_EXPORT TQDialog* kss_setup() - { - return new KFluxSetup; - } -} - - -//---------------------------------------------------------------------------- - - -KFluxScreenSaver::KFluxScreenSaver( WId id ) : KScreenSaver( id ) -{ - _flux = new FluxWidget; - - readSettings(); - - embed( _flux ); - _flux->show(); -} - - -KFluxScreenSaver::~KFluxScreenSaver() -{ -} - - -static int filterRandom( int n ) -{ - if( (n < 0) || (n >= FluxWidget::DefaultModes) ) - { - srand((unsigned)time(NULL)); - n = rand() % FluxWidget::DefaultModes; - } - return n; -} - - -void KFluxScreenSaver::readSettings() -{ - TDEConfig* config = TDEGlobal::config(); - config->setGroup("Settings"); - - _mode = config->readNumEntry( "Mode", FluxWidget::Regular ); - _flux->setDefaults( filterRandom(_mode) ); -} - - -/** - Any invalid mode will select one at random. -*/ -void KFluxScreenSaver::setMode( int id ) -{ - _mode = id; - _flux->setDefaults( filterRandom(id) ); - _flux->updateParameters(); -} - - -//---------------------------------------------------------------------------- - - -#include <tqlayout.h> -#include <tqpushbutton.h> -#include <tqlabel.h> -#include <tqcombobox.h> -#include <kbuttonbox.h> -#include <kmessagebox.h> - - -static const char* defaultText[] = -{ - I18N_NOOP( "Regular" ), - I18N_NOOP( "Hypnotic" ), - I18N_NOOP( "Insane" ), - I18N_NOOP( "Sparklers" ), - I18N_NOOP( "Paradigm" ), - I18N_NOOP( "Galactic" ), - I18N_NOOP( "(Random)" ), - 0 -}; - - -KFluxSetup::KFluxSetup( TQWidget* parent, const char* name ) - : KDialogBase( parent, name, true, i18n( "Setup Flux Screen Saver" ), - Ok|Cancel|Help, Ok, true ) -{ - setButtonText( Help, i18n( "A&bout" ) ); - TQWidget *main = makeMainWidget(); - - TQHBoxLayout* top = new TQHBoxLayout( main, 0, spacingHint() ); - TQVBoxLayout* leftCol = new TQVBoxLayout; - top->addLayout( leftCol ); - - // Parameters - TQLabel* label = new TQLabel( i18n("Mode:"), main ); - leftCol->addWidget( label ); - - modeW = new TQComboBox( main ); - int i = 0; - while (defaultText[i]) - modeW->insertItem( i18n(defaultText[i++]) ); - leftCol->addWidget( modeW ); - - leftCol->addStretch(); - - // Preview - TQWidget* preview; - preview = new TQWidget( main ); - preview->setFixedSize( 220, 165 ); - preview->setBackgroundColor( black ); - preview->show(); // otherwise saver does not get correct size - _saver = new KFluxScreenSaver( preview->winId() ); - top->addWidget(preview); - - // Now that we have _saver... - modeW->setCurrentItem( _saver->mode() ); // set before we connect - connect( modeW, TQT_SIGNAL(activated(int)), _saver, TQT_SLOT(setMode(int)) ); -} - - -KFluxSetup::~KFluxSetup() -{ - delete _saver; -} - - -void KFluxSetup::slotHelp() -{ - KMessageBox::about(this, - i18n("<h3>Flux 1.0</h3>\n<p>Copyright (c) 2002 Terence M. Welsh<br>\n<a href=\"http://www.reallyslick.com/\">http://www.reallyslick.com/</a></p>\n\n<p>Ported to KDE by Karl Robillard</p>"), - TQString(), KMessageBox::AllowLink); -} - - -/** - Ok pressed - save settings and exit -*/ -void KFluxSetup::slotOk() -{ - TDEConfig* config = TDEGlobal::config(); - config->setGroup("Settings"); - - TQString val; - val.setNum( modeW->currentItem() ); - config->writeEntry("Mode", val ); - - config->sync(); - accept(); -} -#endif - - -//---------------------------------------------------------------------------- - - -#ifdef UNIT_TEST -// moc Flux.h -o Flux.moc -// g++ -g -DUNIT_TEST Flux.cpp -I/usr/lib/qt3/include -lqt -L/usr/lib/qt3/lib -lGLU -lGL - -#include <tqapplication.h> - -int main( int argc, char** argv ) -{ - TQApplication app( argc, argv ); - - FluxWidget w; - w.setDefaults( FluxWidget::Sparklers ); - app.setMainWidget( &w ); - w.show(); - - return app.exec(); -} -#endif - - -//EOF diff --git a/kscreensaver/kdesavers/Flux.h b/kscreensaver/kdesavers/Flux.h deleted file mode 100644 index bd7fd32e..00000000 --- a/kscreensaver/kdesavers/Flux.h +++ /dev/null @@ -1,150 +0,0 @@ -#ifndef __FLUXSS_H__ -#define __FLUXSS_H__ -//============================================================================ -// -// Terence Welsh Screensaver - Flux -// http://www.reallyslick.com/ -// -// Ported to KDE by Karl Robillard -// -//============================================================================ - - -#include <tqgl.h> - - -#define LIGHTSIZE 64 - - -class flux; -class particle; -class TQTimer; - -class FluxWidget : public TQGLWidget -{ - Q_OBJECT - - -public: - - enum eDefault - { - Regular, - Hypnotic, - Insane, - Sparklers, - Paradigm, - Galactic, - DefaultModes - }; - - FluxWidget( TQWidget* parent=0, const char* name=0 ); - ~FluxWidget(); - - void setDefaults( int which ); - void updateParameters(); - -protected: - - void paintGL(); - void resizeGL( int w, int h ); - void initializeGL(); -#ifdef UNIT_TEST - void keyPressEvent( TQKeyEvent* ); -#endif - -private slots: - - void nextFrame(); - -private: - - float lumdiff; - float cameraAngle; - float cosCameraAngle, sinCameraAngle; - unsigned char lightTexture[LIGHTSIZE][LIGHTSIZE]; - - int dFluxes; - int dParticles; - int dTrail; - int dGeometry; - float dSize; - int dComplexity; - int dRandomize; - int dExpansion; - int dRotation; - int dWind; - float dInstability; - int dBlur; - int dSmart; - int dPriority; - - flux* _fluxes; - - // Using TQTimer rather than timerEvent() to avoid getting locked out of - // the TQEvent loop on lower-end systems. Ian Geiser <[email protected]> - // says this is the way to go. - TQTimer* _timer; - int _frameTime; - - friend class flux; - friend class particle; -}; - - -#ifndef UNIT_TEST -#include <kdialogbase.h> -#include <kscreensaver.h> - - -class KFluxScreenSaver : public KScreenSaver -{ - Q_OBJECT - - -public: - - KFluxScreenSaver( WId id ); - virtual ~KFluxScreenSaver(); - - int mode() const { return _mode; } - -public slots: - - void setMode( int ); - -private: - - void readSettings(); - - FluxWidget* _flux; - int _mode; -}; - - -class TQComboBox; - -class KFluxSetup : public KDialogBase -{ - Q_OBJECT - - -public: - - KFluxSetup( TQWidget* parent = 0, const char* name = 0 ); - ~KFluxSetup(); - -private slots: - - void slotHelp(); - void slotOk(); - -private: - - TQComboBox* modeW; - KFluxScreenSaver* _saver; -}; -#endif - - -#endif //__FLUXSS_H__ diff --git a/kscreensaver/kdesavers/KBanner.desktop b/kscreensaver/kdesavers/KBanner.desktop deleted file mode 100644 index 29f6bbad..00000000 --- a/kscreensaver/kdesavers/KBanner.desktop +++ /dev/null @@ -1,243 +0,0 @@ -[Desktop Entry] -Exec=kbanner.kss -Icon=kscreensaver -Type=Application -Actions=Setup;InWindow;Root; -X-TDE-Category=Banners & Pictures -Name=Banner -Name[af]=Bannier -Name[bg]=Банер -Name[br]=Lugan -Name[ca]=Rètol -Name[cs]=Běžící text -Name[cy]=Baner -Name[de]=Lauftext -Name[el]=Τίτλος -Name[eo]=Standardo -Name[es]=Pancarta -Name[et]=Tekstiriba -Name[eu]=Titularra -Name[fa]=بنر -Name[fi]=Viesti -Name[fr]=Bannière -Name[fy]=Ljochtkrante -Name[ga]=Meirge -Name[gl]=Pancarta -Name[he]=כתובית -Name[hi]=बैनर -Name[hu]=Felirat -Name[is]=Borði -Name[it]=Testo scorrevole -Name[ja]=バナー -Name[ka]=აბრა -Name[lt]=Plakatas -Name[lv]=Banners -Name[mk]=Транспарент -Name[ms]=Kain Rentang -Name[nds]=Looptext -Name[ne]=ब्यानर -Name[nl]=Lichtkrant -Name[nn]=Fane -Name[pa]=ਬੈਨਰ -Name[pt]=Cartaz -Name[ru]=Бегущая строка -Name[sl]=Napis -Name[sr]=Застава -Name[sr@Latn]=Zastava -Name[sv]=Rubrik -Name[ta]=பேனர் -Name[tg]=Давида истодаи рах -Name[th]=แบนเนอร์ -Name[tr]=Afiş -Name[uk]=Транспарант -Name[ven]=Muvhala -Name[vi]=Biểu ngữ -Name[xh]=Isiqwentshu selaphu -Name[zh_CN]=横幅 -Name[zh_TW]=標誌 -Name[zu]=Ibhodi elinomyalezo - -[Desktop Action Setup] -Exec=kbanner.kss -setup -Name=Setup... -Name[af]=Opstelling... -Name[bg]=Настройки... -Name[br]=Kefluniadur ... -Name[bs]=Postavke... -Name[ca]=Arranjament... -Name[cs]=Nastavení... -Name[cy]=Gosod ... -Name[da]=Opsætning... -Name[de]=Einrichtung ... -Name[el]=Ρύθμιση... -Name[eo]=Agordo... -Name[es]=Configuración... -Name[et]=Seadistamine... -Name[eu]=Konfiguratu... -Name[fa]=برپایی... -Name[fi]=Asetukset... -Name[fo]=Uppseting... -Name[fr]=Configuration... -Name[fy]=Opset... -Name[ga]=Cumraigh... -Name[gl]=Configuración... -Name[he]=הגדרות... -Name[hi]=सेटअप... -Name[hu]=Beállítás... -Name[is]=Stillingar... -Name[it]=Impostazioni... -Name[ja]=設定... -Name[ka]=გამართვა... -Name[lt]=Sąranka ... -Name[lv]=Uzstādīšana... -Name[mk]=Поставување... -Name[ms]=Setkan... -Name[mt]=Konfigurazzjoni... -Name[nb]=Innstillinger … -Name[nds]=Instellen... -Name[ne]=सेटअप... -Name[nl]=Instellingen... -Name[nn]=Oppsett … -Name[nso]=Beakanya... -Name[pa]=ਸੈਟਅੱਪ... -Name[pl]=Ustawienia... -Name[pt]=Configurar... -Name[pt_BR]=Configurar... -Name[ro]=Setează... -Name[ru]=Настройка... -Name[rw]=Iboneza... -Name[sk]=Nastavenie... -Name[sl]=Nastavi ... -Name[sr]=Подеси... -Name[sr@Latn]=Podesi... -Name[sv]=Inställningar... -Name[ta]=அமைப்பு... -Name[tg]=Барпосозӣ... -Name[th]=ติดตั้ง... -Name[tr]=Kurulum... -Name[uk]=Встановити... -Name[uz]=Oʻrnatish -Name[uz@cyrillic]=Ўрнатиш -Name[ven]=Vhekanya... -Name[vi]=Thiết lập... -Name[xh]=Iyacwangciswa... -Name[zh_CN]=设置... -Name[zh_TW]=設定... -Name[zu]=Iyalungiselela... -Icon=kscreensaver - -[Desktop Action InWindow] -Exec=kbanner.kss -window-id %w -Name=Display in Specified Window -Name[bg]=Стартиране в избран прозорец -Name[br]=Diskwel er prenestr spisaet -Name[bs]=Prikaži u navedenom prozoru -Name[ca]=Mostra a la finestra especificada -Name[cs]=Zobrazit v určeném okně -Name[cy]=Dangos mewn Ffenestr Benodol -Name[da]=Visning i angivet vindue -Name[de]=In bestimmten Fenster anzeigen -Name[el]=Προβολή στο καθορισμένο παράθυρο -Name[eo]=Montri en indikita fenestro -Name[es]=Mostrar en la ventana especificada -Name[et]=Määratud aknas näitamine -Name[eu]=Bistaratu zehaztutako lehioan -Name[fa]=نمایش در پنجرۀ مشخصشده -Name[fi]=Näytä määrätyssä ikkunassa -Name[fr]=Affichage dans la fenêtre spécifiée -Name[fy]=Werjefte yn in definiearre finster -Name[ga]=Taispeáin san Fhuinneog Sonraithe -Name[gl]=Mostrar na fiestra indicada -Name[he]=הצג בחלון המצוין -Name[hi]=निर्दिष्ट विंडो में प्रदर्शित करें -Name[hu]=Megjelenítés a megadott ablakban -Name[is]=Birta í völdum glugga -Name[it]=Mostra nella finestra specificata -Name[ja]=特定のウィンドウで表示 -Name[ka]=ჩვენება მითითებულ ფანჯარაში -Name[lt]=Rodyti nurodytame lange -Name[mk]=Прикажи во наведениот прозорец -Name[ms]=Papar dalam Tetingkap Yang Dinyatakan -Name[nb]=Vis i angitt vindu -Name[nds]=In utsöcht Finster wiesen -Name[ne]=निर्दिष्ट सञ्झ्यालमा प्रदर्शन -Name[nl]=Weergeven in een opgegeven venster -Name[nn]=Vis i oppgjeve vindauge -Name[pa]=ਦੱਸੇ ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ -Name[pl]=Wyświetl w zadanym oknie -Name[pt]=Mostrar na Janela Indicada -Name[pt_BR]=Mostrar em janela especificada -Name[ro]=Afişează în fereastra specificată -Name[ru]=Показывать в указанном окне -Name[rw]=Kwerekana mu Idirishya Ryihariye -Name[sk]=Zobraziť v zadanom okne -Name[sl]=Prikaz v določenemu oknu -Name[sr]=Прикажи у наведеном прозору -Name[sr@Latn]=Prikaži u navedenom prozoru -Name[sv]=Visa i angivet fönster -Name[ta]=குறித்த சாளரத்தில் காட்டு -Name[tg]=Дар тирезаи нишондода намоиш намоед -Name[tr]=Belirtilen Pencerede Göster -Name[uk]=Відобразити у вказаному вікні -Name[vi]=Hiển thị trong Cửa sổ Đã định -Name[zh_CN]=在指定的窗口中显示 -Name[zh_TW]=在指定的視窗中顯示 -NoDisplay=true - -[Desktop Action Root] -Exec=kbanner.kss -root -Name=Display in Root Window -Name[bg]=Стартиране в главния прозорец -Name[br]=Diskwel er prenestr gwrizienn -Name[bs]=Prikaži u korijenskom prozoru -Name[ca]=Mostra a la finestra arrel -Name[cs]=Zobrazit na pozadí plochy -Name[cy]=Dangos mewn Ffenestr Wraidd -Name[da]=Visning i root-vindue -Name[de]=In Hintergrundfenster anzeigen -Name[el]=Προβολή στο βασικό παράθυρο -Name[eo]=Montri en radika fenestro -Name[es]=Mostrar en la ventana raíz -Name[et]=Juuraknas näitamine -Name[eu]=Bistaratu erro lehioan -Name[fa]=نمایش در پنجرۀ ریشه -Name[fi]=Näytä juuri-ikkunassa -Name[fr]=Affichage dans la fenêtre racine -Name[fy]=Werjefte yn haadfinster -Name[ga]=Taispeáin sa bhFréamhfhuinneog -Name[gl]=Mostrar na fiestra raiz -Name[he]=הצג בחלון השורש -Name[hi]=रूट विंडो में प्रदर्शित करें -Name[hu]=Megjelenítés a gyökérablakban -Name[is]=Birta í rótarglugganum -Name[it]=Mostra sullo sfondo -Name[ja]=ルートウィンドウで表示 -Name[ka]=ჩვენება ძირითად ფანჯარაში -Name[lt]=Rodyti root lange -Name[mk]=Прикажи во коренскиот прозорец -Name[ms]=Papar dalam Tetingkap Root -Name[nb]=Vis i root-vindu -Name[nds]=In Hööftfinster wiesen -Name[ne]=मूल सञ्झ्यालमा प्रदर्शन -Name[nl]=Weergeven in hoofdvenster -Name[nn]=Vis i rotvindauget -Name[pa]=Root ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ -Name[pl]=Wyświetl w oknie głównym -Name[pt]=Mostrar na Janela de Fundo -Name[pt_BR]=Mostrar na janela raiz -Name[ro]=Afişează în fereastra rădăcină -Name[ru]=Показывать в корневом окне -Name[rw]=Kwerekana mu Idirishya Umuzi -Name[sk]=Zobraziť v koreňovom okne -Name[sl]=Prikaz v korenskem oknu -Name[sr]=Прикажи у главном (root) прозору -Name[sr@Latn]=Prikaži u glavnom (root) prozoru -Name[sv]=Visa i rotfönstret -Name[ta]=ஆரம்ப சாளரத்தில் காட்டு -Name[tg]=Дар тирезаи решагӣ намоиш намоед -Name[tr]=Kök Pencerede Göster -Name[uk]=Відобразити в кореневому вікні -Name[vi]=Hiển thị trong Cửa sổ Gốc -Name[zh_CN]=在根窗口中显示 -Name[zh_TW]=在根視窗中顯示 -NoDisplay=true diff --git a/kscreensaver/kdesavers/KBlob.desktop b/kscreensaver/kdesavers/KBlob.desktop deleted file mode 100644 index f5127a90..00000000 --- a/kscreensaver/kdesavers/KBlob.desktop +++ /dev/null @@ -1,227 +0,0 @@ -[Desktop Entry] -Exec=kblob.kss -Icon=kscreensaver -Type=Application -Actions=Setup;InWindow;Root; -X-TDE-Category=Visit to Flatland -Name=Blob -Name[bg]=Петно -Name[br]=Pokard -Name[cs]=Kaňka -Name[cy]=Smotyn -Name[da]=Dråbe -Name[de]=Blob -Name[eo]=Gutoj -Name[et]=Piisk -Name[eu]=Tanta -Name[fi]=Kuplat -Name[he]=כתמים -Name[hi]=ब्लॉब -Name[ja]=斑点 -Name[ka]=წვეთები -Name[lt]=Rutuliukas -Name[mk]=Дамка -Name[nb]=Fargeflekk -Name[ne]=ब्लब -Name[nn]=Klattar -Name[pl]=Bąbel -Name[ro]=Bule -Name[ru]=Геометрические построения -Name[sl]=Kepica -Name[sr]=Блоб -Name[sv]=Färgfläck -Name[ta]=தொழிற்பொருள் -Name[tg]=Асос гузории геометрӣ -Name[th]=รอยเปื้อน -Name[tr]=Damlacık -Name[uk]=Геометричні візерунки -Name[ven]=Tshileme -Name[vi]=Giọt nước -Name[xh]=Ichaphaza elincinane -Name[zh_CN]=光线 -Name[zh_TW]=斑點 - -[Desktop Action Setup] -Exec=kblob.kss -setup -Name=Setup... -Name[af]=Opstelling... -Name[bg]=Настройки... -Name[br]=Kefluniadur ... -Name[bs]=Postavke... -Name[ca]=Arranjament... -Name[cs]=Nastavení... -Name[cy]=Gosod ... -Name[da]=Opsætning... -Name[de]=Einrichtung ... -Name[el]=Ρύθμιση... -Name[eo]=Agordo... -Name[es]=Configuración... -Name[et]=Seadistamine... -Name[eu]=Konfiguratu... -Name[fa]=برپایی... -Name[fi]=Asetukset... -Name[fo]=Uppseting... -Name[fr]=Configuration... -Name[fy]=Opset... -Name[ga]=Cumraigh... -Name[gl]=Configuración... -Name[he]=הגדרות... -Name[hi]=सेटअप... -Name[hu]=Beállítás... -Name[is]=Stillingar... -Name[it]=Impostazioni... -Name[ja]=設定... -Name[ka]=გამართვა... -Name[lt]=Sąranka ... -Name[lv]=Uzstādīšana... -Name[mk]=Поставување... -Name[ms]=Setkan... -Name[mt]=Konfigurazzjoni... -Name[nb]=Innstillinger … -Name[nds]=Instellen... -Name[ne]=सेटअप... -Name[nl]=Instellingen... -Name[nn]=Oppsett … -Name[nso]=Beakanya... -Name[pa]=ਸੈਟਅੱਪ... -Name[pl]=Ustawienia... -Name[pt]=Configurar... -Name[pt_BR]=Configurar... -Name[ro]=Setează... -Name[ru]=Настройка... -Name[rw]=Iboneza... -Name[sk]=Nastavenie... -Name[sl]=Nastavi ... -Name[sr]=Подеси... -Name[sr@Latn]=Podesi... -Name[sv]=Inställningar... -Name[ta]=அமைப்பு... -Name[tg]=Барпосозӣ... -Name[th]=ติดตั้ง... -Name[tr]=Kurulum... -Name[uk]=Встановити... -Name[uz]=Oʻrnatish -Name[uz@cyrillic]=Ўрнатиш -Name[ven]=Vhekanya... -Name[vi]=Thiết lập... -Name[xh]=Iyacwangciswa... -Name[zh_CN]=设置... -Name[zh_TW]=設定... -Name[zu]=Iyalungiselela... -Icon=kscreensaver - -[Desktop Action InWindow] -Exec=kblob.kss -window-id %w -Name=Display in Specified Window -Name[bg]=Стартиране в избран прозорец -Name[br]=Diskwel er prenestr spisaet -Name[bs]=Prikaži u navedenom prozoru -Name[ca]=Mostra a la finestra especificada -Name[cs]=Zobrazit v určeném okně -Name[cy]=Dangos mewn Ffenestr Benodol -Name[da]=Visning i angivet vindue -Name[de]=In bestimmten Fenster anzeigen -Name[el]=Προβολή στο καθορισμένο παράθυρο -Name[eo]=Montri en indikita fenestro -Name[es]=Mostrar en la ventana especificada -Name[et]=Määratud aknas näitamine -Name[eu]=Bistaratu zehaztutako lehioan -Name[fa]=نمایش در پنجرۀ مشخصشده -Name[fi]=Näytä määrätyssä ikkunassa -Name[fr]=Affichage dans la fenêtre spécifiée -Name[fy]=Werjefte yn in definiearre finster -Name[ga]=Taispeáin san Fhuinneog Sonraithe -Name[gl]=Mostrar na fiestra indicada -Name[he]=הצג בחלון המצוין -Name[hi]=निर्दिष्ट विंडो में प्रदर्शित करें -Name[hu]=Megjelenítés a megadott ablakban -Name[is]=Birta í völdum glugga -Name[it]=Mostra nella finestra specificata -Name[ja]=特定のウィンドウで表示 -Name[ka]=ჩვენება მითითებულ ფანჯარაში -Name[lt]=Rodyti nurodytame lange -Name[mk]=Прикажи во наведениот прозорец -Name[ms]=Papar dalam Tetingkap Yang Dinyatakan -Name[nb]=Vis i angitt vindu -Name[nds]=In utsöcht Finster wiesen -Name[ne]=निर्दिष्ट सञ्झ्यालमा प्रदर्शन -Name[nl]=Weergeven in een opgegeven venster -Name[nn]=Vis i oppgjeve vindauge -Name[pa]=ਦੱਸੇ ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ -Name[pl]=Wyświetl w zadanym oknie -Name[pt]=Mostrar na Janela Indicada -Name[pt_BR]=Mostrar em janela especificada -Name[ro]=Afişează în fereastra specificată -Name[ru]=Показывать в указанном окне -Name[rw]=Kwerekana mu Idirishya Ryihariye -Name[sk]=Zobraziť v zadanom okne -Name[sl]=Prikaz v določenemu oknu -Name[sr]=Прикажи у наведеном прозору -Name[sr@Latn]=Prikaži u navedenom prozoru -Name[sv]=Visa i angivet fönster -Name[ta]=குறித்த சாளரத்தில் காட்டு -Name[tg]=Дар тирезаи нишондода намоиш намоед -Name[tr]=Belirtilen Pencerede Göster -Name[uk]=Відобразити у вказаному вікні -Name[vi]=Hiển thị trong Cửa sổ Đã định -Name[zh_CN]=在指定的窗口中显示 -Name[zh_TW]=在指定的視窗中顯示 -NoDisplay=true - -[Desktop Action Root] -Exec=kblob.kss -root -Name=Display in Root Window -Name[bg]=Стартиране в главния прозорец -Name[br]=Diskwel er prenestr gwrizienn -Name[bs]=Prikaži u korijenskom prozoru -Name[ca]=Mostra a la finestra arrel -Name[cs]=Zobrazit na pozadí plochy -Name[cy]=Dangos mewn Ffenestr Wraidd -Name[da]=Visning i root-vindue -Name[de]=In Hintergrundfenster anzeigen -Name[el]=Προβολή στο βασικό παράθυρο -Name[eo]=Montri en radika fenestro -Name[es]=Mostrar en la ventana raíz -Name[et]=Juuraknas näitamine -Name[eu]=Bistaratu erro lehioan -Name[fa]=نمایش در پنجرۀ ریشه -Name[fi]=Näytä juuri-ikkunassa -Name[fr]=Affichage dans la fenêtre racine -Name[fy]=Werjefte yn haadfinster -Name[ga]=Taispeáin sa bhFréamhfhuinneog -Name[gl]=Mostrar na fiestra raiz -Name[he]=הצג בחלון השורש -Name[hi]=रूट विंडो में प्रदर्शित करें -Name[hu]=Megjelenítés a gyökérablakban -Name[is]=Birta í rótarglugganum -Name[it]=Mostra sullo sfondo -Name[ja]=ルートウィンドウで表示 -Name[ka]=ჩვენება ძირითად ფანჯარაში -Name[lt]=Rodyti root lange -Name[mk]=Прикажи во коренскиот прозорец -Name[ms]=Papar dalam Tetingkap Root -Name[nb]=Vis i root-vindu -Name[nds]=In Hööftfinster wiesen -Name[ne]=मूल सञ्झ्यालमा प्रदर्शन -Name[nl]=Weergeven in hoofdvenster -Name[nn]=Vis i rotvindauget -Name[pa]=Root ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ -Name[pl]=Wyświetl w oknie głównym -Name[pt]=Mostrar na Janela de Fundo -Name[pt_BR]=Mostrar na janela raiz -Name[ro]=Afişează în fereastra rădăcină -Name[ru]=Показывать в корневом окне -Name[rw]=Kwerekana mu Idirishya Umuzi -Name[sk]=Zobraziť v koreňovom okne -Name[sl]=Prikaz v korenskem oknu -Name[sr]=Прикажи у главном (root) прозору -Name[sr@Latn]=Prikaži u glavnom (root) prozoru -Name[sv]=Visa i rotfönstret -Name[ta]=ஆரம்ப சாளரத்தில் காட்டு -Name[tg]=Дар тирезаи решагӣ намоиш намоед -Name[tr]=Kök Pencerede Göster -Name[uk]=Відобразити в кореневому вікні -Name[vi]=Hiển thị trong Cửa sổ Gốc -Name[zh_CN]=在根窗口中显示 -Name[zh_TW]=在根視窗中顯示 -NoDisplay=true diff --git a/kscreensaver/kdesavers/KClock.desktop b/kscreensaver/kdesavers/KClock.desktop deleted file mode 100644 index b6c35887..00000000 --- a/kscreensaver/kdesavers/KClock.desktop +++ /dev/null @@ -1,252 +0,0 @@ -[Desktop Entry] -Exec=kclock.kss -Icon=kscreensaver -Type=Application -Actions=Setup;InWindow;Root; -X-TDE-Category=Miscellaneous -Name=Clock -Name[bg]=Часовник -Name[br]=Eurier -Name[bs]=Sat -Name[ca]=Rellotge -Name[cs]=Hodiny -Name[cy]=Cloc -Name[da]=Ur -Name[de]=Uhr -Name[el]=Ρολόι -Name[eo]=Horloĝo -Name[es]=Reloj -Name[et]=Kell -Name[eu]=Erlojua -Name[fa]=ساعت -Name[fi]=Kello -Name[fr]=Horloge -Name[fy]=Klok -Name[ga]=Clog -Name[gl]=Reloxio -Name[he]=שעון -Name[hi]=घड़ी -Name[hu]=Óra -Name[is]=Klukka -Name[it]=Orologio -Name[ja]=時計 -Name[ka]=საათი -Name[lt]=Laikrodis -Name[lv]=Pulkstenis -Name[mk]=Часовник -Name[ms]=Jam -Name[nb]=Klokke -Name[nds]=Klock -Name[ne]=घडी -Name[nl]=Klok -Name[nn]=Klokke -Name[pa]=ਘੜੀ -Name[pl]=Zegar -Name[pt]=Relógio -Name[pt_BR]=Relógio -Name[ro]=Ceas -Name[ru]=Часы -Name[rw]=Isaha -Name[sk]=Hodiny -Name[sl]=Ura -Name[sr]=Часовник -Name[sr@Latn]=Časovnik -Name[sv]=Klocka -Name[ta]=கடிகாரம் -Name[tg]=Соат -Name[th]=นาฬิกา -Name[tr]=Saat -Name[uk]=Годинник -Name[uz]=Soat -Name[uz@cyrillic]=Соат -Name[ven]=Tshifhinga -Name[vi]=Đồng hồ -Name[xh]=Ikloko -Name[zh_CN]=时钟 -Name[zh_TW]=時鐘 -Name[zu]=Iwashi - -[Desktop Action Setup] -Exec=kclock.kss -setup -Name=Setup... -Name[af]=Opstelling... -Name[bg]=Настройки... -Name[br]=Kefluniadur ... -Name[bs]=Postavke... -Name[ca]=Arranjament... -Name[cs]=Nastavení... -Name[cy]=Gosod ... -Name[da]=Opsætning... -Name[de]=Einrichtung ... -Name[el]=Ρύθμιση... -Name[eo]=Agordo... -Name[es]=Configuración... -Name[et]=Seadistamine... -Name[eu]=Konfiguratu... -Name[fa]=برپایی... -Name[fi]=Asetukset... -Name[fo]=Uppseting... -Name[fr]=Configuration... -Name[fy]=Opset... -Name[ga]=Cumraigh... -Name[gl]=Configuración... -Name[he]=הגדרות... -Name[hi]=सेटअप... -Name[hu]=Beállítás... -Name[is]=Stillingar... -Name[it]=Impostazioni... -Name[ja]=設定... -Name[ka]=გამართვა... -Name[lt]=Sąranka ... -Name[lv]=Uzstādīšana... -Name[mk]=Поставување... -Name[ms]=Setkan... -Name[mt]=Konfigurazzjoni... -Name[nb]=Innstillinger … -Name[nds]=Instellen... -Name[ne]=सेटअप... -Name[nl]=Instellingen... -Name[nn]=Oppsett … -Name[nso]=Beakanya... -Name[pa]=ਸੈਟਅੱਪ... -Name[pl]=Ustawienia... -Name[pt]=Configurar... -Name[pt_BR]=Configurar... -Name[ro]=Setează... -Name[ru]=Настройка... -Name[rw]=Iboneza... -Name[sk]=Nastavenie... -Name[sl]=Nastavi ... -Name[sr]=Подеси... -Name[sr@Latn]=Podesi... -Name[sv]=Inställningar... -Name[ta]=அமைப்பு... -Name[tg]=Барпосозӣ... -Name[th]=ติดตั้ง... -Name[tr]=Kurulum... -Name[uk]=Встановити... -Name[uz]=Oʻrnatish -Name[uz@cyrillic]=Ўрнатиш -Name[ven]=Vhekanya... -Name[vi]=Thiết lập... -Name[xh]=Iyacwangciswa... -Name[zh_CN]=设置... -Name[zh_TW]=設定... -Name[zu]=Iyalungiselela... -Icon=kscreensaver - -[Desktop Action InWindow] -Exec=kclock.kss -window-id %w -Name=Display in Specified Window -Name[bg]=Стартиране в избран прозорец -Name[br]=Diskwel er prenestr spisaet -Name[bs]=Prikaži u navedenom prozoru -Name[ca]=Mostra a la finestra especificada -Name[cs]=Zobrazit v určeném okně -Name[cy]=Dangos mewn Ffenestr Benodol -Name[da]=Visning i angivet vindue -Name[de]=In bestimmten Fenster anzeigen -Name[el]=Προβολή στο καθορισμένο παράθυρο -Name[eo]=Montri en indikita fenestro -Name[es]=Mostrar en la ventana especificada -Name[et]=Määratud aknas näitamine -Name[eu]=Bistaratu zehaztutako lehioan -Name[fa]=نمایش در پنجرۀ مشخصشده -Name[fi]=Näytä määrätyssä ikkunassa -Name[fr]=Affichage dans la fenêtre spécifiée -Name[fy]=Werjefte yn in definiearre finster -Name[ga]=Taispeáin san Fhuinneog Sonraithe -Name[gl]=Mostrar na fiestra indicada -Name[he]=הצג בחלון המצוין -Name[hi]=निर्दिष्ट विंडो में प्रदर्शित करें -Name[hu]=Megjelenítés a megadott ablakban -Name[is]=Birta í völdum glugga -Name[it]=Mostra nella finestra specificata -Name[ja]=特定のウィンドウで表示 -Name[ka]=ჩვენება მითითებულ ფანჯარაში -Name[lt]=Rodyti nurodytame lange -Name[mk]=Прикажи во наведениот прозорец -Name[ms]=Papar dalam Tetingkap Yang Dinyatakan -Name[nb]=Vis i angitt vindu -Name[nds]=In utsöcht Finster wiesen -Name[ne]=निर्दिष्ट सञ्झ्यालमा प्रदर्शन -Name[nl]=Weergeven in een opgegeven venster -Name[nn]=Vis i oppgjeve vindauge -Name[pa]=ਦੱਸੇ ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ -Name[pl]=Wyświetl w zadanym oknie -Name[pt]=Mostrar na Janela Indicada -Name[pt_BR]=Mostrar em janela especificada -Name[ro]=Afişează în fereastra specificată -Name[ru]=Показывать в указанном окне -Name[rw]=Kwerekana mu Idirishya Ryihariye -Name[sk]=Zobraziť v zadanom okne -Name[sl]=Prikaz v določenemu oknu -Name[sr]=Прикажи у наведеном прозору -Name[sr@Latn]=Prikaži u navedenom prozoru -Name[sv]=Visa i angivet fönster -Name[ta]=குறித்த சாளரத்தில் காட்டு -Name[tg]=Дар тирезаи нишондода намоиш намоед -Name[tr]=Belirtilen Pencerede Göster -Name[uk]=Відобразити у вказаному вікні -Name[vi]=Hiển thị trong Cửa sổ Đã định -Name[zh_CN]=在指定的窗口中显示 -Name[zh_TW]=在指定的視窗中顯示 -NoDisplay=true - -[Desktop Action Root] -Exec=kclock.kss -root -Name=Display in Root Window -Name[bg]=Стартиране в главния прозорец -Name[br]=Diskwel er prenestr gwrizienn -Name[bs]=Prikaži u korijenskom prozoru -Name[ca]=Mostra a la finestra arrel -Name[cs]=Zobrazit na pozadí plochy -Name[cy]=Dangos mewn Ffenestr Wraidd -Name[da]=Visning i root-vindue -Name[de]=In Hintergrundfenster anzeigen -Name[el]=Προβολή στο βασικό παράθυρο -Name[eo]=Montri en radika fenestro -Name[es]=Mostrar en la ventana raíz -Name[et]=Juuraknas näitamine -Name[eu]=Bistaratu erro lehioan -Name[fa]=نمایش در پنجرۀ ریشه -Name[fi]=Näytä juuri-ikkunassa -Name[fr]=Affichage dans la fenêtre racine -Name[fy]=Werjefte yn haadfinster -Name[ga]=Taispeáin sa bhFréamhfhuinneog -Name[gl]=Mostrar na fiestra raiz -Name[he]=הצג בחלון השורש -Name[hi]=रूट विंडो में प्रदर्शित करें -Name[hu]=Megjelenítés a gyökérablakban -Name[is]=Birta í rótarglugganum -Name[it]=Mostra sullo sfondo -Name[ja]=ルートウィンドウで表示 -Name[ka]=ჩვენება ძირითად ფანჯარაში -Name[lt]=Rodyti root lange -Name[mk]=Прикажи во коренскиот прозорец -Name[ms]=Papar dalam Tetingkap Root -Name[nb]=Vis i root-vindu -Name[nds]=In Hööftfinster wiesen -Name[ne]=मूल सञ्झ्यालमा प्रदर्शन -Name[nl]=Weergeven in hoofdvenster -Name[nn]=Vis i rotvindauget -Name[pa]=Root ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ -Name[pl]=Wyświetl w oknie głównym -Name[pt]=Mostrar na Janela de Fundo -Name[pt_BR]=Mostrar na janela raiz -Name[ro]=Afişează în fereastra rădăcină -Name[ru]=Показывать в корневом окне -Name[rw]=Kwerekana mu Idirishya Umuzi -Name[sk]=Zobraziť v koreňovom okne -Name[sl]=Prikaz v korenskem oknu -Name[sr]=Прикажи у главном (root) прозору -Name[sr@Latn]=Prikaži u glavnom (root) prozoru -Name[sv]=Visa i rotfönstret -Name[ta]=ஆரம்ப சாளரத்தில் காட்டு -Name[tg]=Дар тирезаи решагӣ намоиш намоед -Name[tr]=Kök Pencerede Göster -Name[uk]=Відобразити в кореневому вікні -Name[vi]=Hiển thị trong Cửa sổ Gốc -Name[zh_CN]=在根窗口中显示 -Name[zh_TW]=在根視窗中顯示 -NoDisplay=true diff --git a/kscreensaver/kdesavers/KEuphoria.desktop b/kscreensaver/kdesavers/KEuphoria.desktop deleted file mode 100644 index e01fac37..00000000 --- a/kscreensaver/kdesavers/KEuphoria.desktop +++ /dev/null @@ -1,233 +0,0 @@ -[Desktop Entry] -Exec=keuphoria.kss -Icon=kscreensaver -Type=Application -Actions=Setup;InWindow;Root; -X-TDE-Category=OpenGL Screen Savers -X-TDE-Type=OpenGL -Name=Euphoria (GL) -Name[bg]=Еуфория -Name[ca]=Eufòria (GL) -Name[cy]=Iwfforia (GL) -Name[da]=Eufori (GL) -Name[de]=Euphorie -Name[el]=Ευφορία (GL) -Name[es]=Euforia (GL) -Name[et]=Eufooria (GL) -Name[eu]=Euforia (GL) -Name[fa]=شادی (GL) -Name[fr]=Euphorie (GL) -Name[he]=אופוריה (GL) -Name[hi]=परम आनंद (जीएल) -Name[hu]=Euphoria (OpenGL) -Name[it]=Euforia (GL) -Name[ja]=幸福 (GL) -Name[ka]=ეიფორია (GL) -Name[mk]=Еуфорија (GL) -Name[mt]=Ewforija (GL) -Name[nb]=Eufori (GL) -Name[nds]=Euphorie (GL) -Name[ne]=यूफोरिया (GL) -Name[nn]=Rom (GL) -Name[pl]=Euforia (GL) -Name[pt]=Euforia (GL) -Name[pt_BR]=Euforia (GL) -Name[ro]=Euforia (GL) -Name[ru]=Эйфория (GL) -Name[sl]=Evforija (GL) -Name[sr]=Еуфорија (GL) -Name[sr@Latn]=Euforija (GL) -Name[sv]=Eufori (GL) -Name[ta]=மகிழ்ச்சி(GL) -Name[tg]=Кайфчоқӣ (GL) -Name[th]=ยูโฟเรีย (GL) -Name[uk]=Ейфорія (GL) -Name[uz]=Eyforiya (GL) -Name[uz@cyrillic]=Эйфория (GL) -Name[vi]=Trạng thái phởn phơ (GL) -Name[zh_CN]=陶醉(GL) - -[Desktop Action Setup] -Exec=keuphoria.kss -setup -Name=Setup... -Name[af]=Opstelling... -Name[bg]=Настройки... -Name[br]=Kefluniadur ... -Name[bs]=Postavke... -Name[ca]=Arranjament... -Name[cs]=Nastavení... -Name[cy]=Gosod ... -Name[da]=Opsætning... -Name[de]=Einrichtung ... -Name[el]=Ρύθμιση... -Name[eo]=Agordo... -Name[es]=Configuración... -Name[et]=Seadistamine... -Name[eu]=Konfiguratu... -Name[fa]=برپایی... -Name[fi]=Asetukset... -Name[fo]=Uppseting... -Name[fr]=Configuration... -Name[fy]=Opset... -Name[ga]=Cumraigh... -Name[gl]=Configuración... -Name[he]=הגדרות... -Name[hi]=सेटअप... -Name[hu]=Beállítás... -Name[is]=Stillingar... -Name[it]=Impostazioni... -Name[ja]=設定... -Name[ka]=გამართვა... -Name[lt]=Sąranka ... -Name[lv]=Uzstādīšana... -Name[mk]=Поставување... -Name[ms]=Setkan... -Name[mt]=Konfigurazzjoni... -Name[nb]=Innstillinger … -Name[nds]=Instellen... -Name[ne]=सेटअप... -Name[nl]=Instellingen... -Name[nn]=Oppsett … -Name[nso]=Beakanya... -Name[pa]=ਸੈਟਅੱਪ... -Name[pl]=Ustawienia... -Name[pt]=Configurar... -Name[pt_BR]=Configurar... -Name[ro]=Setează... -Name[ru]=Настройка... -Name[rw]=Iboneza... -Name[sk]=Nastavenie... -Name[sl]=Nastavi ... -Name[sr]=Подеси... -Name[sr@Latn]=Podesi... -Name[sv]=Inställningar... -Name[ta]=அமைப்பு... -Name[tg]=Барпосозӣ... -Name[th]=ติดตั้ง... -Name[tr]=Kurulum... -Name[uk]=Встановити... -Name[uz]=Oʻrnatish -Name[uz@cyrillic]=Ўрнатиш -Name[ven]=Vhekanya... -Name[vi]=Thiết lập... -Name[xh]=Iyacwangciswa... -Name[zh_CN]=设置... -Name[zh_TW]=設定... -Name[zu]=Iyalungiselela... -Icon=kscreensaver - -[Desktop Action InWindow] -Exec=keuphoria.kss -window-id %w -Name=Display in Specified Window -Name[bg]=Стартиране в избран прозорец -Name[br]=Diskwel er prenestr spisaet -Name[bs]=Prikaži u navedenom prozoru -Name[ca]=Mostra a la finestra especificada -Name[cs]=Zobrazit v určeném okně -Name[cy]=Dangos mewn Ffenestr Benodol -Name[da]=Visning i angivet vindue -Name[de]=In bestimmten Fenster anzeigen -Name[el]=Προβολή στο καθορισμένο παράθυρο -Name[eo]=Montri en indikita fenestro -Name[es]=Mostrar en la ventana especificada -Name[et]=Määratud aknas näitamine -Name[eu]=Bistaratu zehaztutako lehioan -Name[fa]=نمایش در پنجرۀ مشخصشده -Name[fi]=Näytä määrätyssä ikkunassa -Name[fr]=Affichage dans la fenêtre spécifiée -Name[fy]=Werjefte yn in definiearre finster -Name[ga]=Taispeáin san Fhuinneog Sonraithe -Name[gl]=Mostrar na fiestra indicada -Name[he]=הצג בחלון המצוין -Name[hi]=निर्दिष्ट विंडो में प्रदर्शित करें -Name[hu]=Megjelenítés a megadott ablakban -Name[is]=Birta í völdum glugga -Name[it]=Mostra nella finestra specificata -Name[ja]=特定のウィンドウで表示 -Name[ka]=ჩვენება მითითებულ ფანჯარაში -Name[lt]=Rodyti nurodytame lange -Name[mk]=Прикажи во наведениот прозорец -Name[ms]=Papar dalam Tetingkap Yang Dinyatakan -Name[nb]=Vis i angitt vindu -Name[nds]=In utsöcht Finster wiesen -Name[ne]=निर्दिष्ट सञ्झ्यालमा प्रदर्शन -Name[nl]=Weergeven in een opgegeven venster -Name[nn]=Vis i oppgjeve vindauge -Name[pa]=ਦੱਸੇ ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ -Name[pl]=Wyświetl w zadanym oknie -Name[pt]=Mostrar na Janela Indicada -Name[pt_BR]=Mostrar em janela especificada -Name[ro]=Afişează în fereastra specificată -Name[ru]=Показывать в указанном окне -Name[rw]=Kwerekana mu Idirishya Ryihariye -Name[sk]=Zobraziť v zadanom okne -Name[sl]=Prikaz v določenemu oknu -Name[sr]=Прикажи у наведеном прозору -Name[sr@Latn]=Prikaži u navedenom prozoru -Name[sv]=Visa i angivet fönster -Name[ta]=குறித்த சாளரத்தில் காட்டு -Name[tg]=Дар тирезаи нишондода намоиш намоед -Name[tr]=Belirtilen Pencerede Göster -Name[uk]=Відобразити у вказаному вікні -Name[vi]=Hiển thị trong Cửa sổ Đã định -Name[zh_CN]=在指定的窗口中显示 -Name[zh_TW]=在指定的視窗中顯示 -NoDisplay=true - -[Desktop Action Root] -Exec=keuphoria.kss -root -Name=Display in Root Window -Name[bg]=Стартиране в главния прозорец -Name[br]=Diskwel er prenestr gwrizienn -Name[bs]=Prikaži u korijenskom prozoru -Name[ca]=Mostra a la finestra arrel -Name[cs]=Zobrazit na pozadí plochy -Name[cy]=Dangos mewn Ffenestr Wraidd -Name[da]=Visning i root-vindue -Name[de]=In Hintergrundfenster anzeigen -Name[el]=Προβολή στο βασικό παράθυρο -Name[eo]=Montri en radika fenestro -Name[es]=Mostrar en la ventana raíz -Name[et]=Juuraknas näitamine -Name[eu]=Bistaratu erro lehioan -Name[fa]=نمایش در پنجرۀ ریشه -Name[fi]=Näytä juuri-ikkunassa -Name[fr]=Affichage dans la fenêtre racine -Name[fy]=Werjefte yn haadfinster -Name[ga]=Taispeáin sa bhFréamhfhuinneog -Name[gl]=Mostrar na fiestra raiz -Name[he]=הצג בחלון השורש -Name[hi]=रूट विंडो में प्रदर्शित करें -Name[hu]=Megjelenítés a gyökérablakban -Name[is]=Birta í rótarglugganum -Name[it]=Mostra sullo sfondo -Name[ja]=ルートウィンドウで表示 -Name[ka]=ჩვენება ძირითად ფანჯარაში -Name[lt]=Rodyti root lange -Name[mk]=Прикажи во коренскиот прозорец -Name[ms]=Papar dalam Tetingkap Root -Name[nb]=Vis i root-vindu -Name[nds]=In Hööftfinster wiesen -Name[ne]=मूल सञ्झ्यालमा प्रदर्शन -Name[nl]=Weergeven in hoofdvenster -Name[nn]=Vis i rotvindauget -Name[pa]=Root ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ -Name[pl]=Wyświetl w oknie głównym -Name[pt]=Mostrar na Janela de Fundo -Name[pt_BR]=Mostrar na janela raiz -Name[ro]=Afişează în fereastra rădăcină -Name[ru]=Показывать в корневом окне -Name[rw]=Kwerekana mu Idirishya Umuzi -Name[sk]=Zobraziť v koreňovom okne -Name[sl]=Prikaz v korenskem oknu -Name[sr]=Прикажи у главном (root) прозору -Name[sr@Latn]=Prikaži u glavnom (root) prozoru -Name[sv]=Visa i rotfönstret -Name[ta]=ஆரம்ப சாளரத்தில் காட்டு -Name[tg]=Дар тирезаи решагӣ намоиш намоед -Name[tr]=Kök Pencerede Göster -Name[uk]=Відобразити в кореневому вікні -Name[vi]=Hiển thị trong Cửa sổ Gốc -Name[zh_CN]=在根窗口中显示 -Name[zh_TW]=在根視窗中顯示 -NoDisplay=true diff --git a/kscreensaver/kdesavers/KFiresaver.desktop b/kscreensaver/kdesavers/KFiresaver.desktop deleted file mode 100644 index 783b195b..00000000 --- a/kscreensaver/kdesavers/KFiresaver.desktop +++ /dev/null @@ -1,233 +0,0 @@ -[Desktop Entry] -Exec=kfiresaver.kss -Icon=kscreensaver -Type=Application -Actions=Setup;InWindow;Root; -X-TDE-Category=OpenGL Screen Savers -X-TDE-Type=OpenGL -Name=Fireworks 3D (GL) -Name[bg]=Фойерверки -Name[ca]=Focs d'artifici 3D (GL) -Name[cs]=Ohňostroj (GL) -Name[de]=Feuerwerk -Name[el]=Βεγγαλικά (GL) -Name[es]=Fuegos artificiales 3D (GL) -Name[et]=Tulevärk 3D (GL) -Name[eu]=Su artifizialak 3D (GL) -Name[fa]=آتشبازیهای سه بعدی (GL) -Name[fi]=Ilotulitus 3D (GL) -Name[fr]=Feux d'artifices 3D (GL) -Name[fy]=Fjoerwurk 3D (GL) -Name[ga]=Fireworks 3T (GL) -Name[gl]=Fogos de artifício 3D (GL) -Name[he]=זיקוקי דינור (GL) -Name[hi]=आतिशबाज़ी 3डी (जीएल) -Name[hu]=Tűzijáték 3D (OpenGL) -Name[is]=Flugeldar 3D (GL) -Name[it]=Fuochi d'artificio 3D (GL) -Name[ja]=花火 3D (GL) -Name[ka]=ფეიერვერკი (GL) -Name[mk]=Огномет 3Д (GL) -Name[nb]=Fyrverkeri 3D (GL) -Name[nds]=Füerwark (GL) -Name[ne]=त्रि-आयामिक फाएरवर्क्स (GL) -Name[nn]=Fyrverkeri 3D (GL) -Name[pl]=Sztuczne ognie 3D (GL) -Name[pt]=Fogo de Artifício 3D (GL) -Name[ro]=Focuri de artificii 3D (GL) -Name[ru]=Фейерверк (GL) -Name[sl]=Ognjemet 3D (GL) -Name[sr]=Ватромети 3Д (GL) -Name[sr@Latn]=Vatrometi 3D (GL) -Name[sv]=Fyrverkeri 3D (GL) -Name[tg]=Оташи тарф (GL) -Name[tr]=3B Havai Fişekler (GL) -Name[uk]=Феєрверк 3D (GL) -Name[vi]=Pháo hoa 3 chiều (GL) -Name[zh_CN]=三维烟花(GL) -Name[zh_TW]=3D 煙火秀 (GL) - -[Desktop Action Setup] -Exec=kfiresaver.kss -setup -Name=Setup... -Name[af]=Opstelling... -Name[bg]=Настройки... -Name[br]=Kefluniadur ... -Name[bs]=Postavke... -Name[ca]=Arranjament... -Name[cs]=Nastavení... -Name[cy]=Gosod ... -Name[da]=Opsætning... -Name[de]=Einrichtung ... -Name[el]=Ρύθμιση... -Name[eo]=Agordo... -Name[es]=Configuración... -Name[et]=Seadistamine... -Name[eu]=Konfiguratu... -Name[fa]=برپایی... -Name[fi]=Asetukset... -Name[fo]=Uppseting... -Name[fr]=Configuration... -Name[fy]=Opset... -Name[ga]=Cumraigh... -Name[gl]=Configuración... -Name[he]=הגדרות... -Name[hi]=सेटअप... -Name[hu]=Beállítás... -Name[is]=Stillingar... -Name[it]=Impostazioni... -Name[ja]=設定... -Name[ka]=გამართვა... -Name[lt]=Sąranka ... -Name[lv]=Uzstādīšana... -Name[mk]=Поставување... -Name[ms]=Setkan... -Name[mt]=Konfigurazzjoni... -Name[nb]=Innstillinger … -Name[nds]=Instellen... -Name[ne]=सेटअप... -Name[nl]=Instellingen... -Name[nn]=Oppsett … -Name[nso]=Beakanya... -Name[pa]=ਸੈਟਅੱਪ... -Name[pl]=Ustawienia... -Name[pt]=Configurar... -Name[pt_BR]=Configurar... -Name[ro]=Setează... -Name[ru]=Настройка... -Name[rw]=Iboneza... -Name[sk]=Nastavenie... -Name[sl]=Nastavi ... -Name[sr]=Подеси... -Name[sr@Latn]=Podesi... -Name[sv]=Inställningar... -Name[ta]=அமைப்பு... -Name[tg]=Барпосозӣ... -Name[th]=ติดตั้ง... -Name[tr]=Kurulum... -Name[uk]=Встановити... -Name[uz]=Oʻrnatish -Name[uz@cyrillic]=Ўрнатиш -Name[ven]=Vhekanya... -Name[vi]=Thiết lập... -Name[xh]=Iyacwangciswa... -Name[zh_CN]=设置... -Name[zh_TW]=設定... -Name[zu]=Iyalungiselela... -Icon=kscreensaver - -[Desktop Action InWindow] -Exec=kfiresaver.kss -window-id %w -Name=Display in Specified Window -Name[bg]=Стартиране в избран прозорец -Name[br]=Diskwel er prenestr spisaet -Name[bs]=Prikaži u navedenom prozoru -Name[ca]=Mostra a la finestra especificada -Name[cs]=Zobrazit v určeném okně -Name[cy]=Dangos mewn Ffenestr Benodol -Name[da]=Visning i angivet vindue -Name[de]=In bestimmten Fenster anzeigen -Name[el]=Προβολή στο καθορισμένο παράθυρο -Name[eo]=Montri en indikita fenestro -Name[es]=Mostrar en la ventana especificada -Name[et]=Määratud aknas näitamine -Name[eu]=Bistaratu zehaztutako lehioan -Name[fa]=نمایش در پنجرۀ مشخصشده -Name[fi]=Näytä määrätyssä ikkunassa -Name[fr]=Affichage dans la fenêtre spécifiée -Name[fy]=Werjefte yn in definiearre finster -Name[ga]=Taispeáin san Fhuinneog Sonraithe -Name[gl]=Mostrar na fiestra indicada -Name[he]=הצג בחלון המצוין -Name[hi]=निर्दिष्ट विंडो में प्रदर्शित करें -Name[hu]=Megjelenítés a megadott ablakban -Name[is]=Birta í völdum glugga -Name[it]=Mostra nella finestra specificata -Name[ja]=特定のウィンドウで表示 -Name[ka]=ჩვენება მითითებულ ფანჯარაში -Name[lt]=Rodyti nurodytame lange -Name[mk]=Прикажи во наведениот прозорец -Name[ms]=Papar dalam Tetingkap Yang Dinyatakan -Name[nb]=Vis i angitt vindu -Name[nds]=In utsöcht Finster wiesen -Name[ne]=निर्दिष्ट सञ्झ्यालमा प्रदर्शन -Name[nl]=Weergeven in een opgegeven venster -Name[nn]=Vis i oppgjeve vindauge -Name[pa]=ਦੱਸੇ ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ -Name[pl]=Wyświetl w zadanym oknie -Name[pt]=Mostrar na Janela Indicada -Name[pt_BR]=Mostrar em janela especificada -Name[ro]=Afişează în fereastra specificată -Name[ru]=Показывать в указанном окне -Name[rw]=Kwerekana mu Idirishya Ryihariye -Name[sk]=Zobraziť v zadanom okne -Name[sl]=Prikaz v določenemu oknu -Name[sr]=Прикажи у наведеном прозору -Name[sr@Latn]=Prikaži u navedenom prozoru -Name[sv]=Visa i angivet fönster -Name[ta]=குறித்த சாளரத்தில் காட்டு -Name[tg]=Дар тирезаи нишондода намоиш намоед -Name[tr]=Belirtilen Pencerede Göster -Name[uk]=Відобразити у вказаному вікні -Name[vi]=Hiển thị trong Cửa sổ Đã định -Name[zh_CN]=在指定的窗口中显示 -Name[zh_TW]=在指定的視窗中顯示 -NoDisplay=true - -[Desktop Action Root] -Exec=kfiresaver.kss -root -Name=Display in Root Window -Name[bg]=Стартиране в главния прозорец -Name[br]=Diskwel er prenestr gwrizienn -Name[bs]=Prikaži u korijenskom prozoru -Name[ca]=Mostra a la finestra arrel -Name[cs]=Zobrazit na pozadí plochy -Name[cy]=Dangos mewn Ffenestr Wraidd -Name[da]=Visning i root-vindue -Name[de]=In Hintergrundfenster anzeigen -Name[el]=Προβολή στο βασικό παράθυρο -Name[eo]=Montri en radika fenestro -Name[es]=Mostrar en la ventana raíz -Name[et]=Juuraknas näitamine -Name[eu]=Bistaratu erro lehioan -Name[fa]=نمایش در پنجرۀ ریشه -Name[fi]=Näytä juuri-ikkunassa -Name[fr]=Affichage dans la fenêtre racine -Name[fy]=Werjefte yn haadfinster -Name[ga]=Taispeáin sa bhFréamhfhuinneog -Name[gl]=Mostrar na fiestra raiz -Name[he]=הצג בחלון השורש -Name[hi]=रूट विंडो में प्रदर्शित करें -Name[hu]=Megjelenítés a gyökérablakban -Name[is]=Birta í rótarglugganum -Name[it]=Mostra sullo sfondo -Name[ja]=ルートウィンドウで表示 -Name[ka]=ჩვენება ძირითად ფანჯარაში -Name[lt]=Rodyti root lange -Name[mk]=Прикажи во коренскиот прозорец -Name[ms]=Papar dalam Tetingkap Root -Name[nb]=Vis i root-vindu -Name[nds]=In Hööftfinster wiesen -Name[ne]=मूल सञ्झ्यालमा प्रदर्शन -Name[nl]=Weergeven in hoofdvenster -Name[nn]=Vis i rotvindauget -Name[pa]=Root ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ -Name[pl]=Wyświetl w oknie głównym -Name[pt]=Mostrar na Janela de Fundo -Name[pt_BR]=Mostrar na janela raiz -Name[ro]=Afişează în fereastra rădăcină -Name[ru]=Показывать в корневом окне -Name[rw]=Kwerekana mu Idirishya Umuzi -Name[sk]=Zobraziť v koreňovom okne -Name[sl]=Prikaz v korenskem oknu -Name[sr]=Прикажи у главном (root) прозору -Name[sr@Latn]=Prikaži u glavnom (root) prozoru -Name[sv]=Visa i rotfönstret -Name[ta]=ஆரம்ப சாளரத்தில் காட்டு -Name[tg]=Дар тирезаи решагӣ намоиш намоед -Name[tr]=Kök Pencerede Göster -Name[uk]=Відобразити в кореневому вікні -Name[vi]=Hiển thị trong Cửa sổ Gốc -Name[zh_CN]=在根窗口中显示 -Name[zh_TW]=在根視窗中顯示 -NoDisplay=true diff --git a/kscreensaver/kdesavers/KFlux.desktop b/kscreensaver/kdesavers/KFlux.desktop deleted file mode 100644 index 2464ad8b..00000000 --- a/kscreensaver/kdesavers/KFlux.desktop +++ /dev/null @@ -1,224 +0,0 @@ -[Desktop Entry] -Exec=kflux.kss -Icon=kscreensaver -Type=Application -Actions=Setup;InWindow;Root; -X-TDE-Category=OpenGL Screen Savers -X-TDE-Type=OpenGL -Name=Flux (GL) -Name[bg]=Прилив -Name[cy]=Dylif (GL) -Name[de]=Flux -Name[el]=Ροή (GL) -Name[es]=Flujo (GL) -Name[fa]=شار (GL) -Name[fy]=Fluks (GL) -Name[gl]=Fluxo (GL) -Name[he]=שטף (GL) -Name[hi]=लहर-लहर (जीएल) -Name[hu]=Flux (OpenGL) -Name[it]=Flusso (GL) -Name[ja]=流れ (GL) -Name[ka]=ფლუქტუაცია (GL) -Name[mk]=Флукс (GL) -Name[nb]=Fluks (GL) -Name[ne]=फ्लक्स (GL) -Name[nn]=Pulsar (GL) -Name[pt]=Fluxo (GL) -Name[pt_BR]=Fluxo (GL) -Name[ru]=Флуктуации (GL) -Name[sl]=Pretok (GL) -Name[sr]=Флукс (GL) -Name[sr@Latn]=Fluks (GL) -Name[ta]=மாற்றம்(GL) -Name[tg]=Флуктуатсияи (GL) -Name[uk]=Флюксія (GL) -Name[uz]=Oqim (GL) -Name[uz@cyrillic]=Оқим (GL) -Name[vi]=Dòng chảy (GL) -Name[zh_CN]=流动(GL) - -[Desktop Action Setup] -Exec=kflux.kss -setup -Name=Setup... -Name[af]=Opstelling... -Name[bg]=Настройки... -Name[br]=Kefluniadur ... -Name[bs]=Postavke... -Name[ca]=Arranjament... -Name[cs]=Nastavení... -Name[cy]=Gosod ... -Name[da]=Opsætning... -Name[de]=Einrichtung ... -Name[el]=Ρύθμιση... -Name[eo]=Agordo... -Name[es]=Configuración... -Name[et]=Seadistamine... -Name[eu]=Konfiguratu... -Name[fa]=برپایی... -Name[fi]=Asetukset... -Name[fo]=Uppseting... -Name[fr]=Configuration... -Name[fy]=Opset... -Name[ga]=Cumraigh... -Name[gl]=Configuración... -Name[he]=הגדרות... -Name[hi]=सेटअप... -Name[hu]=Beállítás... -Name[is]=Stillingar... -Name[it]=Impostazioni... -Name[ja]=設定... -Name[ka]=გამართვა... -Name[lt]=Sąranka ... -Name[lv]=Uzstādīšana... -Name[mk]=Поставување... -Name[ms]=Setkan... -Name[mt]=Konfigurazzjoni... -Name[nb]=Innstillinger … -Name[nds]=Instellen... -Name[ne]=सेटअप... -Name[nl]=Instellingen... -Name[nn]=Oppsett … -Name[nso]=Beakanya... -Name[pa]=ਸੈਟਅੱਪ... -Name[pl]=Ustawienia... -Name[pt]=Configurar... -Name[pt_BR]=Configurar... -Name[ro]=Setează... -Name[ru]=Настройка... -Name[rw]=Iboneza... -Name[sk]=Nastavenie... -Name[sl]=Nastavi ... -Name[sr]=Подеси... -Name[sr@Latn]=Podesi... -Name[sv]=Inställningar... -Name[ta]=அமைப்பு... -Name[tg]=Барпосозӣ... -Name[th]=ติดตั้ง... -Name[tr]=Kurulum... -Name[uk]=Встановити... -Name[uz]=Oʻrnatish -Name[uz@cyrillic]=Ўрнатиш -Name[ven]=Vhekanya... -Name[vi]=Thiết lập... -Name[xh]=Iyacwangciswa... -Name[zh_CN]=设置... -Name[zh_TW]=設定... -Name[zu]=Iyalungiselela... -Icon=kscreensaver - -[Desktop Action InWindow] -Exec=kflux.kss -window-id %w -Name=Display in Specified Window -Name[bg]=Стартиране в избран прозорец -Name[br]=Diskwel er prenestr spisaet -Name[bs]=Prikaži u navedenom prozoru -Name[ca]=Mostra a la finestra especificada -Name[cs]=Zobrazit v určeném okně -Name[cy]=Dangos mewn Ffenestr Benodol -Name[da]=Visning i angivet vindue -Name[de]=In bestimmten Fenster anzeigen -Name[el]=Προβολή στο καθορισμένο παράθυρο -Name[eo]=Montri en indikita fenestro -Name[es]=Mostrar en la ventana especificada -Name[et]=Määratud aknas näitamine -Name[eu]=Bistaratu zehaztutako lehioan -Name[fa]=نمایش در پنجرۀ مشخصشده -Name[fi]=Näytä määrätyssä ikkunassa -Name[fr]=Affichage dans la fenêtre spécifiée -Name[fy]=Werjefte yn in definiearre finster -Name[ga]=Taispeáin san Fhuinneog Sonraithe -Name[gl]=Mostrar na fiestra indicada -Name[he]=הצג בחלון המצוין -Name[hi]=निर्दिष्ट विंडो में प्रदर्शित करें -Name[hu]=Megjelenítés a megadott ablakban -Name[is]=Birta í völdum glugga -Name[it]=Mostra nella finestra specificata -Name[ja]=特定のウィンドウで表示 -Name[ka]=ჩვენება მითითებულ ფანჯარაში -Name[lt]=Rodyti nurodytame lange -Name[mk]=Прикажи во наведениот прозорец -Name[ms]=Papar dalam Tetingkap Yang Dinyatakan -Name[nb]=Vis i angitt vindu -Name[nds]=In utsöcht Finster wiesen -Name[ne]=निर्दिष्ट सञ्झ्यालमा प्रदर्शन -Name[nl]=Weergeven in een opgegeven venster -Name[nn]=Vis i oppgjeve vindauge -Name[pa]=ਦੱਸੇ ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ -Name[pl]=Wyświetl w zadanym oknie -Name[pt]=Mostrar na Janela Indicada -Name[pt_BR]=Mostrar em janela especificada -Name[ro]=Afişează în fereastra specificată -Name[ru]=Показывать в указанном окне -Name[rw]=Kwerekana mu Idirishya Ryihariye -Name[sk]=Zobraziť v zadanom okne -Name[sl]=Prikaz v določenemu oknu -Name[sr]=Прикажи у наведеном прозору -Name[sr@Latn]=Prikaži u navedenom prozoru -Name[sv]=Visa i angivet fönster -Name[ta]=குறித்த சாளரத்தில் காட்டு -Name[tg]=Дар тирезаи нишондода намоиш намоед -Name[tr]=Belirtilen Pencerede Göster -Name[uk]=Відобразити у вказаному вікні -Name[vi]=Hiển thị trong Cửa sổ Đã định -Name[zh_CN]=在指定的窗口中显示 -Name[zh_TW]=在指定的視窗中顯示 -NoDisplay=true - -[Desktop Action Root] -Exec=kflux.kss -root -Name=Display in Root Window -Name[bg]=Стартиране в главния прозорец -Name[br]=Diskwel er prenestr gwrizienn -Name[bs]=Prikaži u korijenskom prozoru -Name[ca]=Mostra a la finestra arrel -Name[cs]=Zobrazit na pozadí plochy -Name[cy]=Dangos mewn Ffenestr Wraidd -Name[da]=Visning i root-vindue -Name[de]=In Hintergrundfenster anzeigen -Name[el]=Προβολή στο βασικό παράθυρο -Name[eo]=Montri en radika fenestro -Name[es]=Mostrar en la ventana raíz -Name[et]=Juuraknas näitamine -Name[eu]=Bistaratu erro lehioan -Name[fa]=نمایش در پنجرۀ ریشه -Name[fi]=Näytä juuri-ikkunassa -Name[fr]=Affichage dans la fenêtre racine -Name[fy]=Werjefte yn haadfinster -Name[ga]=Taispeáin sa bhFréamhfhuinneog -Name[gl]=Mostrar na fiestra raiz -Name[he]=הצג בחלון השורש -Name[hi]=रूट विंडो में प्रदर्शित करें -Name[hu]=Megjelenítés a gyökérablakban -Name[is]=Birta í rótarglugganum -Name[it]=Mostra sullo sfondo -Name[ja]=ルートウィンドウで表示 -Name[ka]=ჩვენება ძირითად ფანჯარაში -Name[lt]=Rodyti root lange -Name[mk]=Прикажи во коренскиот прозорец -Name[ms]=Papar dalam Tetingkap Root -Name[nb]=Vis i root-vindu -Name[nds]=In Hööftfinster wiesen -Name[ne]=मूल सञ्झ्यालमा प्रदर्शन -Name[nl]=Weergeven in hoofdvenster -Name[nn]=Vis i rotvindauget -Name[pa]=Root ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ -Name[pl]=Wyświetl w oknie głównym -Name[pt]=Mostrar na Janela de Fundo -Name[pt_BR]=Mostrar na janela raiz -Name[ro]=Afişează în fereastra rădăcină -Name[ru]=Показывать в корневом окне -Name[rw]=Kwerekana mu Idirishya Umuzi -Name[sk]=Zobraziť v koreňovom okne -Name[sl]=Prikaz v korenskem oknu -Name[sr]=Прикажи у главном (root) прозору -Name[sr@Latn]=Prikaži u glavnom (root) prozoru -Name[sv]=Visa i rotfönstret -Name[ta]=ஆரம்ப சாளரத்தில் காட்டு -Name[tg]=Дар тирезаи решагӣ намоиш намоед -Name[tr]=Kök Pencerede Göster -Name[uk]=Відобразити в кореневому вікні -Name[vi]=Hiển thị trong Cửa sổ Gốc -Name[zh_CN]=在根窗口中显示 -Name[zh_TW]=在根視窗中顯示 -NoDisplay=true diff --git a/kscreensaver/kdesavers/KFountain.desktop b/kscreensaver/kdesavers/KFountain.desktop deleted file mode 100644 index 32291090..00000000 --- a/kscreensaver/kdesavers/KFountain.desktop +++ /dev/null @@ -1,249 +0,0 @@ -[Desktop Entry] -Exec=kfountain.kss -Icon=kscreensaver -Type=Application -Actions=Setup;InWindow;Root; -X-TDE-Category=OpenGL Screen Savers -X-TDE-Type=OpenGL -Name=Particle Fountain (GL) -Name[af]=Deeltjie Fontein (Gl) -Name[bg]=Източник на частици -Name[ca]=Font de partícules (GL) -Name[cs]=Částicová fontána (GL) -Name[cy]=Ffynnon Gronyn (GL) -Name[da]=Partikelbrønd (GL) -Name[de]=Partikelfontäne -Name[el]=Σιντριβάνι σωματιδίων (GL) -Name[eo]=Erofontano -Name[es]=Fuente de partículas (GL) -Name[et]=Osakeste Fontään (GL) -Name[eu]=Partikula iturria (GL) -Name[fa]=منشأ ذره (GL) -Name[fi]=Hiukkaslähde (GL) -Name[fr]=Fontaine de particules (GL) -Name[fy]=Dieltsjesfontein (GL) -Name[gl]=Fonte de partículas (GL) -Name[he]=מזרקת חלקיקים (GL) -Name[hi]=अणु निर्झर (जीएल) -Name[hu]=Szökőkút (OpenGL) -Name[is]=Eindagosbrunnur (GL) -Name[it]=Fontana di particelle (GL) -Name[ja]=粒子の泉 (GL) -Name[ka]=შადრევანი (GL) -Name[lt]=Dalelių fontanas (GL) -Name[lv]=Kripatiņu Strūklaka (GL) -Name[mk]=Фонтана од честички (GL) -Name[mt]=Funtana ta' partiċelli (GL) -Name[nb]=Partikkelfontene (GL) -Name[nds]=Deeltjeblaser (GL) -Name[ne]=पार्टिकल फाउन्टेन (GL) -Name[nl]=Deeltjes-fontijn (GL) -Name[nn]=Partikkelfontene (GL) -Name[pl]=Fontanna cząstek (GL) -Name[pt]=Fonte de Partículas (GL) -Name[pt_BR]=Fonte de Partículas (GL) -Name[ro]=Fîntînă de particule (GL) -Name[ru]=Фонтан частиц (GL) -Name[sk]=Fontána častíc (GL) -Name[sl]=Vodnjak delcev (GL) -Name[sr]=Фонтана честица (GL) -Name[sr@Latn]=Fontana čestica (GL) -Name[sv]=Partikelfontän (GL) -Name[ta]=பொருள் ஊற்று (GL) -Name[tg]=Қисми фаввораи (GL) -Name[th]=ละอองน้ำ (GL) -Name[tr]=Parçacık Şelalesi (GL) -Name[uk]=Фонтан частинок (GL) -Name[uz]=Zarrachalar favvorasi (GL) -Name[uz@cyrillic]=Заррачалар фаввораси (GL) -Name[ven]=Tshisima tsha Zwithu nyana (GL) -Name[vi]=Đài phun Hạt (GL) -Name[xh]=Umthombo Womhlaba (GL) -Name[zh_CN]=粒子喷泉(GL) -Name[zh_TW]=粒子噴泉 (GL) -Name[zu]=Ingxenye encane yomfudlana (GL) - -[Desktop Action Setup] -Exec=kfountain.kss -setup -Name=Setup... -Name[af]=Opstelling... -Name[bg]=Настройки... -Name[br]=Kefluniadur ... -Name[bs]=Postavke... -Name[ca]=Arranjament... -Name[cs]=Nastavení... -Name[cy]=Gosod ... -Name[da]=Opsætning... -Name[de]=Einrichtung ... -Name[el]=Ρύθμιση... -Name[eo]=Agordo... -Name[es]=Configuración... -Name[et]=Seadistamine... -Name[eu]=Konfiguratu... -Name[fa]=برپایی... -Name[fi]=Asetukset... -Name[fo]=Uppseting... -Name[fr]=Configuration... -Name[fy]=Opset... -Name[ga]=Cumraigh... -Name[gl]=Configuración... -Name[he]=הגדרות... -Name[hi]=सेटअप... -Name[hu]=Beállítás... -Name[is]=Stillingar... -Name[it]=Impostazioni... -Name[ja]=設定... -Name[ka]=გამართვა... -Name[lt]=Sąranka ... -Name[lv]=Uzstādīšana... -Name[mk]=Поставување... -Name[ms]=Setkan... -Name[mt]=Konfigurazzjoni... -Name[nb]=Innstillinger … -Name[nds]=Instellen... -Name[ne]=सेटअप... -Name[nl]=Instellingen... -Name[nn]=Oppsett … -Name[nso]=Beakanya... -Name[pa]=ਸੈਟਅੱਪ... -Name[pl]=Ustawienia... -Name[pt]=Configurar... -Name[pt_BR]=Configurar... -Name[ro]=Setează... -Name[ru]=Настройка... -Name[rw]=Iboneza... -Name[sk]=Nastavenie... -Name[sl]=Nastavi ... -Name[sr]=Подеси... -Name[sr@Latn]=Podesi... -Name[sv]=Inställningar... -Name[ta]=அமைப்பு... -Name[tg]=Барпосозӣ... -Name[th]=ติดตั้ง... -Name[tr]=Kurulum... -Name[uk]=Встановити... -Name[uz]=Oʻrnatish -Name[uz@cyrillic]=Ўрнатиш -Name[ven]=Vhekanya... -Name[vi]=Thiết lập... -Name[xh]=Iyacwangciswa... -Name[zh_CN]=设置... -Name[zh_TW]=設定... -Name[zu]=Iyalungiselela... -Icon=kscreensaver - -[Desktop Action InWindow] -Exec=kfountain.kss -window-id %w -Name=Display in Specified Window -Name[bg]=Стартиране в избран прозорец -Name[br]=Diskwel er prenestr spisaet -Name[bs]=Prikaži u navedenom prozoru -Name[ca]=Mostra a la finestra especificada -Name[cs]=Zobrazit v určeném okně -Name[cy]=Dangos mewn Ffenestr Benodol -Name[da]=Visning i angivet vindue -Name[de]=In bestimmten Fenster anzeigen -Name[el]=Προβολή στο καθορισμένο παράθυρο -Name[eo]=Montri en indikita fenestro -Name[es]=Mostrar en la ventana especificada -Name[et]=Määratud aknas näitamine -Name[eu]=Bistaratu zehaztutako lehioan -Name[fa]=نمایش در پنجرۀ مشخصشده -Name[fi]=Näytä määrätyssä ikkunassa -Name[fr]=Affichage dans la fenêtre spécifiée -Name[fy]=Werjefte yn in definiearre finster -Name[ga]=Taispeáin san Fhuinneog Sonraithe -Name[gl]=Mostrar na fiestra indicada -Name[he]=הצג בחלון המצוין -Name[hi]=निर्दिष्ट विंडो में प्रदर्शित करें -Name[hu]=Megjelenítés a megadott ablakban -Name[is]=Birta í völdum glugga -Name[it]=Mostra nella finestra specificata -Name[ja]=特定のウィンドウで表示 -Name[ka]=ჩვენება მითითებულ ფანჯარაში -Name[lt]=Rodyti nurodytame lange -Name[mk]=Прикажи во наведениот прозорец -Name[ms]=Papar dalam Tetingkap Yang Dinyatakan -Name[nb]=Vis i angitt vindu -Name[nds]=In utsöcht Finster wiesen -Name[ne]=निर्दिष्ट सञ्झ्यालमा प्रदर्शन -Name[nl]=Weergeven in een opgegeven venster -Name[nn]=Vis i oppgjeve vindauge -Name[pa]=ਦੱਸੇ ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ -Name[pl]=Wyświetl w zadanym oknie -Name[pt]=Mostrar na Janela Indicada -Name[pt_BR]=Mostrar em janela especificada -Name[ro]=Afişează în fereastra specificată -Name[ru]=Показывать в указанном окне -Name[rw]=Kwerekana mu Idirishya Ryihariye -Name[sk]=Zobraziť v zadanom okne -Name[sl]=Prikaz v določenemu oknu -Name[sr]=Прикажи у наведеном прозору -Name[sr@Latn]=Prikaži u navedenom prozoru -Name[sv]=Visa i angivet fönster -Name[ta]=குறித்த சாளரத்தில் காட்டு -Name[tg]=Дар тирезаи нишондода намоиш намоед -Name[tr]=Belirtilen Pencerede Göster -Name[uk]=Відобразити у вказаному вікні -Name[vi]=Hiển thị trong Cửa sổ Đã định -Name[zh_CN]=在指定的窗口中显示 -Name[zh_TW]=在指定的視窗中顯示 -NoDisplay=true - -[Desktop Action Root] -Exec=kfountain.kss -root -Name=Display in Root Window -Name[bg]=Стартиране в главния прозорец -Name[br]=Diskwel er prenestr gwrizienn -Name[bs]=Prikaži u korijenskom prozoru -Name[ca]=Mostra a la finestra arrel -Name[cs]=Zobrazit na pozadí plochy -Name[cy]=Dangos mewn Ffenestr Wraidd -Name[da]=Visning i root-vindue -Name[de]=In Hintergrundfenster anzeigen -Name[el]=Προβολή στο βασικό παράθυρο -Name[eo]=Montri en radika fenestro -Name[es]=Mostrar en la ventana raíz -Name[et]=Juuraknas näitamine -Name[eu]=Bistaratu erro lehioan -Name[fa]=نمایش در پنجرۀ ریشه -Name[fi]=Näytä juuri-ikkunassa -Name[fr]=Affichage dans la fenêtre racine -Name[fy]=Werjefte yn haadfinster -Name[ga]=Taispeáin sa bhFréamhfhuinneog -Name[gl]=Mostrar na fiestra raiz -Name[he]=הצג בחלון השורש -Name[hi]=रूट विंडो में प्रदर्शित करें -Name[hu]=Megjelenítés a gyökérablakban -Name[is]=Birta í rótarglugganum -Name[it]=Mostra sullo sfondo -Name[ja]=ルートウィンドウで表示 -Name[ka]=ჩვენება ძირითად ფანჯარაში -Name[lt]=Rodyti root lange -Name[mk]=Прикажи во коренскиот прозорец -Name[ms]=Papar dalam Tetingkap Root -Name[nb]=Vis i root-vindu -Name[nds]=In Hööftfinster wiesen -Name[ne]=मूल सञ्झ्यालमा प्रदर्शन -Name[nl]=Weergeven in hoofdvenster -Name[nn]=Vis i rotvindauget -Name[pa]=Root ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ -Name[pl]=Wyświetl w oknie głównym -Name[pt]=Mostrar na Janela de Fundo -Name[pt_BR]=Mostrar na janela raiz -Name[ro]=Afişează în fereastra rădăcină -Name[ru]=Показывать в корневом окне -Name[rw]=Kwerekana mu Idirishya Umuzi -Name[sk]=Zobraziť v koreňovom okne -Name[sl]=Prikaz v korenskem oknu -Name[sr]=Прикажи у главном (root) прозору -Name[sr@Latn]=Prikaži u glavnom (root) prozoru -Name[sv]=Visa i rotfönstret -Name[ta]=ஆரம்ப சாளரத்தில் காட்டு -Name[tg]=Дар тирезаи решагӣ намоиш намоед -Name[tr]=Kök Pencerede Göster -Name[uk]=Відобразити в кореневому вікні -Name[vi]=Hiển thị trong Cửa sổ Gốc -Name[zh_CN]=在根窗口中显示 -Name[zh_TW]=在根視窗中顯示 -NoDisplay=true diff --git a/kscreensaver/kdesavers/KGravity.desktop b/kscreensaver/kdesavers/KGravity.desktop deleted file mode 100644 index 6865b4fa..00000000 --- a/kscreensaver/kdesavers/KGravity.desktop +++ /dev/null @@ -1,253 +0,0 @@ -[Desktop Entry] -Exec=kgravity.kss -Icon=kscreensaver -Type=Application -Actions=Setup;InWindow;Root; -X-TDE-Category=OpenGL Screen Savers -X-TDE-Type=OpenGL -Name=Gravity (GL) -Name[af]=Gravitasie (Gl) -Name[bg]=Гравитация -Name[br]=Dedennerezh (GL) -Name[ca]=Gravetat (GL) -Name[cs]=Gravitace (GL) -Name[cy]=Disgyrchiant (GL) -Name[da]=Tyngdekraft (GL) -Name[de]=Schwerkraft -Name[el]=Βαρύτητα (GL) -Name[eo]=Gravito -Name[es]=Gravedad (GL) -Name[et]=Raskusjõud (GL) -Name[eu]=Grabitatea (GL) -Name[fa]=جاذبه (GL) -Name[fi]=Gravitaatio (GL) -Name[fo]=Tyngd (GL) -Name[fr]=Gravité (GL) -Name[fy]=Swiertekrêft (GL) -Name[gl]=Gravidade (GL) -Name[he]=חלקיקים (GL) -Name[hi]=गुरूत्व (जीएल) -Name[hu]=Gravitáció (OpenGL) -Name[is]=Þyngdarafl (GL) -Name[it]=Gravità (GL) -Name[ja]=重力 (GL) -Name[ka]=მიზიდულობა (GL) -Name[lt]=Trauka (GL) -Name[lv]=Gravitācija (GL) -Name[mk]=Гравитација (GL) -Name[ms]=Graviti (GL) -Name[mt]=Gravità (GL) -Name[nb]=Gravitasjon (GL) -Name[nds]=Swoorkraft (GL) -Name[ne]=गुरुत्व (GL) -Name[nl]=Zwaartekracht (GL) -Name[nn]=Tyngdekraft (GL) -Name[pl]=Grawitacja (GL) -Name[pt]=Gravidade (GL) -Name[pt_BR]=Gravidade (GL) -Name[ro]=Gravitaţie (GL) -Name[ru]=Гравитация (GL) -Name[sk]=Gravitácia (GL) -Name[sl]=Gravitacija (GL) -Name[sr]=Гравитација (GL) -Name[sr@Latn]=Gravitacija (GL) -Name[sv]=Gravitation (GL) -Name[ta]=புவியிர்ப்பு(GL) -Name[tg]=Ҷозибаи (GL) -Name[th]=แรงดึงดูด (GL) -Name[tr]=Yerçekimi (GL) -Name[uk]=Гравітація (GL) -Name[uz]=Gravitatsiya (GL) -Name[uz@cyrillic]=Гравитация (GL) -Name[ven]=Fhasi Mavuni (GL) -Name[vi]=Trọng trường (GL) -Name[xh]=Umoya otsala izinto kumbindi womhlaba (GL) -Name[zh_CN]=重力(GL) -Name[zh_TW]=重力 (GL) -Name[zu]=Amandla adonsela emhlabeni (GL) - - -[Desktop Action Setup] -Exec=kgravity.kss -setup -Name=Setup... -Name[af]=Opstelling... -Name[bg]=Настройки... -Name[br]=Kefluniadur ... -Name[bs]=Postavke... -Name[ca]=Arranjament... -Name[cs]=Nastavení... -Name[cy]=Gosod ... -Name[da]=Opsætning... -Name[de]=Einrichtung ... -Name[el]=Ρύθμιση... -Name[eo]=Agordo... -Name[es]=Configuración... -Name[et]=Seadistamine... -Name[eu]=Konfiguratu... -Name[fa]=برپایی... -Name[fi]=Asetukset... -Name[fo]=Uppseting... -Name[fr]=Configuration... -Name[fy]=Opset... -Name[ga]=Cumraigh... -Name[gl]=Configuración... -Name[he]=הגדרות... -Name[hi]=सेटअप... -Name[hu]=Beállítás... -Name[is]=Stillingar... -Name[it]=Impostazioni... -Name[ja]=設定... -Name[ka]=გამართვა... -Name[lt]=Sąranka ... -Name[lv]=Uzstādīšana... -Name[mk]=Поставување... -Name[ms]=Setkan... -Name[mt]=Konfigurazzjoni... -Name[nb]=Innstillinger … -Name[nds]=Instellen... -Name[ne]=सेटअप... -Name[nl]=Instellingen... -Name[nn]=Oppsett … -Name[nso]=Beakanya... -Name[pa]=ਸੈਟਅੱਪ... -Name[pl]=Ustawienia... -Name[pt]=Configurar... -Name[pt_BR]=Configurar... -Name[ro]=Setează... -Name[ru]=Настройка... -Name[rw]=Iboneza... -Name[sk]=Nastavenie... -Name[sl]=Nastavi ... -Name[sr]=Подеси... -Name[sr@Latn]=Podesi... -Name[sv]=Inställningar... -Name[ta]=அமைப்பு... -Name[tg]=Барпосозӣ... -Name[th]=ติดตั้ง... -Name[tr]=Kurulum... -Name[uk]=Встановити... -Name[uz]=Oʻrnatish -Name[uz@cyrillic]=Ўрнатиш -Name[ven]=Vhekanya... -Name[vi]=Thiết lập... -Name[xh]=Iyacwangciswa... -Name[zh_CN]=设置... -Name[zh_TW]=設定... -Name[zu]=Iyalungiselela... -Icon=kscreensaver - -[Desktop Action InWindow] -Exec=kgravity.kss -window-id %w -Name=Display in Specified Window -Name[bg]=Стартиране в избран прозорец -Name[br]=Diskwel er prenestr spisaet -Name[bs]=Prikaži u navedenom prozoru -Name[ca]=Mostra a la finestra especificada -Name[cs]=Zobrazit v určeném okně -Name[cy]=Dangos mewn Ffenestr Benodol -Name[da]=Visning i angivet vindue -Name[de]=In bestimmten Fenster anzeigen -Name[el]=Προβολή στο καθορισμένο παράθυρο -Name[eo]=Montri en indikita fenestro -Name[es]=Mostrar en la ventana especificada -Name[et]=Määratud aknas näitamine -Name[eu]=Bistaratu zehaztutako lehioan -Name[fa]=نمایش در پنجرۀ مشخصشده -Name[fi]=Näytä määrätyssä ikkunassa -Name[fr]=Affichage dans la fenêtre spécifiée -Name[fy]=Werjefte yn in definiearre finster -Name[ga]=Taispeáin san Fhuinneog Sonraithe -Name[gl]=Mostrar na fiestra indicada -Name[he]=הצג בחלון המצוין -Name[hi]=निर्दिष्ट विंडो में प्रदर्शित करें -Name[hu]=Megjelenítés a megadott ablakban -Name[is]=Birta í völdum glugga -Name[it]=Mostra nella finestra specificata -Name[ja]=特定のウィンドウで表示 -Name[ka]=ჩვენება მითითებულ ფანჯარაში -Name[lt]=Rodyti nurodytame lange -Name[mk]=Прикажи во наведениот прозорец -Name[ms]=Papar dalam Tetingkap Yang Dinyatakan -Name[nb]=Vis i angitt vindu -Name[nds]=In utsöcht Finster wiesen -Name[ne]=निर्दिष्ट सञ्झ्यालमा प्रदर्शन -Name[nl]=Weergeven in een opgegeven venster -Name[nn]=Vis i oppgjeve vindauge -Name[pa]=ਦੱਸੇ ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ -Name[pl]=Wyświetl w zadanym oknie -Name[pt]=Mostrar na Janela Indicada -Name[pt_BR]=Mostrar em janela especificada -Name[ro]=Afişează în fereastra specificată -Name[ru]=Показывать в указанном окне -Name[rw]=Kwerekana mu Idirishya Ryihariye -Name[sk]=Zobraziť v zadanom okne -Name[sl]=Prikaz v določenemu oknu -Name[sr]=Прикажи у наведеном прозору -Name[sr@Latn]=Prikaži u navedenom prozoru -Name[sv]=Visa i angivet fönster -Name[ta]=குறித்த சாளரத்தில் காட்டு -Name[tg]=Дар тирезаи нишондода намоиш намоед -Name[tr]=Belirtilen Pencerede Göster -Name[uk]=Відобразити у вказаному вікні -Name[vi]=Hiển thị trong Cửa sổ Đã định -Name[zh_CN]=在指定的窗口中显示 -Name[zh_TW]=在指定的視窗中顯示 -NoDisplay=true - -[Desktop Action Root] -Exec=kgravity.kss -root -Name=Display in Root Window -Name[bg]=Стартиране в главния прозорец -Name[br]=Diskwel er prenestr gwrizienn -Name[bs]=Prikaži u korijenskom prozoru -Name[ca]=Mostra a la finestra arrel -Name[cs]=Zobrazit na pozadí plochy -Name[cy]=Dangos mewn Ffenestr Wraidd -Name[da]=Visning i root-vindue -Name[de]=In Hintergrundfenster anzeigen -Name[el]=Προβολή στο βασικό παράθυρο -Name[eo]=Montri en radika fenestro -Name[es]=Mostrar en la ventana raíz -Name[et]=Juuraknas näitamine -Name[eu]=Bistaratu erro lehioan -Name[fa]=نمایش در پنجرۀ ریشه -Name[fi]=Näytä juuri-ikkunassa -Name[fr]=Affichage dans la fenêtre racine -Name[fy]=Werjefte yn haadfinster -Name[ga]=Taispeáin sa bhFréamhfhuinneog -Name[gl]=Mostrar na fiestra raiz -Name[he]=הצג בחלון השורש -Name[hi]=रूट विंडो में प्रदर्शित करें -Name[hu]=Megjelenítés a gyökérablakban -Name[is]=Birta í rótarglugganum -Name[it]=Mostra sullo sfondo -Name[ja]=ルートウィンドウで表示 -Name[ka]=ჩვენება ძირითად ფანჯარაში -Name[lt]=Rodyti root lange -Name[mk]=Прикажи во коренскиот прозорец -Name[ms]=Papar dalam Tetingkap Root -Name[nb]=Vis i root-vindu -Name[nds]=In Hööftfinster wiesen -Name[ne]=मूल सञ्झ्यालमा प्रदर्शन -Name[nl]=Weergeven in hoofdvenster -Name[nn]=Vis i rotvindauget -Name[pa]=Root ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ -Name[pl]=Wyświetl w oknie głównym -Name[pt]=Mostrar na Janela de Fundo -Name[pt_BR]=Mostrar na janela raiz -Name[ro]=Afişează în fereastra rădăcină -Name[ru]=Показывать в корневом окне -Name[rw]=Kwerekana mu Idirishya Umuzi -Name[sk]=Zobraziť v koreňovom okne -Name[sl]=Prikaz v korenskem oknu -Name[sr]=Прикажи у главном (root) прозору -Name[sr@Latn]=Prikaži u glavnom (root) prozoru -Name[sv]=Visa i rotfönstret -Name[ta]=ஆரம்ப சாளரத்தில் காட்டு -Name[tg]=Дар тирезаи решагӣ намоиш намоед -Name[tr]=Kök Pencerede Göster -Name[uk]=Відобразити в кореневому вікні -Name[vi]=Hiển thị trong Cửa sổ Gốc -Name[zh_CN]=在根窗口中显示 -Name[zh_TW]=在根視窗中顯示 -NoDisplay=true diff --git a/kscreensaver/kdesavers/KLines-saver.desktop b/kscreensaver/kdesavers/KLines-saver.desktop deleted file mode 100644 index d0d945e1..00000000 --- a/kscreensaver/kdesavers/KLines-saver.desktop +++ /dev/null @@ -1,255 +0,0 @@ -[Desktop Entry] -Exec=klines.kss -Icon=kscreensaver -Type=Application -Actions=Setup;InWindow;Root; -X-TDE-Category=Flying Things -Name=Lines -Name[af]=Lyne -Name[bg]=Линии -Name[br]=Linennoù -Name[ca]=Línies -Name[cs]=Linie -Name[cy]=Llinellau -Name[da]=Linjer -Name[de]=Linien -Name[el]=Γραμμές -Name[eo]=Linioj -Name[es]=Líneas -Name[et]=Jooned -Name[eu]=Lerroak -Name[fa]=خطوط -Name[fi]=Viivat -Name[fo]=Reglur -Name[fr]=Lignes -Name[fy]=Linen -Name[ga]=Línte -Name[gl]=Liñas -Name[he]=קווים -Name[hi]= लकीरें -Name[hu]=Vonalak -Name[is]=Línur -Name[it]=Linee -Name[ja]=線 -Name[ka]=წრფეები -Name[lt]=Linijos -Name[lv]=Līnijas -Name[mk]=Прави -Name[ms]=Baris -Name[mt]=Linji -Name[nb]=Linjer -Name[nds]=Lienen -Name[ne]=पङ्क्ति -Name[nl]=Lijnen -Name[nn]=Linjer -Name[nso]=Methalo -Name[pa]=ਰੇਖਾਵਾਂ -Name[pl]=Linie -Name[pt]=Linhas -Name[pt_BR]=Linhas -Name[ro]=Linii -Name[ru]=Линии -Name[sk]=Čiary -Name[sl]=Črte -Name[sr]=Линије -Name[sr@Latn]=Linije -Name[sv]=Linjer -Name[ta]=கம்பிகள் -Name[tg]=Рахҳо -Name[th]=เส้น -Name[tr]=Çizgiler -Name[uk]=Лінії -Name[uz]=Chiziqlar -Name[uz@cyrillic]=Чизиқлар -Name[ven]=Mitalo -Name[vi]=Dòng kẻ -Name[xh]=Iilayini -Name[zh_CN]=线条 -Name[zh_TW]=線條 -Name[zu]=Olayini - -[Desktop Action Setup] -Exec=klines.kss -setup -Name=Setup... -Name[af]=Opstelling... -Name[bg]=Настройки... -Name[br]=Kefluniadur ... -Name[bs]=Postavke... -Name[ca]=Arranjament... -Name[cs]=Nastavení... -Name[cy]=Gosod ... -Name[da]=Opsætning... -Name[de]=Einrichtung ... -Name[el]=Ρύθμιση... -Name[eo]=Agordo... -Name[es]=Configuración... -Name[et]=Seadistamine... -Name[eu]=Konfiguratu... -Name[fa]=برپایی... -Name[fi]=Asetukset... -Name[fo]=Uppseting... -Name[fr]=Configuration... -Name[fy]=Opset... -Name[ga]=Cumraigh... -Name[gl]=Configuración... -Name[he]=הגדרות... -Name[hi]=सेटअप... -Name[hu]=Beállítás... -Name[is]=Stillingar... -Name[it]=Impostazioni... -Name[ja]=設定... -Name[ka]=გამართვა... -Name[lt]=Sąranka ... -Name[lv]=Uzstādīšana... -Name[mk]=Поставување... -Name[ms]=Setkan... -Name[mt]=Konfigurazzjoni... -Name[nb]=Innstillinger … -Name[nds]=Instellen... -Name[ne]=सेटअप... -Name[nl]=Instellingen... -Name[nn]=Oppsett … -Name[nso]=Beakanya... -Name[pa]=ਸੈਟਅੱਪ... -Name[pl]=Ustawienia... -Name[pt]=Configurar... -Name[pt_BR]=Configurar... -Name[ro]=Setează... -Name[ru]=Настройка... -Name[rw]=Iboneza... -Name[sk]=Nastavenie... -Name[sl]=Nastavi ... -Name[sr]=Подеси... -Name[sr@Latn]=Podesi... -Name[sv]=Inställningar... -Name[ta]=அமைப்பு... -Name[tg]=Барпосозӣ... -Name[th]=ติดตั้ง... -Name[tr]=Kurulum... -Name[uk]=Встановити... -Name[uz]=Oʻrnatish -Name[uz@cyrillic]=Ўрнатиш -Name[ven]=Vhekanya... -Name[vi]=Thiết lập... -Name[xh]=Iyacwangciswa... -Name[zh_CN]=设置... -Name[zh_TW]=設定... -Name[zu]=Iyalungiselela... -Icon=kscreensaver - -[Desktop Action InWindow] -Exec=klines.kss -window-id %w -Name=Display in Specified Window -Name[bg]=Стартиране в избран прозорец -Name[br]=Diskwel er prenestr spisaet -Name[bs]=Prikaži u navedenom prozoru -Name[ca]=Mostra a la finestra especificada -Name[cs]=Zobrazit v určeném okně -Name[cy]=Dangos mewn Ffenestr Benodol -Name[da]=Visning i angivet vindue -Name[de]=In bestimmten Fenster anzeigen -Name[el]=Προβολή στο καθορισμένο παράθυρο -Name[eo]=Montri en indikita fenestro -Name[es]=Mostrar en la ventana especificada -Name[et]=Määratud aknas näitamine -Name[eu]=Bistaratu zehaztutako lehioan -Name[fa]=نمایش در پنجرۀ مشخصشده -Name[fi]=Näytä määrätyssä ikkunassa -Name[fr]=Affichage dans la fenêtre spécifiée -Name[fy]=Werjefte yn in definiearre finster -Name[ga]=Taispeáin san Fhuinneog Sonraithe -Name[gl]=Mostrar na fiestra indicada -Name[he]=הצג בחלון המצוין -Name[hi]=निर्दिष्ट विंडो में प्रदर्शित करें -Name[hu]=Megjelenítés a megadott ablakban -Name[is]=Birta í völdum glugga -Name[it]=Mostra nella finestra specificata -Name[ja]=特定のウィンドウで表示 -Name[ka]=ჩვენება მითითებულ ფანჯარაში -Name[lt]=Rodyti nurodytame lange -Name[mk]=Прикажи во наведениот прозорец -Name[ms]=Papar dalam Tetingkap Yang Dinyatakan -Name[nb]=Vis i angitt vindu -Name[nds]=In utsöcht Finster wiesen -Name[ne]=निर्दिष्ट सञ्झ्यालमा प्रदर्शन -Name[nl]=Weergeven in een opgegeven venster -Name[nn]=Vis i oppgjeve vindauge -Name[pa]=ਦੱਸੇ ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ -Name[pl]=Wyświetl w zadanym oknie -Name[pt]=Mostrar na Janela Indicada -Name[pt_BR]=Mostrar em janela especificada -Name[ro]=Afişează în fereastra specificată -Name[ru]=Показывать в указанном окне -Name[rw]=Kwerekana mu Idirishya Ryihariye -Name[sk]=Zobraziť v zadanom okne -Name[sl]=Prikaz v določenemu oknu -Name[sr]=Прикажи у наведеном прозору -Name[sr@Latn]=Prikaži u navedenom prozoru -Name[sv]=Visa i angivet fönster -Name[ta]=குறித்த சாளரத்தில் காட்டு -Name[tg]=Дар тирезаи нишондода намоиш намоед -Name[tr]=Belirtilen Pencerede Göster -Name[uk]=Відобразити у вказаному вікні -Name[vi]=Hiển thị trong Cửa sổ Đã định -Name[zh_CN]=在指定的窗口中显示 -Name[zh_TW]=在指定的視窗中顯示 -NoDisplay=true - -[Desktop Action Root] -Exec=klines.kss -root -Name=Display in Root Window -Name[bg]=Стартиране в главния прозорец -Name[br]=Diskwel er prenestr gwrizienn -Name[bs]=Prikaži u korijenskom prozoru -Name[ca]=Mostra a la finestra arrel -Name[cs]=Zobrazit na pozadí plochy -Name[cy]=Dangos mewn Ffenestr Wraidd -Name[da]=Visning i root-vindue -Name[de]=In Hintergrundfenster anzeigen -Name[el]=Προβολή στο βασικό παράθυρο -Name[eo]=Montri en radika fenestro -Name[es]=Mostrar en la ventana raíz -Name[et]=Juuraknas näitamine -Name[eu]=Bistaratu erro lehioan -Name[fa]=نمایش در پنجرۀ ریشه -Name[fi]=Näytä juuri-ikkunassa -Name[fr]=Affichage dans la fenêtre racine -Name[fy]=Werjefte yn haadfinster -Name[ga]=Taispeáin sa bhFréamhfhuinneog -Name[gl]=Mostrar na fiestra raiz -Name[he]=הצג בחלון השורש -Name[hi]=रूट विंडो में प्रदर्शित करें -Name[hu]=Megjelenítés a gyökérablakban -Name[is]=Birta í rótarglugganum -Name[it]=Mostra sullo sfondo -Name[ja]=ルートウィンドウで表示 -Name[ka]=ჩვენება ძირითად ფანჯარაში -Name[lt]=Rodyti root lange -Name[mk]=Прикажи во коренскиот прозорец -Name[ms]=Papar dalam Tetingkap Root -Name[nb]=Vis i root-vindu -Name[nds]=In Hööftfinster wiesen -Name[ne]=मूल सञ्झ्यालमा प्रदर्शन -Name[nl]=Weergeven in hoofdvenster -Name[nn]=Vis i rotvindauget -Name[pa]=Root ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ -Name[pl]=Wyświetl w oknie głównym -Name[pt]=Mostrar na Janela de Fundo -Name[pt_BR]=Mostrar na janela raiz -Name[ro]=Afişează în fereastra rădăcină -Name[ru]=Показывать в корневом окне -Name[rw]=Kwerekana mu Idirishya Umuzi -Name[sk]=Zobraziť v koreňovom okne -Name[sl]=Prikaz v korenskem oknu -Name[sr]=Прикажи у главном (root) прозору -Name[sr@Latn]=Prikaži u glavnom (root) prozoru -Name[sv]=Visa i rotfönstret -Name[ta]=ஆரம்ப சாளரத்தில் காட்டு -Name[tg]=Дар тирезаи решагӣ намоиш намоед -Name[tr]=Kök Pencerede Göster -Name[uk]=Відобразити в кореневому вікні -Name[vi]=Hiển thị trong Cửa sổ Gốc -Name[zh_CN]=在根窗口中显示 -Name[zh_TW]=在根視窗中顯示 -NoDisplay=true -X-DCOP-ServiceType=Multi diff --git a/kscreensaver/kdesavers/KLorenz.desktop b/kscreensaver/kdesavers/KLorenz.desktop deleted file mode 100644 index 2e506edc..00000000 --- a/kscreensaver/kdesavers/KLorenz.desktop +++ /dev/null @@ -1,244 +0,0 @@ -[Desktop Entry] -Exec=klorenz.kss -Icon=kscreensaver -Type=Application -Actions=Setup;InWindow;Root; -X-TDE-Category=Gadgets & Simulations -Name=Lorenz Attractor -Name[af]=Lorenz Aantrekker -Name[bg]=Лоренцо -Name[br]=Dedenner Lorenz -Name[cs]=Lorenzův atraktor -Name[cy]=Attynydd Lorenz -Name[da]=Lorenz-attraktor -Name[de]=Lorenz-Attraktor -Name[el]=Ελκυστής Lorenz -Name[eo]=Lorenza atraktoro -Name[es]=Atractor de Lorenz -Name[et]=Lorenzi atraktor -Name[eu]=Lorenz erakarlea -Name[fa]=ربایندۀ Lorenz -Name[fi]=Lorentz attraktori -Name[fo]=Lorenz attractor -Name[fr]=Attracteur de Lorentz -Name[fy]=Lorenz Oanlûker -Name[gl]=Atractor Caótico de Lorenz -Name[he]=מושך לורנץ -Name[hi]=आठ एकम आठ -Name[hu]=Lorenz-féle képernyővédő -Name[is]=Lorenz aðdráttur -Name[it]=Attrattore di Lorenz -Name[ja]=ローレンツアトラクタ -Name[ka]=ლორენცის მიზიდულობა -Name[lv]=Lorensa Attraktors -Name[mk]=Лоренцов атрактор -Name[mt]=Attrattur Lorenz -Name[nb]=Lorenz-attraktor -Name[nds]=Lorenz-Antrecker -Name[ne]=लरेन्ज आकर्षक -Name[nn]=Lorenz-tiltrekking -Name[pl]=Atraktor Lorenza -Name[pt]=Força de Lorenz -Name[pt_BR]=Atração Lorenz -Name[ro]=Atracţie Lorenz -Name[ru]=Странный аттрактор Лоренца -Name[sl]=Lorenzov atraktor -Name[sr]=Лоренцов атрактор -Name[sr@Latn]=Lorencov atraktor -Name[sv]=Lorenz attraktor -Name[ta]=லோரன்ஸ் கவர்பவர் -Name[tg]=Аттракти аҷоиби Лоренс -Name[th]=สิ่งที่น่าดึงดูดของลอเรนซ์ -Name[tr]=Cazibe -Name[uk]=Притягнення Лоренца -Name[ven]=Tshikokodzi tsha Lorenz -Name[vi]=Điểm hút Lorenz -Name[xh]=Umtsali we Lorenz -Name[zh_CN]=洛仑兹吸引子 -Name[zh_TW]=Lorenz 吸引者 -Name[zu]=Umhehi we-Lorenz - -[Desktop Action Setup] -Exec=klorenz.kss -setup -Name=Setup... -Name[af]=Opstelling... -Name[bg]=Настройки... -Name[br]=Kefluniadur ... -Name[bs]=Postavke... -Name[ca]=Arranjament... -Name[cs]=Nastavení... -Name[cy]=Gosod ... -Name[da]=Opsætning... -Name[de]=Einrichtung ... -Name[el]=Ρύθμιση... -Name[eo]=Agordo... -Name[es]=Configuración... -Name[et]=Seadistamine... -Name[eu]=Konfiguratu... -Name[fa]=برپایی... -Name[fi]=Asetukset... -Name[fo]=Uppseting... -Name[fr]=Configuration... -Name[fy]=Opset... -Name[ga]=Cumraigh... -Name[gl]=Configuración... -Name[he]=הגדרות... -Name[hi]=सेटअप... -Name[hu]=Beállítás... -Name[is]=Stillingar... -Name[it]=Impostazioni... -Name[ja]=設定... -Name[ka]=გამართვა... -Name[lt]=Sąranka ... -Name[lv]=Uzstādīšana... -Name[mk]=Поставување... -Name[ms]=Setkan... -Name[mt]=Konfigurazzjoni... -Name[nb]=Innstillinger … -Name[nds]=Instellen... -Name[ne]=सेटअप... -Name[nl]=Instellingen... -Name[nn]=Oppsett … -Name[nso]=Beakanya... -Name[pa]=ਸੈਟਅੱਪ... -Name[pl]=Ustawienia... -Name[pt]=Configurar... -Name[pt_BR]=Configurar... -Name[ro]=Setează... -Name[ru]=Настройка... -Name[rw]=Iboneza... -Name[sk]=Nastavenie... -Name[sl]=Nastavi ... -Name[sr]=Подеси... -Name[sr@Latn]=Podesi... -Name[sv]=Inställningar... -Name[ta]=அமைப்பு... -Name[tg]=Барпосозӣ... -Name[th]=ติดตั้ง... -Name[tr]=Kurulum... -Name[uk]=Встановити... -Name[uz]=Oʻrnatish -Name[uz@cyrillic]=Ўрнатиш -Name[ven]=Vhekanya... -Name[vi]=Thiết lập... -Name[xh]=Iyacwangciswa... -Name[zh_CN]=设置... -Name[zh_TW]=設定... -Name[zu]=Iyalungiselela... -Icon=kscreensaver - -[Desktop Action InWindow] -Exec=klorenz.kss -window-id %w -Name=Display in Specified Window -Name[bg]=Стартиране в избран прозорец -Name[br]=Diskwel er prenestr spisaet -Name[bs]=Prikaži u navedenom prozoru -Name[ca]=Mostra a la finestra especificada -Name[cs]=Zobrazit v určeném okně -Name[cy]=Dangos mewn Ffenestr Benodol -Name[da]=Visning i angivet vindue -Name[de]=In bestimmten Fenster anzeigen -Name[el]=Προβολή στο καθορισμένο παράθυρο -Name[eo]=Montri en indikita fenestro -Name[es]=Mostrar en la ventana especificada -Name[et]=Määratud aknas näitamine -Name[eu]=Bistaratu zehaztutako lehioan -Name[fa]=نمایش در پنجرۀ مشخصشده -Name[fi]=Näytä määrätyssä ikkunassa -Name[fr]=Affichage dans la fenêtre spécifiée -Name[fy]=Werjefte yn in definiearre finster -Name[ga]=Taispeáin san Fhuinneog Sonraithe -Name[gl]=Mostrar na fiestra indicada -Name[he]=הצג בחלון המצוין -Name[hi]=निर्दिष्ट विंडो में प्रदर्शित करें -Name[hu]=Megjelenítés a megadott ablakban -Name[is]=Birta í völdum glugga -Name[it]=Mostra nella finestra specificata -Name[ja]=特定のウィンドウで表示 -Name[ka]=ჩვენება მითითებულ ფანჯარაში -Name[lt]=Rodyti nurodytame lange -Name[mk]=Прикажи во наведениот прозорец -Name[ms]=Papar dalam Tetingkap Yang Dinyatakan -Name[nb]=Vis i angitt vindu -Name[nds]=In utsöcht Finster wiesen -Name[ne]=निर्दिष्ट सञ्झ्यालमा प्रदर्शन -Name[nl]=Weergeven in een opgegeven venster -Name[nn]=Vis i oppgjeve vindauge -Name[pa]=ਦੱਸੇ ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ -Name[pl]=Wyświetl w zadanym oknie -Name[pt]=Mostrar na Janela Indicada -Name[pt_BR]=Mostrar em janela especificada -Name[ro]=Afişează în fereastra specificată -Name[ru]=Показывать в указанном окне -Name[rw]=Kwerekana mu Idirishya Ryihariye -Name[sk]=Zobraziť v zadanom okne -Name[sl]=Prikaz v določenemu oknu -Name[sr]=Прикажи у наведеном прозору -Name[sr@Latn]=Prikaži u navedenom prozoru -Name[sv]=Visa i angivet fönster -Name[ta]=குறித்த சாளரத்தில் காட்டு -Name[tg]=Дар тирезаи нишондода намоиш намоед -Name[tr]=Belirtilen Pencerede Göster -Name[uk]=Відобразити у вказаному вікні -Name[vi]=Hiển thị trong Cửa sổ Đã định -Name[zh_CN]=在指定的窗口中显示 -Name[zh_TW]=在指定的視窗中顯示 -NoDisplay=true - -[Desktop Action Root] -Exec=klorenz.kss -root -Name=Display in Root Window -Name[bg]=Стартиране в главния прозорец -Name[br]=Diskwel er prenestr gwrizienn -Name[bs]=Prikaži u korijenskom prozoru -Name[ca]=Mostra a la finestra arrel -Name[cs]=Zobrazit na pozadí plochy -Name[cy]=Dangos mewn Ffenestr Wraidd -Name[da]=Visning i root-vindue -Name[de]=In Hintergrundfenster anzeigen -Name[el]=Προβολή στο βασικό παράθυρο -Name[eo]=Montri en radika fenestro -Name[es]=Mostrar en la ventana raíz -Name[et]=Juuraknas näitamine -Name[eu]=Bistaratu erro lehioan -Name[fa]=نمایش در پنجرۀ ریشه -Name[fi]=Näytä juuri-ikkunassa -Name[fr]=Affichage dans la fenêtre racine -Name[fy]=Werjefte yn haadfinster -Name[ga]=Taispeáin sa bhFréamhfhuinneog -Name[gl]=Mostrar na fiestra raiz -Name[he]=הצג בחלון השורש -Name[hi]=रूट विंडो में प्रदर्शित करें -Name[hu]=Megjelenítés a gyökérablakban -Name[is]=Birta í rótarglugganum -Name[it]=Mostra sullo sfondo -Name[ja]=ルートウィンドウで表示 -Name[ka]=ჩვენება ძირითად ფანჯარაში -Name[lt]=Rodyti root lange -Name[mk]=Прикажи во коренскиот прозорец -Name[ms]=Papar dalam Tetingkap Root -Name[nb]=Vis i root-vindu -Name[nds]=In Hööftfinster wiesen -Name[ne]=मूल सञ्झ्यालमा प्रदर्शन -Name[nl]=Weergeven in hoofdvenster -Name[nn]=Vis i rotvindauget -Name[pa]=Root ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ -Name[pl]=Wyświetl w oknie głównym -Name[pt]=Mostrar na Janela de Fundo -Name[pt_BR]=Mostrar na janela raiz -Name[ro]=Afişează în fereastra rădăcină -Name[ru]=Показывать в корневом окне -Name[rw]=Kwerekana mu Idirishya Umuzi -Name[sk]=Zobraziť v koreňovom okne -Name[sl]=Prikaz v korenskem oknu -Name[sr]=Прикажи у главном (root) прозору -Name[sr@Latn]=Prikaži u glavnom (root) prozoru -Name[sv]=Visa i rotfönstret -Name[ta]=ஆரம்ப சாளரத்தில் காட்டு -Name[tg]=Дар тирезаи решагӣ намоиш намоед -Name[tr]=Kök Pencerede Göster -Name[uk]=Відобразити в кореневому вікні -Name[vi]=Hiển thị trong Cửa sổ Gốc -Name[zh_CN]=在根窗口中显示 -Name[zh_TW]=在根視窗中顯示 -NoDisplay=true diff --git a/kscreensaver/kdesavers/KPendulum.desktop b/kscreensaver/kdesavers/KPendulum.desktop deleted file mode 100644 index ac3107e8..00000000 --- a/kscreensaver/kdesavers/KPendulum.desktop +++ /dev/null @@ -1,221 +0,0 @@ -[Desktop Entry] -Exec=kpendulum.kss -Icon=kscreensaver -Type=Application -Actions=Setup;InWindow;Root; -X-TDE-Category=OpenGL Screen Savers -X-TDE-Type=OpenGL -Name=KPendulum (GL) -Name[bg]=Махало -Name[cs]=Kyvadlo -Name[de]=KPendulum -Name[el]=Εκκρεμές (GL) -Name[fr]=Pendule (GL) -Name[hi]=के-पेंडुलम (जीएल) -Name[hu]=KPendulum (OpenGL) -Name[is]=Pendúlar (GL) -Name[it]=KPendolo (GL) -Name[ja]=振り子 (GL) -Name[ka]=ქანქარა (GL) -Name[mk]=КНишало (GL) -Name[nb]=KPendel (GL) -Name[nds]=Pennel (GL) -Name[ne]=केडीई पेन्डुलम (GL) -Name[nn]=KPendel (GL) -Name[pt]=KPêndulo (GL) -Name[ro]=Pendul (GL) -Name[ru]=Маятник (GL) -Name[sl]=KNihalo (GL) -Name[sr]=К-клатно (GL) -Name[sr@Latn]=K-klatno (GL) -Name[sv]=Pendel (GL) -Name[ta]=KPendulum(GL) -Name[tg]=Раққосак (GL) -Name[tr]=Sarkaç (GL) -Name[uk]=Маятник (GL) -Name[vi]=Con lắc (GL) - -[Desktop Action Setup] -Exec=kpendulum.kss -setup -Name=Setup... -Name[af]=Opstelling... -Name[bg]=Настройки... -Name[br]=Kefluniadur ... -Name[bs]=Postavke... -Name[ca]=Arranjament... -Name[cs]=Nastavení... -Name[cy]=Gosod ... -Name[da]=Opsætning... -Name[de]=Einrichtung ... -Name[el]=Ρύθμιση... -Name[eo]=Agordo... -Name[es]=Configuración... -Name[et]=Seadistamine... -Name[eu]=Konfiguratu... -Name[fa]=برپایی... -Name[fi]=Asetukset... -Name[fo]=Uppseting... -Name[fr]=Configuration... -Name[fy]=Opset... -Name[ga]=Cumraigh... -Name[gl]=Configuración... -Name[he]=הגדרות... -Name[hi]=सेटअप... -Name[hu]=Beállítás... -Name[is]=Stillingar... -Name[it]=Impostazioni... -Name[ja]=設定... -Name[ka]=გამართვა... -Name[lt]=Sąranka ... -Name[lv]=Uzstādīšana... -Name[mk]=Поставување... -Name[ms]=Setkan... -Name[mt]=Konfigurazzjoni... -Name[nb]=Innstillinger … -Name[nds]=Instellen... -Name[ne]=सेटअप... -Name[nl]=Instellingen... -Name[nn]=Oppsett … -Name[nso]=Beakanya... -Name[pa]=ਸੈਟਅੱਪ... -Name[pl]=Ustawienia... -Name[pt]=Configurar... -Name[pt_BR]=Configurar... -Name[ro]=Setează... -Name[ru]=Настройка... -Name[rw]=Iboneza... -Name[sk]=Nastavenie... -Name[sl]=Nastavi ... -Name[sr]=Подеси... -Name[sr@Latn]=Podesi... -Name[sv]=Inställningar... -Name[ta]=அமைப்பு... -Name[tg]=Барпосозӣ... -Name[th]=ติดตั้ง... -Name[tr]=Kurulum... -Name[uk]=Встановити... -Name[uz]=Oʻrnatish -Name[uz@cyrillic]=Ўрнатиш -Name[ven]=Vhekanya... -Name[vi]=Thiết lập... -Name[xh]=Iyacwangciswa... -Name[zh_CN]=设置... -Name[zh_TW]=設定... -Name[zu]=Iyalungiselela... -Icon=kscreensaver - -[Desktop Action InWindow] -Exec=kpendulum.kss -window-id %w -Name=Display in Specified Window -Name[bg]=Стартиране в избран прозорец -Name[br]=Diskwel er prenestr spisaet -Name[bs]=Prikaži u navedenom prozoru -Name[ca]=Mostra a la finestra especificada -Name[cs]=Zobrazit v určeném okně -Name[cy]=Dangos mewn Ffenestr Benodol -Name[da]=Visning i angivet vindue -Name[de]=In bestimmten Fenster anzeigen -Name[el]=Προβολή στο καθορισμένο παράθυρο -Name[eo]=Montri en indikita fenestro -Name[es]=Mostrar en la ventana especificada -Name[et]=Määratud aknas näitamine -Name[eu]=Bistaratu zehaztutako lehioan -Name[fa]=نمایش در پنجرۀ مشخصشده -Name[fi]=Näytä määrätyssä ikkunassa -Name[fr]=Affichage dans la fenêtre spécifiée -Name[fy]=Werjefte yn in definiearre finster -Name[ga]=Taispeáin san Fhuinneog Sonraithe -Name[gl]=Mostrar na fiestra indicada -Name[he]=הצג בחלון המצוין -Name[hi]=निर्दिष्ट विंडो में प्रदर्शित करें -Name[hu]=Megjelenítés a megadott ablakban -Name[is]=Birta í völdum glugga -Name[it]=Mostra nella finestra specificata -Name[ja]=特定のウィンドウで表示 -Name[ka]=ჩვენება მითითებულ ფანჯარაში -Name[lt]=Rodyti nurodytame lange -Name[mk]=Прикажи во наведениот прозорец -Name[ms]=Papar dalam Tetingkap Yang Dinyatakan -Name[nb]=Vis i angitt vindu -Name[nds]=In utsöcht Finster wiesen -Name[ne]=निर्दिष्ट सञ्झ्यालमा प्रदर्शन -Name[nl]=Weergeven in een opgegeven venster -Name[nn]=Vis i oppgjeve vindauge -Name[pa]=ਦੱਸੇ ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ -Name[pl]=Wyświetl w zadanym oknie -Name[pt]=Mostrar na Janela Indicada -Name[pt_BR]=Mostrar em janela especificada -Name[ro]=Afişează în fereastra specificată -Name[ru]=Показывать в указанном окне -Name[rw]=Kwerekana mu Idirishya Ryihariye -Name[sk]=Zobraziť v zadanom okne -Name[sl]=Prikaz v določenemu oknu -Name[sr]=Прикажи у наведеном прозору -Name[sr@Latn]=Prikaži u navedenom prozoru -Name[sv]=Visa i angivet fönster -Name[ta]=குறித்த சாளரத்தில் காட்டு -Name[tg]=Дар тирезаи нишондода намоиш намоед -Name[tr]=Belirtilen Pencerede Göster -Name[uk]=Відобразити у вказаному вікні -Name[vi]=Hiển thị trong Cửa sổ Đã định -Name[zh_CN]=在指定的窗口中显示 -Name[zh_TW]=在指定的視窗中顯示 -NoDisplay=true - -[Desktop Action Root] -Exec=kpendulum.kss -root -Name=Display in Root Window -Name[bg]=Стартиране в главния прозорец -Name[br]=Diskwel er prenestr gwrizienn -Name[bs]=Prikaži u korijenskom prozoru -Name[ca]=Mostra a la finestra arrel -Name[cs]=Zobrazit na pozadí plochy -Name[cy]=Dangos mewn Ffenestr Wraidd -Name[da]=Visning i root-vindue -Name[de]=In Hintergrundfenster anzeigen -Name[el]=Προβολή στο βασικό παράθυρο -Name[eo]=Montri en radika fenestro -Name[es]=Mostrar en la ventana raíz -Name[et]=Juuraknas näitamine -Name[eu]=Bistaratu erro lehioan -Name[fa]=نمایش در پنجرۀ ریشه -Name[fi]=Näytä juuri-ikkunassa -Name[fr]=Affichage dans la fenêtre racine -Name[fy]=Werjefte yn haadfinster -Name[ga]=Taispeáin sa bhFréamhfhuinneog -Name[gl]=Mostrar na fiestra raiz -Name[he]=הצג בחלון השורש -Name[hi]=रूट विंडो में प्रदर्शित करें -Name[hu]=Megjelenítés a gyökérablakban -Name[is]=Birta í rótarglugganum -Name[it]=Mostra sullo sfondo -Name[ja]=ルートウィンドウで表示 -Name[ka]=ჩვენება ძირითად ფანჯარაში -Name[lt]=Rodyti root lange -Name[mk]=Прикажи во коренскиот прозорец -Name[ms]=Papar dalam Tetingkap Root -Name[nb]=Vis i root-vindu -Name[nds]=In Hööftfinster wiesen -Name[ne]=मूल सञ्झ्यालमा प्रदर्शन -Name[nl]=Weergeven in hoofdvenster -Name[nn]=Vis i rotvindauget -Name[pa]=Root ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ -Name[pl]=Wyświetl w oknie głównym -Name[pt]=Mostrar na Janela de Fundo -Name[pt_BR]=Mostrar na janela raiz -Name[ro]=Afişează în fereastra rădăcină -Name[ru]=Показывать в корневом окне -Name[rw]=Kwerekana mu Idirishya Umuzi -Name[sk]=Zobraziť v koreňovom okne -Name[sl]=Prikaz v korenskem oknu -Name[sr]=Прикажи у главном (root) прозору -Name[sr@Latn]=Prikaži u glavnom (root) prozoru -Name[sv]=Visa i rotfönstret -Name[ta]=ஆரம்ப சாளரத்தில் காட்டு -Name[tg]=Дар тирезаи решагӣ намоиш намоед -Name[tr]=Kök Pencerede Göster -Name[uk]=Відобразити в кореневому вікні -Name[vi]=Hiển thị trong Cửa sổ Gốc -Name[zh_CN]=在根窗口中显示 -Name[zh_TW]=在根視窗中顯示 -NoDisplay=true diff --git a/kscreensaver/kdesavers/KPolygon.desktop b/kscreensaver/kdesavers/KPolygon.desktop deleted file mode 100644 index 76375316..00000000 --- a/kscreensaver/kdesavers/KPolygon.desktop +++ /dev/null @@ -1,251 +0,0 @@ -[Desktop Entry] -Exec=kpolygon.kss -Icon=kscreensaver -Type=Application -Actions=Setup;InWindow;Root; -X-TDE-Category=Rapid Motion -Name=Polygons -Name[af]=Poligone -Name[bg]=Полигон -Name[br]=Lieskognegoù -Name[ca]=Polígons -Name[cs]=Polygony -Name[cy]=Polygonau -Name[da]=Polygoner -Name[de]=Polygon -Name[el]=Πολύγωνα -Name[eo]=Poligonoj -Name[es]=Polígonos -Name[et]=Polügoonid -Name[eu]=Poligonoak -Name[fa]=چند ضلعیها -Name[fi]=Polygonit -Name[fo]=Fleirhyrntir -Name[fr]=Polygones -Name[fy]=Polygoanen -Name[ga]=Polagáin -Name[gl]=Polígonos -Name[he]=מצולעים -Name[hi]=बहुभुज -Name[hu]=Poligonok -Name[is]=Marghyrningar -Name[it]=Poligoni -Name[ja]=ポリゴン -Name[ka]=მრავალკუთხედები -Name[lt]=Daugiakampiai -Name[lv]=Poligoni -Name[mk]=Полигони -Name[ms]=Poligon -Name[mt]=Poligoni -Name[nb]=Polygoner -Name[nds]=Veelecks -Name[ne]=बहुभुज -Name[nl]=Polygonen -Name[nn]=Polygon -Name[pa]=ਬਹੁਭੁਜ -Name[pl]=Wielokąty -Name[pt]=Polígonos -Name[pt_BR]=Polígonos -Name[ro]=Poligoane -Name[ru]=Многоугольники -Name[sk]=Polygóny -Name[sl]=Mnogokotniki -Name[sr]=Полигони -Name[sr@Latn]=Poligoni -Name[sv]=Polygoner -Name[ta]=பலகோணவடிவங்கள் -Name[tg]=Бисёркунҷа -Name[th]=รูปหลายเหลี่ยม -Name[tr]=Poligonlar -Name[uk]=Багатокутники -Name[uz]=Koʻpburchaklar -Name[uz@cyrillic]=Кўпбурчаклар -Name[vi]=Đa giác -Name[xh]=Iziqu ezinekona namacala amaninzi -Name[zh_CN]=多边形 -Name[zh_TW]=多邊形 - -[Desktop Action Setup] -Exec=kpolygon.kss -setup -Name=Setup... -Name[af]=Opstelling... -Name[bg]=Настройки... -Name[br]=Kefluniadur ... -Name[bs]=Postavke... -Name[ca]=Arranjament... -Name[cs]=Nastavení... -Name[cy]=Gosod ... -Name[da]=Opsætning... -Name[de]=Einrichtung ... -Name[el]=Ρύθμιση... -Name[eo]=Agordo... -Name[es]=Configuración... -Name[et]=Seadistamine... -Name[eu]=Konfiguratu... -Name[fa]=برپایی... -Name[fi]=Asetukset... -Name[fo]=Uppseting... -Name[fr]=Configuration... -Name[fy]=Opset... -Name[ga]=Cumraigh... -Name[gl]=Configuración... -Name[he]=הגדרות... -Name[hi]=सेटअप... -Name[hu]=Beállítás... -Name[is]=Stillingar... -Name[it]=Impostazioni... -Name[ja]=設定... -Name[ka]=გამართვა... -Name[lt]=Sąranka ... -Name[lv]=Uzstādīšana... -Name[mk]=Поставување... -Name[ms]=Setkan... -Name[mt]=Konfigurazzjoni... -Name[nb]=Innstillinger … -Name[nds]=Instellen... -Name[ne]=सेटअप... -Name[nl]=Instellingen... -Name[nn]=Oppsett … -Name[nso]=Beakanya... -Name[pa]=ਸੈਟਅੱਪ... -Name[pl]=Ustawienia... -Name[pt]=Configurar... -Name[pt_BR]=Configurar... -Name[ro]=Setează... -Name[ru]=Настройка... -Name[rw]=Iboneza... -Name[sk]=Nastavenie... -Name[sl]=Nastavi ... -Name[sr]=Подеси... -Name[sr@Latn]=Podesi... -Name[sv]=Inställningar... -Name[ta]=அமைப்பு... -Name[tg]=Барпосозӣ... -Name[th]=ติดตั้ง... -Name[tr]=Kurulum... -Name[uk]=Встановити... -Name[uz]=Oʻrnatish -Name[uz@cyrillic]=Ўрнатиш -Name[ven]=Vhekanya... -Name[vi]=Thiết lập... -Name[xh]=Iyacwangciswa... -Name[zh_CN]=设置... -Name[zh_TW]=設定... -Name[zu]=Iyalungiselela... -Icon=kscreensaver - -[Desktop Action InWindow] -Exec=kpolygon.kss -window-id %w -Name=Display in Specified Window -Name[bg]=Стартиране в избран прозорец -Name[br]=Diskwel er prenestr spisaet -Name[bs]=Prikaži u navedenom prozoru -Name[ca]=Mostra a la finestra especificada -Name[cs]=Zobrazit v určeném okně -Name[cy]=Dangos mewn Ffenestr Benodol -Name[da]=Visning i angivet vindue -Name[de]=In bestimmten Fenster anzeigen -Name[el]=Προβολή στο καθορισμένο παράθυρο -Name[eo]=Montri en indikita fenestro -Name[es]=Mostrar en la ventana especificada -Name[et]=Määratud aknas näitamine -Name[eu]=Bistaratu zehaztutako lehioan -Name[fa]=نمایش در پنجرۀ مشخصشده -Name[fi]=Näytä määrätyssä ikkunassa -Name[fr]=Affichage dans la fenêtre spécifiée -Name[fy]=Werjefte yn in definiearre finster -Name[ga]=Taispeáin san Fhuinneog Sonraithe -Name[gl]=Mostrar na fiestra indicada -Name[he]=הצג בחלון המצוין -Name[hi]=निर्दिष्ट विंडो में प्रदर्शित करें -Name[hu]=Megjelenítés a megadott ablakban -Name[is]=Birta í völdum glugga -Name[it]=Mostra nella finestra specificata -Name[ja]=特定のウィンドウで表示 -Name[ka]=ჩვენება მითითებულ ფანჯარაში -Name[lt]=Rodyti nurodytame lange -Name[mk]=Прикажи во наведениот прозорец -Name[ms]=Papar dalam Tetingkap Yang Dinyatakan -Name[nb]=Vis i angitt vindu -Name[nds]=In utsöcht Finster wiesen -Name[ne]=निर्दिष्ट सञ्झ्यालमा प्रदर्शन -Name[nl]=Weergeven in een opgegeven venster -Name[nn]=Vis i oppgjeve vindauge -Name[pa]=ਦੱਸੇ ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ -Name[pl]=Wyświetl w zadanym oknie -Name[pt]=Mostrar na Janela Indicada -Name[pt_BR]=Mostrar em janela especificada -Name[ro]=Afişează în fereastra specificată -Name[ru]=Показывать в указанном окне -Name[rw]=Kwerekana mu Idirishya Ryihariye -Name[sk]=Zobraziť v zadanom okne -Name[sl]=Prikaz v določenemu oknu -Name[sr]=Прикажи у наведеном прозору -Name[sr@Latn]=Prikaži u navedenom prozoru -Name[sv]=Visa i angivet fönster -Name[ta]=குறித்த சாளரத்தில் காட்டு -Name[tg]=Дар тирезаи нишондода намоиш намоед -Name[tr]=Belirtilen Pencerede Göster -Name[uk]=Відобразити у вказаному вікні -Name[vi]=Hiển thị trong Cửa sổ Đã định -Name[zh_CN]=在指定的窗口中显示 -Name[zh_TW]=在指定的視窗中顯示 -NoDisplay=true - -[Desktop Action Root] -Exec=kpolygon.kss -root -Name=Display in Root Window -Name[bg]=Стартиране в главния прозорец -Name[br]=Diskwel er prenestr gwrizienn -Name[bs]=Prikaži u korijenskom prozoru -Name[ca]=Mostra a la finestra arrel -Name[cs]=Zobrazit na pozadí plochy -Name[cy]=Dangos mewn Ffenestr Wraidd -Name[da]=Visning i root-vindue -Name[de]=In Hintergrundfenster anzeigen -Name[el]=Προβολή στο βασικό παράθυρο -Name[eo]=Montri en radika fenestro -Name[es]=Mostrar en la ventana raíz -Name[et]=Juuraknas näitamine -Name[eu]=Bistaratu erro lehioan -Name[fa]=نمایش در پنجرۀ ریشه -Name[fi]=Näytä juuri-ikkunassa -Name[fr]=Affichage dans la fenêtre racine -Name[fy]=Werjefte yn haadfinster -Name[ga]=Taispeáin sa bhFréamhfhuinneog -Name[gl]=Mostrar na fiestra raiz -Name[he]=הצג בחלון השורש -Name[hi]=रूट विंडो में प्रदर्शित करें -Name[hu]=Megjelenítés a gyökérablakban -Name[is]=Birta í rótarglugganum -Name[it]=Mostra sullo sfondo -Name[ja]=ルートウィンドウで表示 -Name[ka]=ჩვენება ძირითად ფანჯარაში -Name[lt]=Rodyti root lange -Name[mk]=Прикажи во коренскиот прозорец -Name[ms]=Papar dalam Tetingkap Root -Name[nb]=Vis i root-vindu -Name[nds]=In Hööftfinster wiesen -Name[ne]=मूल सञ्झ्यालमा प्रदर्शन -Name[nl]=Weergeven in hoofdvenster -Name[nn]=Vis i rotvindauget -Name[pa]=Root ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ -Name[pl]=Wyświetl w oknie głównym -Name[pt]=Mostrar na Janela de Fundo -Name[pt_BR]=Mostrar na janela raiz -Name[ro]=Afişează în fereastra rădăcină -Name[ru]=Показывать в корневом окне -Name[rw]=Kwerekana mu Idirishya Umuzi -Name[sk]=Zobraziť v koreňovom okne -Name[sl]=Prikaz v korenskem oknu -Name[sr]=Прикажи у главном (root) прозору -Name[sr@Latn]=Prikaži u glavnom (root) prozoru -Name[sv]=Visa i rotfönstret -Name[ta]=ஆரம்ப சாளரத்தில் காட்டு -Name[tg]=Дар тирезаи решагӣ намоиш намоед -Name[tr]=Kök Pencerede Göster -Name[uk]=Відобразити в кореневому вікні -Name[vi]=Hiển thị trong Cửa sổ Gốc -Name[zh_CN]=在根窗口中显示 -Name[zh_TW]=在根視窗中顯示 -NoDisplay=true diff --git a/kscreensaver/kdesavers/KRotation.desktop b/kscreensaver/kdesavers/KRotation.desktop deleted file mode 100644 index fb447461..00000000 --- a/kscreensaver/kdesavers/KRotation.desktop +++ /dev/null @@ -1,221 +0,0 @@ -[Desktop Entry] -Exec=krotation.kss -Icon=kscreensaver -Type=Application -Actions=Setup;InWindow;Root; -X-TDE-Category=OpenGL Screen Savers -X-TDE-Type=OpenGL -Name=KRotation (GL) -Name[bg]=Ротация -Name[cs]=Rotace -Name[de]=KRotation -Name[el]=Ατλαντίδα (GL) -Name[fr]=Rotation (GL) -Name[fy]=KRotaasje (GL) -Name[he]= KRotation(GL) -Name[hi]=के-रोटेशन (जीएल) -Name[hu]=KRotation (OpenGL) -Name[is]=Ksnúningur (GL) -Name[it]=KRotazione (GL) -Name[ja]=回転 (GL) -Name[ka]=დატრიალება (GL) -Name[mk]=КРотација (GL) -Name[nb]=KRotasjon (GL) -Name[ne]=केडीई परिक्रमण (GL) -Name[nn]=KRotasjon (GL) -Name[pt]=KRotação (GL) -Name[ro]=Rotire (GL) -Name[ru]=Вращение (GL) -Name[sl]=KRotacija (GL) -Name[sr]=К-ротација (GL) -Name[sr@Latn]=K-rotacija (GL) -Name[sv]=Rotation (GL) -Name[tg]=Тобхурӣ (GL) -Name[tr]=Döndürme (GL) -Name[uk]=Обертання (GL) -Name[vi]=Xoay (GL) - -[Desktop Action Setup] -Exec=krotation.kss -setup -Name=Setup... -Name[af]=Opstelling... -Name[bg]=Настройки... -Name[br]=Kefluniadur ... -Name[bs]=Postavke... -Name[ca]=Arranjament... -Name[cs]=Nastavení... -Name[cy]=Gosod ... -Name[da]=Opsætning... -Name[de]=Einrichtung ... -Name[el]=Ρύθμιση... -Name[eo]=Agordo... -Name[es]=Configuración... -Name[et]=Seadistamine... -Name[eu]=Konfiguratu... -Name[fa]=برپایی... -Name[fi]=Asetukset... -Name[fo]=Uppseting... -Name[fr]=Configuration... -Name[fy]=Opset... -Name[ga]=Cumraigh... -Name[gl]=Configuración... -Name[he]=הגדרות... -Name[hi]=सेटअप... -Name[hu]=Beállítás... -Name[is]=Stillingar... -Name[it]=Impostazioni... -Name[ja]=設定... -Name[ka]=გამართვა... -Name[lt]=Sąranka ... -Name[lv]=Uzstādīšana... -Name[mk]=Поставување... -Name[ms]=Setkan... -Name[mt]=Konfigurazzjoni... -Name[nb]=Innstillinger … -Name[nds]=Instellen... -Name[ne]=सेटअप... -Name[nl]=Instellingen... -Name[nn]=Oppsett … -Name[nso]=Beakanya... -Name[pa]=ਸੈਟਅੱਪ... -Name[pl]=Ustawienia... -Name[pt]=Configurar... -Name[pt_BR]=Configurar... -Name[ro]=Setează... -Name[ru]=Настройка... -Name[rw]=Iboneza... -Name[sk]=Nastavenie... -Name[sl]=Nastavi ... -Name[sr]=Подеси... -Name[sr@Latn]=Podesi... -Name[sv]=Inställningar... -Name[ta]=அமைப்பு... -Name[tg]=Барпосозӣ... -Name[th]=ติดตั้ง... -Name[tr]=Kurulum... -Name[uk]=Встановити... -Name[uz]=Oʻrnatish -Name[uz@cyrillic]=Ўрнатиш -Name[ven]=Vhekanya... -Name[vi]=Thiết lập... -Name[xh]=Iyacwangciswa... -Name[zh_CN]=设置... -Name[zh_TW]=設定... -Name[zu]=Iyalungiselela... -Icon=kscreensaver - -[Desktop Action InWindow] -Exec=krotation.kss -window-id %w -Name=Display in Specified Window -Name[bg]=Стартиране в избран прозорец -Name[br]=Diskwel er prenestr spisaet -Name[bs]=Prikaži u navedenom prozoru -Name[ca]=Mostra a la finestra especificada -Name[cs]=Zobrazit v určeném okně -Name[cy]=Dangos mewn Ffenestr Benodol -Name[da]=Visning i angivet vindue -Name[de]=In bestimmten Fenster anzeigen -Name[el]=Προβολή στο καθορισμένο παράθυρο -Name[eo]=Montri en indikita fenestro -Name[es]=Mostrar en la ventana especificada -Name[et]=Määratud aknas näitamine -Name[eu]=Bistaratu zehaztutako lehioan -Name[fa]=نمایش در پنجرۀ مشخصشده -Name[fi]=Näytä määrätyssä ikkunassa -Name[fr]=Affichage dans la fenêtre spécifiée -Name[fy]=Werjefte yn in definiearre finster -Name[ga]=Taispeáin san Fhuinneog Sonraithe -Name[gl]=Mostrar na fiestra indicada -Name[he]=הצג בחלון המצוין -Name[hi]=निर्दिष्ट विंडो में प्रदर्शित करें -Name[hu]=Megjelenítés a megadott ablakban -Name[is]=Birta í völdum glugga -Name[it]=Mostra nella finestra specificata -Name[ja]=特定のウィンドウで表示 -Name[ka]=ჩვენება მითითებულ ფანჯარაში -Name[lt]=Rodyti nurodytame lange -Name[mk]=Прикажи во наведениот прозорец -Name[ms]=Papar dalam Tetingkap Yang Dinyatakan -Name[nb]=Vis i angitt vindu -Name[nds]=In utsöcht Finster wiesen -Name[ne]=निर्दिष्ट सञ्झ्यालमा प्रदर्शन -Name[nl]=Weergeven in een opgegeven venster -Name[nn]=Vis i oppgjeve vindauge -Name[pa]=ਦੱਸੇ ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ -Name[pl]=Wyświetl w zadanym oknie -Name[pt]=Mostrar na Janela Indicada -Name[pt_BR]=Mostrar em janela especificada -Name[ro]=Afişează în fereastra specificată -Name[ru]=Показывать в указанном окне -Name[rw]=Kwerekana mu Idirishya Ryihariye -Name[sk]=Zobraziť v zadanom okne -Name[sl]=Prikaz v določenemu oknu -Name[sr]=Прикажи у наведеном прозору -Name[sr@Latn]=Prikaži u navedenom prozoru -Name[sv]=Visa i angivet fönster -Name[ta]=குறித்த சாளரத்தில் காட்டு -Name[tg]=Дар тирезаи нишондода намоиш намоед -Name[tr]=Belirtilen Pencerede Göster -Name[uk]=Відобразити у вказаному вікні -Name[vi]=Hiển thị trong Cửa sổ Đã định -Name[zh_CN]=在指定的窗口中显示 -Name[zh_TW]=在指定的視窗中顯示 -NoDisplay=true - -[Desktop Action Root] -Exec=krotation.kss -root -Name=Display in Root Window -Name[bg]=Стартиране в главния прозорец -Name[br]=Diskwel er prenestr gwrizienn -Name[bs]=Prikaži u korijenskom prozoru -Name[ca]=Mostra a la finestra arrel -Name[cs]=Zobrazit na pozadí plochy -Name[cy]=Dangos mewn Ffenestr Wraidd -Name[da]=Visning i root-vindue -Name[de]=In Hintergrundfenster anzeigen -Name[el]=Προβολή στο βασικό παράθυρο -Name[eo]=Montri en radika fenestro -Name[es]=Mostrar en la ventana raíz -Name[et]=Juuraknas näitamine -Name[eu]=Bistaratu erro lehioan -Name[fa]=نمایش در پنجرۀ ریشه -Name[fi]=Näytä juuri-ikkunassa -Name[fr]=Affichage dans la fenêtre racine -Name[fy]=Werjefte yn haadfinster -Name[ga]=Taispeáin sa bhFréamhfhuinneog -Name[gl]=Mostrar na fiestra raiz -Name[he]=הצג בחלון השורש -Name[hi]=रूट विंडो में प्रदर्शित करें -Name[hu]=Megjelenítés a gyökérablakban -Name[is]=Birta í rótarglugganum -Name[it]=Mostra sullo sfondo -Name[ja]=ルートウィンドウで表示 -Name[ka]=ჩვენება ძირითად ფანჯარაში -Name[lt]=Rodyti root lange -Name[mk]=Прикажи во коренскиот прозорец -Name[ms]=Papar dalam Tetingkap Root -Name[nb]=Vis i root-vindu -Name[nds]=In Hööftfinster wiesen -Name[ne]=मूल सञ्झ्यालमा प्रदर्शन -Name[nl]=Weergeven in hoofdvenster -Name[nn]=Vis i rotvindauget -Name[pa]=Root ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ -Name[pl]=Wyświetl w oknie głównym -Name[pt]=Mostrar na Janela de Fundo -Name[pt_BR]=Mostrar na janela raiz -Name[ro]=Afişează în fereastra rădăcină -Name[ru]=Показывать в корневом окне -Name[rw]=Kwerekana mu Idirishya Umuzi -Name[sk]=Zobraziť v koreňovom okne -Name[sl]=Prikaz v korenskem oknu -Name[sr]=Прикажи у главном (root) прозору -Name[sr@Latn]=Prikaži u glavnom (root) prozoru -Name[sv]=Visa i rotfönstret -Name[ta]=ஆரம்ப சாளரத்தில் காட்டு -Name[tg]=Дар тирезаи решагӣ намоиш намоед -Name[tr]=Kök Pencerede Göster -Name[uk]=Відобразити в кореневому вікні -Name[vi]=Hiển thị trong Cửa sổ Gốc -Name[zh_CN]=在根窗口中显示 -Name[zh_TW]=在根視窗中顯示 -NoDisplay=true diff --git a/kscreensaver/kdesavers/KScience.desktop b/kscreensaver/kdesavers/KScience.desktop deleted file mode 100644 index f5d81f9b..00000000 --- a/kscreensaver/kdesavers/KScience.desktop +++ /dev/null @@ -1,254 +0,0 @@ -[Desktop Entry] -Exec=kscience.kss -Icon=kscreensaver -Type=Application -Actions=Setup;InWindow;Root; -X-TDE-Category=Desktop Distortions -X-TDE-Type=ManipulateScreen -Name=Science -Name[af]=Wetenskap -Name[bg]=Наука -Name[br]=Skiantoù -Name[ca]=Ciència -Name[cs]=Věda -Name[cy]=Gwyddoniaeth -Name[da]=Videnskab -Name[de]=Wissenschaft -Name[el]=Επιστήμη -Name[eo]=Scienco -Name[es]=Ciencia -Name[et]=Teadus -Name[eu]=Zientzia -Name[fa]=علم -Name[fi]=Linssi -Name[fo]=Náttúruvísind -Name[fy]=Wittenskiplik -Name[ga]=Eolaíocht -Name[gl]=Ciéncia -Name[he]=מדע -Name[hi]=विज्ञान -Name[hu]=Tudomány -Name[is]=Vísindi -Name[it]=Scienza -Name[ja]=サイエンス -Name[ka]=მეცნიერება -Name[lt]=Mokslas -Name[lv]=Zinātne -Name[mk]=Наука -Name[ms]=Sains -Name[mt]=Xjenza -Name[nb]=Vitenskap -Name[nds]=Wetenschap -Name[ne]=बिज्ञान -Name[nl]=Wetenschappelijk -Name[nn]=Vitskap -Name[nso]=Mahlale -Name[pa]=ਵਿਗਿਆਨ -Name[pl]=Nauka -Name[pt]=Ciência -Name[pt_BR]=Ciência -Name[ro]=Ştiinţă -Name[ru]=Наука -Name[sk]=Vedecký -Name[sl]=Znanost -Name[sr]=Наука -Name[sr@Latn]=Nauka -Name[sv]=Vetenskap -Name[ta]=அறிவியல் -Name[tg]=Илм -Name[th]=วิทยาศาสตร์ -Name[tr]=Bilim -Name[uk]=Наука -Name[uz]=Fan -Name[uz@cyrillic]=Фан -Name[ven]=Vhutsila -Name[vi]=Khoa học -Name[xh]=Inzulu lwazi -Name[zh_CN]=科学 -Name[zh_TW]=科學 -Name[zu]=Ubuchwepheshe bezesayensi - -[Desktop Action Setup] -Exec=kscience.kss -setup -Name=Setup... -Name[af]=Opstelling... -Name[bg]=Настройки... -Name[br]=Kefluniadur ... -Name[bs]=Postavke... -Name[ca]=Arranjament... -Name[cs]=Nastavení... -Name[cy]=Gosod ... -Name[da]=Opsætning... -Name[de]=Einrichtung ... -Name[el]=Ρύθμιση... -Name[eo]=Agordo... -Name[es]=Configuración... -Name[et]=Seadistamine... -Name[eu]=Konfiguratu... -Name[fa]=برپایی... -Name[fi]=Asetukset... -Name[fo]=Uppseting... -Name[fr]=Configuration... -Name[fy]=Opset... -Name[ga]=Cumraigh... -Name[gl]=Configuración... -Name[he]=הגדרות... -Name[hi]=सेटअप... -Name[hu]=Beállítás... -Name[is]=Stillingar... -Name[it]=Impostazioni... -Name[ja]=設定... -Name[ka]=გამართვა... -Name[lt]=Sąranka ... -Name[lv]=Uzstādīšana... -Name[mk]=Поставување... -Name[ms]=Setkan... -Name[mt]=Konfigurazzjoni... -Name[nb]=Innstillinger … -Name[nds]=Instellen... -Name[ne]=सेटअप... -Name[nl]=Instellingen... -Name[nn]=Oppsett … -Name[nso]=Beakanya... -Name[pa]=ਸੈਟਅੱਪ... -Name[pl]=Ustawienia... -Name[pt]=Configurar... -Name[pt_BR]=Configurar... -Name[ro]=Setează... -Name[ru]=Настройка... -Name[rw]=Iboneza... -Name[sk]=Nastavenie... -Name[sl]=Nastavi ... -Name[sr]=Подеси... -Name[sr@Latn]=Podesi... -Name[sv]=Inställningar... -Name[ta]=அமைப்பு... -Name[tg]=Барпосозӣ... -Name[th]=ติดตั้ง... -Name[tr]=Kurulum... -Name[uk]=Встановити... -Name[uz]=Oʻrnatish -Name[uz@cyrillic]=Ўрнатиш -Name[ven]=Vhekanya... -Name[vi]=Thiết lập... -Name[xh]=Iyacwangciswa... -Name[zh_CN]=设置... -Name[zh_TW]=設定... -Name[zu]=Iyalungiselela... -Icon=kscreensaver - -[Desktop Action InWindow] -Exec=kscience.kss -window-id %w -Name=Display in Specified Window -Name[bg]=Стартиране в избран прозорец -Name[br]=Diskwel er prenestr spisaet -Name[bs]=Prikaži u navedenom prozoru -Name[ca]=Mostra a la finestra especificada -Name[cs]=Zobrazit v určeném okně -Name[cy]=Dangos mewn Ffenestr Benodol -Name[da]=Visning i angivet vindue -Name[de]=In bestimmten Fenster anzeigen -Name[el]=Προβολή στο καθορισμένο παράθυρο -Name[eo]=Montri en indikita fenestro -Name[es]=Mostrar en la ventana especificada -Name[et]=Määratud aknas näitamine -Name[eu]=Bistaratu zehaztutako lehioan -Name[fa]=نمایش در پنجرۀ مشخصشده -Name[fi]=Näytä määrätyssä ikkunassa -Name[fr]=Affichage dans la fenêtre spécifiée -Name[fy]=Werjefte yn in definiearre finster -Name[ga]=Taispeáin san Fhuinneog Sonraithe -Name[gl]=Mostrar na fiestra indicada -Name[he]=הצג בחלון המצוין -Name[hi]=निर्दिष्ट विंडो में प्रदर्शित करें -Name[hu]=Megjelenítés a megadott ablakban -Name[is]=Birta í völdum glugga -Name[it]=Mostra nella finestra specificata -Name[ja]=特定のウィンドウで表示 -Name[ka]=ჩვენება მითითებულ ფანჯარაში -Name[lt]=Rodyti nurodytame lange -Name[mk]=Прикажи во наведениот прозорец -Name[ms]=Papar dalam Tetingkap Yang Dinyatakan -Name[nb]=Vis i angitt vindu -Name[nds]=In utsöcht Finster wiesen -Name[ne]=निर्दिष्ट सञ्झ्यालमा प्रदर्शन -Name[nl]=Weergeven in een opgegeven venster -Name[nn]=Vis i oppgjeve vindauge -Name[pa]=ਦੱਸੇ ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ -Name[pl]=Wyświetl w zadanym oknie -Name[pt]=Mostrar na Janela Indicada -Name[pt_BR]=Mostrar em janela especificada -Name[ro]=Afişează în fereastra specificată -Name[ru]=Показывать в указанном окне -Name[rw]=Kwerekana mu Idirishya Ryihariye -Name[sk]=Zobraziť v zadanom okne -Name[sl]=Prikaz v določenemu oknu -Name[sr]=Прикажи у наведеном прозору -Name[sr@Latn]=Prikaži u navedenom prozoru -Name[sv]=Visa i angivet fönster -Name[ta]=குறித்த சாளரத்தில் காட்டு -Name[tg]=Дар тирезаи нишондода намоиш намоед -Name[tr]=Belirtilen Pencerede Göster -Name[uk]=Відобразити у вказаному вікні -Name[vi]=Hiển thị trong Cửa sổ Đã định -Name[zh_CN]=在指定的窗口中显示 -Name[zh_TW]=在指定的視窗中顯示 -NoDisplay=true - -[Desktop Action Root] -Exec=kscience.kss -root -Name=Display in Root Window -Name[bg]=Стартиране в главния прозорец -Name[br]=Diskwel er prenestr gwrizienn -Name[bs]=Prikaži u korijenskom prozoru -Name[ca]=Mostra a la finestra arrel -Name[cs]=Zobrazit na pozadí plochy -Name[cy]=Dangos mewn Ffenestr Wraidd -Name[da]=Visning i root-vindue -Name[de]=In Hintergrundfenster anzeigen -Name[el]=Προβολή στο βασικό παράθυρο -Name[eo]=Montri en radika fenestro -Name[es]=Mostrar en la ventana raíz -Name[et]=Juuraknas näitamine -Name[eu]=Bistaratu erro lehioan -Name[fa]=نمایش در پنجرۀ ریشه -Name[fi]=Näytä juuri-ikkunassa -Name[fr]=Affichage dans la fenêtre racine -Name[fy]=Werjefte yn haadfinster -Name[ga]=Taispeáin sa bhFréamhfhuinneog -Name[gl]=Mostrar na fiestra raiz -Name[he]=הצג בחלון השורש -Name[hi]=रूट विंडो में प्रदर्शित करें -Name[hu]=Megjelenítés a gyökérablakban -Name[is]=Birta í rótarglugganum -Name[it]=Mostra sullo sfondo -Name[ja]=ルートウィンドウで表示 -Name[ka]=ჩვენება ძირითად ფანჯარაში -Name[lt]=Rodyti root lange -Name[mk]=Прикажи во коренскиот прозорец -Name[ms]=Papar dalam Tetingkap Root -Name[nb]=Vis i root-vindu -Name[nds]=In Hööftfinster wiesen -Name[ne]=मूल सञ्झ्यालमा प्रदर्शन -Name[nl]=Weergeven in hoofdvenster -Name[nn]=Vis i rotvindauget -Name[pa]=Root ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ -Name[pl]=Wyświetl w oknie głównym -Name[pt]=Mostrar na Janela de Fundo -Name[pt_BR]=Mostrar na janela raiz -Name[ro]=Afişează în fereastra rădăcină -Name[ru]=Показывать в корневом окне -Name[rw]=Kwerekana mu Idirishya Umuzi -Name[sk]=Zobraziť v koreňovom okne -Name[sl]=Prikaz v korenskem oknu -Name[sr]=Прикажи у главном (root) прозору -Name[sr@Latn]=Prikaži u glavnom (root) prozoru -Name[sv]=Visa i rotfönstret -Name[ta]=ஆரம்ப சாளரத்தில் காட்டு -Name[tg]=Дар тирезаи решагӣ намоиш намоед -Name[tr]=Kök Pencerede Göster -Name[uk]=Відобразити в кореневому вікні -Name[vi]=Hiển thị trong Cửa sổ Gốc -Name[zh_CN]=在根窗口中显示 -Name[zh_TW]=在根視窗中顯示 -NoDisplay=true diff --git a/kscreensaver/kdesavers/KSlideshow.desktop b/kscreensaver/kdesavers/KSlideshow.desktop deleted file mode 100644 index 59670bc6..00000000 --- a/kscreensaver/kdesavers/KSlideshow.desktop +++ /dev/null @@ -1,251 +0,0 @@ -[Desktop Entry] -Exec=kslideshow.kss -Icon=kscreensaver -Type=Application -Actions=Setup;InWindow;Root; -X-TDE-Category=Banners & Pictures -Name=Slide Show -Name[af]=Skuif Vertoon -Name[bg]=Слайдшоу -Name[br]=Diskouezadur skeudennoù -Name[ca]=Diapositives -Name[cs]=Promítání -Name[cy]=Sioe Tryloywder -Name[da]=Diasshow -Name[de]=Dia-Schau -Name[el]=Προβολή σλάιντς -Name[eo]=Lumbildoj -Name[es]=Presentación -Name[et]=Slaidishow -Name[eu]=Diapositiba erakusketa -Name[fa]=نمایش اسلاید -Name[fi]=Diaesitys -Name[fo]=Framløga -Name[fr]=Diaporama -Name[fy]=Diafoarstelling -Name[ga]=Taispeántas Sleamhnán -Name[gl]=Apresentación -Name[he]=מצגת שקופיות -Name[hi]=झलक तमाशा -Name[hu]=Diavetítés -Name[is]=Skyggnusýning -Name[it]=Immagini in sequenza -Name[ja]=スライドショー -Name[ka]=სლაიდების ჩვენება -Name[lt]=Skaidrių šou -Name[lv]=Slīdrāde -Name[mk]=Слајд-шоу -Name[ms]=Tayangan Slaid -Name[nb]=Lysbildeshow -Name[nds]=Diaschau -Name[ne]=स्लाइड प्रदर्शन -Name[nl]=Diavoorstelling -Name[nn]=Framvising -Name[pl]=Sekwencja slajdów -Name[pt]=Slides -Name[pt_BR]=Show de slides -Name[ro]=Succesiune de imagini -Name[ru]=Слайд-шоу -Name[sl]=Diapozitivi -Name[sr]=Слајд шоу -Name[sr@Latn]=Slajd šou -Name[sv]=Bildspel -Name[ta]=ஸ்லைடு காட்சி -Name[tg]=Намоиши слайд -Name[th]=แสดงภาพนิ่ง -Name[tr]=Saydam Gösterisi -Name[uk]=Слайди -Name[uz]=Slayd shou -Name[uz@cyrillic]=Слайд шоу -Name[ven]=Musumbedzo wo peamaho -Name[vi]=Trình bày -Name[xh]=Isiboniso esihamba thambileyo -Name[zh_CN]=幻灯播放 -Name[zh_TW]=幻燈片放映 -Name[zu]=Isiboniso esihamba ngokuthambile - -[Desktop Action Setup] -Exec=kslideshow.kss -setup -Name=Setup... -Name[af]=Opstelling... -Name[bg]=Настройки... -Name[br]=Kefluniadur ... -Name[bs]=Postavke... -Name[ca]=Arranjament... -Name[cs]=Nastavení... -Name[cy]=Gosod ... -Name[da]=Opsætning... -Name[de]=Einrichtung ... -Name[el]=Ρύθμιση... -Name[eo]=Agordo... -Name[es]=Configuración... -Name[et]=Seadistamine... -Name[eu]=Konfiguratu... -Name[fa]=برپایی... -Name[fi]=Asetukset... -Name[fo]=Uppseting... -Name[fr]=Configuration... -Name[fy]=Opset... -Name[ga]=Cumraigh... -Name[gl]=Configuración... -Name[he]=הגדרות... -Name[hi]=सेटअप... -Name[hu]=Beállítás... -Name[is]=Stillingar... -Name[it]=Impostazioni... -Name[ja]=設定... -Name[ka]=გამართვა... -Name[lt]=Sąranka ... -Name[lv]=Uzstādīšana... -Name[mk]=Поставување... -Name[ms]=Setkan... -Name[mt]=Konfigurazzjoni... -Name[nb]=Innstillinger … -Name[nds]=Instellen... -Name[ne]=सेटअप... -Name[nl]=Instellingen... -Name[nn]=Oppsett … -Name[nso]=Beakanya... -Name[pa]=ਸੈਟਅੱਪ... -Name[pl]=Ustawienia... -Name[pt]=Configurar... -Name[pt_BR]=Configurar... -Name[ro]=Setează... -Name[ru]=Настройка... -Name[rw]=Iboneza... -Name[sk]=Nastavenie... -Name[sl]=Nastavi ... -Name[sr]=Подеси... -Name[sr@Latn]=Podesi... -Name[sv]=Inställningar... -Name[ta]=அமைப்பு... -Name[tg]=Барпосозӣ... -Name[th]=ติดตั้ง... -Name[tr]=Kurulum... -Name[uk]=Встановити... -Name[uz]=Oʻrnatish -Name[uz@cyrillic]=Ўрнатиш -Name[ven]=Vhekanya... -Name[vi]=Thiết lập... -Name[xh]=Iyacwangciswa... -Name[zh_CN]=设置... -Name[zh_TW]=設定... -Name[zu]=Iyalungiselela... -Icon=kscreensaver - -[Desktop Action InWindow] -Exec=kslideshow.kss -window-id %w -Name=Display in Specified Window -Name[bg]=Стартиране в избран прозорец -Name[br]=Diskwel er prenestr spisaet -Name[bs]=Prikaži u navedenom prozoru -Name[ca]=Mostra a la finestra especificada -Name[cs]=Zobrazit v určeném okně -Name[cy]=Dangos mewn Ffenestr Benodol -Name[da]=Visning i angivet vindue -Name[de]=In bestimmten Fenster anzeigen -Name[el]=Προβολή στο καθορισμένο παράθυρο -Name[eo]=Montri en indikita fenestro -Name[es]=Mostrar en la ventana especificada -Name[et]=Määratud aknas näitamine -Name[eu]=Bistaratu zehaztutako lehioan -Name[fa]=نمایش در پنجرۀ مشخصشده -Name[fi]=Näytä määrätyssä ikkunassa -Name[fr]=Affichage dans la fenêtre spécifiée -Name[fy]=Werjefte yn in definiearre finster -Name[ga]=Taispeáin san Fhuinneog Sonraithe -Name[gl]=Mostrar na fiestra indicada -Name[he]=הצג בחלון המצוין -Name[hi]=निर्दिष्ट विंडो में प्रदर्शित करें -Name[hu]=Megjelenítés a megadott ablakban -Name[is]=Birta í völdum glugga -Name[it]=Mostra nella finestra specificata -Name[ja]=特定のウィンドウで表示 -Name[ka]=ჩვენება მითითებულ ფანჯარაში -Name[lt]=Rodyti nurodytame lange -Name[mk]=Прикажи во наведениот прозорец -Name[ms]=Papar dalam Tetingkap Yang Dinyatakan -Name[nb]=Vis i angitt vindu -Name[nds]=In utsöcht Finster wiesen -Name[ne]=निर्दिष्ट सञ्झ्यालमा प्रदर्शन -Name[nl]=Weergeven in een opgegeven venster -Name[nn]=Vis i oppgjeve vindauge -Name[pa]=ਦੱਸੇ ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ -Name[pl]=Wyświetl w zadanym oknie -Name[pt]=Mostrar na Janela Indicada -Name[pt_BR]=Mostrar em janela especificada -Name[ro]=Afişează în fereastra specificată -Name[ru]=Показывать в указанном окне -Name[rw]=Kwerekana mu Idirishya Ryihariye -Name[sk]=Zobraziť v zadanom okne -Name[sl]=Prikaz v določenemu oknu -Name[sr]=Прикажи у наведеном прозору -Name[sr@Latn]=Prikaži u navedenom prozoru -Name[sv]=Visa i angivet fönster -Name[ta]=குறித்த சாளரத்தில் காட்டு -Name[tg]=Дар тирезаи нишондода намоиш намоед -Name[tr]=Belirtilen Pencerede Göster -Name[uk]=Відобразити у вказаному вікні -Name[vi]=Hiển thị trong Cửa sổ Đã định -Name[zh_CN]=在指定的窗口中显示 -Name[zh_TW]=在指定的視窗中顯示 -NoDisplay=true - -[Desktop Action Root] -Exec=kslideshow.kss -root -Name=Display in Root Window -Name[bg]=Стартиране в главния прозорец -Name[br]=Diskwel er prenestr gwrizienn -Name[bs]=Prikaži u korijenskom prozoru -Name[ca]=Mostra a la finestra arrel -Name[cs]=Zobrazit na pozadí plochy -Name[cy]=Dangos mewn Ffenestr Wraidd -Name[da]=Visning i root-vindue -Name[de]=In Hintergrundfenster anzeigen -Name[el]=Προβολή στο βασικό παράθυρο -Name[eo]=Montri en radika fenestro -Name[es]=Mostrar en la ventana raíz -Name[et]=Juuraknas näitamine -Name[eu]=Bistaratu erro lehioan -Name[fa]=نمایش در پنجرۀ ریشه -Name[fi]=Näytä juuri-ikkunassa -Name[fr]=Affichage dans la fenêtre racine -Name[fy]=Werjefte yn haadfinster -Name[ga]=Taispeáin sa bhFréamhfhuinneog -Name[gl]=Mostrar na fiestra raiz -Name[he]=הצג בחלון השורש -Name[hi]=रूट विंडो में प्रदर्शित करें -Name[hu]=Megjelenítés a gyökérablakban -Name[is]=Birta í rótarglugganum -Name[it]=Mostra sullo sfondo -Name[ja]=ルートウィンドウで表示 -Name[ka]=ჩვენება ძირითად ფანჯარაში -Name[lt]=Rodyti root lange -Name[mk]=Прикажи во коренскиот прозорец -Name[ms]=Papar dalam Tetingkap Root -Name[nb]=Vis i root-vindu -Name[nds]=In Hööftfinster wiesen -Name[ne]=मूल सञ्झ्यालमा प्रदर्शन -Name[nl]=Weergeven in hoofdvenster -Name[nn]=Vis i rotvindauget -Name[pa]=Root ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ -Name[pl]=Wyświetl w oknie głównym -Name[pt]=Mostrar na Janela de Fundo -Name[pt_BR]=Mostrar na janela raiz -Name[ro]=Afişează în fereastra rădăcină -Name[ru]=Показывать в корневом окне -Name[rw]=Kwerekana mu Idirishya Umuzi -Name[sk]=Zobraziť v koreňovom okne -Name[sl]=Prikaz v korenskem oknu -Name[sr]=Прикажи у главном (root) прозору -Name[sr@Latn]=Prikaži u glavnom (root) prozoru -Name[sv]=Visa i rotfönstret -Name[ta]=ஆரம்ப சாளரத்தில் காட்டு -Name[tg]=Дар тирезаи решагӣ намоиш намоед -Name[tr]=Kök Pencerede Göster -Name[uk]=Відобразити в кореневому вікні -Name[vi]=Hiển thị trong Cửa sổ Gốc -Name[zh_CN]=在根窗口中显示 -Name[zh_TW]=在根視窗中顯示 -NoDisplay=true - diff --git a/kscreensaver/kdesavers/KSolarWinds.desktop b/kscreensaver/kdesavers/KSolarWinds.desktop deleted file mode 100644 index a642fd07..00000000 --- a/kscreensaver/kdesavers/KSolarWinds.desktop +++ /dev/null @@ -1,243 +0,0 @@ -[Desktop Entry] -Exec=ksolarwinds.kss -Icon=kscreensaver -Type=Application -Actions=Setup;InWindow;Root; -X-TDE-Category=OpenGL Screen Savers -X-TDE-Type=OpenGL -Name=Solar Winds (GL) -Name[bg]=Слънчев вятър -Name[br]=Avelioù an Heol (GL) -Name[ca]=Vent solar (GL) -Name[cy]=Gwyntoedd o'r Haul (GL) -Name[da]=Solvinde (GL) -Name[de]=Sonnenwind -Name[el]=Αστρικοί Άνεμοι (GL) -Name[es]=Viento solar (GL) -Name[et]=Päikesetuul (GL) -Name[eu]=Eguzki-haizeak (GL) -Name[fa]=پیچشهای خورشیدی (GL) -Name[fi]=Aurinkotuuli (GL) -Name[fo]=Sólvind (GL) -Name[fr]=Vents solaires (GL) -Name[fy]=Sinnewyn (GL) -Name[gl]=Vento solar (GL) -Name[he]=רוחות סולאריות (GL) -Name[hi]=सौर तूफ़ान (जीएल) -Name[hu]=Napszél (OpenGL) -Name[is]=Sólvindar (GL) -Name[it]=Venti Solari (GL) -Name[ja]=太陽風 (GL) -Name[ka]=მზის ქარი (GL) -Name[mk]=Соларни ветрови (GL) -Name[mt]=Irjieħ solari (GL) -Name[nb]=Solvind (GL) -Name[nds]=Sünnwind -Name[ne]=सौर्य हावा (GL) -Name[nl]=Zonnewind (GL) -Name[nn]=Solvind (GL) -Name[pl]=Wiatry słoneczne (GL) -Name[pt]=Ventos Solares (GL) -Name[pt_BR]=Ventos Solares (GL) -Name[ro]=Vînturi solare (GL) -Name[ru]=Солнечный ветер (GL) -Name[sl]=Solarni vetrovi (GL) -Name[sr]=Соларни ветрови (GL) -Name[sr@Latn]=Solarni vetrovi (GL) -Name[sv]=Solvindar (GL) -Name[ta]=சூரிய காற்றுக்கள்(GL) -Name[tg]=Шамоли офтобӣ (GL) -Name[th]=สายลมสุริยะ (GL) -Name[tr]=Güneş Rüzgarı (GL) -Name[uk]=Сонячні вітри (GL) -Name[uz]=Quyosh shamollari (GL) -Name[uz@cyrillic]=Қуёш шамоллари (GL) -Name[ven]=Mimuya yau solar (GL) -Name[vi]=Gió Mặt Trời (GL) -Name[zh_CN]=太阳风(GL) -Name[zu]=Imimoya Yelanga (GL) - -[Desktop Action Setup] -Exec=ksolarwinds.kss -setup -Name=Setup... -Name[af]=Opstelling... -Name[bg]=Настройки... -Name[br]=Kefluniadur ... -Name[bs]=Postavke... -Name[ca]=Arranjament... -Name[cs]=Nastavení... -Name[cy]=Gosod ... -Name[da]=Opsætning... -Name[de]=Einrichtung ... -Name[el]=Ρύθμιση... -Name[eo]=Agordo... -Name[es]=Configuración... -Name[et]=Seadistamine... -Name[eu]=Konfiguratu... -Name[fa]=برپایی... -Name[fi]=Asetukset... -Name[fo]=Uppseting... -Name[fr]=Configuration... -Name[fy]=Opset... -Name[ga]=Cumraigh... -Name[gl]=Configuración... -Name[he]=הגדרות... -Name[hi]=सेटअप... -Name[hu]=Beállítás... -Name[is]=Stillingar... -Name[it]=Impostazioni... -Name[ja]=設定... -Name[ka]=გამართვა... -Name[lt]=Sąranka ... -Name[lv]=Uzstādīšana... -Name[mk]=Поставување... -Name[ms]=Setkan... -Name[mt]=Konfigurazzjoni... -Name[nb]=Innstillinger … -Name[nds]=Instellen... -Name[ne]=सेटअप... -Name[nl]=Instellingen... -Name[nn]=Oppsett … -Name[nso]=Beakanya... -Name[pa]=ਸੈਟਅੱਪ... -Name[pl]=Ustawienia... -Name[pt]=Configurar... -Name[pt_BR]=Configurar... -Name[ro]=Setează... -Name[ru]=Настройка... -Name[rw]=Iboneza... -Name[sk]=Nastavenie... -Name[sl]=Nastavi ... -Name[sr]=Подеси... -Name[sr@Latn]=Podesi... -Name[sv]=Inställningar... -Name[ta]=அமைப்பு... -Name[tg]=Барпосозӣ... -Name[th]=ติดตั้ง... -Name[tr]=Kurulum... -Name[uk]=Встановити... -Name[uz]=Oʻrnatish -Name[uz@cyrillic]=Ўрнатиш -Name[ven]=Vhekanya... -Name[vi]=Thiết lập... -Name[xh]=Iyacwangciswa... -Name[zh_CN]=设置... -Name[zh_TW]=設定... -Name[zu]=Iyalungiselela... -Icon=kscreensaver - -[Desktop Action InWindow] -Exec=ksolarwinds.kss -window-id %w -Name=Display in Specified Window -Name[bg]=Стартиране в избран прозорец -Name[br]=Diskwel er prenestr spisaet -Name[bs]=Prikaži u navedenom prozoru -Name[ca]=Mostra a la finestra especificada -Name[cs]=Zobrazit v určeném okně -Name[cy]=Dangos mewn Ffenestr Benodol -Name[da]=Visning i angivet vindue -Name[de]=In bestimmten Fenster anzeigen -Name[el]=Προβολή στο καθορισμένο παράθυρο -Name[eo]=Montri en indikita fenestro -Name[es]=Mostrar en la ventana especificada -Name[et]=Määratud aknas näitamine -Name[eu]=Bistaratu zehaztutako lehioan -Name[fa]=نمایش در پنجرۀ مشخصشده -Name[fi]=Näytä määrätyssä ikkunassa -Name[fr]=Affichage dans la fenêtre spécifiée -Name[fy]=Werjefte yn in definiearre finster -Name[ga]=Taispeáin san Fhuinneog Sonraithe -Name[gl]=Mostrar na fiestra indicada -Name[he]=הצג בחלון המצוין -Name[hi]=निर्दिष्ट विंडो में प्रदर्शित करें -Name[hu]=Megjelenítés a megadott ablakban -Name[is]=Birta í völdum glugga -Name[it]=Mostra nella finestra specificata -Name[ja]=特定のウィンドウで表示 -Name[ka]=ჩვენება მითითებულ ფანჯარაში -Name[lt]=Rodyti nurodytame lange -Name[mk]=Прикажи во наведениот прозорец -Name[ms]=Papar dalam Tetingkap Yang Dinyatakan -Name[nb]=Vis i angitt vindu -Name[nds]=In utsöcht Finster wiesen -Name[ne]=निर्दिष्ट सञ्झ्यालमा प्रदर्शन -Name[nl]=Weergeven in een opgegeven venster -Name[nn]=Vis i oppgjeve vindauge -Name[pa]=ਦੱਸੇ ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ -Name[pl]=Wyświetl w zadanym oknie -Name[pt]=Mostrar na Janela Indicada -Name[pt_BR]=Mostrar em janela especificada -Name[ro]=Afişează în fereastra specificată -Name[ru]=Показывать в указанном окне -Name[rw]=Kwerekana mu Idirishya Ryihariye -Name[sk]=Zobraziť v zadanom okne -Name[sl]=Prikaz v določenemu oknu -Name[sr]=Прикажи у наведеном прозору -Name[sr@Latn]=Prikaži u navedenom prozoru -Name[sv]=Visa i angivet fönster -Name[ta]=குறித்த சாளரத்தில் காட்டு -Name[tg]=Дар тирезаи нишондода намоиш намоед -Name[tr]=Belirtilen Pencerede Göster -Name[uk]=Відобразити у вказаному вікні -Name[vi]=Hiển thị trong Cửa sổ Đã định -Name[zh_CN]=在指定的窗口中显示 -Name[zh_TW]=在指定的視窗中顯示 -NoDisplay=true - -[Desktop Action Root] -Exec=ksolarwinds.kss -root -Name=Display in Root Window -Name[bg]=Стартиране в главния прозорец -Name[br]=Diskwel er prenestr gwrizienn -Name[bs]=Prikaži u korijenskom prozoru -Name[ca]=Mostra a la finestra arrel -Name[cs]=Zobrazit na pozadí plochy -Name[cy]=Dangos mewn Ffenestr Wraidd -Name[da]=Visning i root-vindue -Name[de]=In Hintergrundfenster anzeigen -Name[el]=Προβολή στο βασικό παράθυρο -Name[eo]=Montri en radika fenestro -Name[es]=Mostrar en la ventana raíz -Name[et]=Juuraknas näitamine -Name[eu]=Bistaratu erro lehioan -Name[fa]=نمایش در پنجرۀ ریشه -Name[fi]=Näytä juuri-ikkunassa -Name[fr]=Affichage dans la fenêtre racine -Name[fy]=Werjefte yn haadfinster -Name[ga]=Taispeáin sa bhFréamhfhuinneog -Name[gl]=Mostrar na fiestra raiz -Name[he]=הצג בחלון השורש -Name[hi]=रूट विंडो में प्रदर्शित करें -Name[hu]=Megjelenítés a gyökérablakban -Name[is]=Birta í rótarglugganum -Name[it]=Mostra sullo sfondo -Name[ja]=ルートウィンドウで表示 -Name[ka]=ჩვენება ძირითად ფანჯარაში -Name[lt]=Rodyti root lange -Name[mk]=Прикажи во коренскиот прозорец -Name[ms]=Papar dalam Tetingkap Root -Name[nb]=Vis i root-vindu -Name[nds]=In Hööftfinster wiesen -Name[ne]=मूल सञ्झ्यालमा प्रदर्शन -Name[nl]=Weergeven in hoofdvenster -Name[nn]=Vis i rotvindauget -Name[pa]=Root ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ -Name[pl]=Wyświetl w oknie głównym -Name[pt]=Mostrar na Janela de Fundo -Name[pt_BR]=Mostrar na janela raiz -Name[ro]=Afişează în fereastra rădăcină -Name[ru]=Показывать в корневом окне -Name[rw]=Kwerekana mu Idirishya Umuzi -Name[sk]=Zobraziť v koreňovom okne -Name[sl]=Prikaz v korenskem oknu -Name[sr]=Прикажи у главном (root) прозору -Name[sr@Latn]=Prikaži u glavnom (root) prozoru -Name[sv]=Visa i rotfönstret -Name[ta]=ஆரம்ப சாளரத்தில் காட்டு -Name[tg]=Дар тирезаи решагӣ намоиш намоед -Name[tr]=Kök Pencerede Göster -Name[uk]=Відобразити в кореневому вікні -Name[vi]=Hiển thị trong Cửa sổ Gốc -Name[zh_CN]=在根窗口中显示 -Name[zh_TW]=在根視窗中顯示 -NoDisplay=true diff --git a/kscreensaver/kdesavers/KVm.desktop b/kscreensaver/kdesavers/KVm.desktop deleted file mode 100644 index 65abfd4c..00000000 --- a/kscreensaver/kdesavers/KVm.desktop +++ /dev/null @@ -1,253 +0,0 @@ -[Desktop Entry] -Exec=kvm.kss -Icon=kscreensaver -Type=Application -Actions=Setup;InWindow;Root; -X-TDE-Category=Gadgets & Simulations -Name=Virtual Machine -Name[af]=Virtuele Masjien -Name[bg]=Виртуална машина -Name[br]=Ardivink galloudel -Name[ca]=Màquina virtual -Name[cs]=Virtuální stroj -Name[cy]=Peiriant Rhith -Name[da]=Virtuel maskine -Name[de]=Virtuelle Maschine -Name[el]=Εικονική μηχανή -Name[eo]=Virtuala Maŝino -Name[es]=Máquina virtual -Name[et]=Virtuaalne Masin -Name[eu]=Makina birtuala -Name[fa]=ماشین مجازی -Name[fi]=Virtuaalikone -Name[fo]=Tyknismaskina -Name[fr]=Machine virtuelle -Name[fy]=Firtuele masine -Name[ga]=Meaisín Fíorúil -Name[gl]=Máquina virtual -Name[he]=מכונה וירטואלית -Name[hi]=आभासी यंत्र -Name[hu]=Virtuális gép -Name[is]=Sýndarvél -Name[it]=Macchina virtuale -Name[ja]=仮想マシン -Name[ka]=ვირტუალური მანქანა -Name[lt]=Virtuali Mašina -Name[lv]=Virtuālā mašīna -Name[mk]=Виртуелна машина -Name[ms]=Mesin Maya -Name[mt]=Magna Virtwali -Name[nb]=Virtuell maskin -Name[nds]=Virtuell Maschien -Name[ne]=अवास्तविक मेशिन -Name[nl]=Virtuele machine -Name[nn]=Virtuell maskin -Name[nso]=Motshene o Maatla -Name[pl]=Maszyna wirtualna -Name[pt]=Máquina Virtual -Name[pt_BR]=Máquina virtual -Name[ro]=Maşină virtuală -Name[ru]=Виртуальная машина -Name[sk]=Virtuálny stroj -Name[sl]=Navidezni stroj -Name[sr]=Виртуелна машина -Name[sr@Latn]=Virtuelna mašina -Name[sv]=Virtuell maskin -Name[ta]=கற்பனை வாகனம் -Name[tg]=Мошини уфуқӣ -Name[th]=เครื่องจำลอง -Name[tr]=Sanal Makine -Name[uk]=Віртуальна машина -Name[uz]=Virtual kompyuter -Name[uz@cyrillic]=Виртуал компьютер -Name[ven]=Mutshini usa vhonali -Name[vi]=Máy Ảo -Name[xh]=Umatshini onesiqhamo -Name[zh_CN]=虚拟机 -Name[zh_TW]=虛擬機器 -Name[zu]=Ushini Obonakalayo - -[Desktop Action Setup] -Exec=kvm.kss -setup -Name=Setup... -Name[af]=Opstelling... -Name[bg]=Настройки... -Name[br]=Kefluniadur ... -Name[bs]=Postavke... -Name[ca]=Arranjament... -Name[cs]=Nastavení... -Name[cy]=Gosod ... -Name[da]=Opsætning... -Name[de]=Einrichtung ... -Name[el]=Ρύθμιση... -Name[eo]=Agordo... -Name[es]=Configuración... -Name[et]=Seadistamine... -Name[eu]=Konfiguratu... -Name[fa]=برپایی... -Name[fi]=Asetukset... -Name[fo]=Uppseting... -Name[fr]=Configuration... -Name[fy]=Opset... -Name[ga]=Cumraigh... -Name[gl]=Configuración... -Name[he]=הגדרות... -Name[hi]=सेटअप... -Name[hu]=Beállítás... -Name[is]=Stillingar... -Name[it]=Impostazioni... -Name[ja]=設定... -Name[ka]=გამართვა... -Name[lt]=Sąranka ... -Name[lv]=Uzstādīšana... -Name[mk]=Поставување... -Name[ms]=Setkan... -Name[mt]=Konfigurazzjoni... -Name[nb]=Innstillinger … -Name[nds]=Instellen... -Name[ne]=सेटअप... -Name[nl]=Instellingen... -Name[nn]=Oppsett … -Name[nso]=Beakanya... -Name[pa]=ਸੈਟਅੱਪ... -Name[pl]=Ustawienia... -Name[pt]=Configurar... -Name[pt_BR]=Configurar... -Name[ro]=Setează... -Name[ru]=Настройка... -Name[rw]=Iboneza... -Name[sk]=Nastavenie... -Name[sl]=Nastavi ... -Name[sr]=Подеси... -Name[sr@Latn]=Podesi... -Name[sv]=Inställningar... -Name[ta]=அமைப்பு... -Name[tg]=Барпосозӣ... -Name[th]=ติดตั้ง... -Name[tr]=Kurulum... -Name[uk]=Встановити... -Name[uz]=Oʻrnatish -Name[uz@cyrillic]=Ўрнатиш -Name[ven]=Vhekanya... -Name[vi]=Thiết lập... -Name[xh]=Iyacwangciswa... -Name[zh_CN]=设置... -Name[zh_TW]=設定... -Name[zu]=Iyalungiselela... -Icon=kscreensaver - -[Desktop Action InWindow] -Exec=kvm.kss -window-id %w -Name=Display in Specified Window -Name[bg]=Стартиране в избран прозорец -Name[br]=Diskwel er prenestr spisaet -Name[bs]=Prikaži u navedenom prozoru -Name[ca]=Mostra a la finestra especificada -Name[cs]=Zobrazit v určeném okně -Name[cy]=Dangos mewn Ffenestr Benodol -Name[da]=Visning i angivet vindue -Name[de]=In bestimmten Fenster anzeigen -Name[el]=Προβολή στο καθορισμένο παράθυρο -Name[eo]=Montri en indikita fenestro -Name[es]=Mostrar en la ventana especificada -Name[et]=Määratud aknas näitamine -Name[eu]=Bistaratu zehaztutako lehioan -Name[fa]=نمایش در پنجرۀ مشخصشده -Name[fi]=Näytä määrätyssä ikkunassa -Name[fr]=Affichage dans la fenêtre spécifiée -Name[fy]=Werjefte yn in definiearre finster -Name[ga]=Taispeáin san Fhuinneog Sonraithe -Name[gl]=Mostrar na fiestra indicada -Name[he]=הצג בחלון המצוין -Name[hi]=निर्दिष्ट विंडो में प्रदर्शित करें -Name[hu]=Megjelenítés a megadott ablakban -Name[is]=Birta í völdum glugga -Name[it]=Mostra nella finestra specificata -Name[ja]=特定のウィンドウで表示 -Name[ka]=ჩვენება მითითებულ ფანჯარაში -Name[lt]=Rodyti nurodytame lange -Name[mk]=Прикажи во наведениот прозорец -Name[ms]=Papar dalam Tetingkap Yang Dinyatakan -Name[nb]=Vis i angitt vindu -Name[nds]=In utsöcht Finster wiesen -Name[ne]=निर्दिष्ट सञ्झ्यालमा प्रदर्शन -Name[nl]=Weergeven in een opgegeven venster -Name[nn]=Vis i oppgjeve vindauge -Name[pa]=ਦੱਸੇ ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ -Name[pl]=Wyświetl w zadanym oknie -Name[pt]=Mostrar na Janela Indicada -Name[pt_BR]=Mostrar em janela especificada -Name[ro]=Afişează în fereastra specificată -Name[ru]=Показывать в указанном окне -Name[rw]=Kwerekana mu Idirishya Ryihariye -Name[sk]=Zobraziť v zadanom okne -Name[sl]=Prikaz v določenemu oknu -Name[sr]=Прикажи у наведеном прозору -Name[sr@Latn]=Prikaži u navedenom prozoru -Name[sv]=Visa i angivet fönster -Name[ta]=குறித்த சாளரத்தில் காட்டு -Name[tg]=Дар тирезаи нишондода намоиш намоед -Name[tr]=Belirtilen Pencerede Göster -Name[uk]=Відобразити у вказаному вікні -Name[vi]=Hiển thị trong Cửa sổ Đã định -Name[zh_CN]=在指定的窗口中显示 -Name[zh_TW]=在指定的視窗中顯示 -NoDisplay=true - -[Desktop Action Root] -Exec=kvm.kss -root -Name=Display in Root Window -Name[bg]=Стартиране в главния прозорец -Name[br]=Diskwel er prenestr gwrizienn -Name[bs]=Prikaži u korijenskom prozoru -Name[ca]=Mostra a la finestra arrel -Name[cs]=Zobrazit na pozadí plochy -Name[cy]=Dangos mewn Ffenestr Wraidd -Name[da]=Visning i root-vindue -Name[de]=In Hintergrundfenster anzeigen -Name[el]=Προβολή στο βασικό παράθυρο -Name[eo]=Montri en radika fenestro -Name[es]=Mostrar en la ventana raíz -Name[et]=Juuraknas näitamine -Name[eu]=Bistaratu erro lehioan -Name[fa]=نمایش در پنجرۀ ریشه -Name[fi]=Näytä juuri-ikkunassa -Name[fr]=Affichage dans la fenêtre racine -Name[fy]=Werjefte yn haadfinster -Name[ga]=Taispeáin sa bhFréamhfhuinneog -Name[gl]=Mostrar na fiestra raiz -Name[he]=הצג בחלון השורש -Name[hi]=रूट विंडो में प्रदर्शित करें -Name[hu]=Megjelenítés a gyökérablakban -Name[is]=Birta í rótarglugganum -Name[it]=Mostra sullo sfondo -Name[ja]=ルートウィンドウで表示 -Name[ka]=ჩვენება ძირითად ფანჯარაში -Name[lt]=Rodyti root lange -Name[mk]=Прикажи во коренскиот прозорец -Name[ms]=Papar dalam Tetingkap Root -Name[nb]=Vis i root-vindu -Name[nds]=In Hööftfinster wiesen -Name[ne]=मूल सञ्झ्यालमा प्रदर्शन -Name[nl]=Weergeven in hoofdvenster -Name[nn]=Vis i rotvindauget -Name[pa]=Root ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ -Name[pl]=Wyświetl w oknie głównym -Name[pt]=Mostrar na Janela de Fundo -Name[pt_BR]=Mostrar na janela raiz -Name[ro]=Afişează în fereastra rădăcină -Name[ru]=Показывать в корневом окне -Name[rw]=Kwerekana mu Idirishya Umuzi -Name[sk]=Zobraziť v koreňovom okne -Name[sl]=Prikaz v korenskem oknu -Name[sr]=Прикажи у главном (root) прозору -Name[sr@Latn]=Prikaži u glavnom (root) prozoru -Name[sv]=Visa i rotfönstret -Name[ta]=ஆரம்ப சாளரத்தில் காட்டு -Name[tg]=Дар тирезаи решагӣ намоиш намоед -Name[tr]=Kök Pencerede Göster -Name[uk]=Відобразити в кореневому вікні -Name[vi]=Hiển thị trong Cửa sổ Gốc -Name[zh_CN]=在根窗口中显示 -Name[zh_TW]=在根視窗中顯示 -NoDisplay=true diff --git a/kscreensaver/kdesavers/KWave.desktop b/kscreensaver/kdesavers/KWave.desktop deleted file mode 100644 index 1049ac44..00000000 --- a/kscreensaver/kdesavers/KWave.desktop +++ /dev/null @@ -1,251 +0,0 @@ -[Desktop Entry] -Exec=kwave.kss -Icon=kscreensaver -Type=Application -Actions=Setup;InWindow;Root; -X-TDE-Category=OpenGL Screen Savers -X-TDE-Type=OpenGL -Name=Bitmap Flag (GL) -Name[af]=Biskaart Vlag (Gl) -Name[bg]=Развяващ се флаг -Name[ca]=Bandera de mapa de bits (GL) -Name[cs]=Vlajka (GL) -Name[cy]=Baner Didfap (GL) -Name[da]=Bitmapflag (GL) -Name[de]=Bildflagge -Name[el]=Σημαία bitmap (GL) -Name[eo]=Bildflago -Name[es]=Bandera de mapa de bits (GL) -Name[et]=Pildilipp (GL) -Name[eu]=Bitmap Bandera (GL) -Name[fa]=پرچم نگاشت بیت(GL) -Name[fi]=Bittikarttalippu (GL) -Name[fo]=Flagg (GL) -Name[fr]=Drapeau (GL) -Name[fy]=Bitmap flagge (GL) -Name[gl]=Bandeira de mapa de bits (GL) -Name[he]=דגל (GL) -Name[hi]=झंडियाँ (जीएल) -Name[hu]=Zászló (OpenGL) -Name[is]=Myndafáni (GL) -Name[it]=Bandiera bitmap (GL) -Name[ja]=ビットマップフラッグ (GL) -Name[ka]=რასტრული ალამი (GL) -Name[lt]=Taškinės grafikos (bitmap) vėliava (GL) -Name[lv]=Bitmapa Karogs (GL) -Name[mk]=Битмапирано знаме (GL) -Name[mt]=Bandiera bi stampa (GL) -Name[nb]=Bittmap-flagg (GL) -Name[nds]=Weihen Flagg (GL) -Name[ne]=बिटम्याप झण्डा(GL) -Name[nl]=Bitmap vlag (GL) -Name[nn]=Flagg (GL) -Name[pl]=Bitmapowa flaga (GL) -Name[pt]=Imagem Ondulante (GL) -Name[pt_BR]=Bitmap (GL) -Name[ro]=Steag imagine (GL) -Name[ru]=Растровый флаг (GL) -Name[sk]=alajka (GL) -Name[sl]=Bitna zastava (GL) -Name[sr]=Битмапирана застава (GL) -Name[sr@Latn]=Bitmapirana zastava (GL) -Name[sv]=Bitmappsflagga (GL) -Name[ta]=பிட்வரைப்பட குறி -Name[tg]=Байрақи растрӣ (GL) -Name[th]=ธงภาพบิตแมพ (GL) -Name[tr]=Bayrak (GL) -Name[uk]=Растровий прапор (GL) -Name[uz]=Bayroq (GL) -Name[uz@cyrillic]=Байроқ (GL) -Name[ven]=Fulaga ya Bitmap (GL) -Name[vi]=Cờ Mảng ảnh (GL) -Name[xh]=Indwe ye Bitmap (GL) -Name[zh_CN]=位图旗帜(GL) -Name[zh_TW]=點陣圖旗幟 (GL) -Name[zu]=Bitmap Flap (GL) - - -[Desktop Action Setup] -Exec=kwave.kss -setup -Name=Setup... -Name[af]=Opstelling... -Name[bg]=Настройки... -Name[br]=Kefluniadur ... -Name[bs]=Postavke... -Name[ca]=Arranjament... -Name[cs]=Nastavení... -Name[cy]=Gosod ... -Name[da]=Opsætning... -Name[de]=Einrichtung ... -Name[el]=Ρύθμιση... -Name[eo]=Agordo... -Name[es]=Configuración... -Name[et]=Seadistamine... -Name[eu]=Konfiguratu... -Name[fa]=برپایی... -Name[fi]=Asetukset... -Name[fo]=Uppseting... -Name[fr]=Configuration... -Name[fy]=Opset... -Name[ga]=Cumraigh... -Name[gl]=Configuración... -Name[he]=הגדרות... -Name[hi]=सेटअप... -Name[hu]=Beállítás... -Name[is]=Stillingar... -Name[it]=Impostazioni... -Name[ja]=設定... -Name[ka]=გამართვა... -Name[lt]=Sąranka ... -Name[lv]=Uzstādīšana... -Name[mk]=Поставување... -Name[ms]=Setkan... -Name[mt]=Konfigurazzjoni... -Name[nb]=Innstillinger … -Name[nds]=Instellen... -Name[ne]=सेटअप... -Name[nl]=Instellingen... -Name[nn]=Oppsett … -Name[nso]=Beakanya... -Name[pa]=ਸੈਟਅੱਪ... -Name[pl]=Ustawienia... -Name[pt]=Configurar... -Name[pt_BR]=Configurar... -Name[ro]=Setează... -Name[ru]=Настройка... -Name[rw]=Iboneza... -Name[sk]=Nastavenie... -Name[sl]=Nastavi ... -Name[sr]=Подеси... -Name[sr@Latn]=Podesi... -Name[sv]=Inställningar... -Name[ta]=அமைப்பு... -Name[tg]=Барпосозӣ... -Name[th]=ติดตั้ง... -Name[tr]=Kurulum... -Name[uk]=Встановити... -Name[uz]=Oʻrnatish -Name[uz@cyrillic]=Ўрнатиш -Name[ven]=Vhekanya... -Name[vi]=Thiết lập... -Name[xh]=Iyacwangciswa... -Name[zh_CN]=设置... -Name[zh_TW]=設定... -Name[zu]=Iyalungiselela... -Icon=kscreensaver - -[Desktop Action InWindow] -Exec=kwave.kss -window-id %w -Name=Display in Specified Window -Name[bg]=Стартиране в избран прозорец -Name[br]=Diskwel er prenestr spisaet -Name[bs]=Prikaži u navedenom prozoru -Name[ca]=Mostra a la finestra especificada -Name[cs]=Zobrazit v určeném okně -Name[cy]=Dangos mewn Ffenestr Benodol -Name[da]=Visning i angivet vindue -Name[de]=In bestimmten Fenster anzeigen -Name[el]=Προβολή στο καθορισμένο παράθυρο -Name[eo]=Montri en indikita fenestro -Name[es]=Mostrar en la ventana especificada -Name[et]=Määratud aknas näitamine -Name[eu]=Bistaratu zehaztutako lehioan -Name[fa]=نمایش در پنجرۀ مشخصشده -Name[fi]=Näytä määrätyssä ikkunassa -Name[fr]=Affichage dans la fenêtre spécifiée -Name[fy]=Werjefte yn in definiearre finster -Name[ga]=Taispeáin san Fhuinneog Sonraithe -Name[gl]=Mostrar na fiestra indicada -Name[he]=הצג בחלון המצוין -Name[hi]=निर्दिष्ट विंडो में प्रदर्शित करें -Name[hu]=Megjelenítés a megadott ablakban -Name[is]=Birta í völdum glugga -Name[it]=Mostra nella finestra specificata -Name[ja]=特定のウィンドウで表示 -Name[ka]=ჩვენება მითითებულ ფანჯარაში -Name[lt]=Rodyti nurodytame lange -Name[mk]=Прикажи во наведениот прозорец -Name[ms]=Papar dalam Tetingkap Yang Dinyatakan -Name[nb]=Vis i angitt vindu -Name[nds]=In utsöcht Finster wiesen -Name[ne]=निर्दिष्ट सञ्झ्यालमा प्रदर्शन -Name[nl]=Weergeven in een opgegeven venster -Name[nn]=Vis i oppgjeve vindauge -Name[pa]=ਦੱਸੇ ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ -Name[pl]=Wyświetl w zadanym oknie -Name[pt]=Mostrar na Janela Indicada -Name[pt_BR]=Mostrar em janela especificada -Name[ro]=Afişează în fereastra specificată -Name[ru]=Показывать в указанном окне -Name[rw]=Kwerekana mu Idirishya Ryihariye -Name[sk]=Zobraziť v zadanom okne -Name[sl]=Prikaz v določenemu oknu -Name[sr]=Прикажи у наведеном прозору -Name[sr@Latn]=Prikaži u navedenom prozoru -Name[sv]=Visa i angivet fönster -Name[ta]=குறித்த சாளரத்தில் காட்டு -Name[tg]=Дар тирезаи нишондода намоиш намоед -Name[tr]=Belirtilen Pencerede Göster -Name[uk]=Відобразити у вказаному вікні -Name[vi]=Hiển thị trong Cửa sổ Đã định -Name[zh_CN]=在指定的窗口中显示 -Name[zh_TW]=在指定的視窗中顯示 -NoDisplay=true - -[Desktop Action Root] -Exec=kwave.kss -root -Name=Display in Root Window -Name[bg]=Стартиране в главния прозорец -Name[br]=Diskwel er prenestr gwrizienn -Name[bs]=Prikaži u korijenskom prozoru -Name[ca]=Mostra a la finestra arrel -Name[cs]=Zobrazit na pozadí plochy -Name[cy]=Dangos mewn Ffenestr Wraidd -Name[da]=Visning i root-vindue -Name[de]=In Hintergrundfenster anzeigen -Name[el]=Προβολή στο βασικό παράθυρο -Name[eo]=Montri en radika fenestro -Name[es]=Mostrar en la ventana raíz -Name[et]=Juuraknas näitamine -Name[eu]=Bistaratu erro lehioan -Name[fa]=نمایش در پنجرۀ ریشه -Name[fi]=Näytä juuri-ikkunassa -Name[fr]=Affichage dans la fenêtre racine -Name[fy]=Werjefte yn haadfinster -Name[ga]=Taispeáin sa bhFréamhfhuinneog -Name[gl]=Mostrar na fiestra raiz -Name[he]=הצג בחלון השורש -Name[hi]=रूट विंडो में प्रदर्शित करें -Name[hu]=Megjelenítés a gyökérablakban -Name[is]=Birta í rótarglugganum -Name[it]=Mostra sullo sfondo -Name[ja]=ルートウィンドウで表示 -Name[ka]=ჩვენება ძირითად ფანჯარაში -Name[lt]=Rodyti root lange -Name[mk]=Прикажи во коренскиот прозорец -Name[ms]=Papar dalam Tetingkap Root -Name[nb]=Vis i root-vindu -Name[nds]=In Hööftfinster wiesen -Name[ne]=मूल सञ्झ्यालमा प्रदर्शन -Name[nl]=Weergeven in hoofdvenster -Name[nn]=Vis i rotvindauget -Name[pa]=Root ਝਰੋਖੇ ਵਿੱਚ ਵੇਖਾਓ -Name[pl]=Wyświetl w oknie głównym -Name[pt]=Mostrar na Janela de Fundo -Name[pt_BR]=Mostrar na janela raiz -Name[ro]=Afişează în fereastra rădăcină -Name[ru]=Показывать в корневом окне -Name[rw]=Kwerekana mu Idirishya Umuzi -Name[sk]=Zobraziť v koreňovom okne -Name[sl]=Prikaz v korenskem oknu -Name[sr]=Прикажи у главном (root) прозору -Name[sr@Latn]=Prikaži u glavnom (root) prozoru -Name[sv]=Visa i rotfönstret -Name[ta]=ஆரம்ப சாளரத்தில் காட்டு -Name[tg]=Дар тирезаи решагӣ намоиш намоед -Name[tr]=Kök Pencerede Göster -Name[uk]=Відобразити в кореневому вікні -Name[vi]=Hiển thị trong Cửa sổ Gốc -Name[zh_CN]=在根窗口中显示 -Name[zh_TW]=在根視窗中顯示 -NoDisplay=true diff --git a/kscreensaver/kdesavers/Makefile.am b/kscreensaver/kdesavers/Makefile.am deleted file mode 100644 index f5901663..00000000 --- a/kscreensaver/kdesavers/Makefile.am +++ /dev/null @@ -1,109 +0,0 @@ -# $Id$ -# Makefile.am for kscreensaver. -# - -SUBDIRS = . data - -AM_CPPFLAGS = -UQT_NO_ASCII_CAST - -INCLUDES = $(all_includes) $(GLINC) $(LIBART_CFLAGS) -AM_LDFLAGS = $(all_libraries) $(KDE_RPATH) $(LIB_QT) -lDCOP $(LIB_TDECORE) $(LIB_TDEUI) -ltdefx $(LIB_KIO) -lktexteditor -AM_LDADD = $(LIB_TDEUI) -lkscreensaver - -if COMPILE_X11_KSAVERS -X11_KSAVERS = kscience.kss -X11_DESKTOP_FILES = KScience.desktop -endif - -if COMPILE_LIBART_KSAVERS -LIBART_KSAVERS = kclock.kss -LIBART_DESKTOP_FILES = KClock.desktop -endif -LIBART_KSAVERS_LDADD = $(AM_LDADD) $(LIBART_LIBS) - -if COMPILE_ARTS_GL_KSAVERS -ARTS_GL_KSAVERS = kfiresaver.kss -ARTS_GL_DESKTOP_FILES = KFiresaver.desktop -endif - -if COMPILE_GL_KSAVERS -GL_KSAVERS=kfountain.kss kwave.kss kgravity.kss kflux.kss keuphoria.kss ksolarwinds.kss krotation.kss kpendulum.kss -GL_DESKTOP_FILES=KGravity.desktop KWave.desktop KFountain.desktop KFlux.desktop KEuphoria.desktop KSolarWinds.desktop KRotation.desktop KPendulum.desktop -endif -GL_KSAVERS_LDADD = $(AM_LDADD) $(GLLIB) - -bin_PROGRAMS = kbanner.kss kpolygon.kss kslideshow.kss \ - klines.kss klorenz.kss kblob.kss kvm.kss \ - $(X11_KSAVERS) $(LIBART_KSAVERS) $(ARTS_GL_KSAVERS) $(GL_KSAVERS) - -# The "normal" screensavers -kbanner_kss_SOURCES = banner.cpp -kbanner_kss_LDADD = $(AM_LDADD) -kpolygon_kss_SOURCES = polygon.cpp -kpolygon_kss_LDADD = $(AM_LDADD) -kslideshow_kss_SOURCES = slideshow.cpp slideshowcfg.ui -kslideshow_kss_LDADD = $(LIB_KFILE) $(AM_LDADD) $(LIB_KSYCOCA) -lm -klines_kss_SOURCES = lines.cpp -klines_kss_LDADD = $(AM_LDADD) -klorenz_kss_SOURCES = lorenz.cpp -klorenz_kss_LDADD = $(AM_LDADD) -lm -kblob_kss_SOURCES = blob.cpp -kblob_kss_LDADD = $(AM_LDADD) -lm -kvm_kss_SOURCES = kvm.cpp vm.c vm_random.c -kvm_kss_LDADD = $(AM_LDADD) -kscience_kss_SOURCES = science.cpp -kscience_kss_LDADD = $(AM_LDADD) -lm - -# The GL screensavers -kfountain_kss_SOURCES = fountain.cpp fountaincfg.ui -kfountain_kss_LDADD = $(GL_KSAVERS_LDADD) -lm -kwave_kss_SOURCES = wave.cpp wavecfg.ui -kwave_kss_LDADD = $(GL_KSAVERS_LDADD) -lm -kgravity_kss_SOURCES = gravity.cpp gravitycfg.ui -kgravity_kss_LDADD = $(GL_KSAVERS_LDADD) -lm -kflux_kss_SOURCES = Flux.cpp -kflux_kss_LDADD = $(GL_KSAVERS_LDADD) -lm -keuphoria_kss_SOURCES = Euphoria.cpp -keuphoria_kss_LDADD = $(GL_KSAVERS_LDADD) -lm -ksolarwinds_kss_SOURCES = SolarWinds.cpp -ksolarwinds_kss_LDADD = $(GL_KSAVERS_LDADD) -lm -krotation_kss_SOURCES = rotation.cpp rotationcfg.ui sspreviewarea.cpp rkodesolver.cpp vec3.cpp -krotation_kss_LDADD = $(GL_KSAVERS_LDADD) -lm -kpendulum_kss_SOURCES = pendulum.cpp pendulumcfg.ui sspreviewarea.cpp rkodesolver.cpp -kpendulum_kss_LDADD = $(GL_KSAVERS_LDADD) -lm -kfiresaver_kss_SOURCES = firesaversetup.ui firesaverparticle.cpp firesaverwriter.cpp firesaver.cpp -kfiresaver_kss_LDADD = $(GL_KSAVERS_LDADD) -lartskde -lm - -# The LIBART screensavers -kclock_kss_SOURCES = kclock.cpp -kclock_kss_LDADD = $(LIBART_KSAVERS_LDADD) - -METASOURCES = AUTO - -noinst_HEADERS = banner.h polygon.h slideshow.h lines.h\ - lorenz.h blob.h kvm.h vm.h vm_random.h science.h \ - fountain.h wave.h gravity.h kclock.h\ - rotation.h pendulum.h sspreviewarea.h rkodesolver.h vec3.h\ - firesaver.h firesaverparticle.h firesaversetup.ui.h\ - firesaverwriter.h - -########## Meta objects ########## - -pics_DATA = kscience.png particle.png image.png -picsdir = $(kde_datadir)/kscreensaver - -if COMPILE_LIBART_KSAVERS -desktop_DATA = KBanner.desktop KPolygon.desktop \ - KSlideshow.desktop KLines-saver.desktop KLorenz.desktop \ - KBlob.desktop KVm.desktop \ - $(X11_DESKTOP_FILES) $(GL_DESKTOP_FILES) $(LIBART_DESKTOP_FILES) $(ARTS_GL_DESKTOP_FILES) -else -desktop_DATA = KBanner.desktop KPolygon.desktop \ - KSlideshow.desktop KLines-saver.desktop KLorenz.desktop \ - KBlob.desktop KVm.desktop \ - KClock.desktop $(X11_DESKTOP_FILES) $(GL_DESKTOP_FILES) $(LIBART_DESKTOP_FILES) $(ARTS_GL_DESKTOP_FILES) -endif - -desktopdir = $(kde_appsdir)/System/ScreenSavers - -EXTRA_DIST = $(desktop_DATA) vm.xpm vm.xbm kscience.png particle.png image.png diff --git a/kscreensaver/kdesavers/README b/kscreensaver/kdesavers/README deleted file mode 100644 index 694adefd..00000000 --- a/kscreensaver/kdesavers/README +++ /dev/null @@ -1,3 +0,0 @@ -These are native KDE screensavers using the libkscreensaver library. -If you are writing a screensaver for KDE use these as references rather -than the ported savers. diff --git a/kscreensaver/kdesavers/SolarWinds.cpp b/kscreensaver/kdesavers/SolarWinds.cpp deleted file mode 100644 index b464a8de..00000000 --- a/kscreensaver/kdesavers/SolarWinds.cpp +++ /dev/null @@ -1,778 +0,0 @@ -//============================================================================ -// -// Terence Welsh Screensaver - Solar Winds -// http://www.reallyslick.com/ -// -// Ported to KDE by Karl Robillard -// -/* - * Copyright (C) 2002 Terence M. Welsh - * - * Solar Winds is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * Solar Winds is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ -//============================================================================ - - -#include <stdio.h> -#include <math.h> -#include <stdlib.h> -#include <time.h> -#include <tqtimer.h> -#include "SolarWinds.h" -#include "SolarWinds.moc" - - -#define NUMCONSTS 9 -#define PIx2 6.28318530718f -#define DEG2RAD 0.0174532925f - - -// Useful random number macro -// Don't forget to initialize with srand() - -// This is the original myRandf() which does not work on Linux. -// I grabed the inline version from Flux.cpp. -//#define myRandf(x) (float(rand()) * (x * 0.0000305185095f)) - -inline float myRandf(float x){ - return(float(rand() * x) / float(RAND_MAX)); -} - - -// Context pointer to allow many instances. -static SWindsWidget* _ec = 0; - - -struct Emitter -{ - float x, y, z; -}; - - -struct Particle -{ - float x, y, z; - float r, g, b; -}; - - -class wind -{ -public: - - wind(); - ~wind(); - void update(); - - Emitter* emitters; - Particle* particles; - int** linelist; - int* lastparticle; - int whichparticle; - int partCount; - int emitCount; - bool useLines; - float c[NUMCONSTS]; - float ct[NUMCONSTS]; - float cv[NUMCONSTS]; -}; - - -wind::wind() -{ - int i; - - partCount = _ec->dParticles; - emitCount = _ec->dEmitters; - useLines = (_ec->dGeometry == 2); - - emitters = new Emitter[emitCount]; - for(i=0; i<emitCount; i++) - { - emitters[i].x = myRandf(60.0f) - 30.0f; - emitters[i].y = myRandf(60.0f) - 30.0f; - emitters[i].z = myRandf(30.0f) - 15.0f; - } - - particles = new Particle[partCount]; - for(i=0; i<partCount; i++) - { - particles[i].x = 0.0f; - particles[i].y = 0.0f; - particles[i].z = 100.0f; // start particles behind viewer - } - - whichparticle = 0; - - if( useLines ) - { - linelist = new int*[partCount]; - for(i=0; i<partCount; i++) - { - linelist[i] = new int[2]; - linelist[i][0] = -1; - linelist[i][1] = -1; - } - lastparticle = new int[emitCount]; - for(i=0; i<emitCount; i++) - lastparticle[i] = i; - } - - float windspeed = (float) (_ec->dWindspeed); - for(i=0; i<NUMCONSTS; i++) - { - ct[i] = myRandf(PIx2); - cv[i] = myRandf(0.00005f * windspeed * windspeed) - + 0.00001f * windspeed * windspeed; - //printf( "KR ct %g cv %g\n", ct[i], cv[i] ); - } -} - - -wind::~wind() -{ - delete[] emitters; - delete[] particles; - - if( useLines ) - { - int i; - for(i=0; i<partCount; i++) - delete[] linelist[i]; - delete[] linelist; - delete[] lastparticle; - } -} - - -void wind::update() -{ - int i; - float x, y, z; - float temp; - float particleSpeed = (float) _ec->dParticlespeed; - - float evel = float(_ec->dEmitterspeed) * 0.01f; - float pvel = particleSpeed * 0.01f; - float pointsize = 0.04f * _ec->dSize; - float linesize = 0.005f * _ec->dSize; - - // update constants - for(i=0; i<NUMCONSTS; i++) - { - ct[i] += cv[i]; - if(ct[i] > PIx2) - ct[i] -= PIx2; - c[i] = cos(ct[i]); - } - - // calculate emissions - for(i=0; i<emitCount; i++) - { - emitters[i].z += evel; // emitter moves toward viewer - if(emitters[i].z > 15.0f) - { - // reset emitter - emitters[i].x = myRandf(60.0f) - 30.0f; - emitters[i].y = myRandf(60.0f) - 30.0f; - emitters[i].z = -15.0f; - } - - particles[whichparticle].x = emitters[i].x; - particles[whichparticle].y = emitters[i].y; - particles[whichparticle].z = emitters[i].z; - - if( useLines ) - { - // link particles to form lines - if(linelist[whichparticle][0] >= 0) - linelist[linelist[whichparticle][0]][1] = -1; - linelist[whichparticle][0] = -1; - if(emitters[i].z == -15.0f) - linelist[whichparticle][1] = -1; - else - linelist[whichparticle][1] = lastparticle[i]; - linelist[lastparticle[i]][0] = whichparticle; - lastparticle[i] = whichparticle; - } - - whichparticle++; - if(whichparticle >= partCount) - whichparticle = 0; - } - - // calculate particle positions and colors - // first modify constants that affect colors - c[6] *= 9.0f / particleSpeed; - c[7] *= 9.0f / particleSpeed; - c[8] *= 9.0f / particleSpeed; - // then update each particle - for(i=0; i<partCount; i++) - { - Particle* part = particles + i; - - // store old positions - x = part->x; - y = part->y; - z = part->z; - - // make new positins - part->x = x + (c[0] * y + c[1] * z) * pvel; - part->y = y + (c[2] * z + c[3] * x) * pvel; - part->z = z + (c[4] * x + c[5] * y) * pvel; - - // calculate colors - part->r = fabs((part->x - x) * c[6]); - part->g = fabs((part->y - y) * c[7]); - part->b = fabs((part->z - z) * c[8]); - - // clamp colors - if( part->r > 1.0f ) - part->r = 1.0f; - if( part->g > 1.0f ) - part->g = 1.0f; - if( part->b > 1.0f ) - part->b = 1.0f; - } - - // draw particles - switch(_ec->dGeometry) - { - case 0: // lights - for(i=0; i<partCount; i++) - { - glColor3fv(&particles[i].r); - glPushMatrix(); - glTranslatef(particles[i].x, particles[i].y, particles[i].z); - glCallList(1); - glPopMatrix(); -#if 0 - if( i == 0 ) - printf( "KR %d %g %g %g\n", i, - particles[i].x, particles[i].y, particles[i].z); -#endif - } - break; - - case 1: // points - for(i=0; i<partCount; i++) - { - temp = particles[i].z + 40.0f; - if(temp < 0.01f) - temp = 0.01f; - glPointSize(pointsize * temp); - - glBegin(GL_POINTS); - glColor3fv(&particles[i].r); - glVertex3fv(&particles[i].x); - glEnd(); - } - break; - - case 2: // lines - for(i=0; i<partCount; i++) - { - temp = particles[i].z + 40.0f; - if(temp < 0.01f) - temp = 0.01f; - glLineWidth(linesize * temp); - - glBegin(GL_LINES); - if(linelist[i][1] >= 0) - { - glColor3fv(&particles[i].r); - if(linelist[i][0] == -1) - glColor3f(0.0f, 0.0f, 0.0f); - glVertex3fv(&particles[i].x); - - glColor3fv(&particles[linelist[i][1]].r); - if(linelist[linelist[i][1]][1] == -1) - glColor3f(0.0f, 0.0f, 0.0f); - glVertex3fv(&particles[linelist[i][1]].x); - } - glEnd(); - } - } -} - - -//---------------------------------------------------------------------------- - - -SWindsWidget::SWindsWidget( TQWidget* parent, const char* name ) - : TQGLWidget(parent, name), _winds(0) -{ - setDefaults( Regular ); - - _frameTime = 1000 / 60; - _timer = new TQTimer( this ); - connect( _timer, TQT_SIGNAL(timeout()), this, TQT_SLOT(nextFrame()) ); -} - - -SWindsWidget::~SWindsWidget() -{ - // Free memory - delete[] _winds; -} - - -void SWindsWidget::paintGL() -{ - glLoadIdentity(); - - if( ! dBlur ) - { - glClear(GL_COLOR_BUFFER_BIT); - } - else - { - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glColor4f(0.0f, 0.0f, 0.0f, 0.5f - (float(dBlur) * 0.0049f)); - - glBegin(GL_QUADS); - glVertex3f(-40.0f, -17.0f, 0.0f); - glVertex3f(40.0f, -17.0f, 0.0f); - glVertex3f(40.0f, 17.0f, 0.0f); - glVertex3f(-40.0f, 17.0f, 0.0f); - glEnd(); - - if(!dGeometry) - glBlendFunc(GL_ONE, GL_ONE); - else - glBlendFunc(GL_SRC_ALPHA, GL_ONE); // Necessary for point and line smoothing (I don't know why) - // Maybe it's just my video card... - } - - // You should need to draw twice if using blur, once to each buffer. - // But wglSwapLayerBuffers appears to copy the back to the - // front instead of just switching the pointers to them. It turns - // out that both NVidia and 3dfx prefer to use PFD_SWAP_COPY instead - // of PFD_SWAP_EXCHANGE in the PIXELFORMATDESCRIPTOR. I don't know why... - // So this may not work right on other platforms or all video cards. - - // Update surfaces - if( _winds ) - { - _ec = this; - int i; - for(i=0; i<dWinds; i++) - _winds[i].update(); - } - - glFlush(); -} - - -void SWindsWidget::resizeGL( int w, int h ) -{ - glViewport(0, 0, w, h ); - - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - gluPerspective(90.0, (float) w / (float) h, 1.0, 10000); - glTranslatef(0.0, 0.0, -15.0); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); -} - - -// Window initialization -void SWindsWidget::initializeGL() -{ - updateParameters(); - _timer->start( _frameTime, true ); -} - - -#ifdef UNIT_TEST -void SWindsWidget::keyPressEvent( TQKeyEvent* e ) -{ - if( e->key() == TQt::Key_0 ) { setDefaults( 0 ); updateParameters(); } - if( e->key() == TQt::Key_1 ) { setDefaults( 1 ); updateParameters(); } - if( e->key() == TQt::Key_2 ) { setDefaults( 2 ); updateParameters(); } - if( e->key() == TQt::Key_3 ) { setDefaults( 3 ); updateParameters(); } - if( e->key() == TQt::Key_4 ) { setDefaults( 4 ); updateParameters(); } - if( e->key() == TQt::Key_5 ) { setDefaults( 5 ); updateParameters(); } -} -#endif - - -void SWindsWidget::nextFrame() -{ - updateGL(); - _timer->start( _frameTime, true ); -} - - -void SWindsWidget::updateParameters() -{ - int i, j; - float x, y, temp; - - srand((unsigned)time(NULL)); - rand(); rand(); rand(); rand(); rand(); - - glClearColor(0.0f, 0.0f, 0.0f, 1.0f); - glClear(GL_COLOR_BUFFER_BIT); - - if(!dGeometry) - glBlendFunc(GL_ONE, GL_ONE); - else - glBlendFunc(GL_SRC_ALPHA, GL_ONE); // Necessary for point and line smoothing (I don't know why) - glEnable(GL_BLEND); - - if( ! dGeometry ) - { - // Init lights - for(i=0; i<LIGHTSIZE; i++) - { - for(j=0; j<LIGHTSIZE; j++) - { - x = float(i - LIGHTSIZE / 2) / float(LIGHTSIZE / 2); - y = float(j - LIGHTSIZE / 2) / float(LIGHTSIZE / 2); - temp = 1.0f - float(sqrt((x * x) + (y * y))); - if(temp > 1.0f) - temp = 1.0f; - if(temp < 0.0f) - temp = 0.0f; - lightTexture[i][j] = (unsigned char) (255.0f * temp); - } - } - - glEnable(GL_TEXTURE_2D); - glBindTexture(GL_TEXTURE_2D, 1); - glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexImage2D(GL_TEXTURE_2D, 0, 1, LIGHTSIZE, LIGHTSIZE, 0, - GL_LUMINANCE, GL_UNSIGNED_BYTE, lightTexture); - - temp = 0.02f * dSize; - glNewList(1, GL_COMPILE); - glBindTexture(GL_TEXTURE_2D, 1); - glBegin(GL_TRIANGLE_STRIP); - glTexCoord2f(0.0f, 0.0f); - glVertex3f(-temp, -temp, 0.0f); - glTexCoord2f(1.0f, 0.0f); - glVertex3f(temp, -temp, 0.0f); - glTexCoord2f(0.0f, 1.0f); - glVertex3f(-temp, temp, 0.0f); - glTexCoord2f(1.0f, 1.0f); - glVertex3f(temp, temp, 0.0f); - glEnd(); - glEndList(); - } - else if(dGeometry == 1) - { - // init point smoothing - glEnable(GL_POINT_SMOOTH); - glHint(GL_POINT_SMOOTH_HINT, GL_NICEST); - - glDisable(GL_TEXTURE_2D); - } - else if(dGeometry == 2) - { - // init line smoothing - glEnable(GL_LINE_SMOOTH); - glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); - - glDisable(GL_TEXTURE_2D); - } - - - // Initialize surfaces - _ec = this; - delete[] _winds; - _winds = new wind[dWinds]; -} - - -/** - May be called at any time - makes no OpenGL calls. -*/ -void SWindsWidget::setDefaults(int which) -{ - switch(which) - { - case CosmicStrings: - dWinds = 1; - dEmitters = 50; - dParticles = 3000; - dGeometry = 2; - dSize = 20; - dWindspeed = 10; - dEmitterspeed = 10; - dParticlespeed = 10; - dBlur = 10; - break; - - case ColdPricklies: - dWinds = 1; - dEmitters = 300; - dParticles = 3000; - dGeometry = 2; - dSize = 5; - dWindspeed = 20; - dEmitterspeed = 100; - dParticlespeed = 15; - dBlur = 70; - break; - - case SpaceFur: - dWinds = 2; - dEmitters = 400; - dParticles = 1600; - dGeometry = 2; - dSize = 15; - dWindspeed = 20; - dEmitterspeed = 15; - dParticlespeed = 10; - dBlur = 0; - break; - - case Jiggly: - dWinds = 1; - dEmitters = 40; - dParticles = 1200; - dGeometry = 1; - dSize = 20; - dWindspeed = 100; - dEmitterspeed = 20; - dParticlespeed = 4; - dBlur = 50; - break; - - case Undertow: - dWinds = 1; - dEmitters = 400; - dParticles = 1200; - dGeometry = 0; - dSize = 40; - dWindspeed = 20; - dEmitterspeed = 1; - dParticlespeed = 100; - dBlur = 50; - break; - - case Regular: - default: - dWinds = 1; - dEmitters = 30; - dParticles = 2000; - dGeometry = 0; - dSize = 50; - dWindspeed = 20; - dEmitterspeed = 15; - dParticlespeed = 10; - dBlur = 40; - break; - } -} - - -//---------------------------------------------------------------------------- - - -#ifndef UNIT_TEST -#include <klocale.h> -#include <kglobal.h> -#include <kconfig.h> - - -// libkscreensaver interface -extern "C" -{ - KDE_EXPORT const char* kss_applicationName = "ksolarwinds.kss"; - KDE_EXPORT const char* kss_description = I18N_NOOP( "Solar Winds" ); - KDE_EXPORT const char* kss_version = "1.0"; - - KDE_EXPORT KScreenSaver* kss_create( WId id ) - { - return new KSWindsScreenSaver( id ); - } - - KDE_EXPORT TQDialog* kss_setup() - { - return new KSWindsSetup; - } -} - - -//---------------------------------------------------------------------------- - - -KSWindsScreenSaver::KSWindsScreenSaver( WId id ) : KScreenSaver( id ) -{ - _flux = new SWindsWidget; - - readSettings(); - - embed( _flux ); - _flux->show(); -} - - -KSWindsScreenSaver::~KSWindsScreenSaver() -{ -} - - -static int filterRandom( int n ) -{ - if( (n < 0) || (n >= SWindsWidget::DefaultModes) ) - { - srand((unsigned)time(NULL)); - n = rand() % SWindsWidget::DefaultModes; - } - return n; -} - - -void KSWindsScreenSaver::readSettings() -{ - TDEConfig* config = TDEGlobal::config(); - config->setGroup("Settings"); - - _mode = config->readNumEntry( "Mode", SWindsWidget::Regular ); - _flux->setDefaults( filterRandom(_mode) ); -} - - -/** - Any invalid mode will select one at random. -*/ -void KSWindsScreenSaver::setMode( int id ) -{ - _mode = id; - _flux->setDefaults( filterRandom(id) ); - _flux->updateParameters(); -} - - -//---------------------------------------------------------------------------- - - -#include <tqlayout.h> -#include <tqlabel.h> -#include <tqcombobox.h> -#include <kmessagebox.h> - - -static const char* defaultText[] = -{ - I18N_NOOP( "Regular" ), - I18N_NOOP( "Cosmic Strings" ), - I18N_NOOP( "Cold Pricklies" ), - I18N_NOOP( "Space Fur" ), - I18N_NOOP( "Jiggly" ), - I18N_NOOP( "Undertow" ), - I18N_NOOP( "(Random)" ), - 0 -}; - - -KSWindsSetup::KSWindsSetup( TQWidget* parent, const char* name ) - : KDialogBase( parent, name, true, i18n( "Setup Solar Wind" ), - Ok|Cancel|Help, Ok, true ) -{ - setButtonText( Help, i18n( "A&bout" ) ); - TQWidget *main = makeMainWidget(); - - TQHBoxLayout* top = new TQHBoxLayout( main, 0, spacingHint() ); - - TQVBoxLayout* leftCol = new TQVBoxLayout; - top->addLayout( leftCol ); - - TQLabel* label = new TQLabel( i18n("Mode:"), main ); - leftCol->addWidget( label ); - - modeW = new TQComboBox( main ); - int i = 0; - while (defaultText[i]) - modeW->insertItem( i18n(defaultText[i++]) ); - leftCol->addWidget( modeW ); - - leftCol->addStretch(); - - // Preview - TQWidget* preview; - preview = new TQWidget( main ); - preview->setFixedSize( 220, 165 ); - preview->setBackgroundColor( black ); - preview->show(); // otherwise saver does not get correct size - _saver = new KSWindsScreenSaver( preview->winId() ); - top->addWidget(preview); - - // Now that we have _saver... - modeW->setCurrentItem( _saver->mode() ); // set before we connect - connect( modeW, TQT_SIGNAL(activated(int)), _saver, TQT_SLOT(setMode(int)) ); -} - - -KSWindsSetup::~KSWindsSetup() -{ - delete _saver; -} - - -void KSWindsSetup::slotHelp() -{ - KMessageBox::about(this, - i18n("<h3>Solar Winds 1.0</h3>\n<p>Copyright (c) 2002 Terence M. Welsh<br>\n<a href=\"http://www.reallyslick.com/\">http://www.reallyslick.com/</a></p>\n\n<p>Ported to KDE by Karl Robillard</p>"), - TQString(), KMessageBox::AllowLink); -} - - -/** - Ok pressed - save settings and exit -*/ -void KSWindsSetup::slotOk() -{ - TDEConfig* config = TDEGlobal::config(); - config->setGroup("Settings"); - - TQString val; - val.setNum( modeW->currentItem() ); - config->writeEntry("Mode", val ); - - config->sync(); - accept(); -} -#endif - - -//---------------------------------------------------------------------------- - - -#ifdef UNIT_TEST -// moc SolarWinds.h -o SolarWinds.moc -// g++ -g -DUNIT_TEST SolarWinds.cpp -I/usr/lib/qt3/include -lqt -L/usr/lib/qt3/lib -lGLU -lGL - -#include <tqapplication.h> - -int main( int argc, char** argv ) -{ - TQApplication app( argc, argv ); - - SWindsWidget w; - app.setMainWidget( &w ); - w.show(); - - return app.exec(); -} -#endif - - -//EOF diff --git a/kscreensaver/kdesavers/SolarWinds.h b/kscreensaver/kdesavers/SolarWinds.h deleted file mode 100644 index 1ad445d4..00000000 --- a/kscreensaver/kdesavers/SolarWinds.h +++ /dev/null @@ -1,141 +0,0 @@ -#ifndef __SOLARWINDS_H__ -#define __SOLARWINDS_H__ -//============================================================================ -// -// Terence Welsh Screensaver - Solar Winds -// http://www.reallyslick.com/ -// -// Ported to KDE by Karl Robillard -// -//============================================================================ - - -#include <tqgl.h> - - -#define LIGHTSIZE 64 - - -class wind; -class TQTimer; - -class SWindsWidget : public TQGLWidget -{ - Q_OBJECT - - -public: - - enum eDefault - { - Regular, - CosmicStrings, - ColdPricklies, - SpaceFur, - Jiggly, - Undertow, - - DefaultModes - }; - - SWindsWidget( TQWidget* parent=0, const char* name=0 ); - ~SWindsWidget(); - - void updateParameters(); - void setDefaults( int which ); - -protected: - - void paintGL(); - void resizeGL( int w, int h ); - void initializeGL(); -#ifdef UNIT_TEST - void keyPressEvent( TQKeyEvent* ); -#endif - -private slots: - - void nextFrame(); - -private: - - wind* _winds; - unsigned char lightTexture[LIGHTSIZE][LIGHTSIZE]; - - int dWinds; - int dEmitters; - int dParticles; - int dGeometry; - float dSize; - int dParticlespeed; - int dEmitterspeed; - int dWindspeed; - int dBlur; - - - // Using TQTimer rather than timerEvent() to avoid getting locked out of - // the TQEvent loop on lower-end systems. Ian Geiser <[email protected]> - // says this is the way to go. - TQTimer* _timer; - int _frameTime; - - friend class wind; -}; - - -#ifndef UNIT_TEST -#include <kdialogbase.h> -#include <kscreensaver.h> - - -class KSWindsScreenSaver : public KScreenSaver -{ - Q_OBJECT - - -public: - - KSWindsScreenSaver( WId id ); - virtual ~KSWindsScreenSaver(); - - int mode() const { return _mode; } - -public slots: - - void setMode( int ); - -private: - - void readSettings(); - - SWindsWidget* _flux; - int _mode; -}; - - -class TQComboBox; - -class KSWindsSetup : public KDialogBase -{ - Q_OBJECT - - -public: - - KSWindsSetup( TQWidget* parent = 0, const char* name = 0 ); - ~KSWindsSetup(); - -private slots: - - void slotHelp(); - void slotOk(); - -private: - - TQComboBox* modeW; - KSWindsScreenSaver* _saver; -}; -#endif - - -#endif //__SOLARWINDS_H__ diff --git a/kscreensaver/kdesavers/banner.cpp b/kscreensaver/kdesavers/banner.cpp deleted file mode 100644 index a1672b27..00000000 --- a/kscreensaver/kdesavers/banner.cpp +++ /dev/null @@ -1,509 +0,0 @@ -//----------------------------------------------------------------------------- -// -// kbanner - Basic screen saver for KDE -// -// Copyright (c) Martin R. Jones 1996 -// -// layout management added 1998/04/19 by Mario Weilguni <[email protected]> -// clock function and color cycling added 2000/01/09 by Alexander Neundorf <[email protected]> -// 2001/03/04 Converted to use libkscreensaver by Martin R. Jones -// 2002/04/07 Added random vertical position of text, -// changed horizontal step size to reduce jerkyness, -// text will return to right margin immediately (and not be drawn half a screen width off-screen) -// Harald H.-J. Bongartz <[email protected]> -// 2003/09/06 Converted to use KDialogBase - Nadeem Hasan <[email protected]> -#include <stdlib.h> - -#include <tqlabel.h> -#include <tqlineedit.h> -#include <tqcombobox.h> -#include <tqcheckbox.h> -#include <tqgroupbox.h> -#include <tqslider.h> -#include <tqlayout.h> -#include <tqdatetime.h> -#include <tqfontdatabase.h> -#include <tqpainter.h> - -#include <kapplication.h> -#include <krandomsequence.h> -#include <kglobal.h> -#include <klocale.h> -#include <kconfig.h> -#include <kmessagebox.h> -#include <kcolorbutton.h> -#include <kfontcombo.h> - -#include "banner.h" -#include "banner.moc" - -// libkscreensaver interface -extern "C" -{ - KDE_EXPORT const char *kss_applicationName = "kbanner.kss"; - KDE_EXPORT const char *kss_description = I18N_NOOP( "KBanner" ); - KDE_EXPORT const char *kss_version = "2.2.0"; - - KDE_EXPORT KScreenSaver *kss_create( WId id ) - { - return new KBannerSaver( id ); - } - - KDE_EXPORT TQDialog *kss_setup() - { - return new KBannerSetup(); - } -} - -//----------------------------------------------------------------------------- - -KBannerSetup::KBannerSetup( TQWidget *parent, const char *name ) - : KDialogBase( parent, name, true, i18n( "Setup Banner Screen Saver" ), - Ok|Cancel|Help, Ok, true ), saver( 0 ), ed(0), speed( 50 ) -{ - setButtonText( Help, i18n( "A&bout" ) ); - readSettings(); - - TQWidget *main = makeMainWidget(); - - TQLabel *label; - - TQVBoxLayout *tl = new TQVBoxLayout(main, 0, spacingHint()); - TQHBoxLayout *tl1 = new TQHBoxLayout( 0, 0, spacingHint() ); - tl->addLayout(tl1); - TQVBoxLayout *tl11 = new TQVBoxLayout( 0, 0, spacingHint() ); - tl1->addLayout(tl11); - - TQGroupBox *group = new TQGroupBox( 0,Qt::Vertical, i18n("Font"), main ); - TQGridLayout *gl = new TQGridLayout(group->layout(), 6, 2, spacingHint() ); - - label = new TQLabel( i18n("Family:"), group ); - gl->addWidget(label, 1, 0); - - KFontCombo* comboFonts = new KFontCombo( TQFontDatabase().families(), group ); - comboFonts->setCurrentFont( fontFamily ); - gl->addWidget(comboFonts, 1, 1); - connect( comboFonts, TQT_SIGNAL( activated( const TQString& ) ), - TQT_SLOT( slotFamily( const TQString& ) ) ); - - label = new TQLabel( i18n("Size:"), group ); - gl->addWidget(label, 2, 0); - - comboSizes = new TQComboBox( TRUE, group ); - fillFontSizes(); - gl->addWidget(comboSizes, 2, 1); - connect( comboSizes, TQT_SIGNAL( activated( int ) ), TQT_SLOT( slotSize( int ) ) ); - connect( comboSizes, TQT_SIGNAL( textChanged( const TQString & ) ), - TQT_SLOT( slotSizeEdit( const TQString & ) ) ); - - TQCheckBox *cb = new TQCheckBox( i18n("Bold"), - group ); - cb->setChecked( bold ); - connect( cb, TQT_SIGNAL( toggled( bool ) ), TQT_SLOT( slotBold( bool ) ) ); - gl->addWidget(cb, 3, 0); - - cb = new TQCheckBox( i18n("Italic"), group ); - cb->setChecked( italic ); - gl->addWidget(cb, 3, 1); - connect( cb, TQT_SIGNAL( toggled( bool ) ), TQT_SLOT( slotItalic( bool ) ) ); - - label = new TQLabel( i18n("Color:"), group ); - gl->addWidget(label, 4, 0); - - colorPush = new KColorButton( fontColor, group ); - gl->addWidget(colorPush, 4, 1); - connect( colorPush, TQT_SIGNAL( changed(const TQColor &) ), - TQT_SLOT( slotColor(const TQColor &) ) ); - - TQCheckBox *cyclingColorCb=new TQCheckBox(i18n("Cycling color"),group); - cyclingColorCb->setMinimumSize(cyclingColorCb->sizeHint()); - gl->addMultiCellWidget(cyclingColorCb,5,5,0,1); - connect(cyclingColorCb,TQT_SIGNAL(toggled(bool)),this,TQT_SLOT(slotCyclingColor(bool))); - cyclingColorCb->setChecked(cyclingColor); - - preview = new TQWidget( main ); - preview->setFixedSize( 220, 170 ); - preview->setBackgroundColor( black ); - preview->show(); // otherwise saver does not get correct size - saver = new KBannerSaver( preview->winId() ); - tl1->addWidget(preview); - - tl11->addWidget(group); - - label = new TQLabel( i18n("Speed:"), main ); - tl11->addStretch(1); - tl11->addWidget(label); - - TQSlider *sb = new TQSlider(0, 100, 10, speed, Qt::Horizontal, main ); - sb->setMinimumWidth( 180); - sb->setFixedHeight(20); - sb->setTickmarks(TQSlider::Below); - sb->setTickInterval(10); - tl11->addWidget(sb); - connect( sb, TQT_SIGNAL( valueChanged( int ) ), TQT_SLOT( slotSpeed( int ) ) ); - - TQHBoxLayout *tl2 = new TQHBoxLayout; - tl->addLayout(tl2); - - label = new TQLabel( i18n("Message:"), main ); - tl2->addWidget(label); - - ed = new TQLineEdit( main ); - tl2->addWidget(ed); - ed->setText( message ); - connect( ed, TQT_SIGNAL( textChanged( const TQString & ) ), - TQT_SLOT( slotMessage( const TQString & ) ) ); - - TQCheckBox *timeCb=new TQCheckBox( i18n("Show current time"), main); - timeCb->setFixedSize(timeCb->sizeHint()); - tl->addWidget(timeCb,0,TQt::AlignLeft); - connect(timeCb,TQT_SIGNAL(toggled(bool)),this,TQT_SLOT(slotTimeToggled(bool))); - timeCb->setChecked(showTime); - - tl->addStretch(); -} - -// read settings from config file -void KBannerSetup::readSettings() -{ - TDEConfig *config = TDEGlobal::config(); - config->setGroup( "Settings" ); - - speed=config->readNumEntry("Speed",50); -/* if ( speed > 100 ) - speed = 100; - else if ( speed < 50 ) - speed = 50;*/ - - message=config->readEntry("Message","KDE"); - showTime=config->readBoolEntry("ShowTime",FALSE); - fontFamily=config->readEntry("FontFamily",(TQApplication::font()).family()); - fontSize=config->readNumEntry("FontSize",48); - fontColor.setNamedColor(config->readEntry("FontColor","red")); - cyclingColor=config->readBoolEntry("CyclingColor",FALSE); - bold=config->readBoolEntry("FontBold",FALSE); - italic=config->readBoolEntry("FontItalic",FALSE); -} - -void KBannerSetup::fillFontSizes() -{ - bool block = comboSizes->signalsBlocked(); - comboSizes->blockSignals( true ); - comboSizes->clear(); - int i = 0; - sizes = TQFontDatabase().pointSizes( fontFamily ); - sizes << 96 << 128 << 156 << 0; - int current = 0; - while ( sizes[i] ) - { - TQString num; - num.setNum( sizes[i] ); - comboSizes->insertItem( num, i ); - if ( fontSize == sizes[i] ) // fontsize equals one of the defined ones - { - current = i; - comboSizes->setCurrentItem( current ); - slotSize( current ); - } - i++; - } - if ( current == 0 ) // fontsize seems to be entered by hand - { - TQString fsize; - fsize.setNum( fontSize ); - comboSizes->setEditText(fsize); - slotSizeEdit( fsize ); - } - comboSizes->blockSignals( block ); -} - -void KBannerSetup::slotFamily( const TQString& fam ) -{ - fontFamily = fam; - fillFontSizes(); // different font, different sizes - if ( saver ) - saver->setFont( fontFamily, fontSize, fontColor, bold, italic ); -} - -void KBannerSetup::slotSize( int indx ) -{ - fontSize = sizes[indx]; - if ( saver ) - saver->setFont( fontFamily, fontSize, fontColor, bold, italic ); -} - -void KBannerSetup::slotSizeEdit( const TQString& fs ) -{ - bool ok; - fontSize = fs.toInt( &ok, 10 ); - if ( ok ) - if ( saver ) - saver->setFont( fontFamily, fontSize, fontColor, bold, italic ); -} - -void KBannerSetup::slotColor( const TQColor &col ) -{ - fontColor = col; - if ( saver ) - saver->setColor(fontColor); -} - -void KBannerSetup::slotCyclingColor(bool on) -{ - colorPush->setEnabled(!on); - cyclingColor=on; - - if ( saver ) - { - saver->setCyclingColor( on ); - if ( !on ) - saver->setColor( fontColor ); - } -} - -void KBannerSetup::slotBold( bool state ) -{ - bold = state; - if ( saver ) - saver->setFont( fontFamily, fontSize, fontColor, bold, italic ); -} - -void KBannerSetup::slotItalic( bool state ) -{ - italic = state; - if ( saver ) - saver->setFont( fontFamily, fontSize, fontColor, bold, italic ); -} - -void KBannerSetup::slotSpeed( int num ) -{ - speed = num; - if ( saver ) - saver->setSpeed( speed ); -} - -void KBannerSetup::slotMessage( const TQString &msg ) -{ - message = msg; - if ( saver ) - saver->setMessage( message ); -} - -void KBannerSetup::slotTimeToggled( bool on ) -{ - ed->setEnabled(!on); - showTime=on; - if (saver) - { - if (showTime) - saver->setTimeDisplay(); - else - { - message=ed->text(); - saver->setMessage(message); - }; - }; -} - -// Ok pressed - save settings and exit -void KBannerSetup::slotOk() -{ - TDEConfig *config = TDEGlobal::config(); - config->setGroup( "Settings" ); - - config->writeEntry( "Speed", speed ); - config->writeEntry( "Message", message ); - config->writeEntry( "ShowTime", showTime ); - config->writeEntry( "FontFamily", fontFamily ); - - TQString fsize; - if (fontSize == 0) // an non-number was entered in the font size combo - { - fontSize = 48; - } - fsize.setNum( fontSize ); - config->writeEntry( "FontSize", fsize ); - - TQString colName; - colName.sprintf( "#%02x%02x%02x", fontColor.red(), fontColor.green(), - fontColor.blue() ); - config->writeEntry( "FontColor", colName ); - config->writeEntry( "CyclingColor", cyclingColor ); - config->writeEntry( "FontBold", bold ); - config->writeEntry( "FontItalic", italic ); - - config->sync(); - - accept(); -} - -void KBannerSetup::slotHelp() -{ - KMessageBox::about(this, - i18n("Banner Version 2.2.1\n\nWritten by Martin R. Jones 1996\[email protected]\nExtended by Alexander Neundorf 2000\[email protected]\n")); -} - -//----------------------------------------------------------------------------- - -KBannerSaver::KBannerSaver( WId id ) : KScreenSaver( id ) -{ - krnd = new KRandomSequence(); - readSettings(); - initialize(); - colorContext = TQColor::enterAllocContext(); - needBlank = TRUE; - timer.start( speed ); - connect( &timer, TQT_SIGNAL( timeout() ), TQT_SLOT( slotTimeout() ) ); -} - -KBannerSaver::~KBannerSaver() -{ - timer.stop(); - TQColor::leaveAllocContext(); - TQColor::destroyAllocContext( colorContext ); - delete krnd; -} - -void KBannerSaver::setSpeed( int spd ) -{ - timer.stop(); - int inv = 100 - spd; - speed = 1 + ((inv * inv) / 100); - timer.start( speed ); -} - -void KBannerSaver::setFont( const TQString& family, int size, const TQColor &color, - bool b, bool i ) -{ - fontFamily = family; - fontSize = size; - fontColor = color; - bold = b; - italic = i; - - initialize(); -} - -void KBannerSaver::setColor(TQColor &color) -{ - fontColor = color; - cyclingColor = FALSE; - needUpdate = TRUE; -} - -void KBannerSaver::setCyclingColor( bool on ) -{ - cyclingColor = on; - needUpdate = TRUE; -} - -void KBannerSaver::setMessage( const TQString &msg ) -{ - showTime = FALSE; - message = msg; - pixmapSize = TQSize(); - needBlank = TRUE; -} - -void KBannerSaver::setTimeDisplay() -{ - showTime = TRUE; - pixmapSize = TQSize(); - needBlank = TRUE; -} - -// read settings from config file -void KBannerSaver::readSettings() -{ - TDEConfig *config = TDEGlobal::config(); - config->setGroup( "Settings" ); - - setSpeed( config->readNumEntry("Speed",50) ); - - message=config->readEntry("Message","KDE"); - - showTime=config->readBoolEntry("ShowTime",FALSE); - - fontFamily=config->readEntry("FontFamily",(TQApplication::font()).family()); - - fontSize=config->readNumEntry("FontSize",48); - - fontColor.setNamedColor(config->readEntry("FontColor","red")); - - cyclingColor=config->readBoolEntry("CyclingColor",FALSE); - - bold=config->readBoolEntry("FontBold",FALSE); - italic=config->readBoolEntry("FontItalic",FALSE); - - if ( cyclingColor ) - { - currentHue=0; - fontColor.setHsv(0,SATURATION,VALUE); - } -} - -// initialize font -void KBannerSaver::initialize() -{ - fsize = fontSize * height() / TQApplication::desktop()->height(); - - font = TQFont( fontFamily, fsize, bold ? TQFont::Bold : TQFont::Normal, italic ); - - pixmapSize = TQSize(); - needBlank = TRUE; - - xpos = width(); - ypos = fsize + (int) ((double)(height()-fsize)*krnd->getDouble()); - step = 2 * width() / TQApplication::desktop()->width(); // 6 -> 2 -hhjb- - if ( step == 0 ) - step = 1; -} - -// erase old text and draw in new position -void KBannerSaver::slotTimeout() -{ - if (cyclingColor) - { - int hueStep = speed/10; - currentHue=(currentHue+hueStep)%360; - fontColor.setHsv(currentHue,SATURATION,VALUE); - } - if (showTime) - { - TQString new_message = TDEGlobal::locale()->formatTime(TQTime::currentTime(), true); - if( new_message != message ) - needUpdate = TRUE; - message = new_message; - } - if ( !pixmapSize.isValid() || cyclingColor || needUpdate || needBlank ) - { - TQRect rect = TQFontMetrics( font ).boundingRect( message ); - rect.setWidth( rect.width() + step ); - if ( rect.width() > pixmapSize.width() ) - pixmapSize.setWidth( rect.width() ); - if ( rect.height() > pixmapSize.height() ) - pixmapSize.setHeight( rect.height() ); - pixmap = TQPixmap( pixmapSize ); - pixmap.fill( black ); - TQPainter p( &pixmap ); - p.setFont( font ); - p.setPen( fontColor ); - p.drawText( -rect.x(), -rect.y(), message ); - needUpdate = FALSE; - } - xpos -= step; - if ( xpos < -pixmapSize.width() ) { - TQPainter p( this ); - p.fillRect( xpos + step, ypos, pixmapSize.width(), pixmapSize.height(), black ); - xpos = width(); - ypos = fsize + (int) ((double)(height()-2.0*fsize)*krnd->getDouble()); - } - - if ( needBlank ) - { - setBackgroundColor( black ); - erase(); - needBlank = FALSE; - } - bitBlt( this, xpos, ypos, &pixmap, 0, 0, pixmapSize.width(), pixmapSize.height()); -} diff --git a/kscreensaver/kdesavers/banner.h b/kscreensaver/kdesavers/banner.h deleted file mode 100644 index 37f10aba..00000000 --- a/kscreensaver/kdesavers/banner.h +++ /dev/null @@ -1,114 +0,0 @@ -//----------------------------------------------------------------------------- -// -// kbanner - Basic screen saver for KDE -// -// Copyright (c) Martin R. Jones 1996 -// - -#ifndef __BANNER_H__ -#define __BANNER_H__ - -#include <tqtimer.h> - -#include <kscreensaver.h> -#include <kdialogbase.h> - -#define SATURATION 150 -#define VALUE 255 - -class TQLineEdit; -class KColorButton; -class KRandomSequence; - -class KBannerSaver : public KScreenSaver -{ - Q_OBJECT - -public: - KBannerSaver( WId id ); - virtual ~KBannerSaver(); - - void setSpeed( int spd ); - void setFont( const TQString &family, int size, const TQColor &color, - bool b, bool i ); - void setMessage( const TQString &msg ); - void setTimeDisplay(); - void setCyclingColor(bool on); - void setColor( TQColor &color); - -private: - void readSettings(); - void initialize(); - -protected slots: - void slotTimeout(); - -protected: - TQFont font; - TQTimer timer; - TQString fontFamily; - int fontSize; - bool bold; - bool italic; - TQColor fontColor; - bool cyclingColor; - int currentHue; - bool needUpdate; - bool needBlank; - TQString message; - bool showTime; - int xpos, ypos, step, fsize; - KRandomSequence *krnd; - int speed; - int colorContext; - TQPixmap pixmap; - TQSize pixmapSize; -}; - - -class KBannerSetup : public KDialogBase -{ - Q_OBJECT - -public: - KBannerSetup( TQWidget *parent = NULL, const char *name = NULL ); - -protected: - void readSettings(); - void fillFontSizes(); - -private slots: - void slotFamily( const TQString & ); - void slotSize( int ); - void slotSizeEdit(const TQString &); - void slotColor(const TQColor &); - void slotCyclingColor(bool on); - void slotBold( bool ); - void slotItalic( bool ); - void slotSpeed( int ); - void slotMessage( const TQString & ); - void slotOk(); - void slotHelp(); - void slotTimeToggled(bool on); - -private: - TQWidget *preview; - KColorButton *colorPush; - KBannerSaver *saver; - TQLineEdit *ed; - TQComboBox* comboSizes; - - TQString message; - bool showTime; - TQString fontFamily; - int fontSize; - TQColor fontColor; - bool cyclingColor; - bool bold; - bool italic; - int speed; - TQValueList<int> sizes; -}; - -#endif - diff --git a/kscreensaver/kdesavers/blob.cpp b/kscreensaver/kdesavers/blob.cpp deleted file mode 100644 index 4b116744..00000000 --- a/kscreensaver/kdesavers/blob.cpp +++ /dev/null @@ -1,527 +0,0 @@ -//----------------------------------------------------------------------------- -// -// kblob - Basic screen saver for KDE -// -// Copyright (c) Tiaan Wessels, 1997 -// -// To add new alg : -// - add blob_alg enum in blob.h before ALG_LAST -// - choose 2 letter prefix for alg and add vars needed to private vars -// in KBlobSaver in blob.h -// - add xxSetup and xxNextFrame method definitions in blob.h -// - implement methods in this file. xxSetup to init vars mentioned -// in step 2. xxNextFrame to advance blob painter ( calc tx,ty and -// use box() method to position painter -// - add descriptive string in alg_str array in this file before "Random" -// - add to Algs array in KBlobSaver constructor in this file -// - test by setup saver and choosing alg from list - -#include <config.h> -#include <stdlib.h> -#include <time.h> -#include <limits.h> -#include <math.h> - -#include <tqcolor.h> -#include <tqlabel.h> -#include <tqlistbox.h> -#include <tqlayout.h> -#include <tqpainter.h> -#include <tqpixmap.h> -#include <tqimage.h> - -#include <kapplication.h> -#include <kconfig.h> -#include <kmessagebox.h> -#include <knuminput.h> -#include <klocale.h> -#include <kglobal.h> -#include <krandomsequence.h> - -#include "blob.moc" -#include "blob.h" - -#define SMALLRAND(a) (int)(rnd->getLong(a)+1) - - -// libkscreensaver interface -extern "C" -{ - KDE_EXPORT const char *kss_applicationName = "kblob.kss"; - KDE_EXPORT const char *kss_description = I18N_NOOP( "KBlob" ); - KDE_EXPORT const char *kss_version = "2.2.0"; - - KDE_EXPORT KScreenSaver *kss_create( WId id ) - { - return new KBlobSaver( id ); - } - - KDE_EXPORT TQDialog *kss_setup() - { - return new KBlobSetup(); - } -} - -static KRandomSequence *rnd = 0; - -TQString alg_str[5]; -void initAlg() -{ - alg_str[0] = i18n("Random Linear"); - alg_str[1] = i18n("Horizontal Sine"); - alg_str[2] = i18n("Circular Bounce"); - alg_str[3] = i18n("Polar Coordinates"); - alg_str[4] = i18n("Random"); -} - -//----------------------------------------------------------------------------- -// the blob screensaver's code - -KBlobSaver::KBlobSaver ( WId id) - : KScreenSaver( id ) -{ - rnd = new KRandomSequence(); - initAlg(); - TQColor color; - float ramp = (256.0-64.0)/(float)RAMP; - TQString msg = - i18n("This screen saver requires a color display."); - - blank(); - - // needs colors to work this one - if (TQPixmap::defaultDepth() < 8) - { - TQPainter p(this); - p.setPen( white ); - p.drawText( width()/2, height()/2, msg ); - return; - } - - colorContext = TQColor::enterAllocContext(); - - // if 8-bit, create lookup table for color ramping further down - if (TQPixmap::defaultDepth() == 8) - { - memset(lookup, 0, 256*sizeof(uint)); - int i; - for (i = 0; i < RAMP; i++) - { - color.setRgb(64+(int)(ramp*(float)i), 0, 0); - colors[i] = color.alloc(); - } - memset(lookup, black.pixel(), sizeof(uint)*256); - for (i = 0; i < RAMP-1; i++) - lookup[colors[i]] = colors[i+1]; - lookup[black.pixel()] = lookup[colors[RAMP-1]] = colors[0]; - } - else - { - // make special provision for preview mode - if (height() < 400) - { - if (TQPixmap::defaultDepth() > 8 ) - setColorInc(7); - else - setColorInc(4); - } - else - { - if (TQPixmap::defaultDepth() > 8 ) - setColorInc(3); - else - setColorInc(2); - } - } - - // the dimensions of the blob painter - dim = height()/70+1; - - // record starting time to know when to change frames - start = time(NULL); - - // init some parameters used by all algorithms - xhalf = width()/2; - yhalf = height()/2; - - // means a new algorithm should be set at entrance of timer - newalg = newalgp = 1; - - // init algorithm space - Algs[0].Name = alg_str[0]; - Algs[0].Init = &KBlobSaver::lnSetup; - Algs[0].NextFrame = &KBlobSaver::lnNextFrame; - - Algs[1].Name = alg_str[1]; - Algs[1].Init = &KBlobSaver::hsSetup; - Algs[1].NextFrame = &KBlobSaver::hsNextFrame; - - Algs[2].Name = alg_str[2]; - Algs[2].Init = &KBlobSaver::cbSetup; - Algs[2].NextFrame = &KBlobSaver::cbNextFrame; - - Algs[3].Name = alg_str[3]; - Algs[3].Init = &KBlobSaver::pcSetup; - Algs[3].NextFrame = &KBlobSaver::pcNextFrame; - - // get setup from kde registry - readSettings(); - - // start timer which will update blob painter - timer.start(SPEED); - connect(&timer, TQT_SIGNAL(timeout()), TQT_SLOT(slotTimeout())); -} - -KBlobSaver::~KBlobSaver() -{ - timer.stop(); - - TQColor::leaveAllocContext(); - TQColor::destroyAllocContext(colorContext); - delete rnd; rnd = 0; -} - -void KBlobSaver::setAlgorithm(int a) -{ - newalg = newalgp = ((a == ALG_RANDOM) ? 1 : 2); - alg = a; -} - -void KBlobSaver::lnSetup() -{ - // initialize the blob movement dictators with random vals - // incrementals on axis - ln_xinc = SMALLRAND(3); - ln_yinc = SMALLRAND(2); - - // start position - tx = SMALLRAND(width()-dim-ln_xinc*2); - ty = SMALLRAND(height()-dim-ln_yinc*2); -} - -void KBlobSaver::hsSetup() -{ - hs_per = SMALLRAND(7); - hs_radians = 0.0; - hs_rinc = (hs_per*M_PI)/(hs_per*90*4); - hs_flip = 1.0; -} - -void KBlobSaver::cbSetup() -{ - cb_radians = 0.0; - cb_rinc = (2.0*M_PI)/360.0; - cb_sradians = 0.0; - cb_deviate = SMALLRAND(height()/20)+(height()/15); - cb_radius = height()/2-cb_deviate*2-2*dim; - cb_devradinc = (rnd->getDouble()*10.0*2.0*M_PI)/360.0; -} - -void KBlobSaver::pcSetup() -{ - pc_angle = 0.0; - pc_radius = 0.0; - pc_inc = (2.0*M_PI)/720.0; - pc_crot = 0.0; - pc_div = SMALLRAND(4)-1; -} - -// render next frame ( or change algorithms ) -void KBlobSaver::slotTimeout() -{ - time_t now = time(NULL); - - // should algorithm be changed - if (now-start > showlen) - newalg = newalgp; - - // set new algorithm - if (newalg) - { - blank(); - if (newalg == 1) - alg = SMALLRAND(ALG_LAST)-1; - (this->*Algs[alg].Init)(); - newalg = 0; - start = time(NULL); - } - - // gen next fram for current algorithm - (this->*Algs[alg].NextFrame)(); -} - -void KBlobSaver::lnNextFrame() -{ - int dir; - - // depending on the algorithm to use, move the blob painter to - // a new location - // check for wall hit to change direction - if (tx+dim+ln_xinc > (int)width()-1 || tx+ln_xinc < 0) - { - if (ln_xinc > 0) - dir = -1; - else - dir = 1; - ln_xinc = SMALLRAND(3)*dir; - } - if (ty+dim+ln_yinc > (int)height()-1 || ty+ln_yinc < 0) - { - if (ln_yinc > 0) - dir = -1; - else - dir = 1; - ln_yinc = SMALLRAND(2)*dir; - } - - // move box to new position - tx += ln_xinc; - ty += ln_yinc; - - // draw new box - box(tx, ty); -} - -void KBlobSaver::hsNextFrame() -{ - static int xlen = width()-(4*dim); - static int ylen = height()-(4*dim); - - // calc x as offset on angle line and y as vertical offset - // on interval -1..1 sine of angle - tx = (int)((hs_radians/(hs_per*M_PI))*(float)xlen); - ty = (int)((float)(ylen/4)*(hs_flip*sin(hs_radians)))+yhalf; - - // draw new box - box(tx, ty); - - // set new radians - hs_radians += hs_rinc; - if (hs_radians > hs_per*M_PI) - { - hs_rinc *= -1.0; - hs_radians += hs_rinc; - hs_flip *= -1.0; - } - else if (hs_radians < 0.0) - hsSetup(); -} - -void KBlobSaver::cbNextFrame() -{ - int deviate; - - // calculate deviation of circle main radius - deviate = (int)(sin(cb_sradians)*cb_deviate); - - // calculate topleft of box as a circle with a sine perturbed radius - tx = (int)(cos(cb_radians)*(cb_radius+deviate))+xhalf; - ty = (int)(sin(cb_radians)*(cb_radius+deviate))+yhalf; - - // draw the box - box(tx, ty); - - // increase greater circle render angle - cb_radians += cb_rinc; - if (cb_radians > 2.0*M_PI) - cb_radians -= 2.0*M_PI; - - // increase radius deviation offset on sine wave - cb_sradians += cb_devradinc; -} - -void KBlobSaver::pcNextFrame() -{ - static float scale = (float)height()/3.0 - 4.0*dim; - - // simple polar coordinate equation - if (pc_div < 1.0) - pc_radius = cos(2.0*pc_angle); - else - pc_radius = 1.0/pc_div + cos(2.0*pc_angle); - - tx = (int)(scale*pc_radius*cos(pc_angle+pc_crot))+xhalf; - ty = (int)(scale*pc_radius*sin(pc_angle+pc_crot))+yhalf; - - // advance blob painter - box(tx, ty); - - // new movement parameters - pc_angle += pc_inc; - if (pc_angle > 2.0*M_PI) - { - pc_angle -= 2.0*M_PI; - pc_crot += M_PI/45.0; - } -} - -void KBlobSaver::box ( int x, int y ) -{ - // for bad behaving algorithms that wants to cause an X trap - // confine to the valid region before using potentially fatal XGetImage - if ((x+dim) >= width()) - x = width()-dim-1; - else if (x < 0) - x = 0; - if ((y+dim) > height()) - y = height()-dim-1; - else if (y < 0) - y = 0; - - // get the box region from the display to upgrade - TQImage img = TQPixmap(TQPixmap::grabWindow(winId(), x, y, dim, dim)).convertToImage(); - - // depending on the depth of the display, use either lookup table for - // next rgb val ( 8-bit ) or ramp the color directly for other displays - if ( img.depth() == 8) - { - // manipulate image by upgrading each pixel with 1 using a lookup - // table as the color allocation could have resulted in a spread out - // configuration of the color ramp - for (int j = 0; j < img.height(); j++) - { - for (int i = 0; i < img.width(); i++) - { - img.scanLine(j)[i] = lookup[img.scanLine(j)[i]]; - } - } - } - else - { - for (int j = 0; j < img.height(); j++) - { - for (int i = 0; i < img.width(); i++) - { - TQRgb p = img.pixel( i, j ); - p += (colorInc<<18); - img.setPixel( i, j, p ); - } - } - } - - // put the image back onto the screen - TQPainter p(this); - p.drawImage( x, y, img ); -} - -void KBlobSaver::blank() -{ - setBackgroundColor( black ); - erase(); -} - -void KBlobSaver::readSettings() -{ - TDEConfig *config = TDEGlobal::config(); - config->setGroup("Settings"); - - // number of seconds to spend on a frame - showlen = config->readNumEntry("Showtime", 3*60); - - // algorithm to use. if not set then use random - alg = config->readNumEntry("Algorithm", ALG_RANDOM); - if (alg == ALG_RANDOM) - newalg = 1; - else - newalg = 2; - newalgp = newalg; -} - -//----------------------------------------------------------------------------- -// dialog to setup screen saver parameters -// -KBlobSetup::KBlobSetup -( - TQWidget *parent, - const char *name -) -: KDialogBase( parent, name, true, i18n( "Setup Blob Screen Saver" ), - Ok|Cancel|Help, Ok, true ) -{ - - initAlg(); - - // get saver configuration from kde registry - readSettings(); - - setButtonText( Help, i18n( "A&bout" ) ); - TQWidget *main = makeMainWidget(); - - TQHBoxLayout *tl = new TQHBoxLayout( main, 0, spacingHint() ); - - TQVBoxLayout *vbox = new TQVBoxLayout; - tl->addLayout(vbox); - - // seconds to generate on a frame - TQLabel *label = new TQLabel(i18n("Frame duration:"), main); - stime = new KIntNumInput( showtime, main ); - stime->setSuffix( i18n( " sec" ) ); - vbox->addWidget(label); - vbox->addWidget(stime); - - // available algorithms - label = new TQLabel(i18n("Algorithm:"), main); - algs = new TQListBox(main); - algs->setMinimumSize(150, 105); - for (int i = 0; i <= ALG_RANDOM; i++) - algs->insertItem(alg_str[i]); - algs->setCurrentItem(alg); - vbox->addWidget(label); - vbox->addWidget(algs); - - // preview window - TQWidget *preview = new TQWidget( main ); - preview->setFixedSize(220, 170); - preview->setBackgroundColor(black); - preview->show(); - tl->addWidget(preview); - saver = new KBlobSaver(preview->winId()); - saver->setDimension(3); - if (TQPixmap::defaultDepth() > 8) - saver->setColorInc(7); - else - saver->setColorInc(4); - - tl->addStretch(); - - // so selecting an algorithm will start previewing that alg - connect(algs, TQT_SIGNAL(highlighted(int)), saver, - TQT_SLOT(setAlgorithm(int))); -} - -void KBlobSetup::readSettings() -{ - TDEConfig *config = TDEGlobal::config(); - config->setGroup("Settings"); - - // number of seconds to spend on a frame - showtime = config->readNumEntry("Showtime", 3*60); - - // algorithm to use. if not set then use random - alg = config->readNumEntry("Algorithm", ALG_LAST); -} - -// Ok pressed - save settings and exit -void KBlobSetup::slotOk() -{ - TDEConfig *config = TDEGlobal::config(); - - config->setGroup("Settings"); - - config->writeEntry("Showtime", stime->value()); - config->writeEntry("Algorithm", algs->currentItem()); - - config->sync(); - - accept(); -} - -void KBlobSetup::slotHelp() -{ - KMessageBox::about(this, - i18n("Blobsaver Version 0.1\n\nWritten by Tiaan Wessels 1997\[email protected]")); - if (saver) - saver->setAlgorithm(algs->currentItem()); -} - - diff --git a/kscreensaver/kdesavers/blob.h b/kscreensaver/kdesavers/blob.h deleted file mode 100644 index 5e5fb97c..00000000 --- a/kscreensaver/kdesavers/blob.h +++ /dev/null @@ -1,119 +0,0 @@ -//----------------------------------------------------------------------------- -// -// kblob - Basic screen saver for KDE -// -// Copyright (c) Tiaan Wessels, 1997 -// - -#ifndef __BLOB_H__ -#define __BLOB_H__ - -#include <tqtimer.h> -#include <tqptrlist.h> - -#include <kdialogbase.h> -#include <kscreensaver.h> - -#define RAMP 64 -#define SPEED 10 - -enum blob_alg { - ALG_LINEAR, - ALG_HSINE, - ALG_CIRB, - ALG_POLARC, - ALG_LAST, - ALG_RANDOM = ALG_LAST }; - -class KBlobSaver : public KScreenSaver -{ - Q_OBJECT - - -public: - KBlobSaver( WId id ); - virtual ~KBlobSaver(); - - void setDimension(int d) - { dim = d; } - void setShowlen(time_t s) - { showlen = s; } - void setColorInc(int c) - { colorInc = c; } - -public slots: - void setAlgorithm(int); - -public: - typedef void (KBlobSaver::*AlgFunc)(); - struct KBSAlg - { - TQString Name; - AlgFunc Init; - AlgFunc NextFrame; - }; -private: - - TQTimer timer; - uint colors[RAMP]; - uint lookup[256]; - int colorContext, colorInc; - int tx, ty; - int dim; - int xhalf, yhalf; - int alg, newalg, newalgp; - time_t showlen, start; - KBSAlg Algs[ALG_LAST]; - int ln_xinc, ln_yinc; - float hs_radians, hs_rinc, hs_flip, hs_per; - float cb_radians, cb_rinc, cb_sradians, cb_radius, cb_devradinc; - float cb_deviate; - float pc_angle, pc_radius, pc_inc, pc_crot, pc_div; - - void lnSetup(); - void hsSetup(); - void cbSetup(); - void pcSetup(); - - void lnNextFrame(); - void hsNextFrame(); - void cbNextFrame(); - void pcNextFrame(); - - void blank(); - void box(int, int); - void readSettings(); - -protected slots: - void slotTimeout(); -}; - -class TQListBox; -class KIntNumInput; - -class KBlobSetup : public KDialogBase -{ - Q_OBJECT - - - int showtime; - int alg; - TQListBox *algs; - KIntNumInput *stime; - -public: - KBlobSetup( TQWidget *parent = NULL, const char *name = NULL ); - -protected: - void readSettings(); - -private slots: - void slotOk(); - void slotHelp(); - -private: - KBlobSaver *saver; -}; - -#endif - diff --git a/kscreensaver/kdesavers/data/CMakeLists.txt b/kscreensaver/kdesavers/data/CMakeLists.txt deleted file mode 100644 index c9718d9a..00000000 --- a/kscreensaver/kdesavers/data/CMakeLists.txt +++ /dev/null @@ -1,17 +0,0 @@ -################################################# -# -# (C) 2011 Golubev Alexander -# fatzer2 (AT) gmail.com -# -# Improvements and feedback are welcome -# -# This file is released under GPL >= 2 -# -################################################# - -install( FILES - kfs_particle.png kfs_particle_flare.png - kfs_particle_diastar.png kfs_kde.png - kfs_tux.png kfs_letters1.png kfs_letters2.png - kfs_letters.desc kfs_explode.ogg kfs_debris.ogg - DESTINATION ${DATA_INSTALL_DIR}/kfiresaver ) diff --git a/kscreensaver/kdesavers/data/Makefile.am b/kscreensaver/kdesavers/data/Makefile.am deleted file mode 100644 index 2882f34c..00000000 --- a/kscreensaver/kdesavers/data/Makefile.am +++ /dev/null @@ -1,11 +0,0 @@ -# Makefile.am for screensavers data - -METASOURCES = AUTO - -if COMPILE_GL_KSAVERS -kfiresaver_DATA = kfs_particle.png kfs_particle_flare.png kfs_particle_diastar.png\ - kfs_kde.png kfs_tux.png\ - kfs_letters1.png kfs_letters2.png kfs_letters.desc\ - kfs_explode.ogg kfs_debris.ogg -kfiresaverdir = $(kde_datadir)/kfiresaver -endif diff --git a/kscreensaver/kdesavers/data/kfs_debris.ogg b/kscreensaver/kdesavers/data/kfs_debris.ogg Binary files differdeleted file mode 100644 index f1265ec2..00000000 --- a/kscreensaver/kdesavers/data/kfs_debris.ogg +++ /dev/null diff --git a/kscreensaver/kdesavers/data/kfs_explode.ogg b/kscreensaver/kdesavers/data/kfs_explode.ogg Binary files differdeleted file mode 100644 index 3eda0ef0..00000000 --- a/kscreensaver/kdesavers/data/kfs_explode.ogg +++ /dev/null diff --git a/kscreensaver/kdesavers/data/kfs_kde.png b/kscreensaver/kdesavers/data/kfs_kde.png Binary files differdeleted file mode 100644 index 33f53b33..00000000 --- a/kscreensaver/kdesavers/data/kfs_kde.png +++ /dev/null diff --git a/kscreensaver/kdesavers/data/kfs_letters.desc b/kscreensaver/kdesavers/data/kfs_letters.desc deleted file mode 100644 index 186a1b8d..00000000 --- a/kscreensaver/kdesavers/data/kfs_letters.desc +++ /dev/null @@ -1,84 +0,0 @@ -#first map and its coordinates -#note that capitals are used for lowercase also - -"kfs_letters1.png" - -A 0 0 48 63 -a 0 0 48 63 -B 48 0 87 63 -b 48 0 87 63 -C 87 0 132 63 -c 87 0 132 63 -D 132 0 178 63 -d 132 0 178 63 -E 179 0 222 63 -e 179 0 222 63 - -F 0 64 40 127 -f 0 64 40 127 -G 41 64 89 127 -g 41 64 89 127 -H 89 64 142 127 -h 89 64 142 127 -I 142 64 180 127 -i 142 64 180 127 -J 180 64 227 127 -j 180 64 227 127 - -K 0 128 40 191 -k 0 128 40 191 -L 41 128 80 191 -l 41 128 80 191 -M 80 128 142 191 -m 80 128 142 191 -N 142 128 196 191 -n 142 128 196 191 -O 196 128 252 191 -o 196 128 252 191 - -P 0 192 36 255 -p 0 192 36 255 -Q 36 192 97 255 -q 36 192 97 255 -R 97 192 142 255 -r 97 192 142 255 -S 142 192 189 255 -s 142 192 189 255 -T 189 192 244 255 -t 189 192 244 255 - - -"kfs_letters2.png" - -U 0 0 50 63 -u 0 0 50 63 -V 50 0 97 63 -v 50 0 97 63 -W 97 0 169 63 -w 97 0 169 63 -X 169 0 220 63 -x 169 0 220 63 -, 220 0 239 63 -. 239 0 254 63 - -Y 0 64 48 127 -y 0 64 48 127 -Z 48 64 99 127 -z 48 64 99 127 -! 99 64 119 127 -? 119 64 157 127 -- 157 64 188 127 -: 188 64 205 127 -; 205 64 226 127 - -0 0 128 45 191 -1 45 128 75 191 -2 75 128 118 191 -3 118 128 158 191 -4 158 128 203 191 -5 203 128 245 191 - -6 0 192 41 255 -7 41 192 86 255 -8 86 192 127 255 -9 127 192 169 255 diff --git a/kscreensaver/kdesavers/data/kfs_letters1.png b/kscreensaver/kdesavers/data/kfs_letters1.png Binary files differdeleted file mode 100644 index 2f6678ba..00000000 --- a/kscreensaver/kdesavers/data/kfs_letters1.png +++ /dev/null diff --git a/kscreensaver/kdesavers/data/kfs_letters2.png b/kscreensaver/kdesavers/data/kfs_letters2.png Binary files differdeleted file mode 100644 index 8d0442ac..00000000 --- a/kscreensaver/kdesavers/data/kfs_letters2.png +++ /dev/null diff --git a/kscreensaver/kdesavers/data/kfs_particle.png b/kscreensaver/kdesavers/data/kfs_particle.png Binary files differdeleted file mode 100644 index d6294dc3..00000000 --- a/kscreensaver/kdesavers/data/kfs_particle.png +++ /dev/null diff --git a/kscreensaver/kdesavers/data/kfs_particle_diastar.png b/kscreensaver/kdesavers/data/kfs_particle_diastar.png Binary files differdeleted file mode 100644 index 6f645ddb..00000000 --- a/kscreensaver/kdesavers/data/kfs_particle_diastar.png +++ /dev/null diff --git a/kscreensaver/kdesavers/data/kfs_particle_flare.png b/kscreensaver/kdesavers/data/kfs_particle_flare.png Binary files differdeleted file mode 100644 index 4a4fdcb5..00000000 --- a/kscreensaver/kdesavers/data/kfs_particle_flare.png +++ /dev/null diff --git a/kscreensaver/kdesavers/data/kfs_tux.png b/kscreensaver/kdesavers/data/kfs_tux.png Binary files differdeleted file mode 100644 index 99f3465e..00000000 --- a/kscreensaver/kdesavers/data/kfs_tux.png +++ /dev/null diff --git a/kscreensaver/kdesavers/firesaver.ChangeLog b/kscreensaver/kdesavers/firesaver.ChangeLog deleted file mode 100644 index 24c41b2d..00000000 --- a/kscreensaver/kdesavers/firesaver.ChangeLog +++ /dev/null @@ -1,106 +0,0 @@ -2004-06-29 Enrico Ros <[email protected]> - - * general : added support for 'per particle' texture with - smart binding. added 2 textures (explosion light / toxxic) - - * firesaverparticle : finished TurningParticle class. moved - some code from the header to the cpp. - - * firesaver : added 'Toxic spirals' fireworks, disabled - supernova in .ui since after 3.3. fixed monochrome<->monotype - bug. - - * firesaverwriter : bugfix on word's color (blinking on start). - -2004-05-30 Enrico Ros <[email protected]> - - * this file : renamed Changelog to firesaver.ChangeLog - - * general : moved / renamed files and chaged stuff to get ready - to be imported into tdeartwork. - - * general : all images are .png, all sounds are .ogg. - -2004-02-07 Enrico Ros <[email protected]> - - * firesaver.cpp : implemented trail and alpha on explosions. - - * firesaver : damn dirty bug! reordered projection lines. Looks - way cooler now. trimmed defaults. - - * firesaversetup : config dialog redone from scratch. Now it is - more usable and ready for translation into different languages. - Also added many new features. - - * firesaver : adapted to setup dialog changes (also embeds the - setup widget into a KDialogBase). Implemented some new features - added in the setup dialog. - -2004-02-06 Enrico Ros <[email protected]> - - * all : optimized logic and math.. tdecachegrind rules. - - * firesaverparticle : inheritance test on particle class. - Implemented a "funny phisics" on the TurningParticle class. This - will lead to strange fireworks (spirals, fountains... ) - -2004-01-31 Enrico Ros <[email protected]> - - * all : leak checked and fixed uninitialized values. optimized - the code for less cpu consumption (reduced 7% over the 19% of - internal code cpu consumption (the remaining 81% of cpu time is - spent into GL libraries!!..) seems there's a limit to the code - optimization!). - - * firesaver : added KDE icons as exploding elements and checked - the explode logo routine. - - * fw_letters* : added support for overlay writings. cleaned api. - - * firesaver.cpp/.h : implemented texture loader. some fixes and - a major speedup. again more changes to the graphical pipeline. - -2004-01-30 Enrico Ros <[email protected]> - - * firesaverparticle.cpp/.h: cleaned a lot; changed the interface. - It's not completely decoupled from the 'firework' entity yet. - - * fw_debris.ogg: added a second sound (used only on logo explosion - for now). - - * firesaver.cpp: reworked the generation of image logos (new - default: 64x64 pixel for hi-res). - -2004-01-29 Enrico Ros <[email protected]> - - * firesaver.cpp: fix: screen blink. add: particle size not - dependant from screen size. - - * firesaver.cpp: optimized the rendering core for particles. - Computation takes now less than half of the time than before. - Set a capacity of 20000 simultaneous particles; more will be - dropped (but a progressive 'resize' is done..) - - * fw_explode.ogg: converted sound file to ogg format. - - * firesaver.cpp/.h: redone the audio engine (limited by default - to 4 mixer channels). - - * firesaver.cpp: use the .mp3 sound that is "auto-mixed" by the - sound system. The old Wav was played sequentially (a boom is heard - after the previous one terminates). The Ogg format has the same - problem as the wave one (plus it goes on playing many booms after - the program is exited). - -2004-01-28 Enrico Ros <[email protected]> - - * firesaverparticle.cpp: keep a particle independent from the - 'shape' of the firework it belongs to. Added depth (level) of - explosion (normal particles reach level 1, splitters reach 2). - - * name syntax: converted filenames to match the style of the ones - in tdeartwork/kscreensaver/kdesavers. - - * merging: merged some file's content to lower the number of files - before initial import. - diff --git a/kscreensaver/kdesavers/firesaver.cpp b/kscreensaver/kdesavers/firesaver.cpp deleted file mode 100644 index ad6b83ac..00000000 --- a/kscreensaver/kdesavers/firesaver.cpp +++ /dev/null @@ -1,1151 +0,0 @@ -// This file is part of KFireSaver3D. - -// KFireSaver3D 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. - -// KFireSaver3D 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 KFireSaver3D; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - - -// Author: Enrico Ros, based on the great work of David Sansome (kfiresaver) -// Email: [email protected] - -#include <math.h> -#include <sys/time.h> -#include <stdlib.h> -#include <kconfig.h> -#include <kdebug.h> -#include <kstandarddirs.h> -#include <klocale.h> -#include <kurl.h> -#include <kiconloader.h> -#include <kmessagebox.h> -#include <arts/kmedia2.h> -#include <arts/kplayobject.h> -#include <arts/kplayobjectfactory.h> - -#include "firesaversetup.h" -#include "firesaverparticle.h" -#include "firesaverwriter.h" -#include "firesaver.h" - - -/* Factory code for KScreensaver begins *here* *\ -\* */ - -#include <kscreensaver.h> -#include <kdialogbase.h> - -class KFireSaverKSS : public KScreenSaver -{ - public: - KFireSaverKSS( WId id ) - : KScreenSaver( id ) - { - setBackgroundColor( black ); - erase(); - saver = new KFireSaver; - embed(saver); - saver->show(); - } - - ~KFireSaverKSS() - { - delete saver; - } - - private: - KFireSaver* saver; -}; - -class KFireSaverSetupKDB : public KDialogBase -{ - public: - KFireSaverSetupKDB( TQWidget* parent = 0, const char* name = 0 ) - : KDialogBase( parent, name, true, i18n("Setup Screen Saver"), - Ok | Cancel | Help, Ok, true ) - { - setup = new KFireSaverSetup( this ); - setMainWidget( setup ); - setButtonText( KDialogBase::Help, i18n( "A&bout" ) ); - } - - private slots: - void slotHelp() - { - KMessageBox::about(this, i18n("<h3>KFireSaver 3D 1.0</h3>\n<p>TEST Koral - Enrico Ros::2004</p>") ); - } - void slotOk() - { - setup->writeConfig(); - accept(); - } - - private: - KFireSaverSetup * setup; -}; - -extern "C" -{ - KDE_EXPORT const char *kss_applicationName = "kfiresaver.kss"; - KDE_EXPORT const char *kss_description = I18N_NOOP( "Fireworks 3D (GL)" ); - KDE_EXPORT const char *kss_version = "0.7"; - - KDE_EXPORT KScreenSaver *kss_create( WId id ) - { - return new KFireSaverKSS( id ); - } - - KDE_EXPORT TQDialog *kss_setup() - { - return new KFireSaverSetupKDB; - } -} - -/* *\ -\* Factory code for KScreensaver ends *here* */ - - -KFireSaver :: KFireSaver( TQWidget *parent, const char *name ) - : TQGLWidget( parent, name ) -{ - // set random seed to initialize drand48() calls - timeval tv; - gettimeofday(&tv,NULL); - srand48( (long)tv.tv_usec ); - - readConfig(); - - particleList.setAutoDelete(true); - starList.setAutoDelete(true); - imageList.setAutoDelete(true); - playObjectList.setAutoDelete(true); - - //initialize openGL context before managing GL calls - makeCurrent(); - loadTexture( locate("data","kfiresaver/kfs_particle.png"), particleTexture ); - loadTexture( locate("data","kfiresaver/kfs_particle_flare.png"), flareTexture ); - loadTexture( locate("data","kfiresaver/kfs_particle_diastar.png"), diastarTexture ); - starTexture = particleTexture; - - //generate stars - if (parameters.enableStars) { - int number = parameters.starsNumber + 1; - number *= 10 * number; - for (int i=0 ; i<number ; i++) - { - Particle * star = new Particle( Particle::StarParticle ); - star->initializeValues(); - star->texture = starTexture; - if (parameters.enableStarGradient) - { - GLfloat red = star->colour[0], - green = star->colour[1], - blue = star->colour[2], - tint = 0.5 + star->ypos / FIELDWIDTH, - merge = 0.3 + DRAND*0.7, - mergen = 1 - merge; - star->colour[0] = red * merge + (1.0-tint) * mergen; - star->colour[1] = green * merge + tint * mergen; - star->colour[2] = blue * merge + tint * mergen; - } - starList.append( star ); - } - } - - //generate bottom fire - if (parameters.enableBottomFire) { - float cRed = (float)parameters.bottomFireColor.red() / 255.0, - cGreen = (float)parameters.bottomFireColor.green() / 255.0, - cBlue = (float)parameters.bottomFireColor.blue() / 255.0; - for (int i=0 ; i<NUMBER_OF_FIREPARTICLES ; i++) - { - Particle* particle = new Particle( Particle::FireParticle ); - particle->initializeValues(); - particle->texture = particleTexture; - particle->zspeed *= 4.0; - particle->colour[0] = cRed * (0.6 + 0.4*DRAND); - particle->colour[1] = cGreen * (0.6 + 0.4*DRAND); - particle->colour[2] = cBlue * (0.6 + 0.4*DRAND); - particleList.append(particle); - } - } - - //get sound files - if (parameters.enableSound) { - sound_explosion = locate("data","kfiresaver/kfs_explode.ogg"); - sound_debris = locate("data","kfiresaver/kfs_debris.ogg"); - } - - //create the writer class that manages flying writings. - if ( parameters.enableWritings ) - writer = new Writer("kfs_letters.desc"); - - showp.forceBicolour = - showp.forceColour = - showp.forcePower = - showp.forceType = false; - showp.timeStamp = 0.0; - startTimer(MSECPERIOD); - - //force initialization of "show" variables for the first time - timerEvent(NULL); -} - - -KFireSaver :: ~KFireSaver() -{ - freeTexture( particleTexture ); - freeTexture( starTexture ); - particleList.clear(); - starList.clear(); - imageList.clear(); - playObjectList.clear(); - if ( parameters.enableWritings ) - delete writer; -} - - -void KFireSaver :: initializeGL() -{ - glDisable(GL_DEPTH_TEST); - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA,GL_ONE); - glShadeModel( GL_SMOOTH ); - - resizeGL( 640, 480 ); -} - - -void KFireSaver :: resizeGL( int width, int height ) -{ - glViewport( 0, 0, width, height ); - - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glOrtho( -FIELDW_2, FIELDW_2, -FIELDW_2, FIELDW_2, 5.0, 60.0 ); - - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - - float ratio = (float)width / (float)height, - numH = 750 - 90 * parameters.particleSize, - numW = 1000 - 120 * parameters.particleSize; - if ( ratio >= (4.0/3.0) ) { - unitX = FIELDWIDTH / (numH * ratio); - unitY = FIELDWIDTH / numH; - } else { - unitX = FIELDWIDTH / numW; - unitY = FIELDWIDTH / (numW / ratio); - } - - timeval tv; - gettimeofday(&tv,NULL); - timeStampFrame = (double)tv.tv_sec + (double)tv.tv_usec/1000000.0; - - firstGLFrame = true; -} - - -void KFireSaver :: paintGL () -/* Main procedure. It does the following: - - calculate time diff between current and previous frame - - clear the color buffer - - simple render of stars - - advanced render of particles - - render - - update physics based on time difference - - check die/change conditions - - call to explode_firework if a leader dies - - if random -> start a new firework - - if random -> explode a penquin or kde logo -*/ -{ - /* calculate TIME ELAPSED between current and previous frame */ - - timeval tv; - gettimeofday(&tv,NULL); - double timeCurrent = (double)tv.tv_sec + (double)tv.tv_usec/1000000.0; - double timeDiff = (MSECPERIOD / 1000.0); - if (parameters.enableRealtime) - { - timeDiff = timeCurrent - timeStampFrame; - timeStampFrame = timeCurrent; - timeDiff = (timeDiff > 0.5) ? 0.5 : (timeDiff < 0.005) ? 0.005 : timeDiff; - } - - /* CLEAR SCREEN: to do it there are 2 ways */ - - glLoadIdentity(); - glTranslatef( 0, 0, -50.0 ); - glDisable( GL_TEXTURE_2D ); - - if ( !parameters.enableFade || firstGLFrame ) - { // quick - clear the OpenGL color buffer - glClearColor( 0.0, 0.0, 0.0, 1.0 ); - glClear( GL_COLOR_BUFFER_BIT ); - firstGLFrame = false; - } - else - { // good looking - /* superpose a semi-transparent black rectangle so we - can see a sort of 'tail' for each particle drawn. */ - const GLfloat conv_tab[10] = { - 0.50, 0.33, 0.22, 0.15, 0.10, - 0.07, 0.05, 0.03, 0.02, 0.01 }; - glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); - glColor4f(0.0,0.0,0.0, conv_tab[parameters.fadeAmount]); - glBegin( GL_TRIANGLE_STRIP ); - glVertex2f( FIELDW_2, FIELDW_2 ); - glVertex2f( -FIELDW_2, FIELDW_2 ); - glVertex2f( FIELDW_2, -FIELDW_2 ); - glVertex2f( -FIELDW_2, -FIELDW_2 ); - glEnd(); - glBlendFunc(GL_SRC_ALPHA,GL_ONE); - } - - /* render STARS */ - - if (parameters.enableStars) { - if ( starTexture ) { - glEnable( GL_TEXTURE_2D ); - glBindTexture( GL_TEXTURE_2D, currentTexture = starTexture ); - } else - glDisable( GL_TEXTURE_2D ); - - glBegin( GL_QUADS ); - bool flickers = parameters.enableStarFlickering; - float alpha = flickers ? 0.5 : 1.0; - Particle * star = starList.first(); - for (; star; star = starList.next()) - { - if (flickers && DRAND<0.6) - continue; - - GLfloat sizeX = star->pixelSize * unitX, - sizeY = star->pixelSize * unitY, - pLeft = star->xpos - sizeX, - pRight = star->xpos + sizeX, - pTop = star->ypos + sizeY, - pBottom = star->ypos - sizeY; - glColor4f(star->colour[0], star->colour[1], star->colour[2], alpha); - glTexCoord2f( 0, 0 ); // Bottom Left - glVertex2f( pLeft, pBottom ); - glTexCoord2f( 0, 1 ); // Top Left - glVertex2f( pLeft, pTop ); - glTexCoord2f( 1, 1 ); // Top Right - glVertex2f( pRight, pTop ); - glTexCoord2f( 1, 0 ); // Bottom Right - glVertex2f( pRight, pBottom ); - } - glEnd(); - } - - /* render FIREWORKS */ - - glBegin( GL_QUADS ); - bool playedExplodeSound = false; - bool flashedScreen = false; - Particle * particle = particleList.first(); - for (; particle; particle = particleList.next()) - { - //bind the texture for current particle (if not already bound) - if ( !particle->texture ) { - glEnd(); - glDisable( GL_TEXTURE_2D ); - glBegin( GL_QUADS ); - currentTexture = 0; - } else if ( particle->texture != currentTexture ) { - glEnd(); - glEnable( GL_TEXTURE_2D ); - glBindTexture( GL_TEXTURE_2D, currentTexture = particle->texture ); - glBegin( GL_QUADS ); - } - - //perspective projection (done by hand to make it funnier than opengl's :-) - float mfactor = PERSP_MAG_FACTOR * particle->ypos; - if ( mfactor < -246.0 ) { - particleList.remove(); - particleList.prev(); - continue; - } - float sfactor = 256.0 / (256.0 + mfactor), - posx = sfactor * particle->xpos, - posy = sfactor * particle->zpos - 4.0; - //size computation (magnify if enableMegaFlares is set) - if ( parameters.enableMegaFlares ) { - mfactor = parameters.megaFlares*particle->ypos; - if ( mfactor < -255.0 || mfactor > 512.0 ) { - particleList.remove(); - particleList.prev(); - continue; - } - sfactor = 256.0 / (256.0 + mfactor); - if ( sfactor > 64 ) - sfactor = 76.8 - sfactor / 5.0; - } - float size = sfactor * particle->pixelSize, - sizeX = size * unitX, - sizeY = size * unitY; - - //determine brightness (alpha component) for the particle - if ( particle->useLife ) { - float life = particle->life, - startLife = particle->startLife; - //bright changes with the following curve: "2*k - k^2" (or "k(2-k)") - if ( life > startLife ) - particle->colour[3] = startLife + 1 - life; - else - particle->colour[3] = life / startLife; - //apply flickering if enabled - if (particle->flicker < 0) { - particle->colour[3] = 0.2; - if (++particle->flicker >= 0) - particle->flicker = FLICKER_FRAMES_DELAY; - } else if (particle->flicker > 0) { - if ( life <= startLife ) - particle->colour[3] = 1.0; - if (--particle->flicker <= 0) - particle->flicker = -FLICKER_FRAMES_DELAY; - } - glColor4fv( particle->colour ); - } else - glColor3fv( particle->colour ); - - //draw particle - float pLeft = posx - sizeX, - pTop = posy + sizeY, - pRight = posx + sizeX, - pBottom = posy - sizeY; - glTexCoord2f( 0, 0 ); // Bottom Left - glVertex2f( pLeft, pBottom ); - glTexCoord2f( 0, 1 ); // Top Left - glVertex2f( pLeft, pTop ); - glTexCoord2f( 1, 1 ); // Top Right - glVertex2f( pRight, pTop ); - glTexCoord2f( 1, 0 ); // Bottom Right - glVertex2f( pRight, pBottom ); - - //phisically update parameters of the particle - particle->updateParameters( timeDiff ); - - //check for particle death / explosion - switch (particle->particleType) - { - //a Fireparticle is restarted when in right conditions - case Particle::FireParticle: - if ( posx < -FIELDW_2 || posx > FIELDW_2 || - (particle->zpos < -10.0 && posy < -FIELDW_2) ) - { - particle->initializeValues(); - if ( DRAND > 0.9995 ) - particle->zspeed *= 4; - } - break; - - //a leader explodes when his z speed drops to zero - //or, if it uses life, at death - case Particle::FireWorkLeaderParticle: - if ((particle->zspeed <= 0.0f && !particle->useLife) || - (particle->useLife && particle->life <= 0.0) ) - { - // play sound if enabled (and once per frame) - if (parameters.enableSound && !playedExplodeSound) - { - playSound(sound_explosion); - playedExplodeSound = true; - } - // flash screen if enabled - if (parameters.enableFlash && !flashedScreen) { - glEnd(); - glDisable( GL_TEXTURE_2D ); - glColor4f( 1,1,1, parameters.flashOpacity / 10.0 ); - glBegin( GL_TRIANGLE_STRIP ); - glVertex2f( FIELDW_2, FIELDW_2 ); - glVertex2f( -FIELDW_2, FIELDW_2 ); - glVertex2f( FIELDW_2, -FIELDW_2 ); - glVertex2f( -FIELDW_2, -FIELDW_2 ); - glEnd(); - if ( particleTexture ) - glEnable( GL_TEXTURE_2D ); - glBegin( GL_QUADS ); - flashedScreen = true; - } - // generating children and removing parent - int elementIndex = particleList.at(); - explodeFirework(particle); - particleList.remove(elementIndex); - particleList.prev(); - } else if ( parameters.enableTrails && DRAND < 0.4 ) { - // leave trail behind the particle (it'a small and slow red debris) - Particle * p = new Particle( Particle::FireWorkDebrisParticle ); - p->initializeValues( 0, particle, 1, 1 ); - p->texture = particleTexture; - p->xspeed /= 4; - p->yspeed /= 4; - p->zspeed /= 8; - p->zacc /= 4; - p->pixelSize = 2; - p->colour[0] /= 2; - int elementIndex = particleList.at(); - particleList.append( p ); - particleList.at( elementIndex ); - } - break; - - //remove if dead or outside field - default: - if (particle->life <= 0.0 || posx<-FIELDW_2 || posx>FIELDW_2 || posy<-FIELDW_2) { - particleList.remove(); - particleList.prev(); - } - break; - } - } - glEnd(); - - /* render WRITINGS */ - - if ( parameters.enableWritings ) - { - int chance = (int) (1000.0 * DRAND); - if ( !chance ) { - static const TQString someStrings[] = { - i18n("www.kde.org"), - i18n("My TDE, please!"), - i18n("KoNqUeR the World"), - i18n("KFIRESAVER 3D"), - i18n("Gimme your eyes..."), - i18n("Thank you for using TDE"), - i18n("Going insane tonight"), - }; - int n = (int)(6.0 * DRAND); - writer->spawnWords( someStrings[n], Writer::Fun1 ); - } - writer->render( timeDiff ); - } - - /* generate a new FIREWORK_LEADER */ - - int random = (int) ((float)parameters.fireworksFrequency * DRAND); - if (showp.ShowType == Show) - { - //double the chances ('frequency') to raise a new leaderParticle - //but envelop it under a sine function - float step = (showp.timeStamp - timeCurrent) / showp.timeGap; - if (DRAND > sin(M_PI*step)) - random = -1; - if (showp.type == AngelHairs && DRAND < 0.5) - random = -1; - } - if ( !random ) - { - Particle * particle = new Particle( Particle::FireWorkLeaderParticle ); - particle->initializeValues(); - particle->texture = flareTexture; - particleList.append( particle ); - } - - /* explode a logo */ - - int logoImages = imageList.count(); - if ( logoImages > 0 ) { - random = (int) (parameters.logoFrequency * logoImages * 200.0 * DRAND); - if ( random < logoImages ) - { - if (parameters.enableFlash && !flashedScreen) { - glDisable( GL_TEXTURE_2D ); - glColor4f( 1,1,1, parameters.flashOpacity / 10.0 ); - glBegin( GL_TRIANGLE_STRIP ); - glVertex2f( FIELDW_2, FIELDW_2 ); - glVertex2f( -FIELDW_2, FIELDW_2 ); - glVertex2f( FIELDW_2, -FIELDW_2 ); - glVertex2f( -FIELDW_2, -FIELDW_2 ); - glEnd(); - } - burnLogo( imageList.at(random) ); - } - } -} - - -int KFireSaver :: pickColour() -{ - int color = (int) (DRAND * parameters.colorsCount); - return parameters.colorsT[ color ]; -} - - -KFireSaver :: enumFireworkType KFireSaver :: pickType() -{ - int type = (int) (DRAND * parameters.typesCount); - return parameters.typesT[ type ]; -} - - -void KFireSaver :: explodeFirework(Particle* leaderParticle) -{ - GLfloat displace[3] = {0.0,0.0,0.0}; - float tmp1 = 0.0, tmp2 = 0.0, tmp3 = 0.0, tmp4 = 0.0, tmp5 = 0.0; - - // color of exploded particles - bool bicolor = parameters.enableCombos && (showp.forceBicolour || DRAND > 0.95), - flickers = false; - int cscheme = showp.forceColour ? showp.colour : pickColour(), - cscheme2 = showp.forceColour ? showp.colourSec : pickColour(); - - // randomize type of exploding firework - enumFireworkType fwType = - showp.forceType ? (enumFireworkType) showp.type : pickType(); - - // other options for generated particles - int number = (int) ((DRAND + DRAND) * 150.0); - float power = showp.forcePower ? - showp.powerEnvelop * (0.8 + 0.3*DRAND) : - DRAND * 11.0 + 2.0, - powermin = DRAND * power; - - // now some rules ... - //a splitter can't split up more than 2 times - if (fwType == Splitter && leaderParticle->explosionsDepth > 1) { - if (parameters.typesCount == 1) - return; - if (showp.forceType) - fwType = showp.typeSec; - if (fwType == Splitter) - while ( (fwType = pickType()) == Splitter ); - } - - // PRE-ADJUST parameters for the firework we're creating - switch ( fwType ) - { - //no need to handle this. it's the default configuration. - case Sphere: - break; - - //explosion whithout emitting particles, only a flash - case NoFW: - number = 1; - power = powermin = 0; - break; - - //splits up into 'number' orange pieces. tmp1 holds base_life - case Splitter: - cscheme = showp.forceColour ? showp.colour : 1; - bicolor = false; - number = 3 + (int) (DRAND * 4); - power /= 2.0; - powermin = power / 2.0; - tmp1 = 0.4 + DRAND * 1.5; - break; - - //randomize a couple of angles (phi - theta) for exploding circle - case BiCircle: - number *= 2; - case Circle: - power = DRAND * 5.0 + 4.0; - tmp1 = DRAND * M_PI; - tmp2 = DRAND * M_PI; - tmp4 = cos(tmp2); //c2 - tmp3 = sin(tmp2); //s2 - tmp2 = cos(tmp1); //c1 - tmp1 = sin(tmp1); //s1 - break; - - //cascade of flickering orange particles - case AngelHairs: - cscheme = showp.forceColour ? showp.colour : 1; - bicolor = false; - flickers = true; - power = 0.8 + DRAND * 1.9; - powermin = DRAND*0.5; - number = 100 + (int)(DRAND * 150); - displace[0] = -leaderParticle->xspeed/2; - displace[1] = -leaderParticle->yspeed/2; - displace[2] = power; - break; - - //behave as a standard spherical firework - case Spirals: - break; - - //not yet implemented, suppressing particles - case SuperNova: - case NoRender: - number = 0; - break; - } - - //limit number of particles as we are getting to the capacity saturation - float currentParticles = (float) particleList.count(); - const float particleCapacity = 15000; - const float particleGap = 8000; - if ( number > 10 && currentParticles > (particleCapacity - particleGap) ) - { - //NoFW, Splitter and NoRender aren't limited. - number = (int)( (float)number * (particleCapacity - currentParticles) / particleGap ); - if ( number < 10 ) - number = 0; - } - - int newExplosionsDepth = leaderParticle->explosionsDepth + 1; - for (int i=0 ; i<number ; i++) - { - Particle * particle; - if ( fwType == Spirals ) - particle = new TurningParticle( Particle::FireWorkDebrisParticle ); - else - particle = new Particle( Particle::FireWorkDebrisParticle ); - - particle->initializeValues ( - bicolor && (i>number/2) ? cscheme2 : cscheme, - leaderParticle, powermin, power, - flickers, displace ); - particle->texture = particleTexture; - particle->explosionsDepth = newExplosionsDepth; - - // POST-ADJUST particle coefficients adapting to current FireworkType - switch ( fwType ) - { - //create a big, white particle, simulating explosion - case NoFW: - if (parameters.enableFade) - particle->startLife = particle->life = 0.030; - else - particle->startLife = particle->life = 0.075; - particle->texture = flareTexture; - particle->colour[0]= - particle->colour[1]= - particle->colour[2]=1.0; - particle->pixelSize = 50.0 + 75.0 * DRAND; - particle->zacc = 0; - break; - - //default. no need to change parameters, only create the - //'sphere light' as the first big particle if set. - case Sphere: - if (i==0 && parameters.enableSphereLight && number > 40) { - particle->texture = flareTexture; - particle->xspeed = leaderParticle->xspeed; - particle->yspeed = leaderParticle->yspeed; - particle->zspeed = 0.0; - particle->colour[0] /= 2.0; - particle->colour[1] /= 2.0; - particle->colour[2] /= 2.0; - float impression = power * (float)number/5.0; - particle->pixelSize = 25.0 * DRAND + impression; - if (parameters.enableFade) { - particle->startLife = particle->life = 0.040; - } else { - particle->startLife = 1.3; - particle->life = 1.8; - } - } - break; - - // - case Splitter: - particle->particleType = Particle::FireWorkLeaderParticle; - particle->pixelSize *= 3.0; - particle->startLife = particle->life = tmp1 * (0.75 + DRAND/3.0); - if (particle->zspeed < 0) - particle->zspeed = -particle->zspeed; - break; - - case Circle: - case BiCircle: - tmp5 = 2 * M_PI * DRAND; - //MMX can be useful.. if you know how to use it :-) - if ( fwType == BiCircle && i > number/2 ) { - GLfloat ey = cos(tmp5), - ez = sin(tmp5); - particle->xspeed = power * ( tmp3*ez ); - particle->yspeed = power * ( tmp2*ey - tmp1*tmp4*ez ); - particle->zspeed = power * ( tmp1*ey + tmp2*tmp4*ez ); - } else { - GLfloat ex = sin(tmp5), - ey = cos(tmp5); - particle->xspeed = power * ( tmp4*ex ); - particle->yspeed = power * ( tmp1*tmp3*ex + tmp2*ey ); - particle->zspeed = power * ( -tmp2*tmp3*ex + tmp1*ey ); - } - break; - - case AngelHairs: - particle->zacc = -9.807 * (0.05 + DRAND*0.20); - particle->life = 2.0 + DRAND*2.5; - particle->startLife = particle->life - 1; - if (particle->zspeed < 0) - particle->zspeed *= -1; - //particle->pixelSize = 5.0; - break; - - case Spirals: - particle->texture = diastarTexture; - break; - - //discard cases - case SuperNova: - case NoRender: - break; - } - particleList.append(particle); - } -} - -void KFireSaver :: timerEvent(TQTimerEvent*) -{ - timeval tv; - gettimeofday(&tv,NULL); - double currentTime = (double)tv.tv_sec + (double)tv.tv_usec/1000000.0; - - bool chooseType = false, - chooseColor = false, - chooseOthers = false, - updateTimings = false; - bool firstTime = showp.timeStamp == 0.0; - bool endOfScene = currentTime >= showp.timeStamp; - - if (firstTime) - switch (showp.ShowType) - { - case Monotype: - /* first time choose the type, color and attributes will - be choosed randomly for every firework which explodes*/ - showp.forceType = true; - chooseType = true; - break; - - case Monochrome: - /* first time choose the color, type and attributes will - be choosed randomly for every firework which explodes*/ - showp.forceColour = true; - chooseColor = - chooseOthers = true; - break; - - default: break; - } - - if (endOfScene || firstTime) - switch (showp.ShowType) - { - case Show: - /* if a scene ended, randomize global parameters for the - whole next scene */ - showp.forceType = true; - showp.forceColour = true; - showp.forcePower = true; - chooseOthers = - chooseColor = - chooseType = true; - updateTimings = true; - break; - - default: break; - } - - if ( chooseType ) - { - showp.type = pickType(); - if (parameters.typesCount < 2) - showp.typeSec = NoRender; - else - while ((showp.typeSec = pickType()) == showp.type); - } - if ( chooseColor ) { - showp.colour = pickColour(); - showp.colourSec = pickColour(); - } - if ( chooseOthers ) - { - showp.powerEnvelop = DRAND * 8.0 + 3.0; - if (DRAND > 0.9) - { - showp.forceBicolour = true; - showp.colourSec = pickColour(); - } else - showp.forceBicolour = false; - } - if ( firstTime || updateTimings ) - { - if (DRAND < 0.2) - showp.timeGap = 1.0 + DRAND * 2.0; - else - showp.timeGap = 3.0 + DRAND * 10.0; - showp.timeStamp = currentTime + showp.timeGap; - showp.timeGap /= 1.5; //hack to introduce delay in sine func - } - - updateGL(); -} - -void KFireSaver :: burnLogo(TQImage * image) -{ - if (!image || image->isNull()) - return; - int step = parameters.enableReduceLogo ? 2 : 1, - imageW = image->width(), - imageH = image->height(), - offsetX = imageW / 2, - offsetY = imageH / 2; - float speed = FIELDW_4 / (imageW > imageH ? imageW : imageH), - speedXOffs = 5 * (DRAND - DRAND), - speedYOffs = DRAND + DRAND + 1; - //if image is too big, lower sample points - while ((imageW/step)>96 || (imageH/step)>96) - step *= 2; - for (int y=0 ; y<imageH ; y+=step) - { - for (int x=0 ; x<imageW ; x+=step) - { - TQRgb pixel = image->pixel(x,y); - if ( tqAlpha(pixel) < 250 ) - continue; - //if ( DRAND > 0.9 ) - // continue; - - Particle* particle = new Particle( Particle::LogoParticle ); - particle->initializeValues(); - particle->texture = particleTexture; - - float xI = (x - offsetX) , - yI = (offsetY - y) ; - particle->xpos = xI * speed * 0.5; - particle->zpos = yI * speed * 0.5 + 5; - particle->xspeed = xI * speed + speedXOffs; - particle->zspeed = yI * speed + speedYOffs; - - particle->colour[0] = tqRed(pixel) / 255.0f; - particle->colour[1] = tqGreen(pixel) / 255.0f; - particle->colour[2] = tqBlue(pixel) / 255.0f; - - particleList.append(particle); - } - } - if (parameters.enableSound) - playSound(sound_debris); -} - -void KFireSaver :: playSound(TQString file) -{ - //flush inactive players - KPlayObject * playObject = playObjectList.first(); - while ( playObject ) - { - if ( playObject->state() != Arts::posPlaying ) - { - playObjectList.remove(); - playObject = playObjectList.current(); - } else - playObject = playObjectList.next(); - } - - //discart this sound if the player queue is already full (4 channels playing) - if ( playObjectList.count() >= 6 ) - return; - - // not needed when all of the files are in the distribution - //if (!TQFile::exists(file)) - //return; - - KPlayObjectFactory factory(artsServer.server()); - playObject = factory.createPlayObject(KURL(file), true); - - if (playObject && !playObject->isNull()) - { - playObject->play(); - playObjectList.append(playObject); - } -} - -bool KFireSaver :: loadTexture( TQString fileName, unsigned int & textureID ) -{ - //reset texture ID to the default EMPTY value - textureID = 0; - - //load image - TQImage tmp; - if ( !tmp.load( fileName ) ) - return false; - - //convert it to suitable format (flipped RGBA) - TQImage texture = TQGLWidget::convertToGLFormat( tmp ); - if ( texture.isNull() ) - return false; - - //get texture number and bind loaded image to that texture - glGenTextures( 1, &textureID ); - glBindTexture( GL_TEXTURE_2D, textureID ); - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); - glTexImage2D( GL_TEXTURE_2D, 0, 4 /* 3 ??? */, texture.width(), texture.height(), - 0, GL_RGBA, GL_UNSIGNED_BYTE, texture.bits() ); - return true; -} - -void KFireSaver :: freeTexture( unsigned int & textureID ) -{ - if ( textureID > 0 ) - glDeleteTextures( 1, &textureID ); - textureID = 0; -} - -void KFireSaver :: readConfig () -{ - TDEConfig config("kfiresaverrc",true,false); - - // show - config.setGroup( "Show" ); - showp.ShowType = (enum enumShowType)config.readNumEntry( "ShowType", 1 ); - parameters.fireworksFrequency = 11 - config.readNumEntry( "FireworksFrequency", 7 ); - if ( parameters.fireworksFrequency < 1 ) - parameters.fireworksFrequency = 1; - if ( parameters.fireworksFrequency > 11 ) - parameters.fireworksFrequency = 11; - parameters.fireworksFrequency *= (parameters.fireworksFrequency + 1); //*karl gauss's sum* - parameters.particleSize = config.readNumEntry( "ParticlesSize", 0 ); - if ( parameters.particleSize < -5 ) - parameters.particleSize = -5; - if ( parameters.particleSize > 5 ) - parameters.particleSize = 5; - if ( parameters.enableBottomFire = config.readBoolEntry( "enable-BottomFire", true ) ) - { - TQColor blue = TQt::darkBlue; - parameters.bottomFireColor = config.readColorEntry( "BottomFireColor", &blue ); - } - parameters.enableSound = config.readBoolEntry( "enable-Sounds", false ); - parameters.enableNoOverhead = config.readBoolEntry( "enable-NoOverhead", true ); - parameters.enableRealtime = config.readBoolEntry( "enable-FrameSkip", true ); - - // fireworks - config.setGroup( "Fireworks" ); - parameters.typesCount = 0; - if ( config.readBoolEntry( "use-Classic", true ) ) - parameters.typesT[parameters.typesCount++] = Sphere; - if ( config.readBoolEntry( "use-Explosion", false ) ) - parameters.typesT[parameters.typesCount++] = NoFW; - if ( config.readBoolEntry( "use-FlameRing", false ) ) - parameters.typesT[parameters.typesCount++] = Circle; - if ( config.readBoolEntry( "use-FlameWorld", false ) ) - parameters.typesT[parameters.typesCount++] = BiCircle; - if ( config.readBoolEntry( "use-Fall", false ) ) - parameters.typesT[parameters.typesCount++] = AngelHairs; - if ( config.readBoolEntry( "use-Splitter", false ) ) - parameters.typesT[parameters.typesCount++] = Splitter; - if ( config.readBoolEntry( "use-Spirals", false ) ) - parameters.typesT[parameters.typesCount++] = Spirals; - if ( config.readBoolEntry( "use-SuperNova", false ) ) - parameters.typesT[parameters.typesCount++] = SuperNova; - if ( !parameters.typesCount ) { - kdWarning() << "KFireSaver3D: Warning, no fireworks enabled in config file" << endl; - kdWarning() << " enabling 'Classic Spherical'" << endl; - parameters.typesCount = 1; - parameters.typesT[0] = Sphere; - } - parameters.typesT[ parameters.typesCount ] = - parameters.typesT[ parameters.typesCount-1 ]; - parameters.colorsCount = 0; - if ( config.readBoolEntry( "use-Red", false ) ) - parameters.colorsT[parameters.colorsCount++] = 0; - if ( config.readBoolEntry( "use-Orange", true ) ) - parameters.colorsT[parameters.colorsCount++] = 1; - if ( config.readBoolEntry( "use-Green", false ) ) - parameters.colorsT[parameters.colorsCount++] = 2; - if ( config.readBoolEntry( "use-Blue", false ) ) - parameters.colorsT[parameters.colorsCount++] = 3; - if ( config.readBoolEntry( "use-White", true ) ) - parameters.colorsT[parameters.colorsCount++] = 4; - if ( config.readBoolEntry( "use-Purple", false ) ) - parameters.colorsT[parameters.colorsCount++] = 5; - if ( config.readBoolEntry( "use-DeepGreen", true ) ) - parameters.colorsT[parameters.colorsCount++] = 6; - if ( !parameters.colorsCount ) - { - kdWarning() << "KFireSaver3D: Warning enable at least one color" << endl; - kdWarning() << " enabling 'Blinding White'" << endl; - parameters.colorsCount = 1; - parameters.colorsT[0] = 4; - } - parameters.colorsT[ parameters.colorsCount ] = - parameters.colorsT[ parameters.colorsCount-1 ]; - parameters.enableCombos = config.readBoolEntry( "use-Multicolor", true ); - - // specials - config.setGroup( "Specials" ); - if ( parameters.enableLogos = config.readBoolEntry( "enable-Logos", true ) ) - { - TQImage tempImage; - tempImage.setAlphaBuffer( true ); - if ( config.readBoolEntry( "LogosTux", true ) ) - if ( tempImage.load(locate("data","kfiresaver/kfs_tux.png")) ) - imageList.append( new TQImage(tempImage) ); - if ( config.readBoolEntry( "LogosKonqui", true ) ) - if ( tempImage.load(locate("data","kfiresaver/kfs_kde.png")) ) - imageList.append( new TQImage(tempImage) ); - if ( config.readBoolEntry( "LogosKDEIcons", true ) ) { - const TQString icons[] = { - "3floppy_unmount", "cdrom_unmount", "hdd_mount", "kmix", - "network", "my-computer", "folder_home", "konqueror", - "kmail", "penguin", "personal" }; - for ( int i = 0; i < 11; i++ ) - imageList.append( new TQImage(DesktopIcon(icons[i],64).convertToImage()) ); - } - parameters.enableReduceLogo = config.readBoolEntry( "LogosReduceDetail", true ); - parameters.logoFrequency = 11 - config.readNumEntry( "LogosFrequency", 4 ); - if ( parameters.logoFrequency < 1 ) - parameters.logoFrequency = 1; - if ( parameters.logoFrequency > 11 ) - parameters.logoFrequency = 11; - } - if ( parameters.enableStars = config.readBoolEntry( "enable-Stars", true ) ) - { - parameters.enableStarFlickering = config.readBoolEntry( "StarsFlicker", false ); - parameters.enableStarGradient = config.readBoolEntry( "StarsGradient", true ); - parameters.starsNumber = config.readNumEntry( "StarsNumber", 4 ); - if ( parameters.starsNumber < 0 ) - parameters.starsNumber = 0; - if ( parameters.starsNumber > 10 ) - parameters.starsNumber = 10; - } - parameters.enableWritings = config.readBoolEntry( "enable-Writings", true ); - - // effects - config.setGroup( "Effects" ); - parameters.enableSphereLight = config.readBoolEntry( "enable-SphericalLight", true ); - if ( parameters.enableFlash = config.readBoolEntry( "enable-Flash", false ) ) - { - parameters.flashOpacity = config.readNumEntry( "FlashOpacity", 5 ); - if ( parameters.flashOpacity < 0 ) - parameters.flashOpacity = 0; - if ( parameters.flashOpacity > 10 ) - parameters.flashOpacity = 10; - } - if ( parameters.enableFade = config.readBoolEntry( "enable-Fade", false ) ) - { - parameters.fadeAmount = config.readNumEntry( "FadeIntensity", 3 ); - if ( parameters.fadeAmount < 0 ) - parameters.fadeAmount = 0; - if ( parameters.fadeAmount > 9 ) - parameters.fadeAmount = 9; - } - if ( parameters.enableMegaFlares = config.readBoolEntry( "enable-Flares", true ) ) - { - parameters.megaFlares = config.readNumEntry( "FlaresDimension", 5 ); - if ( parameters.megaFlares < 0 ) - parameters.megaFlares = 0; - if ( parameters.megaFlares > 10 ) - parameters.megaFlares = 10; - parameters.megaFlares += 4; - parameters.megaFlares *= 2; - } - parameters.enableTrails = config.readBoolEntry( "enable-Trail", false ); -} diff --git a/kscreensaver/kdesavers/firesaver.h b/kscreensaver/kdesavers/firesaver.h deleted file mode 100644 index 8a34c5e9..00000000 --- a/kscreensaver/kdesavers/firesaver.h +++ /dev/null @@ -1,170 +0,0 @@ -// This file is part of KFireSaver3D. - -// KFireSaver3D 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. - -// KFireSaver3D 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 KFireSaver3D; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - - -// Author: Enrico Ros, based on the great work of David Sansome (kfiresaver) -// Email: [email protected] - -#ifndef KFIRESAVER_H -#define KFIRESAVER_H - -#define PERSP_MAG_FACTOR 8.0 -#define NUMBER_OF_FIREPARTICLES 180 - -#define MSECPERIOD 17 // 1000ms / 60fps = 16.6667 ~= 17 [ms/frame] - -#define FIELDWIDTH 30.0 -#define FIELDW_2 (FIELDWIDTH/2.0) -#define FIELDW_4 (FIELDWIDTH/4.0) - -#include <tqgl.h> -#include <tqptrlist.h> -#include <tqimage.h> -#include <tqstring.h> -#include <tqcolor.h> - -#include <arts/kplayobject.h> -#include <arts/kartsserver.h> -#include <arts/kartsdispatcher.h> - -class Particle; -class Writer; - -class KFireSaver : public TQGLWidget -{ - public: - KFireSaver( TQWidget *parent=0, const char *name=0 ); - ~KFireSaver(); - - protected: - void initializeGL(); - void resizeGL( int, int ); - void paintGL(); - void timerEvent( class TQTimerEvent * ); - - private: - enum enumFireworkType - { - Sphere = 0, - NoFW = 1, - Circle = 2, - BiCircle = 3, - AngelHairs = 4, - Splitter = 5, - Spirals = 6, - SuperNova = 7, - NoRender = 8 - }; - - inline enumFireworkType pickType(); - inline int pickColour(); - void explodeFirework(Particle* fireWorkLeaderParticle); - void burnLogo(TQImage * image); - void playSound(TQString file); - bool loadTexture(TQString file, unsigned int & textureID); - void freeTexture(unsigned int & textureID); - void readConfig(); - - //list of particles and stars - TQPtrList<Particle> - particleList, - starList; - - //stuff for 'exploding' pixmaps (kde, tux, icons..) - TQPtrList<TQImage> - imageList; - - //texture stuff - unsigned int - currentTexture, - particleTexture, - starTexture, - flareTexture, - diastarTexture; // (to add) novaTexture cometTexture - - //sound stuff - KArtsDispatcher artsDispatcher; - KArtsServer artsServer; - TQPtrList<KPlayObject> playObjectList; - TQString sound_explosion, - sound_debris; - - //other stuff - class Writer * writer; - float unitX, - unitY; - double timeStampFrame; - bool firstGLFrame; - - struct { - bool enableBottomFire, //show - enableSound, - enableNoOverhead, - enableRealtime, - enableCombos, //fireworks - enableLogos, //specials - enableReduceLogo, - enableStars, - enableStarFlickering, - enableStarGradient, - enableWritings, - enableSphereLight, //effects - enableFlash, - enableFade, - enableMegaFlares, - enableTrails; - int fireworksFrequency, //show - particleSize, - logoFrequency, //specials - starsNumber, - flashOpacity, //effects - fadeAmount, - megaFlares; - TQColor - bottomFireColor; - int colorsCount, - colorsT[8], - typesCount; - enumFireworkType - typesT[9]; - } parameters; - - - enum enumShowType { - Show = 0, - Random = 1, - Monotype = 2, - Monochrome = 3 - }; - - struct { - enum enumShowType ShowType; - int colour, - colourSec; - enumFireworkType - type, - typeSec; - bool forceBicolour, - forceColour, - forcePower, - forceType; - float powerEnvelop; - double timeStamp, - timeGap; - } showp; -}; - -#endif diff --git a/kscreensaver/kdesavers/firesaverparticle.cpp b/kscreensaver/kdesavers/firesaverparticle.cpp deleted file mode 100644 index 421115a7..00000000 --- a/kscreensaver/kdesavers/firesaverparticle.cpp +++ /dev/null @@ -1,273 +0,0 @@ -// This file is part of KFireSaver3D. - -// KFireSaver3D 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. - -// KFireSaver3D 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 KFireSaver3D; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - - -// Author: Enrico Ros, based on the great work of David Sansome (kfiresaver) -// Email: [email protected] - -#include <math.h> -#include <stdlib.h> - -#include "firesaverparticle.h" -#include "firesaver.h" - -//current color scheme : red orng grn blue w m c -static const GLfloat c_red_min[7] = { 0.4, 0.9, 0, 0, 1, 0, 0 }; -static const GLfloat c_red_max[7] = { 1, 1, 0, 0, 1, 1, 0 }; -static const GLfloat c_green_min[7] = { 0, 0.4, 0.4, 0, 1, 0, 0 }; -static const GLfloat c_green_max[7] = { 0, 0.5, 1, 0.5, 1, 0, 1 }; -static const GLfloat c_blue_min[7] = { 0, 0.1, 0, 0.5, 1, 0, 0 }; -static const GLfloat c_blue_max[7] = { 0, 0.2, 0, 1, 1, 1, 1 }; - - -//default initialization (good for Leader / Fire) -Particle :: Particle( ParticleType pT ) - : particleType( pT ), explosionsDepth( 0 ), texture( 0 ), - xpos( 0.0 ), ypos( 0.0 ), zpos( -9.9 ), - xspeed( 0.0 ), yspeed( 0.0 ), zspeed( 0.0 ), zacc( -9.807 ), - life( 0.0 ), startLife( 0.0 ), - pixelSize( 5.0 ), useLife( true ), flicker( 0 ) -{ - colour[0] = 0; - colour[1] = 0; - colour[2] = 0; - colour[3] = 1; -} - - -void Particle :: initializeValues ( - int cs, - Particle* debrisParent, - GLfloat powermin, GLfloat powermax, - bool flickers, - GLfloat *displace ) -//note: this function is called when a particle needs a set of default parameters. -// these depends on the ParticleType. -{ - switch (particleType) - { -// -- FireParticle (params: [cs]) -// born in a rectangle centered in { 0, 0, -9.9 } -// speed 3-6 [m/s] blue/cyan colored -// this is only done at the beginning or when a particle dies - case FireParticle: - xpos = DRAND * FIELDWIDTH - FIELDW_2; - ypos = DRAND - 2.0; - - xspeed = DRAND * 4.0 - 2.0; - yspeed = DRAND * 2.0; - zspeed = DRAND * 3.0 + 3.0; - - useLife = false; - pixelSize = 2.0 + DRAND * 2.0; - break; - -// -- FireWorkLeaderParticle (params: none) -// they start in a rectangle at the same height but -// with different power and the same 'orange' colour - case FireWorkLeaderParticle: - xpos = DRAND * 14.0 - 7.0; - ypos = DRAND * 2.0 - 1.0; - - xspeed = DRAND * 8.0 - 4.0 - (xpos / 2.0)*DRAND; - yspeed = DRAND * 8.0 - 4.0; - zspeed = DRAND * 6.5 + 18.0; - - colour[0] = 0.6; - colour[1] = DRAND * 0.4; - colour[2] = 0.0; - - useLife = false; - break; - -// -- LogoParticle (params: none) -// they start in the middle of the screen. -// little g-force, constant life, weavy-y - case LogoParticle: - yspeed = 3*(DRAND - DRAND); - zacc = -9.807f / 5.0f; - - startLife = 0.7f; - life = 1.7f; - break; - -// -- StarParticle (params: none) -// spherically distributed. xpos and ypos are the -// transformed screen positions of the star. - case StarParticle: - colour[0] = DRAND * 0.2 + 0.5; - colour[1] = DRAND * 0.2 + 0.5; - colour[2] = DRAND * 0.2 + 0.5; - - {bool accepted = false; - while (!accepted) { - float module = 30, - theta = DRAND * M_PI * 2.0, - u = DRAND * 2.0 - 1.0, - root = sqrt( 1 - u*u ); - xpos = module * root * cos(theta); - ypos = fabs(module * root * sin(theta)) - 10.0; - zpos = fabs(module * u); - - float sfactor = 256.0 / (256.0 + PERSP_MAG_FACTOR*ypos); - xpos *= sfactor; - ypos = sfactor * zpos - FIELDW_2; - - pixelSize = sfactor * (2.0 + 3.0*DRAND); - - accepted = xpos > -FIELDW_2 && xpos < FIELDW_2 && - ypos > -FIELDW_2 && ypos < FIELDW_2; - }} - break; - -// -- FireWorkDebrisParticle (params: cs, parent, [powerm], [powerM], [flickers], [displace]) -// parameters are randomized for a 'spherical' explosion. -// power{min,max}, flickers and displace applies only for that -// kind of ParticleType. - case FireWorkDebrisParticle: - - //same origin of the dead leader - xpos = debrisParent->xpos; - ypos = debrisParent->ypos; - zpos = debrisParent->zpos; - - //true spherical randomization - float module = powermin + DRAND * (powermax - powermin), - theta = DRAND * M_PI * 2.0, - u = DRAND * 2.0 - 1.0, - root = sqrt( 1 - u*u ); - xspeed = debrisParent->xspeed + module * root * cos(theta) * (1.0 + DRAND/3.0); - yspeed = debrisParent->yspeed + module * root * sin(theta) * (1.0 + DRAND/3.0); - zspeed = module * u * (1.0 + DRAND/3.0); //was 0.9 + DRAND/3 - - //if set add a displace to speed - if ( displace ) { - xspeed += displace[0]; - yspeed += displace[1]; - zspeed += displace[2]; - } - - //randomize the color choosing on current palette - colour[0] = c_red_min[cs] + (c_red_max[cs]-c_red_min[cs]) * DRAND; - colour[1] = c_green_min[cs] + (c_green_max[cs]-c_green_min[cs]) * DRAND; - colour[2] = c_blue_min[cs] + (c_blue_max[cs]-c_blue_min[cs]) * DRAND; - - pixelSize = DRAND * 2.0 + 2.0; - zacc = -9.807 / (6.0 - pixelSize); - - life = startLife = pixelSize / 2.0; - - //if flickers is set the current visible delay is randomized - if ( flickers ) - flicker = (int) ((DRAND * 2.0 - 1.0) * (float)FLICKER_FRAMES_DELAY); - break; - } -} - - -void Particle :: updateParameters( float dT ) -//note: this procedure uses a reduced set of parameters -// x and y axis acceleration is no more used -// the only external iterations are: -// - the g force -// - a sort of air friction that limits speed in x,y and -// acceleration on z -{ - xpos += xspeed * dT; - ypos += yspeed * dT; - zpos += (zspeed + zacc*dT/2) * dT; - - zspeed += zacc * dT; - - xspeed *= 0.998; - yspeed *= 0.998; - zspeed *= 0.999; - - if (useLife) - life -= dT; -} - - -// BEGIN TurningParticle class - -TurningParticle :: TurningParticle( ParticleType pT ) - : Particle( pT ) {} - -void TurningParticle :: initializeValues ( - int cs, - Particle* leader, - GLfloat powermin, - GLfloat powermax, - bool /*flickers*/, - GLfloat * /*displace*/ ) -{ - //same origin of the parent - xpos = leader->xpos; - ypos = leader->ypos; - zpos = leader->zpos; - - //velocity : true spherical randomization - float module = powermin + (powermax - powermin) * DRAND * 0.6, - theta = DRAND * M_PI * 2.0, - u = DRAND * 2.0 - 1.0, - root = sqrt( 1 - u*u ); - xspeed = -module * root * cos(theta); - yspeed = -module * root * sin(theta); - zspeed = module * u; - - //spin axis : in quadrature with velocity - module = (1 + DRAND) / 40; - u = DRAND * 2.0 - 1.0; - root = sqrt( 1 - u*u ); - // axis to spin around - wx = module * root * cos(theta + M_PI_2); - wy = module * root * sin(theta + M_PI_2); - wz = module * u; - - //randomize the color choosing on current palette - colour[0] = c_red_min[cs] + (c_red_max[cs]-c_red_min[cs]) * DRAND; - colour[1] = c_green_min[cs] + (c_green_max[cs]-c_green_min[cs]) * DRAND; - colour[2] = c_blue_min[cs] + (c_blue_max[cs]-c_blue_min[cs]) * DRAND; - - pixelSize = DRAND * 2.0 + 2.0; - zacc = -9.807 / 5.0; - life = startLife = pixelSize / 2.0; -} - - -void TurningParticle :: updateParameters ( float dT ) -{ - //update position - xpos += xspeed * dT; - ypos += yspeed * dT; - zpos += zspeed * dT; - - //tan vector = velocity vector (vect producted by) spin axis - float vx = yspeed * wz - zspeed * wy, - vy = zspeed * wx - xspeed * wz, - vz = xspeed * wy - yspeed * wx; - - //update velocity adding a tangential component (aka infinitesimally - //rotating the vector) - xspeed += vx; - yspeed += vy; - zspeed += vz + zacc * dT; - - if (useLife) - life -= dT; -} - -//END TurningParticle diff --git a/kscreensaver/kdesavers/firesaverparticle.h b/kscreensaver/kdesavers/firesaverparticle.h deleted file mode 100644 index e539adec..00000000 --- a/kscreensaver/kdesavers/firesaverparticle.h +++ /dev/null @@ -1,105 +0,0 @@ -// This file is part of KFireSaver3D. - -// KFireSaver3D 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. - -// KFireSaver3D 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 KFireSaver3D; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - - -// Author: Enrico Ros, based on the great work of David Sansome (kfiresaver) -// Email: [email protected] - -#ifndef KFIRESAVER_PARTICLE_H -#define KFIRESAVER_PARTICLE_H - -#include <tqgl.h> - -#define FLICKER_FRAMES_DELAY 8 -#define DRAND ((float)rand() / (float)RAND_MAX) /*random float between 0 and 1*/ - -/* -- Particle class. - * Sets initial parameters and takes care of updating physics for a single - * fireworks particle. The physics model is the Newtonian one. - */ -class Particle -{ - public: - //enum definitions for type of particle - enum ParticleType - { - FireParticle, - FireWorkLeaderParticle, - FireWorkDebrisParticle, - LogoParticle, - StarParticle - }; - - Particle( ParticleType pT ); - - //public methods for initializing default parameters and update them - virtual void initializeValues ( - int color_scheme = 0, - Particle* leader = 0L, - GLfloat powermin = 5.0, - GLfloat powermax = 10.0, - bool flickers = false, - GLfloat *displace = 0L ); - - virtual void updateParameters ( float timeGap ); - - //public accessible variables of the class - ParticleType particleType; - int explosionsDepth; - unsigned int texture; - - GLfloat xpos, ypos, zpos, - xspeed, yspeed, zspeed, - zacc; - - GLfloat colour[4], - life, startLife, - pixelSize; - - bool useLife; - int flicker; - - private: - Particle(); -}; - - -/* -- TurningParticle class. - * Randomize initial parameters similar to a standard 'spherical' particle - * and takes care of updating physics. The physics model is a funny 'bees' - * (vectorial-product) one. - */ -class TurningParticle : public Particle -{ - public: - TurningParticle( ParticleType pT ); - - virtual void initializeValues ( - int color_scheme = 0, - Particle* leader = 0L, - GLfloat powermin = 5.0, - GLfloat powermax = 10.0, - bool flickers = false, - GLfloat *displace = 0L ); - - virtual void updateParameters ( float dT ); - - private: - float wx, wy, wz; - TurningParticle(); -}; - -#endif diff --git a/kscreensaver/kdesavers/firesaversetup.ui b/kscreensaver/kdesavers/firesaversetup.ui deleted file mode 100644 index 3a3f3536..00000000 --- a/kscreensaver/kdesavers/firesaversetup.ui +++ /dev/null @@ -1,1855 +0,0 @@ -<!DOCTYPE UI><UI version="3.3" stdsetdef="1"> -<class>KFireSaverSetup</class> -<widget class="TQWidget"> - <property name="name"> - <cstring>KFireSaverSetup</cstring> - </property> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>375</width> - <height>344</height> - </rect> - </property> - <property name="sizePolicy"> - <sizepolicy> - <hsizetype>1</hsizetype> - <vsizetype>1</vsizetype> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="caption"> - <string>KFireSaver Setup</string> - </property> - <grid> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <property name="margin"> - <number>0</number> - </property> - <widget class="TQPushButton" row="0" column="2"> - <property name="name"> - <cstring>useButton</cstring> - </property> - <property name="text"> - <string>&Load</string> - </property> - </widget> - <widget class="TQComboBox" row="0" column="1"> - <item> - <property name="text"> - <string>KDE (default)</string> - </property> - </item> - <item> - <property name="text"> - <string>Elegant White</string> - </property> - </item> - <item> - <property name="text"> - <string>Quick Simple</string> - </property> - </item> - <item> - <property name="text"> - <string>Enhanced Reality</string> - </property> - </item> - <item> - <property name="text"> - <string>Hypnotic Illusions</string> - </property> - </item> - <property name="name"> - <cstring>presetCombo</cstring> - </property> - <property name="sizePolicy"> - <sizepolicy> - <hsizetype>3</hsizetype> - <vsizetype>0</vsizetype> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - </widget> - <widget class="TQLabel" row="0" column="0"> - <property name="name"> - <cstring>presetLabel</cstring> - </property> - <property name="text"> - <string>Preset:</string> - </property> - </widget> - <spacer row="0" column="3"> - <property name="name"> - <cstring>spacer1</cstring> - </property> - <property name="orientation"> - <enum>Horizontal</enum> - </property> - <property name="sizeType"> - <enum>Expanding</enum> - </property> - <property name="sizeHint"> - <size> - <width>201</width> - <height>31</height> - </size> - </property> - </spacer> - <widget class="TQTabWidget" row="1" column="0" rowspan="1" colspan="4"> - <property name="name"> - <cstring>tabWidget</cstring> - </property> - <property name="tabShape"> - <enum>Rounded</enum> - </property> - <widget class="TQWidget"> - <property name="name"> - <cstring>tab</cstring> - </property> - <attribute name="title"> - <string>Preview</string> - </attribute> - <grid> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <spacer row="1" column="2"> - <property name="name"> - <cstring>spacer162</cstring> - </property> - <property name="orientation"> - <enum>Horizontal</enum> - </property> - <property name="sizeType"> - <enum>Expanding</enum> - </property> - <property name="sizeHint"> - <size> - <width>30</width> - <height>220</height> - </size> - </property> - </spacer> - <spacer row="1" column="0"> - <property name="name"> - <cstring>spacer161</cstring> - </property> - <property name="orientation"> - <enum>Horizontal</enum> - </property> - <property name="sizeType"> - <enum>Expanding</enum> - </property> - <property name="sizeHint"> - <size> - <width>30</width> - <height>210</height> - </size> - </property> - </spacer> - <widget class="TQLayoutWidget" row="1" column="1"> - <property name="name"> - <cstring>layout118</cstring> - </property> - <grid> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <spacer row="1" column="2"> - <property name="name"> - <cstring>spacer162_2</cstring> - </property> - <property name="orientation"> - <enum>Horizontal</enum> - </property> - <property name="sizeType"> - <enum>Expanding</enum> - </property> - <property name="sizeHint"> - <size> - <width>43</width> - <height>180</height> - </size> - </property> - </spacer> - <widget class="TQFrame" row="1" column="1"> - <property name="name"> - <cstring>previewFrame</cstring> - </property> - <property name="minimumSize"> - <size> - <width>240</width> - <height>180</height> - </size> - </property> - <property name="maximumSize"> - <size> - <width>240</width> - <height>180</height> - </size> - </property> - <property name="frameShape"> - <enum>StyledPanel</enum> - </property> - <property name="frameShadow"> - <enum>Sunken</enum> - </property> - <property name="toolTip" stdset="0"> - <string>preview window</string> - </property> - <property name="whatsThis" stdset="0"> - <string>Here is the preview (if it is not detached)</string> - </property> - <grid> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <widget class="TQLabel" row="0" column="0"> - <property name="name"> - <cstring>previewLabel</cstring> - </property> - <property name="enabled"> - <bool>false</bool> - </property> - <property name="text"> - <string>P R E V I E W</string> - </property> - <property name="alignment"> - <set>AlignCenter</set> - </property> - </widget> - </grid> - </widget> - <spacer row="1" column="0"> - <property name="name"> - <cstring>spacer161_2</cstring> - </property> - <property name="orientation"> - <enum>Horizontal</enum> - </property> - <property name="sizeType"> - <enum>Expanding</enum> - </property> - <property name="sizeHint"> - <size> - <width>30</width> - <height>180</height> - </size> - </property> - </spacer> - <widget class="TQCheckBox" row="0" column="0" rowspan="1" colspan="3"> - <property name="name"> - <cstring>detachBox</cstring> - </property> - <property name="text"> - <string>&Show in separate window</string> - </property> - </widget> - <widget class="TQPushButton" row="2" column="0" rowspan="1" colspan="3"> - <property name="name"> - <cstring>applyButton</cstring> - </property> - <property name="text"> - <string>&Apply && Update</string> - </property> - </widget> - </grid> - </widget> - </grid> - </widget> - <widget class="TQWidget"> - <property name="name"> - <cstring>tab</cstring> - </property> - <attribute name="title"> - <string>Show</string> - </attribute> - <vbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <widget class="TQLayoutWidget"> - <property name="name"> - <cstring>layS1</cstring> - </property> - <hbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <widget class="TQLabel"> - <property name="name"> - <cstring>showLabel1</cstring> - </property> - <property name="sizePolicy"> - <sizepolicy> - <hsizetype>1</hsizetype> - <vsizetype>5</vsizetype> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>Show type:</string> - </property> - </widget> - <widget class="TQComboBox"> - <item> - <property name="text"> - <string>Simple Show</string> - </property> - </item> - <item> - <property name="text"> - <string>Completely Random</string> - </property> - </item> - <item> - <property name="text"> - <string>Only Change Color</string> - </property> - </item> - <item> - <property name="text"> - <string>Only Change Fireworks</string> - </property> - </item> - <property name="name"> - <cstring>showCombo</cstring> - </property> - </widget> - <spacer> - <property name="name"> - <cstring>spacer25</cstring> - </property> - <property name="orientation"> - <enum>Horizontal</enum> - </property> - <property name="sizeType"> - <enum>Expanding</enum> - </property> - <property name="sizeHint"> - <size> - <width>260</width> - <height>21</height> - </size> - </property> - </spacer> - </hbox> - </widget> - <widget class="TQLayoutWidget"> - <property name="name"> - <cstring>layS2</cstring> - </property> - <hbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <widget class="TQLabel"> - <property name="name"> - <cstring>showLabel2</cstring> - </property> - <property name="text"> - <string>Number of fireworks:</string> - </property> - </widget> - <widget class="TQLabel"> - <property name="name"> - <cstring>showLabel3</cstring> - </property> - <property name="text"> - <string>few</string> - </property> - </widget> - <widget class="TQSlider"> - <property name="name"> - <cstring>fireworksSlider</cstring> - </property> - <property name="sizePolicy"> - <sizepolicy> - <hsizetype>3</hsizetype> - <vsizetype>0</vsizetype> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="minValue"> - <number>0</number> - </property> - <property name="maxValue"> - <number>10</number> - </property> - <property name="pageStep"> - <number>1</number> - </property> - <property name="value"> - <number>4</number> - </property> - <property name="orientation"> - <enum>Horizontal</enum> - </property> - </widget> - <widget class="TQLabel"> - <property name="name"> - <cstring>showLabel4</cstring> - </property> - <property name="text"> - <string>more</string> - </property> - </widget> - <spacer> - <property name="name"> - <cstring>spacer6_2</cstring> - </property> - <property name="orientation"> - <enum>Horizontal</enum> - </property> - <property name="sizeType"> - <enum>Expanding</enum> - </property> - <property name="sizeHint"> - <size> - <width>125</width> - <height>21</height> - </size> - </property> - </spacer> - </hbox> - </widget> - <widget class="TQLayoutWidget"> - <property name="name"> - <cstring>layS2_2</cstring> - </property> - <hbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <widget class="TQLabel"> - <property name="name"> - <cstring>particlesLabel1</cstring> - </property> - <property name="text"> - <string>Size of particles:</string> - </property> - </widget> - <widget class="TQLabel"> - <property name="name"> - <cstring>particlesLabel2</cstring> - </property> - <property name="text"> - <string>small</string> - </property> - </widget> - <widget class="TQSlider"> - <property name="name"> - <cstring>particlesSlider</cstring> - </property> - <property name="sizePolicy"> - <sizepolicy> - <hsizetype>3</hsizetype> - <vsizetype>0</vsizetype> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="minValue"> - <number>-5</number> - </property> - <property name="maxValue"> - <number>5</number> - </property> - <property name="pageStep"> - <number>1</number> - </property> - <property name="orientation"> - <enum>Horizontal</enum> - </property> - </widget> - <widget class="TQLabel"> - <property name="name"> - <cstring>particlesLabel3</cstring> - </property> - <property name="text"> - <string>big</string> - </property> - </widget> - <spacer> - <property name="name"> - <cstring>spacer6_2_2</cstring> - </property> - <property name="orientation"> - <enum>Horizontal</enum> - </property> - <property name="sizeType"> - <enum>Expanding</enum> - </property> - <property name="sizeHint"> - <size> - <width>125</width> - <height>21</height> - </size> - </property> - </spacer> - </hbox> - </widget> - <widget class="TQCheckBox"> - <property name="name"> - <cstring>bottomfireBox</cstring> - </property> - <property name="text"> - <string>Use bottom fire</string> - </property> - <property name="checked"> - <bool>true</bool> - </property> - </widget> - <widget class="TQLayoutWidget"> - <property name="name"> - <cstring>layS3</cstring> - </property> - <hbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <spacer> - <property name="name"> - <cstring>spacer7</cstring> - </property> - <property name="orientation"> - <enum>Horizontal</enum> - </property> - <property name="sizeType"> - <enum>Fixed</enum> - </property> - <property name="sizeHint"> - <size> - <width>16</width> - <height>20</height> - </size> - </property> - </spacer> - <widget class="TQLabel"> - <property name="name"> - <cstring>bottomfireLabel1</cstring> - </property> - <property name="text"> - <string>Color:</string> - </property> - </widget> - <widget class="KColorButton"> - <property name="name"> - <cstring>bottomfireColorButton</cstring> - </property> - <property name="text"> - <string></string> - </property> - <property name="toolTip" stdset="0"> - <string>Select the color</string> - </property> - </widget> - <spacer> - <property name="name"> - <cstring>spacer4</cstring> - </property> - <property name="orientation"> - <enum>Horizontal</enum> - </property> - <property name="sizeType"> - <enum>Expanding</enum> - </property> - <property name="sizeHint"> - <size> - <width>309</width> - <height>21</height> - </size> - </property> - </spacer> - </hbox> - </widget> - <widget class="TQCheckBox"> - <property name="name"> - <cstring>soundsBox</cstring> - </property> - <property name="text"> - <string>Enable sounds</string> - </property> - </widget> - <widget class="TQCheckBox"> - <property name="name"> - <cstring>overheadBox</cstring> - </property> - <property name="text"> - <string>Limit overload (recommended)</string> - </property> - </widget> - <widget class="TQCheckBox"> - <property name="name"> - <cstring>frameskipBox</cstring> - </property> - <property name="text"> - <string>Realtime fps adjust (recommended)</string> - </property> - </widget> - <spacer> - <property name="name"> - <cstring>spacerT2</cstring> - </property> - <property name="orientation"> - <enum>Vertical</enum> - </property> - <property name="sizeType"> - <enum>Expanding</enum> - </property> - <property name="sizeHint"> - <size> - <width>31</width> - <height>20</height> - </size> - </property> - </spacer> - </vbox> - </widget> - <widget class="TQWidget"> - <property name="name"> - <cstring>TabPage</cstring> - </property> - <attribute name="title"> - <string>Fireworks</string> - </attribute> - <grid> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <spacer row="4" column="0"> - <property name="name"> - <cstring>spacerT3</cstring> - </property> - <property name="orientation"> - <enum>Vertical</enum> - </property> - <property name="sizeType"> - <enum>Expanding</enum> - </property> - <property name="sizeHint"> - <size> - <width>21</width> - <height>0</height> - </size> - </property> - </spacer> - <widget class="TQLayoutWidget" row="3" column="0"> - <property name="name"> - <cstring>layF2</cstring> - </property> - <grid> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <widget class="TQCheckBox" row="0" column="1"> - <property name="name"> - <cstring>whiteBox</cstring> - </property> - <property name="text"> - <string>Blinding white</string> - </property> - </widget> - <widget class="TQCheckBox" row="3" column="1"> - <property name="name"> - <cstring>purpleBox</cstring> - </property> - <property name="text"> - <string>Velvet purple</string> - </property> - </widget> - <widget class="TQCheckBox" row="2" column="1"> - <property name="name"> - <cstring>seagreenBox</cstring> - </property> - <property name="text"> - <string>Deep-sea green</string> - </property> - </widget> - <widget class="TQCheckBox" row="1" column="2"> - <property name="name"> - <cstring>redBox</cstring> - </property> - <property name="text"> - <string>Deep red</string> - </property> - </widget> - <widget class="TQCheckBox" row="3" column="2"> - <property name="name"> - <cstring>combosBox</cstring> - </property> - <property name="text"> - <string>Multicolor</string> - </property> - <property name="toolTip" stdset="0"> - <string>try bi-color fireworks</string> - </property> - <property name="whatsThis" stdset="0"> - <string>This allow a random creation of fireworks that explodes in 2 colors</string> - </property> - </widget> - <widget class="TQCheckBox" row="1" column="1"> - <property name="name"> - <cstring>blueBox</cstring> - </property> - <property name="text"> - <string>Boring blue</string> - </property> - </widget> - <spacer row="0" column="0" rowspan="4" colspan="1"> - <property name="name"> - <cstring>spacer7_2_5_2_2</cstring> - </property> - <property name="orientation"> - <enum>Horizontal</enum> - </property> - <property name="sizeType"> - <enum>Fixed</enum> - </property> - <property name="sizeHint"> - <size> - <width>16</width> - <height>80</height> - </size> - </property> - </spacer> - <widget class="TQCheckBox" row="0" column="2"> - <property name="name"> - <cstring>orangeBox</cstring> - </property> - <property name="text"> - <string>Hot orange</string> - </property> - </widget> - <widget class="TQCheckBox" row="2" column="2"> - <property name="name"> - <cstring>greenBox</cstring> - </property> - <property name="text"> - <string>Purest green</string> - </property> - </widget> - </grid> - </widget> - <widget class="TQLabel" row="2" column="0"> - <property name="name"> - <cstring>colorsLabel1</cstring> - </property> - <property name="text"> - <string>Colors</string> - </property> - </widget> - <widget class="TQLabel" row="0" column="0"> - <property name="name"> - <cstring>fireworksLabel1</cstring> - </property> - <property name="text"> - <string>Fireworks</string> - </property> - </widget> - <widget class="TQLayoutWidget" row="1" column="0"> - <property name="name"> - <cstring>layF1</cstring> - </property> - <grid> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <widget class="TQCheckBox" row="2" column="1"> - <property name="name"> - <cstring>fire3Box</cstring> - </property> - <property name="text"> - <string>Flames ring</string> - </property> - <property name="toolTip" stdset="0"> - <string>try me</string> - </property> - </widget> - <widget class="TQCheckBox" row="1" column="2"> - <property name="name"> - <cstring>fire6Box</cstring> - </property> - <property name="text"> - <string>Atomic splitter</string> - </property> - <property name="toolTip" stdset="0"> - <string>try me</string> - </property> - </widget> - <widget class="TQCheckBox" row="0" column="2"> - <property name="name"> - <cstring>fire5Box</cstring> - </property> - <property name="text"> - <string>Sparkling fall</string> - </property> - <property name="toolTip" stdset="0"> - <string>try me</string> - </property> - </widget> - <widget class="TQCheckBox" row="0" column="1"> - <property name="name"> - <cstring>fire1Box</cstring> - </property> - <property name="text"> - <string>Classic</string> - </property> - <property name="toolTip" stdset="0"> - <string>try me</string> - </property> - </widget> - <widget class="TQCheckBox" row="1" column="1"> - <property name="name"> - <cstring>fire2Box</cstring> - </property> - <property name="text"> - <string>Only explosion</string> - </property> - <property name="toolTip" stdset="0"> - <string>try me</string> - </property> - </widget> - <spacer row="0" column="0" rowspan="4" colspan="1"> - <property name="name"> - <cstring>spacer7_2_5_2</cstring> - </property> - <property name="orientation"> - <enum>Horizontal</enum> - </property> - <property name="sizeType"> - <enum>Fixed</enum> - </property> - <property name="sizeHint"> - <size> - <width>16</width> - <height>80</height> - </size> - </property> - </spacer> - <widget class="TQCheckBox" row="3" column="2"> - <property name="name"> - <cstring>fire8Box</cstring> - </property> - <property name="enabled"> - <bool>false</bool> - </property> - <property name="paletteForegroundColor"> - <color> - <red>255</red> - <green>0</green> - <blue>0</blue> - </color> - </property> - <property name="text"> - <string>SuperNova</string> - </property> - <property name="toolTip" stdset="0"> - <string>try me</string> - </property> - </widget> - <widget class="TQCheckBox" row="2" column="2"> - <property name="name"> - <cstring>fire7Box</cstring> - </property> - <property name="text"> - <string>Toxic spirals</string> - </property> - <property name="toolTip" stdset="0"> - <string>try me</string> - </property> - </widget> - <widget class="TQCheckBox" row="3" column="1"> - <property name="name"> - <cstring>fire4Box</cstring> - </property> - <property name="text"> - <string>Flames world</string> - </property> - <property name="toolTip" stdset="0"> - <string>try me</string> - </property> - </widget> - </grid> - </widget> - </grid> - </widget> - <widget class="TQWidget"> - <property name="name"> - <cstring>TabPage</cstring> - </property> - <attribute name="title"> - <string>Specials</string> - </attribute> - <grid> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <spacer row="5" column="0"> - <property name="name"> - <cstring>spacerT4</cstring> - </property> - <property name="orientation"> - <enum>Vertical</enum> - </property> - <property name="sizeType"> - <enum>MinimumExpanding</enum> - </property> - <property name="sizeHint"> - <size> - <width>41</width> - <height>20</height> - </size> - </property> - </spacer> - <widget class="TQCheckBox" row="0" column="0"> - <property name="name"> - <cstring>logosBox</cstring> - </property> - <property name="text"> - <string>Logos</string> - </property> - <property name="checked"> - <bool>true</bool> - </property> - <property name="toolTip" stdset="0"> - <string>Watch exploding images</string> - </property> - <property name="whatsThis" stdset="0"> - <string>Enable images explosion.</string> - </property> - </widget> - <widget class="TQFrame" row="1" column="0"> - <property name="name"> - <cstring>logosFrame</cstring> - </property> - <property name="frameShape"> - <enum>NoFrame</enum> - </property> - <property name="frameShadow"> - <enum>Plain</enum> - </property> - <grid> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <property name="margin"> - <number>0</number> - </property> - <spacer row="0" column="0" rowspan="2" colspan="1"> - <property name="name"> - <cstring>spacer46</cstring> - </property> - <property name="orientation"> - <enum>Horizontal</enum> - </property> - <property name="sizeType"> - <enum>Fixed</enum> - </property> - <property name="sizeHint"> - <size> - <width>16</width> - <height>70</height> - </size> - </property> - </spacer> - <widget class="TQLayoutWidget" row="0" column="1"> - <property name="name"> - <cstring>layP1</cstring> - </property> - <grid> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <widget class="TQCheckBox" row="1" column="0"> - <property name="name"> - <cstring>logosIconsBox</cstring> - </property> - <property name="text"> - <string>KDE icons</string> - </property> - <property name="toolTip" stdset="0"> - <string>Enables KDE Icons</string> - </property> - <property name="whatsThis" stdset="0"> - <string>Enables random KDE Icons explosions.</string> - </property> - </widget> - <widget class="TQCheckBox" row="0" column="1"> - <property name="name"> - <cstring>logosTuxBox</cstring> - </property> - <property name="text"> - <string>Tux</string> - </property> - <property name="checked"> - <bool>false</bool> - </property> - <property name="toolTip" stdset="0"> - <string>Enables Tux</string> - </property> - <property name="whatsThis" stdset="0"> - <string>Enables random Tux explosions.</string> - </property> - </widget> - <widget class="TQCheckBox" row="1" column="1"> - <property name="name"> - <cstring>logosDetailBox</cstring> - </property> - <property name="text"> - <string>Reduce detail</string> - </property> - <property name="toolTip" stdset="0"> - <string>useful for increasing speed</string> - </property> - <property name="whatsThis" stdset="0"> - <string>When enabled speeds up logo explosion but reduces quality.</string> - </property> - </widget> - <widget class="TQCheckBox" row="0" column="0"> - <property name="name"> - <cstring>logosKonquiBox</cstring> - </property> - <property name="text"> - <string>Konqui</string> - </property> - <property name="toolTip" stdset="0"> - <string>Enables Konqui</string> - </property> - <property name="whatsThis" stdset="0"> - <string>Enables random Konqui explosions.</string> - </property> - </widget> - </grid> - </widget> - <widget class="TQLayoutWidget" row="1" column="1"> - <property name="name"> - <cstring>layP2</cstring> - </property> - <hbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <widget class="TQLabel"> - <property name="name"> - <cstring>frequencyLabel</cstring> - </property> - <property name="text"> - <string>Frequency:</string> - </property> - </widget> - <widget class="TQLabel"> - <property name="name"> - <cstring>neverLabel</cstring> - </property> - <property name="text"> - <string>sometimes</string> - </property> - </widget> - <widget class="TQSlider"> - <property name="name"> - <cstring>logosSlider</cstring> - </property> - <property name="sizePolicy"> - <sizepolicy> - <hsizetype>3</hsizetype> - <vsizetype>0</vsizetype> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="maxValue"> - <number>10</number> - </property> - <property name="pageStep"> - <number>1</number> - </property> - <property name="value"> - <number>5</number> - </property> - <property name="orientation"> - <enum>Horizontal</enum> - </property> - </widget> - <widget class="TQLabel"> - <property name="name"> - <cstring>oftenLabel</cstring> - </property> - <property name="text"> - <string>often</string> - </property> - </widget> - <spacer> - <property name="name"> - <cstring>spacer18</cstring> - </property> - <property name="orientation"> - <enum>Horizontal</enum> - </property> - <property name="sizeType"> - <enum>Expanding</enum> - </property> - <property name="sizeHint"> - <size> - <width>91</width> - <height>21</height> - </size> - </property> - </spacer> - </hbox> - </widget> - </grid> - </widget> - <widget class="TQFrame" row="3" column="0"> - <property name="name"> - <cstring>starsFrame</cstring> - </property> - <property name="frameShape"> - <enum>NoFrame</enum> - </property> - <property name="frameShadow"> - <enum>Raised</enum> - </property> - <grid> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <property name="margin"> - <number>0</number> - </property> - <spacer row="0" column="0" rowspan="2" colspan="1"> - <property name="name"> - <cstring>spacer7_2_5</cstring> - </property> - <property name="orientation"> - <enum>Horizontal</enum> - </property> - <property name="sizeType"> - <enum>Fixed</enum> - </property> - <property name="sizeHint"> - <size> - <width>16</width> - <height>50</height> - </size> - </property> - </spacer> - <widget class="TQLayoutWidget" row="0" column="1"> - <property name="name"> - <cstring>layP3</cstring> - </property> - <hbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <widget class="TQCheckBox"> - <property name="name"> - <cstring>starsFlickerBox</cstring> - </property> - <property name="text"> - <string>Flickering</string> - </property> - <property name="toolTip" stdset="0"> - <string>enables a natural 'flicker' effect</string> - </property> - <property name="whatsThis" stdset="0"> - <string>This option produces a sort of vibration in the lightness of the star.</string> - </property> - </widget> - <widget class="TQCheckBox"> - <property name="name"> - <cstring>starsGradientBox</cstring> - </property> - <property name="text"> - <string>Red-blue gradient</string> - </property> - <property name="toolTip" stdset="0"> - <string>emulate horizon coloring</string> - </property> - <property name="whatsThis" stdset="0"> - <string>Gives lower stars a reddish tint.</string> - </property> - </widget> - </hbox> - </widget> - <widget class="TQLayoutWidget" row="1" column="1"> - <property name="name"> - <cstring>layP4</cstring> - </property> - <hbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <widget class="TQLabel"> - <property name="name"> - <cstring>textLabel4_5</cstring> - </property> - <property name="text"> - <string>Number:</string> - </property> - </widget> - <widget class="TQLabel"> - <property name="name"> - <cstring>textLabel3_2_6</cstring> - </property> - <property name="text"> - <string>less</string> - </property> - </widget> - <widget class="TQSlider"> - <property name="name"> - <cstring>starsSlider</cstring> - </property> - <property name="sizePolicy"> - <sizepolicy> - <hsizetype>3</hsizetype> - <vsizetype>0</vsizetype> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="maxValue"> - <number>10</number> - </property> - <property name="pageStep"> - <number>1</number> - </property> - <property name="value"> - <number>5</number> - </property> - <property name="orientation"> - <enum>Horizontal</enum> - </property> - </widget> - <widget class="TQLabel"> - <property name="name"> - <cstring>textLabel3_2_2_5</cstring> - </property> - <property name="text"> - <string>more</string> - </property> - </widget> - <spacer> - <property name="name"> - <cstring>spacer6_5</cstring> - </property> - <property name="orientation"> - <enum>Horizontal</enum> - </property> - <property name="sizeType"> - <enum>Expanding</enum> - </property> - <property name="sizeHint"> - <size> - <width>149</width> - <height>21</height> - </size> - </property> - </spacer> - </hbox> - </widget> - </grid> - </widget> - <widget class="TQCheckBox" row="2" column="0"> - <property name="name"> - <cstring>starsBox</cstring> - </property> - <property name="text"> - <string>Stars</string> - </property> - <property name="checked"> - <bool>true</bool> - </property> - <property name="toolTip" stdset="0"> - <string>Watch the stars</string> - </property> - <property name="whatsThis" stdset="0"> - <string>Enable stars in the sky.</string> - </property> - </widget> - <widget class="TQCheckBox" row="4" column="0"> - <property name="name"> - <cstring>writingsBox</cstring> - </property> - <property name="text"> - <string>Writings</string> - </property> - <property name="checked"> - <bool>true</bool> - </property> - <property name="toolTip" stdset="0"> - <string>Watch the stars</string> - </property> - <property name="whatsThis" stdset="0"> - <string>Enable stars in the sky.</string> - </property> - </widget> - </grid> - </widget> - <widget class="TQWidget"> - <property name="name"> - <cstring>TabPage</cstring> - </property> - <attribute name="title"> - <string>Effects</string> - </attribute> - <grid> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <widget class="TQCheckBox" row="1" column="0"> - <property name="name"> - <cstring>flashBox</cstring> - </property> - <property name="text"> - <string>Flash screen on explosions</string> - </property> - <property name="checked"> - <bool>true</bool> - </property> - </widget> - <widget class="TQLayoutWidget" row="4" column="0"> - <property name="name"> - <cstring>layE2</cstring> - </property> - <hbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <spacer> - <property name="name"> - <cstring>spacer7_2_3</cstring> - </property> - <property name="orientation"> - <enum>Horizontal</enum> - </property> - <property name="sizeType"> - <enum>Fixed</enum> - </property> - <property name="sizeHint"> - <size> - <width>16</width> - <height>20</height> - </size> - </property> - </spacer> - <widget class="TQLabel"> - <property name="name"> - <cstring>fadeLabel1</cstring> - </property> - <property name="text"> - <string>Intensity:</string> - </property> - </widget> - <widget class="TQLabel"> - <property name="name"> - <cstring>fadeLabel2</cstring> - </property> - <property name="text"> - <string>small</string> - </property> - </widget> - <widget class="TQSlider"> - <property name="name"> - <cstring>fadeSlider</cstring> - </property> - <property name="sizePolicy"> - <sizepolicy> - <hsizetype>3</hsizetype> - <vsizetype>0</vsizetype> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="maxValue"> - <number>9</number> - </property> - <property name="pageStep"> - <number>1</number> - </property> - <property name="value"> - <number>3</number> - </property> - <property name="orientation"> - <enum>Horizontal</enum> - </property> - </widget> - <widget class="TQLabel"> - <property name="name"> - <cstring>fadeLabel3</cstring> - </property> - <property name="text"> - <string>hypnotic</string> - </property> - </widget> - <spacer> - <property name="name"> - <cstring>spacer6_3</cstring> - </property> - <property name="orientation"> - <enum>Horizontal</enum> - </property> - <property name="sizeType"> - <enum>Expanding</enum> - </property> - <property name="sizeHint"> - <size> - <width>131</width> - <height>21</height> - </size> - </property> - </spacer> - </hbox> - </widget> - <widget class="TQCheckBox" row="5" column="0"> - <property name="name"> - <cstring>flaresBox</cstring> - </property> - <property name="text"> - <string>Mega flares</string> - </property> - <property name="checked"> - <bool>true</bool> - </property> - </widget> - <widget class="TQLayoutWidget" row="6" column="0"> - <property name="name"> - <cstring>layE3</cstring> - </property> - <hbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <spacer> - <property name="name"> - <cstring>spacer7_2_4</cstring> - </property> - <property name="orientation"> - <enum>Horizontal</enum> - </property> - <property name="sizeType"> - <enum>Fixed</enum> - </property> - <property name="sizeHint"> - <size> - <width>16</width> - <height>20</height> - </size> - </property> - </spacer> - <widget class="TQLabel"> - <property name="name"> - <cstring>flaresLabel1</cstring> - </property> - <property name="text"> - <string>Dimension:</string> - </property> - </widget> - <widget class="TQLabel"> - <property name="name"> - <cstring>flaresLabel2</cstring> - </property> - <property name="text"> - <string>small</string> - </property> - </widget> - <widget class="TQSlider"> - <property name="name"> - <cstring>flaresSlider</cstring> - </property> - <property name="sizePolicy"> - <sizepolicy> - <hsizetype>3</hsizetype> - <vsizetype>0</vsizetype> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="maxValue"> - <number>10</number> - </property> - <property name="pageStep"> - <number>1</number> - </property> - <property name="value"> - <number>5</number> - </property> - <property name="orientation"> - <enum>Horizontal</enum> - </property> - </widget> - <widget class="TQLabel"> - <property name="name"> - <cstring>flaresLabel3</cstring> - </property> - <property name="text"> - <string>big</string> - </property> - </widget> - <spacer> - <property name="name"> - <cstring>spacer6_4</cstring> - </property> - <property name="orientation"> - <enum>Horizontal</enum> - </property> - <property name="sizeType"> - <enum>Expanding</enum> - </property> - <property name="sizeHint"> - <size> - <width>117</width> - <height>21</height> - </size> - </property> - </spacer> - </hbox> - </widget> - <widget class="TQCheckBox" row="7" column="0"> - <property name="name"> - <cstring>trailBox</cstring> - </property> - <property name="text"> - <string>Fireworks leave a particle trail</string> - </property> - <property name="toolTip" stdset="0"> - <string>not yet ported</string> - </property> - <property name="whatsThis" stdset="0"> - <string>not yet ported</string> - </property> - </widget> - <widget class="TQLayoutWidget" row="2" column="0"> - <property name="name"> - <cstring>layE1</cstring> - </property> - <hbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <spacer> - <property name="name"> - <cstring>spacer7_2</cstring> - </property> - <property name="orientation"> - <enum>Horizontal</enum> - </property> - <property name="sizeType"> - <enum>Fixed</enum> - </property> - <property name="sizeHint"> - <size> - <width>16</width> - <height>20</height> - </size> - </property> - </spacer> - <widget class="TQLabel"> - <property name="name"> - <cstring>flashLabel1</cstring> - </property> - <property name="text"> - <string>Flash opacity:</string> - </property> - </widget> - <widget class="TQLabel"> - <property name="name"> - <cstring>flashLabel2</cstring> - </property> - <property name="text"> - <string>min</string> - </property> - </widget> - <widget class="TQSlider"> - <property name="name"> - <cstring>flashSlider</cstring> - </property> - <property name="sizePolicy"> - <sizepolicy> - <hsizetype>3</hsizetype> - <vsizetype>0</vsizetype> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="maxValue"> - <number>10</number> - </property> - <property name="pageStep"> - <number>1</number> - </property> - <property name="value"> - <number>5</number> - </property> - <property name="orientation"> - <enum>Horizontal</enum> - </property> - </widget> - <widget class="TQLabel"> - <property name="name"> - <cstring>flashLabel3</cstring> - </property> - <property name="text"> - <string>max</string> - </property> - </widget> - <spacer> - <property name="name"> - <cstring>spacer6</cstring> - </property> - <property name="orientation"> - <enum>Horizontal</enum> - </property> - <property name="sizeType"> - <enum>Expanding</enum> - </property> - <property name="sizeHint"> - <size> - <width>110</width> - <height>21</height> - </size> - </property> - </spacer> - </hbox> - </widget> - <widget class="TQCheckBox" row="3" column="0"> - <property name="name"> - <cstring>fadeBox</cstring> - </property> - <property name="text"> - <string>Fade effect</string> - </property> - <property name="checked"> - <bool>true</bool> - </property> - </widget> - <widget class="TQCheckBox" row="0" column="0"> - <property name="name"> - <cstring>lightBox</cstring> - </property> - <property name="text"> - <string>Spherical light after explosion</string> - </property> - <property name="toolTip" stdset="0"> - <string>warning, this can shock your mind :-)</string> - </property> - <property name="whatsThis" stdset="0"> - <string>Multiplies the scale factor for particles near you, resulting in a colorful experience.</string> - </property> - </widget> - <spacer row="8" column="0"> - <property name="name"> - <cstring>spacerT5</cstring> - </property> - <property name="orientation"> - <enum>Vertical</enum> - </property> - <property name="sizeType"> - <enum>Expanding</enum> - </property> - <property name="sizeHint"> - <size> - <width>31</width> - <height>20</height> - </size> - </property> - </spacer> - </grid> - </widget> - </widget> - </grid> -</widget> -<connections> - <connection> - <sender>logosBox</sender> - <signal>toggled(bool)</signal> - <receiver>logosFrame</receiver> - <slot>setEnabled(bool)</slot> - </connection> - <connection> - <sender>starsBox</sender> - <signal>toggled(bool)</signal> - <receiver>starsFrame</receiver> - <slot>setEnabled(bool)</slot> - </connection> - <connection> - <sender>bottomfireBox</sender> - <signal>toggled(bool)</signal> - <receiver>bottomfireLabel1</receiver> - <slot>setEnabled(bool)</slot> - </connection> - <connection> - <sender>bottomfireBox</sender> - <signal>toggled(bool)</signal> - <receiver>bottomfireColorButton</receiver> - <slot>setEnabled(bool)</slot> - </connection> - <connection> - <sender>flashBox</sender> - <signal>toggled(bool)</signal> - <receiver>flashLabel1</receiver> - <slot>setEnabled(bool)</slot> - </connection> - <connection> - <sender>flashBox</sender> - <signal>toggled(bool)</signal> - <receiver>flashLabel2</receiver> - <slot>setEnabled(bool)</slot> - </connection> - <connection> - <sender>flashBox</sender> - <signal>toggled(bool)</signal> - <receiver>flashLabel3</receiver> - <slot>setEnabled(bool)</slot> - </connection> - <connection> - <sender>flashBox</sender> - <signal>toggled(bool)</signal> - <receiver>flashSlider</receiver> - <slot>setEnabled(bool)</slot> - </connection> - <connection> - <sender>fadeBox</sender> - <signal>toggled(bool)</signal> - <receiver>fadeLabel1</receiver> - <slot>setEnabled(bool)</slot> - </connection> - <connection> - <sender>fadeBox</sender> - <signal>toggled(bool)</signal> - <receiver>fadeLabel2</receiver> - <slot>setEnabled(bool)</slot> - </connection> - <connection> - <sender>fadeBox</sender> - <signal>toggled(bool)</signal> - <receiver>fadeLabel3</receiver> - <slot>setEnabled(bool)</slot> - </connection> - <connection> - <sender>fadeBox</sender> - <signal>toggled(bool)</signal> - <receiver>fadeSlider</receiver> - <slot>setEnabled(bool)</slot> - </connection> - <connection> - <sender>flaresBox</sender> - <signal>toggled(bool)</signal> - <receiver>flaresLabel1</receiver> - <slot>setEnabled(bool)</slot> - </connection> - <connection> - <sender>flaresBox</sender> - <signal>toggled(bool)</signal> - <receiver>flaresLabel2</receiver> - <slot>setEnabled(bool)</slot> - </connection> - <connection> - <sender>flaresBox</sender> - <signal>toggled(bool)</signal> - <receiver>flaresLabel3</receiver> - <slot>setEnabled(bool)</slot> - </connection> - <connection> - <sender>flaresBox</sender> - <signal>toggled(bool)</signal> - <receiver>flaresSlider</receiver> - <slot>setEnabled(bool)</slot> - </connection> - <connection> - <sender>useButton</sender> - <signal>clicked()</signal> - <receiver>KFireSaverSetup</receiver> - <slot>useButton_clicked()</slot> - </connection> - <connection> - <sender>applyButton</sender> - <signal>clicked()</signal> - <receiver>KFireSaverSetup</receiver> - <slot>applyButton_clicked()</slot> - </connection> - <connection> - <sender>detachBox</sender> - <signal>clicked()</signal> - <receiver>KFireSaverSetup</receiver> - <slot>updatePreview()</slot> - </connection> -</connections> -<tabstops> - <tabstop>presetCombo</tabstop> - <tabstop>useButton</tabstop> - <tabstop>tabWidget</tabstop> - <tabstop>showCombo</tabstop> - <tabstop>fireworksSlider</tabstop> - <tabstop>particlesSlider</tabstop> - <tabstop>bottomfireBox</tabstop> - <tabstop>bottomfireColorButton</tabstop> - <tabstop>soundsBox</tabstop> - <tabstop>overheadBox</tabstop> - <tabstop>frameskipBox</tabstop> - <tabstop>fire1Box</tabstop> - <tabstop>fire2Box</tabstop> - <tabstop>fire3Box</tabstop> - <tabstop>fire4Box</tabstop> - <tabstop>fire5Box</tabstop> - <tabstop>fire6Box</tabstop> - <tabstop>fire7Box</tabstop> - <tabstop>fire8Box</tabstop> - <tabstop>whiteBox</tabstop> - <tabstop>blueBox</tabstop> - <tabstop>seagreenBox</tabstop> - <tabstop>purpleBox</tabstop> - <tabstop>orangeBox</tabstop> - <tabstop>redBox</tabstop> - <tabstop>greenBox</tabstop> - <tabstop>combosBox</tabstop> - <tabstop>logosBox</tabstop> - <tabstop>logosKonquiBox</tabstop> - <tabstop>logosTuxBox</tabstop> - <tabstop>logosIconsBox</tabstop> - <tabstop>logosDetailBox</tabstop> - <tabstop>logosSlider</tabstop> - <tabstop>starsBox</tabstop> - <tabstop>starsFlickerBox</tabstop> - <tabstop>starsGradientBox</tabstop> - <tabstop>starsSlider</tabstop> - <tabstop>lightBox</tabstop> - <tabstop>flashBox</tabstop> - <tabstop>flashSlider</tabstop> - <tabstop>fadeBox</tabstop> - <tabstop>fadeSlider</tabstop> - <tabstop>flaresBox</tabstop> - <tabstop>flaresSlider</tabstop> - <tabstop>trailBox</tabstop> -</tabstops> -<includes> - <include location="local" impldecl="in declaration">firesaver.h</include> - <include location="local" impldecl="in implementation">firesaversetup.ui.h</include> -</includes> -<variables> - <variable access="private">KFireSaver * fireSaverWidget;</variable> -</variables> -<Q_SLOTS> - <slot>applyButton_clicked()</slot> - <slot>updatePreview()</slot> - <slot>writeConfig()</slot> - <slot>readConfig()</slot> - <slot>useButton_clicked()</slot> -</Q_SLOTS> -<functions> - <function access="private" specifier="non virtual">init()</function> - <function access="private">destroy()</function> -</functions> -<layoutdefaults spacing="6" margin="11"/> -<includehints> - <includehint>kcolorbutton.h</includehint> -</includehints> -</UI> diff --git a/kscreensaver/kdesavers/firesaversetup.ui.h b/kscreensaver/kdesavers/firesaversetup.ui.h deleted file mode 100644 index da8ed42a..00000000 --- a/kscreensaver/kdesavers/firesaversetup.ui.h +++ /dev/null @@ -1,400 +0,0 @@ -/**************************************************************************** -** ui.h extension file, included from the uic-generated form implementation. -** -** If you wish to add, delete or rename functions or slots use -** TQt Designer which will update this file, preserving your code. Create an -** init() function in place of a constructor, and a destroy() function in -** place of a destructor. -*****************************************************************************/ - - -#ifndef KFIRESAVER_SETUP_H -#define KFIRESAVER_SETUP_H - -#include <tqcolor.h> -#include <tqtimer.h> -#include <kconfig.h> - - -void KFireSaverSetup::init() -{ - readConfig(); - fireSaverWidget = NULL; - updatePreview(); -} - -void KFireSaverSetup::destroy() -{ - if ( fireSaverWidget ) - delete fireSaverWidget; -} - - -void KFireSaverSetup::applyButton_clicked() -{ - writeConfig(); - updatePreview(); -} - -void KFireSaverSetup::updatePreview() -{ - if ( fireSaverWidget ) - delete fireSaverWidget; - if ( detachBox->isChecked() ) { - previewLabel->show(); - fireSaverWidget = new KFireSaver; - fireSaverWidget->resize(640,480); - } else { - previewLabel->hide(); - fireSaverWidget = new KFireSaver( previewFrame ); - fireSaverWidget->move(1,1); - fireSaverWidget->resize( - previewFrame->width() - 2, - previewFrame->height() - 2 ); - } - fireSaverWidget->show(); -} - - -void KFireSaverSetup::writeConfig() -{ - TDEConfig config("kfiresaverrc",false,false); - - // show - config.setGroup( "Show" ); - config.writeEntry( "ShowType", showCombo->currentItem() ); - config.writeEntry( "FireworksFrequency", fireworksSlider->value() ); - config.writeEntry( "ParticlesSize", particlesSlider->value() ); - config.writeEntry( "enable-BottomFire", bottomfireBox->isChecked() ); - config.writeEntry( "BottomFireColor", bottomfireColorButton->color() ); - config.writeEntry( "enable-Sounds", soundsBox->isChecked() ); - config.writeEntry( "enable-NoOverhead", overheadBox->isChecked() ); - config.writeEntry( "enable-FrameSkip", frameskipBox->isChecked() ); - - // fireworks - config.setGroup( "Fireworks" ); - if (!fire1Box->isChecked() && !fire2Box->isChecked() && - !fire3Box->isChecked() && !fire4Box->isChecked() && - !fire5Box->isChecked() && !fire6Box->isChecked() && - !fire7Box->isChecked() && !fire8Box->isChecked()) - fire1Box->setChecked(true); - config.writeEntry( "use-Classic", fire1Box->isChecked() ); - config.writeEntry( "use-Explosion", fire2Box->isChecked() ); - config.writeEntry( "use-FlameRing", fire3Box->isChecked() ); - config.writeEntry( "use-FlameWorld", fire4Box->isChecked() ); - config.writeEntry( "use-Fall", fire5Box->isChecked() ); - config.writeEntry( "use-Splitter", fire6Box->isChecked() ); - config.writeEntry( "use-Spirals", fire7Box->isChecked() ); - config.writeEntry( "use-SuperNova", fire8Box->isChecked() ); - if (!redBox->isChecked() && !orangeBox->isChecked() && - !greenBox->isChecked() && !blueBox->isChecked() && - !whiteBox->isChecked() && !purpleBox->isChecked() && - !seagreenBox->isChecked()) - whiteBox->setChecked(true); - config.writeEntry( "use-White", whiteBox->isChecked() ); - config.writeEntry( "use-Blue", blueBox->isChecked() ); - config.writeEntry( "use-DeepGreen", seagreenBox->isChecked() ); - config.writeEntry( "use-Purple", purpleBox->isChecked() ); - config.writeEntry( "use-Orange", orangeBox->isChecked() ); - config.writeEntry( "use-Red", redBox->isChecked() ); - config.writeEntry( "use-Green", greenBox->isChecked() ); - config.writeEntry( "use-Multicolor", combosBox->isChecked() ); - - // specials - config.setGroup( "Specials" ); - config.writeEntry( "enable-Logos", logosBox->isChecked() ); - config.writeEntry( "LogosKonqui", logosKonquiBox->isChecked() ); - config.writeEntry( "LogosTux", logosTuxBox->isChecked() ); - config.writeEntry( "LogosKDEIcons", logosIconsBox->isChecked() ); - config.writeEntry( "LogosReduceDetail", logosDetailBox->isChecked() ); - config.writeEntry( "LogosFrequency", logosSlider->value() ); - config.writeEntry( "enable-Stars", starsBox->isChecked() ); - config.writeEntry( "StarsFlicker", starsFlickerBox->isChecked() ); - config.writeEntry( "StarsGradient", starsGradientBox->isChecked() ); - config.writeEntry( "StarsNumber", starsSlider->value() ); - config.writeEntry( "enable-Writings", writingsBox->isChecked() ); - - // effects - config.setGroup( "Effects" ); - config.writeEntry( "enable-SphericalLight", lightBox->isChecked() ); - config.writeEntry( "enable-Flash", flashBox->isChecked() ); - config.writeEntry( "FlashOpacity", flashSlider->value() ); - config.writeEntry( "enable-Fade", fadeBox->isChecked() ); - config.writeEntry( "FadeIntensity", fadeSlider->value() ); - config.writeEntry( "enable-Flares", flaresBox->isChecked() ); - config.writeEntry( "FlaresDimension", flaresSlider->value() ); - config.writeEntry( "enable-Trail", trailBox->isChecked() ); -} - - -void KFireSaverSetup::readConfig() -{ - TDEConfig config("kfiresaverrc",true,false); - - // show - config.setGroup( "Show" ); - showCombo->setCurrentItem(config.readNumEntry( "ShowType", 1 )); - fireworksSlider->setValue(config.readNumEntry( "FireworksFrequency", 7 )); - particlesSlider->setValue(config.readNumEntry( "ParticlesSize", 0 )); - bottomfireBox->setChecked(config.readBoolEntry( "enable-BottomFire", true )); - TQColor blue = TQt::darkBlue; - bottomfireColorButton->setColor(config.readColorEntry( "BottomFireColor", &blue )); - soundsBox->setChecked(config.readBoolEntry( "enable-Sounds", false )); - overheadBox->setChecked(config.readBoolEntry( "enable-NoOverhead", true )); - frameskipBox->setChecked(config.readBoolEntry( "enable-FrameSkip", true )); - - // fireworks - config.setGroup( "Fireworks" ); - fire1Box->setChecked(config.readBoolEntry( "use-Classic", true )); - fire2Box->setChecked(config.readBoolEntry( "use-Explosion", false )); - fire3Box->setChecked(config.readBoolEntry( "use-FlameRing", false )); - fire4Box->setChecked(config.readBoolEntry( "use-FlameWorld", false )); - fire5Box->setChecked(config.readBoolEntry( "use-Fall", false )); - fire6Box->setChecked(config.readBoolEntry( "use-Splitter", false )); - fire7Box->setChecked(config.readBoolEntry( "use-Spirals", false )); - fire8Box->setChecked(config.readBoolEntry( "use-SuperNova", false )); - whiteBox->setChecked(config.readBoolEntry( "use-White", true )); - blueBox->setChecked(config.readBoolEntry( "use-Blue", false )); - seagreenBox->setChecked(config.readBoolEntry( "use-DeepGreen", true )); - purpleBox->setChecked(config.readBoolEntry( "use-Purple", false )); - orangeBox->setChecked(config.readBoolEntry( "use-Orange", true )); - redBox->setChecked(config.readBoolEntry( "use-Red", false )); - greenBox->setChecked(config.readBoolEntry( "use-Green", false )); - combosBox->setChecked(config.readBoolEntry( "use-Multicolor", true )); - - // specials - config.setGroup( "Specials" ); - logosBox->setChecked(config.readBoolEntry( "enable-Logos", true )); - logosKonquiBox->setChecked(config.readBoolEntry( "LogosKonqui", true )); - logosTuxBox->setChecked(config.readBoolEntry( "LogosTux", true )); - logosIconsBox->setChecked(config.readBoolEntry( "LogosKDEIcons", true )); - logosDetailBox->setChecked(config.readBoolEntry( "LogosReduceDetail", true )); - logosSlider->setValue(config.readNumEntry( "LogosFrequency", 4 )); - starsBox->setChecked(config.readBoolEntry( "enable-Stars", true )); - starsFlickerBox->setChecked(config.readBoolEntry( "StarsFlicker", false )); - starsGradientBox->setChecked(config.readBoolEntry( "StarsGradient", true )); - starsSlider->setValue(config.readNumEntry( "StarsNumber", 4 )); - writingsBox->setChecked(config.readBoolEntry( "enable-Writings", true )); - - // effects - config.setGroup( "Effects" ); - lightBox->setChecked(config.readBoolEntry( "enable-SphericalLight", true )); - flashBox->setChecked(config.readBoolEntry( "enable-Flash", false )); - flashSlider->setValue(config.readNumEntry( "FlashOpacity", 5 )); - fadeBox->setChecked(config.readBoolEntry( "enable-Fade", false )); - fadeSlider->setValue(config.readNumEntry( "FadeIntensity", 3 )); - flaresBox->setChecked(config.readBoolEntry( "enable-Flares", true )); - flaresSlider->setValue(config.readNumEntry( "FlaresDimension", 5 )); - trailBox->setChecked(config.readBoolEntry( "enable-Trail", false )); -} - -void KFireSaverSetup::useButton_clicked() -{ - int ci = presetCombo->currentItem(); - - showCombo->setCurrentItem( 0 ); - particlesSlider->setValue( 0 ); - overheadBox->setChecked( true ); - flashBox->setChecked( false ); - //flashSlider->setValue( ); - //soundsBox->setChecked( ); - //logosDetailBox->setChecked( ); - - switch (ci){ - case 0: // KDE default - showCombo->setCurrentItem( 1 ); - fireworksSlider->setValue( 7 ); - bottomfireBox->setChecked( true ); - bottomfireColorButton->setColor( TQt::darkBlue ); - frameskipBox->setChecked( true ); - fire1Box->setChecked( true ); - fire2Box->setChecked( false ); - fire3Box->setChecked( false ); - fire4Box->setChecked( false ); - fire5Box->setChecked( false ); - fire6Box->setChecked( false ); - fire7Box->setChecked( false ); - fire8Box->setChecked( false ); - whiteBox->setChecked( true ); - blueBox->setChecked( false ); - seagreenBox->setChecked( true ); - purpleBox->setChecked( false ); - orangeBox->setChecked( true ); - redBox->setChecked( false ); - greenBox->setChecked( false ); - combosBox->setChecked( true ); - logosBox->setChecked( true ); - logosKonquiBox->setChecked( true ); - logosTuxBox->setChecked( true ); - logosIconsBox->setChecked( true ); - logosSlider->setValue( 4 ); - starsBox->setChecked( true ); - starsFlickerBox->setChecked( false ); - starsGradientBox->setChecked( true ); - starsSlider->setValue( 4 ); - writingsBox->setChecked( true ); - lightBox->setChecked( true ); - fadeBox->setChecked( false ); - //fadeSlider->setValue( ); - flaresBox->setChecked( true ); - flaresSlider->setValue( 5 ); - trailBox->setChecked( false ); - break; - case 1: // Elegant white - fireworksSlider->setValue( 7 ); - bottomfireBox->setChecked( true ); - bottomfireColorButton->setColor( TQt::blue ); - frameskipBox->setChecked( true ); - fire1Box->setChecked( true ); - fire2Box->setChecked( false ); - fire3Box->setChecked( false ); - fire4Box->setChecked( false ); - fire5Box->setChecked( true ); - fire6Box->setChecked( true ); - fire7Box->setChecked( false ); - fire8Box->setChecked( false ); - whiteBox->setChecked( true ); - blueBox->setChecked( true ); - seagreenBox->setChecked( false ); - purpleBox->setChecked( false ); - orangeBox->setChecked( false ); - redBox->setChecked( false ); - greenBox->setChecked( false ); - combosBox->setChecked( true ); - logosBox->setChecked( true ); - logosKonquiBox->setChecked( true ); - logosTuxBox->setChecked( false ); - logosIconsBox->setChecked( false ); - logosSlider->setValue( 3 ); - starsBox->setChecked( true ); - starsFlickerBox->setChecked( true ); - starsGradientBox->setChecked( false ); - starsSlider->setValue( 4 ); - writingsBox->setChecked( true ); - lightBox->setChecked( true ); - fadeBox->setChecked( true ); - fadeSlider->setValue( 3 ); - flaresBox->setChecked( true ); - flaresSlider->setValue( 6 ); - trailBox->setChecked( true ); - break; - case 2: // Quick simple - showCombo->setCurrentItem(1); - fireworksSlider->setValue( 4 ); - bottomfireBox->setChecked( false ); - //bottomfireColorButton->setColor( ); - frameskipBox->setChecked( false ); - fire1Box->setChecked( true ); - fire2Box->setChecked( true ); - fire3Box->setChecked( false ); - fire4Box->setChecked( false ); - fire5Box->setChecked( false ); - fire6Box->setChecked( false ); - fire7Box->setChecked( false ); - fire8Box->setChecked( false ); - whiteBox->setChecked( true ); - blueBox->setChecked( true ); - seagreenBox->setChecked( false ); - purpleBox->setChecked( false ); - orangeBox->setChecked( false ); - redBox->setChecked( true ); - greenBox->setChecked( true ); - combosBox->setChecked( false ); - logosBox->setChecked( true ); - logosKonquiBox->setChecked( true ); - logosTuxBox->setChecked( true ); - logosIconsBox->setChecked( true ); - logosSlider->setValue( 2 ); - starsBox->setChecked( false ); - //starsFlickerBox->setChecked( ); - //starsGradientBox->setChecked( ); - //starsSlider->setValue( ); - writingsBox->setChecked( false ); - lightBox->setChecked( false ); - fadeBox->setChecked( false ); - //fadeSlider->setValue( ); - flaresBox->setChecked( false ); - //flaresSlider->setValue( ); - trailBox->setChecked( false ); - break; - case 3: //Enhanced reality - fireworksSlider->setValue( 8 ); - bottomfireBox->setChecked( true ); - bottomfireColorButton->setColor( TQt::magenta ); - frameskipBox->setChecked( true ); - fire1Box->setChecked( true ); - fire2Box->setChecked( true ); - fire3Box->setChecked( true ); - fire4Box->setChecked( true ); - fire5Box->setChecked( true ); - fire6Box->setChecked( true ); - fire7Box->setChecked( false ); - fire8Box->setChecked( false ); - whiteBox->setChecked( true ); - blueBox->setChecked( true ); - seagreenBox->setChecked( true ); - purpleBox->setChecked( true ); - orangeBox->setChecked( true ); - redBox->setChecked( true ); - greenBox->setChecked( true ); - combosBox->setChecked( true ); - logosBox->setChecked( true ); - logosKonquiBox->setChecked( false ); - logosTuxBox->setChecked( true ); - logosIconsBox->setChecked( false ); - logosSlider->setValue( 2 ); - starsBox->setChecked( true ); - starsFlickerBox->setChecked( true ); - starsGradientBox->setChecked( true ); - starsSlider->setValue( 5 ); - writingsBox->setChecked( true ); - lightBox->setChecked( false ); - fadeBox->setChecked( true ); - fadeSlider->setValue( 3 ); - flaresBox->setChecked( false ); - //flaresSlider->setValue( ); - trailBox->setChecked( true ); - break; - case 4: //Hypnotic illusions - fireworksSlider->setValue( 9 ); - bottomfireBox->setChecked( true ); - bottomfireColorButton->setColor( TQt::red ); - frameskipBox->setChecked( true ); - fire1Box->setChecked( true ); - fire2Box->setChecked( true ); - fire3Box->setChecked( true ); - fire4Box->setChecked( true ); - fire5Box->setChecked( true ); - fire6Box->setChecked( true ); - fire7Box->setChecked( false ); - fire8Box->setChecked( false ); - whiteBox->setChecked( true ); - blueBox->setChecked( true ); - seagreenBox->setChecked( true ); - purpleBox->setChecked( true ); - orangeBox->setChecked( true ); - redBox->setChecked( true ); - greenBox->setChecked( true ); - combosBox->setChecked( true ); - logosBox->setChecked( false ); - //logosKonquiBox->setChecked( true ); - //logosTuxBox->setChecked( true ); - //logosIconsBox->setChecked( true ); - //logosSlider->setValue( 5 ); - starsBox->setChecked( true ); - starsFlickerBox->setChecked( true ); - starsGradientBox->setChecked( true ); - starsSlider->setValue( 8 ); - writingsBox->setChecked( false ); - lightBox->setChecked( false ); - fadeBox->setChecked( true ); - fadeSlider->setValue( 7 ); - flaresBox->setChecked( true ); - flaresSlider->setValue( 8 ); - trailBox->setChecked( false ); - break; - } - //applyButton_clicked(); -} - -#endif diff --git a/kscreensaver/kdesavers/firesaverwriter.cpp b/kscreensaver/kdesavers/firesaverwriter.cpp deleted file mode 100644 index ff78fc5e..00000000 --- a/kscreensaver/kdesavers/firesaverwriter.cpp +++ /dev/null @@ -1,247 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2004 by E.Ros * - * [email protected] * - * * - * 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. * - * * - ***************************************************************************/ - -#include <math.h> -#include <stdlib.h> -#include <tqimage.h> -#include <tqgl.h> -#include <tqfile.h> -#include <tqstring.h> -#include <kdebug.h> -#include <kstandarddirs.h> -#include <tdeversion.h> -#include <klocale.h> -#include "firesaverwriter.h" - - -/* Word: SINGLE WORD */ - -Word::Word( const char * _text, TQMap<char, Symbol *> * sMap, float _scale ) - : width(0), scale(_scale), cX(0), cY(0), vScale(0), vX(0), vY(0), - activateTime(0.0), lifeTime(2), currentTime(0) -{ - for ( ; *_text != 0 && *_text != ' '; _text++ ) - { - char c = *_text; - if ( !sMap->contains(c) ) //search for a symbol in the map - continue; - Symbol * symbol = (*sMap)[c]; //get the symbol* - width += symbol->scale; //increase word's half-width - symbolList.append( symbol ); //insert it to the list - } - color[0] = 0; - color[1] = 0.8 * drand48(); - color[2] = 0.2 + 0.8 * drand48(); - color[3] = 1; -} - -inline void Word::renderWord( double dT ) -{ - if ( (currentTime += dT) < activateTime ) - return; - - //update coloring - if ( activateTime >= 0 ) { - if ( currentTime < activateTime + 0.4 ) - color[3] = (currentTime - activateTime) / 0.4; - else - color[3] = 1 - (currentTime - activateTime - 0.4) / (lifeTime - 0.4); - } else - color[3] = 1 - currentTime / lifeTime; - - //word's global transforms - glPushMatrix(); - glTranslatef( cX - scale * width, cY, 0 ); - glScalef( scale, scale, 1 ); - glColor4fv( color ); - - //for each symbol draw it! - Symbol * symbol = symbolList.first(); - for( ; symbol; symbol = symbolList.next() ) - symbol->renderSymbol(); - glPopMatrix(); - - //physical update to position and scale - cX += vX * dT; - cY += vY * dT; - scale += scale * vScale * dT; -} - -inline bool Word::isDead() -{ - if ( activateTime > 0 ) - return (currentTime - activateTime) >= lifeTime; - return currentTime >= lifeTime; -} - - - -/* Writer: engine that spawns and manages words */ - -Writer::Writer( TQString descFileName ) - : numTextures(0) -{ - wordList.setAutoDelete( true ); - - if ( !loadMap( descFileName ) ) - return; - - TQString welcomeString = i18n("Welcome to KDE %1.%2.%3") - .arg(TDE_VERSION_MAJOR) - .arg(TDE_VERSION_MINOR) - .arg(TDE_VERSION_RELEASE); - spawnWords(welcomeString, Fun1); -} - -Writer::~ Writer() -{ - glDeleteTextures( numTextures, texArray ); - wordList.clear(); - TQMap<char, Symbol *>::Iterator it = symbolMap.begin(); - for ( ; it != symbolMap.end(); ++it ) - delete (Symbol *)it.data(); -} - -void Writer::spawnWords( TQString phrase, effectType fX ) -{ - int wordCount = 0; - float xCenter = 0, - yCenter = drand48()*40 - 20, - wordsWidth = 0; - TQPtrList<Word> localWords; - while ( phrase.length() > 0 ) - { - TQString letters = phrase.section(" ",0,0); - Word * word = new Word( letters.latin1(), &symbolMap ); - wordList.append( word ); - localWords.append( word ); - word->cX = xCenter; - word->cY = yCenter; - switch ( fX ) { - case Fun1:{ - float angle = 2*M_PI * drand48(), - module = 0.25 * (drand48() + drand48()); - word->vX = module * cos( angle ); - word->vY = module * sin( angle ); - word->vScale = 0.6; - word->scale = 0.7 + 0.3*(drand48() + drand48());} - word->activateTime = 0.3 * wordCount; - //fall to the case below for word spacing - default: - case NoEffect: - wordsWidth += word->width; - word->cX += wordsWidth; - wordsWidth += word->width + 1; - break; - case Sequence: - word->lifeTime = 1.2; - word->activateTime = 0.6 + 0.9 * wordCount; -// word->vY = -5; - break; - } - wordCount ++; - phrase.remove(0, letters.length() + 1); - } - if ( localWords.count() < 1 ) - return; - //some computations to 'center' the string - float displace = -(wordsWidth - 1) / 2; - Word * word = localWords.first(); - for( ; word; word = localWords.next() ) - word->cX += displace; -} - -void Writer::render( double dT ) -{ - if ( !numTextures ) - return; - - glEnable( GL_TEXTURE_2D ); - - glPushMatrix(); - glScalef( 0.6, 0.6, 1.0 ); - Word * word = wordList.first(); - while( word ) { - word->renderWord( dT ); - if ( word->isDead() ) { - wordList.remove(); - word = wordList.current(); - } else - word = wordList.next(); - } - glPopMatrix(); -} - -/* loadMap() - * parses the description file to create the internal symbols map. - * This map is then used when building words. - **/ -bool Writer::loadMap( TQString descFile ) -{ - TQFile desc( locate("data","kfiresaver/"+descFile) ); - if ( !desc.open( IO_ReadOnly ) ) - return false; - - unsigned int currentNumber; - float xres = 0, yres = 0; - bool generatedFirst = false; - - while ( !desc.atEnd() ) - { - TQString line; - int count = desc.readLine( line, 100 ); - //skip comments / invalid lines - if ( count < 6 || line.at(0) == '#') - continue; - //load texture maps - if ( line.at(0) == '"' && numTextures < 15 ) - { - //load and generate texture - TQString fileName = line.section("\"", 1,1 ); - TQImage tmp; - if ( !tmp.load( locate("data","kfiresaver/"+fileName) ) ) { - kdWarning() << "can't load filename:" << fileName << endl; - generatedFirst = false; - continue; - } - glGenTextures( 1, ¤tNumber ); - texArray[ numTextures++ ] = currentNumber; - glBindTexture(GL_TEXTURE_2D, currentNumber); - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); - TQImage texture = TQGLWidget::convertToGLFormat( tmp ); - xres = (float)texture.width(); - yres = (float)texture.height(); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)xres, (int)yres, 0, - GL_RGBA, GL_UNSIGNED_BYTE, texture.bits()); - generatedFirst = true; - continue; - } - if ( !generatedFirst ) - continue; - if ( line.contains(' ') != 4 ) { - kdWarning() << "wrong line on symbols.desc (4 spaces expected):" << endl; - kdWarning() << " '" << line << "'" << endl; - continue; - } - //parse the line describing a symbol and create it - char p = *(line.latin1()); - if ( symbolMap.contains(p) ) - continue; - float left = (float)(line.section(" ",1,1).toInt())/xres, - top = (float)(line.section(" ",2,2).toInt())/yres, - right = (float)(line.section(" ",3,3).toInt() + 1)/xres, - bottom = (float)(line.section(" ",4,4).toInt() + 1)/yres; - symbolMap[p] = new Symbol( currentNumber, left,top,right,bottom ); - } - - return symbolMap.size() > 0; -} diff --git a/kscreensaver/kdesavers/firesaverwriter.h b/kscreensaver/kdesavers/firesaverwriter.h deleted file mode 100644 index e93f65be..00000000 --- a/kscreensaver/kdesavers/firesaverwriter.h +++ /dev/null @@ -1,113 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2004 by E.Ros * - * [email protected] * - * * - * 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. * - * * - ***************************************************************************/ - -#ifndef FIRESAVER_WRITER_H -#define FIRESAVER_WRITER_H - -#include <tqgl.h> -#include <tqptrlist.h> -#include <tqmap.h> -#include <tqstring.h> - -class Symbol -{ - public: - Symbol( unsigned int textureNumber, float l, float t, float r, float b ) - : scale((r - l) / (b - t)), texNum(textureNumber), L(l), T(1-t), R(r), B(1-b) - { - v1[0] = -scale; v1[1] = 1; - v2[0] = -scale; v2[1] = -1; - v3[0] = scale; v3[1] = 1; - v4[0] = scale; v4[1] = -1; - } - - float scale; - - inline void renderSymbol() - { - //draw the symbol and update "cursor"'s position - glBindTexture( GL_TEXTURE_2D, texNum ); - glTranslatef( scale, 0, 0 ); - glBegin( GL_TRIANGLE_STRIP ); - glTexCoord2f( L, T ); - glVertex2fv( v1 ); - glTexCoord2f( L, B ); - glVertex2fv( v2 ); - glTexCoord2f( R, T ); - glVertex2fv( v3 ); - glTexCoord2f( R, B ); - glVertex2fv( v4 ); - glEnd(); - glTranslatef( scale, 0, 0 ); - } - - private: - float v1[2], v2[2], v3[2], v4[2]; - unsigned int texNum; //number of texture to activate - float L, T, R, B; //coordinates for mapping -}; - - -class Word -{ - friend class Writer; - public: - Word( const char * text, TQMap<char, Symbol *> * map, float scale = 1.0 ); - - inline void renderWord( double dT ); - inline bool isDead(); - - private: - float width, scale, cX, cY; - float vScale, vX, vY; - float activateTime, lifeTime, currentTime; - float color[4]; - TQPtrList<Symbol> symbolList; -}; - - -/* - * - **/ -class Writer -{ - public: - Writer( TQString descFileName ); - ~Writer(); - - //types of effects implemented - enum effectType { NoEffect = 0, Sequence, Fun1, Fun2 }; - - //call this function to add a sentence to the renderer - void spawnWords( TQString phrase, effectType fx = NoEffect ); - - //called to get the words on screen using OpenGL - //Note: the context must be set up. Words are drawn on XY plane - //inside a rectangle with 10 units's side. - void render( double dT ); - - private: - //misc utility functions - bool loadMap( TQString ); - - //texture 'references' used by GL to delete allocated textures - int numTextures; - unsigned int texArray[16]; - - //list of words and map of symbols - TQPtrList<Word> wordList; - TQMap<char, Symbol *> symbolMap; - - //disables standard constructor - Writer(); -}; - -#endif diff --git a/kscreensaver/kdesavers/fountain.cpp b/kscreensaver/kdesavers/fountain.cpp deleted file mode 100644 index 125be143..00000000 --- a/kscreensaver/kdesavers/fountain.cpp +++ /dev/null @@ -1,461 +0,0 @@ -//----------------------------------------------------------------------------- -// -// kfountain - Partical Fountain Screen Saver for KDE 2 -// -// Copyright (c) Ian Reinhart Geiser 2001 -// -// TDEConfig code and KScreenSaver "Setup..." improvements by -// Nick Betcher <[email protected]> 2001 -// -#include <stdlib.h> -#include <tqlabel.h> -#include <tqlayout.h> -#include <kapplication.h> -#include <klocale.h> -#include <kconfig.h> -#include <kcolordialog.h> -#include <kbuttonbox.h> -#include <kcolorbutton.h> -#include <kglobal.h> -#include "fountain.h" -#include "fountain.moc" -#ifdef TQ_WS_MACX -#include <OpenGL/gl.h> -#include <OpenGL/glu.h> -#else -#include <GL/glu.h> -#include <GL/gl.h> -#endif -#include <tqimage.h> -#include <kdebug.h> -#include <tqpainter.h> -#include <tqradiobutton.h> -#include <tqspinbox.h> -#include <kstandarddirs.h> -#include <math.h> -#include <kmessagebox.h> -// libkscreensaver interface -extern "C" -{ - KDE_EXPORT const char *kss_applicationName = "kfountain.kss"; - KDE_EXPORT const char *kss_description = I18N_NOOP( "Particle Fountain Screen Saver" ); - KDE_EXPORT const char *kss_version = "2.2.0"; - - KDE_EXPORT KScreenSaver *kss_create( WId id ) - { - return new KFountainSaver( id ); - } - - KDE_EXPORT TQDialog *kss_setup() - { - return new KFountainSetup(); - } -} - -//----------------------------------------------------------------------------- -// dialog to setup screen saver parameters -// -KFountainSetup::KFountainSetup( TQWidget *parent, const char *name ) - : SetupUi( parent, name, TRUE ) -{ - readSettings(); - - //TQLabel *label; - //TQPushButton *button; - - //setCaption( i18n("Setup Particle Fountain") ); - - //TQVBoxLayout *tl = new TQVBoxLayout(this, 10); - //TQHBoxLayout *tl1 = new TQHBoxLayout; - //tl->addLayout(tl1); - - //TQVBoxLayout *tl11 = new TQVBoxLayout(5); - //tl1->addLayout(tl11); - - //label = new TQLabel( i18n("No options here yet...:"), this ); - ///tl11->addWidget(label);; - - //preview = new TQWidget( this ); - preview->setFixedSize( 220, 170 ); - preview->setBackgroundColor( black ); - preview->show(); // otherwise saver does not get correct size - saver = new KFountainSaver( preview->winId() ); - //tl1->addWidget(preview); - - //KButtonBox *bbox = new KButtonBox(this); - //bbox->addStretch(1); -; - connect( PushButton1, TQT_SIGNAL( clicked() ), TQT_SLOT( slotOkPressed() ) ); - connect( PushButton2, TQT_SIGNAL( clicked() ), TQT_SLOT( reject() ) ); - connect( PushButton3, TQT_SIGNAL( clicked() ), TQT_SLOT( aboutPressed() ) ); - connect( SpinBox1, TQT_SIGNAL( valueChanged(int)), saver, TQT_SLOT( updateSize(int))); - connect( RadioButton1, TQT_SIGNAL( toggled(bool)), saver, TQT_SLOT( doStars(bool))); - -} - -// read settings from config file -void KFountainSetup::readSettings() -{ - TDEConfig config("kssfountainrc", false, false); - - config.setGroup( "Settings" ); - TQString boolval = config.readEntry( "Stars", "false" ); - if (boolval == "true") { - RadioButton1->setDown(true); - RadioButton1_2->setDown(false); - } else { - if (boolval == "false") - { - RadioButton1->setDown(false); - RadioButton1_2->setDown(true); - } - } - - TQString starammount = config.readEntry("StarSize", "75"); - SpinBox1->setValue(starammount.toInt()); - -} - -// Ok pressed - save settings and exit -void KFountainSetup::slotOkPressed() -{ - TDEConfig config("kssfountainrc", false, false); - config.setGroup( "Settings" ); - - if (RadioButton1->isOn() == true) - { - config.writeEntry( "Stars", "true" ); - } else { - if (RadioButton1_2->isOn() == true) - { - config.writeEntry( "Stars", "false" ); - } - } - config.writeEntry( "StarSize", TQString::number(SpinBox1->value()) ); - - config.sync(); - - accept(); -} - -void KFountainSetup::aboutPressed() -{ - KMessageBox::about(this, - i18n("<h3>Particle Fountain</h3>\n<p>Particle Fountain Screen Saver for TDE</p>\nCopyright (c) Ian Reinhart Geiser 2001<br>\n\n<p>TDEConfig code and KScreenSaver \"Setup...\" improvements by Nick Betcher <[email protected]> 2001</p>")); -} -//----------------------------------------------------------------------------- - - -KFountainSaver::KFountainSaver( WId id ) : KScreenSaver( id ) -{ - - kdDebug() << "Blank" << endl; - - timer = new TQTimer( this ); - timer->start( 25, TRUE ); - setBackgroundColor( black ); - erase(); - fountain = new Fountain(); - embed(fountain); - fountain->show(); - connect( timer, TQT_SIGNAL(timeout()), this, TQT_SLOT(blank()) ); -} - -KFountainSaver::~KFountainSaver() -{ - -} - -// read configuration settings from config file -void KFountainSaver::readSettings() -{ -// Please remove me - -} - -void KFountainSaver::blank() -{ - // Play fountain - - fountain->updateGL(); - timer->start( 25, TRUE ); - -} -Fountain::Fountain( TQWidget * parent, const char * name) : TQGLWidget (parent,name) -{ - rainbow=true; - slowdown=2.0f; - zoom=-40.0f; - index=0; - size = 0.75f; - obj = gluNewQuadric(); - -// This has to be here because you can't update the fountain until 'fountain' is created! - TDEConfig config("kssfountainrc", false, false); - config.setGroup( "Settings" ); - TQString boolval = config.readEntry( "Stars", "false" ); - if (boolval == "true") { - setStars(true); - } else { - if (boolval == "false") - { - setStars(false); - } - } - - TQString starammount = config.readEntry("StarSize", "75"); - float passvalue = (starammount.toInt() / 100.0); - setSize(passvalue); - -} - -Fountain::~Fountain() -{ - glDeleteTextures( 1, &texture[0] ); - gluDeleteQuadric(obj); -} - -/** load the particle file */ -bool Fountain::loadParticle() -{ - /* Status indicator */ - bool Status = TRUE; - TQImage buf; - - kdDebug() << "Loading: " << locate("data", "kscreensaver/particle.png") << endl; - if (buf.load( locate("data", "kscreensaver/particle.png") ) ) - - { - tex = convertToGLFormat(buf); // flipped 32bit RGBA - kdDebug() << "Texture loaded: " << tex.numBytes () << endl; - } - else - { - TQImage dummy( 32, 32, 32 ); - dummy.fill( TQt::white.rgb() ); - buf = dummy; - tex = convertToGLFormat( buf ); - } - - /* Set the status to true */ - //Status = TRUE; - glGenTextures(1, &texture[0]); /* create three textures */ - glBindTexture(GL_TEXTURE_2D, texture[0]); - /* use linear filtering */ - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - /* actually generate the texture */ - glTexImage2D(GL_TEXTURE_2D, 0, 4, tex.width(), tex.height(), 0, - GL_RGBA, GL_UNSIGNED_BYTE, tex.bits()); - - - - return Status; -} -/** setup the GL enviroment */ -void Fountain::initializeGL () -{ - - kdDebug() << "InitGL" << endl; - GLfloat colors[12][3]= - {{1.0f,0.5f,0.5f},{1.0f,0.75f,0.5f},{1.0f,1.0f,0.5f},{0.75f,1.0f,0.5f}, - {0.5f,1.0f,0.5f},{0.5f,1.0f,0.75f},{0.5f,1.0f,1.0f},{0.5f,0.75f,1.0f}, - {0.5f,0.5f,1.0f},{0.75f,0.5f,1.0f},{1.0f,0.5f,1.0f},{1.0f,0.5f,0.75f}}; - - if (loadParticle()) // Jump To Texture Loading Routine - { - /* Enable smooth shading */ - glShadeModel( GL_SMOOTH ); - - /* Set the background black */ - glClearColor( 0.0f, 0.0f, 0.0f, 0.0f ); - - /* Depth buffer setup */ - glClearDepth( 1.0f ); - - /* Enables Depth Testing */ - glDisable( GL_DEPTH_TEST ); - - /* Enable Blending */ - glEnable( GL_BLEND ); - /* Type Of Blending To Perform */ - glBlendFunc( GL_SRC_ALPHA, GL_ONE ); - - - /* Really Nice Perspective Calculations */ - glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST ); - /* Really Nice Point Smoothing */ - glHint( GL_POINT_SMOOTH_HINT, GL_NICEST ); - - /* Enable Texture Mapping */ - glEnable( GL_TEXTURE_2D ); - /* Select Our Texture */ - glBindTexture( GL_TEXTURE_2D, texture[0] ); - - for (loop=0;loop<MAX_PARTICLES;loop++) // Initials All The Textures - { - particle[loop].active=true; // Make All The Particles Active - particle[loop].life=1.0f; // Give All The Particles Full Life - particle[loop].fade=float(TDEApplication::random()%100)/1000.0f+0.003f; // Random Fade Speed - particle[loop].r=colors[(loop+1)/(MAX_PARTICLES/12)][0]; // Select Red Rainbow Color - particle[loop].g=colors[(loop+1)/(MAX_PARTICLES/12)][1]; // Select Green Rainbow Color - particle[loop].b=colors[(loop+1)/(MAX_PARTICLES/12)][2]; // Select Blue Rainbow Color - particle[loop].xi=float((TDEApplication::random()%50)-26.0f)*10.0f; // Random Speed On X Axis - particle[loop].yi=float((TDEApplication::random()%50)-25.0f)*10.0f; // Random Speed On Y Axis - particle[loop].zi=float((TDEApplication::random()%50)-25.0f)*10.0f; // Random Speed On Z Axis - particle[loop].xg=0.0f; // SetQt::Horizontal Pull To Zero - particle[loop].yg=-0.8f; // SetQt::Vertical Pull Downward - particle[loop].zg=0.0f; // Set Pull On Z Axis To Zero - particle[loop].size=size; // Set particle size. - } - } - else - exit(0); -} -/** resize the gl view */ -void Fountain::resizeGL ( int width, int height ) -{ - kdDebug() << "ResizeGL " << width << "," <<height<< endl; - if (height==0) // Prevent A Divide By Zero By - { - height=1; // Making Height Equal One - } - - glViewport(0,0,width,height); // Reset The Current Viewport - - glMatrixMode(GL_PROJECTION); // Select The Projection Matrix - glLoadIdentity(); // Reset The Projection Matrix - - // Calculate The Aspect Ratio Of The Window - gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,200.0f); - - glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix - glLoadIdentity(); -} -/** paint the GL view */ -void Fountain::paintGL () -{ - //kdDebug() << "PaintGL" << endl; - - GLfloat colors[12][3]= - {{1.0f,0.5f,0.5f},{1.0f,0.75f,0.5f},{1.0f,1.0f,0.5f},{0.75f,1.0f,0.5f}, - {0.5f,1.0f,0.5f},{0.5f,1.0f,0.75f},{0.5f,1.0f,1.0f},{0.5f,0.75f,1.0f}, - {0.5f,0.5f,1.0f},{0.75f,0.5f,1.0f},{1.0f,0.5f,1.0f},{1.0f,0.5f,0.75f}}; - col = ( ++col ) % 12; - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear Screen And Depth Buffer - - glLoadIdentity(); - // Reset The ModelView Matrix - transIndex++; - glTranslatef( GLfloat(5.0*sin(4*3.14*transIndex/360)), GLfloat(4.0*cos(2*3.14*transIndex/360)), 0.0 ); - xspeed = GLfloat(100.0*cos(3*3.14*transIndex/360)+100); - yspeed = GLfloat(100.0*sin(3*3.14*transIndex/360)+100); - //slowdown = GLfloat(4.0*sin(2*3.14*transIndex/360)+4.01); - - for (loop=0;loop<MAX_PARTICLES;loop++) // Loop Through All The Particles - { - if (particle[loop].active) // If The Particle Is Active - { - float x=particle[loop].x; // Grab Our Particle X Position - float y=particle[loop].y; // Grab Our Particle Y Position - float z=particle[loop].z+zoom; // Particle Z Pos + Zoom - /* Select Our Texture */ - - /* Draw The Particle Using Our RGB Values, - * Fade The Particle Based On It's Life - */ - - glColor4f( particle[loop].r, - particle[loop].g, - particle[loop].b, - particle[loop].life ); - - /* Build Quad From A Triangle Strip */ - if( !stars ) - glBegin( GL_TRIANGLE_STRIP ); - else - glBegin( GL_TRIANGLE_FAN ); - /* Top Right */ - glTexCoord2d( 1, 1 ); - glVertex3f( x + particle[loop].size, y + particle[loop].size, z ); - /* Top Left */ - glTexCoord2d( 0, 1 ); - glVertex3f( x - particle[loop].size, y + particle[loop].size, z ); - /* Bottom Right */ - glTexCoord2d( 1, 0 ); - glVertex3f( x + particle[loop].size, y - particle[loop].size, z ); - /* Bottom Left */ - glTexCoord2d( 0, 0 ); - glVertex3f( x - particle[loop].size, y - particle[loop].size, z ); - glEnd( ); - - particle[loop].x+=particle[loop].xi/(slowdown*1000);// Move On The X Axis By X Speed - particle[loop].y+=particle[loop].yi/(slowdown*1000);// Move On The Y Axis By Y Speed - particle[loop].z+=particle[loop].zi/(slowdown*1000);// Move On The Z Axis By Z Speed - - particle[loop].xi+=particle[loop].xg; // Take Pull On X Axis Into Account - particle[loop].yi+=particle[loop].yg; // Take Pull On Y Axis Into Account - particle[loop].zi+=particle[loop].zg; // Take Pull On Z Axis Into Account - particle[loop].life-=particle[loop].fade; // Reduce Particles Life By 'Fade' - - if (particle[loop].life<0.0f) // If Particle Is Burned Out - { - particle[loop].life=2.0f; // Give It New Life - particle[loop].fade=float(TDEApplication::random()%100)/1000.0f+0.003f; // Random Fade Value - particle[loop].x=0.0f; // Center On X Axis - particle[loop].y=0.0f; // Center On Y Axis - particle[loop].z=0.0f; // Center On Z Axis - particle[loop].xi=xspeed+float((TDEApplication::random()%60)-32.0f); // X Axis Speed And Direction - particle[loop].yi=yspeed+float((TDEApplication::random()%60)-30.0f); // Y Axis Speed And Direction - particle[loop].zi=float((TDEApplication::random()%60)-30.0f); // Z Axis Speed And Direction - particle[loop].r=colors[col][0]; // Select Red From Color Table - particle[loop].g=colors[col][1]; // Select Green From Color Table - particle[loop].b=colors[col][2]; // Select Blue From Color Table - particle[loop].size=size; - if ((1+(random()%20)) == 10) - { - // Explode - particle[loop].active=true; // Make All The Particles Active - particle[loop].life=1.0f; // Give All The Particles Full Life - particle[loop].fade=float(TDEApplication::random()%100)/1000.0f+0.003f; // Random Fade Speed - particle[loop].r=colors[(loop+1)/(MAX_PARTICLES/12)][0]; // Select Red Rainbow Color - particle[loop].g=colors[(loop+1)/(MAX_PARTICLES/12)][1]; // Select Green Rainbow Color - particle[loop].b=colors[(loop+1)/(MAX_PARTICLES/12)][2]; // Select Blue Rainbow Color - particle[loop].xi=float((TDEApplication::random()%50)-26.0f)*10.0f; // Random Speed On X Axis - particle[loop].yi=float((TDEApplication::random()%50)-25.0f)*10.0f; // Random Speed On Y Axis - particle[loop].zi=float((TDEApplication::random()%50)-25.0f)*10.0f; // Random Speed On Z Axis - particle[loop].xg=0.0f; // SetQt::Horizontal Pull To Zero - particle[loop].yg=-0.8f; // SetQt::Vertical Pull Downward - particle[loop].zg=0.0f; // Set Pull On Z Axis To Zero - particle[loop].size=size; // Set particle size. - } - } - // Lets stir some things up - index += 0.001; - particle[loop].yg =2.0*sin(2*3.14*transIndex/360); - particle[loop].xg =2.0*cos(2*3.14*transIndex/360); - particle[loop].zg =4.0+(4.0*cos(2*3.14*transIndex/360)); - - } - } - - glFlush(); -} -void Fountain::setSize( float newSize ) -{ - size = newSize; -} -void Fountain::setStars( bool doStars ) -{ - stars = doStars; -} - -void KFountainSaver::updateSize(int newSize) -{ - fountain->setSize(newSize/100); -} -void KFountainSaver::doStars(bool starState) -{ - fountain->setStars(starState); -} - diff --git a/kscreensaver/kdesavers/fountain.h b/kscreensaver/kdesavers/fountain.h deleted file mode 100644 index 8ddd3821..00000000 --- a/kscreensaver/kdesavers/fountain.h +++ /dev/null @@ -1,143 +0,0 @@ -//----------------------------------------------------------------------------- -// -// kfountain - Partical Fountain Screen Saver for KDE 2 -// -// Copyright (c) Ian Reinhart Geiser 2001 -// -///// -//NOTE: -// The base particle engine did not come from me, it was designed by Jeff Molofee <[email protected]> -// I did some extensive modifications to make it work with QT's OpenGL but the base principal is about -// the same. -//// - -#ifndef __FOUNTAIN_H__ -#define __FOUNTAIN_H__ - -#include <tqdialog.h> -#include <tqgl.h> -#ifdef TQ_WS_MACX -#include <OpenGL/gl.h> -#include <OpenGL/glu.h> -#else -#include <GL/glu.h> -#include <GL/gl.h> -#endif -#include <kscreensaver.h> -#include <tqtimer.h> -#include <tqimage.h> -#include "fountaincfg.h" -#include <kinstance.h> -#include <tqfile.h> -#include <tqtextstream.h> - -#define MAX_PARTICLES 1000 - - -class Fountain : public TQGLWidget -{ -Q_OBJECT - - class particles // Create A Structure For Particle - { - public: - bool active; // Active (Yes/No) - float life; // Particle Life - float fade; // Fade Speed - float r; // Red Value - float g; // Green Value - float b; // Blue Value - float x; // X Position - float y; // Y Position - float z; // Z Position - float xi; // X Direction - float yi; // Y Direction - float zi; // Z Direction - float xg; // X Gravity - float yg; // Y Gravity - float zg; // Z Gravity - float size; // Particle Size - }; - -public: - Fountain( TQWidget * parent=0, const char * name=0 ); - ~Fountain(); - void setSize( float newSize ); - void setStars( bool doStars ); -protected: - /** paint the GL view */ - void paintGL (); - /** resize the gl view */ - void resizeGL ( int w, int h ); - /** setup the GL enviroment */ - void initializeGL (); - - -private: - /** load the partical file */ - bool loadParticle(); - - particles particle[MAX_PARTICLES]; - - - bool rainbow; // Rainbow Mode? - bool sp; // Spacebar Pressed? - bool rp; // Enter Key Pressed? - - float slowdown; // Slow Down Particles - float xspeed; // Base X Speed (To Allow Keyboard Direction Of Tail) - float yspeed; // Base Y Speed (To Allow Keyboard Direction Of Tail) - float zoom; // Used To Zoom Out - float size; - float stars; - GLuint loop; // Misc Loop Variable - GLuint col; // Current Color Selection - GLuint delay; // Rainbow Effect Delay - GLuint texture[1]; - TQImage tex; - float index; - float transIndex; - GLfloat scale; - GLUquadricObj *obj; -}; - -class KFountainSaver : public KScreenSaver -{ -Q_OBJECT - -public: - KFountainSaver( WId drawable ); - virtual ~KFountainSaver(); - void readSettings(); -public slots: - void blank(); - void updateSize(int newSize); - void doStars(bool starState); -// void loadTextures(bool textures); -private: - Fountain *fountain; - TQTimer *timer; -}; - -class KFountainSetup : public SetupUi -{ - Q_OBJECT - -public: - KFountainSetup( TQWidget *parent = NULL, const char *name = NULL ); - -protected: - void readSettings(); - -private slots: - void slotOkPressed(); - void aboutPressed(); -private: - KFountainSaver *saver; - float size; - float stars; -}; - -#endif - - diff --git a/kscreensaver/kdesavers/fountaincfg.ui b/kscreensaver/kdesavers/fountaincfg.ui deleted file mode 100644 index 3b5eacd7..00000000 --- a/kscreensaver/kdesavers/fountaincfg.ui +++ /dev/null @@ -1,192 +0,0 @@ -<!DOCTYPE UI><UI version="3.0" stdsetdef="1"> -<class>SetupUi</class> -<widget class="TQDialog"> - <property name="name"> - <cstring>SetupUi</cstring> - </property> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>400</width> - <height>209</height> - </rect> - </property> - <property name="minimumSize"> - <size> - <width>400</width> - <height>209</height> - </size> - </property> - <property name="baseSize"> - <size> - <width>400</width> - <height>250</height> - </size> - </property> - <property name="caption"> - <string>Particle Fountain Setup</string> - </property> - <grid> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <property name="margin"> - <number>11</number> - </property> - <property name="spacing"> - <number>6</number> - </property> - <widget class="TQLayoutWidget" row="0" column="0"> - <property name="name"> - <cstring>Layout4</cstring> - </property> - <grid> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <property name="margin"> - <number>0</number> - </property> - <property name="spacing"> - <number>6</number> - </property> - <widget class="TQCheckBox" row="3" column="0"> - <property name="name"> - <cstring>CheckBox1</cstring> - </property> - <property name="text"> - <string>Use textures</string> - </property> - </widget> - <widget class="TQPushButton" row="4" column="2"> - <property name="name"> - <cstring>PushButton3</cstring> - </property> - <property name="text"> - <string>&About</string> - </property> - </widget> - <widget class="TQSpinBox" row="1" column="0"> - <property name="name"> - <cstring>SpinBox1</cstring> - </property> - <property name="maxValue"> - <number>500</number> - </property> - <property name="minValue"> - <number>25</number> - </property> - <property name="lineStep"> - <number>10</number> - </property> - <property name="value"> - <number>75</number> - </property> - </widget> - <widget class="TQPushButton" row="4" column="1"> - <property name="name"> - <cstring>PushButton2</cstring> - </property> - <property name="text"> - <string>&Cancel</string> - </property> - </widget> - <widget class="TQPushButton" row="4" column="0"> - <property name="name"> - <cstring>PushButton1</cstring> - </property> - <property name="text"> - <string>&OK</string> - </property> - <property name="default"> - <bool>true</bool> - </property> - </widget> - <widget class="TQGroupBox" row="2" column="0"> - <property name="name"> - <cstring>GroupBox1</cstring> - </property> - <property name="title"> - <string>Shapes</string> - </property> - <grid> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <property name="margin"> - <number>11</number> - </property> - <property name="spacing"> - <number>6</number> - </property> - <widget class="TQLayoutWidget" row="0" column="0"> - <property name="name"> - <cstring>Layout3</cstring> - </property> - <vbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <property name="margin"> - <number>0</number> - </property> - <property name="spacing"> - <number>6</number> - </property> - <widget class="TQRadioButton"> - <property name="name"> - <cstring>RadioButton1</cstring> - </property> - <property name="text"> - <string>Stars</string> - </property> - <property name="checked"> - <bool>true</bool> - </property> - </widget> - <widget class="TQRadioButton"> - <property name="name"> - <cstring>RadioButton1_2</cstring> - </property> - <property name="text"> - <string>Flares</string> - </property> - </widget> - </vbox> - </widget> - </grid> - </widget> - <widget class="TQWidget" row="0" column="1" rowspan="4" colspan="2"> - <property name="name"> - <cstring>preview</cstring> - </property> - </widget> - <widget class="TQLabel" row="0" column="0"> - <property name="name"> - <cstring>TextLabel1</cstring> - </property> - <property name="text"> - <string>Particle size:</string> - </property> - </widget> - </grid> - </widget> - </grid> -</widget> -<connections> - <connection> - <sender>RadioButton1_2</sender> - <signal>pressed()</signal> - <receiver>RadioButton1</receiver> - <slot>toggle()</slot> - </connection> - <connection> - <sender>RadioButton1</sender> - <signal>pressed()</signal> - <receiver>RadioButton1_2</receiver> - <slot>toggle()</slot> - </connection> -</connections> -<layoutdefaults spacing="6" margin="11"/> -</UI> diff --git a/kscreensaver/kdesavers/gravity.cpp b/kscreensaver/kdesavers/gravity.cpp deleted file mode 100644 index 1f51a5a7..00000000 --- a/kscreensaver/kdesavers/gravity.cpp +++ /dev/null @@ -1,419 +0,0 @@ -//----------------------------------------------------------------------------- -// -// kgravity - Partical Gravity Screen Saver for KDE 2 -// -// Copyright (c) Ian Reinhart Geiser 2001 -// -// TDEConfig code and KScreenSaver "Setup..." improvements by -// Nick Betcher <[email protected]> 2001 -// -#include <stdlib.h> -#include <tqlabel.h> -#include <tqlayout.h> -#include <kapplication.h> -#include <klocale.h> -#include <kconfig.h> -#include <kcolordialog.h> -#include <kbuttonbox.h> -#include <kcolorbutton.h> -#include "gravity.h" -#include "gravity.moc" -#ifdef TQ_WS_MACX -#include <OpenGL/glu.h> -#include <OpenGL/gl.h> -#else -#include <GL/glu.h> -#include <GL/gl.h> -#endif -#include <tqimage.h> -#include <kdebug.h> -#include <tqpainter.h> -#include <tqradiobutton.h> -#include <tqspinbox.h> -#include <kstandarddirs.h> -#include <math.h> -#include <kmessagebox.h> -// libkscreensaver interface -extern "C" -{ - KDE_EXPORT const char *kss_applicationName = "kgravity.kss"; - KDE_EXPORT const char *kss_description = I18N_NOOP( "Particle Gravity Screen Saver" ); - KDE_EXPORT const char *kss_version = "2.2.0"; - - KDE_EXPORT KScreenSaver *kss_create( WId id ) - { - return new KGravitySaver( id ); - } - - KDE_EXPORT TQDialog *kss_setup() - { - return new KGravitySetup(); - } -} - -//----------------------------------------------------------------------------- -// dialog to setup screen saver parameters -// -KGravitySetup::KGravitySetup( TQWidget *parent, const char *name ) - : SetupUi( parent, name, TRUE ) -{ - readSettings(); - - preview->setFixedSize( 220, 170 ); - preview->setBackgroundColor( black ); -#ifdef TQ_WS_X11 - preview->show(); // otherwise saver does not get correct size -#endif - saver = new KGravitySaver( preview->winId() ); -; - connect( PushButton1, TQT_SIGNAL( clicked() ), TQT_SLOT( slotOkPressed() ) ); - connect( PushButton2, TQT_SIGNAL( clicked() ), TQT_SLOT( reject() ) ); - connect( PushButton3, TQT_SIGNAL( clicked() ), TQT_SLOT( aboutPressed() ) ); - connect( SpinBox1, TQT_SIGNAL( valueChanged(int)), saver, TQT_SLOT( updateSize(int))); - connect( RadioButton1, TQT_SIGNAL( toggled(bool)), saver, TQT_SLOT( doStars(bool))); - -} - -KGravitySetup::~KGravitySetup() -{ - delete saver; -} - -// read settings from config file -void KGravitySetup::readSettings() -{ - TDEConfig config("kssgravityrc", false, false); - - config.setGroup( "Settings" ); - TQString boolval = config.readEntry( "Stars", "false" ); - if (boolval == "true") { - RadioButton1->setDown(true); - RadioButton1_2->setDown(false); - } else { - if (boolval == "false") - { - RadioButton1->setDown(false); - RadioButton1_2->setDown(true); - } - } - - TQString starammount = config.readEntry("StarSize", "75"); - SpinBox1->setValue(starammount.toInt()); - -} - -// Ok pressed - save settings and exit -void KGravitySetup::slotOkPressed() -{ - TDEConfig config("kssgravityrc", false, false); - config.setGroup( "Settings" ); - - if (RadioButton1->isOn() == true) - { - config.writeEntry( "Stars", "true" ); - } else { - if (RadioButton1_2->isOn() == true) - { - config.writeEntry( "Stars", "false" ); - } - } - config.writeEntry( "StarSize", TQString::number(SpinBox1->value()) ); - - config.sync(); - - accept(); -} - -void KGravitySetup::aboutPressed() -{ - KMessageBox::about(this, - i18n("<h3>Gravity</h3>\n<p>Particle Gravity Screen Saver for TDE</p>\nCopyright (c) Ian Reinhart Geiser 2001<br>\n\n<p>TDEConfig code and KScreenSaver \"Setup...\" improvements by Nick Betcher <[email protected]> 2001</p>")); -} -//----------------------------------------------------------------------------- - - -KGravitySaver::KGravitySaver( WId id ) : KScreenSaver( id ) -{ - - kdDebug() << "Blank" << endl; - - timer = new TQTimer( this ); - timer->start( 25, TRUE ); - setBackgroundColor( black ); - erase(); - gravity = new Gravity(); - embed(gravity); -#ifdef TQ_WS_X11 - gravity->show(); -#endif - connect( timer, TQT_SIGNAL(timeout()), this, TQT_SLOT(blank()) ); -} - -KGravitySaver::~KGravitySaver() -{ - -} - -// read configuration settings from config file -void KGravitySaver::readSettings() -{ -// Please remove me - -} - -void KGravitySaver::blank() -{ - // Play gravity - - gravity->updateGL(); - timer->start( 25, TRUE ); - -} -Gravity::Gravity( TQWidget * parent, const char * name) : TQGLWidget (parent,name) -{ - rainbow=true; - slowdown=2.0f; - zoom=-50.0f; - index=0; - size = 3.95f; -// obj = gluNewQuadric(); - -// This has to be here because you can't update the gravity until 'gravity' is created! - TDEConfig config("kssgravityrc", false, false); - config.setGroup( "Settings" ); - TQString boolval = config.readEntry( "Stars", "false" ); - if (boolval == "true") { - setStars(true); - } else { - if (boolval == "false") - { - setStars(false); - } - } - - TQString starammount = config.readEntry("StarSize", "75"); - float passvalue = (starammount.toInt() / 100.0); - setSize(passvalue); - -} - -Gravity::~Gravity() -{ - glDeleteTextures( 1, &texture[0] ); - gluDeleteQuadric(obj); -} - -/** load the particle file */ -bool Gravity::loadParticle() -{ - /* Status indicator */ - bool Status = TRUE; - TQImage buf; - - kdDebug() << "Loading: " << locate("data", "kscreensaver/particle.png") << endl; - if (buf.load( locate("data", "kscreensaver/particle.png") ) ) - - { - tex = convertToGLFormat(buf); // flipped 32bit RGBA - kdDebug() << "Texture loaded: " << tex.numBytes () << endl; - } - else - { - TQImage dummy( 32, 32, 32 ); - dummy.fill( TQt::white.rgb() ); - buf = dummy; - tex = convertToGLFormat( buf ); - } - - /* Set the status to true */ - //Status = TRUE; - glGenTextures(1, &texture[0]); /* create three textures */ - glBindTexture(GL_TEXTURE_2D, texture[0]); - /* use linear filtering */ - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - /* actually generate the texture */ - glTexImage2D(GL_TEXTURE_2D, 0, 4, tex.width(), tex.height(), 0, - GL_RGBA, GL_UNSIGNED_BYTE, tex.bits()); - - - - return Status; -} -/** setup the GL enviroment */ -void Gravity::initializeGL () -{ - - kdDebug() << "InitGL" << endl; - - if (loadParticle()) // Jump To Texture Loading Routine - { - /* Enable smooth shading */ - glShadeModel( GL_SMOOTH ); - - /* Set the background black */ - glClearColor( 0.0f, 0.0f, 0.0f, 0.0f ); - - /* Depth buffer setup */ - glClearDepth( 1.0f ); - - /* Enables Depth Testing */ - glDisable( GL_DEPTH_TEST ); - - /* Enable Blending */ - glEnable( GL_BLEND ); - /* Type Of Blending To Perform */ - glBlendFunc( GL_SRC_ALPHA, GL_ONE ); - - - /* Really Nice Perspective Calculations */ - glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST ); - /* Really Nice Point Smoothing */ - glHint( GL_POINT_SMOOTH_HINT, GL_NICEST ); - - /* Enable Texture Mapping */ - glEnable( GL_TEXTURE_2D ); - /* Select Our Texture */ - glBindTexture( GL_TEXTURE_2D, texture[0] ); - - for (loop=0;loop<MAX_PARTICLES;loop++) // Initials All The Textures - { - buildParticle(loop); - } - } - else - exit(0); -} -/** resize the gl view */ -void Gravity::resizeGL ( int width, int height ) -{ - kdDebug() << "ResizeGL " << width << "," <<height<< endl; - if (height==0) // Prevent A Divide By Zero By - { - height=1; // Making Height Equal One - } - - glViewport(0,0,width,height); // Reset The Current Viewport - - glMatrixMode(GL_PROJECTION); // Select The Projection Matrix - glLoadIdentity(); // Reset The Projection Matrix - - // Calculate The Aspect Ratio Of The Window - gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f); - - glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix - glLoadIdentity(); -} -/** paint the GL view */ -void Gravity::paintGL () -{ - //kdDebug() << "PaintGL" << endl; - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear Screen And Depth Buffer - glLoadIdentity(); - // Reset The ModelView Matrix - transIndex++; - //glRotatef(transIndex, 1,0,0); - //glRotatef(transIndex, 0,1,0); - //glRotatef(transIndex, 0,0,1); - float xmax = 5.0; - float ymax = 5.0; - glTranslatef( GLfloat(xmax*sin(3.14*transIndex/360)-xmax), - GLfloat(ymax*cos(3.14*transIndex/360)-ymax), - 0.0 ); - //glRotatef(transIndex, 0,GLfloat(zmax*cos(3.14*transIndex/360000)), GLfloat(zmax*cos(3.14*transIndex/360000))); - - for (loop=0;loop<MAX_PARTICLES;loop++) // Loop Through All The Particles - { - if (particle[loop].active) // If The Particle Is Active - { - float x=particle[loop].x; // Grab Our Particle X Position - float y=particle[loop].y; // Grab Our Particle Y Position - float z=particle[loop].z+zoom; // Particle Z Pos + Zoom - /* Select Our Texture */ - - /* Draw The Particle Using Our RGB Values, - * Fade The Particle Based On It's Life - */ - particle[loop].life=(particle[loop].index/particle[loop].indexo)*2.0f; - glColor4f( particle[loop].r, - particle[loop].g, - particle[loop].b, - particle[loop].life ); - - /* Build Quad From A Triangle Strip */ - if( !stars ) - glBegin( GL_TRIANGLE_STRIP ); - else - glBegin( GL_TRIANGLE_FAN ); - /* Top Right */ - glTexCoord2d( 1, 1 ); - glVertex3f( x + particle[loop].size, y + particle[loop].size, z ); - /* Top Left */ - glTexCoord2d( 0, 1 ); - glVertex3f( x - particle[loop].size, y + particle[loop].size, z ); - /* Bottom Right */ - glTexCoord2d( 1, 0 ); - glVertex3f( x + particle[loop].size, y - particle[loop].size, z ); - /* Bottom Left */ - glTexCoord2d( 0, 0 ); - glVertex3f( x - particle[loop].size, y - particle[loop].size, z ); - glEnd( ); - particle[loop].x=(particle[loop].xo*sin(particle[loop].index))*pow((double) particle[loop].index/particle[loop].indexo,(double) 8.0); - particle[loop].y=(particle[loop].yo*sin(particle[loop].index))*pow((double) particle[loop].index/particle[loop].indexo,(double) 8.0); - particle[loop].z=(particle[loop].zo*sin(particle[loop].index))*pow((double) particle[loop].index/particle[loop].indexo,(double) 8.0); - particle[loop].index-=0.05; - if (particle[loop].index<0.0f ) // If Particle Is Burned Out - { - buildParticle(loop); - } - // Lets stir some things up - } - } - - glFlush(); -} -void Gravity::setSize( float newSize ) -{ - size = newSize; -} -void Gravity::setStars( bool doStars ) -{ - stars = doStars; -} - -void KGravitySaver::updateSize(int newSize) -{ - gravity->setSize(newSize/100); -} -void KGravitySaver::doStars(bool starState) -{ - gravity->setStars(starState); -} - -void Gravity::buildParticle(int loop) -{ - GLfloat colors[12][3]= - {{1.0f,0.5f,0.5f},{1.0f,0.75f,0.5f},{1.0f,1.0f,0.5f},{0.75f,1.0f,0.5f}, - {0.5f,1.0f,0.5f},{0.5f,1.0f,0.75f},{0.5f,1.0f,1.0f},{0.5f,0.75f,1.0f}, - {0.5f,0.5f,1.0f},{0.75f,0.5f,1.0f},{1.0f,0.5f,1.0f},{1.0f,0.5f,0.75f}}; - col = ( ++col ) % 12; - particle[loop].active=true; - particle[loop].index=TDEApplication::random()%100; - particle[loop].indexo=particle[loop].index; - particle[loop].fade=float(TDEApplication::random()%100)/1000.0f+0.003f; // Random Fade Value - particle[loop].r=colors[col][0]; // Select Red From Color Table - particle[loop].g=colors[col][1]; // Select Green From Color Table - particle[loop].b=colors[col][2]; // Select Blue From Color Table - particle[loop].size=size; - particle[loop].x = float(TDEApplication::random()%100-50)*4.0; - particle[loop].y = float(TDEApplication::random()%20-10)*4.0; - particle[loop].z = float(TDEApplication::random()%100-50)*4.0; - particle[loop].xo = particle[loop].x; - if ((1+(TDEApplication::random() % 10) > 5)) - particle[loop].yo = particle[loop].y; - else - particle[loop].yo = 0.0; - particle[loop].zo = particle[loop].z; - -} - diff --git a/kscreensaver/kdesavers/gravity.h b/kscreensaver/kdesavers/gravity.h deleted file mode 100644 index 0a1130bb..00000000 --- a/kscreensaver/kdesavers/gravity.h +++ /dev/null @@ -1,144 +0,0 @@ -///----------------------------------------------------------------------------- -// -// kgravity - Partical gravity Screen Saver for KDE 2 -// -// Copyright (c) Ian Reinhart Geiser 2001 -// -///// -//NOTE: -// The base particle engine did not come from me, it was designed by Jeff Molofee <[email protected]> -// I did some extensive modifications to make it work with QT's OpenGL but the base principal is about -// the same. -//// - -#ifndef __GRAVITY_H__ -#define __GRAVITY_H__ - -#include <tqdialog.h> -#include <tqgl.h> -#ifdef TQ_WS_MACX -#include <OpenGL/glu.h> -#include <OpenGL/gl.h> -#else -#include <GL/glu.h> -#include <GL/gl.h> -#endif -#include <kscreensaver.h> -#include <tqtimer.h> -#include <tqimage.h> -#include "gravitycfg.h" -#include <kinstance.h> -#include <tqfile.h> -#include <tqtextstream.h> - -#define MAX_PARTICLES 100 - - -class Gravity : public TQGLWidget -{ -Q_OBJECT - - class particles // Create A Structure For Particle - { - public: - bool active; // Active (Yes/No) - float life; // Particle Life - float fade; // Fade Speed - float r; // Red Value - float g; // Green Value - float b; // Blue Value - float x; // X Position - float y; // Y Position - float z; // Z Position - float xo; // X Position - float yo; // Y Position - float zo; // Z Position - float index; // Index - float indexo; - float size; // Particle Size - }; - -public: - Gravity( TQWidget * parent=0, const char * name=0 ); - ~Gravity(); - void setSize( float newSize ); - void setStars( bool doStars ); -protected: - /** paint the GL view */ - void paintGL (); - /** resize the gl view */ - void resizeGL ( int w, int h ); - /** setup the GL enviroment */ - void initializeGL (); - void buildParticle(int loop); - -private: - /** load the partical file */ - bool loadParticle(); - - particles particle[MAX_PARTICLES]; - - - bool rainbow; // Rainbow Mode? - bool sp; // Spacebar Pressed? - bool rp; // Enter Key Pressed? - float slowdown; // Slow Down Particles - float xspeed; // Base X Speed (To Allow Keyboard Direction Of Tail) - float yspeed; // Base Y Speed (To Allow Keyboard Direction Of Tail) - float zoom; // Used To Zoom Out - float size; - float stars; - GLuint loop; // Misc Loop Variable - GLuint col; // Current Color Selection - GLuint delay; // Rainbow Effect Delay - GLuint texture[1]; - TQImage tex; - float index; - float transIndex; - GLfloat scale; - GLUquadricObj *obj; -}; - -class KGravitySaver : public KScreenSaver -{ -Q_OBJECT - -public: - KGravitySaver( WId drawable ); - virtual ~KGravitySaver(); - void readSettings(); -public slots: - void blank(); - void updateSize(int newSize); - void doStars(bool starState); -// void loadTextures(bool textures); -private: - Gravity *gravity; - TQTimer *timer; -}; - -class KGravitySetup : public SetupUi -{ - Q_OBJECT - -public: - KGravitySetup( TQWidget *parent = NULL, const char *name = NULL ); - ~KGravitySetup(); - -protected: - void readSettings(); - -private slots: - void slotOkPressed(); - void aboutPressed(); -private: - KGravitySaver *saver; - float size; - float stars; - float zoom; - float speed; -}; - -#endif - - diff --git a/kscreensaver/kdesavers/gravitycfg.ui b/kscreensaver/kdesavers/gravitycfg.ui deleted file mode 100644 index 2d809c1f..00000000 --- a/kscreensaver/kdesavers/gravitycfg.ui +++ /dev/null @@ -1,192 +0,0 @@ -<!DOCTYPE UI><UI version="3.0" stdsetdef="1"> -<class>SetupUi</class> -<widget class="TQDialog"> - <property name="name"> - <cstring>SetupUi</cstring> - </property> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>400</width> - <height>209</height> - </rect> - </property> - <property name="minimumSize"> - <size> - <width>400</width> - <height>209</height> - </size> - </property> - <property name="baseSize"> - <size> - <width>400</width> - <height>250</height> - </size> - </property> - <property name="caption"> - <string>Gravity Setup</string> - </property> - <grid> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <property name="margin"> - <number>11</number> - </property> - <property name="spacing"> - <number>6</number> - </property> - <widget class="TQLayoutWidget" row="0" column="0"> - <property name="name"> - <cstring>Layout4</cstring> - </property> - <grid> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <property name="margin"> - <number>0</number> - </property> - <property name="spacing"> - <number>6</number> - </property> - <widget class="TQCheckBox" row="3" column="0"> - <property name="name"> - <cstring>CheckBox1</cstring> - </property> - <property name="text"> - <string>Use textures</string> - </property> - </widget> - <widget class="TQPushButton" row="4" column="2"> - <property name="name"> - <cstring>PushButton3</cstring> - </property> - <property name="text"> - <string>&About</string> - </property> - </widget> - <widget class="TQSpinBox" row="1" column="0"> - <property name="name"> - <cstring>SpinBox1</cstring> - </property> - <property name="maxValue"> - <number>500</number> - </property> - <property name="minValue"> - <number>25</number> - </property> - <property name="lineStep"> - <number>10</number> - </property> - <property name="value"> - <number>75</number> - </property> - </widget> - <widget class="TQPushButton" row="4" column="1"> - <property name="name"> - <cstring>PushButton2</cstring> - </property> - <property name="text"> - <string>&Cancel</string> - </property> - </widget> - <widget class="TQPushButton" row="4" column="0"> - <property name="name"> - <cstring>PushButton1</cstring> - </property> - <property name="text"> - <string>&OK</string> - </property> - <property name="default"> - <bool>true</bool> - </property> - </widget> - <widget class="TQGroupBox" row="2" column="0"> - <property name="name"> - <cstring>GroupBox1</cstring> - </property> - <property name="title"> - <string>Shapes</string> - </property> - <grid> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <property name="margin"> - <number>11</number> - </property> - <property name="spacing"> - <number>6</number> - </property> - <widget class="TQLayoutWidget" row="0" column="0"> - <property name="name"> - <cstring>Layout3</cstring> - </property> - <vbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <property name="margin"> - <number>0</number> - </property> - <property name="spacing"> - <number>6</number> - </property> - <widget class="TQRadioButton"> - <property name="name"> - <cstring>RadioButton1</cstring> - </property> - <property name="text"> - <string>Stars</string> - </property> - <property name="checked"> - <bool>true</bool> - </property> - </widget> - <widget class="TQRadioButton"> - <property name="name"> - <cstring>RadioButton1_2</cstring> - </property> - <property name="text"> - <string>Flares</string> - </property> - </widget> - </vbox> - </widget> - </grid> - </widget> - <widget class="TQWidget" row="0" column="1" rowspan="4" colspan="2"> - <property name="name"> - <cstring>preview</cstring> - </property> - </widget> - <widget class="TQLabel" row="0" column="0"> - <property name="name"> - <cstring>TextLabel1</cstring> - </property> - <property name="text"> - <string>Particle size:</string> - </property> - </widget> - </grid> - </widget> - </grid> -</widget> -<connections> - <connection> - <sender>RadioButton1_2</sender> - <signal>pressed()</signal> - <receiver>RadioButton1</receiver> - <slot>toggle()</slot> - </connection> - <connection> - <sender>RadioButton1</sender> - <signal>pressed()</signal> - <receiver>RadioButton1_2</receiver> - <slot>toggle()</slot> - </connection> -</connections> -<layoutdefaults spacing="6" margin="11"/> -</UI> diff --git a/kscreensaver/kdesavers/image.png b/kscreensaver/kdesavers/image.png Binary files differdeleted file mode 100644 index 859645da..00000000 --- a/kscreensaver/kdesavers/image.png +++ /dev/null diff --git a/kscreensaver/kdesavers/kclock.cpp b/kscreensaver/kdesavers/kclock.cpp deleted file mode 100644 index 5201f222..00000000 --- a/kscreensaver/kdesavers/kclock.cpp +++ /dev/null @@ -1,588 +0,0 @@ -// $Id$ -// -// kclock - Clock screen saver for KDE -// Copyright (c) 2003 Melchior FRANZ -// -// License: GPL v2 -// Author: Melchior FRANZ <[email protected]> -// Dependencies: libart_lgpl_2 http://www.levien.com/libart/ -// -#include <stdlib.h> -#include <string.h> - -#include <tqcheckbox.h> -#include <tqcolor.h> -#include <tqdatetime.h> -#include <tqgroupbox.h> -#include <tqhbox.h> -#include <tqimage.h> -#include <tqlabel.h> -#include <tqlayout.h> -#include <tqpainter.h> -#include <tqslider.h> - -#include <kapplication.h> -#include <kcolorbutton.h> -#include <kconfig.h> -#include <kglobal.h> -#include <klocale.h> -#include <kmessagebox.h> - -#include <libart_lgpl/art_affine.h> -#include <libart_lgpl/art_misc.h> -#include <libart_lgpl/art_rgb.h> -#include <libart_lgpl/art_rgb_svp.h> -#include <libart_lgpl/art_svp_vpath.h> -#include <libart_lgpl/art_svp_vpath_stroke.h> -#include <libart_lgpl/art_vpath.h> - -#include "kclock.h" -#include "kclock.moc" - - -const int COLOR_BUTTON_WIDTH = 80; -const int TIMER_INTERVALL = 100; -const int MAX_CLOCK_SIZE = 10; -const int DEFAULT_CLOCK_SIZE = 3; -const bool DEFAULT_KEEP_CENTERED = false; - - - - -extern "C" { - KDE_EXPORT const char *kss_applicationName = "kclock.kss"; - KDE_EXPORT const char *kss_description = I18N_NOOP("Clock"); - KDE_EXPORT const char *kss_version = "1.0"; - - KDE_EXPORT KScreenSaver *kss_create(WId id) { - return new KClockSaver(id); - } - - KDE_EXPORT TQDialog *kss_setup() { - return new KClockSetup(); - } -} - - - - -//----------------------------------------------------------------------------- - -KClockSetup::KClockSetup(TQWidget *parent, const char *name) - : KDialogBase(parent, name, true, i18n( "Setup Clock Screen Saver" ), - Ok|Cancel|Help, Ok, true), - m_saver(0) -{ - readSettings(); - - setButtonText( Help, i18n( "A&bout" ) ); - TQWidget *main = makeMainWidget(); - - TQVBoxLayout *top = new TQVBoxLayout(main, 0, spacingHint()); - - TQHBoxLayout *hbox = new TQHBoxLayout; - top->addLayout( hbox ); - - TQGroupBox *colgroup = new TQGroupBox(i18n("Colors"), main); - colgroup->setColumnLayout( 0,Qt::Horizontal ); - TQGridLayout *grid = new TQGridLayout( colgroup->layout(), - 5, 2, spacingHint() ); - - TQLabel *label = new TQLabel(i18n("&Hour-hand:"), colgroup); - KColorButton *colorButton = new KColorButton(m_hourColor, colgroup); - colorButton->setFixedWidth(COLOR_BUTTON_WIDTH); - label->setBuddy(colorButton); - connect(colorButton, TQT_SIGNAL(changed(const TQColor &)), - TQT_SLOT(slotHourColor(const TQColor &))); - grid->addWidget( label, 1, 1 ); - grid->addWidget( colorButton, 1, 2 ); - - label = new TQLabel(i18n("&Minute-hand:"), colgroup); - colorButton = new KColorButton(m_minColor, colgroup); - colorButton->setFixedWidth(COLOR_BUTTON_WIDTH); - label->setBuddy(colorButton); - connect(colorButton, TQT_SIGNAL(changed(const TQColor &)), - TQT_SLOT(slotMinColor(const TQColor &))); - grid->addWidget( label, 2, 1 ); - grid->addWidget( colorButton, 2, 2 ); - - label = new TQLabel(i18n("&Second-hand:"), colgroup); - colorButton = new KColorButton(m_secColor, colgroup); - colorButton->setFixedWidth(COLOR_BUTTON_WIDTH); - label->setBuddy(colorButton); - connect(colorButton, TQT_SIGNAL(changed(const TQColor &)), - TQT_SLOT(slotSecColor(const TQColor &))); - grid->addWidget( label, 3, 1 ); - grid->addWidget( colorButton, 3, 2 ); - - label = new TQLabel(i18n("Scal&e:"), colgroup); - colorButton = new KColorButton(m_scaleColor, colgroup); - colorButton->setFixedWidth(COLOR_BUTTON_WIDTH); - label->setBuddy(colorButton); - connect(colorButton, TQT_SIGNAL(changed(const TQColor &)), - TQT_SLOT(slotScaleColor(const TQColor &))); - grid->addWidget( label, 4, 1 ); - grid->addWidget( colorButton, 4, 2 ); - - label = new TQLabel(i18n("&Background:"), colgroup); - colorButton = new KColorButton(m_bgndColor, colgroup); - colorButton->setFixedWidth(COLOR_BUTTON_WIDTH); - label->setBuddy(colorButton); - connect(colorButton, TQT_SIGNAL(changed(const TQColor &)), - TQT_SLOT(slotBgndColor(const TQColor &))); - grid->addWidget( label, 5, 1 ); - grid->addWidget( colorButton, 5, 2 ); - - hbox->addWidget(colgroup); - - TQWidget *m_preview = new TQWidget(main); - m_preview->setFixedSize(220, 165); - m_preview->show(); - m_saver = new KClockSaver(m_preview->winId()); - hbox->addWidget(m_preview); - - label = new TQLabel( i18n( "Si&ze:" ), main ); - top->addWidget( label ); - TQSlider *qs = new TQSlider(0, MAX_CLOCK_SIZE, 1, m_size,Qt::Horizontal, main); - label->setBuddy( qs ); - qs->setTickInterval(1); - qs->setTickmarks(TQSlider::Below); - connect(qs, TQT_SIGNAL(valueChanged(int)), this, TQT_SLOT(slotSliderMoved(int))); - top->addWidget( qs ); - - bool rtl = kapp->reverseLayout(); - TQHBox *qsscale = new TQHBox(main); - label = new TQLabel(i18n("Small"), qsscale); - label->setAlignment(rtl ? AlignRight : AlignLeft); - label = new TQLabel(i18n("Medium"), qsscale); - label->setAlignment(AlignHCenter); - label = new TQLabel(i18n("Big"), qsscale); - label->setAlignment(rtl ? AlignLeft : AlignRight); - top->addWidget(qsscale); - - TQCheckBox *keepCentered = new TQCheckBox(i18n("&Keep clock centered"), main); - keepCentered->setChecked(m_keepCentered); - connect(keepCentered, TQT_SIGNAL(stateChanged(int)), TQT_SLOT(slotKeepCenteredChanged(int))); - top->addWidget(keepCentered); - top->addStretch(); -} - -KClockSetup::~KClockSetup() -{ - delete m_saver; -} - -void KClockSetup::readSettings() -{ - TDEConfig *config = TDEGlobal::config(); - - config->setGroup("Settings"); - m_keepCentered = config->readBoolEntry("KeepCentered", DEFAULT_KEEP_CENTERED); - m_size = config->readUnsignedNumEntry("Size", DEFAULT_CLOCK_SIZE); - if (m_size > MAX_CLOCK_SIZE) - m_size = MAX_CLOCK_SIZE; - - config->setGroup("Colors"); - TQColor c = TQt::black; - m_bgndColor = config->readColorEntry("Background", &c); - - c = TQt::white; - m_scaleColor = config->readColorEntry("Scale", &c); - m_hourColor = config->readColorEntry("HourHand", &c); - m_minColor = config->readColorEntry("MinuteHand", &c); - - c = TQt::red; - m_secColor = config->readColorEntry("SecondHand", &c); - - if (m_saver) { - m_saver->setBgndColor(m_bgndColor); - m_saver->setScaleColor(m_scaleColor); - m_saver->setHourColor(m_hourColor); - m_saver->setMinColor(m_minColor); - m_saver->setSecColor(m_secColor); - } -} - - -void KClockSetup::slotOk() -{ - TDEConfig *config = TDEGlobal::config(); - config->setGroup("Settings"); - config->writeEntry("Size", m_size); - config->writeEntry("KeepCentered", m_keepCentered); - - config->setGroup("Colors"); - config->writeEntry("Background", m_bgndColor); - config->writeEntry("Scale", m_scaleColor); - config->writeEntry("HourHand", m_hourColor); - config->writeEntry("MinuteHand", m_minColor); - config->writeEntry("SecondHand", m_secColor); - config->sync(); - accept(); -} - - -void KClockSetup::slotHelp() -{ - KMessageBox::about(this, "<qt>" + i18n( - "Clock Screen Saver<br>" - "Version 1.0<br>" - "<nobr>Melchior FRANZ (c) 2003</nobr>") + - "<br><a href=\"mailto:[email protected]\">[email protected]</a>" - "</qt>", TQString(), KMessageBox::AllowLink); -} - - -void KClockSetup::slotBgndColor(const TQColor &color) -{ - m_bgndColor = color; - if (m_saver) - m_saver->setBgndColor(m_bgndColor); -} - - -void KClockSetup::slotScaleColor(const TQColor &color) -{ - m_scaleColor = color; - if (m_saver) - m_saver->setScaleColor(m_scaleColor); -} - - -void KClockSetup::slotHourColor(const TQColor &color) -{ - m_hourColor = color; - if (m_saver) - m_saver->setHourColor(m_hourColor); -} - - -void KClockSetup::slotMinColor(const TQColor &color) -{ - m_minColor = color; - if (m_saver) - m_saver->setMinColor(m_minColor); -} - - -void KClockSetup::slotSecColor(const TQColor &color) -{ - m_secColor = color; - if (m_saver) - m_saver->setSecColor(m_secColor); -} - - -void KClockSetup::slotSliderMoved(int v) -{ - if (m_saver) - m_saver->restart(m_size = v); -} - - -void KClockSetup::slotKeepCenteredChanged(int c) -{ - if (m_saver) - m_saver->setKeepCentered(m_keepCentered = c); -} - - - - - -//----------------------------------------------------------------------------- - -KClockPainter::KClockPainter(int width, int height) - : m_width(width), - m_height(height) -{ - m_buf = new TQ_UINT8[m_width * m_height * 3]; - // build Cartesian coordinate system ranging from -1000 to +1000; - // points with positive x and y are in the top right quarter - m_matrix[0] = m_width / 2000.0; - m_matrix[1] = 0; - m_matrix[2] = 0; - m_matrix[3] = m_height / -2000.0; - m_matrix[4] = m_width / 2.0; - m_matrix[5] = m_height / 2.0; -} - - -KClockPainter::~KClockPainter() -{ - delete[] m_buf; -} - - -void KClockPainter::copy(KClockPainter *p) -{ - memcpy(m_buf, p->image(), m_width * m_height * 3); -} - - -void KClockPainter::drawToImage(TQImage *q, int xoffs = 0, int yoffs = 0) -{ - unsigned char *src = (unsigned char *)image(); - for (int y = 0; y < m_height; y++) { - TQRgb *dest = reinterpret_cast<TQRgb *>(q->scanLine(y + yoffs)) + xoffs; - for (int x = 0; x < m_width; x++, src += 3) - *dest++ = tqRgba(src[0], src[1], src[2], 255); - } -} - - -void KClockPainter::setColor(const TQColor &c) -{ - m_color = (c.red() << 24) | (c.green() << 16) | (c.blue() << 8) | 255; -} - - -void KClockPainter::setShadowColor(const TQColor &c) -{ - m_shadow = (c.red() << 24) | (c.green() << 16) | (c.blue() << 8) | 255; -} - - -void KClockPainter::fill(const TQColor &c) -{ - art_rgb_fill_run(m_buf, c.red(), c.green(), c.blue(), m_width * m_height); -} - - -void KClockPainter::drawRadial(double alpha, double r0, double r1, double width) -{ - ArtVpath *vx, *v = art_new(ArtVpath, 3); - v[0].code = ART_MOVETO_OPEN; - v[0].x = r0; - v[0].y = 0; - v[1].code = ART_LINETO; - v[1].x = r1; - v[1].y = 0; - v[2].code = ART_END; - - double m[6] = {0, 0, 0, 0, 0, 0}; - art_affine_rotate(m, 90 - alpha); - vx = art_vpath_affine_transform(v, m); - art_free(v); - v = art_vpath_affine_transform(vx, m_matrix); - art_free(vx); - - double w = width * m_matrix[0]; - if (w < 1.0) - w = 1.0; - - ArtSVP *path = art_svp_vpath_stroke(v, ART_PATH_STROKE_JOIN_MITER, - ART_PATH_STROKE_CAP_BUTT, w, 4, .5); - art_rgb_svp_alpha(path, 0, 0, m_width, m_height, m_color, m_buf, 3 * m_width, 0); - art_svp_free(path); - art_free(v); -} - - -void KClockPainter::drawDisc(double r) -{ - ArtVpath *v, *vx = art_vpath_new_circle(0, 0, r); - v = art_vpath_affine_transform(vx, m_matrix); - art_free(vx); - - ArtSVP *path = art_svp_from_vpath(v); - art_rgb_svp_alpha(path, 0, 0, m_width, m_height, m_color, m_buf, 3 * m_width, 0); - art_svp_free(path); - - path = art_svp_vpath_stroke(v, ART_PATH_STROKE_JOIN_MITER, - ART_PATH_STROKE_CAP_BUTT, 2, 4, .5); - art_free(v); - - art_rgb_svp_alpha(path, 0, 0, m_width, m_height, m_color, m_buf, 3 * m_width, 0); - art_svp_free(path); -} - - -void KClockPainter::drawHand(const TQColor &c, double angle, double length, - double width, bool disc = true) -{ - const double shadow_width = 1.0; - setColor(m_shadow); - if (disc) - drawDisc(width * 1.3 + shadow_width); - drawRadial(angle, .75 * width, length + shadow_width, width + shadow_width); - - setColor(c); - if (disc) - drawDisc(width * 1.3); - drawRadial(angle, .75 * width, length, width); -} - - - - - - -//----------------------------------------------------------------------------- - -KClockSaver::KClockSaver(WId id) - : KScreenSaver(id), - m_showSecond(true) -{ - readSettings(); - setBackgroundColor(m_bgndColor); - connect(&m_timer, TQT_SIGNAL(timeout()), TQT_SLOT(slotTimeout())); - start(m_size); - m_timer.start(TIMER_INTERVALL); -} - - -KClockSaver::~KClockSaver() -{ - m_timer.stop(); - stop(); -} - - -void KClockSaver::start(int size) -{ - m_diameter = int(TQMIN(width(), height()) * (size + 4) / 14.0); - m_x = (width() - m_diameter) / 2; - m_y = (height() - m_diameter) / 2; - - m_image = new TQImage(m_diameter, m_diameter, 32); - m_scale = new KClockPainter(m_diameter, m_diameter); - m_clock = new KClockPainter(m_diameter, m_diameter); - - m_clock->setShadowColor(tqRgb((m_bgndColor.red() + m_scaleColor.red()) / 2, - (m_bgndColor.green() + m_scaleColor.green()) / 2, - (m_bgndColor.blue() + m_scaleColor.blue()) / 2)); - drawScale(); - forceRedraw(); -} - - -void KClockSaver::stop() -{ - delete m_clock; - delete m_scale; - delete m_image; -} - - -void KClockSaver::restart(int size) -{ - m_timer.stop(); - stop(); - start(size); - drawScale(); - m_timer.start(TIMER_INTERVALL); -} - - -void KClockSaver::setKeepCentered(bool b) -{ - m_keepCentered = b; - if (b) { - m_x = (width() - m_diameter) / 2; - m_y = (height() - m_diameter) / 2; - } - forceRedraw(); -} - - -void KClockSaver::readSettings() -{ - TDEConfig *config = TDEGlobal::config(); - - config->setGroup("Settings"); - m_keepCentered = config->readBoolEntry("KeepCentered", DEFAULT_KEEP_CENTERED); - m_size = config->readUnsignedNumEntry("Size", DEFAULT_CLOCK_SIZE); - if (m_size > MAX_CLOCK_SIZE) - m_size = MAX_CLOCK_SIZE; - - config->setGroup("Colors"); - TQColor c = TQt::black; - m_bgndColor = config->readColorEntry("Background", &c); - - c = TQt::white; - m_scaleColor = config->readColorEntry("Scale", &c); - m_hourColor = config->readColorEntry("HourHand", &c); - m_minColor = config->readColorEntry("MinuteHand", &c); - - c = TQt::red; - m_secColor = config->readColorEntry("SecondHand", &c); -} - - -void KClockSaver::drawScale() -{ - m_scale->fill(m_bgndColor); - m_scale->setColor(m_scaleColor); - - for (int i = 0; i < 360; i += 6) - if (i % 30) - m_scale->drawRadial(i, 920, 980, 15); - else - m_scale->drawRadial(i, 825, 980, 40); - - forceRedraw(); -} - - -void KClockSaver::drawClock() -{ - double hour_angle = m_hour * 30.0 + m_minute * .5; - double minute_angle = m_minute * 6.0 + m_second * .1; - double second_angle = m_second * 6.0; - - m_clock->copy(m_scale); - m_clock->drawHand(m_hourColor, hour_angle, 600, 55, false); - m_clock->drawHand(m_minColor, minute_angle, 900, 40); - - if (m_showSecond) - m_clock->drawHand(m_secColor, second_angle, 900, 30); -} - - -void KClockSaver::slotTimeout() -{ - TQTime t = TQTime::currentTime(); - int s = t.second(); - if (s == m_second) - return; - - m_second = m_showSecond ? s : 0; - m_hour = t.hour(); - m_minute = t.minute(); - - drawClock(); - TQPainter p(this); - - if (width() < 256) { - // intended for the control module preview: always fill the whole area - TQImage *img = new TQImage(width(), height(), 32); - img->fill(tqRgb(m_bgndColor.red(), m_bgndColor.green(), m_bgndColor.blue())); - m_clock->drawToImage(img, m_x, m_y); - p.drawImage(0, 0, *img); - delete img; - } else { - m_clock->drawToImage(m_image); - p.drawImage(m_x, m_y, *m_image); - } - - if (!m_keepCentered) { - static int xstep = 1; - static int ystep = -1; - int i; - - m_x += xstep; - if (m_x <= 0) - m_x = 0, xstep = 1; - else if (m_x >= (i = width() - m_diameter)) - m_x = i, xstep = -1; - - m_y += ystep; - if (m_y <= 0) - m_y = 0, ystep = 1; - else if (m_y >= (i = height() - m_diameter)) - m_y = i, ystep = -1; - } -} - - diff --git a/kscreensaver/kdesavers/kclock.h b/kscreensaver/kdesavers/kclock.h deleted file mode 100644 index 1ec0103d..00000000 --- a/kscreensaver/kdesavers/kclock.h +++ /dev/null @@ -1,132 +0,0 @@ -// $Id$ -// -// kclock - Clock screen saver for KDE -// Copyright (c) 2003 Melchior FRANZ -// -// License: GPL v2 -// Author: Melchior FRANZ <[email protected]> -// Dependencies: libart_lgpl_2 http://www.levien.com/libart/ -// -#ifndef __KCLOCK_H__ -#define __KCLOCK_H__ - -#include <tqtimer.h> -#include <kdialogbase.h> -#include <kscreensaver.h> - - -class KClockPainter -{ - int m_width; - int m_height; - TQ_UINT8 *m_buf; - double m_matrix[6]; - TQ_UINT32 m_color; - TQ_UINT32 m_shadow; - - public: - KClockPainter(int width, int height); - ~KClockPainter(); - void copy(KClockPainter *p); - void drawToImage(TQImage *q, int x, int y); - inline int width() { return m_width; } - inline int height() { return m_height; } - inline void *image() { return (void *)m_buf; } - void setColor(const TQColor &color); - void setShadowColor(const TQColor &color); - void fill(const TQColor &color); - void drawRadial(double alpha, double r0, double r1, double width); - void drawDisc(double radius); - void drawHand(const TQColor &color, double angle, double length, - double width, bool disc); -}; - - -class KClockSaver : public KScreenSaver -{ - Q_OBJECT - - public: - KClockSaver(WId id); - virtual ~KClockSaver(); - inline void setBgndColor(const TQColor &c) { m_bgndColor = c; drawScale(); setBackgroundColor(c); }; - inline void setScaleColor(const TQColor &c) { m_scaleColor = c; drawScale(); }; - inline void setHourColor(const TQColor &c) { m_hourColor = c; forceRedraw(); }; - inline void setMinColor(const TQColor &c) { m_minColor = c; forceRedraw(); }; - inline void setSecColor(const TQColor &c) { m_secColor = c; forceRedraw(); }; - void setKeepCentered(bool b); - void restart(int siz); - inline void forceRedraw() { m_second = -1; } - - private: - void readSettings(); - void drawScale(); - void drawClock(); - void start(int size); - void stop(); - - protected slots: - void slotTimeout(); - - protected: - TQTimer m_timer; - TQImage *m_image; - KClockPainter *m_scale; - KClockPainter *m_clock; - - int m_x; - int m_y; - int m_diameter; - int m_size; - bool m_showSecond; - bool m_keepCentered; - int m_hour; - int m_minute; - int m_second; - - TQColor m_bgndColor; - TQColor m_scaleColor; - TQColor m_hourColor; - TQColor m_minColor; - TQColor m_secColor; -}; - - -class KClockSetup : public KDialogBase -{ - Q_OBJECT - - public: - KClockSetup(TQWidget *parent = 0, const char *name = 0); - ~KClockSetup(); - protected: - void readSettings(); - - private slots: - void slotOk(); - void slotHelp(); - - void slotBgndColor(const TQColor &); - void slotScaleColor(const TQColor &); - void slotHourColor(const TQColor &); - void slotMinColor(const TQColor &); - void slotSecColor(const TQColor &); - void slotSliderMoved(int); - void slotKeepCenteredChanged(int); - - private: - KClockSaver *m_saver; - - TQColor m_bgndColor; - TQColor m_scaleColor; - TQColor m_hourColor; - TQColor m_minColor; - TQColor m_secColor; - - int m_size; - bool m_keepCentered; -}; - -#endif - - diff --git a/kscreensaver/kdesavers/kscience.png b/kscreensaver/kdesavers/kscience.png Binary files differdeleted file mode 100644 index 19de5909..00000000 --- a/kscreensaver/kdesavers/kscience.png +++ /dev/null diff --git a/kscreensaver/kdesavers/kvm.cpp b/kscreensaver/kdesavers/kvm.cpp deleted file mode 100644 index fbbfdd31..00000000 --- a/kscreensaver/kdesavers/kvm.cpp +++ /dev/null @@ -1,384 +0,0 @@ -/*- - * kvm.cpp - The Vm screensaver for KDE - * Copyright (c) 2000 by Artur Rataj - * This file is distributed under the terms of the GNU General Public License - * - * This file is partially based on kmatrix screen saver -- original copyright follows: - * kmatrix.c - The Matrix screensaver for KDE - * by Eric Plante Copyright (c) 1999 - * Distributed under the Gnu Public License - * - * Much of this code taken from xmatrix.c from xscreensaver; - * original copyright follows: - * xscreensaver, Copyright (c) 1999 Jamie Zawinski <[email protected]> - * - * 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. No representations are made about the suitability of this - * software for any purpose. It is provided "as is" without express or - * implied warranty. - * - */ -// layout management added 1998/04/19 by Mario Weilguni <[email protected]> - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <stdio.h> -#include <stdlib.h> - -/* for AIX at least */ -#include <time.h> - -#include <tqcolor.h> -#include <tqlabel.h> -#include <tqlayout.h> -#include <tqslider.h> -#include <tqpainter.h> -#include <tqbitmap.h> - -#include <kapplication.h> -#include <kconfig.h> -#include <klocale.h> -#include <kglobal.h> -#include <kmessagebox.h> - -#ifdef DEBUG_MEM -#include <mcheck.h> -#endif - -#include "kvm.h" - -#include "vm.xpm" -#include "vm.xbm" - -#define CHAR_HEIGHT 22 - - -// libkscreensaver interface -extern "C" -{ - KDE_EXPORT const char *kss_applicationName = "kvm.kss"; - KDE_EXPORT const char *kss_description = I18N_NOOP( "Virtual Machine" ); - KDE_EXPORT const char *kss_version = "2.2.0"; - - KDE_EXPORT KScreenSaver *kss_create( WId id ) - { - return new kVmSaver( id ); - } - - KDE_EXPORT TQDialog *kss_setup() - { - return new kVmSetup(); - } -} - - - -static void -load_images (m_state *state) -{ - if ( TQPixmap::defaultDepth() > 1 ) - { - state->images = TQPixmap( vm ); - } - else - { - state->images = TQBitmap( vm_width, vm_height, vm_bits ); - } - state->image_width = state->images.width(); - state->image_height = state->images.height(); - state->nglyphs = state->image_height / CHAR_HEIGHT; -} - - -static m_state * -init_pool ( TQWidget *w ) -{ - m_state *state = new m_state; - state->w = w; - - load_images (state); - - state->char_width = state->image_width / 4; - state->char_height = CHAR_HEIGHT; - - state->grid_width = w->width() / state->char_width; - state->grid_height = w->height() / state->char_height; - state->grid_margin_x = w->width()%state->char_width/2; - state->grid_margin_y = w->height()%state->char_height/2; - state->show_threads = 1; - vm_init_pool( &(state->pool), state->grid_width*state->grid_height, - THREAD_MAX_STACK_SIZE, MAX_THREADS_NUM ); - //vm_enable_reverse( state->pool, 1 ); - state->modified = new char[state->grid_height*state->grid_width]; - for( int x = 0; x < state->grid_width*state->grid_height; ++x ) - state->modified[x] = 1; - return state; -} - -static void -draw_pool (m_state *state) -{ - int x, y; - struct tvm_process* curr_thread; - - if( state->show_threads ) { - curr_thread = state->pool->processes; - while( curr_thread ) { - state->modified[curr_thread->position] = 2; - curr_thread = curr_thread->next; - } - } - for (y = 0; y < state->grid_height; y++) - for (x = 0; x < state->grid_width; x++) { - int index = state->grid_width * y + x; - if( state->modified[index] ) - { - int op = state->pool->area[index]; - int pos_y; - int pos_x = 0; - switch( op ) { - case VM_OP_STOP: - pos_y = 14; - break; - - case VM_OP_EXEC: - pos_y = 15; - break; - - case VM_OP_COPY: - pos_y = 12; - break; - - default: - pos_y = op - VM_OP_PUSH; - if( pos_y < 0 ) { - pos_y = -pos_y; - pos_x = 1; - } - break; - } - if( state->show_threads ) - if( state->modified[index] == 1 ) - pos_x += 2; - TQPainter p(state->w); - p.setPen( TQt::green ); - p.setBrush( TQt::black ); - p.drawPixmap( state->grid_margin_x + x*state->char_width, - state->grid_margin_y + y*state->char_height, - state->images, pos_x*state->char_width, - pos_y*state->char_height, - state->char_width, state->char_height ); - --state->modified[index]; - } - } -} - -//----------------------------------------------------------------------------- - -kVmSaver::kVmSaver( WId id ) : KScreenSaver( id ) -{ - readSettings(); - - colorContext = TQColor::enterAllocContext(); - - blank(); - setSpeed( speed ); - setRefreshTimeout( refreshTimeout ); - - refreshStep = 0; - - pool_state = init_pool( this ); - vm_default_initstate( time(0), &(pool_state->pool->vm_random_data) ); - connect( &timer, TQT_SIGNAL( timeout() ), TQT_SLOT( slotTimeout() ) ); - timer.start( 100 - speed ); -} - -kVmSaver::~kVmSaver() -{ - timer.stop(); - vm_done_pool( pool_state->pool ); - delete[] pool_state->modified; - TQColor::leaveAllocContext(); - TQColor::destroyAllocContext( colorContext ); -} - -void kVmSaver::blank() -{ - setBackgroundColor( black ); - erase(); -} - -void kVmSaver::setSpeed( int spd ) -{ - speed = spd; -// timer.changeInterval( (100 - speed)*(100 - speed)*(100 - speed)/10000 ); - timer.changeInterval( (100 - speed) ); -} -void kVmSaver::setRefreshTimeout( const int refreshTimeout ) -{ - this->refreshTimeout = refreshTimeout; -} - -void kVmSaver::readSettings() -{ - TDEConfig *config = TDEGlobal::config(); - config->setGroup( "Settings" ); - - speed = config->readNumEntry( "Speed", 50 ); - refreshTimeout = config->readNumEntry( "DisplayRefreshTimeout", 0 ); -} -int kVmSaver::getRandom( const int max_value ) { - return (int)( vm_random(&(pool_state->pool->vm_random_data))*1.0*(max_value + 1.0)/ - (VM_RAND_MAX + 1.0) ); -// return (int)( rand()*1.0*(max_value + 1.0)/ -// (RAND_MAX + 1.0) ); -} -void kVmSaver::modifyArea( const int op ) { - int position; - - vm_modify( pool_state->pool, position = - getRandom(pool_state->pool->area_size - 1), op ); - pool_state->modified[position] = 1; -} - -void kVmSaver::slotTimeout() -{ - for( int i = 0; i < 1; ++i ) { - if( getRandom(2) == 0 ) - modifyArea( VM_OP_PUSH + getRandom(11) - getRandom(11) ); - if( getRandom(8) == 0 ) - modifyArea( VM_OP_STOP ); - if( getRandom(8) == 0 ) - modifyArea( VM_OP_COPY ); - if( getRandom(8) == 0 ) - modifyArea( VM_OP_EXEC ); -// if( getRandom(5) == 0 ) -// modifyArea( VM_OP_WAIT ); - } - if( getRandom(0) == 0 ) - vm_exec( pool_state->pool, getRandom(pool_state->pool->area_size - 1), 0, - vm_get_reverse( pool_state->pool ) ); - vm_iterate( pool_state->pool, pool_state->modified ); -// if( refreshStep++ >= refreshTimeout*refreshTimeout*refreshTimeout ) { - if( refreshStep++ >= refreshTimeout ) { - draw_pool( pool_state ); - refreshStep = 0; - } -} - -//----------------------------------------------------------------------------- - -kVmSetup::kVmSetup( TQWidget *parent, const char *name ) - : KDialogBase( parent, name, true, i18n( "Setup Virtual Machine" ), - Ok|Cancel|Help, Ok, true ) -{ - readSettings(); - - setButtonText( Help, i18n( "A&bout" ) ); - TQWidget *main = makeMainWidget(); - - TQHBoxLayout *tl = new TQHBoxLayout( main, 0, spacingHint() ); - TQVBoxLayout *tl1 = new TQVBoxLayout(); - tl->addLayout(tl1); - - TQLabel *label = new TQLabel( i18n("Virtual machine speed:"), main ); - tl1->addWidget(label); - - TQSlider *slider = new TQSlider( Qt::Horizontal, main ); - slider->setMinimumSize( 120, 20 ); - slider->setRange( 0, 100 ); - slider->setSteps( 10, 20 ); - slider->setTickmarks( TQSlider::Below ); - slider->setTickInterval( 10 ); - slider->setValue( speed ); - connect( slider, TQT_SIGNAL( valueChanged( int ) ), - TQT_SLOT( slotSpeed( int ) ) ); - tl1->addWidget(slider); - - label = new TQLabel( i18n("Display update speed:"), main ); - tl1->addWidget(label); - - slider = new TQSlider( Qt::Horizontal, main ); - slider->setMinimumSize( 120, 20 ); - slider->setRange( 0, MAX_REFRESH_TIMEOUT ); - slider->setSteps( MAX_REFRESH_TIMEOUT/10, MAX_REFRESH_TIMEOUT/5 ); - slider->setTickmarks( TQSlider::Below ); - slider->setTickInterval( MAX_REFRESH_TIMEOUT/10 ); - slider->setValue( MAX_REFRESH_TIMEOUT - refreshTimeout ); - connect( slider, TQT_SIGNAL( valueChanged( int ) ), - TQT_SLOT( slotRefreshTimeout( int ) ) ); - tl1->addWidget(slider); - tl1->addStretch(); - - preview = new TQWidget( main ); - preview->setFixedSize( 220, 165 ); - preview->show(); // otherwise saver does not get correct size - saver = new kVmSaver( preview->winId() ); - tl->addWidget(preview); -} - -kVmSetup::~kVmSetup() -{ - delete saver; -} - -void kVmSetup::readSettings() -{ - TDEConfig *config = TDEGlobal::config(); - config->setGroup( "Settings" ); - - speed = config->readNumEntry( "Speed", 50 ); - if ( speed > 100 ) - speed = 100; - else if ( speed < 0 ) - speed = 0; - refreshTimeout = config->readNumEntry( "DisplayRefreshTimeout", 0 ); - if ( refreshTimeout > MAX_REFRESH_TIMEOUT ) - refreshTimeout = MAX_REFRESH_TIMEOUT; - else if ( refreshTimeout < 0 ) - refreshTimeout = 0; -} - -void kVmSetup::slotSpeed( int num ) -{ - speed = num; - if ( saver ) - saver->setSpeed( num ); -} -void kVmSetup::slotRefreshTimeout( int num ) -{ - refreshTimeout = MAX_REFRESH_TIMEOUT - num; - if ( saver ) - saver->setRefreshTimeout( refreshTimeout ); -} - -void kVmSetup::slotOk() -{ - TDEConfig *config = TDEGlobal::config(); - config->setGroup( "Settings" ); - - TQString sspeed; - sspeed.setNum( speed ); - config->writeEntry( "Speed", sspeed ); - sspeed.setNum( refreshTimeout ); - config->writeEntry( "DisplayRefreshTimeout", sspeed ); - - config->sync(); - accept(); -} - -void kVmSetup::slotHelp() -{ - KMessageBox::about(this, - i18n("Virtual Machine Version 0.1\n\nCopyright (c) 2000 Artur Rataj <[email protected]>\n"), - i18n("About Virtual Machine") - ); -} - -#include "kvm.moc" - diff --git a/kscreensaver/kdesavers/kvm.h b/kscreensaver/kdesavers/kvm.h deleted file mode 100644 index 7ab58577..00000000 --- a/kscreensaver/kdesavers/kvm.h +++ /dev/null @@ -1,101 +0,0 @@ -//----------------------------------------------------------------------------- -// -// kvm screensaver -// - -#ifndef __KVM_H__ -#define __KVM_H__ - -#include <tqtimer.h> -#include <tqptrlist.h> - -#include <kdialogbase.h> -#include <kscreensaver.h> - -extern "C" { -#include "vm.h" -#include "vm_random.h" -} - -#define THREAD_MAX_STACK_SIZE 10 -#define MAX_THREADS_NUM 20 - -#define MAX_REFRESH_TIMEOUT 40 - -typedef struct { - TQWidget *w; - int grid_width, grid_height; - int grid_margin_x; - int grid_margin_y; - int char_width, char_height; - bool insert_top_p, insert_bottom_p; - int density; - struct tvm_pool* pool; - char* modified; - int show_threads; - - TQPixmap images; - int image_width, image_height; - int nglyphs; - -} m_state; - - -class kVmSaver : public KScreenSaver -{ - Q_OBJECT - -public: - kVmSaver( WId id ); - virtual ~kVmSaver(); - - void setSpeed( int spd ); - void setRefreshTimeout( const int refreshTimeout ); - -protected: - void blank(); - void readSettings(); - int getRandom( const int max_value ); - void modifyArea( const int op ); - -protected slots: - void slotTimeout(); - -protected: - TQTimer timer; - int colorContext; - - int speed; - m_state* pool_state; - int refreshStep; - int refreshTimeout; -}; - - -class kVmSetup : public KDialogBase -{ - Q_OBJECT - -public: - kVmSetup( TQWidget *parent = NULL, const char *name = NULL ); - ~kVmSetup(); -protected: - void readSettings(); - -private slots: - void slotSpeed( int ); - void slotRefreshTimeout( int num ); - void slotOk(); - void slotHelp(); - -private: - TQWidget *preview; - kVmSaver *saver; - - int speed; - int refreshTimeout; -}; - - -#endif - diff --git a/kscreensaver/kdesavers/lines.cpp b/kscreensaver/kdesavers/lines.cpp deleted file mode 100644 index d66f5a43..00000000 --- a/kscreensaver/kdesavers/lines.cpp +++ /dev/null @@ -1,401 +0,0 @@ -//----------------------------------------------------------------------------- -// -// klines 0.1.1 - Basic screen saver for KDE -// by Dirk Staneker 1997 -// based on kpolygon from Martin R. Jones 1996 -// mailto:[email protected] -// -// layout management added 1998/04/19 by Mario Weilguni <[email protected]> -// 2001/03/04 Converted to libkscreensaver by Martin R. Jones - -#include <config.h> -#include <stdlib.h> -#include <time.h> -#include <tqcolor.h> -#include <tqlabel.h> -#include <tqslider.h> -#include <kconfig.h> -#include <kapplication.h> -#include <kmessagebox.h> -#include <kcolorbutton.h> - -#include "kcolordialog.h" -#include "lines.h" -#include "lines.moc" - -#include <tqlayout.h> -#include <klocale.h> -#include <kglobal.h> -#include <tqpainter.h> - -#define MAXLENGTH 256 - -// libkscreensaver interface -extern "C" -{ - KDE_EXPORT const char *kss_applicationName = "klines.kss"; - KDE_EXPORT const char *kss_description = I18N_NOOP( "KLines" ); - KDE_EXPORT const char *kss_version = "2.2.0"; - - KDE_EXPORT KScreenSaver *kss_create( WId id ) - { - return new kLinesSaver( id ); - } - - KDE_EXPORT TQDialog *kss_setup() - { - return new kLinesSetup(); - } -} - -// Methods of the Lines-class -Lines::Lines(int x){ - uint i; - numLn=x; - offx1=12; - offy1=16; - offx2=9; - offy2=10; - start=new Ln; - end=start; - for(i=1; i<numLn; i++){ - end->next=new Ln; - end=end->next; - } - end->next=start; - akt=start; -} - -Lines::~Lines(){ - uint i; - for(i=0; i<numLn; i++){ - end=start->next; - delete start; - start=end; - } -} - -inline void Lines::reset(){ akt=start; } - -inline void Lines::getKoord(int& a, int& b, int& c, int& d){ - a=akt->x1; b=akt->y1; - c=akt->x2; d=akt->y2; - akt=akt->next; -} - -inline void Lines::setKoord(const int& a, const int& b, const int& c, const int& d){ - akt->x1=a; akt->y1=b; - akt->x2=c; akt->y2=d; -} - -inline void Lines::next(void){ akt=akt->next; } - -void Lines::turn(const int& w, const int& h){ - start->x1=end->x1+offx1; - start->y1=end->y1+offy1; - start->x2=end->x2+offx2; - start->y2=end->y2+offy2; - if(start->x1>=w) offx1=-8; - if(start->x1<=0) offx1=7; - if(start->y1>=h) offy1=-11; - if(start->y1<=0) offy1=13; - if(start->x2>=w) offx2=-17; - if(start->x2<=0) offx2=15; - if(start->y2>=h) offy2=-10; - if(start->y2<=0) offy2=13; - end->next=start; - start=start->next; - end=end->next; -} - - -//----------------------------------------------------------------------------- -// dialog to setup screen saver parameters -// -kLinesSetup::kLinesSetup(TQWidget *parent, const char *name) - : KDialogBase(parent, name, true, i18n( "Setup Lines Screen Saver" ), - Ok|Cancel|Help, Ok, true ), saver( 0 ), length( 10 ), speed( 50 ) -{ - readSettings(); - - setButtonText( Help, i18n( "A&bout" ) ); - TQWidget *main = makeMainWidget(); - - TQHBoxLayout *tl = new TQHBoxLayout(main, 0, spacingHint()); - TQVBoxLayout *tl1 = new TQVBoxLayout; - tl->addLayout(tl1); - - TQLabel *label=new TQLabel(i18n("Length:"), main); - tl1->addWidget(label); - - TQSlider *sb= new TQSlider(1, MAXLENGTH+1, 16, length, Qt::Horizontal, - main); - sb->setMinimumSize(120, 20); - sb->setTickmarks(TQSlider::Below); - sb->setTickInterval(32); - connect(sb, TQT_SIGNAL(valueChanged(int)), TQT_SLOT(slotLength(int))); - tl1->addWidget(sb); - - label=new TQLabel(i18n("Speed:"), main); - tl1->addWidget(label); - - sb = new TQSlider(0, 100, 10, speed, Qt::Horizontal, main); - sb->setMinimumSize(120, 20); - sb->setTickmarks(TQSlider::Below); - sb->setTickInterval(10); - connect( sb, TQT_SIGNAL( valueChanged( int ) ), TQT_SLOT( slotSpeed( int ) ) ); - tl1->addWidget(sb); - - label=new TQLabel(i18n("Beginning:"), main); - tl1->addWidget(label); - - colorPush0=new KColorButton(colstart, main); - connect(colorPush0, TQT_SIGNAL(changed(const TQColor &)), - TQT_SLOT(slotColstart(const TQColor &))); - tl1->addWidget(colorPush0); - - label=new TQLabel(i18n("Middle:"), main); - tl1->addWidget(label); - - colorPush1=new KColorButton(colmid, main); - connect(colorPush1, TQT_SIGNAL(changed(const TQColor &)), - TQT_SLOT(slotColmid(const TQColor &))); - tl1->addWidget(colorPush1); - - label=new TQLabel(i18n("End:"), main); - tl1->addWidget(label); - - colorPush2=new KColorButton(colend, main); - connect(colorPush2, TQT_SIGNAL(changed(const TQColor &)), - TQT_SLOT(slotColend(const TQColor &))); - tl1->addWidget(colorPush2); - tl1->addStretch(); - - preview = new TQWidget( main ); - preview->setFixedSize( 220, 170 ); - preview->setBackgroundColor( black ); - preview->show(); // otherwise saver does not get correct size - saver=new kLinesSaver(preview->winId()); - tl->addWidget(preview); -} - -kLinesSetup::~kLinesSetup() -{ - delete saver; -} - -// read settings from config file -void kLinesSetup::readSettings(){ - TDEConfig *config = TDEGlobal::config(); - config->setGroup( "Settings" ); - - TQString str; - - length = config->readNumEntry("Length", length); - if(length>MAXLENGTH) length=MAXLENGTH; - else if(length<1) length=1; - - speed = config->readNumEntry("Speed", speed); - if(speed>100) speed=100; - else if(speed<50) speed=50; - - str=config->readEntry("StartColor"); - if(!str.isNull()) colstart.setNamedColor(str); - else colstart=white; - str=config->readEntry("MidColor"); - if(!str.isNull()) colmid.setNamedColor(str); - else colmid=blue; - str=config->readEntry("EndColor"); - if(!str.isNull()) colend.setNamedColor(str); - else colend=black; -} - -void kLinesSetup::slotLength(int len){ - length=len; - if(saver) saver->setLines(length); -} - -void kLinesSetup::slotSpeed(int num){ - speed=num; - if(saver) saver->setSpeed(speed); -} - -void kLinesSetup::slotColstart(const TQColor &col){ - colstart = col; - if(saver) saver->setColor(colstart, colmid, colend); -} - -void kLinesSetup::slotColmid(const TQColor &col){ - colmid = col; - if(saver) saver->setColor(colstart, colmid, colend); -} - -void kLinesSetup::slotColend(const TQColor &col){ - colend = col; - if(saver) saver->setColor(colstart, colmid, colend); -} - -void kLinesSetup::slotHelp(){ - KMessageBox::about(this, - i18n("Lines Version 2.2.0\n\n" - "Written by Dirk Staneker 1997\n" - "[email protected]")); -} - -// Ok pressed - save settings and exit -void kLinesSetup::slotOk(){ - TDEConfig *config = TDEGlobal::config(); - config->setGroup("Settings"); - - TQString slength; - slength.setNum(length); - config->writeEntry("Length", slength); - - TQString sspeed; - sspeed.setNum( speed ); - config->writeEntry( "Speed", sspeed ); - - TQString colName0, colName1, colName2; - colName0.sprintf("#%02x%02x%02x", colstart.red(), - colstart.green(), colstart.blue() ); - config->writeEntry( "StartColor", colName0 ); - - colName1.sprintf("#%02x%02x%02x", colmid.red(), - colmid.green(), colmid.blue() ); - config->writeEntry( "MidColor", colName1 ); - - colName2.sprintf("#%02x%02x%02x", colend.red(), - colend.green(), colend.blue() ); - config->writeEntry( "EndColor", colName2 ); - - config->sync(); - accept(); -} - -//----------------------------------------------------------------------------- - - -kLinesSaver::kLinesSaver( WId id ) : KScreenSaver( id ){ - readSettings(); - lines=new Lines(numLines); - colorContext=TQColor::enterAllocContext(); - blank(); - initialiseColor(); - initialiseLines(); - timer.start(speed); - connect(&timer, TQT_SIGNAL(timeout()), TQT_SLOT(slotTimeout())); -} - -kLinesSaver::~kLinesSaver(){ - timer.stop(); - TQColor::leaveAllocContext(); - TQColor::destroyAllocContext(colorContext); - delete lines; -} - -// set lines properties -void kLinesSaver::setLines(int len){ - timer.stop(); - numLines=len; - initialiseLines(); - initialiseColor(); - blank(); - timer.start(speed); -} - -// set the speed -void kLinesSaver::setSpeed(int spd){ - timer.stop(); - speed=100-spd; - timer.start(speed); -} - -void kLinesSaver::setColor(const TQColor& cs, const TQColor& cm, const TQColor& ce){ - colstart=cs; - colmid=cm; - colend=ce; - initialiseColor(); -} - -// read configuration settings from config file -void kLinesSaver::readSettings(){ - TDEConfig *config=TDEGlobal::config(); - config->setGroup("Settings"); - - numLines=config->readNumEntry("Length", 10); - speed = 100- config->readNumEntry("Speed", 50); - if(numLines>MAXLENGTH) numLines=MAXLENGTH; - else if(numLines<1) numLines = 1; - - colstart=config->readColorEntry("StartColor", &white); - colmid=config->readColorEntry("MidColor", &blue); - colend=config->readColorEntry("EndColor", &black); -} - -// draw next lines and erase tail -void kLinesSaver::slotTimeout(){ - uint i; - int x1,y1,x2,y2; - int col=0; - - lines->reset(); - TQPainter p( this ); - p.setPen( black ); - - for(i=0; i<numLines; i++){ - lines->getKoord(x1,y1,x2,y2); - p.drawLine( x1, y1, x2, y2 ); - p.setPen( colors[col] ); - col=(int)(i*colscale); - if(col>63) col=0; - } - lines->turn(width(), height()); -} - -void kLinesSaver::blank(){ - setBackgroundColor( black ); - erase(); -} - -// initialise the lines -void kLinesSaver::initialiseLines(){ - uint i; - int x1,y1,x2,y2; - delete lines; - lines=new Lines(numLines); - lines->reset(); - x1=rnd.getLong(width()); - y1=rnd.getLong(height()); - x2=rnd.getLong(width()); - y2=rnd.getLong(height()); - for(i=0; i<numLines; i++){ - lines->setKoord(x1,y1,x2,y2); - lines->next(); - } -} - -// create a color table of 64 colors -void kLinesSaver::initialiseColor(){ - int i; - double mr, mg, mb; - double cr, cg, cb; - mr=(double)(colmid.red()-colstart.red())/32; - mg=(double)(colmid.green()-colstart.green())/32; - mb=(double)(colmid.blue()-colstart.blue())/32; - cr=colstart.red(); - cg=colstart.green(); - cb=colstart.blue(); - for(i=0; i<32; i++){ - colors[63-i].setRgb((int)(mr*i+cr), (int)(mg*i+cg), (int)(mb*i+cb)); - } - mr=(double)(colend.red()-colmid.red())/32; - mg=(double)(colend.green()-colmid.green())/32; - mb=(double)(colend.blue()-colmid.blue())/32; - cr=colmid.red(); - cg=colmid.green(); - cb=colmid.blue(); - for(i=0; i<32; i++){ - colors[31-1].setRgb((int)(mr*i+cr), (int)(mg*i+cg), (int)(mb*i+cb)); - } - colscale=64.0/(double)numLines; -} diff --git a/kscreensaver/kdesavers/lines.h b/kscreensaver/kdesavers/lines.h deleted file mode 100644 index 7dd11200..00000000 --- a/kscreensaver/kdesavers/lines.h +++ /dev/null @@ -1,98 +0,0 @@ -//----------------------------------------------------------------------------- -// -// klines 0.1.1 - Basic screen saver for KDE -// by Dirk Staneker 1997 -// based on kpolygon 0.3 by Martin R. Jones 1996 -// - -#ifndef __LINES_H__ -#define __LINES_H__ - -#include <tqtimer.h> -#include <tqptrlist.h> - -#include <kdialogbase.h> -#include <krandomsequence.h> -#include <kscreensaver.h> - -class KColorButton; - -class Lines{ - private: - struct Ln{ - Ln* next; - int x1, y1, x2, y2; - }; - Ln *start, *end, *akt; - int offx1, offy1, offx2, offy2; - uint numLn; - public: - Lines(int); - ~Lines(); - inline void reset(); - inline void getKoord(int&, int&, int&, int&); - inline void setKoord(const int&, const int&, const int&, const int&); - inline void next(void); - void turn(const int&, const int&); -}; - -class kLinesSaver:public KScreenSaver{ - Q_OBJECT - - public: - kLinesSaver( WId id ); - virtual ~kLinesSaver(); - - void setLines(int len); - void setSpeed(int spd); - void setColor(const TQColor&, const TQColor&, const TQColor&); - - private: - void readSettings(); - void blank(); - void initialiseLines(); - void initialiseColor(); - - protected slots: - void slotTimeout(); - - protected: - KRandomSequence rnd; - TQTimer timer; - unsigned numLines; - int colorContext, speed; - TQColor colors[64]; - TQColor colstart, colmid, colend; - double colscale; - Lines* lines; -}; - -class kLinesSetup : public KDialogBase{ - Q_OBJECT - - public: - kLinesSetup(TQWidget *parent=NULL, const char *name=NULL); - ~kLinesSetup(); - - protected: - void readSettings(); - - private slots: - void slotLength(int); - void slotSpeed(int); - void slotColstart(const TQColor &); - void slotColmid(const TQColor &); - void slotColend(const TQColor &); - void slotOk(); - void slotHelp(); - - private: - KColorButton *colorPush0, *colorPush1, *colorPush2; - TQWidget *preview; - kLinesSaver *saver; - int length, speed; - TQColor colstart, colmid, colend; -}; - -#endif - diff --git a/kscreensaver/kdesavers/lorenz.cpp b/kscreensaver/kdesavers/lorenz.cpp deleted file mode 100644 index e4e5f63c..00000000 --- a/kscreensaver/kdesavers/lorenz.cpp +++ /dev/null @@ -1,569 +0,0 @@ -//----------------------------------------------------------------------------- -// -// Lorenz - Lorenz Attractor screen saver -// Nicolas Brodu, [email protected], 2000 -// -// Portions of code from kblankscrn and khop. -// See authors there. -// -// I release my code as GPL, but see the other headers and the README - -#include <math.h> -#include <stdlib.h> - -#include <tqpainter.h> -#include <tqslider.h> -#include <tqlayout.h> -#include <tqcolor.h> -#include <tqlabel.h> - -#include <kapplication.h> -#include <klocale.h> -#include <kglobal.h> -#include <kconfig.h> -#include <kmessagebox.h> - -#include "lorenz.h" -#include "lorenz.moc" - -// libkscreensaver interface -extern "C" -{ - KDE_EXPORT const char *kss_applicationName = "klorenz.kss"; - KDE_EXPORT const char *kss_description = I18N_NOOP( "KLorenz" ); - KDE_EXPORT const char *kss_version = "2.2.0"; - - KDE_EXPORT KScreenSaver *kss_create( WId id ) - { - return new KLorenzSaver( id ); - } - - KDE_EXPORT TQDialog *kss_setup() - { - return new KLorenzSetup(); - } -} - -#define MINSPEED 1 -#define MAXSPEED 1500 -#define DEFSPEED 150 -#define MINZROT -180 -#define MAXZROT 180 -#define DEFZROT 104 //100 -#define MINYROT -180 -#define MAXYROT 180 -#define DEFYROT -19 //80 -#define MINXROT -180 -#define MAXXROT 180 -#define DEFXROT 25 //20 -#define MINEPOCH 1 -#define MAXEPOCH 30000 -#define DEFEPOCH 5800 -#define MINCOLOR 1 -#define MAXCOLOR 100 -#define DEFCOLOR 20 - -//----------------------------------------------------------------------------- -// dialog to setup screen saver parameters -// -KLorenzSetup::KLorenzSetup( TQWidget *parent, const char *name ) - : KDialogBase( parent, name, true, i18n( "Setup Lorenz Attractor" ), - Ok|Cancel|Default|Help, Ok, true ) -{ - readSettings(); - - setButtonText( Help, i18n( "A&bout" ) ); - TQWidget *main = makeMainWidget(); - - TQHBoxLayout *tl = new TQHBoxLayout( main, 0, spacingHint() ); - TQVBoxLayout *tl1 = new TQVBoxLayout; - tl->addLayout(tl1); - - TQLabel *label = new TQLabel( i18n("Speed:"), main ); - tl1->addWidget(label); - - sps = new TQSlider(MINSPEED, MAXSPEED, 10, speed, Qt::Horizontal, main); - sps->setMinimumSize( 120, 20 ); - sps->setTickmarks(TQSlider::Below); - sps->setTickInterval(150); - connect( sps, TQT_SIGNAL( valueChanged( int ) ), TQT_SLOT( slotSpeed( int ) ) ); - tl1->addWidget(sps); - - label = new TQLabel( i18n("Epoch:"), main ); - tl1->addWidget(label); - - eps = new TQSlider(MINEPOCH, MAXEPOCH, 100, epoch, Qt::Horizontal, main); - eps->setMinimumSize( 120, 20 ); - eps->setTickmarks(TQSlider::Below); - eps->setTickInterval(3000); - connect( eps, TQT_SIGNAL( valueChanged( int ) ), TQT_SLOT( slotEpoch( int ) ) ); - tl1->addWidget(eps); - - label = new TQLabel( i18n("Color rate:"), main ); - tl1->addWidget(label); - - crs = new TQSlider(MINCOLOR, MAXCOLOR, 5, crate, Qt::Horizontal, main); - crs->setMinimumSize( 120, 20 ); - crs->setTickmarks(TQSlider::Below); - crs->setTickInterval(10); - connect( crs, TQT_SIGNAL( valueChanged( int ) ), TQT_SLOT( slotCRate( int ) ) ); - tl1->addWidget(crs); - - label = new TQLabel( i18n("Rotation Z:"), main ); - tl1->addWidget(label); - - zrs = new TQSlider(MINZROT, MAXZROT, 18, zrot, Qt::Horizontal, main); - zrs->setMinimumSize( 120, 20 ); - zrs->setTickmarks(TQSlider::Below); - zrs->setTickInterval(36); - connect( zrs, TQT_SIGNAL( valueChanged( int ) ), TQT_SLOT( slotZRot( int ) ) ); - tl1->addWidget(zrs); - - label = new TQLabel( i18n("Rotation Y:"), main ); - tl1->addWidget(label); - - yrs = new TQSlider(MINYROT, MAXYROT, 18, yrot, Qt::Horizontal, main); - yrs->setMinimumSize( 120, 20 ); - yrs->setTickmarks(TQSlider::Below); - yrs->setTickInterval(36); - connect( yrs, TQT_SIGNAL( valueChanged( int ) ), TQT_SLOT( slotYRot( int ) ) ); - tl1->addWidget(yrs); - - label = new TQLabel( i18n("Rotation X:"), main ); - tl1->addWidget(label); - - xrs = new TQSlider(MINXROT, MAXXROT, 18, xrot, Qt::Horizontal, main); - xrs->setMinimumSize( 120, 20 ); - xrs->setTickmarks(TQSlider::Below); - xrs->setTickInterval(36); - connect( xrs, TQT_SIGNAL( valueChanged( int ) ), TQT_SLOT( slotXRot( int ) ) ); - tl1->addWidget(xrs); - - preview = new TQWidget( main ); - preview->setFixedSize( 220, 165 ); - preview->setBackgroundColor( black ); - preview->show(); // otherwise saver does not get correct size - saver = new KLorenzSaver( preview->winId() ); - tl->addWidget(preview); -} - -KLorenzSetup::~KLorenzSetup() -{ - delete saver; -} - -// read settings from config file -void KLorenzSetup::readSettings() -{ - TDEConfig *config = TDEGlobal::config(); - config->setGroup( "Settings" ); - - speed = config->readNumEntry( "Speed", DEFSPEED ); - epoch = config->readNumEntry( "Epoch", DEFEPOCH ); - crate = config->readNumEntry( "Color Rate", DEFCOLOR ); - zrot = config->readNumEntry( "ZRot", DEFZROT ); - yrot = config->readNumEntry( "YRot", DEFZROT ); - xrot = config->readNumEntry( "XRot", DEFZROT ); -} - - -void KLorenzSetup::slotSpeed(int num) -{ - speed = num; - if (saver) saver->setSpeed(speed); -} - -void KLorenzSetup::slotEpoch(int num) -{ - epoch = num; - if (saver) saver->setEpoch(epoch); -} - -void KLorenzSetup::slotCRate(int num) -{ - crate = num; - if (saver) saver->setCRate(crate); -} - -void KLorenzSetup::slotZRot(int num) -{ - zrot = num; - if (saver) { - saver->setZRot(zrot); - saver->updateMatrix(); - saver->newEpoch(); - } -} - -void KLorenzSetup::slotYRot(int num) -{ - yrot = num; - if (saver) { - saver->setYRot(yrot); - saver->updateMatrix(); - saver->newEpoch(); - } -} - -void KLorenzSetup::slotXRot(int num) -{ - xrot = num; - if (saver) { - saver->setXRot(xrot); - saver->updateMatrix(); - saver->newEpoch(); - } -} - -void KLorenzSetup::slotHelp() -{ - KMessageBox::about(this,i18n("Lorenz Attractor screen saver for TDE\n\nCopyright (c) 2000 Nicolas Brodu")); -} - -// Ok pressed - save settings and exit -void KLorenzSetup::slotOk() -{ - TDEConfig *config = TDEGlobal::config(); - config->setGroup( "Settings" ); - - config->writeEntry( "Speed", speed ); - config->writeEntry( "Epoch", epoch ); - config->writeEntry( "Color Rate", crate ); - config->writeEntry( "ZRot", zrot ); - config->writeEntry( "YRot", yrot ); - config->writeEntry( "XRot", xrot ); - - config->sync(); - - accept(); -} - -void KLorenzSetup::slotDefault() -{ - speed = DEFSPEED; - epoch = DEFEPOCH; - crate = DEFCOLOR; - zrot = DEFZROT; - yrot = DEFYROT; - xrot = DEFXROT; - if (saver) { - saver->setSpeed(speed); - saver->setEpoch(epoch); - saver->setCRate(crate); - saver->setZRot(zrot); - saver->setYRot(yrot); - saver->setXRot(xrot); - saver->updateMatrix(); - saver->newEpoch(); - } - sps->setValue(speed); - eps->setValue(epoch); - crs->setValue(crate); - zrs->setValue(zrot); - yrs->setValue(yrot); - xrs->setValue(xrot); - -/* // User can cancel, or save defaults? - - TDEConfig *config = TDEGlobal::config(); - config->setGroup( "Settings" ); - - config->writeEntry( "Speed", speed ); - config->writeEntry( "Epoch", epoch ); - config->writeEntry( "Color Rate", crate ); - config->writeEntry( "ZRot", zrot ); - config->writeEntry( "YRot", yrot ); - config->writeEntry( "XRot", xrot ); - - config->sync(); -*/ -} - -//----------------------------------------------------------------------------- - - -#ifndef M_PI -#define M_PI 3.14159265358979323846 -#endif -const double pi = M_PI; - -// Homogeneous coordinate transform matrix -// I initially wrote it for a Java applet, it is inspired from a -// Matrix class in the JDK. -// Nicolas Brodu, 1998-2000 -class Matrix3D -{ - // All coefficients - double xx, xy, xz, xo; - double yx, yy, yz, yo; - double zx, zy, zz, zo; - // 0, 0, 0, 1 are implicit -public: - - void unit() - { - xx=1.0; xy=0.0; xz=0.0; xo=0.0; - yx=0.0; yy=1.0; yz=0.0; yo=0.0; - zx=0.0; zy=0.0; zz=1.0; zo=0.0; - } - - Matrix3D () - { - unit(); - } - - // Translation - void translate(double x, double y, double z) - { - xo += x; - yo += y; - zo += z; - } - - // Rotation, in degrees, around the Y axis - void rotY(double theta) - { - theta *= pi / 180; - double ct = cos(theta); - double st = sin(theta); - - double Nxx = xx * ct + zx * st; - double Nxy = xy * ct + zy * st; - double Nxz = xz * ct + zz * st; - double Nxo = xo * ct + zo * st; - - double Nzx = zx * ct - xx * st; - double Nzy = zy * ct - xy * st; - double Nzz = zz * ct - xz * st; - double Nzo = zo * ct - xo * st; - - xo = Nxo; - xx = Nxx; - xy = Nxy; - xz = Nxz; - zo = Nzo; - zx = Nzx; - zy = Nzy; - zz = Nzz; - } - - - // Rotation, in degrees, around the X axis - void rotX(double theta) - { - theta *= pi / 180; - double ct = cos(theta); - double st = sin(theta); - - double Nyx = yx * ct + zx * st; - double Nyy = yy * ct + zy * st; - double Nyz = yz * ct + zz * st; - double Nyo = yo * ct + zo * st; - - double Nzx = zx * ct - yx * st; - double Nzy = zy * ct - yy * st; - double Nzz = zz * ct - yz * st; - double Nzo = zo * ct - yo * st; - - yo = Nyo; - yx = Nyx; - yy = Nyy; - yz = Nyz; - zo = Nzo; - zx = Nzx; - zy = Nzy; - zz = Nzz; - } - - - // Rotation, in degrees, around the Z axis - void rotZ(double theta) - { - theta *= pi / 180; - double ct = cos(theta); - double st = sin(theta); - - double Nyx = yx * ct + xx * st; - double Nyy = yy * ct + xy * st; - double Nyz = yz * ct + xz * st; - double Nyo = yo * ct + xo * st; - - double Nxx = xx * ct - yx * st; - double Nxy = xy * ct - yy * st; - double Nxz = xz * ct - yz * st; - double Nxo = xo * ct - yo * st; - - yo = Nyo; - yx = Nyx; - yy = Nyy; - yz = Nyz; - xo = Nxo; - xx = Nxx; - xy = Nxy; - xz = Nxz; - } - - // Multiply by a projection matrix, with camera f - // f 0 0 0 x f*x - // 0 f 0 0 * y = f*y - // 0 0 1 f z z+f - // 0 0 0 1 1 1 - // So, it it easy to find the 2D coordinates after the transform - // u = f*x / (z+f) - // v = f*y / (z+f) - void proj(double f) - { - xx*=f; - xy*=f; - xz*=f; - xo*=f; - yx*=f; - yy*=f; - yz*=f; - yo*=f; - zo+=f; - } - - // Apply the transformation 3D => 2D - void transform(double x, double y, double z, double &u, double& v, double& w) - { - u = x * xx + y * xy + z * xz + xo; - v = x * yx + y * yy + z * yz + yo; - w = x * zx + y * zy + z * zz + zo; - } -}; - -KLorenzSaver::KLorenzSaver( WId id ) : KScreenSaver( id ) -{ - readSettings(); - - // Create a transform matrix with the parameters - mat = new Matrix3D(); - updateMatrix(); - - colorContext = TQColor::enterAllocContext(); - setBackgroundColor( black ); - newEpoch(); - - timer.start( 10 ); - connect( &timer, TQT_SIGNAL( timeout() ), TQT_SLOT( drawOnce() ) ); -} - -KLorenzSaver::~KLorenzSaver() -{ - delete mat; - mat=0; - timer.stop(); - TQColor::leaveAllocContext(); - TQColor::destroyAllocContext( colorContext ); -} - -// read configuration settings from config file -void KLorenzSaver::readSettings() -{ - TDEConfig *config = TDEGlobal::config(); - config->setGroup( "Settings" ); - - speed = config->readNumEntry( "Speed", DEFSPEED ); - epoch = config->readNumEntry( "Epoch", DEFEPOCH ); - zrot = config->readNumEntry( "ZRot", DEFZROT ); - yrot = config->readNumEntry( "YRot", DEFZROT ); - xrot = config->readNumEntry( "XRot", DEFZROT ); - - int crate_num = config->readNumEntry( "Color Rate", DEFCOLOR ); - crate = (double)crate_num / (double)MAXCOLOR; -} - -void KLorenzSaver::setSpeed(int num) -{ - speed = num; -} - -void KLorenzSaver::setEpoch(int num) -{ - epoch = num; -} - -void KLorenzSaver::setZRot(int num) -{ - zrot = num; -} - -void KLorenzSaver::setYRot(int num) -{ - yrot = num; -} - -void KLorenzSaver::setXRot(int num) -{ - xrot = num; -} - -void KLorenzSaver::setCRate(int num) -{ - crate = (double)num / (double)MAXCOLOR; -} - -void KLorenzSaver::updateMatrix() -{ - // reset matrix - mat->unit(); - // Remove the mean before the rotations... - mat->translate(-0.95413, -0.96740, -23.60065); - mat->rotZ(zrot); - mat->rotY(yrot); - mat->rotX(xrot); - mat->translate(0, 0, 100); - mat->proj(1); -} - -void KLorenzSaver::newEpoch() -{ - // Start at a random position, somewhere around the mean - x = 0.95-25.0+50.0*kapp->random() / (RAND_MAX+1.0); - y = 0.97-25.0+50.0*kapp->random() / (RAND_MAX+1.0); - z = 23.6-25.0+50.0*kapp->random() / (RAND_MAX+1.0); - // start at some random 'time' as well to have different colors - t = 10000.0*kapp->random() / (RAND_MAX+1.0); - erase(); - e=0; // reset epoch counter -} - -// Computes the derivatives using Lorenz equations -static void lorenz(double x, double y, double z, double& dx, double& dy, double& dz) -{ - dx = 10*(y-x); - dy = 28*x - y - x*z; - dz = x*y - z*8.0/3.0; -} - -// Use a simple Runge-Kutta formula to draw a few points -// No need to go beyond 2nd order for a screensaver! -void KLorenzSaver::drawOnce() -{ - double kx, ky, kz, dx, dy, dz; - const double h = 0.0001; - const double tqh = h * 3.0 / 4.0; - TQPainter p(this); - - for (int i=0; i<speed; i++) { - // Runge-Kutta formula - lorenz(x,y,z,dx,dy,dz); - lorenz(x + tqh*dx, y + tqh*dy, z + tqh*dz, kx, ky, kz); - x += h*(dx/3.0+2*kx/3.0); - y += h*(dy/3.0+2*ky/3.0); - z += h*(dz/3.0+2*kz/3.0); - // Apply transform - mat->transform(x,y,z,kx,ky,kz); - // Choose a color - p.setPen( - TQColor((int)(sin(t*crate/pi)*127+128), - (int)(sin(t*crate/(pi-1))*127+128), - (int)(sin(t*crate/(pi-2))*127+128)).pixel() ); - // Draw a point - p.drawPoint( (int)(kx*width()*1.5/kz)+(int)(width()/2), - (int)(ky*height()*1.5/kz)+(int)(height()/2)); - t+=h; - } - if (++e>=epoch) newEpoch(); -} diff --git a/kscreensaver/kdesavers/lorenz.h b/kscreensaver/kdesavers/lorenz.h deleted file mode 100644 index 5dfa6388..00000000 --- a/kscreensaver/kdesavers/lorenz.h +++ /dev/null @@ -1,88 +0,0 @@ -//----------------------------------------------------------------------------- -// -// Lorenz - Lorenz Attractor screen saver -// Nicolas Brodu, [email protected], 2000 -// -// Portions of code from kblankscrn and khop. -// See authors there. -// -// I release my code as GPL, but see the other headers and the README - -#ifndef __LORENZKSCRN_H__ -#define __LORENZKSCRN_H__ - -#include <tqtimer.h> -#include <tqcolor.h> -#include <kscreensaver.h> -#include <kdialogbase.h> - -// See lorenz.cpp for this private class -class Matrix3D; - -class KLorenzSaver : public KScreenSaver -{ - Q_OBJECT - -public: - KLorenzSaver( WId id ); - virtual ~KLorenzSaver(); - void setSpeed(int num); - void setEpoch(int num); - void setCRate(int num); - void setZRot(int num); - void setYRot(int num); - void setXRot(int num); - void updateMatrix(); - void newEpoch(); - -protected slots: - void drawOnce(); - -protected: - TQTimer timer; - int colorContext; - -private: - void readSettings(); - -private: - double x, y, z, t; - double speed, epoch, zrot, yrot, xrot, crate; - int e; - Matrix3D *mat; -}; - -class TQSlider; - -class KLorenzSetup : public KDialogBase -{ - Q_OBJECT - -public: - KLorenzSetup(TQWidget *parent = 0, const char *name = 0 ); - ~KLorenzSetup(); - -protected: - void readSettings(); - -private slots: - void slotSpeed(int num); - void slotEpoch(int num); - void slotCRate(int num); - void slotZRot(int num); - void slotYRot(int num); - void slotXRot(int num); - - void slotOk(); - void slotHelp(); - void slotDefault(); - -private: - TQWidget *preview; - TQSlider *sps, *eps, *zrs, *yrs, *xrs, *crs; - KLorenzSaver *saver; - int speed, epoch, zrot, yrot, xrot, crate; -}; - -#endif - diff --git a/kscreensaver/kdesavers/particle.png b/kscreensaver/kdesavers/particle.png Binary files differdeleted file mode 100644 index a777c822..00000000 --- a/kscreensaver/kdesavers/particle.png +++ /dev/null diff --git a/kscreensaver/kdesavers/pendulum.cpp b/kscreensaver/kdesavers/pendulum.cpp deleted file mode 100644 index a355e029..00000000 --- a/kscreensaver/kdesavers/pendulum.cpp +++ /dev/null @@ -1,881 +0,0 @@ -//============================================================================ -// -// KPendulum screen saver for KDE -// -// The screen saver displays a physically realistic simulation of a two-part -// pendulum. -// -// Developed by Georg Drenkhahn, [email protected] -// -// $Id$ -// -/* - * Copyright (C) 2004 Georg Drenkhahn - * - * KRotation is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License version 2 as published by the - * Free Software Foundation. - * - * KRotation 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 02110-1301 USA - */ -//============================================================================ - -// std. C++ headers -#include <cstdlib> - -// TQt headers -#include <tqlineedit.h> -#include <tqspinbox.h> -#include <tqvalidator.h> -#include <tqcolordialog.h> -#include <tqpushbutton.h> -#include <tqtooltip.h> -// KDE headers -#include <klocale.h> -#include <kconfig.h> -#include <kdebug.h> -#include <kmessagebox.h> - -#include "sspreviewarea.h" - -// pendulum.moc includes pendulum.h -#include "pendulum.moc" - -#define KPENDULUM_VERSION "1.1" - -// libkscreensaver interface -extern "C" -{ - /// application name for libkscreensaver interface - KDE_EXPORT const char *kss_applicationName = "kpendulum.kss"; - /// application description for libkscreensaver interface - KDE_EXPORT const char *kss_description = I18N_NOOP("Simulation of\ - a two-part pendulum"); - /// application version for libkscreensaver interface - KDE_EXPORT const char *kss_version = KPENDULUM_VERSION; - - /// function to create screen saver object - KDE_EXPORT KScreenSaver* kss_create(WId id) - { - return new KPendulumSaver(id); - } - - /// function to create setup dialog for screen saver - KDE_EXPORT TQDialog* kss_setup() - { - return new KPendulumSetup(); - } -} - -//----------------------------------------------------------------------------- -// PendulumOdeSolver -//----------------------------------------------------------------------------- - -PendulumOdeSolver::PendulumOdeSolver( - const double &_t, - const double &_dt, - std::valarray<double> &_y, - const double &_eps, - const double &_m1, - const double &_m2, - const double &_l1, - const double &_l2, - const double &_g) - : RkOdeSolver<double>(_t,_y,_dt,_eps), - A(1.0/(_m2*_l1*_l1)), - B1(_m2*_l1*_l2), // constants for faster numeric calculation - B(1.0/B1), // derived from m1,m2,l1,l2,g - C((_m1+_m2)/(_m2*_m2*_l2*_l2)), - D(_g*(_m1+_m2)*_l1), - E(_g*_m2*_l2), - M((_m1+_m2)/_m2) -{ -} - -std::valarray<double> PendulumOdeSolver::f( - const double &x, - const std::valarray<double> &y) const -{ - (void)x; // unused - - const double& q1 = y[0]; - const double& q2 = y[1]; - const double& p1 = y[2]; - const double& p2 = y[3]; - - const double cosDq = std::cos(q1-q2); - const double iden = 1.0/(M - cosDq*cosDq); // invers denominator - const double dq1dt = (A*p1 - B*cosDq*p2)*iden; - const double dq2dt = (C*p2 - B*cosDq*p1)*iden; - - std::valarray<double> ypr(y.size()); - ypr[0] = dq1dt; - ypr[1] = dq2dt; - - const double K = B1 * dq1dt*dq2dt * std::sin(q1-q2); - ypr[2] = -K - D * std::sin(q1); - ypr[3] = K - E * std::sin(q2); - - return ypr; -} - -//----------------------------------------------------------------------------- -// Rotation: screen saver widget -//----------------------------------------------------------------------------- - -PendulumGLWidget::PendulumGLWidget(TQWidget* parent, const char* name) - : TQGLWidget(parent, name), - eyeR(30), // eye coordinates (polar) - eyeTheta(M_PI*0.45), - eyePhi(0), - lightR(eyeR), // light coordinates (polar) - lightTheta(M_PI*0.25), - lightPhi(M_PI*0.25), - quadM1(gluNewQuadric()), - m_barColor(KPendulumSaver::barColorDefault), - m_m1Color(KPendulumSaver::m1ColorDefault), - m_m2Color(KPendulumSaver::m2ColorDefault) -{ -} - -PendulumGLWidget::~PendulumGLWidget(void) -{ - gluDeleteQuadric(quadM1); -} - -void PendulumGLWidget::setEyePhi(double phi) -{ - eyePhi = phi; - while (eyePhi < 0) eyePhi += 2.*M_PI; - while (eyePhi > 2*M_PI) eyePhi -= 2.*M_PI; - - // get the view port - static GLint vp[4]; - glGetIntegerv(GL_VIEWPORT, vp); - // calc new perspective, a resize event is simulated here - resizeGL(static_cast<int>(vp[2]), static_cast<int>(vp[3])); -} - -void PendulumGLWidget::setAngles(const double& q1, const double& q2) -{ - ang1 = static_cast<GLfloat>(q1*180./M_PI); - ang2 = static_cast<GLfloat>(q2*180./M_PI); -} - -void PendulumGLWidget::setMasses(const double& m1, const double& m2) -{ - sqrtm1 = static_cast<GLfloat>(sqrt(m1)); - sqrtm2 = static_cast<GLfloat>(sqrt(m2)); -} - -void PendulumGLWidget::setLengths(const double& _l1, const double& _l2) -{ - l1 = static_cast<GLfloat>(_l1); - l2 = static_cast<GLfloat>(_l2); -} - -void PendulumGLWidget::setBarColor(const TQColor& c) -{ - if (c.isValid()) - { - m_barColor = c; - } -} - -void PendulumGLWidget::setM1Color(const TQColor& c) -{ - if (c.isValid()) - { - m_m1Color = c; - } -} -void PendulumGLWidget::setM2Color(const TQColor& c) -{ - if (c.isValid()) - { - m_m2Color = c; - } -} - -/* --------- protected methods ----------- */ - -void PendulumGLWidget::initializeGL(void) -{ - qglClearColor(TQColor(black)); // set color to clear the background - - glClearDepth(1); // depth buffer setup - glEnable(GL_DEPTH_TEST); // depth testing - glDepthFunc(GL_LEQUAL); // type of depth test - - glShadeModel(GL_SMOOTH); // smooth color shading in poygons - - // nice perspective calculation - glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); - - // set up the light - glEnable(GL_LIGHTING); - glEnable(GL_LIGHT0); - glEnable(GL_LIGHT1); - - glMatrixMode(GL_MODELVIEW); // select modelview matrix - glLoadIdentity(); - // set positon of light0 - GLfloat lightPos[4]= - {lightR * sin(lightTheta) * sin(lightPhi), - lightR * sin(lightTheta) * cos(lightPhi), - lightR * cos(lightTheta), - 0}; - glLightfv(GL_LIGHT0, GL_POSITION, lightPos); - // set positon of light1 - lightPos[0] = lightR * sin(lightTheta) * sin(lightPhi+M_PI); - lightPos[1] = lightR * sin(lightTheta) * cos(lightPhi+M_PI); - glLightfv(GL_LIGHT1, GL_POSITION, lightPos); - - // only for lights #>0 - GLfloat spec[]={1,1,1,1}; - glLightfv(GL_LIGHT1, GL_SPECULAR, spec); - glLightfv(GL_LIGHT1, GL_DIFFUSE, spec); - - // enable setting the material colour by glColor() - glEnable(GL_COLOR_MATERIAL); - - GLfloat emi[4] = {.13, .13, .13, 1}; - glMaterialfv(GL_FRONT, GL_EMISSION, emi); -} - -void PendulumGLWidget::paintGL(void) -{ - // clear color and depth buffer - glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); - - glMatrixMode(GL_MODELVIEW); // select modelview matrix - - glLoadIdentity(); - - static const GLfloat width = 2.0; - static const GLfloat masswidth = 1.0; - static const int noOfSlices = 20; - - // top axis, left (x>0) - glTranslatef(0.5*width, 0, 0); - glRotatef(90, 0, 1, 0); - qglColor(m_barColor); - gluCylinder(quadM1, 0.2, 0.2, 5, 10, 1); - gluSphere(quadM1, 0.2, 10, 10); - // top axis, right - glLoadIdentity(); - glTranslatef(-0.5*width, 0, 0); - glRotatef(-90, 0, 1, 0); - gluCylinder(quadM1, 0.2, 0.2, 5, 10, 1); - gluSphere(quadM1, 0.2, 10, 10); - // 1. part, left - glLoadIdentity(); - glRotatef(ang1, 1, 0, 0); - glPushMatrix(); - glTranslatef(0.5*width, 0, -l1); - gluCylinder(quadM1, 0.2, 0.2, l1, 10, 1); - glPopMatrix(); - - // 1. part, right - glPushMatrix(); - glTranslatef(-0.5*width, 0, -l1); - gluCylinder(quadM1, 0.2, 0.2, l1, 10, 1); - // 1. part, bottom - glRotatef(90, 0, 1, 0); - gluSphere(quadM1, 0.2, 10, 10); // bottom corner 1 - gluCylinder(quadM1, 0.2, 0.2, width, 10, 1); // connection - glTranslatef(0, 0, 0.5*(width-masswidth)); - qglColor(m_m1Color); - gluCylinder(quadM1, sqrtm1, sqrtm1, masswidth, noOfSlices, 1); // mass 1 - gluQuadricOrientation(quadM1, GLU_INSIDE); - gluDisk(quadM1, 0, sqrtm1, noOfSlices,1); // bottom of mass - gluQuadricOrientation(quadM1, GLU_OUTSIDE); - glTranslatef(0, 0, masswidth); - gluDisk(quadM1, 0, sqrtm1, noOfSlices,1); // top of mass - - glTranslatef(0, 0, 0.5*(width-masswidth)); - qglColor(m_barColor); - gluSphere(quadM1, 0.2, 10, 10); // bottom corner 2 - glPopMatrix(); - - // 2. pendulum bar - glLoadIdentity(); - glTranslatef(0, l1*std::sin(ang1*M_PI/180.), -l1*std::cos(ang1*M_PI/180.)); - glRotatef(ang2, 1, 0, 0); - glTranslatef(0, 0, -l2); - qglColor(m_barColor); - gluCylinder(quadM1, 0.2, 0.2, l2, 10, 1); - - // mass 2 - glRotatef(90, 0, 1, 0); - glTranslatef(0, 0, -0.5*masswidth); - qglColor(m_m2Color); - gluCylinder(quadM1, sqrtm2, sqrtm2, masswidth, noOfSlices, 1); - gluQuadricOrientation(quadM1, GLU_INSIDE); - gluDisk(quadM1, 0, sqrtm2, noOfSlices,1); // bottom of mass - gluQuadricOrientation(quadM1, GLU_OUTSIDE); - glTranslatef(0, 0, masswidth); - gluDisk(quadM1, 0, sqrtm2, noOfSlices,1); // top of mass - - glFlush(); -} - -void PendulumGLWidget::resizeGL(int w, int h) -{ - // Prevent a divide by zero - if (h == 0) h = 1; - - // set the new view port - glViewport(0, 0, static_cast<GLint>(w), static_cast<GLint>(h)); - - // set up projection matrix - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - // Perspective view - gluPerspective(40.0f, - static_cast<GLdouble>(w)/static_cast<GLdouble>(h), - 1.0, 100.0f); - - // Viewing transformation, position for better view - // Theta is polar angle 0<Theta<Pi - gluLookAt( - eyeR * sin(eyeTheta) * sin(eyePhi), - eyeR * sin(eyeTheta) * cos(eyePhi), - eyeR * cos(eyeTheta), - 0,0,0, - 0,0,1); -} - -//----------------------------------------------------------------------------- -// KPendulumSaver: screen saver class -//----------------------------------------------------------------------------- - -KPendulumSaver::KPendulumSaver(WId id) : - KScreenSaver(id), - solver(0), - m_massRatio(massRatioDefault), - m_lengthRatio(lengthRatioDefault), - m_g(gDefault), - m_E(EDefault), - m_persChangeInterval(persChangeIntervalDefault) -{ - setEraseColor(black); - erase(); // erase area - glArea = new PendulumGLWidget(this); // create gl widget - glArea->setEyePhi(eyePhiDefault); - - readSettings(); // read global settings into pars - initData(); // init solver and glArea with read settings - - embed(glArea); // embed gl widget and resize it - glArea->show(); // show gl widget - - // set up and start cyclic timer - timer = new TQTimer(this); - timer->start(deltaT, TRUE); - connect(timer, TQT_SIGNAL(timeout()), this, TQT_SLOT(doTimeStep())); -} - -KPendulumSaver::~KPendulumSaver() -{ - // time, rotation are automatically deleted with parent KPendulumSaver - delete solver; -} - - -void KPendulumSaver::readSettings() -{ - // read configuration settings from config file - TDEConfig *config = TDEGlobal::config(); - config->setGroup("Settings"); - - // internal saver parameters are set to stored values or left at their - // default values if stored values are out of range - setMassRatio( - config->readDoubleNumEntry( - "mass ratio", - KPendulumSaver::massRatioDefault)); - setLengthRatio( - config->readDoubleNumEntry( - "length ratio", - KPendulumSaver::lengthRatioDefault)); - setG( - config->readDoubleNumEntry( - "g", - KPendulumSaver::gDefault)); - setE( - config->readDoubleNumEntry( - "E", - KPendulumSaver::EDefault)); - setPersChangeInterval( - config->readUnsignedNumEntry( - "perspective change interval", - KPendulumSaver::persChangeIntervalDefault)); - - // set the colours - setBarColor(config->readColorEntry("bar color", &barColorDefault)); - setM1Color( config->readColorEntry("m1 color", &m1ColorDefault)); - setM2Color( config->readColorEntry("m2 color", &m2ColorDefault)); -} - -void KPendulumSaver::initData() -{ - const double m1plusm2 = 2; // m1+m2 - const double m2 = m_massRatio * m1plusm2; - const double m1 = m1plusm2 - m2; - glArea->setMasses(m1, m2); - glArea->setAngles(0, 0); - - const double l1plusl2 = 9; // l1+l2 - const double l2 = m_lengthRatio * l1plusl2; - const double l1 = l1plusl2 - l2; - glArea->setLengths(l1, l2); - - // kinetic energy of m2 and m1 - const double kin_energy = m_E * m_g * (l1*m1 + (m1+m2)*(l1+l2)); - // angular velocity for 1. and 2. pendulum - const double qp = sqrt(2.*kin_energy/((m1+m2)*l1*l1 + m2*l2*l2 + m2*l1*l2)); - - // assemble initial y for solver - std::valarray<double> y(4); - y[0] = 0; // q1 - y[1] = 0; // q2 - y[2] = (m1+m2)*l1*l1*qp + 0.5*m2*l1*l2*qp; // p1 - y[3] = m2*l2*l2*qp + 0.5*m2*l1*l2*qp; // p2 - - // delete old solver - if (solver!=0) delete solver; - // init new solver - solver = new PendulumOdeSolver( - 0.0, // t - 0.01, // first dt step size estimation - y, - 1e-5, // eps - m1, - m2, - l1, - l2, - m_g); -} - - -void KPendulumSaver::setBarColor(const TQColor& c) -{ - glArea->setBarColor(c); -} -TQColor KPendulumSaver::barColor(void) const -{ - return glArea->barColor(); -} - -const TQColor KPendulumSaver::barColorDefault(255, 255, 127); - -void KPendulumSaver::setM1Color(const TQColor& c) -{ - glArea->setM1Color(c); -} -TQColor KPendulumSaver::m1Color(void) const -{ - return glArea->m1Color(); -} - -const TQColor KPendulumSaver::m1ColorDefault(170, 0, 127); - -void KPendulumSaver::setM2Color(const TQColor& c) -{ - glArea->setM2Color(c); -} -TQColor KPendulumSaver::m2Color(void) const -{ - return glArea->m2Color(); -} - -const TQColor KPendulumSaver::m2ColorDefault( 85, 170, 127); - - -void KPendulumSaver::setMassRatio(const double& massRatio) -{ - // range check is not neccessary in normal operation because validators check - // the values at input. But the validators do not check for corrupted - // settings read from disk. - if (massRatio >= massRatioLimitLower - && massRatio <= massRatioLimitUpper - && m_massRatio != massRatio) - { - m_massRatio = massRatio; - if (timer!=0) - { - initData(); - } - } -} - -const double KPendulumSaver::massRatioLimitLower = 0.01; -const double KPendulumSaver::massRatioLimitUpper = 0.99; -const double KPendulumSaver::massRatioDefault = 0.5; - -void KPendulumSaver::setLengthRatio(const double& lengthRatio) -{ - if (lengthRatio >= lengthRatioLimitLower - && lengthRatio <= lengthRatioLimitUpper - && m_lengthRatio != lengthRatio) - { - m_lengthRatio = lengthRatio; - if (timer!=0) - { - initData(); - } - } -} - -const double KPendulumSaver::lengthRatioLimitLower = 0.01; -const double KPendulumSaver::lengthRatioLimitUpper = 0.99; -const double KPendulumSaver::lengthRatioDefault = 0.5; - -void KPendulumSaver::setG(const double& g) -{ - if (g >= gLimitLower - && g <= gLimitUpper - && m_g != g) - { - m_g = g; - if (timer!=0) - { - initData(); - } - } -} - -const double KPendulumSaver::gLimitLower = 0.1; -const double KPendulumSaver::gLimitUpper = 300.0; -const double KPendulumSaver::gDefault = 40.0; - -void KPendulumSaver::setE(const double& E) -{ - if (E >= ELimitLower - && E <= ELimitUpper - && m_E != E) - { - m_E = E; - if (timer!=0) - { - initData(); - } - } -} - -const double KPendulumSaver::ELimitLower = 0.0; -const double KPendulumSaver::ELimitUpper = 5.0; -const double KPendulumSaver::EDefault = 1.2; - -void KPendulumSaver::setPersChangeInterval( - const unsigned int& persChangeInterval) -{ - if (persChangeInterval >= persChangeIntervalLimitLower - && persChangeInterval <= persChangeIntervalLimitUpper - && m_persChangeInterval != persChangeInterval) - { - m_persChangeInterval = persChangeInterval; - // do not restart simulation here - } -} - -const double KPendulumSaver::eyePhiDefault = 0.25*M_PI; - - -void KPendulumSaver::doTimeStep() -{ - /* time (in seconds) of perspective change. - * - t<0: no change yet - * - t=0: change starts - * - 0<t<moving time: change takes place - * - t=moving time: end of the change */ - static double persChangeTime = -5; - - // integrate a step ahead - solver->integrate(0.001*deltaT); - - // read new y from solver - const std::valarray<double> y = solver->Y(); - - // tell glArea the new coordinates/angles of the pendulum - glArea->setAngles(y[0], y[1]); - - // handle perspective change - persChangeTime += 0.001*deltaT; - if (persChangeTime > 0) - { - // phi value at the start of a perspective change - static double eyePhi0 = eyePhiDefault; - // phi value at the end of a perspective change - static double eyePhi1 = 0.75*M_PI; - static double deltaEyePhi = eyePhi1-eyePhi0; - - // movement acceleration/deceleration - const double a = 3; - // duration of the change period - const double movingTime = 2.*sqrt(fabs(deltaEyePhi)/a); - - // new current phi of eye - double eyePhi = persChangeTime < 0.5*movingTime ? - // accelerating phase - eyePhi0 + (deltaEyePhi>0?1:-1) - * 0.5*a*persChangeTime*persChangeTime: - // decellerating phase - eyePhi1 - (deltaEyePhi>0?1:-1) - * 0.5*a*(movingTime-persChangeTime)*(movingTime-persChangeTime); - - if (persChangeTime>movingTime) - { // perspective change has finished - // set new time till next change - persChangeTime = -double(m_persChangeInterval); - eyePhi0 = eyePhi = eyePhi1; - // find new phi value with angleLimit < phi < Pi-angleLimit or - // Pi+angleLimit < phi < 2*Pi-angleLimit - const double angleLimit = M_PI*0.2; - for (eyePhi1 = 0; - eyePhi1<angleLimit - || (eyePhi1<M_PI+angleLimit && eyePhi1>M_PI-angleLimit) - || eyePhi1>2*M_PI-angleLimit; - eyePhi1 = double(rand())/RAND_MAX * 2*M_PI) - {} - // new delta phi for next change - deltaEyePhi = eyePhi1 - eyePhi0; - // find shortest perspective change - if (deltaEyePhi < -M_PI) deltaEyePhi += 2*M_PI; - } - - glArea->setEyePhi(eyePhi); // set new perspective - } - - glArea->updateGL(); // repaint scenery - timer->start(deltaT, TRUE); // restart timer -} - -// public slot of KPendulumSaver, forward resize event to public slot of glArea -// to allow the resizing of the gl area withing the setup dialog -void KPendulumSaver::resizeGlArea(TQResizeEvent* e) -{ - glArea->resize(e->size()); -} - -//----------------------------------------------------------------------------- -// KPendulumSetup: dialog to setup screen saver parameters -//----------------------------------------------------------------------------- - -KPendulumSetup::KPendulumSetup(TQWidget* parent, const char* name) - : KPendulumSetupUi(parent, name), - // create saver and give it the WinID of the preview area - saver(new KPendulumSaver(preview->winId())) -{ - // the dialog should block, no other control center input should be possible - // until the dialog is closed - setModal(TRUE); - - // create input validators - mEdit->setValidator(new TQDoubleValidator( - KPendulumSaver::massRatioLimitLower, - KPendulumSaver::massRatioLimitUpper, - 5, mEdit)); - lEdit->setValidator(new TQDoubleValidator( - KPendulumSaver::lengthRatioLimitLower, - KPendulumSaver::lengthRatioLimitUpper, - 5, lEdit)); - gEdit->setValidator(new TQDoubleValidator( - KPendulumSaver::gLimitLower, - KPendulumSaver::gLimitUpper, - 5, gEdit)); - eEdit->setValidator(new TQDoubleValidator( - KPendulumSaver::ELimitLower, - KPendulumSaver::ELimitUpper, - 5, eEdit)); - - // set input limits for the perspective change interval time - persSpinBox->setMinValue(KPendulumSaver::persChangeIntervalLimitLower); - persSpinBox->setMaxValue(KPendulumSaver::persChangeIntervalLimitUpper); - - // set tool tips of editable fields - TQToolTip::add( - mEdit, - i18n("Ratio of 2nd mass to sum of both masses.\nValid values from %1 to %2.") - .arg(KPendulumSaver::massRatioLimitLower, 0, 'f', 2) - .arg(KPendulumSaver::massRatioLimitUpper, 0, 'f', 2)); - TQToolTip::add( - lEdit, - i18n("Ratio of 2nd pendulum part length to the sum of both part lengths.\nValid values from %1 to %2.") - .arg(KPendulumSaver::lengthRatioLimitLower, 0, 'f', 2) - .arg(KPendulumSaver::lengthRatioLimitUpper, 0, 'f', 2)); - TQToolTip::add( - gEdit, - i18n("Gravitational constant in arbitrary units.\nValid values from %1 to %2.") - .arg(KPendulumSaver::gLimitLower, 0, 'f', 2) - .arg(KPendulumSaver::gLimitUpper, 0, 'f', 2)); - TQToolTip::add( - eEdit, - i18n("Energy in units of the maximum potential energy of the given configuration.\nValid values from %1 to %2.") - .arg(KPendulumSaver::ELimitLower, 0, 'f', 2) - .arg(KPendulumSaver::ELimitUpper, 0, 'f', 2)); - TQToolTip::add( - persSpinBox, - i18n("Time in seconds after which a random perspective change occurs.\nValid values from %1 to %2.") - .arg(KPendulumSaver::persChangeIntervalLimitLower) - .arg(KPendulumSaver::persChangeIntervalLimitUpper)); - - // init preview area - preview->setBackgroundColor(black); - preview->show(); // otherwise saver does not get correct size - - // read settings from saver and update GUI elements with these values, saver - // has read settings in its constructor - - // set editable fields with stored values as defaults - TQString text; - text.setNum(saver->massRatio()); - mEdit->setText(text); - text.setNum(saver->lengthRatio()); - lEdit->setText(text); - text.setNum(saver->g()); - gEdit->setText(text); - text.setNum(saver->E()); - eEdit->setText(text); - - persSpinBox->setValue(saver->persChangeInterval()); - - barColorButton->setPaletteBackgroundColor(saver->barColor()); - m1ColorButton->setPaletteBackgroundColor(saver->m1Color()); - m2ColorButton->setPaletteBackgroundColor(saver->m2Color()); - - // if the preview area is resized it emmits the resized() event which is - // caught by the saver. The embedded GlArea is resized to fit into the - // preview area. - connect(preview, TQT_SIGNAL(resized(TQResizeEvent*)), - saver, TQT_SLOT(resizeGlArea(TQResizeEvent*))); -} - -KPendulumSetup::~KPendulumSetup() -{ - delete saver; -} - -// Ok pressed - save settings and exit -void KPendulumSetup::okButtonClickedSlot() -{ - TDEConfig* config = TDEGlobal::config(); - config->setGroup("Settings"); - - config->writeEntry("mass ratio", saver->massRatio()); - config->writeEntry("length ratio", saver->lengthRatio()); - config->writeEntry("g", saver->g()); - config->writeEntry("E", saver->E()); - config->writeEntry("perspective change interval", - saver->persChangeInterval()); - config->writeEntry("bar color", saver->barColor()); - config->writeEntry("m1 color", saver->m1Color()); - config->writeEntry("m2 color", saver->m2Color()); - - config->sync(); - accept(); -} - -void KPendulumSetup::aboutButtonClickedSlot() -{ - KMessageBox::about(this, i18n("\ -<h3>KPendulum Screen Saver for KDE</h3>\ -<p>Simulation of a two-part pendulum</p>\ -<p>Copyright (c) Georg Drenkhahn 2004</p>\ -<p><tt>[email protected]</tt></p>")); -} - -void KPendulumSetup::mEditLostFocusSlot(void) -{ - if (mEdit->hasAcceptableInput()) - { - saver->setMassRatio(mEdit->text().toDouble()); - } - else - { // write current setting back into input field - TQString text; - text.setNum(saver->massRatio()); - mEdit->setText(text); - } -} -void KPendulumSetup::lEditLostFocusSlot(void) -{ - if (lEdit->hasAcceptableInput()) - { - saver->setLengthRatio(lEdit->text().toDouble()); - } - else - { // write current setting back into input field - TQString text; - text.setNum(saver->lengthRatio()); - lEdit->setText(text); - } -} -void KPendulumSetup::gEditLostFocusSlot(void) -{ - if (gEdit->hasAcceptableInput()) - { - saver->setG(gEdit->text().toDouble()); - } - else - { // write current setting back into input field - TQString text; - text.setNum(saver->g()); - gEdit->setText(text); - } -} -void KPendulumSetup::eEditLostFocusSlot(void) -{ - if (eEdit->hasAcceptableInput()) - { - saver->setE(eEdit->text().toDouble()); - } - else - { // write current setting back into input field - TQString text; - text.setNum(saver->E()); - eEdit->setText(text); - } -} -void KPendulumSetup::persChangeEnteredSlot(int t) -{ - saver->setPersChangeInterval(t); -} - -void KPendulumSetup::barColorButtonClickedSlot(void) -{ - TQColor color = TQColorDialog::getColor( - saver->barColor(), this, "bar color dialog"); - if (color.isValid()) - { - saver->setBarColor(color); - barColorButton->setPaletteBackgroundColor(color); - } -} -void KPendulumSetup::m1ColorButtonClickedSlot(void) -{ - TQColor color = TQColorDialog::getColor( - saver->m1Color(), this, "mass 1 color dialog"); - if (color.isValid()) - { - saver->setM1Color(color); - m1ColorButton->setPaletteBackgroundColor(color); - } -} -void KPendulumSetup::m2ColorButtonClickedSlot(void) -{ - TQColor color = TQColorDialog::getColor( - saver->m2Color(), this, "mass 2 color dialog"); - if (color.isValid()) - { - saver->setM2Color(color); - m2ColorButton->setPaletteBackgroundColor(color); - } -} diff --git a/kscreensaver/kdesavers/pendulum.h b/kscreensaver/kdesavers/pendulum.h deleted file mode 100644 index 05998d9f..00000000 --- a/kscreensaver/kdesavers/pendulum.h +++ /dev/null @@ -1,391 +0,0 @@ -//============================================================================ -// -// KPendulum screen saver for KDE -// $Id$ -// Copyright (C) 2004 Georg Drenkhahn -// -// This file is free software; you can redistribute it and/or modify it under -// the terms of the GNU General Public License version 2 as published by the -// Free Software Foundation. -// -//============================================================================ - -#ifndef __PENDULUM_H__ -#define __PENDULUM_H__ - -// STL headers -#include <valarray> -// TQt headers -#include <tqwidget.h> -#include <tqtimer.h> -#include <tqgl.h> -// GL headers -#include <GL/glu.h> -#include <GL/gl.h> -// KDE headers -#include <kscreensaver.h> - -#include "vec3.h" -#include "rkodesolver.h" - -// KPendulumSetupUi -#include "pendulumcfg.h" - -//-------------------------------------------------------------------- - -/** @brief ODE solver for the Pendulum equations */ -class PendulumOdeSolver : public RkOdeSolver<double> -{ - public: - /** @brief Constuctor for the RK solver of the pendulum equation of motion - * @param t initial time in seconds - * @param dt initial time increment in seconds, just a hint for solver - * @param y generalized coordinates of pendulum system - * @param eps relative precision - * @param m1 mass of upper pendulum - * @param m2 mass of lower pendulum - * @param l1 length of upper pendulum - * @param l2 length of lower pendulum - * @param g gravitational constant */ - PendulumOdeSolver( - const double &t, - const double &dt, - std::valarray<double> &y, - const double &eps, - const double &m1, - const double &m2, - const double &l1, - const double &l2, - const double &g - ); - - protected: - /** @brief ODE function for the pendulum equation of motion system - * @param x time - * @param y generalized coordinates of pendulum system - * @return derivation dy/dx */ - std::valarray<double> - f(const double &x, const std::valarray<double> &y) const; - - private: - /** These private variables contain constants for faster numeric calculation. - * They are derived from the constructor arguments m1,m2,l1,l2,g. */ - const double A, B1, B, C, D, E, M; -}; - - -//-------------------------------------------------------------------- - -/** @brief GL widget class for the KPendulum screen saver - * - * Class implements TQGLWidget to display the KPendulum screen saver. */ -class PendulumGLWidget : public TQGLWidget -{ - Q_OBJECT - - - public: - /** @brief Constructor of KPendulum's GL widget - * @param parent parent widget, passed to TQGLWidget's constructor - * @param name name of widget, passed to TQGLWidget's constructor */ - PendulumGLWidget(TQWidget* parent=0, const char* name=0); - /** @brief Destructor of KPendulum's GL widget */ - ~PendulumGLWidget(void); - - /** @brief Set phi angle of viewpoint - * @param phi angle in sterad */ - void setEyePhi(double phi); - /** @brief Set angles of pendulum configuration - * @param q1 angle of 1. pendulum in sterad - * @param q2 angle of 2. pendulum in sterad */ - void setAngles(const double& q1, const double& q2); - /** @brief Set masses of pendulum configuration - * @param m1 mass of 1. pendulum - * @param m2 mass of 2. pendulum */ - void setMasses(const double& m1, const double& m2); - /** @brief Set lengths of pendulum configuration - * @param l1 length of 1. pendulum - * @param l2 length of 2. pendulum */ - void setLengths(const double& l1, const double& l2); - - /* accessors for colour settings */ - - /** @brief set color of the bars - * @param c color */ - void setBarColor(const TQColor& c); - /** @brief get color of the bars - * @return color */ - inline TQColor barColor(void) const {return m_barColor;} - /** @brief set color of mass 1 - * @param c color */ - void setM1Color(const TQColor& c); - /** @brief get color of mass 1 - * @return color */ - inline TQColor m1Color(void) const {return m_m1Color;} - /** @brief set color of mass 2 - * @param c color */ - void setM2Color(const TQColor& c); - /** @brief get color of mass 2 - * @return color */ - inline TQColor m2Color(void) const {return m_m2Color;} - - protected: - /** paint the GL view */ - virtual void paintGL(); - /** resize the gl view */ - virtual void resizeGL(int w, int h); - /** setup the GL enviroment */ - virtual void initializeGL(); - - private: // Private attributes - /** Eye position distance from coordinate zero point */ - GLfloat eyeR; - /** Eye position theta angle from z axis in sterad */ - double eyeTheta; - /** Eye position phi angle (longitude) in sterad */ - double eyePhi; - /** Light position distance from coordinate zero point */ - GLfloat lightR; - /** Light position theta angle from z axis in sterad */ - double lightTheta; - /** Light position phi angle (longitude) in sterad */ - double lightPhi; - - /** 1. pendulum's angle, degree */ - GLfloat ang1; - /** 2. pendulum's angle, degree */ - GLfloat ang2; - - /** 1. pendulum's square root of mass */ - GLfloat sqrtm1; - /** 2. pendulum's square root of mass */ - GLfloat sqrtm2; - - /** 1. pendulum's length */ - GLfloat l1; - /** 2. pendulum's length */ - GLfloat l2; - - /** Pointer to a quadric object used in the rendering function paintGL() */ - GLUquadricObj* const quadM1; - - /** color of the pendulum bars */ - TQColor m_barColor; - /** color of the 1. mass */ - TQColor m_m1Color; - /** color of the 2. mass */ - TQColor m_m2Color; -}; - -//-------------------------------------------------------------------- - -/** @brief Main class of the KPendulum screen saver - * - * This class implements KScreenSaver for the KPendulum screen saver. */ -class KPendulumSaver : public KScreenSaver -{ - Q_OBJECT - - - public: - /** @brief Constructor of the KPendulum screen saver object - * @param drawable Id of the window in which the screen saver is drawed - * - * Initial settings are read from disk, the GL widget is set up and displayed - * and the eq. of motion solver is started. */ - KPendulumSaver(WId drawable); - /** @brief Destructor of the KPendulum screen saver object - * - * Only KPendulumSaver::solver is destoyed. */ - ~KPendulumSaver(); - /** read the saved settings from disk */ - void readSettings(); - /** init physical quantities, set up the GL area and (re)start the ode - * solver. Called if new parameters are specified in the setup dialog and at - * startup. */ - void initData(); - - /* accessors for PendulumGLWidget member variables */ - - /** Set the displayed bar color of the pendulum */ - void setBarColor(const TQColor& c); - /** Get the displayed bar color of the pendulum */ - TQColor barColor(void) const; - - static const TQColor barColorDefault; - - /** Set the displayed color of the 1. pendulum mass */ - void setM1Color(const TQColor& c); - /** Get the displayed color of the 1. pendulum mass */ - TQColor m1Color(void) const; - - static const TQColor m1ColorDefault; - - /** Set the displayed color of the 2. pendulum mass */ - void setM2Color(const TQColor& c); - /** Get the displayed color of the 2. pendulum mass */ - TQColor m2Color(void) const; - - static const TQColor m2ColorDefault; - - /* accessors for own member variables */ - - /** Set the mass ratio of the pendulum system. @sa - * KPendulumSaver::m_massRatio */ - void setMassRatio(const double& massRatio); - /** Get the mass ratio of the pendulum system. @sa - * KPendulumSaver::m_massRatio */ - inline double massRatio(void) const {return m_massRatio;} - - // lower, upper limits (inclusive) and default values for the setup - // parameters - static const double massRatioLimitUpper; - static const double massRatioLimitLower; - static const double massRatioDefault; - - /** Set the length ratio of the pendulum system. @sa - * KPendulumSaver::m_lengthRatio */ - void setLengthRatio(const double& lengthRatio); - /** Get the length ratio of the pendulum system. @sa - * KPendulumSaver::m_lengthRatio */ - inline double lengthRatio(void) const {return m_lengthRatio;} - - static const double lengthRatioLimitLower; - static const double lengthRatioLimitUpper; - static const double lengthRatioDefault; - - /** Set the gravitational constant. @sa KPendulumSaver::m_g */ - void setG(const double& g); - /** Get the gravitational constant. @sa KPendulumSaver::m_g */ - inline double g(void) const {return m_g;} - - static const double gLimitLower; - static const double gLimitUpper; - static const double gDefault; - - /** Set the total energy. @sa KPendulumSaver::m_E */ - void setE(const double& E); - /** Get the total energy. @sa KPendulumSaver::m_E */ - inline double E(void) const {return m_E;} - - static const double ELimitLower; - static const double ELimitUpper; - static const double EDefault; - - /** Set the time interval for the periodic perspective change. @sa - * KPendulumSaver::m_persChangeInterval */ - void setPersChangeInterval(const unsigned int& persChangeInterval); - /** Get the time interval for the periodic perspective change. @sa - * KPendulumSaver::m_persChangeInterval */ - inline unsigned int persChangeInterval(void) const - {return m_persChangeInterval;} - - static const unsigned int persChangeIntervalLimitLower = 5; - static const unsigned int persChangeIntervalLimitUpper = 600; - static const unsigned int persChangeIntervalDefault = 15; - - public slots: - /** slot is called if integration should proceed by ::deltaT */ - void doTimeStep(); - /** slot is called if setup dialog changes in size and the GL are should be - * adjusted */ - void resizeGlArea(TQResizeEvent* e); - - private: - /** The ode solver which is used to integrate the equations of motion */ - PendulumOdeSolver* solver; - /** Gl widget of simulation */ - PendulumGLWidget* glArea; - /** Timer for the real time integration of the eqs. of motion */ - TQTimer* timer; - - /** Time step size for the integration in milliseconds. 20 ms corresponds to - * a frame rate of 50 fps. */ - static const unsigned int deltaT = 20; - static const double eyePhiDefault; - - // saved settings - - /** Mass ratio m2/(m1+m2) of the pendulum masses. Value is determined by the - * setup dialog. Variable is accessed by setMassRatio() and massRatio(). */ - double m_massRatio; - /** Length ratio l2/(l1+l2) of the pendulums. Value is determined by the - * setup dialog. Variable is accessed by setLengthRatio() and - * lengthRatio(). */ - double m_lengthRatio; - /** Gravitational constant (in arbitrary units). Value is determined by the - * setup dialog. Variable is accessed by setG() and g(). */ - double m_g; - /** Total energy of the system in units of the maximum possible potential - * energy. Value is determined by the setup dialog. Variable is accessed by - * setE() and E(). */ - double m_E; - /** Time interval after which a new perspective changed happens. Value is - * determined by the setup dialog. Variable is accessed by - * setPersChangeInterval() and persChangeInterval(). */ - unsigned int m_persChangeInterval; -}; - -//-------------------------------------------------------------------- - -/** @brief KPendulum screen saver setup dialog. - * - * This class handles the KPendulum screen saver setup dialog. */ -class KPendulumSetup : public KPendulumSetupUi -{ - Q_OBJECT - - - public: - /** @brief Constructor for the KPendulum screen saver setup dialog - * @param parent Pointer to the parent widget, passed to KPendulumSetupUi - * @param name Widget name - * - * The dialog box is set up and the screen saver object KPendulumSetup::saver - * is instantiated. */ - KPendulumSetup(TQWidget* parent = 0, const char* name = 0); - /** @brief Destructor of the KPendulum screen saver setup dialog - * - * Only KPendulumSetup::saver is deleted. */ - ~KPendulumSetup(void); - - public slots: - /** slot for the "OK" button: save settings and exit */ - void okButtonClickedSlot(void); - /** slot for the "About" button: show the About dialog */ - void aboutButtonClickedSlot(void); - - /** slot is called if the mass ratio edit field looses its focus. If the - * input is acceptable KPendulumSaver::setMassRatio() is called. */ - void mEditLostFocusSlot(void); - /** slot is called if the length ratio edit field looses its focus. If the - * input is acceptable KPendulumSaver::setLengthRatio() is called. */ - void lEditLostFocusSlot(void); - /** slot is called if the gravitational constant edit field looses its focus. - * If the input is acceptable KPendulumSaver::setG() is called. */ - void gEditLostFocusSlot(void); - /** slot is called if the energy edit field looses its focus. If the input - * is acceptable KPendulumSaver::setE() is called. */ - void eEditLostFocusSlot(void); - /** slot is called if the perspective change interval spin box changed. If - * the input is acceptable KPendulumSaver::setPersChangeInterval() is - * called. */ - void persChangeEnteredSlot(int t); - - /** slot is called if the bar color button was clicked. A color dialog is - * opened and the result is given to KPendulumSaver::setBarColor(). */ - void barColorButtonClickedSlot(void); - /** slot is called if the mass 1 color button was clicked. A color dialog is - * opened and the result is given to KPendulumSaver::setM1Color(). */ - void m1ColorButtonClickedSlot(void); - /** slot is called if the mass 2 color button was clicked. A color dialog is - * opened and the result is given to KPendulumSaver::setM2Color(). */ - void m2ColorButtonClickedSlot(void); - - private: - /** Pointer to the screen saver object. Its member KPendulumSaver::glArea is - * displayed in the preview area */ - KPendulumSaver* saver; -}; - -#endif diff --git a/kscreensaver/kdesavers/pendulumcfg.ui b/kscreensaver/kdesavers/pendulumcfg.ui deleted file mode 100644 index 4fa13d4f..00000000 --- a/kscreensaver/kdesavers/pendulumcfg.ui +++ /dev/null @@ -1,566 +0,0 @@ -<!DOCTYPE UI><UI version="3.3" stdsetdef="1"> -<class>KPendulumSetupUi</class> -<widget class="TQDialog"> - <property name="name"> - <cstring>KPendulumSetupUi</cstring> - </property> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>474</width> - <height>349</height> - </rect> - </property> - <property name="sizePolicy"> - <sizepolicy> - <hsizetype>3</hsizetype> - <vsizetype>3</vsizetype> - <horstretch>2</horstretch> - <verstretch>2</verstretch> - </sizepolicy> - </property> - <property name="minimumSize"> - <size> - <width>0</width> - <height>0</height> - </size> - </property> - <property name="maximumSize"> - <size> - <width>1200</width> - <height>900</height> - </size> - </property> - <property name="baseSize"> - <size> - <width>400</width> - <height>250</height> - </size> - </property> - <property name="caption"> - <string>KPendulum Setup</string> - </property> - <vbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <property name="resizeMode"> - <enum>Minimum</enum> - </property> - <widget class="TQLayoutWidget"> - <property name="name"> - <cstring>layout18</cstring> - </property> - <hbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <widget class="TQLayoutWidget"> - <property name="name"> - <cstring>layout16</cstring> - </property> - <vbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <widget class="TQLayoutWidget"> - <property name="name"> - <cstring>layout15</cstring> - </property> - <hbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <widget class="TQLabel"> - <property name="name"> - <cstring>textLabel1</cstring> - </property> - <property name="frameShape"> - <enum>NoFrame</enum> - </property> - <property name="frameShadow"> - <enum>Plain</enum> - </property> - <property name="text"> - <string><p align="center"> -m<sub>2</sub><br> ------------<br> -m<sub>1</sub>+m<sub>2</sub> -</p></string> - </property> - </widget> - <widget class="TQLineEdit"> - <property name="name"> - <cstring>mEdit</cstring> - </property> - <property name="sizePolicy"> - <sizepolicy> - <hsizetype>0</hsizetype> - <vsizetype>0</vsizetype> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="maximumSize"> - <size> - <width>60</width> - <height>32767</height> - </size> - </property> - <property name="maxLength"> - <number>5</number> - </property> - </widget> - </hbox> - </widget> - <widget class="TQLayoutWidget"> - <property name="name"> - <cstring>layout14</cstring> - </property> - <hbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <widget class="TQLabel"> - <property name="name"> - <cstring>textLabel2</cstring> - </property> - <property name="text"> - <string><p align="center"> -l<sub>2</sub><br> -------<br> -l<sub>1</sub>+l<sub>2</sub> -</p></string> - </property> - </widget> - <widget class="TQLineEdit"> - <property name="name"> - <cstring>lEdit</cstring> - </property> - <property name="sizePolicy"> - <sizepolicy> - <hsizetype>0</hsizetype> - <vsizetype>0</vsizetype> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="maximumSize"> - <size> - <width>60</width> - <height>32767</height> - </size> - </property> - <property name="maxLength"> - <number>5</number> - </property> - </widget> - </hbox> - </widget> - <widget class="TQLayoutWidget"> - <property name="name"> - <cstring>layout13</cstring> - </property> - <hbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <widget class="TQLabel"> - <property name="name"> - <cstring>textLabel3</cstring> - </property> - <property name="text"> - <string>g</string> - </property> - <property name="alignment"> - <set>WordBreak|AlignCenter</set> - </property> - </widget> - <widget class="TQLineEdit"> - <property name="name"> - <cstring>gEdit</cstring> - </property> - <property name="sizePolicy"> - <sizepolicy> - <hsizetype>0</hsizetype> - <vsizetype>0</vsizetype> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="maximumSize"> - <size> - <width>60</width> - <height>32767</height> - </size> - </property> - <property name="maxLength"> - <number>5</number> - </property> - </widget> - </hbox> - </widget> - <widget class="TQLayoutWidget"> - <property name="name"> - <cstring>layout13_2</cstring> - </property> - <hbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <widget class="TQLabel"> - <property name="name"> - <cstring>textLabel4</cstring> - </property> - <property name="text"> - <string>E</string> - </property> - <property name="alignment"> - <set>WordBreak|AlignCenter</set> - </property> - </widget> - <widget class="TQLineEdit"> - <property name="name"> - <cstring>eEdit</cstring> - </property> - <property name="sizePolicy"> - <sizepolicy> - <hsizetype>0</hsizetype> - <vsizetype>0</vsizetype> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="maximumSize"> - <size> - <width>60</width> - <height>32767</height> - </size> - </property> - <property name="maxLength"> - <number>5</number> - </property> - </widget> - </hbox> - </widget> - <widget class="TQLayoutWidget"> - <property name="name"> - <cstring>layout18</cstring> - </property> - <hbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <widget class="TQLabel"> - <property name="name"> - <cstring>textLabel2_2</cstring> - </property> - <property name="text"> - <string>Perspective<br> -Change [s]</string> - </property> - <property name="toolTip" stdset="0"> - <string>specify the time in seconds after which a random perspective change occurs</string> - </property> - </widget> - <widget class="TQSpinBox"> - <property name="name"> - <cstring>persSpinBox</cstring> - </property> - <property name="sizePolicy"> - <sizepolicy> - <hsizetype>0</hsizetype> - <vsizetype>0</vsizetype> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="minimumSize"> - <size> - <width>60</width> - <height>0</height> - </size> - </property> - <property name="maximumSize"> - <size> - <width>60</width> - <height>32767</height> - </size> - </property> - </widget> - </hbox> - </widget> - <widget class="TQLayoutWidget"> - <property name="name"> - <cstring>layout15</cstring> - </property> - <hbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <widget class="TQPushButton"> - <property name="name"> - <cstring>barColorButton</cstring> - </property> - <property name="maximumSize"> - <size> - <width>40</width> - <height>32767</height> - </size> - </property> - <property name="text"> - <string>Bars</string> - </property> - </widget> - <widget class="TQPushButton"> - <property name="name"> - <cstring>m1ColorButton</cstring> - </property> - <property name="maximumSize"> - <size> - <width>40</width> - <height>32767</height> - </size> - </property> - <property name="text"> - <string>M1</string> - </property> - </widget> - <widget class="TQPushButton"> - <property name="name"> - <cstring>m2ColorButton</cstring> - </property> - <property name="maximumSize"> - <size> - <width>40</width> - <height>32767</height> - </size> - </property> - <property name="text"> - <string>M2</string> - </property> - </widget> - </hbox> - </widget> - <spacer> - <property name="name"> - <cstring>spacer4</cstring> - </property> - <property name="orientation"> - <enum>Vertical</enum> - </property> - <property name="sizeType"> - <enum>MinimumExpanding</enum> - </property> - <property name="sizeHint"> - <size> - <width>20</width> - <height>0</height> - </size> - </property> - </spacer> - </vbox> - </widget> - <widget class="SsPreviewArea"> - <property name="name"> - <cstring>preview</cstring> - </property> - <property name="sizePolicy"> - <sizepolicy> - <hsizetype>7</hsizetype> - <vsizetype>7</vsizetype> - <horstretch>2</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="minimumSize"> - <size> - <width>200</width> - <height>150</height> - </size> - </property> - </widget> - </hbox> - </widget> - <widget class="TQLayoutWidget"> - <property name="name"> - <cstring>layout19</cstring> - </property> - <hbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <spacer> - <property name="name"> - <cstring>spacer2</cstring> - </property> - <property name="orientation"> - <enum>Horizontal</enum> - </property> - <property name="sizeType"> - <enum>Expanding</enum> - </property> - <property name="sizeHint"> - <size> - <width>66</width> - <height>31</height> - </size> - </property> - </spacer> - <widget class="TQPushButton"> - <property name="name"> - <cstring>OkButton</cstring> - </property> - <property name="text"> - <string>&OK</string> - </property> - <property name="default"> - <bool>true</bool> - </property> - </widget> - <widget class="TQPushButton"> - <property name="name"> - <cstring>CancelButton</cstring> - </property> - <property name="text"> - <string>&Cancel</string> - </property> - </widget> - <widget class="TQPushButton"> - <property name="name"> - <cstring>AboutButton</cstring> - </property> - <property name="text"> - <string>&About</string> - </property> - </widget> - <spacer> - <property name="name"> - <cstring>spacer3</cstring> - </property> - <property name="orientation"> - <enum>Horizontal</enum> - </property> - <property name="sizeType"> - <enum>Expanding</enum> - </property> - <property name="sizeHint"> - <size> - <width>65</width> - <height>31</height> - </size> - </property> - </spacer> - </hbox> - </widget> - </vbox> -</widget> -<customwidgets> - <customwidget> - <class>SsPreviewArea</class> - <header location="global">sspreviewarea.h</header> - <sizehint> - <width>-1</width> - <height>1</height> - </sizehint> - <container>0</container> - <sizepolicy> - <hordata>5</hordata> - <verdata>5</verdata> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - <pixmap>image0</pixmap> - </customwidget> -</customwidgets> -<images> - <image name="image0"> - <data format="PNG" length="1002">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000003b149444154388dad945f4c5b551cc73fe7dc4b7b4bcba0762d45c43114323599ee6192609c51d883892ce083f1718b3ebb185f8dc91e972cf39d2d2a2f1af664b6f1e0fe3863a0718969700eb0c52142da0242a1bd6d696f7bcff101585203ceb8fd9ece39f99dcff9fe7edf939f88c562ec465f5f9fe609442c161362173c3e3eae7b7a7ac8e7f36432196cdbfe4f907c3e4f2291201e8fe338cec3737357e9e8e828aded1e229d650e1f2d51754b082110124c13a4dc5ea341eb9dc284c0558a853f3ce8cb0677ef500fde7d39d2596679e326597b8e9abb85d7a770ab16ab6983ec5a05b487a70e36f0f4e10afe408d6a558310980108478dba4a1e8233990c5d474b64ed39aa3a8fe5f3317fbf81dbd70bccfeb205947632fd74f6589c1c6ea2f70d03a58ba0c1f2c9bdc1b66de3b8256a6e11cbe7e3ee1d181b590124fe2693aeee08d223c82c3a2c24b7b874bec8f26288774f7bd054504aef0dde6e99c0eb83f9fb266323cb80a27fb0958141836044605a2ee5523393371cc646fee2da37195aa35d0c0c5b4859ac03d7e91712dcaac5adab3650a3ff9d08ef7dd8404bb48869e5d958b5b87dadc4c9a1464e9f0d0326df7ebd86bd2e310cb1bf62d384d59441f2d70a070e1c60e09489929b988681bdd9cc97170bcc4c65595f71f8e0e3301337fc24a7732467831875a47f289652b0be5e4151e6d07316c1b0c0340d8ab92023e76d66a6b2840e36d2fb7a13fee632475e6edc367ea98a90fb98b7dd6310ca0328a44761582e1bab41befabcc0ec940d28bc5e93b68e064cab84e1d9beaeb48934eac1f53b01c1b000fca496aa54b61a99fcde61662a4b4b4b23d1680be9d426173e4df3602a48ea411989a4fd590f52a8fd156b05ed9d350e3defe3cfdf4b4c7ce770ea7d3fb9f520afbe1620daeee5c26735d20b9b9cfb6811a754a439e4e5c5639a4caa1e5caf586bfc0197b78702005cb9b4cae4cd3267ce8638fe964bd72b393e39d74928d242617303a756a37f284447770dcdbffc6384a05a85de1306e9a52057c7527c7131c3c42d3f475eb2303c82d4fc3276d6811db37efeb148723082d9b08f79f97c1e5729109a9a28307cc622d2d6cdf52b2b24efe548dedb00142009862cfa879ee1a71f6cec928353511472fbf4389148b0b0e0c108081412458dfe21c9f11351e67e7358595468246d1d1e5e38a6e9e851bc39d84ab502a669331dafec0d8ec7e3e8cb06e1a881d727d1ae40180a434a8c9db129a54126ad48a7358c2b4c5352c8c374bcccdab2bb37d8719cba79fab8211f9df218e0582c261e95f8bfc04f1a1e8bc5c4dfe0a190172af6a9690000000049454e44ae426082</data> - </image> -</images> -<connections> - <connection> - <sender>OkButton</sender> - <signal>clicked()</signal> - <receiver>KPendulumSetupUi</receiver> - <slot>okButtonClickedSlot()</slot> - </connection> - <connection> - <sender>CancelButton</sender> - <signal>clicked()</signal> - <receiver>KPendulumSetupUi</receiver> - <slot>close()</slot> - </connection> - <connection> - <sender>AboutButton</sender> - <signal>clicked()</signal> - <receiver>KPendulumSetupUi</receiver> - <slot>aboutButtonClickedSlot()</slot> - </connection> - <connection> - <sender>lEdit</sender> - <signal>lostFocus()</signal> - <receiver>KPendulumSetupUi</receiver> - <slot>lEditLostFocusSlot()</slot> - </connection> - <connection> - <sender>gEdit</sender> - <signal>lostFocus()</signal> - <receiver>KPendulumSetupUi</receiver> - <slot>gEditLostFocusSlot()</slot> - </connection> - <connection> - <sender>eEdit</sender> - <signal>lostFocus()</signal> - <receiver>KPendulumSetupUi</receiver> - <slot>eEditLostFocusSlot()</slot> - </connection> - <connection> - <sender>persSpinBox</sender> - <signal>valueChanged(int)</signal> - <receiver>KPendulumSetupUi</receiver> - <slot>persChangeEnteredSlot(int)</slot> - </connection> - <connection> - <sender>mEdit</sender> - <signal>lostFocus()</signal> - <receiver>KPendulumSetupUi</receiver> - <slot>mEditLostFocusSlot()</slot> - </connection> - <connection> - <sender>barColorButton</sender> - <signal>clicked()</signal> - <receiver>KPendulumSetupUi</receiver> - <slot>barColorButtonClickedSlot()</slot> - </connection> - <connection> - <sender>m1ColorButton</sender> - <signal>clicked()</signal> - <receiver>KPendulumSetupUi</receiver> - <slot>m1ColorButtonClickedSlot()</slot> - </connection> - <connection> - <sender>m2ColorButton</sender> - <signal>clicked()</signal> - <receiver>KPendulumSetupUi</receiver> - <slot>m2ColorButtonClickedSlot()</slot> - </connection> -</connections> -<Q_SLOTS> - <slot>okButtonClickedSlot()</slot> - <slot>aboutButtonClickedSlot()</slot> - <slot>mEditLostFocusSlot(void)</slot> - <slot>lEditLostFocusSlot(void)</slot> - <slot>gEditLostFocusSlot(void)</slot> - <slot>eEditLostFocusSlot(void)</slot> - <slot>persChangeEnteredSlot(int)</slot> - <slot>barColorButtonClickedSlot(void)</slot> - <slot>m1ColorButtonClickedSlot(void)</slot> - <slot>m2ColorButtonClickedSlot(void)</slot> -</Q_SLOTS> -<layoutdefaults spacing="6" margin="11"/> -<includehints> - <includehint>sspreviewarea.h</includehint> -</includehints> -</UI> diff --git a/kscreensaver/kdesavers/polygon.cpp b/kscreensaver/kdesavers/polygon.cpp deleted file mode 100644 index 2358f90a..00000000 --- a/kscreensaver/kdesavers/polygon.cpp +++ /dev/null @@ -1,366 +0,0 @@ -//----------------------------------------------------------------------------- -// -// kpolygon - Basic screen saver for KDE -// -// Copyright (c) Martin R. Jones 1996 -// -// layout management added 1998/04/19 by Mario Weilguni <[email protected]> -// 2001/03/04 Converted to libkscreensaver by Martin R. Jones - -#include <config.h> -#include <stdlib.h> -#include <time.h> -#include <tqcolor.h> -#include <tqlabel.h> -#include <tqslider.h> -#include <tqlayout.h> -#include <klocale.h> -#include <kconfig.h> -#include <kglobal.h> -#include <kmessagebox.h> - -#include "polygon.h" -#include <tqpainter.h> - -#include "polygon.moc" - - -#define MAXLENGTH 65 -#define MAXVERTICES 19 - -// libkscreensaver interface -extern "C" -{ - KDE_EXPORT const char *kss_applicationName = "kpolygon.kss"; - KDE_EXPORT const char *kss_description = I18N_NOOP( "KPolygon" ); - KDE_EXPORT const char *kss_version = "2.2.0"; - - KDE_EXPORT KScreenSaver *kss_create( WId id ) - { - return new kPolygonSaver( id ); - } - - KDE_EXPORT TQDialog *kss_setup() - { - return new kPolygonSetup(); - } -} - -//----------------------------------------------------------------------------- -// dialog to setup screen saver parameters -// -kPolygonSetup::kPolygonSetup( TQWidget *parent, const char *name ) - : KDialogBase( parent, name, true, i18n( "Setup Polygon Screen Saver" ), - Ok|Cancel|Help, Ok, true ), saver( 0 ), length( 10 ), vertices( 3 ), - speed( 50 ) -{ - readSettings(); - - TQWidget *main = makeMainWidget(); - setButtonText( Help, i18n( "A&bout" ) ); - - TQHBoxLayout *tl = new TQHBoxLayout(main, 0, spacingHint()); - TQVBoxLayout *tl1 = new TQVBoxLayout; - tl->addLayout(tl1); - - TQLabel *label = new TQLabel( i18n("Length:"), main ); - tl1->addWidget(label); - - TQSlider *sb = new TQSlider(1, MAXLENGTH, 10, length, Qt::Horizontal, - main ); - sb->setMinimumSize( 90, 20 ); - sb->setTickmarks(TQSlider::Below); - sb->setTickInterval(10); - connect( sb, TQT_SIGNAL( valueChanged( int ) ), TQT_SLOT( slotLength( int ) ) ); - tl1->addWidget(sb); - - label = new TQLabel( i18n("Vertices:"), main ); - tl1->addWidget(label); - - sb = new TQSlider(3, MAXVERTICES, 2, vertices, Qt::Horizontal, main); - sb->setMinimumSize( 90, 20 ); - sb->setTickmarks(TQSlider::Below); - sb->setTickInterval(2); - connect( sb, TQT_SIGNAL( valueChanged( int ) ), TQT_SLOT( slotVertices( int ) ) ); - tl1->addWidget(sb); - - label = new TQLabel( i18n("Speed:"), main ); - tl1->addWidget(label); - - sb = new TQSlider(0, 100, 10, speed, Qt::Horizontal, main); - sb->setMinimumSize( 90, 20 ); - sb->setTickmarks(TQSlider::Below); - sb->setTickInterval(10); - connect( sb, TQT_SIGNAL( valueChanged( int ) ), TQT_SLOT( slotSpeed( int ) ) ); - tl1->addWidget(sb); - tl1->addStretch(); - - preview = new TQWidget( main ); - preview->setFixedSize( 220, 170 ); - preview->setBackgroundColor( black ); - preview->show(); // otherwise saver does not get correct size - saver = new kPolygonSaver( preview->winId() ); - tl->addWidget(preview); - - setMinimumSize( sizeHint() ); -} - -kPolygonSetup::~kPolygonSetup() -{ - delete saver; -} - -// read settings from config file -void kPolygonSetup::readSettings() -{ - TDEConfig *config = TDEGlobal::config(); - config->setGroup( "Settings" ); - - length = config->readNumEntry( "Length", length ); - if ( length > MAXLENGTH ) - length = MAXLENGTH; - else if ( length < 1 ) - length = 1; - - vertices = config->readNumEntry( "Vertices", vertices ); - if ( vertices > MAXVERTICES ) - vertices = MAXVERTICES; - else if ( vertices < 3 ) - vertices = 3; - - speed = config->readNumEntry( "Speed", speed ); - if ( speed > 100 ) - speed = 100; - else if ( speed < 50 ) - speed = 50; -} - -void kPolygonSetup::slotLength( int len ) -{ - length = len; - if ( saver ) - saver->setPolygon( length, vertices ); -} - -void kPolygonSetup::slotVertices( int num ) -{ - vertices = num; - if ( saver ) - saver->setPolygon( length, vertices ); -} - -void kPolygonSetup::slotSpeed( int num ) -{ - speed = num; - if ( saver ) - saver->setSpeed( speed ); -} - -// Ok pressed - save settings and exit -void kPolygonSetup::slotOk() -{ - TDEConfig *config = TDEGlobal::config(); - config->setGroup( "Settings" ); - - TQString slength; - slength.setNum( length ); - config->writeEntry( "Length", slength ); - - TQString svertices; - svertices.setNum( vertices ); - config->writeEntry( "Vertices", svertices ); - - TQString sspeed; - sspeed.setNum( speed ); - config->writeEntry( "Speed", sspeed ); - - config->sync(); - - accept(); -} - -void kPolygonSetup::slotHelp() -{ - KMessageBox::information(this, - i18n("Polygon Version 2.2.0\n\n"\ - "Written by Martin R. Jones 1996\n"\ - "[email protected]")); -} - -//----------------------------------------------------------------------------- - - -kPolygonSaver::kPolygonSaver( WId id ) : KScreenSaver( id ) -{ - polygons.setAutoDelete( TRUE ); - - readSettings(); - - directions.resize( numVertices ); - colorContext = TQColor::enterAllocContext(); - - blank(); - - initialiseColor(); - initialisePolygons(); - - timer.start( speed ); - connect( &timer, TQT_SIGNAL( timeout() ), TQT_SLOT( slotTimeout() ) ); -} - -kPolygonSaver::~kPolygonSaver() -{ - timer.stop(); - TQColor::leaveAllocContext(); - TQColor::destroyAllocContext( colorContext ); -} - -// set polygon properties -void kPolygonSaver::setPolygon( int len, int ver ) -{ - timer.stop(); - numLines = len; - numVertices = ver; - - directions.resize( numVertices ); - polygons.clear(); - initialisePolygons(); - blank(); - - timer.start( speed ); -} - -// set the speed -void kPolygonSaver::setSpeed( int spd ) -{ - timer.stop(); - speed = 100-spd; - timer.start( speed ); -} - -// read configuration settings from config file -void kPolygonSaver::readSettings() -{ - TDEConfig *config = TDEGlobal::config(); - config->setGroup( "Settings" ); - - numLines = config->readNumEntry( "Length", 10 ); - if ( numLines > 50 ) - numLines = 50; - else if ( numLines < 1 ) - numLines = 1; - - numVertices = config->readNumEntry( "Vertices", 3 ); - if ( numVertices > 20 ) - numVertices = 20; - else if ( numVertices < 3 ) - numVertices = 3; - - speed = 100 - config->readNumEntry( "Speed", 50 ); -} - -// draw next polygon and erase tail -void kPolygonSaver::slotTimeout() -{ - TQPainter p( this ); - if ( polygons.count() > numLines ) - { - p.setPen( black ); - p.drawPolyline( *polygons.first() ); - } - - nextColor(); - p.setPen( colors[currentColor] ); - p.drawPolyline( *polygons.last() ); - - if ( polygons.count() > numLines ) - polygons.removeFirst(); - - polygons.append( new TQPointArray( polygons.last()->copy() ) ); - moveVertices(); -} - -void kPolygonSaver::blank() -{ - setBackgroundColor( black ); - erase(); -} - -// initialise the polygon -void kPolygonSaver::initialisePolygons() -{ - int i; - - polygons.append( new TQPointArray( numVertices + 1 ) ); - - TQPointArray &poly = *polygons.last(); - - for ( i = 0; i < numVertices; i++ ) - { - poly.setPoint( i, rnd.getLong(width()), rnd.getLong(height()) ); - directions[i].setX( 16 - rnd.getLong(8) * 4 ); - if ( directions[i].x() == 0 ) - directions[i].setX( 1 ); - directions[i].setY( 16 - rnd.getLong(8) * 4 ); - if ( directions[i].y() == 0 ) - directions[i].setY( 1 ); - } - - poly.setPoint( i, poly.point(0) ); -} - -// move polygon in current direction and change direction if a border is hit -void kPolygonSaver::moveVertices() -{ - int i; - TQPointArray &poly = *polygons.last(); - - for ( i = 0; i < numVertices; i++ ) - { - poly.setPoint( i, poly.point(i) + directions[i] ); - if ( poly[i].x() >= (int)width() ) - { - directions[i].setX( -(rnd.getLong(4) + 1) * 4 ); - poly[i].setX( (int)width() ); - } - else if ( poly[i].x() < 0 ) - { - directions[i].setX( (rnd.getLong(4) + 1) * 4 ); - poly[i].setX( 0 ); - } - - if ( poly[i].y() >= (int)height() ) - { - directions[i].setY( -(rnd.getLong(4) + 1) * 4 ); - poly[i].setY( height() ); - } - else if ( poly[i].y() < 0 ) - { - directions[i].setY( (rnd.getLong(4) + 1) * 4 ); - poly[i].setY( 0 ); - } - } - - poly.setPoint( i, poly.point(0) ); -} - -// create a color table of 64 colors -void kPolygonSaver::initialiseColor() -{ - for ( int i = 0; i < 64; i++ ) - { - colors[i].setHsv( i * 360 / 64, 255, 255 ); - } - - currentColor = 0; -} - -// set foreground color to next in the table -void kPolygonSaver::nextColor() -{ - currentColor++; - - if ( currentColor > 63 ) - currentColor = 0; -} - diff --git a/kscreensaver/kdesavers/polygon.h b/kscreensaver/kdesavers/polygon.h deleted file mode 100644 index cd6889ce..00000000 --- a/kscreensaver/kdesavers/polygon.h +++ /dev/null @@ -1,81 +0,0 @@ -//----------------------------------------------------------------------------- -// -// kpolygon - Basic screen saver for KDE -// -// Copyright (c) Martin R. Jones 1996 -// - -#ifndef __POLYGON_H__ -#define __POLYGON_H__ - -#include <tqtimer.h> -#include <tqptrlist.h> - -#include <kdialogbase.h> -#include <kscreensaver.h> -#include <krandomsequence.h> - -class kPolygonSaver : public KScreenSaver -{ - Q_OBJECT - -public: - kPolygonSaver( WId id ); - virtual ~kPolygonSaver(); - - void setPolygon( int len, int ver ); - void setSpeed( int spd ); - -private: - void readSettings(); - void blank(); - void initialisePolygons(); - void moveVertices(); - void initialiseColor(); - void nextColor(); - -protected slots: - void slotTimeout(); - -protected: - TQTimer timer; - unsigned numLines; - int numVertices; - int colorContext; - int speed; - TQColor colors[64]; - int currentColor; - TQPtrList<TQPointArray> polygons; - TQMemArray<TQPoint> directions; - KRandomSequence rnd; -}; - -class kPolygonSetup : public KDialogBase -{ - Q_OBJECT - -public: - kPolygonSetup( TQWidget *parent = 0, const char *name = 0 ); - ~kPolygonSetup(); - -protected: - void readSettings(); - -private slots: - void slotLength( int ); - void slotVertices( int ); - void slotSpeed( int ); - void slotOk(); - void slotHelp(); - -private: - TQWidget *preview; - kPolygonSaver *saver; - - int length; - int vertices; - int speed; -}; - -#endif - diff --git a/kscreensaver/kdesavers/rkodesolver.cpp b/kscreensaver/kdesavers/rkodesolver.cpp deleted file mode 100644 index 2127a110..00000000 --- a/kscreensaver/kdesavers/rkodesolver.cpp +++ /dev/null @@ -1,252 +0,0 @@ -//============================================================================ -// -// Ordinary differential equation solver using the Runge-Kutta method. -// $Id$ -// Copyright (C) 2004 Georg Drenkhahn -// -// This file is free software; you can redistribute it and/or modify it under -// the terms of the GNU General Public License version 2 as published by the -// Free Software Foundation. -// -//============================================================================ - -#include <kdebug.h> -#include "rkodesolver.h" - -template<typename T> -RkOdeSolver<T>::RkOdeSolver(const T &x, - const std::valarray<T>& y, - const T &dx, - const T &eps) - : mX(x) -{ - Y(y); - dX(dx); - Eps(eps); -} - -// virtual dtor -template<typename T> -RkOdeSolver<T>::~RkOdeSolver(void) -{} - -// accessors - -template<typename T> -void -RkOdeSolver<T>::dX(const T &a) -{ - if (a < 0.0) - { - kdDebug() << "RkOdeSolver: dx was negative, made it positive" << endl; - mStep = -a; - } - else if (a == 0.0) - { - mStep = 0.001; // a very arbitrary value - kdDebug() << "RkOdeSolver: dx == 0, set it to " << mStep << endl; - } - else - { - mStep = a; - } -} - -template<typename T> -void -RkOdeSolver<T>::Eps(const T &a) -{ - if (a < 0.0) - { - kdDebug() << "RkOdeSolver: eps was negative, made it positive" << endl; - mEps = -a; - } - else if (a == 0.0) - { - mEps = 1e-5; // a very arbitrary value - kdDebug() << "RkOdeSolver: eps == 0, set it to 1e-5" << endl; - } - else - { - mEps = a; - } -} - -template<typename T> -void -RkOdeSolver<T>::Y(const std::valarray<T> &a) -{ - mY.resize(a.size()); - mY = a; -} - - -// public member functions - -template<typename T> -void -RkOdeSolver<T>::integrate(const T &deltaX) -{ - if (deltaX == 0) - { - return; // nothing to integrate - } - - // init dydx if uninitialised - if (mDydx.size() != mY.size()) - { - mDydx.resize(mY.size()); - mDydx = f(mX,mY); - } - - static const unsigned int maxiter = 10000; - const T x2 = mX + deltaX; - - unsigned int iter; - for (iter=0; - iter<maxiter && rkStepCheck(x2-mX) == false; - ++iter) - {} - - if (iter>maxiter) - { - kdDebug() << "RkOdeSolver: More than " << maxiter - << " iterations in RkOdeSolver::integrate" << endl; - // TODO throw exeption here - } -} - - -// private member functions - -template<typename T> -bool -RkOdeSolver<T>::rkStepCheck(const T& dx_requested) -{ - static const T safety = 0.9; - static const T pshrnk = -0.25; - static const T pgrow = -0.2; - - // reduce step size by no more than a factor 10 - static const T shrinkLimit = 0.1; - // enlarge step size by no more than a factor 5 - static const T growthLimit = 5.0; - // errmax_sl = 6561.0 - static const T errmax_sl = pow(shrinkLimit/safety, 1.0/pshrnk); - // errmax_gl = 1.89e-4 - static const T errmax_gl = pow(growthLimit/safety, 1.0/pgrow); - - static const unsigned int maxiter = 100; - - if (dx_requested == 0) - { - return true; // integration done - } - - std::valarray<T> ytmp(mY.size()); - std::valarray<T> yerr(mY.size()); - std::valarray<T> t(mY.size()); - - bool stepSizeWasMaximal; - T dx; - if (std::abs(dx_requested) > mStep) - { - stepSizeWasMaximal = true; - dx = dx_requested>0 ? mStep : -mStep; - } - else - { - stepSizeWasMaximal = false; - dx = dx_requested; - } - - // generic scaling factor - std::valarray<T> yscal = std::abs(mY) + std::abs(dx*mDydx) + 1e-15; - - unsigned int iter = 0; - T errmax = 0; - do - { - if (errmax >= 1.0) - { - // reduce step size - dx *= errmax<errmax_sl ? safety * pow(errmax, pshrnk) : shrinkLimit; - stepSizeWasMaximal = true; - if (mX == mX + dx) - { - // stepsize below numerical resolution - kdDebug() << "RkOdeSolver: stepsize underflow in rkStepCheck" - << endl; - // TODO throw exeption here - exit(0); - } - // new dx -> update scaling vector - yscal = std::abs(mY) + std::abs(dx*mDydx) + 1e-15; - } - - ytmp = rkStep(dx, yerr); // try to make a step forward - t = std::abs(yerr/yscal); // calc the error vector - errmax = t.max()/mEps; // calc the rel. maximal error - ++iter; - } while (iter < maxiter && errmax >= 1.0); - - if (iter >= maxiter) - { - kdDebug() << "RkOdeSolver: too many iterations in rkStepCheck" << endl; - // TODO throw exeption here - exit(0); - } - - if (stepSizeWasMaximal == true) - { - // estimate next step size if used step size was maximal - mStep = - std::abs(dx) - * (errmax>errmax_gl ? safety * pow(errmax, pgrow) : growthLimit); - } - mX += dx; // make step forward - mY = ytmp; // save new function values - mDydx = f(mX,mY); // and update derivatives - - return std::abs(dx) < std::abs(dx_requested); -} - -template<typename T> -std::valarray<T> -RkOdeSolver<T>::rkStep(const T& dx, std::valarray<T>& yerr) const -{ - static const T - a2=0.2, a3=0.3, a4=0.6, a5=1.0, a6=0.875, - b21=0.2, - b31=3.0/40.0, b32=9.0/40.0, - b41=0.3, b42=-0.9, b43=1.2, - b51=-11.0/54.0, b52=2.5, b53=-70.0/27.0, b54=35.0/27.0, - b61=1631.0/55296.0, b62=175.0/512.0, b63=575.0/13824.0, - b64=44275.0/110592.0, b65=253.0/4096.0, - c1=37.0/378.0, c3=250.0/621.0, c4=125.0/594.0, c6=512.0/1771.0, - dc1=c1-2825.0/27648.0, dc3=c3-18575.0/48384.0, - dc4=c4-13525.0/55296.0, dc5=-277.0/14336.0, dc6=c6-0.25; - - std::valarray<T> ak2 = f(mX + a2*dx, - mY + dx*b21*mDydx); // 2. step - std::valarray<T> ak3 = f(mX + a3*dx, - mY + dx*(b31*mDydx + b32*ak2)); // 3.step - std::valarray<T> ak4 = f(mX + a4*dx, - mY + dx*(b41*mDydx + b42*ak2 - + b43*ak3)); // 4.step - std::valarray<T> ak5 = f(mX + a5*dx, - mY + dx*(b51*mDydx + b52*ak2 - + b53*ak3 + b54*ak4)); // 5.step - std::valarray<T> ak6 = f(mX + a6*dx, - mY + dx*(b61*mDydx + b62*ak2 - + b63*ak3 + b64*ak4 - + b65*ak5)); // 6.step - yerr = dx*(dc1*mDydx + dc3*ak3 + dc4*ak4 + dc5*ak5 + dc6*ak6); - return mY + dx*( c1*mDydx + c3*ak3 + c4*ak4 + c6*ak6); -} - - -// explicite instantiations -//template RkOdeSolver<long double>; -template class RkOdeSolver<double>; -//template RkOdeSolver<float>; diff --git a/kscreensaver/kdesavers/rkodesolver.h b/kscreensaver/kdesavers/rkodesolver.h deleted file mode 100644 index d1f9d556..00000000 --- a/kscreensaver/kdesavers/rkodesolver.h +++ /dev/null @@ -1,187 +0,0 @@ -//============================================================================ -// -// Ordinary differential equation solver using the Runge-Kutta method. -// $Id$ -// Copyright (C) 2004 Georg Drenkhahn -// -// This file is free software; you can redistribute it and/or modify it under -// the terms of the GNU General Public License version 2 as published by the -// Free Software Foundation. -// -//============================================================================ - -#ifndef RKODESOLVER_H -#define RKODESOLVER_H - -// STL headers -#include <valarray> - -/** @brief Solver class to integrate a first-order ordinary differential - * equation (ODE) by means of a 6. order Runge-Kutta method. - * - * The ODE system must be given as the derivative - * dy/dx = f(x,y) - * with x in R and y in R^n. - * - * Within this class the function f() is a pure virtual function, which must be - * reimplemented in a derived class. - * - * No other special data type for vectors or matrices are needed besides the STL - * class std::valarray. */ -template<typename T> -class RkOdeSolver -{ - public: - /** @brief Constructor - * @param x Initial integration parameter - * @param y Initial function values of function to integrate - * @param dx Initial guess for step size. Will be automatically adjusted to - * guarantee required precision. - * @param eps Relative precision - * - * Initialises the solver with start conditions. */ - RkOdeSolver(const T& x=0.0, - const std::valarray<T>& y=std::valarray<T>(0), - const T& dx=0, - const T& eps=1e-6); - /** @brief Destructor */ - virtual ~RkOdeSolver(void); - - /** @brief Integrates the ordinary differential equation from the current x - * value to x+@a dx. - * @param dx x-interval size to integrate over starting from x. dx may be - * negative. - * - * The integration is performed by calling rkStepCheck() repeatedly until the - * desired x value is reached. */ - void integrate(const T& dx); - - // Accessors - - // get/set x value - /** @brief Get current x value. - * @return Reference of x value. */ - const T& X(void) const; - /** @brief Set current x value. - * @param a The value to be set. */ - void X(const T& a); - - // get/set y value - /** @brief Get current y value. - * @return Reference of y vector. */ - const std::valarray<T>& Y(void) const; - /** @brief Set current y values. - * @param a The vector to be set. */ - void Y(const std::valarray<T>& a); - - /** @brief Get current dy/dx value. - * @return Reference of dy/dx vector. */ - const std::valarray<T>& dYdX(void) const; - - // get/set dx value - /** @brief Get current estimated step size dX. - * @return Reference of dX value. */ - const T& dX(void) const; - /** @brief Set estimated step size dX. - * @param a The value to be set. */ - void dX(const T& a); - - // get/set eps value - /** @brief Get current presision. - * @return Reference of precision value. */ - const T& Eps(void) const; - /** @brief Set estimated presision. - * @param a The value to be set. */ - void Eps(const T& a); - - protected: - // purely virtual function which is integrated - /** @brief ODE function - * @param x Integration value - * @param y Function value - * @return Derivation - * - * This purely virtual function returns the value of dy/dx for the given - * parameter values of x and y. */ - virtual std::valarray<T> - f(const T& x, const std::valarray<T>& y) const = 0; - - private: - /** @brief Perform one integration step with a tolerable relative error given - * by ::mErr. - * @param dx Maximal step size, may be positive or negative depending on - * integration direction. - * @return Flag indicating if made absolute integration step was equal |@a dx - * | (true) less than |@a dx | (false). - * - * A new estimate for the maximum next step size is saved to ::mStep. The - * new values for x, y and f are saved in ::mX, ::mY and ::mDydx. */ - bool rkStepCheck(const T& dx); - /** @brief Perform one Runge-Kutta integration step forward with step size - * ::mStep - * @param dx Step size relative to current x value. - * @param yerr Reference to vector in which the estimated error made in y is - * returned. - * @return The y value after the step at x+@a dx. - * - * Stored current x,y values are not adjusted. */ - std::valarray<T> rkStep(const T& dx, std::valarray<T>& yerr) const; - - /** current x value */ - T mX; - /** current y value */ - std::valarray<T> mY; - /** current value of dy/dx */ - std::valarray<T> mDydx; - - /** allowed relative error */ - T mEps; - /** estimated step size for next Runge-Kutta step */ - T mStep; -}; - -// inline accessors - -template<typename T> -inline const T& -RkOdeSolver<T>::X(void) const -{ - return mX; -} - -template<typename T> -inline void -RkOdeSolver<T>::X(const T &a) -{ - mX = a; -} - -template<typename T> -inline const std::valarray<T>& -RkOdeSolver<T>::Y(void) const -{ - return mY; -} - -template<typename T> -inline const std::valarray<T>& -RkOdeSolver<T>::dYdX(void) const -{ - return mDydx; -} - -template<typename T> -inline const T& -RkOdeSolver<T>::dX(void) const -{ - return mStep; -} - -template<typename T> -inline const T& -RkOdeSolver<T>::Eps(void) const -{ - return mEps; -} - -#endif diff --git a/kscreensaver/kdesavers/rotation.cpp b/kscreensaver/kdesavers/rotation.cpp deleted file mode 100644 index 9958bd81..00000000 --- a/kscreensaver/kdesavers/rotation.cpp +++ /dev/null @@ -1,825 +0,0 @@ -//============================================================================ -// -// KRotation screen saver for KDE -// -// The screen saver displays a physically realistic simulation of a force free -// rotating asymmetric body. The equations of motion for such a rotation, the -// Euler equations, are integrated numerically by the Runge-Kutta method. -// -// Developed by Georg Drenkhahn, [email protected] -// -// $Id$ -// -/* - * Copyright (C) 2004 Georg Drenkhahn - * - * KRotation is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License version 2 as published by the - * Free Software Foundation. - * - * KRotation 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 02110-1301 USA - */ -//============================================================================ - -// std. C++ headers -#include <cstdlib> -// STL -#include <deque> -// TQt headers -#include <tqcheckbox.h> -#include <tqlineedit.h> -#include <tqvalidator.h> -#include <tqtooltip.h> -// KDE headers -#include <klocale.h> -#include <kconfig.h> -#include <kdebug.h> -#include <kmessagebox.h> - -#include "sspreviewarea.h" - -// rotation.moc includes rotation.h -#include "rotation.moc" - -/** Version number of this screen saver */ -#define KROTATION_VERSION "1.1" - -// libkscreensaver interface -extern "C" -{ - /** application name for the libkscreensaver interface */ - KDE_EXPORT const char *kss_applicationName = "krotation.kss"; - /** application description for the libkscreensaver interface */ - KDE_EXPORT const char *kss_description = - I18N_NOOP("Simulation of a force free rotating asymmetric body"); - /** application version for the libkscreensaver interface */ - KDE_EXPORT const char *kss_version = KROTATION_VERSION; - - /** function to create screen saver object */ - KDE_EXPORT KScreenSaver* kss_create(WId id) - { - return new KRotationSaver(id); - } - - /** function to create setup dialog for screen saver */ - KDE_EXPORT TQDialog* kss_setup() - { - return new KRotationSetup(); - } -} - -//----------------------------------------------------------------------------- -// EulerOdeSolver implementation -//----------------------------------------------------------------------------- - -EulerOdeSolver::EulerOdeSolver( - const double &t_, - const double &dt_, - const double &A_, - const double &B_, - const double &C_, - std::valarray<double> &y_, - const double &eps_) - : RkOdeSolver<double>(t_,y_,dt_,eps_), - A(A_), B(B_), C(C_) -{ -} - -std::valarray<double> EulerOdeSolver::f( - const double &x, - const std::valarray<double> &y) const -{ - // unused - (void)x; - - // vec omega in body coor. sys.: omega_body = (p, q, r) - const vec3<double> omega_body(y[std::slice(0,3,1)]); - // body unit vectors in fixed frame coordinates - const vec3<double> e1(y[std::slice(3,3,1)]); - const vec3<double> e2(y[std::slice(6,3,1)]); - const vec3<double> e3(y[std::slice(9,3,1)]); - - // don't use "const vec3<double>&" here because slice_array must be - // value-copied to vec3<double>. - - // vec omega in global fixed coor. sys. - vec3<double> omega( - omega_body[0] * e1 - + omega_body[1] * e2 - + omega_body[2] * e3); - - // return vector y' - std::valarray<double> ypr(y.size()); - - // omega_body' - ypr[0] = -(C-B)/A * omega_body[1] * omega_body[2]; // p' - ypr[1] = -(A-C)/B * omega_body[2] * omega_body[0]; // q' - ypr[2] = -(B-A)/C * omega_body[0] * omega_body[1]; // r' - - // e1', e2', e3' - ypr[std::slice(3,3,1)] = vec3<double>::crossprod(omega, e1); - ypr[std::slice(6,3,1)] = vec3<double>::crossprod(omega, e2); - ypr[std::slice(9,3,1)] = vec3<double>::crossprod(omega, e3); - - return ypr; -} -//----------------------------------------------------------------------------- - - -//----------------------------------------------------------------------------- -// Rotation: screen saver widget -//----------------------------------------------------------------------------- - -RotationGLWidget::RotationGLWidget( - TQWidget* parent, const char* name, - const vec3<double>& _omega, - const std::deque<vec3<double> >& e1_, - const std::deque<vec3<double> >& e2_, - const std::deque<vec3<double> >& e3_, - const vec3<double>& J) - : TQGLWidget(parent, name), - eyeR(25), eyeTheta(1), eyePhi(M_PI*0.25), - boxSize(1,1,1), - fixedAxses(0), - bodyAxses(0), - lightR(10), lightTheta(M_PI/4), lightPhi(0), - bodyAxsesLength(6), - fixedAxsesLength(8), - omega(_omega), - e1(e1_), - e2(e2_), - e3(e3_) -{ - // set up initial rotation matrix as unit matrix, only non-constant elements - // are set later on - for (int i=0; i<16; i++) - rotmat[i] = ((i%5)==0) ? 1:0; - - // Set the box sizes from the momenta of inertia. J is the 3 vector with - // momenta of inertia with respect to the 3 figure axes. - - // the default values must be valid so that w,h,d are real! - GLfloat - x2 = 6.0*(-J[0] + J[1] + J[2]), - y2 = 6.0*( J[0] - J[1] + J[2]), - z2 = 6.0*( J[0] + J[1] - J[2]); - - if (x2>=0 && y2>=0 && z2>=0) - { - boxSize = vec3<double>(sqrt(x2), sqrt(y2), sqrt(z2)); - } - else - { - kdDebug() << "parameter error" << endl; - boxSize = vec3<double>(1, 1, 1); - } -} - -/* --------- protected methods ----------- */ - -void RotationGLWidget::initializeGL(void) -{ - qglClearColor(TQColor(black)); // set color to clear the background - - glClearDepth(1); // depth buffer setup - glEnable(GL_DEPTH_TEST); // depth testing - glDepthFunc(GL_LEQUAL); // type of depth test - - glShadeModel(GL_SMOOTH); // smooth color shading in poygons - - // nice perspective calculation - glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); - - // set up the light - glEnable(GL_LIGHTING); - glEnable(GL_LIGHT0); - // set positon of light0 - GLfloat lightPos[4]= - {lightR * sin(lightTheta) * sin(lightPhi), - lightR * sin(lightTheta) * cos(lightPhi), - lightR * cos(lightTheta), 1.}; - glLightfv(GL_LIGHT0, GL_POSITION, lightPos); - - // enable setting the material colour by glColor() - glEnable(GL_COLOR_MATERIAL); - - // set up display lists - - if (fixedAxses == 0) - fixedAxses = glGenLists(1); // list to be returned - glNewList(fixedAxses, GL_COMPILE); - - // fixed coordinate system axes - - glPushMatrix(); - glLoadIdentity(); - - // z-axis, blue - qglColor(TQColor(blue)); - myGlArrow(fixedAxsesLength, 0.5f, 0.03f, 0.1f); - - // x-axis, red - qglColor(TQColor(red)); - glRotatef(90, 0, 1, 0); - - myGlArrow(fixedAxsesLength, 0.5f, 0.03f, 0.1f); - - // y-axis, green - qglColor(TQColor(green)); - glLoadIdentity(); - glRotatef(-90, 1, 0, 0); - myGlArrow(fixedAxsesLength, 0.5f, 0.03f, 0.1f); - - glPopMatrix(); - glEndList(); - // end of axes object list - - - // box and box-axses - if (bodyAxses == 0) - bodyAxses = glGenLists(1); // list to be returned - glNewList(bodyAxses, GL_COMPILE); - - // z-axis, blue - qglColor(TQColor(blue)); - myGlArrow(bodyAxsesLength, 0.5f, 0.03f, 0.1f); - - // x-axis, red - qglColor(TQColor(red)); - glPushMatrix(); - glRotatef(90, 0, 1, 0); - myGlArrow(bodyAxsesLength, 0.5f, 0.03f, 0.1f); - glPopMatrix(); - - // y-axis, green - qglColor(TQColor(green)); - glPushMatrix(); - glRotatef(-90, 1, 0, 0); - myGlArrow(bodyAxsesLength, 0.5f, 0.03f, 0.1f); - glPopMatrix(); - - glEndList(); -} - -void RotationGLWidget::draw_traces(void) -{ - if (e1.size()==0 && e2.size()==0 && e3.size()==0) - return; - - glPushMatrix(); - glScalef(bodyAxsesLength, bodyAxsesLength, bodyAxsesLength); - - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - - for (int j=0; j<3; ++j) - { - const std::deque<vec3<double> >& e = - j==0 ? e1 : j==1 ? e2 : e3; - - // trace must contain at least 2 elements - if (e.size() > 1) - { - // emission colour - GLfloat em[4] = {0,0,0,1}; - em[j] = 1; // set either red, green, blue emission colour - - glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, em); - glColor4fv(em); - - // set iterator of the tail part - std::deque<vec3<double> >::const_iterator eit = e.begin(); - std::deque<vec3<double> >::const_iterator tail = - e.begin() + - static_cast<std::deque<vec3<double> >::difference_type> - (0.9*e.size()); - - glBegin(GL_LINES); - for (; eit < e.end()-1; ++eit) - { - glVertex3f((*eit)[0], (*eit)[1], (*eit)[2]); - // decrease transparency for tail section - if (eit > tail) - em[3] = - static_cast<GLfloat> - (1.0 - double(eit-tail)/(0.1*e.size())); - glColor4fv(em); - glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, em); - glVertex3f((*(eit+1))[0], (*(eit+1))[1], (*(eit+1))[2]); - } - glEnd(); - } - } - - glDisable(GL_BLEND); - - glPopMatrix(); -} - -void RotationGLWidget::paintGL(void) -{ - // clear color and depth buffer - glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); - - glMatrixMode(GL_MODELVIEW); // select modelview matrix - - glLoadIdentity(); - GLfloat const em[] = {0,0,0,1}; - glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, em); - - // omega vector - vec3<double> rotvec = - vec3<double>::crossprod(vec3<double>(0,0,1), omega).normalize(); - GLfloat rotdeg = - 180./M_PI * vec3<double>::angle(vec3<double>(0,0,1), omega); - glPushMatrix(); - glRotatef(rotdeg, rotvec[0], rotvec[1], rotvec[2]); - qglColor(TQColor(white)); - myGlArrow(7, .5f, .1f, 0.2f); - glPopMatrix(); - - // fixed axes - glCallList(fixedAxses); - - glPushMatrix(); - - // set up variable part of rotation matrix for body - // set gl body rotation matrix from e1,e2,e3 - const vec3<double>& e1b = e1.front(); - const vec3<double>& e2b = e2.front(); - const vec3<double>& e3b = e3.front(); - - rotmat[0] = e1b[0]; - rotmat[1] = e1b[1]; - rotmat[2] = e1b[2]; - rotmat[4] = e2b[0]; - rotmat[5] = e2b[1]; - rotmat[6] = e2b[2]; - rotmat[8] = e3b[0]; - rotmat[9] = e3b[1]; - rotmat[10] = e3b[2]; - - glMultMatrixf(rotmat); - - glCallList(bodyAxses); - - glScalef(boxSize[0]/2, boxSize[1]/2, boxSize[2]/2); - - // paint box - glBegin(GL_QUADS); - // front (z) - qglColor(TQColor(blue)); - glNormal3f( 0,0,1); - glVertex3f( 1, 1, 1); - glVertex3f(-1, 1, 1); - glVertex3f(-1, -1, 1); - glVertex3f( 1, -1, 1); - // back (-z) - glNormal3f( 0,0,-1); - glVertex3f( 1, 1, -1); - glVertex3f(-1, 1, -1); - glVertex3f(-1, -1, -1); - glVertex3f( 1, -1, -1); - // top (y) - qglColor(TQColor(green)); - glNormal3f( 0,1,0); - glVertex3f( 1, 1, 1); - glVertex3f( 1, 1, -1); - glVertex3f(-1, 1, -1); - glVertex3f(-1, 1, 1); - // bottom (-y) - glNormal3f( 0,-1,0); - glVertex3f( 1, -1, 1); - - glVertex3f( 1, -1, -1); - glVertex3f(-1, -1, -1); - glVertex3f(-1, -1, 1); - // left (-x) - qglColor(TQColor(red)); - glNormal3f( -1,0,0); - glVertex3f(-1, 1, 1); - glVertex3f(-1, 1, -1); - glVertex3f(-1, -1, -1); - glVertex3f(-1, -1, 1); - // right (x) - glNormal3f( 1,0,0); - glVertex3f( 1, 1, 1); - glVertex3f( 1, 1, -1); - glVertex3f( 1, -1, -1); - glVertex3f( 1, -1, 1); - glEnd(); - - // traces - glPopMatrix(); - draw_traces (); - - glFlush(); -} - -void RotationGLWidget::resizeGL(int w, int h) -{ - // Prevent a divide by zero - if (h == 0) h = 1; - - // set the new view port - glViewport(0, 0, (GLint)w, (GLint)h); - - // set up projection matrix - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - // Perspective view - gluPerspective(40.0f, (GLdouble)w/(GLdouble)h, 1.0, 100.0f); - - // Viewing transformation, position for better view - // Theta is polar angle 0<Theta<Pi - gluLookAt( - eyeR * sin(eyeTheta) * sin(eyePhi), - eyeR * sin(eyeTheta) * cos(eyePhi), - eyeR * cos(eyeTheta), - 0,0,0, - 0,0,1); -} - -/* --------- privat methods ----------- */ - -void RotationGLWidget::myGlArrow( - GLfloat total_length, GLfloat head_length, - GLfloat base_width, GLfloat head_width) -{ - GLUquadricObj* quadAx = gluNewQuadric(); - glPushMatrix(); - gluCylinder(quadAx, base_width, base_width, - total_length-head_length, 10, 1); - glTranslatef(0, 0, total_length-head_length); - gluCylinder(quadAx, head_width, 0, head_length, 10, 1); - glPopMatrix(); - gluDeleteQuadric(quadAx); -} - - -//----------------------------------------------------------------------------- -// KRotationSaver: screen saver class -//----------------------------------------------------------------------------- - -KRotationSaver::KRotationSaver(WId id) - : KScreenSaver(id), - J(4,2,3), // fixed box sizes! - initEulerPhi(0), - initEulerPsi(0), - solver(0), - glArea(0), - timer(0), - m_traceLengthSeconds(traceLengthSecondsDefault), - m_Lz(LzDefault), - m_initEulerTheta(initEulerThetaDefault) -{ - readSettings(); // read global settings - initData(); // init e1,e2,e3,omega,solver - - setEraseColor(black); - erase(); // erase area - glArea = new RotationGLWidget( - this, 0, omega, e1, e2, e3, J); // create gl widget - embed(glArea); // embed gl widget and resize it - glArea->show(); // show gl widget - - timer = new TQTimer(this); - timer->start(deltaT, TRUE); - connect(timer, TQT_SIGNAL(timeout()), this, TQT_SLOT(doTimeStep())); -} - -KRotationSaver::~KRotationSaver() -{ - // time, rotation are automatically deleted with parent KRotationSaver - delete solver; -} - -void KRotationSaver::initData() -{ - // reset coordiante system - vec3<double> e1t(1,0,0), e2t(0,1,0), e3t(0,0,1); - // rotation by phi around z = zhat axis - e1t.rotate(initEulerPhi*e3t); - e2t.rotate(initEulerPhi*e3t); - // rotation by theta around new x axis - e2t.rotate(m_initEulerTheta*e1t); - e3t.rotate(m_initEulerTheta*e1t); - // rotation by psi around new z axis - e1t.rotate(initEulerPsi*e3t); - e2t.rotate(initEulerPsi*e3t); - // set first vector in deque - e1.clear(); e1.push_front(e1t); - e2.clear(); e2.push_front(e2t); - e3.clear(); e3.push_front(e3t); - - // calc L in body frame: 1. determine z-axis of fixed frame in body - // coordinates, undo the transformations for unit z vector of the body frame - - // calc omega_body from ... - vec3<double> e1_body(1,0,0), e3_body(0,0,1); - // rotation by -psi along z axis - e1_body.rotate(-initEulerPsi*e3_body); - // rotation by -theta along new x axis - e3_body.rotate(-m_initEulerTheta*e1_body); - // omega_body = L_body * J_body^(-1) - vec3<double> omega_body = e3_body * m_Lz; - omega_body /= J; - - // assemble initial y for solver - std::valarray<double> y(12); - y[std::slice(0,3,1)] = omega_body; - // 3 basis vectors of body system in fixed coordinates - y[std::slice(3,3,1)] = e1t; - y[std::slice(6,3,1)] = e2t; - y[std::slice(9,3,1)] = e3t; - - // initial rotation vector - omega - = omega_body[0]*e1t - + omega_body[1]*e2t - + omega_body[2]*e3t; - - if (solver!=0) delete solver; - // init solver - solver = new EulerOdeSolver( - 0.0, // t - 0.01, // first dt step size estimation - J[0], J[1], J[2], // A,B,C - y, // omega_body,e1,e2,e3 - 1e-5); // eps -} - -void KRotationSaver::readSettings() -{ - // read configuration settings from config file - TDEConfig *config = TDEGlobal::config(); - config->setGroup("Settings"); - - // internal saver parameters are set to stored values or left at their - // default values if stored values are out of range - setTraceFlag(0, config->readBoolEntry("x trace", traceFlagDefault[0])); - setTraceFlag(1, config->readBoolEntry("y trace", traceFlagDefault[1])); - setTraceFlag(2, config->readBoolEntry("z trace", traceFlagDefault[2])); - setRandomTraces(config->readBoolEntry("random traces", randomTracesDefault)); - setTraceLengthSeconds( - config->readDoubleNumEntry("length", traceLengthSecondsDefault)); - setLz( - config->readDoubleNumEntry("Lz", LzDefault)); - setInitEulerTheta( - config->readDoubleNumEntry("theta", initEulerThetaDefault)); -} - -void KRotationSaver::setTraceLengthSeconds(const double& t) -{ - if (t >= traceLengthSecondsLimitLower - && t <= traceLengthSecondsLimitUpper) - { - m_traceLengthSeconds = t; - } -} - -const double KRotationSaver::traceLengthSecondsLimitLower = 0.0; -const double KRotationSaver::traceLengthSecondsLimitUpper = 99.0; -const double KRotationSaver::traceLengthSecondsDefault = 3.0; - -const bool KRotationSaver::traceFlagDefault[3] = {false, false, true}; - -void KRotationSaver::setLz(const double& Lz) -{ - if (Lz >= LzLimitLower && Lz <= LzLimitUpper) - { - m_Lz = Lz; - } -} - -const double KRotationSaver::LzLimitLower = 0.0; -const double KRotationSaver::LzLimitUpper = 500.0; -const double KRotationSaver::LzDefault = 10.0; - -void KRotationSaver::setInitEulerTheta(const double& theta) -{ - if (theta >= initEulerThetaLimitLower - && theta <= initEulerThetaLimitUpper) - { - m_initEulerTheta = theta; - } -} - -const double KRotationSaver::initEulerThetaLimitLower = 0.0; -const double KRotationSaver::initEulerThetaLimitUpper = 180.0; -const double KRotationSaver::initEulerThetaDefault = 0.03; - -// public slots - -void KRotationSaver::doTimeStep() -{ - // integrate a step ahead - solver->integrate(0.001*deltaT); - - // read new y - std::valarray<double> y = solver->Y(); - - std::deque<vec3<double> >::size_type - max_vec_length = - static_cast<std::deque<vec3<double> >::size_type> - ( m_traceLengthSeconds/(0.001*deltaT) ); - - for (int j=0; j<3; ++j) - { - std::deque<vec3<double> >& e = - j==0 ? e1 : - j==1 ? e2 : e3; - - // read out new body coordinate system - if (m_traceFlag[j] == true - && max_vec_length > 0) - { - e.push_front(y[std::slice(3*j+3, 3, 1)]); - while (e.size() > max_vec_length) - { - e.pop_back(); - } - } - else - { - // only set the 1. element - e.front() = y[std::slice(3*j+3, 3, 1)]; - // and delete all other emements - if (e.size() > 1) - e.resize(1); - } - } - - // current rotation vector omega - omega = y[0]*e1.front() + y[1]*e2.front() + y[2]*e3.front(); - - // set new random traces every 10 seconds - if (m_randomTraces==true) - { - static unsigned int counter=0; - ++counter; - if (counter > unsigned(10.0/(0.001*deltaT))) - { - counter=0; - for (int i=0; i<3; ++i) - m_traceFlag[i] = rand()%2==1 ? true : false; - } - } - - glArea->updateGL(); - timer->start(deltaT, TRUE); // restart timer -} - -// public slot of KRotationSaver, forward resize event to public slot of glArea -// to allow the resizing of the gl area withing the setup dialog -void KRotationSaver::resizeGlArea(TQResizeEvent* e) -{ - glArea->resize(e->size()); -} - -//----------------------------------------------------------------------------- -// KRotationSetup: dialog to setup screen saver parameters -//----------------------------------------------------------------------------- - -KRotationSetup::KRotationSetup(TQWidget* parent, const char* name) - : KRotationSetupUi(parent, name), - // create ssaver and give it the WinID of the preview area - saver(new KRotationSaver(preview->winId())) -{ - // the dialog should block, no other control center input should be possible - // until the dialog is closed - setModal(TRUE); - - lengthEdit->setValidator( - new TQDoubleValidator( - KRotationSaver::traceLengthSecondsLimitLower, - KRotationSaver::traceLengthSecondsLimitUpper, - 3, lengthEdit)); - LzEdit->setValidator( - new TQDoubleValidator( - KRotationSaver::LzLimitLower, - KRotationSaver::LzLimitUpper, - 3, LzEdit)); - thetaEdit->setValidator( - new TQDoubleValidator( - KRotationSaver::initEulerThetaLimitLower, - KRotationSaver::initEulerThetaLimitUpper, - 3, thetaEdit)); - - // set tool tips of editable fields - TQToolTip::add( - lengthEdit, - i18n("Length of traces in seconds of visibility.\nValid values from %1 to %2.") - .arg(KRotationSaver::traceLengthSecondsLimitLower, 0, 'f', 2) - .arg(KRotationSaver::traceLengthSecondsLimitUpper, 0, 'f', 2)); - TQToolTip::add( - LzEdit, - i18n("Angular momentum in z direction in arbitrary units.\nValid values from %1 to %2.") - .arg(KRotationSaver::LzLimitLower, 0, 'f', 2) - .arg(KRotationSaver::LzLimitUpper, 0, 'f', 2)); - TQToolTip::add( - thetaEdit, - i18n("Gravitational constant in arbitrary units.\nValid values from %1 to %2.") - .arg(KRotationSaver::initEulerThetaLimitLower, 0, 'f', 2) - .arg(KRotationSaver::initEulerThetaLimitUpper, 0, 'f', 2)); - - // init preview area - preview->setBackgroundColor(black); - preview->show(); // otherwise saver does not get correct size - - // read settings from saver and update GUI elements with these values, saver - // has read settings in its constructor - - // set editable fields with stored values as defaults - xTrace->setChecked(saver->traceFlag(0)); - yTrace->setChecked(saver->traceFlag(1)); - zTrace->setChecked(saver->traceFlag(2)); - randTraces->setChecked(saver->randomTraces()); - TQString text; - text.setNum(saver->traceLengthSeconds()); - lengthEdit->validateAndSet(text,0,0,0); - text.setNum(saver->Lz()); - LzEdit->validateAndSet(text,0,0,0); - text.setNum(saver->initEulerTheta()); - thetaEdit->validateAndSet(text,0,0,0); - - // if the preview area is resized it emmits the resized() event which is - // caught by the saver. The embedded GlArea is resized to fit into the - // preview area. - connect(preview, TQT_SIGNAL(resized(TQResizeEvent*)), - saver, TQT_SLOT(resizeGlArea(TQResizeEvent*))); -} - -KRotationSetup::~KRotationSetup() -{ - delete saver; -} - -// Ok pressed - save settings and exit -void KRotationSetup::okButtonClickedSlot(void) -{ - TDEConfig* config = TDEGlobal::config(); - config->setGroup("Settings"); - config->writeEntry("x trace", saver->traceFlag(0)); - config->writeEntry("y trace", saver->traceFlag(1)); - config->writeEntry("z trace", saver->traceFlag(2)); - config->writeEntry("random traces", saver->randomTraces()); - config->writeEntry("length", saver->traceLengthSeconds()); - config->writeEntry("Lz", saver->Lz()); - config->writeEntry("theta", saver->initEulerTheta()); - config->sync(); - accept(); -} - -void KRotationSetup::aboutButtonClickedSlot(void) -{ - KMessageBox::about(this, i18n("\ -<h3>KRotation Screen Saver for KDE</h3>\ -<p>Simulation of a force free rotating asymmetric body</p>\ -<p>Copyright (c) Georg Drenkhahn 2004</p>\ -<p><tt>[email protected]</tt></p>")); -} - -void KRotationSetup::xTraceToggled(bool state) -{ - saver->setTraceFlag(0, state); -} -void KRotationSetup::yTraceToggled(bool state) -{ - saver->setTraceFlag(1, state); -} -void KRotationSetup::zTraceToggled(bool state) -{ - saver->setTraceFlag(2, state); -} -void KRotationSetup::randomTracesToggled(bool state) -{ - saver->setRandomTraces(state); - if (state==false) - { - // restore settings from gui if random traces are turned off - saver->setTraceFlag(0, xTrace->isChecked()); - saver->setTraceFlag(1, yTrace->isChecked()); - saver->setTraceFlag(2, zTrace->isChecked()); - } -} -void KRotationSetup::lengthEnteredSlot(const TQString& s) -{ - saver->setTraceLengthSeconds(s.toDouble()); -} -void KRotationSetup::LzEnteredSlot(const TQString& s) -{ - saver->setLz(s.toDouble()); - if (saver!=0) saver->initData(); -} -void KRotationSetup::thetaEnteredSlot(const TQString& s) -{ - saver->setInitEulerTheta(s.toDouble()); - if (saver!=0) saver->initData(); -} diff --git a/kscreensaver/kdesavers/rotation.h b/kscreensaver/kdesavers/rotation.h deleted file mode 100644 index 0ae46469..00000000 --- a/kscreensaver/kdesavers/rotation.h +++ /dev/null @@ -1,328 +0,0 @@ -//============================================================================ -// -// KRotation screen saver for KDE -// Copyright (C) 2004 Georg Drenkhahn -// $Id$ -// -//============================================================================ - -#ifndef __ROTATION_H__ -#define __ROTATION_H__ - -#include <math.h> -// STL headers -#include <valarray> -// TQt headers -#include <tqwidget.h> -#include <tqtimer.h> -#include <tqgl.h> -// GL headers -#include <GL/glu.h> -#include <GL/gl.h> -// KDE headers -#include <kscreensaver.h> - -#include "vec3.h" -#include "rkodesolver.h" - -// KRotationSetupUi -#include "rotationcfg.h" - -//-------------------------------------------------------------------- - -/** @brief ODE solver for the Euler equations. - * - * Class implements RkOdeSolver<double> to solve the Euler equations of motion - * tor the rotating object. */ -class EulerOdeSolver : public RkOdeSolver<double> -{ - public: - /** @brief Constructor for the ODE solver for the Euler equations. - * @param t Time in seconds, integration variable - * @param dt Initial time increment in seconds for integration, auto adjusted - * later to guarantee precision - * @param _A Moment of inertia along 1. figure axis - * @param _B Moment of inertia along 2. figure axis - * @param _C Moment of inertia along 3. figure axis - * @param _y Vector of 12 elements containing the initial rotation vector - * omega (elements 0 to 2), and the initial rotating systems coordinate - * vectors e1, e2, e3 (elements 3 to 5, 6 to 8, and 9 to 11). - * @param eps Relative precision per integration step, see - * RkOdeSolver::RkOdeSolver(). */ - EulerOdeSolver( - const double &t_, - const double &dt_, - const double &A_, - const double &B_, - const double &C_, - std::valarray<double> &y_, - const double &eps); - - protected: - /** @brief ODE function for the Euler equation system - * @param x time in seconds - * @param y Vector of 12 elements containing the rotation vector omega - * (elements 0 to 2), and the rotating systems coordinate vectors e1, e2, e3 - * (elements 3 to 5, 6 to 8, and 9 to 11). - * @return derivation dy/dx */ - std::valarray<double> - f(const double &x, const std::valarray<double> &y) const; - - private: - /** Moments of inertia along the three figure axes */ - double A, B, C; -}; - - -//-------------------------------------------------------------------- - -/** @brief GL widget class for the KRotation screen saver - * - * Class implements TQGLWidget to display the KRotation screen saver. */ -class RotationGLWidget : public TQGLWidget -{ - Q_OBJECT - - - public: - /** @brief Constructor of KRotation's GL widget - * @param parent parent widget, passed to TQGLWidget's constructor - * @param name name of widget, passed to TQGLWidget's constructor - * @param omega current rotation vector - * @param e1 x trace data - * @param e2 y trace data - * @param e3 z trace data - * @param J 3 vector with momenta of inertia with respect to the 3 figure - * axes. */ - RotationGLWidget(TQWidget* parent, const char* name, - const vec3<double>& omega, - const std::deque<vec3<double> >& e1, - const std::deque<vec3<double> >& e2, - const std::deque<vec3<double> >& e3, - const vec3<double>& J); - - protected: - /** Called if scenery (GL view) must be updated */ - virtual void paintGL(); - /** Called if gl widget was resized. Method makes adjustments for new - * perspective */ - virtual void resizeGL(int w, int h); - /** Setup the GL enviroment */ - virtual void initializeGL(); - - private: - /** @brief Draw 3D arrow - * @param total_length total length of arrow - * @param head_length length of arrow head (cone) - * @param base_width width of arrow base - * @param head_width width of arrow head (cone) - * - * The arrow is drawn from the coordinates zero point along th z direction. - * The cone's tip is located at (0,0,@a total_length). */ - void myGlArrow(GLfloat total_length, GLfloat head_length, - GLfloat base_width, GLfloat head_width); - /** Draw the traces in the GL area */ - void draw_traces (void); - - private: // Private attributes - /** Eye position distance from coordinate zero point */ - GLfloat eyeR; - /** Eye position theta angle from z axis */ - GLfloat eyeTheta; - /** Eye position phi angle (longitude) */ - GLfloat eyePhi; - /** Box size */ - vec3<double> boxSize; - /** GL object list of fixed coordinate systems axses */ - GLuint fixedAxses; - /** GL object list of rotating coordinate systems axses */ - GLuint bodyAxses; - /** Light position distance from coordinate zero point */ - GLfloat lightR; - /** Light position theta angle from z axis */ - GLfloat lightTheta; - /** Light position phi angle (longitude) */ - GLfloat lightPhi; - - /** stores position where the mouse button was pressed down */ - TQPoint mouse_press_pos; - - /** Length of the rotating coordinate system axses */ - GLfloat bodyAxsesLength; - /** Length of the fixed coordinate system axses */ - GLfloat fixedAxsesLength; - - /** The openGL rotation matrix for the box. */ - GLfloat rotmat[16]; - - /** reference to current rotation vector */ - const vec3<double>& omega; - /** reference to x trace values */ - const std::deque<vec3<double> >& e1; - /** reference to y trace values */ - const std::deque<vec3<double> >& e2; - /** reference to z trace values */ - const std::deque<vec3<double> >& e3; -}; - -//-------------------------------------------------------------------- - -/** @brief Main class of the KRotation screen saver - * - * This class implements KScreenSaver for the KRotation screen saver. */ -class KRotationSaver : public KScreenSaver -{ - Q_OBJECT - - - public: - /** @brief Constructor of the KRotation screen saver object - * @param drawable Id of the window in which the screen saver is drawed - * - * Initial settings are read from disk, the GL widget is set up and displayed - * and the eq. of motion solver is started. */ - KRotationSaver(WId drawable); - /** @brief Destructor of the KPendulum screen saver object - * - * Only KPendulumSaver::solver is destoyed. */ - ~KRotationSaver(); - /** read the saved settings from disk */ - void readSettings(); - /** init physical quantities and set up the ode solver */ - void initData(); - - /** Returns length of traces in seconds of visibility, parameter from setup - * dialog */ - inline double traceLengthSeconds(void) const {return m_traceLengthSeconds;} - /** Sets the length of traces in seconds of visibility. */ - void setTraceLengthSeconds(const double& t); - /** Lower argument limit for setTraceLengthSeconds() */ - static const double traceLengthSecondsLimitLower; - /** Upper argument limit for setTraceLengthSeconds() */ - static const double traceLengthSecondsLimitUpper; - /** Default value of KRotationSaver::m_traceLengthSeconds */ - static const double traceLengthSecondsDefault; - - /** Flags indicating if the traces for x,y,z are shown. Only relevant if - * ::randomTraces is not set to true. Parameter from setup dialog */ - inline bool traceFlag(unsigned int n) const {return m_traceFlag[n];} - /** (Un)Sets the x,y,z traces flags. */ - inline void setTraceFlag(unsigned int n, const bool& flag) - {m_traceFlag[n] = flag;} - /** Default values for KRotationSaver::m_traceFlag */ - static const bool traceFlagDefault[3]; - - /** If flag is set to true the traces will be (de)activated randomly all 10 - * seconds. Parameter from setup dialog */ - inline bool randomTraces(void) const {return m_randomTraces;} - /** (Un)Sets the random trace flag. */ - inline void setRandomTraces(const bool& flag) {m_randomTraces = flag;} - /** Default value for KRotationSaver::m_randomTraces */ - static const bool randomTracesDefault = true; - - /** Returns the angular momentum. */ - inline double Lz(void) const {return m_Lz;} - /** Sets the angular momentum. */ - void setLz(const double& Lz); - /** Lower argument limit for setLz() */ - static const double LzLimitLower; - /** Upper argument limit for setLz() */ - static const double LzLimitUpper; - /** Default value for KRotationSaver::m_Lz */ - static const double LzDefault; - - /** Returns initial eulerian angle theta of the top body at t=0 sec. */ - inline double initEulerTheta(void) const {return m_initEulerTheta;} - /** Set the initial eulerian angle theta of the top body at t=0 sec. */ - void setInitEulerTheta(const double& theta); - /** Lower argument limit for setInitEulerTheta() */ - static const double initEulerThetaLimitLower; - /** Upper argument limit for setInitEulerTheta() */ - static const double initEulerThetaLimitUpper; - /** Default value for KRotationSaver::m_initEulerTheta */ - static const double initEulerThetaDefault; - - public slots: - /** slot is called if integration should proceed by ::deltaT */ - void doTimeStep(); - /** slot is called if setup dialog changes in size and the GL area should be - * adjusted */ - void resizeGlArea(TQResizeEvent* e); - - private: - /** Momentum of inertia along figure axes */ - vec3<double> J; - /** Initial eulerian angles phi of the top body at t=0s */ - double initEulerPhi; - /** Initial eulerian angles psi of the top body at t=0s */ - double initEulerPsi; - - /** The ode solver which is used to integrate the equations of motion */ - EulerOdeSolver* solver; - /** Gl widget of simulation */ - RotationGLWidget* glArea; - /** Timer for the real time integration of the Euler equations */ - TQTimer* timer; - - /** current rotation vector */ - vec3<double> omega; - /** deque of unit vectors of e1 figure axes in fixed frame coordinates */ - std::deque<vec3<double> > e1; - /** deque of unit vectors of e2 figure axes in fixed frame coordinates */ - std::deque<vec3<double> > e2; - /** deque of unit vectors of e3 figure axes in fixed frame coordinates */ - std::deque<vec3<double> > e3; - - /** Time step size for the integration in milliseconds. Used in - * ::KRotationSaver and ::RotationGLWidget. */ - static const unsigned int deltaT = 20; - - /** Length of traces in seconds of visibility, parameter from setup dialog */ - double m_traceLengthSeconds; - /** Flags indicating if the traces for x,y,z are shown. Only relevant if - * ::randomTraces is not set to true. Parameter from setup dialog */ - bool m_traceFlag[3]; - /** If flag is set to true the traces will be (de)activated randomly all 10 - * seconds. Parameter from setup dialog */ - bool m_randomTraces; - /** Angular momentum. This is a constant of motion and points always into - * positive z direction. Parameter from setup dialog */ - double m_Lz; - /** Initial eulerian angles theta of the top body at t=0 sec. Parameter from - * setup dialog */ - double m_initEulerTheta; -}; - -//-------------------------------------------------------------------- - -/** @brief KRotation screen saver setup dialog. - * - * This class handles the KRotation screen saver setup dialog. */ -class KRotationSetup : public KRotationSetupUi -{ - Q_OBJECT - - - public: - KRotationSetup(TQWidget* parent = NULL, const char* name = NULL); - ~KRotationSetup(); - - public slots: - /// slot for the OK Button: save settings and exit - void okButtonClickedSlot(void); - /// slot for the About Button: show the About dialog - void aboutButtonClickedSlot(void); - void randomTracesToggled(bool state); - void xTraceToggled(bool state); - void yTraceToggled(bool state); - void zTraceToggled(bool state); - void lengthEnteredSlot(const TQString& s); - void LzEnteredSlot(const TQString& s); - void thetaEnteredSlot(const TQString& s); - - private: - /// the screen saver widget which is displayed in the preview area - KRotationSaver* saver; -}; - -#endif diff --git a/kscreensaver/kdesavers/rotationcfg.ui b/kscreensaver/kdesavers/rotationcfg.ui deleted file mode 100644 index 7bfca1aa..00000000 --- a/kscreensaver/kdesavers/rotationcfg.ui +++ /dev/null @@ -1,488 +0,0 @@ -<!DOCTYPE UI><UI version="3.2" stdsetdef="1"> -<class>KRotationSetupUi</class> -<widget class="TQDialog"> - <property name="name"> - <cstring>KRotationSetupUi</cstring> - </property> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>401</width> - <height>265</height> - </rect> - </property> - <property name="sizePolicy"> - <sizepolicy> - <hsizetype>3</hsizetype> - <vsizetype>3</vsizetype> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="minimumSize"> - <size> - <width>0</width> - <height>0</height> - </size> - </property> - <property name="maximumSize"> - <size> - <width>1200</width> - <height>900</height> - </size> - </property> - <property name="baseSize"> - <size> - <width>400</width> - <height>250</height> - </size> - </property> - <property name="caption"> - <string>KRotation Setup</string> - </property> - <vbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <property name="resizeMode"> - <enum>Minimum</enum> - </property> - <widget class="TQLayoutWidget"> - <property name="name"> - <cstring>layout17</cstring> - </property> - <hbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <widget class="TQLayoutWidget"> - <property name="name"> - <cstring>layout6</cstring> - </property> - <vbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <widget class="TQButtonGroup"> - <property name="name"> - <cstring>buttonGroup1</cstring> - </property> - <property name="sizePolicy"> - <sizepolicy> - <hsizetype>0</hsizetype> - <vsizetype>0</vsizetype> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="title"> - <string>Traces</string> - </property> - <grid> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <widget class="TQLayoutWidget" row="0" column="0" rowspan="1" colspan="2"> - <property name="name"> - <cstring>layout5</cstring> - </property> - <grid> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <widget class="TQCheckBox" row="0" column="0"> - <property name="name"> - <cstring>xTrace</cstring> - </property> - <property name="enabled"> - <bool>true</bool> - </property> - <property name="text"> - <string>x</string> - </property> - </widget> - <widget class="TQCheckBox" row="1" column="0" rowspan="1" colspan="3"> - <property name="name"> - <cstring>randTraces</cstring> - </property> - <property name="text"> - <string>Random</string> - </property> - </widget> - <widget class="TQCheckBox" row="0" column="1"> - <property name="name"> - <cstring>yTrace</cstring> - </property> - <property name="text"> - <string>y</string> - </property> - </widget> - <widget class="TQCheckBox" row="0" column="2"> - <property name="name"> - <cstring>zTrace</cstring> - </property> - <property name="text"> - <string>z</string> - </property> - </widget> - </grid> - </widget> - <widget class="TQLabel" row="1" column="0"> - <property name="name"> - <cstring>textLabel1</cstring> - </property> - <property name="text"> - <string>Length:</string> - </property> - </widget> - <widget class="TQLineEdit" row="1" column="1"> - <property name="name"> - <cstring>lengthEdit</cstring> - </property> - <property name="sizePolicy"> - <sizepolicy> - <hsizetype>1</hsizetype> - <vsizetype>0</vsizetype> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="maximumSize"> - <size> - <width>40</width> - <height>32767</height> - </size> - </property> - <property name="font"> - <font> - <family>Helvetica</family> - <pointsize>11</pointsize> - </font> - </property> - <property name="maxLength"> - <number>2</number> - </property> - </widget> - </grid> - </widget> - <widget class="TQLayoutWidget"> - <property name="name"> - <cstring>layout10</cstring> - </property> - <grid> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <widget class="TQLineEdit" row="0" column="1"> - <property name="name"> - <cstring>LzEdit</cstring> - </property> - <property name="sizePolicy"> - <sizepolicy> - <hsizetype>0</hsizetype> - <vsizetype>0</vsizetype> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="maximumSize"> - <size> - <width>50</width> - <height>32767</height> - </size> - </property> - <property name="maxLength"> - <number>5</number> - </property> - </widget> - <widget class="TQLabel" row="1" column="0"> - <property name="name"> - <cstring>textLabel3</cstring> - </property> - <property name="sizePolicy"> - <sizepolicy> - <hsizetype>1</hsizetype> - <vsizetype>0</vsizetype> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>Theta:</string> - </property> - </widget> - <widget class="TQLabel" row="0" column="0"> - <property name="name"> - <cstring>textLabel2</cstring> - </property> - <property name="sizePolicy"> - <sizepolicy> - <hsizetype>0</hsizetype> - <vsizetype>0</vsizetype> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>Lz:</string> - </property> - </widget> - <widget class="TQLineEdit" row="1" column="1"> - <property name="name"> - <cstring>thetaEdit</cstring> - </property> - <property name="sizePolicy"> - <sizepolicy> - <hsizetype>0</hsizetype> - <vsizetype>0</vsizetype> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="maximumSize"> - <size> - <width>50</width> - <height>32767</height> - </size> - </property> - <property name="maxLength"> - <number>5</number> - </property> - </widget> - </grid> - </widget> - <spacer> - <property name="name"> - <cstring>spacer1</cstring> - </property> - <property name="orientation"> - <enum>Vertical</enum> - </property> - <property name="sizeType"> - <enum>Expanding</enum> - </property> - <property name="sizeHint"> - <size> - <width>31</width> - <height>51</height> - </size> - </property> - </spacer> - </vbox> - </widget> - <widget class="SsPreviewArea"> - <property name="name"> - <cstring>preview</cstring> - </property> - <property name="minimumSize"> - <size> - <width>200</width> - <height>150</height> - </size> - </property> - </widget> - </hbox> - </widget> - <widget class="TQLayoutWidget"> - <property name="name"> - <cstring>layout9</cstring> - </property> - <hbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <spacer> - <property name="name"> - <cstring>spacer2</cstring> - </property> - <property name="orientation"> - <enum>Horizontal</enum> - </property> - <property name="sizeType"> - <enum>Expanding</enum> - </property> - <property name="sizeHint"> - <size> - <width>51</width> - <height>31</height> - </size> - </property> - </spacer> - <widget class="TQLayoutWidget"> - <property name="name"> - <cstring>layout4</cstring> - </property> - <hbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <widget class="TQPushButton"> - <property name="name"> - <cstring>OkButton</cstring> - </property> - <property name="text"> - <string>&OK</string> - </property> - <property name="default"> - <bool>true</bool> - </property> - </widget> - <widget class="TQPushButton"> - <property name="name"> - <cstring>CancelButton</cstring> - </property> - <property name="text"> - <string>&Cancel</string> - </property> - </widget> - <widget class="TQPushButton"> - <property name="name"> - <cstring>AboutButton</cstring> - </property> - <property name="text"> - <string>&About</string> - </property> - </widget> - </hbox> - </widget> - <spacer> - <property name="name"> - <cstring>spacer3</cstring> - </property> - <property name="orientation"> - <enum>Horizontal</enum> - </property> - <property name="sizeType"> - <enum>Expanding</enum> - </property> - <property name="sizeHint"> - <size> - <width>61</width> - <height>31</height> - </size> - </property> - </spacer> - </hbox> - </widget> - </vbox> -</widget> -<customwidgets> - <customwidget> - <class>SsPreviewArea</class> - <header location="global">sspreviewarea.h</header> - <sizehint> - <width>-1</width> - <height>1</height> - </sizehint> - <container>0</container> - <sizepolicy> - <hordata>5</hordata> - <verdata>5</verdata> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - <pixmap>image0</pixmap> - </customwidget> -</customwidgets> -<images> - <image name="image0"> - <data format="XPM.GZ" length="4462">789c9d97c76e24490e86effd1442f3d65870d2451a0ce6206f5adeb4cc620f8c34f2553225b5a4c1befb46927fe6a1d4c0ccac4287fa8a0c26834193f5dbb785b3fd9d856fbf7d799ec9ecba5ea8afe469e15bf3727ffffeeffffcf1e797af49b2d0ffc7d142f2f55f5fbe1ecc16ea85dde9a4ed81290045faa77ca49cf4ab67ba1e3953969173651ab9d4fdf1c8a27c3872ad7c3c72d3b32c2a67c3f3444636fbef23eb7e590267e68fcc4656395d8dacf6d938ef97eaef289781cddebdb2846fccff44b989ba58e3411f3dc75158e6df1d3889539517ca49bf54fe43398d1dec4f46567f685fd9c539f43fc025f80c1c3ce8d93f28e77185f8bf0c6cfae4c0b5f9c3c6e5c0542a4b5876fe13708df39d2bd7716372aa8c93c4e4723bb2f977aadc26ceec4bdb7310e6b0bfab9c2445ecd49f1370694cebca65d260ffa6711a41aef14d24e94cee6be3348e0ae5e9c8765f07ca3e8db17f0f9c825794eb3489351fe9bb7217e4969f29388bd51ee9fda5715a19730696b852fea95c6471647ca95cf64bcf43e0cef4657b647bfe6acf213d6bb32f9a9f5992b5a64f9a8f990b6cf9ecc15d6cf9acf6b2da55a8a75cb973dee4b2d1b38b5c05de02434e87e01aacfb351df5bebddea74b5c67f9c795711ea15e357e2ecde358fb87efc0a867df8cac728a074e62e527706afb59f3cf6583be5c28bb3c35f693812d1fbdc6dbe57966fec932d899ffa4f7e38adca17e34beaeca4b9c271a18f1d5fc739257b0d70d9c68be7bed7fcee7827ab91cd8e4740cf6b19d4ffb87ab07b9bf516e72d4a3ac821b9cef6e60d84f47367ded2fae1d9f7704f6163f79000ffde27660f387ed3c5dbf54dfeebb0bf6acbe6b706bfa5ef32f8f8b18f5bf0f463f20edb77956a4e68fbc80b3c4facd163847be6bfde72ec86dbeac82715fbc0286be683cf3bc081d44f7df80d344fb0b6b7de64581fb916765297263d6fccd9b7ee97e566e8b06cfdb1f59cf2bda2f8bbc2c11df0c5c41aefdb328ca22b1feb0012eedbce24736f91b18fb796d64eb87cb60817dcdafb07d906bfd14d22f659d8785ef97b2f6d7b2df6ef1d6fb2babaac6f92e8c25b27ecc1f239b7f3a5fca5a8678ea7c2d9bc0e6ef1238b3fca2c7814d5f4cbf9334b5f833384bed3c7a5f5514f4adbe2ec07962e7590457f06f6f649b977afe2a16f42f5e070bfc591e18f7a5f1a812a9e0df39d827da4fbd8c6ccfd7785569bf945f953371a9d5a3de67950bfa2d75c63eb2fb15bdcfaaf011e6c7263846bf8f4636f91618f3c7d3c0f047fb69550efab2074e12bd6fd27957553ec33c5b043bcc7f9d0795f818fdb501a3df8ae673e507ff69021eea37063bc45ffb73550736ff36c0a84f3e0317a86f8b5f139e6ffe1f821de6d9127898ff3be00a7c3ab2cd03e3d697560ff40016e47b3bb2e96bbd559d8f32bbff4b7065f193042c98873acf240af6adbf3c83c5f2954bb0c7bcd77c107d81d2fdebc63e33ff640aaecc9e1c8151df5c803dfaadc64b52dfa03ed64636ffb4ff4b2867f453ede7227586fcd3f9264ded91fffafe236d5da37fe83c91ceb7b9e5b7f6731ff92ed7f747d6fbf7e185cf58347e3e6932e47b3430fa893edf87d795c2fc3f003b67f5f902cec17abfde0dfa3c053b3c5ffb832fc2eb8fddcf233887fc195c801f46b6f3cdc02558fba72f7d2d1a7f7e321ee58fe0cad86bbff24dd3e2fe74fef836b0c6eb60d62fa6bf5e07b3419f853dd7dc70fb8bd5f1255fd90ed30f9f3c5ff30ddff21ddff384a7fcc08ffcc4cf61cdf8855ff9e79c7e1db4dff89d3f7891977899577895d7789d377893b7f83b6fcfe937bc13b477798ff7f9800ff928ac633ee11f7cca6761d7f99c7e1b3cb908da11c7413be1943376e153cc39175c72f549ff9e17c31744429e6a6aa8a58e2ee98aaee9866e7f617fc24b7417a4f734a1293dd0233dd133cd8285177aa5f9f3b63ca5377aa78f607b919668995682e62aadd17ab0b1419b9ff41f682b48bed336edd02eed05ed7d5ea3033a0cdf1ed1f127fd273ae123fa41a774a6b685cee982228a837e42e927fd47caf8985c38651eb40b2ac38e4a5842658a97fab33fd248cb87d2c9a55cc9b5dcc82d1fc99ddccb44a6f230af2f8ff224cf417f262ff22a3fe54ddee543166549966545567f617f4dd66523dc6b2c9bb225df655b7682f692ecca9eeccfe97772c09b722847722c27c1f3eb70f66bf9116c9fca999ccbc59cfe25bf4a143a5ef8992561324a78bd92522acf9ebc78efe7cf7b153276db37bef59dbff457fedadff85b7f27abfede4ffcd4cf9ff76faeff4fffefeff8c7f5fedfdfbffc0fa355c495</data> - </image> -</images> -<connections> - <connection> - <sender>OkButton</sender> - <signal>clicked()</signal> - <receiver>KRotationSetupUi</receiver> - <slot>okButtonClickedSlot()</slot> - </connection> - <connection> - <sender>CancelButton</sender> - <signal>clicked()</signal> - <receiver>KRotationSetupUi</receiver> - <slot>close()</slot> - </connection> - <connection> - <sender>AboutButton</sender> - <signal>clicked()</signal> - <receiver>KRotationSetupUi</receiver> - <slot>aboutButtonClickedSlot()</slot> - </connection> - <connection> - <sender>randTraces</sender> - <signal>toggled(bool)</signal> - <receiver>xTrace</receiver> - <slot>setDisabled(bool)</slot> - </connection> - <connection> - <sender>xTrace</sender> - <signal>toggled(bool)</signal> - <receiver>KRotationSetupUi</receiver> - <slot>xTraceToggled(bool)</slot> - </connection> - <connection> - <sender>randTraces</sender> - <signal>toggled(bool)</signal> - <receiver>yTrace</receiver> - <slot>setDisabled(bool)</slot> - </connection> - <connection> - <sender>randTraces</sender> - <signal>toggled(bool)</signal> - <receiver>zTrace</receiver> - <slot>setDisabled(bool)</slot> - </connection> - <connection> - <sender>randTraces</sender> - <signal>toggled(bool)</signal> - <receiver>KRotationSetupUi</receiver> - <slot>randomTracesToggled(bool)</slot> - </connection> - <connection> - <sender>yTrace</sender> - <signal>toggled(bool)</signal> - <receiver>KRotationSetupUi</receiver> - <slot>yTraceToggled(bool)</slot> - </connection> - <connection> - <sender>zTrace</sender> - <signal>toggled(bool)</signal> - <receiver>KRotationSetupUi</receiver> - <slot>zTraceToggled(bool)</slot> - </connection> - <connection> - <sender>lengthEdit</sender> - <signal>textChanged(const TQString&)</signal> - <receiver>KRotationSetupUi</receiver> - <slot>lengthEnteredSlot(const TQString&)</slot> - </connection> - <connection> - <sender>LzEdit</sender> - <signal>textChanged(const TQString&)</signal> - <receiver>KRotationSetupUi</receiver> - <slot>LzEnteredSlot(const TQString&)</slot> - </connection> - <connection> - <sender>thetaEdit</sender> - <signal>textChanged(const TQString&)</signal> - <receiver>KRotationSetupUi</receiver> - <slot>thetaEnteredSlot(const TQString&)</slot> - </connection> -</connections> -<Q_SLOTS> - <slot>okButtonClickedSlot()</slot> - <slot>aboutButtonClickedSlot()</slot> - <slot>randomTracesToggled(bool)</slot> - <slot>xTraceToggled(bool)</slot> - <slot>yTraceToggled(bool)</slot> - <slot>zTraceToggled(bool)</slot> - <slot>lengthEnteredSlot(const TQString&)</slot> - <slot>LzEnteredSlot(const TQString&)</slot> - <slot>thetaEnteredSlot(const TQString&)</slot> -</Q_SLOTS> -<layoutdefaults spacing="6" margin="11"/> -<includehints> - <includehint>sspreviewarea.h</includehint> -</includehints> -</UI> diff --git a/kscreensaver/kdesavers/science.cpp b/kscreensaver/kdesavers/science.cpp deleted file mode 100644 index efa860d9..00000000 --- a/kscreensaver/kdesavers/science.cpp +++ /dev/null @@ -1,1151 +0,0 @@ -//----------------------------------------------------------------------------- -// -// kscience - screen saver for KDE -// -// Copyright (c) Rene Beutler 1998 -// - -#include <config.h> -#include <stdio.h> -#include <stdlib.h> -#include <math.h> -#include <sys/types.h> -#include <time.h> - -#include <tqpainter.h> -#include <tqpixmap.h> -#include <tqlabel.h> -#include <tqlistbox.h> -#include <tqcheckbox.h> -#include <tqslider.h> -#include <tqlayout.h> - -#include <kapplication.h> -#include <kglobal.h> -#include <kmessagebox.h> -#include <klocale.h> -#include <kconfig.h> -#include <kstandarddirs.h> -#include <krandomsequence.h> - -#include "science.h" -#include "science.moc" - -#if defined Q_WS_X11 && !defined K_WS_TQTONLY -#include <X11/Xlib.h> -#include <X11/Xutil.h> -#endif - -#define SCI_DEFAULT_MODE 0 -#define SCI_DEFAULT_MOVEX 6 -#define SCI_DEFAULT_MOVEY 8 -#define SCI_DEFAULT_SIZE 15 -#define SCI_DEFAULT_INTENSITY 4 -#define SCI_DEFAULT_SPEED 70 -#define SCI_DEFAULT_INVERSE false -#define SCI_DEFAULT_GRAVITY false -#define SCI_DEFAULT_HIDE false -#define SCI_MAX_SPEED 100 -#define SCI_MAX_MOVE 20 - -#undef Below - - -// libkscreensaver interface -extern "C" -{ - KDE_EXPORT const char *kss_applicationName = "kscience.kss"; - KDE_EXPORT const char *kss_description = I18N_NOOP( "Science Screen Saver" ); - KDE_EXPORT const char *kss_version = "2.2.0"; - - KDE_EXPORT KScreenSaver *kss_create( WId id ) - { - return new KScienceSaver( id ); - } - - KDE_EXPORT TQDialog *kss_setup() - { - return new KScienceSetup(); - } -} - -static struct { - TQString name; - bool inverseEnable; - } modeInfo[MAX_MODES]; - -enum { MODE_WHIRL=0, MODE_CURVATURE, MODE_SPHERE, MODE_WAVE, MODE_EXPONENTIAL, MODE_CONTRACTION }; - -void initModeInfo() -{ - modeInfo[MODE_WHIRL].name = i18n( "Whirl" ); - modeInfo[MODE_WHIRL].inverseEnable = true; - - modeInfo[MODE_SPHERE].name = i18n( "Sphere" ); - modeInfo[MODE_SPHERE].inverseEnable = true; - - modeInfo[MODE_EXPONENTIAL].name = i18n( "Exponential" ); - modeInfo[MODE_EXPONENTIAL].inverseEnable = false; - - modeInfo[MODE_CONTRACTION].name = i18n( "Contraction" ); - modeInfo[MODE_CONTRACTION].inverseEnable = false; - - modeInfo[MODE_WAVE].name = i18n( "Wave" ); - modeInfo[MODE_WAVE].inverseEnable = false; - - modeInfo[MODE_CURVATURE].name = i18n( "Curvature" ); - modeInfo[MODE_CURVATURE].inverseEnable = true; -} - -//----------------------------------------------------------------------------- -// KPreviewWidget -// - -KPreviewWidget::KPreviewWidget( TQWidget *parent ) : - TQWidget ( parent ) { } - -void KPreviewWidget::paintEvent( TQPaintEvent *event ) -{ - if( saver != 0 ) - saver->do_refresh( event->rect() ); -} - -void KPreviewWidget::notifySaver( KScienceSaver *s ) -{ - saver = s; -} - -//----------------------------------------------------------------------------- -// Screen Saver -// - -struct KScienceData -{ - T32bit **offset; - XImage *buffer; - XImage *xRootWin; - GC gc; -}; - -KScienceSaver::KScienceSaver( WId id, bool s, bool gP ) - : KScreenSaver( id ) -{ - d = new KScienceData; - d->gc = XCreateGC(tqt_xdisplay(), id, 0, 0); - d->xRootWin = 0; - d->buffer = 0; - - moveOn = true; - grabPixmap = gP; - setup = s; - - vx = vy = 0.0; - readSettings(); - - if( !grabPixmap ) - { - grabRootWindow(); - initialize(); - do_refresh( TQRect ( 0, 0, width(), height() ) ); - } - - connect( &timer, TQT_SIGNAL( timeout() ), TQT_SLOT( slotTimeout() ) ); - timer.start( SCI_MAX_SPEED - speed[mode] ); -} - -KScienceSaver::~KScienceSaver() -{ - timer.stop(); - releaseLens(); - if ( d->xRootWin ) - XDestroyImage( d->xRootWin ); - XFreeGC(tqt_xdisplay(), d->gc ); - delete d; -} - -void KScienceSaver::myAssert( bool term, const char *eMsg ) -{ - if( !term ) { - fprintf(stderr, "Error in KScreensaver - mode Science: %s\n", eMsg); - releaseLens(); - exit(-1); - } -} - -void KScienceSaver::initialize() -{ - KRandomSequence rnd; - initLens(); - signed int ws = (signed int) (width() - diam); - signed int hs = (signed int) (height() - diam); - - x = (ws > 0) ? (rnd.getDouble() * ws ) : 0.0; - y = (hs > 0) ? (rnd.getDouble() * hs ) : 0.0; - - xcoord = (int) x; - ycoord = (int) y; - - switch( bpp ) { - case 1 : applyLens = &KScienceSaver::applyLens8bpp; break; - case 2 : applyLens = &KScienceSaver::applyLens16bpp; break; - case 3 : applyLens = &KScienceSaver::applyLens24bpp; break; - case 4 : applyLens = &KScienceSaver::applyLens32bpp; break; - default: myAssert( false, "unsupported colordepth "\ - "(only 8, 16, 24, 32 bpp supported)" ); - } -} - -void KScienceSaver::initWhirlLens() -{ - double dx, dy, r, phi, intens; - T32bit *off; - T32bit xo, yo; - - intens = double( intensity[mode] + 1) / 5.0; - if( inverse[mode] ) - intens = -intens; - - for(int y = side-1; y >= 0; y--) - { - dy = y - origin; - off = d->offset[y] = (T32bit *) malloc(sizeof(T32bit) * side); - myAssert( off != 0, "too few memory" ); - for(int x = side-1; x >= 0; x--) - { - dx = x - origin; - r = sqrt( dx*dx + dy*dy ); - - if( r < radius ) - { - if ( dx == 0.0 ) - phi = (dy > 0.0) ? M_PI_2 :-(M_PI_2); - else - phi = atan2( dy, dx ); - phi += intens * ( radius - r ) / ( r+7.0 ); - xo = (T32bit) ( origin + r*cos( phi ) - x ); - yo = (T32bit) ( origin + r*sin( phi ) - y ); - off[x] = xo*bpp + yo*imgnext; - } - else - if( hideBG[mode] ) - off[x] = (border-y)*imgnext + (border-x)*bpp; - else - off[x] = 0; - } - } -} - -void KScienceSaver::initSphereLens() -{ - double dx, dy, r, xr, yr, phi, intens; - T32bit *off; - T32bit xo, yo; - - intens = 1.0 - double( intensity[mode] ) / 20.0; - - if( inverse[mode] ) - intens = -intens; - - for(int y = side-1; y >= 0; y--) - { - dy = y - origin; - off = d->offset[y] = (T32bit *) malloc(sizeof(T32bit) * side); - myAssert( off != 0, "too few memory" ); - for(int x = side-1; x >= 0; x--) - { - dx = x - origin; - r = sqrt( dx*dx + dy*dy ); - - if( r < radius ) - { - xr = (double) radius*cos(asin(dy/radius)); - yr = (double) radius*cos(asin(dx/radius)); - phi = (xr != 0.0) ? asin(dx/xr) : 0.0; - xo = (T32bit) (origin + intens*2.0*phi*xr / M_PI - x); - phi = (yr != 0.0) ? asin(dy/yr) : 0.0; - yo = (T32bit) (origin + intens*2.0*phi*yr / M_PI - y); - off[x] = xo*bpp + yo*imgnext; - } - else - if( hideBG[mode] ) - off[x] = (border-y)*imgnext + (border-x)*bpp; - else - off[x] = 0; - } - } -} - -void KScienceSaver::initExponentialLens() -{ - double dx, dy, r, rnew, f, intens; - T32bit *off; - T32bit xo, yo; - - if( mode == MODE_EXPONENTIAL ) - intens = - (0.1 + 0.8 * double( intensity[mode] + 2) / 10.0); - else - intens = 0.9 - 0.8 * double( intensity[mode] ) / 10.0; - - for(int y = side-1; y >= 0; y--) - { - dy = y - origin; - off = d->offset[y] = (T32bit *) malloc(sizeof(T32bit) * side); - myAssert( off != 0, "too few memory" ); - for(int x = side-1; x >= 0; x--) - { - dx = x - origin; - r = sqrt( dx*dx + dy*dy ); - - if( r < radius ) - { - if( r == 0.0 ) - f = 0.0; - else - { - rnew = radius*(pow(r, intens) / pow(radius, intens)); - f = double ((int)rnew % radius) / r; - } - xo = (T32bit) ( origin + f*dx - x ); - yo = (T32bit) ( origin + f*dy - y ); - off[x] = xo*bpp + yo*imgnext; - } - else - if( hideBG[mode] ) - off[x] = (border-y)*imgnext + (border-x)*bpp; - else - off[x] = 0; - } - } -} - -void KScienceSaver::initCurvatureLens() -{ - double dx, dy, r, f, intens; - T32bit *off; - T32bit xo, yo; - - intens = (double) radius*intensity[mode] / 20.0; - if( inverse[mode] ) intens = -intens; - - for(int y = side-1; y >= 0; y--) - { - dy = y - origin; - off = d->offset[y] = (T32bit *) malloc(sizeof(T32bit) * side); - myAssert( off != 0, "too few memory" ); - for(int x = side-1; x >= 0; x--) - { - dx = x - origin; - r = sqrt( dx*dx + dy*dy ); - - if( r < radius ) - { - if( r == 0.0 ) - f = 0.0; - else - f = (r - intens * sin(M_PI * r/(double)radius)) / r; - xo = (T32bit) ( origin + f*dx - x ); - yo = (T32bit) ( origin + f*dy - y ); - off[x] = xo*bpp + yo*imgnext; - } - else - if( hideBG[mode] ) - off[x] = (border-y)*imgnext + (border-x)*bpp; - else - off[x] = 0; - } - } -} - -void KScienceSaver::initWaveLens() -{ - double dx, dy, r, rnew, f, intens, k; - T32bit *off; - T32bit xo, yo; - - intens = (double) intensity[mode] + 1.0; - k = (intensity[mode] % 2) ? -12.0 : 12.0; - - for(int y = side-1; y >= 0; y--) - { - dy = y - origin; - off = d->offset[y] = (T32bit *) malloc(sizeof(T32bit) * side); - myAssert( off != 0, "too few memory" ); - for(int x = side-1; x >= 0; x--) - { - dx = x - origin; - r = sqrt( dx*dx + dy*dy ); - - if( r < radius ) - { - if( r == 0.0 ) - f = 0.0; - else - { - rnew = r - k * sin( M_PI * intens * r/(double)radius); - f = double ((int)rnew % radius) / r; - } - xo = (T32bit) ( origin + f*dx - x ); - yo = (T32bit) ( origin + f*dy - y ); - off[x] = xo*bpp + yo*imgnext; - } - else - if( hideBG[mode] ) - off[x] = (border-y)*imgnext + (border-x)*bpp; - else - off[x] = 0; - } - } -} - -void KScienceSaver::initLens() -{ - int min = (width() < height()) ? width() : height(); - border = 1 + SCI_MAX_MOVE; - - radius = (size[mode] * min) / 100; - if( radius<<1 == min ) radius--; - diam = radius << 1; - myAssert( diam < min, "assertion violated: diam < min" ); - origin = radius + border; - side = origin << 1; - - d->buffer = XSubImage( d->xRootWin, 0, 0, side, side ); - myAssert( d->buffer != 0, "can't allocate pixmap" ); - - d->offset = (T32bit **) malloc( sizeof(T32bit *) * side ); - myAssert( d->offset != 0, "too few memory" ); - - switch( mode ) { - case MODE_WHIRL: initWhirlLens(); break; - case MODE_SPHERE: initSphereLens(); break; - case MODE_EXPONENTIAL: - case MODE_CONTRACTION: initExponentialLens(); break; - case MODE_CURVATURE: initCurvatureLens(); break; - case MODE_WAVE: initWaveLens(); break; - default: myAssert( false, "internal error (wrong mode in initLens() )" ); - } -} - -void KScienceSaver::releaseLens() -{ - if( d->offset != 0 ) { - for(int i=0; i<side; i++) - if( d->offset[i] != 0 ) free( d->offset[i] ); - free( d->offset ); - d->offset = 0; - } - if( d->buffer != 0 ) { - XDestroyImage( d->buffer ); - d->buffer = 0; - } -} - -void KScienceSaver::setMode( int m ) -{ - timer.stop(); - - releaseLens(); - int old = mode; - mode = m; - vx = copysign( moveX[mode], vx ); - vy = copysign( moveY[mode], vy ); - int dm = diam; - initLens(); - if( hideBG[old] ^ hideBG[m] ) - do_refresh( TQRect( 0, 0, width(), height() ) ); - else - if( diam < dm ) - { - do_refresh( TQRect( (int) x+diam, (int) y, dm-diam, diam ) ); - do_refresh( TQRect( (int) x, (int) y+diam, dm, dm-diam ) ); - } - - timer.start( SCI_MAX_SPEED - speed[mode] ); -} - -void KScienceSaver::setMoveX( int s ) -{ - timer.stop(); - - moveX[mode] = s; - vx = copysign( moveX[mode], vx ); - - timer.start( SCI_MAX_SPEED - speed[mode] ); -} - -void KScienceSaver::setMoveY( int s ) -{ - timer.stop(); - - moveY[mode] = s; - vy = copysign( moveY[mode], vy ); - - timer.start( SCI_MAX_SPEED - speed[mode] ); -} - -void KScienceSaver::setMove( bool s ) -{ - moveOn = s; -} - -void KScienceSaver::setSize( int s ) -{ - timer.stop(); - - releaseLens(); - int dm = diam; - size[mode] = s; - initLens(); - if( diam < dm ) - { - do_refresh( TQRect( (int) x+diam, (int) y, dm-diam, diam ) ); - do_refresh( TQRect( (int) x, (int) y+diam, dm, dm-diam ) ); - } - - timer.start( SCI_MAX_SPEED - speed[mode] ); -} - -void KScienceSaver::setSpeed( int s ) -{ - speed[mode] = s; - - timer.changeInterval( SCI_MAX_SPEED - speed[mode] ); -} - -void KScienceSaver::setIntensity( int i ) -{ - timer.stop(); - - releaseLens(); - intensity[mode] = i; - initLens(); - - timer.start( SCI_MAX_SPEED - speed[mode]); -} - -void KScienceSaver::setInverse( bool b ) -{ - timer.stop(); - - releaseLens(); - inverse[mode] = b; - initLens(); - - timer.start( SCI_MAX_SPEED - speed[mode]); -} - -void KScienceSaver::setGravity( bool b ) -{ - timer.stop(); - - releaseLens(); - gravity[mode] = b; - vy = copysign( moveY[mode], vy ); - initLens(); - - timer.start( SCI_MAX_SPEED - speed[mode]); -} - -void KScienceSaver::setHideBG( bool b ) -{ - timer.stop(); - - releaseLens(); - hideBG[mode] = b; - initLens(); - do_refresh( TQRect( 0, 0, width(), height() ) ); - - timer.start( SCI_MAX_SPEED - speed[mode]); -} - -void KScienceSaver::readSettings() -{ - TDEConfig *config = TDEGlobal::config(); - TQString sMode; - - config->setGroup( "Settings" ); - mode = config->readNumEntry( "ModeNr", SCI_DEFAULT_MODE ); - - for(int i=0; i < MAX_MODES; i++) - { - sMode.setNum( i ); - config->setGroup( "Mode" + sMode ); - moveX[i] = config->readNumEntry( "MoveX", SCI_DEFAULT_MOVEX); - moveY[i] = config->readNumEntry( "MoveY", SCI_DEFAULT_MOVEY); - size[i] = config->readNumEntry( "Size", SCI_DEFAULT_SIZE); - speed[i] = config->readNumEntry( "Speed", SCI_DEFAULT_SPEED); - intensity[i] = config->readNumEntry( "Intensity", SCI_DEFAULT_INTENSITY); - inverse[i] = config->readBoolEntry( "Inverse", SCI_DEFAULT_INVERSE); - gravity[i] = config->readBoolEntry( "Gravity", SCI_DEFAULT_GRAVITY); - hideBG[i] = config->readBoolEntry( "HideBG", SCI_DEFAULT_HIDE); - } - - vx = copysign( moveX[mode], vx ); - vy = copysign( moveY[mode], vy ); -} - -void KScienceSaver::do_refresh( const TQRect & rect ) -{ - if( grabPixmap ) - return; - rect.normalize(); - - if( hideBG[mode] ) - { - XSetWindowBackground( tqt_xdisplay(), winId(), black.pixel() ); - XClearArea( tqt_xdisplay(), winId(), rect.left(), rect.top(), - rect.width(), rect.height(), false ); - } - else - { - myAssert( d->xRootWin != 0, "root window not grabbed" ); - XPutImage( tqt_xdisplay(), winId(), d->gc, d->xRootWin, - rect.left(), rect.top(), - rect.left(), rect.top(), - rect.width(), rect.height() ); - } -} - -void KScienceSaver::slotTimeout() -{ - if( grabPixmap ) { - if( !TQWidget::find(winId())->isActiveWindow() ) - return; - grabPreviewWidget(); - grabPixmap = false; - initialize(); - if( hideBG[mode] ) - do_refresh( TQRect ( 0, 0, width(), height() ) ); - } - - signed int oldx = xcoord, oldy = ycoord; - - if( gravity[mode] ) { - double h = double(y+1.0) / double(height()-diam); - if( h > 1.0 ) h = 1.0; - vy = sqrt( h ) * ( (vy > 0.0) ? moveY[mode] : -moveY[mode] ); - } - myAssert( abs((int)rint(vy)) <= border, "assertion violated: vy <= border" ); - - if( moveOn ) - { - x += vx; - y += vy; - } - - if( x <= 0.0 ) { - vx = -vx; - x = 0.0; - } - if( int(x) + diam >= width()) { - vx = -vx; - myAssert( width()-diam > 0, "assertion violated: width-diam > 0" ); - x = (double) (width() - diam - 1); - } - if( y <= 0.0 ) { - vy = -vy; - y = 0.0; - } - if( int(y) + diam >= height() ) { - vy = -vy; - myAssert( height() - diam > 0, "assertion violated: height-diam > 0" ); - y = (double) (height() - diam - 1); - } - - xcoord = (int) x ; - ycoord = (int) y ; - signed int dx = (signed int) xcoord - oldx; - signed int dy = (signed int) ycoord - oldy; - signed int xs, ys, xd, yd, w, h; - - if( dx > 0 ) { - w = diam+dx; - xd = oldx; - xs = border-dx; - if( dy > 0 ) { - h = diam+dy; - yd = oldy; - ys = border-dy; - } - else { - h = diam-dy; - yd = ycoord; - ys = border; - } - } - else { - w = diam-dx; - xd = xcoord; - xs = border; - if( dy > 0 ) { - h = diam+dy; - yd = oldy; - ys = border-dy; - } else { - h = diam-dy; - yd = ycoord; - ys = border; - } - } - - if( xd + w >= width() ) w = width() - xd - 1; - if( yd + h >= height() ) h = height() - yd - 1; - -//printf("%d: (dx: %3d, dy: %3d), diam: %3d, (xc: %3d, yc: %3d), (xs: %3d, ys: %3d), (xd: %3d, yd: %3d), (w: %3d, h: %3d)\n", mode, dx, dy, diam, xcoord, ycoord, xs, ys, xd, yd, w, h); - myAssert( dx <= border && dy <=border, "assertion violated: dx or dy <= border"); - myAssert( xcoord >= 0 && ycoord >= 0, "assertion violated: xcoord, ycoord >= 0 "); - myAssert( xd+w < width(), "assertion violated: xd+w < width" ); - myAssert( yd+h < height(), "assertion violated: yd+h < height" ); - - if( hideBG[mode] ) - blackPixel( xcoord, ycoord ); - (this->*applyLens)(xs, ys, xd, yd, w, h); - XPutImage( tqt_xdisplay(), winId(), d->gc, d->buffer, 0, 0, xd, yd, w, h ); - if( hideBG[mode] ) - blackPixelUndo( xcoord, ycoord ); -} - -void KScienceSaver::grabRootWindow() -{ - Display *dsp = tqt_xdisplay(); - Window rootwin = RootWindow( dsp, tqt_xscreen() ); - - // grab contents of root window - if( d->xRootWin ) - XDestroyImage( d->xRootWin ); - - d->xRootWin = XGetImage( dsp, rootwin, 0, 0, width(), - height(), AllPlanes, ZPixmap); - myAssert( d->xRootWin, "unable to grab root window\n" ); - - imgnext = d->xRootWin->bytes_per_line; - bpp = ( d->xRootWin->bits_per_pixel ) >> 3; -} - -void KScienceSaver::grabPreviewWidget() -{ - myAssert( TQWidget::find(winId())->isActiveWindow(), "can't grab preview widget: dialog not active()" ); - - if( d->xRootWin ) - XDestroyImage( d->xRootWin ); - - Display *dsp = tqt_xdisplay(); - d->xRootWin = XGetImage( dsp, winId(), 0, 0, width(), height(), AllPlanes, ZPixmap); - myAssert( d->xRootWin, "unable to grab preview window\n" ); - - imgnext = d->xRootWin->bytes_per_line; - bpp = ( d->xRootWin->bits_per_pixel ) >> 3; -} - -void KScienceSaver::blackPixel( int x, int y ) -{ - unsigned char black = (char) BlackPixel( tqt_xdisplay(), tqt_xscreen() ); - unsigned int adr = x*bpp + y*imgnext; - - for(int i=0; i<bpp; i++) { - blackRestore[i] = d->xRootWin->data[adr]; - d->xRootWin->data[adr++] = black; - } -} - -void KScienceSaver::blackPixelUndo( int x, int y ) -{ - unsigned int adr = x*bpp + y*imgnext; - for(int i=0; i<bpp; i++) - d->xRootWin->data[adr++] = blackRestore[i]; -} - -// hm.... - -void KScienceSaver::applyLens8bpp(int xs, int ys, int xd, int yd, int w, int h) -{ - T32bit *off; - char *img1, *img2, *data; - signed int ix, iy, datanext = d->buffer->bytes_per_line - w; - - img1 = d->xRootWin->data + xd + yd*imgnext; - data = d->buffer->data; - for(iy = ys; iy < ys+h; iy++) - { - off = d->offset[iy] + xs; - img2 = img1; - for(ix = w; ix > 0; ix--) - *data++ = img2++[*off++]; - img1 += imgnext; - data += datanext; - } - -} - -void KScienceSaver::applyLens16bpp(int xs, int ys, int xd, int yd, int w, int h) -{ - T32bit *off; - char *img1, *img2, *data; - int ix, iy, datanext = d->buffer->bytes_per_line - (w << 1); - - img1 = d->xRootWin->data + (xd << 1) + yd*imgnext; - data = d->buffer->data; - for(iy = ys; iy < ys+h; iy++) - { - off = d->offset[iy] + xs; - img2 = img1; - for(ix = w; ix > 0; ix--) { - *data++ = img2++[*off]; - *data++ = img2++[*off++]; - } - img1 += imgnext; - data += datanext; - } -} - -void KScienceSaver::applyLens24bpp(int xs, int ys, int xd, int yd, int w, int h) -{ - T32bit *off; - char *img1, *img2, *data; - signed int ix, iy, datanext = d->buffer->bytes_per_line - 3*w; - - img1 = d->xRootWin->data + 3*xd + yd*imgnext; - data = d->buffer->data; - for(iy = ys; iy < ys+h; iy++) - { - off = d->offset[iy] + xs; - img2 = img1; - for(ix = w; ix > 0; ix--) { - *data++ = img2++[*off]; - *data++ = img2++[*off]; - *data++ = img2++[*off++]; - } - img1 += imgnext; - data += datanext; - } -} - -void KScienceSaver::applyLens32bpp(int xs, int ys, int xd, int yd, int w, int h) -{ - T32bit *off; - char *img1, *img2, *data; - signed int ix, iy, datanext = d->buffer->bytes_per_line - (w << 2); - - img1 = d->xRootWin->data + (xd << 2) + yd*imgnext; - data = d->buffer->data; - for(iy = ys; iy < ys+h; iy++) - { - off = d->offset[iy] + xs; - img2 = img1; - for(ix = w; ix > 0; ix--) { - *data++ = img2++[*off]; - *data++ = img2++[*off]; - *data++ = img2++[*off]; - *data++ = img2++[*off++]; - } - img1 += imgnext; - data += datanext; - } -} - - -//----------------------------------------------------------------------------- - -KScienceSetup::KScienceSetup( TQWidget *parent, const char *name ) - : KDialogBase( parent, name, true, i18n( "Setup Science Screen Saver" ), - Ok|Cancel|Help, Ok, true ), saver( 0 ) -{ - readSettings(); - initModeInfo(); - - TQWidget *main = makeMainWidget(); - - TQHBoxLayout *lt = new TQHBoxLayout( main, 0, spacingHint()); - TQVBoxLayout *ltm = new TQVBoxLayout; - lt->addLayout( ltm ); - TQVBoxLayout *ltc = new TQVBoxLayout; - lt->addLayout( ltc ); - - // mode - TQLabel *label = new TQLabel( i18n("Mode:"), main ); - ltm->addWidget( label ); - - TQListBox *c = new TQListBox( main ); - for(int i = 0; i<MAX_MODES; i++) - c->insertItem( modeInfo[i].name ); - c->setCurrentItem( mode ); - c->setFixedHeight( 5 * c->fontMetrics().height() ); - connect( c, TQT_SIGNAL( highlighted( int ) ), TQT_SLOT( slotMode( int ) ) ); - ltm->addWidget( c ); - - // inverse - TQCheckBox *cbox = checkInverse = new TQCheckBox( i18n("Inverse"), main ); - cbox->setEnabled( modeInfo[mode].inverseEnable ); - cbox->setChecked( inverse[mode] ); - connect( cbox, TQT_SIGNAL( clicked() ), TQT_SLOT( slotInverse() ) ); - ltm->addWidget( cbox ); - - // gravity - cbox = checkGravity = new TQCheckBox( i18n("Gravity"), main ); - cbox->setChecked( gravity[mode] ); - connect( cbox, TQT_SIGNAL( clicked() ), TQT_SLOT( slotGravity() ) ); - ltm->addWidget( cbox ); - - // hide background - cbox = checkHideBG = new TQCheckBox( i18n("Hide background"), main ); - cbox->setChecked( hideBG[mode] ); - connect( cbox, TQT_SIGNAL( clicked() ), TQT_SLOT( slotHideBG() ) ); - ltm->addWidget( cbox ); - ltm->addStretch(); - - // size - label = new TQLabel( i18n("Size:"), main ); - ltc->addWidget( label ); - - slideSize = new TQSlider(9, 50, 5, size[mode], Qt::Horizontal, - main ); - slideSize->setMinimumSize( 90, 20 ); - slideSize->setTickmarks(TQSlider::Below); - slideSize->setTickInterval(5); - connect( slideSize, TQT_SIGNAL( sliderMoved( int ) ), - TQT_SLOT( slotSize( int ) ) ); - connect( slideSize, TQT_SIGNAL( sliderPressed() ), - TQT_SLOT( slotSliderPressed() ) ); - connect( slideSize, TQT_SIGNAL( sliderReleased() ), - TQT_SLOT( slotSliderReleased() ) ); - - ltc->addWidget( slideSize ); - - // intensity - label = new TQLabel( i18n("Intensity:"), main ); - ltc->addWidget( label ); - - slideIntensity = new TQSlider(0, 10, 1, intensity[mode], - Qt::Horizontal, main ); - slideIntensity->setMinimumSize( 90, 20 ); - slideIntensity->setTickmarks(TQSlider::Below); - slideIntensity->setTickInterval(1); - connect( slideIntensity, TQT_SIGNAL( sliderMoved( int ) ), - TQT_SLOT( slotIntensity( int )) ); - connect( slideIntensity, TQT_SIGNAL( sliderPressed() ), - TQT_SLOT( slotSliderPressed() ) ); - connect( slideIntensity, TQT_SIGNAL( sliderReleased() ), - TQT_SLOT( slotSliderReleased() ) ); - ltc->addWidget( slideIntensity ); - - // speed - label = new TQLabel( i18n("Speed:"), main ); - ltc->addWidget( label ); - - slideSpeed = new TQSlider(0, SCI_MAX_SPEED, 10, speed[mode], - Qt::Horizontal, main ); - slideSpeed->setMinimumSize( 90, 20 ); - slideSpeed->setTickmarks(TQSlider::Below); - slideSpeed->setTickInterval(10); - connect( slideSpeed, TQT_SIGNAL( sliderMoved( int ) ), - TQT_SLOT( slotSpeed( int ) ) ); - ltc->addWidget( slideSpeed ); - - // motion - label = new TQLabel( i18n("Motion:"), main ); - ltc->addWidget( label ); - - TQHBoxLayout *ltcm = new TQHBoxLayout; - ltc->addLayout( ltcm ); - - slideMoveX = new TQSlider(0, SCI_MAX_MOVE, 5, moveX[mode], - Qt::Horizontal, main ); - slideMoveX->setMinimumSize( 40, 20 ); - slideMoveX->setTickmarks(TQSlider::Below); - slideMoveX->setTickInterval(5); - connect( slideMoveX, TQT_SIGNAL( sliderMoved( int ) ), - TQT_SLOT( slotMoveX( int ) ) ); - ltcm->addWidget( slideMoveX ); - - slideMoveY = new TQSlider(0, SCI_MAX_MOVE, 5, moveY[mode], - Qt::Horizontal, main ); - slideMoveY->setMinimumSize( 40, 20 ); - slideMoveY->setTickmarks(TQSlider::Below); - slideMoveY->setTickInterval(5); - connect( slideMoveY, TQT_SIGNAL( sliderMoved( int ) ), - TQT_SLOT( slotMoveY( int ) ) ); - ltcm->addWidget( slideMoveY ); - - ltc->addStretch(); - - // preview - preview = new KPreviewWidget( main ); - preview->setFixedSize( 220, 170 ); - TQPixmap p( locate("data", "kscreensaver/pics/kscience.png") ); - if( p.isNull() ) - preview->setBackgroundColor( black ); - else - preview->setBackgroundPixmap( p ); - preview->show(); // otherwise saver does not get correct size - lt->addWidget( preview ); - - // let the preview window display before creating the saver - kapp->processEvents(); - - saver = new KScienceSaver( preview->winId(), true, !p.isNull() ); - preview->notifySaver( saver ); -} - -KScienceSetup::~KScienceSetup() -{ - delete saver; // be sure to delete this first -} - -void KScienceSetup::updateSettings() -{ - // update dialog - slideMoveX ->setValue( moveX[mode] ); - slideMoveY ->setValue( moveY[mode] ); - slideSize ->setValue( size[mode] ); - slideSpeed ->setValue( speed[mode] ); - slideIntensity->setValue( intensity[mode] ); - checkInverse ->setEnabled( modeInfo[mode].inverseEnable ); - checkInverse ->setChecked( inverse[mode] ); - checkGravity ->setChecked( gravity[mode] ); - checkHideBG ->setChecked( hideBG[mode] ); -} - -// read settings from config file -void KScienceSetup::readSettings() -{ - TDEConfig *config = TDEGlobal::config(); - TQString sMode; - - config->setGroup( "Settings" ); - mode = config->readNumEntry( "ModeNr", SCI_DEFAULT_MODE ); - - for(int i=0; i < MAX_MODES; i++) - { - sMode.setNum( i ); - config->setGroup( "Mode" + sMode ); - moveX[i] = config->readNumEntry( "MoveX", SCI_DEFAULT_MOVEX); - moveY[i] = config->readNumEntry( "MoveY", SCI_DEFAULT_MOVEY); - size[i] = config->readNumEntry( "Size", SCI_DEFAULT_SIZE); - speed[i] = config->readNumEntry( "Speed", SCI_DEFAULT_SPEED); - intensity[i] = config->readNumEntry( "Intensity", SCI_DEFAULT_INTENSITY); - inverse[i] = config->readBoolEntry( "Inverse", SCI_DEFAULT_INVERSE); - gravity[i] = config->readBoolEntry( "Gravity", SCI_DEFAULT_GRAVITY); - hideBG[i] = config->readBoolEntry( "HideBG", SCI_DEFAULT_HIDE); - } -} - -void KScienceSetup::slotMode( int m ) -{ - mode = m; - - if( saver ) - saver->setMode( mode ); - - updateSettings(); -} - -void KScienceSetup::slotInverse( ) -{ - inverse[mode] = checkInverse->isChecked(); - - if( saver ) - saver->setInverse( inverse[mode] ); -} - -void KScienceSetup::slotGravity( ) -{ - gravity[mode] = checkGravity->isChecked(); - - if( saver ) - saver->setGravity( gravity[mode] ); -} - -void KScienceSetup::slotHideBG( ) -{ - hideBG[mode] = checkHideBG->isChecked(); - - if( saver ) - saver->setHideBG( hideBG[mode] ); -} - -void KScienceSetup::slotMoveX( int x ) -{ - moveX[mode] = x; - - if( saver ) - saver->setMoveX( x ); -} - -void KScienceSetup::slotMoveY( int y ) -{ - moveY[mode] = y; - - if( saver ) - saver->setMoveY( y ); -} - -void KScienceSetup::slotSize( int s ) -{ - size[mode] = s; - - if( saver ) - saver->setSize( s ); -} - -void KScienceSetup::slotSpeed( int s ) -{ - speed[mode] = s; - - if( saver ) - saver->setSpeed( s ); -} - -void KScienceSetup::slotIntensity( int i ) -{ - intensity[mode] = i; - - if( saver ) - saver->setIntensity( i ); -} - -void KScienceSetup::slotSliderPressed() -{ - if( saver ) - saver->setMove( false ); -} - -void KScienceSetup::slotSliderReleased() -{ - if( saver ) - saver->setMove( true ); -} - -// Ok pressed - save settings and exit -void KScienceSetup::slotOk() -{ - TDEConfig *config = TDEGlobal::config(); - TQString sSize, sSpeed, sIntensity, sMode; - - config->setGroup( "Settings" ); - config->writeEntry( "ModeNr", mode ); - - for(int i=0; i<MAX_MODES; i++) - { - sMode.setNum( i ); - config->setGroup( "Mode" + sMode ); - config->writeEntry( "MoveX", moveX[i] ); - config->writeEntry( "MoveY", moveY[i] ); - config->writeEntry( "Size", size[i] ); - config->writeEntry( "Speed", speed[i] ); - config->writeEntry( "Intensity", intensity[i] ); - config->writeEntry( "Inverse", inverse[i] ); - config->writeEntry( "Gravity", gravity[i] ); - config->writeEntry( "HideBG", hideBG[i] ); - } - - config->sync(); - - accept(); -} - -void KScienceSetup::slotHelp() -{ - TQString about = i18n("Science Version 0.26.5\n\nWritten by Rene Beutler (1998)\[email protected]"); - KMessageBox::about(this, - about); -} diff --git a/kscreensaver/kdesavers/science.h b/kscreensaver/kdesavers/science.h deleted file mode 100644 index d0a050dd..00000000 --- a/kscreensaver/kdesavers/science.h +++ /dev/null @@ -1,151 +0,0 @@ -// ---------------------------------------------------------------- -// -// kscience - screen saver for KDE -// -// copyright (c) Rene Beutler 1998 -// - -#ifndef __SCIENCE_H__ -#define __SCIENCE_H__ - -#include <tqrect.h> -#include <tqtimer.h> -#include <kdialogbase.h> -#include <kscreensaver.h> - -class TQSlider; -class TQCheckBox; - -#define MAX_MODES 6 - -typedef signed int T32bit; - -class KScienceSaver; - -class KPreviewWidget : public TQWidget -{ - Q_OBJECT - -public: - KPreviewWidget( TQWidget *parent ); - void paintEvent( TQPaintEvent *event ); - void notifySaver( KScienceSaver *s = 0 ); -private: - KScienceSaver *saver; -}; - -struct KScienceData; - -class KScienceSaver : public KScreenSaver -{ - Q_OBJECT - -public: - KScienceSaver( WId id, bool setup=false, bool gP=false); - virtual ~KScienceSaver(); - - void do_refresh( const TQRect & rect ); - void setMode ( int mode ); - void setMoveX ( signed int s ); - void setMoveY ( signed int s ); - void setMove ( bool s ); - void setSize ( signed int s ); - void setIntensity ( signed int s ); - void setSpeed ( signed int s ); - void setInverse ( bool b ); - void setGravity ( bool b ); - void setHideBG ( bool b ); - - void myAssert( bool term, const char *sMsg ); - -private: - void readSettings(); - void initLens(); - void initialize(); - void releaseLens(); - void (KScienceSaver::*applyLens)(int xs, int ys, int xd, int yd, int w, int h); - -protected slots: - void slotTimeout(); - -protected: - void grabRootWindow(); - void grabPreviewWidget(); - void initWhirlLens(); - void initSphereLens(); - void initExponentialLens(); - void initWaveLens(); - void initCurvatureLens(); - void blackPixel( int x, int y ); - void blackPixelUndo( int x, int y); - void applyLens8bpp( int xs, int ys, int xd, int yd, int w, int h); - void applyLens16bpp(int xs, int ys, int xd, int yd, int w, int h); - void applyLens24bpp(int xs, int ys, int xd, int yd, int w, int h); - void applyLens32bpp(int xs, int ys, int xd, int yd, int w, int h); - TQTimer timer; - bool moveOn; - bool setup; - bool grabPixmap; - int mode; - bool inverse[MAX_MODES]; - bool gravity[MAX_MODES]; - bool hideBG[MAX_MODES]; - signed int size[MAX_MODES]; - signed int moveX[MAX_MODES]; - signed int moveY[MAX_MODES]; - signed int speed[MAX_MODES]; - signed int intensity[MAX_MODES]; - int xcoord, ycoord; - double x, y, vx, vy; - signed int bpp, side; - int border, radius, diam, origin; - int imgnext; - char blackRestore[4]; - KScienceData *d; -}; - - -class KScienceSetup : public KDialogBase -{ - Q_OBJECT - -public: - KScienceSetup(TQWidget *parent=0, const char *name=0); - ~KScienceSetup(); -protected: - void updateSettings(); - void readSettings(); - -private slots: - void slotMode( int ); - void slotInverse(); - void slotGravity(); - void slotHideBG(); - void slotMoveX( int ); - void slotMoveY( int ); - void slotSize( int ); - void slotIntensity( int ); - void slotSliderPressed(); - void slotSliderReleased(); - void slotSpeed( int ); - void slotOk(); - void slotHelp(); - -private: - KPreviewWidget *preview; - KScienceSaver *saver; - TQSlider *slideSize, *slideSpeed, *slideIntensity; - TQSlider *slideMoveX, *slideMoveY; - TQCheckBox *checkInverse, *checkGravity, *checkHideBG; - - int mode; - bool inverse [MAX_MODES]; - bool gravity [MAX_MODES]; - bool hideBG [MAX_MODES]; - int moveX [MAX_MODES]; - int moveY [MAX_MODES]; - int size [MAX_MODES]; - int intensity[MAX_MODES]; - int speed [MAX_MODES]; -}; -#endif diff --git a/kscreensaver/kdesavers/slideshow.cpp b/kscreensaver/kdesavers/slideshow.cpp deleted file mode 100644 index a3179b5f..00000000 --- a/kscreensaver/kdesavers/slideshow.cpp +++ /dev/null @@ -1,1022 +0,0 @@ -/* Slide Show Screen Saver - * (C) 1999 Stefan Taferner <[email protected]> - * (C) 2001 Martin R. Jones <[email protected]> - * (C) 2003 Chris Howells <[email protected]> - * (C) 2003 Sven Leiber <[email protected]> - * - * This code is under GPL - * - * 2001/03/04 Converted to libkscreensaver by Martin R. Jones. - */ - - -#include <tqdir.h> -#include <tqcolor.h> -#include <tqlabel.h> -#include <tqlayout.h> -#include <tqfile.h> -#include <tqpaintdevicemetrics.h> -#include <tqcheckbox.h> -#include <tqcombobox.h> -#include <tqspinbox.h> -#include <tqframe.h> -#include <tqdesktopwidget.h> - -#include <kconfig.h> -#include <kglobal.h> -#include <kapplication.h> -#include <klocale.h> -#include <kmessagebox.h> -#include <kimageio.h> -#include <kfiledialog.h> -#include <kstandarddirs.h> -#include <kurlrequester.h> -#include <kaboutdata.h> -#include <kaboutapplication.h> -#include <kdebug.h> - -#include <stdlib.h> -#include <assert.h> -#include <math.h> -#include <time.h> - -#include "slideshow.h" -#include "slideshow.moc" -#include "slideshowcfg.h" - - -#define SLIDESHOW_VERSION "2.3.0" -static const char version[] = SLIDESHOW_VERSION; -static const char description[] = I18N_NOOP("KSlideshow"); - - -// libkscreensaver interface -extern "C" -{ - KDE_EXPORT const char *kss_applicationName = "kslideshow.kss"; - KDE_EXPORT const char *kss_description = I18N_NOOP( "KSlideshow" ); - KDE_EXPORT const char *kss_version = SLIDESHOW_VERSION; - - KDE_EXPORT KScreenSaver *kss_create( WId id ) - { - return new kSlideShowSaver( id ); - } - - KDE_EXPORT TQDialog *kss_setup() - { - return new kSlideShowSetup(); - } -} - - -//============================================================================= -// Class kSlideShowSaver -//============================================================================= -kSlideShowSaver::kSlideShowSaver( WId id ): KScreenSaver(id) -{ - KImageIO::registerFormats(); - - blank(); - - mEffect = NULL; - mNumEffects = 0; - mIntArray = NULL; - registerEffects(); - - readConfig(); - initNextScreen(); - - mFileIdx = 0; - mColorContext = TQColor::enterAllocContext(); - - mEffectRunning = false; - - mTimer.start(10, true); - connect(&mTimer, TQT_SIGNAL(timeout()), TQT_SLOT(slotTimeout())); - - TQDesktopWidget *d = TQApplication::desktop(); - if( geometry() == d->geometry() && d->numScreens() > 1) - { - for(int i = 0; i < d->numScreens(); ++i) - { - TQRect s = d->screenGeometry(i); - mGeoList.append(new mScreenGeo(s.width(), s.height(), s.topLeft().x(), s.topLeft().y())); - } - } - else - { - mGeoList.append(new mScreenGeo(width(), height(), 0, 0 )); - } - createNextScreen(); -} - - -//---------------------------------------------------------------------------- -kSlideShowSaver::~kSlideShowSaver() -{ - delete [] mIntArray; - delete [] mEffectList; - - mTimer.stop(); - if (mPainter.isActive()) mPainter.end(); - TQColor::leaveAllocContext(); - TQColor::destroyAllocContext(mColorContext); -} - - -//----------------------------------------------------------------------------- -void kSlideShowSaver::initNextScreen() -{ - TQPaintDeviceMetrics metric(this); - int w, h; - - w = width(); - h = height(); - mNextScreen = TQPixmap(w, h, metric.depth()); -} - - -//----------------------------------------------------------------------------- -void kSlideShowSaver::readConfig() -{ - TDEConfig *config = TDEGlobal::config(); - config->setGroup("Settings"); - mShowRandom = config->readBoolEntry("ShowRandom", true); - mZoomImages = config->readBoolEntry("ZoomImages", false); - mPrintName = config->readBoolEntry("PrintName", true); - mDirectory = config->readPathEntry("Directory", TDEGlobal::dirs()->findDirs("wallpaper", "").last()); - mDelay = config->readNumEntry("Delay", 10) * 1000; - mSubdirectory = config->readBoolEntry("SubDirectory", false); - mRandomPosition = config->readBoolEntry("RandomPosition", false); - - loadDirectory(); -} - - -//---------------------------------------------------------------------------- -void kSlideShowSaver::registerEffects() -{ - int i = 0; - - mEffectList = new EffectMethod[64]; - mEffectList[i++] = &kSlideShowSaver::effectChessboard; - mEffectList[i++] = &kSlideShowSaver::effectMultiCircleOut; - mEffectList[i++] = &kSlideShowSaver::effectSpiralIn; - mEffectList[i++] = &kSlideShowSaver::effectSweep; - mEffectList[i++] = &kSlideShowSaver::effectMeltdown; - mEffectList[i++] = &kSlideShowSaver::effectCircleOut; - mEffectList[i++] = &kSlideShowSaver::effectBlobs; - mEffectList[i++] = &kSlideShowSaver::effectHorizLines; - mEffectList[i++] = &kSlideShowSaver::effectVertLines; - mEffectList[i++] = &kSlideShowSaver::effectRandom; - mEffectList[i++] = &kSlideShowSaver::effectGrowing; - mEffectList[i++] = &kSlideShowSaver::effectIncomingEdges; - - mNumEffects = i; - // mNumEffects = 1; //...for testing -} - - -//---------------------------------------------------------------------------- -int kSlideShowSaver::effectMultiCircleOut(bool aInit) -{ - int x, y, i; - double alpha; - static TQPointArray pa(4); - - if (aInit) - { - startPainter(); - mw = width(); - mh = height(); - mx = mw; - my = mh>>1; - pa.setPoint(0, mw>>1, mh>>1); - pa.setPoint(3, mw>>1, mh>>1); - mfy = sqrt((double)mw*mw + mh*mh) / 2; - mi = TDEApplication::random()%15 + 2; - mfd = M_PI*2/mi; - mAlpha = mfd; - mwait = 10 * mi; - mfx = M_PI/32; // divisor must be powers of 8 - } - - if (mAlpha < 0) - { - mPainter.end(); - showNextScreen(); - return -1; - } - - for (alpha=mAlpha, i=mi; i>=0; i--, alpha+=mfd) - { - x = (mw>>1) + (int)(mfy * cos(-alpha)); - y = (mh>>1) + (int)(mfy * sin(-alpha)); - - mx = (mw>>1) + (int)(mfy * cos(-alpha + mfx)); - my = (mh>>1) + (int)(mfy * sin(-alpha + mfx)); - - pa.setPoint(1, x, y); - pa.setPoint(2, mx, my); - - mPainter.drawPolygon(pa); - } - mAlpha -= mfx; - - return mwait; -} - - -//---------------------------------------------------------------------------- -int kSlideShowSaver::effectSpiralIn(bool aInit) -{ - if (aInit) - { - startPainter(); - mw = width(); - mh = height(); - mix = mw / 8; - miy = mh / 8; - mx0 = 0; - mx1 = mw - mix; - my0 = miy; - my1 = mh - miy; - mdx = mix; - mdy = 0; - mi = 0; - mj = 16 * 16; - mx = 0; - my = 0; - } - - if (mi==0 && mx0>=mx1) - { - mPainter.end(); - showNextScreen(); - return -1; - } - - if (mi==0 && mx>=mx1) // switch to: down on right side - { - mi = 1; - mdx = 0; - mdy = miy; - mx1 -= mix; - } - else if (mi==1 && my>=my1) // switch to: right to left on bottom side - { - mi = 2; - mdx = -mix; - mdy = 0; - my1 -= miy; - } - else if (mi==2 && mx<=mx0) // switch to: up on left side - { - mi = 3; - mdx = 0; - mdy = -miy; - mx0 += mix; - } - else if (mi==3 && my<=my0) // switch to: left to right on top side - { - mi = 0; - mdx = mix; - mdy = 0; - my0 += miy; - } - - bitBlt(TQT_TQPAINTDEVICE(this), mx, my, TQT_TQPAINTDEVICE(&mNextScreen), mx, my, mix, miy, CopyROP, true); - - mx += mdx; - my += mdy; - mj--; - - return 8; -} - - -//---------------------------------------------------------------------------- -int kSlideShowSaver::effectMeltdown(bool aInit) -{ - int i, x, y; - bool done; - - if (aInit) - { - delete [] mIntArray; - mw = width(); - mh = height(); - mdx = 4; - mdy = 16; - mix = mw / mdx; - mIntArray = new int[mix]; - for (i=mix-1; i>=0; i--) - mIntArray[i] = 0; - } - - done = true; - for (i=0,x=0; i<mix; i++,x+=mdx) - { - y = mIntArray[i]; - if (y >= mh) continue; - done = false; - if ((TDEApplication::random()&15) < 6) continue; - bitBlt(TQT_TQPAINTDEVICE(this), x, y+mdy, TQT_TQPAINTDEVICE(this), x, y, mdx, mh-y-mdy, CopyROP, true); - bitBlt(TQT_TQPAINTDEVICE(this), x, y, TQT_TQPAINTDEVICE(&mNextScreen), x, y, mdx, mdy, CopyROP, true); - mIntArray[i] += mdy; - } - - if (done) - { - delete [] mIntArray; - mIntArray = NULL; - return -1; - } - - return 15; -} - - -//---------------------------------------------------------------------------- -int kSlideShowSaver::effectCircleOut(bool aInit) -{ - int x, y; - static TQPointArray pa(4); - - if (aInit) - { - startPainter(); - mw = width(); - mh = height(); - mx = mw; - my = mh>>1; - mAlpha = 2*M_PI; - pa.setPoint(0, mw>>1, mh>>1); - pa.setPoint(3, mw>>1, mh>>1); - mfx = M_PI/16; // divisor must be powers of 8 - mfy = sqrt((double)mw*mw + mh*mh) / 2; - } - - if (mAlpha < 0) - { - mPainter.end(); - showNextScreen(); - return -1; - } - - x = mx; - y = my; - mx = (mw>>1) + (int)(mfy * cos(mAlpha)); - my = (mh>>1) + (int)(mfy * sin(mAlpha)); - mAlpha -= mfx; - - pa.setPoint(1, x, y); - pa.setPoint(2, mx, my); - - mPainter.drawPolygon(pa); - - return 20; -} - - -//---------------------------------------------------------------------------- -int kSlideShowSaver::effectSweep(bool aInit) -{ - int w, h, x, y, i; - - if (aInit) - { - // subtype: 0=sweep right to left, 1=sweep left to right - // 2=sweep bottom to top, 3=sweep top to bottom - mSubType = TDEApplication::random() % 4; - mw = width(); - mh = height(); - mdx = (mSubType==1 ? 16 : -16); - mdy = (mSubType==3 ? 16 : -16); - mx = (mSubType==1 ? 0 : mw); - my = (mSubType==3 ? 0 : mh); - } - - if (mSubType==0 || mSubType==1) - { - // horizontal sweep - if ((mSubType==0 && mx < -64) || - (mSubType==1 && mx > mw+64)) - { - return -1; - } - for (w=2,i=4,x=mx; i>0; i--, w<<=1, x-=mdx) - { - bitBlt(TQT_TQPAINTDEVICE(this), x, 0, TQT_TQPAINTDEVICE(&mNextScreen), x, 0, w, mh, CopyROP, true); - } - mx += mdx; - } - else - { - // vertical sweep - if ((mSubType==2 && my < -64) || - (mSubType==3 && my > mh+64)) - { - return -1; - } - for (h=2,i=4,y=my; i>0; i--, h<<=1, y-=mdy) - { - bitBlt(TQT_TQPAINTDEVICE(this), 0, y, TQT_TQPAINTDEVICE(&mNextScreen), 0, y, mw, h, CopyROP, true); - } - my += mdy; - } - - return 20; -} - - -//---------------------------------------------------------------------------- -int kSlideShowSaver::effectBlobs(bool aInit) -{ - int r; - - if (aInit) - { - startPainter(); - mAlpha = M_PI * 2; - mw = width(); - mh = height(); - mi = 150; - } - - if (mi <= 0) - { - mPainter.end(); - showNextScreen(); - return -1; - } - - mx = TDEApplication::random() % mw; - my = TDEApplication::random() % mh; - r = (TDEApplication::random() % 200) + 50; - - mPainter.drawEllipse(mx-r, my-r, r, r); - mi--; - - return 10; -} - - -//---------------------------------------------------------------------------- -int kSlideShowSaver::effectRandom(bool /*aInit*/) -{ - int x, y, i, w, h, fact, sz; - - fact = (TDEApplication::random() % 3) + 1; - - w = width() >> fact; - h = height() >> fact; - sz = 1 << fact; - - for (i = (w*h)<<1; i > 0; i--) - { - x = (TDEApplication::random() % w) << fact; - y = (TDEApplication::random() % h) << fact; - bitBlt(TQT_TQPAINTDEVICE(this), x, y, TQT_TQPAINTDEVICE(&mNextScreen), x, y, sz, sz, CopyROP, true); - } - showNextScreen(); - - return -1; -} - - -//---------------------------------------------------------------------------- -int kSlideShowSaver::effectGrowing(bool aInit) -{ - if (aInit) - { - mw = width(); - mh = height(); - mx = mw >> 1; - my = mh >> 1; - mi = 0; - mfx = mx / 100.0; - mfy = my / 100.0; - } - - mx = (mw>>1) - (int)(mi * mfx); - my = (mh>>1) - (int)(mi * mfy); - mi++; - - if (mx<0 || my<0) - { - showNextScreen(); - return -1; - } - - bitBlt(TQT_TQPAINTDEVICE(this), mx, my, TQT_TQPAINTDEVICE(&mNextScreen), mx, my, - mw - (mx<<1), mh - (my<<1), CopyROP, true); - - return 20; -} - - -//---------------------------------------------------------------------------- -int kSlideShowSaver::effectChessboard(bool aInit) -{ - int y; - - if (aInit) - { - mw = width(); - mh = height(); - mdx = 8; // width of one tile - mdy = 8; // height of one tile - mj = (mw+mdx-1)/mdx; // number of tiles - mx = mj*mdx; // shrinking x-offset from screen border - mix = 0; // growing x-offset from screen border - miy = 0; // 0 or mdy for growing tiling effect - my = mj&1 ? 0 : mdy; // 0 or mdy for shrinking tiling effect - mwait = 800 / mj; // timeout between effects - } - - if (mix >= mw) - { - showNextScreen(); - return -1; - } - - mix += mdx; - mx -= mdx; - miy = miy ? 0 : mdy; - my = my ? 0 : mdy; - - for (y=0; y<mw; y+=(mdy<<1)) - { - bitBlt(TQT_TQPAINTDEVICE(this), mix, y+miy, TQT_TQPAINTDEVICE(&mNextScreen), mix, y+miy, - mdx, mdy, CopyROP, true); - bitBlt(TQT_TQPAINTDEVICE(this), mx, y+my, TQT_TQPAINTDEVICE(&mNextScreen), mx, y+my, - mdx, mdy, CopyROP, true); - } - - return mwait; -} - - -//---------------------------------------------------------------------------- -int kSlideShowSaver::effectIncomingEdges(bool aInit) -{ - int x1, y1; - - if (aInit) - { - mw = width(); - mh = height(); - mix = mw >> 1; - miy = mh >> 1; - mfx = mix / 100.0; - mfy = miy / 100.0; - mi = 0; - mSubType = TDEApplication::random() & 1; - } - - mx = (int)(mfx * mi); - my = (int)(mfy * mi); - - if (mx>mix || my>miy) - { - showNextScreen(); - return -1; - } - - x1 = mw - mx; - y1 = mh - my; - mi++; - - if (mSubType) - { - // moving image edges - bitBlt(TQT_TQPAINTDEVICE(this), 0, 0, TQT_TQPAINTDEVICE(&mNextScreen), mix-mx, miy-my, mx, my, CopyROP, true); - bitBlt(TQT_TQPAINTDEVICE(this), x1, 0, TQT_TQPAINTDEVICE(&mNextScreen), mix, miy-my, mx, my, CopyROP, true); - bitBlt(TQT_TQPAINTDEVICE(this), 0, y1, TQT_TQPAINTDEVICE(&mNextScreen), mix-mx, miy, mx, my, CopyROP, true); - bitBlt(TQT_TQPAINTDEVICE(this), x1, y1, TQT_TQPAINTDEVICE(&mNextScreen), mix, miy, mx, my, CopyROP, true); - } - else - { - // fixed image edges - bitBlt(TQT_TQPAINTDEVICE(this), 0, 0, TQT_TQPAINTDEVICE(&mNextScreen), 0, 0, mx, my, CopyROP, true); - bitBlt(TQT_TQPAINTDEVICE(this), x1, 0, TQT_TQPAINTDEVICE(&mNextScreen), x1, 0, mx, my, CopyROP, true); - bitBlt(TQT_TQPAINTDEVICE(this), 0, y1, TQT_TQPAINTDEVICE(&mNextScreen), 0, y1, mx, my, CopyROP, true); - bitBlt(TQT_TQPAINTDEVICE(this), x1, y1, TQT_TQPAINTDEVICE(&mNextScreen), x1, y1, mx, my, CopyROP, true); - } - return 20; -} - - -//---------------------------------------------------------------------------- -int kSlideShowSaver::effectHorizLines(bool aInit) -{ - static int iyPos[] = { 0, 4, 2, 6, 1, 5, 3, 7, -1 }; - int y; - - if (aInit) - { - mw = width(); - mh = height(); - mi = 0; - } - - if (iyPos[mi] < 0) return -1; - - for (y=iyPos[mi]; y<mh; y+=8) - { - bitBlt(TQT_TQPAINTDEVICE(this), 0, y, TQT_TQPAINTDEVICE(&mNextScreen), 0, y, mw, 1, CopyROP, true); - } - - mi++; - if (iyPos[mi] >= 0) return 160; - return -1; -} - - -//---------------------------------------------------------------------------- -int kSlideShowSaver::effectVertLines(bool aInit) -{ - static int ixPos[] = { 0, 4, 2, 6, 1, 5, 3, 7, -1 }; - int x; - - if (aInit) - { - mw = width(); - mh = height(); - mi = 0; - } - - if (ixPos[mi] < 0) return -1; - - for (x=ixPos[mi]; x<mw; x+=8) - { - bitBlt(TQT_TQPAINTDEVICE(this), x, 0, TQT_TQPAINTDEVICE(&mNextScreen), x, 0, 1, mh, CopyROP, true); - } - - mi++; - if (ixPos[mi] >= 0) return 160; - return -1; -} - - -//----------------------------------------------------------------------------- -void kSlideShowSaver::startPainter(TQt::PenStyle aPen) -{ - TQBrush brush; - brush.setPixmap(mNextScreen); - if (mPainter.isActive()) mPainter.end(); - mPainter.begin(this); - mPainter.setBrush(brush); - mPainter.setPen(aPen); -} - - -//----------------------------------------------------------------------------- -void kSlideShowSaver::restart() -{ - mEffectRunning = false; - mEffect = NULL; - blank(); - slotTimeout(); -} - - -//----------------------------------------------------------------------------- -void kSlideShowSaver::slotTimeout() -{ - int tmout = -1; - int i; - - if (mEffectRunning) - { - tmout = (this->*mEffect)(false); - } - else - { - loadNextImage(); - createNextScreen(); - - if (mNumEffects > 1) i = TDEApplication::random() % mNumEffects; - else i = 0; - - mEffect = mEffectList[i]; - mEffectRunning = true; - tmout = (this->*mEffect)(true); - } - if (tmout <= 0) - { - tmout = mDelay; - mEffectRunning = false; - } - mTimer.start(tmout, true); -} - - -//---------------------------------------------------------------------------- -void kSlideShowSaver::showNextScreen() -{ - bitBlt(TQT_TQPAINTDEVICE(this), 0, 0, TQT_TQPAINTDEVICE(&mNextScreen), 0, 0, - mNextScreen.width(), mNextScreen.height(), CopyROP, true); -} - - -//---------------------------------------------------------------------------- -void kSlideShowSaver::createNextScreen() -{ - TQPainter p; - int ww, wh, iw, ih, x, y; - double fx, fy; - - if (mNextScreen.size() != size()) - mNextScreen.resize(size()); - - mNextScreen.fill(black); - - p.begin(&mNextScreen); - - mScreenGeo *geoptr = 0; - for(geoptr = mGeoList.first(); geoptr; geoptr = mGeoList.next()) - { - loadNextImage(); - - iw = mImage.width(); - ih = mImage.height(); - ww = geoptr->mW; - wh = geoptr->mH; - - if (mFileList.isEmpty()) - { - p.setPen(TQColor("white")); - p.drawText(20 + (TDEApplication::random() % (ww>>1)), 20 + (TDEApplication::random() % (wh>>1)), - i18n("No images found")); - } - else - { - if (mZoomImages) - { - fx = (double)ww / iw; - fy = (double)wh / ih; - if (fx > fy) fx = fy; - if (fx > 2) fx = 2; - iw = (int)(iw * fx); - ih = (int)(ih * fx); - TQImage scaledImg = mImage.smoothScale(iw, ih); - - x = ((ww - iw) >> 1) + geoptr->mXorg; - y = ((wh - ih) >> 1) + geoptr->mYorg; - - p.drawImage(x, y, scaledImg); - } - else - { - if(iw >= ww || ih >= wh) - { - fx = (double)ww / iw; - fy = (double)wh / ih; - if (fx > fy) fx = fy; - if (fx > 2) fx = 2; - iw = (int)(iw * fx); - ih = (int)(ih * fx); - TQImage scaledImg = mImage.smoothScale(iw, ih); - - x = ((ww - iw) >> 1) + geoptr->mXorg; - y = ((wh - ih) >> 1) + geoptr->mYorg; - - p.drawImage(x, y, scaledImg); - } - else - { - if(mRandomPosition) - { - x = (TDEApplication::random() % (ww - iw)) + geoptr->mXorg; - y = (TDEApplication::random() % (wh - ih)) + geoptr->mYorg; - } - else - { - x = ((ww - iw) >> 1) + geoptr->mXorg; - y = ((wh - ih) >> 1) + geoptr->mYorg; - } - - // bitBlt(TQT_TQPAINTDEVICE(&mNextScreen), x, y, TQT_TQPAINTDEVICE(&mImage), 0, 0, iw, ih, CopyROP, false); - p.drawImage(x, y, mImage); - } - } - - if (mPrintName) - { - p.setPen(TQColor("black")); - for (x=9; x<=11; x++) - for (y=21; y>=19; y--) - p.drawText(x + geoptr->mXorg, wh-y+geoptr->mYorg, mImageName); - p.setPen(TQColor("white")); - p.drawText(10 + geoptr->mXorg, wh-20 + geoptr->mYorg, mImageName); - } - } - } - p.end(); -} - - -//---------------------------------------------------------------------------- -void kSlideShowSaver::loadNextImage() -{ - TQString fname; - int num; - - num = mFileList.count(); - if (num <= 0) //no files in the directory - { - return; - } - - if (mShowRandom) - { - mFileIdx = TDEApplication::random() % num; - fname = mFileList[mFileIdx]; - mFileList.remove(fname); - if (num == 1) //we're about to run out of images - { - mFileList = mRandomList; - } - } - else - { - if (mFileIdx >= num) mFileIdx = 0; - fname = mFileList[mFileIdx]; - } - - if (!mImage.load(fname)) - { - kdDebug() << "Failed to load image " << fname << endl; - mFileList.remove(fname); - mRandomList.remove(fname); - if (!mFileList.isEmpty()) - loadNextImage(); - return; - } - mFileIdx++; - - int i, j; - i = fname.findRev('.'); - if (i < 0) i = 32767; - j = fname.findRev('/') + 1; - if (j < 0) j = 0; - mImageName = fname.mid(j, i-j); -} - - -//---------------------------------------------------------------------------- -void kSlideShowSaver::loadDirectory() -{ - mFileIdx = 0; - mFileList.clear(); - traverseDirectory(mDirectory); - mRandomList = mFileList; -} - -void kSlideShowSaver::traverseDirectory(const TQString &dirName) -{ - TQDir dir(dirName); - if (!dir.exists()) - { - return ; - } - dir.setFilter(TQDir::Dirs | TQDir::Files); - - const TQFileInfoList *fileinfolist = dir.entryInfoList(); - TQFileInfoListIterator it(*fileinfolist); - TQFileInfo *fi; - while ((fi = it.current())) - { - if (fi->fileName() == "." || fi->fileName() == "..") - { - ++it; - continue; - } - if (fi->isDir() && fi->isReadable() && mSubdirectory) - { - traverseDirectory(fi->filePath()); - } - else - { - if (!fi->isDir()) - { - mFileList.append(fi->filePath()); - } - } - ++it; - } -} - - -//----------------------------------------------------------------------------- -void kSlideShowSaver::blank() -{ - erase(); -} - - -//============================================================================= -// Class kSlideShowSetup -//============================================================================= -kSlideShowSetup::kSlideShowSetup(TQWidget *aParent, const char *aName) - : KDialogBase(aParent, aName, true, i18n( "Setup Slide Show Screen Saver" ), - Ok|Cancel|Help, Ok, true ) -{ - setButtonText( Help, i18n( "A&bout" ) ); - - TQWidget *main = makeMainWidget(); - TQVBoxLayout *top = new TQVBoxLayout( main, 0, spacingHint() ); - - cfg = new SlideShowCfg( main, "SlideShowCfg" ); - top->addWidget( cfg ); - top->addStretch(); - - cfg->mPreview->setFixedSize(220, 170); - cfg->mPreview->setBackgroundColor(black); - cfg->mPreview->show(); // otherwise saver does not get correct size - mSaver = new kSlideShowSaver(cfg->mPreview->winId()); - - cfg->mDirChooser->setMode(KFile::Directory | KFile::ExistingOnly); - connect(cfg->mDirChooser, TQT_SIGNAL(returnPressed(const TQString &)), - TQT_SLOT(slotDirSelected(const TQString &))); - connect(cfg->mDirChooser, TQT_SIGNAL(urlSelected(const TQString &)), - TQT_SLOT(slotDirSelected(const TQString &))); - - readSettings(); -} - -kSlideShowSetup::~kSlideShowSetup() -{ - delete mSaver; -} - -//----------------------------------------------------------------------------- -void kSlideShowSetup::readSettings() -{ - TDEConfig *config = TDEGlobal::config(); - - config->setGroup("Settings"); - cfg->mCbxRandom->setChecked(config->readBoolEntry("ShowRandom", true)); - cfg->mCbxZoom->setChecked(config->readBoolEntry("ZoomImages", false)); - cfg->mCbxShowName->setChecked(config->readBoolEntry("PrintName", true)); - cfg->mDelay->setValue(config->readNumEntry("Delay", 20)); - cfg->mDirChooser->setURL(config->readPathEntry("Directory")); - cfg->mCbxSubdirectory->setChecked(config->readBoolEntry("SubDirectory", false)); - cfg->mCbxRandomPosition->setChecked(config->readBoolEntry("RandomPosition", false)); -} - - -//----------------------------------------------------------------------------- -void kSlideShowSetup::writeSettings() -{ - TDEConfig *config = TDEGlobal::config(); - - config->setGroup("Settings"); - config->writeEntry("ShowRandom", cfg->mCbxRandom->isChecked()); - config->writeEntry("ZoomImages", cfg->mCbxZoom->isChecked()); - config->writeEntry("PrintName", cfg->mCbxShowName->isChecked()); - config->writeEntry("Delay", cfg->mDelay->value()); - config->writePathEntry("Directory", cfg->mDirChooser->url()); - config->writeEntry("SubDirectory", cfg->mCbxSubdirectory->isChecked()); - config->writeEntry("RandomPosition", cfg->mCbxRandomPosition->isChecked()); - - config->sync(); - - if (mSaver) - { - mSaver->readConfig(); - mSaver->restart(); - } -} - - -//----------------------------------------------------------------------------- -void kSlideShowSetup::slotDirSelected(const TQString &) -{ - writeSettings(); -} - - -//----------------------------------------------------------------------------- -void kSlideShowSetup::slotOk() -{ - writeSettings(); - accept(); -} - - -//----------------------------------------------------------------------------- -void kSlideShowSetup::slotHelp() -{ - TDEAboutData aboutData( "kslideshow.kss", I18N_NOOP("SlideShow"), - version, description, TDEAboutData::License_GPL, - "(c) 1999-2003, The KDE Team" ); - aboutData.addAuthor("Stefan Taferner", 0, "[email protected]"); - aboutData.addAuthor("Chris Howells", 0, "[email protected]"); - aboutData.addAuthor("Sven Leiber", 0, "[email protected]"); - - KAboutApplication mAbout(&aboutData, this, 0); - mAbout.exec(); -} diff --git a/kscreensaver/kdesavers/slideshow.h b/kscreensaver/kdesavers/slideshow.h deleted file mode 100644 index 208f83bc..00000000 --- a/kscreensaver/kdesavers/slideshow.h +++ /dev/null @@ -1,152 +0,0 @@ -/* Slide Show Screen Saver - * (C) 1999 Stefan Taferner <[email protected]> - * (C) 2003 Sven Leiber <[email protected]> - */ - - -#ifndef SLIDESHOW_H -#define SLIDESHOW_H - -#include <tqtimer.h> -#include <tqptrlist.h> -#include <tqstringlist.h> -#include <tqpixmap.h> -#include <tqpainter.h> -#include <tqimage.h> - -#include <kscreensaver.h> -#include <kdialogbase.h> - -#include "slideshowcfg.h" - -class SlideShowCfg; - -//----------------------------------------------------------------------------- -class kSlideShowSaver: public KScreenSaver -{ - Q_OBJECT - -public: - kSlideShowSaver( WId id ); - virtual ~kSlideShowSaver(); - - typedef int (kSlideShowSaver::*EffectMethod)(bool); - - void readConfig(); - - void restart(); - -protected slots: - void slotTimeout(); - -protected: - void blank(); - - /** Load list of images from directory */ - virtual void loadDirectory(); - - /** Helper for loadDirectory() */ - virtual void traverseDirectory(const TQString &dirName); - - /** Load next image from list. If the file cannot be read - it is automatically removed from the file list. - mImage contains the image after loading. */ - virtual void loadNextImage(); - - /** Show next screen, completely, without transition. */ - virtual void showNextScreen(); - - /** Set loaded image to next-screen buffer. */ - virtual void createNextScreen(); - - /** Initialize next-screen buffer. */ - virtual void initNextScreen(); - - /** Register effect methods in effect list. */ - virtual void registerEffects(); - - /** Various effects. If adding one, do not forget to manually - add the effect to the list in the registerEffects() method. */ - int effectHorizLines(bool doInit); - int effectVertLines(bool doInit); - int effectRandom(bool doInit); - int effectGrowing(bool doInit); - int effectChessboard(bool doInit); - int effectIncomingEdges(bool doInit); - int effectBlobs(bool doInit); - int effectCircleOut(bool doInit); - int effectSweep(bool doInit); - int effectMeltdown(bool doInit); - int effectSpiralIn(bool doInit); - int effectMultiCircleOut(bool doInit); - -protected: - /** Init mPainter with next-screen's pixmap and call - mPainter.begin(&mWidget) */ - void startPainter(TQt::PenStyle penStyle=NoPen); - -protected: - struct mScreenGeo { - mScreenGeo(int w, int h, int x, int y) : mW(w), mH(h), mXorg(x), mYorg(y) {}; - int mW; - int mH; - int mXorg; - int mYorg; - }; - TQPtrList<mScreenGeo> mGeoList; - bool mEffectRunning; - TQTimer mTimer; - int mColorContext; - TQStringList mFileList; - TQStringList mRandomList; - int mFileIdx; - TQImage mImage; - TQPixmap mNextScreen; - EffectMethod* mEffectList; - EffectMethod mEffect; - int mNumEffects; - TQPainter mPainter; - TQString mImageName; - - // config settings: - bool mShowRandom; - bool mZoomImages; - bool mPrintName; - bool mSubdirectory; - bool mRandomPosition; - int mDelay; - TQString mDirectory; - - // values for state of various effects: - int mx, my, mw, mh, mdx, mdy, mix, miy, mi, mj, mSubType; - int mx0, my0, mx1, my1, mwait; - double mfx, mfy, mAlpha, mfd; - int* mIntArray; -}; - - -//----------------------------------------------------------------------------- -class kSlideShowSetup : public KDialogBase -{ - Q_OBJECT - -public: - kSlideShowSetup(TQWidget *parent=NULL, const char *name=NULL); - ~kSlideShowSetup(); - -protected: - void readSettings(); - -protected slots: - void slotOk(); - void slotHelp(); - void writeSettings(); - void slotDirSelected(const TQString &where); - -private: - kSlideShowSaver *mSaver; - SlideShowCfg *cfg; -}; - -#endif /*SLIDESHOW_H*/ - diff --git a/kscreensaver/kdesavers/slideshowcfg.ui b/kscreensaver/kdesavers/slideshowcfg.ui deleted file mode 100644 index e63dbd55..00000000 --- a/kscreensaver/kdesavers/slideshowcfg.ui +++ /dev/null @@ -1,176 +0,0 @@ -<!DOCTYPE UI><UI version="3.2" stdsetdef="1"> -<class>SlideShowCfg</class> -<widget class="TQWidget"> - <property name="name"> - <cstring>Form1</cstring> - </property> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>400</width> - <height>243</height> - </rect> - </property> - <grid> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <property name="margin"> - <number>0</number> - </property> - <widget class="TQCheckBox" row="7" column="0" rowspan="1" colspan="4"> - <property name="name"> - <cstring>mCbxSubdirectory</cstring> - </property> - <property name="text"> - <string>&Include images from sub-folders</string> - </property> - </widget> - <widget class="TQCheckBox" row="1" column="0" rowspan="1" colspan="3"> - <property name="name"> - <cstring>mCbxRandom</cstring> - </property> - <property name="text"> - <string>&Random order</string> - </property> - </widget> - <widget class="KURLRequester" row="6" column="2" rowspan="1" colspan="3"> - <property name="name"> - <cstring>mDirChooser</cstring> - </property> - </widget> - <widget class="TQCheckBox" row="0" column="0" rowspan="1" colspan="3"> - <property name="name"> - <cstring>mCbxZoom</cstring> - </property> - <property name="text"> - <string>Resi&ze images</string> - </property> - </widget> - <spacer row="7" column="4"> - <property name="name"> - <cstring>spacer9</cstring> - </property> - <property name="orientation"> - <enum>Horizontal</enum> - </property> - <property name="sizeType"> - <enum>Expanding</enum> - </property> - <property name="sizeHint"> - <size> - <width>161</width> - <height>20</height> - </size> - </property> - </spacer> - <widget class="TQLabel" row="6" column="0" rowspan="1" colspan="2"> - <property name="name"> - <cstring>textLabel1</cstring> - </property> - <property name="text"> - <string>I&mage folder:</string> - </property> - <property name="buddy" stdset="0"> - <cstring>mDirChooser</cstring> - </property> - </widget> - <widget class="TQCheckBox" row="2" column="0" rowspan="1" colspan="3"> - <property name="name"> - <cstring>mCbxShowName</cstring> - </property> - <property name="text"> - <string>Show &names</string> - </property> - </widget> - <spacer row="5" column="1"> - <property name="name"> - <cstring>spacer11</cstring> - </property> - <property name="orientation"> - <enum>Vertical</enum> - </property> - <property name="sizeType"> - <enum>Expanding</enum> - </property> - <property name="sizeHint"> - <size> - <width>20</width> - <height>19</height> - </size> - </property> - </spacer> - <widget class="TQSpinBox" row="4" column="1" rowspan="1" colspan="2"> - <property name="name"> - <cstring>mDelay</cstring> - </property> - <property name="suffix"> - <string> sec</string> - </property> - <property name="specialValueText"> - <string></string> - </property> - <property name="maxValue"> - <number>240</number> - </property> - <property name="minValue"> - <number>1</number> - </property> - </widget> - <widget class="TQLabel" row="4" column="0"> - <property name="name"> - <cstring>textLabel1_2</cstring> - </property> - <property name="text"> - <string>&Delay:</string> - </property> - <property name="buddy" stdset="0"> - <cstring>mDelay</cstring> - </property> - </widget> - <widget class="TQCheckBox" row="3" column="0" rowspan="1" colspan="3"> - <property name="name"> - <cstring>mCbxRandomPosition</cstring> - </property> - <property name="text"> - <string>Random &position</string> - </property> - </widget> - <widget class="TQFrame" row="0" column="3" rowspan="6" colspan="2"> - <property name="name"> - <cstring>mPreview</cstring> - </property> - <property name="sizePolicy"> - <sizepolicy> - <hsizetype>7</hsizetype> - <vsizetype>7</vsizetype> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="frameShape"> - <enum>NoFrame</enum> - </property> - <property name="frameShadow"> - <enum>Plain</enum> - </property> - </widget> - </grid> -</widget> -<customwidgets> -</customwidgets> -<connections> - <connection> - <sender>mCbxZoom</sender> - <signal>toggled(bool)</signal> - <receiver>mCbxRandomPosition</receiver> - <slot>setDisabled(bool)</slot> - </connection> -</connections> -<layoutdefaults spacing="6" margin="11"/> -<includehints> - <includehint>klineedit.h</includehint> - <includehint>kpushbutton.h</includehint> -</includehints> -</UI> diff --git a/kscreensaver/kdesavers/sspreviewarea.cpp b/kscreensaver/kdesavers/sspreviewarea.cpp deleted file mode 100644 index 2b8b3c65..00000000 --- a/kscreensaver/kdesavers/sspreviewarea.cpp +++ /dev/null @@ -1,21 +0,0 @@ -//============================================================================ -// -// KRotation screen saver for KDE -// Copyright (C) 2004 Georg Drenkhahn -// $Id$ -// -//============================================================================ - -#include "sspreviewarea.h" -#include "sspreviewarea.moc" - -SsPreviewArea::SsPreviewArea(TQWidget* parent, const char* name) - : TQWidget(parent, name) -{ -} - -void SsPreviewArea::resizeEvent(TQResizeEvent* e) -{ - emit resized(e); -} - diff --git a/kscreensaver/kdesavers/sspreviewarea.h b/kscreensaver/kdesavers/sspreviewarea.h deleted file mode 100644 index ab36c4b8..00000000 --- a/kscreensaver/kdesavers/sspreviewarea.h +++ /dev/null @@ -1,58 +0,0 @@ -//============================================================================ -// -// KRotation screen saver for KDE -// Copyright (C) 2004 Georg Drenkhahn -// $Id$ -// -//============================================================================ - -#ifndef SSPREVIEWAREA_H -#define SSPREVIEWAREA_H - -#include <tqwidget.h> - -/** @brief Reimplementation of TQWidget emitting a signal if resized. - * - * This class is equalt to TQWidget except for the fact that the signal resized() - * is emitted if the widget gets resized. By this signaling mechanism it is - * possible to resize the embedded GL area object within the screen saver setup - * dialog. - * - * In the constructor of the dialog widget (KPendulumSetup::KPendulumSetup(), - * KRotationSetup::KRotationSetup()) the signal SsPreviewArea::resized() is - * connected with a slot of the screensaver class - * (KPendulumSaver::resizeGlArea(), KRotationSaver::resizeGlArea()). This slot - * function calls the reimplemented TQGLWidget::resizeGL() method of the GL - * widgets (PendulumGLWidget::resizeGL(), RotationGLWidget::resizeGL()) which - * really resizes the GL scenery. */ -class SsPreviewArea : public TQWidget -{ - Q_OBJECT - - - public: - /** @brief Constructor for SsPreviewArea - * @param parent Pointer tp parent widget, forwarded to the TQWidget - * constructor - * @param name Pointer to widget name, forwarded to the TQWidget constructor - * - * The constructor just calls TQWidget::TQWidget() with the given arguments. - */ - SsPreviewArea(TQWidget* parent = NULL, const char* name = NULL); - - protected: - /** @brief Called if widget gets resized. - * @param e Pointer to the corresponding TQResizeEvent object containing the - * resize information - * - * Reimplemented event handler from TQWidget. Only the signal resized() is - * emitted. */ - virtual void resizeEvent(TQResizeEvent* e); - - signals: - /** @brief Signal which is emitted in the resizeEvent() method. - * @param e Pointer to the corresponding TQResizeEvent object */ - void resized(TQResizeEvent* e); -}; - -#endif diff --git a/kscreensaver/kdesavers/vec3.cpp b/kscreensaver/kdesavers/vec3.cpp deleted file mode 100644 index c66730e5..00000000 --- a/kscreensaver/kdesavers/vec3.cpp +++ /dev/null @@ -1,105 +0,0 @@ -//============================================================================ -// -// 3-dim real vector class -// $Id$ -// Copyright (C) 2004 Georg Drenkhahn -// -// This file is free software; you can redistribute it and/or modify it under -// the terms of the GNU General Public License version 2 as published by the -// Free Software Foundation. -// -//============================================================================ - -#include <math.h> -#if !defined(NAN) -static inline double nan__() -{ - static const unsigned int one = 1; - static const bool BigEndian = (*((unsigned char *) &one) == 0); - - static const unsigned char be_nan_bytes[] = { 0x7f, 0xf8, 0, 0, 0, 0, 0, 0 }; - static const unsigned char le_nan_bytes[] = { 0, 0, 0, 0, 0, 0, 0xf8, 0x7f }; - - return *( ( const double * )( BigEndian ? be_nan_bytes : le_nan_bytes ) ); -} -# define NAN (::nan__()) -#endif - -#include <config.h> - -#ifdef HAVE_NUMERIC_LIMITS -#include <limits> -#endif - -#include <cerrno> -#include "vec3.h" - -template<typename T> -vec3<T>& vec3<T>::normalize() -{ - T n = norm(*this); - if (n != 0) - { - (*this) /= n; - } - else - { - errno = EDOM; // indicate domain error - // TODO: throw an exception? - } - return *this; -} - -template<typename T> -vec3<T>& vec3<T>::rotate(const vec3<T>& r) -{ - T phi = norm(r); - if (phi != 0) - { - // part of vector which is parallel to r - vec3<T> par(r*(*this)/(r*r) * r); - // part of vector which is perpendicular to r - vec3<T> perp(*this - par); - // rotation direction, size of perp - vec3<T> rotdir(norm(perp) * normalized(crossprod(r,perp))); - *this = par + cos(phi)*perp + sin(phi)*rotdir; - } - return *this; -} - -/*--- static member functions ---*/ - -template<typename T> -T vec3<T>::cos_angle(const vec3<T>& a, const vec3<T>& b) -{ - T den = norm(a) * norm(b); - T ret = 0; - // if |a|=0 or |b|=0 then angle is not defined. We return NAN in this case. - if (den != 0.0) - { - ret = a*b/den; - } - else - { - errno = EDOM; // indicate domain error -#ifdef HAVE_NUMERIC_LIMITS - // TODO test - ret = std::numeric_limits<T>::quiet_NaN(); -#else - ret = NAN; // return NAN from ISO C99 -#endif - } - return ret; -} - -template<typename T> -T vec3<T>::angle(const vec3<T>& a, const vec3<T>& b, const vec3<T>& c) -{ - // if |a|=0 or |b|=0 then angle is not defined. We return NAN in this case. - T ang = vec3<T>::angle(a,b); - return (crossprod(a,b)*c<0) ? - T(2.*M_PI)-ang : ang; -} - -// explicite instantiation -template class vec3<double>; diff --git a/kscreensaver/kdesavers/vec3.h b/kscreensaver/kdesavers/vec3.h deleted file mode 100644 index 62aeb8ed..00000000 --- a/kscreensaver/kdesavers/vec3.h +++ /dev/null @@ -1,214 +0,0 @@ -//============================================================================ -// -// 3-dim real vector class -// $Id$ -// Copyright (C) 2004 Georg Drenkhahn -// -// This file is free software; you can redistribute it and/or modify it under -// the terms of the GNU General Public License version 2 as published by the -// Free Software Foundation. -// -//============================================================================ - -#ifndef VEC3_H -#define VEC3_H - -#include <valarray> - -/** @brief 3-dimensional real vector - * - * Implements regular 3 dimensional (space) vectors including the common inner - * scalar product (2 norm) and the cross product. @a T may be any integer or - * float data type which is an acceptable template argument of std::valarray. */ -template<typename T> -class vec3 : public std::valarray<T> -{ - public: - /** Default constructor */ - vec3(); - /** Constructor with initial element values */ - vec3(const T&, const T&, const T&); - /** Copy constructor */ - vec3(const std::valarray<T>&); - /** Copy constructor */ - vec3(const std::slice_array<T>&); - - /** Normalize the vector to have a norm of 1. @return Normalized vector if - * length is non-zero and otherwise the zero vector. */ - vec3& normalize(); - - /** Rotate the vector (*this) in positive mathematical direction around the - * direction given by @a r. The norm of @a r specifies the rotation angle in - * radians. - * @param r Rotation vector. - * @return Rotated vector. */ - vec3& rotate(const vec3& r); - - /*--- static funcions ---*/ - - /** @param a first vector - * @param b second vector - * @return Cosine of the angle between @a a and @a b. If norm(@a a)==0 or - * norm(@a b)==0 the global variable errno is set to EDOM and NAN (or - * std::numeric_limits<T>::quiet_NaN()) is returned. */ - static T cos_angle(const vec3& a, const vec3& b); - - /** @brief Returns the angle between vectors @c a and @a b but with respect - * to a preferred rotation direction @a c. - * - * @param a First vector for angle. Must be | @a a |>0 otherwises NAN is - * returned. - * @param b Second vector for angle. Must be | @a b |>0 otherwises NAN is - * returned. - * @param c Indicates the rotation direction. @a c can be any vector which is - * not part of the plane spanned by @a a and @a b. If | @a c | = 0 the - * smalest possible angle angle is returned. - * @return Angle in radians between 0 and 2*Pi or NAN if | @a a |=0 or | @a b - * |=0. - * - * For @a a not parallel to @a b and @a a not antiparallel to @a b the 2 - * vectors @a a,@a b span a unique plane in the 3-dimensional space. Let @b - * n<sub>1</sub> and @b n<sub>2</sub> be the two possible normal vectors for - * this plane with |@b n<sub>i</sub> |=1, i={1,2} and @b n<sub>1</sub> = -@b - * n<sub>2</sub> . - * - * Let further @a a and @a b enclose an angle alpha in [0,Pi], then there is - * one i in {1,2} so that (alpha*@b n<sub>i</sub> x @a a) * @a b = 0. This - * means @a a rotated by the rotation vector alpha*@b n<sub>i</sub> is - * parallel to @a b. One could also rotate @a a by (2*Pi-alpha)*(-@b - * n<sub>i</sub>) to acomplish the same transformation with - * ((2*Pi-alpha)*(-@b n<sub>i</sub>) x @a a) * @a b = 0 - * - * The vector @a c defines the direction of the normal vector to take as - * reference. If @a c * @b n<sub>i</sub> > 0 alpha is returned and otherwise - * 2*Pi-alpha. If @a a parallel to @a b or @a a parallel to @a b the choice - * of @a c does not matter. */ - static T angle(const vec3& a, const vec3& b, const vec3& c); - - /*--- static inline funcions ---*/ - - /** Norm of argument vector. - * @param a vector. - * @return | @a a | */ - static T norm(const vec3& a); - - /** Angle between @a a and @a b. - * @param a fist vector. Must be | @a a | > 0 otherwises NAN is returned. - * @param b second vector. Must be | @a b | > 0 otherwises NAN is returned. - * @return Angle in radians between 0 and Pi or NAN if | @a a | = 0 or | @a b - * | = 0. */ - static T angle(const vec3& a, const vec3& b); - - /** Cross product of @a a and @a b. - * @param a fist vector. - * @param b second vector. - * @return Cross product of argument vectors @a a x @a b. */ - static vec3 crossprod(const vec3& a, const vec3& b); - - /** Normalized version of argument vector. - * @param a vector. - * @return @a a / | @a a | for | @a a | > 0 and otherwise the zero vector - * (=@a a). In the latter case the global variable errno is set to EDOM. */ - static vec3 normalized(vec3 a); -}; - -/*--- inline member functions ---*/ - -template<typename T> -inline vec3<T>::vec3() - : std::valarray<T>(3) -{} - -template<typename T> -inline vec3<T>::vec3(const T& a, const T& b, const T& c) - : std::valarray<T>(3) -{ - (*this)[0] = a; - (*this)[1] = b; - (*this)[2] = c; -} - -template<typename T> -inline vec3<T>::vec3(const std::valarray<T>& a) - : std::valarray<T>(a) -{ -} - -template<typename T> -inline vec3<T>::vec3(const std::slice_array<T>& a) - : std::valarray<T>(a) -{ -} - -/*--- inline non-member operators ---*/ - -/** @param a first vector summand - * @param b second vector summand - * @return Sum vector of vectors @a a and @a b. */ -template<typename T> -inline vec3<T> operator+(vec3<T> a, const vec3<T>& b) -{ - a += b; /* valarray<T>::operator+=(const valarray<T>&) */ - return a; -} - -/** @param a first vector multiplicant - * @param b second vector multiplicant - * @return Scalar product of vectors @a a and @a b. */ -template<typename T> -inline T operator*(vec3<T> a, const vec3<T>& b) -{ - a *= b; /* valarray<T>::operator*=(const T&) */ - return a.sum(); -} - -/** @param a scalar multiplicant - * @param b vector operand - * @return Product vector of scalar @a a and vector @a b. */ -template<typename T> -inline vec3<T> operator*(const T& a, vec3<T> b) -{ - b *= a; /* valarray<T>::operator*=(const T&) */ - return b; -} - -/** @param a vector operand - * @param b scalar multiplicant - * @return Product vector of scalar @a b and vector @a a. */ -template<typename T> -inline vec3<T> operator*(vec3<T> a, const T& b) -{ - return b*a; /* vec3<T>::operator*(const T&, vec3<T>) */ -} - -/*--- static inline funcions ---*/ - -template<typename T> -inline T vec3<T>::norm(const vec3<T>& a) -{ - return sqrt(a*a); -} - -template<typename T> -inline T vec3<T>::angle(const vec3<T>& a, const vec3<T>& b) -{ - // returns NAN if cos_angle() returns NAN (TODO: test this case) - return acos(cos_angle(a,b)); -} - -template<typename T> -inline vec3<T> vec3<T>::crossprod(const vec3<T>& a, const vec3<T>& b) -{ - return vec3<T>( - a[1]*b[2] - a[2]*b[1], - a[2]*b[0] - a[0]*b[2], - a[0]*b[1] - a[1]*b[0]); -} - -template<typename T> -inline vec3<T> vec3<T>::normalized(vec3<T> a) -{ - return a.normalize(); -} - -#endif diff --git a/kscreensaver/kdesavers/vm.c b/kscreensaver/kdesavers/vm.c deleted file mode 100644 index 6d4a1af2..00000000 --- a/kscreensaver/kdesavers/vm.c +++ /dev/null @@ -1,264 +0,0 @@ -/* - * vm.c - * - * Copyright (c) 2000 Artur Rataj - * Distributed under the terms of the GNU General Public License - * - */ - -#include "vm.h" - -#define ERROR_VALUE INT_MAX - -int vm_init_pool( struct tvm_pool** pool, - int area_size, - int max_stack_size, - int max_threads_num ) { - int position; - - ( *pool ) = (struct tvm_pool*)malloc( sizeof(struct tvm_pool) ); - ( *pool )->area_size = area_size; - ( *pool )->area = (int*)malloc( (*pool)->area_size*sizeof(int) ); - ( *pool )->processes = NULL; - ( *pool )->max_stack_size = max_stack_size; - ( *pool )->max_threads_num = max_threads_num; - vm_enable_reverse( *pool, 0 ); - for( position = 0; position < (*pool)->area_size; ++position ) - ( *pool )->area[position] = VM_OP_STOP; - return 1; -} - -void vm_done_pool( struct tvm_pool* pool ) { - struct tvm_process* curr_process; - free( pool->area ); - curr_process = pool->processes; - while( curr_process ) { - struct tvm_process* tmp_process; - - tmp_process = curr_process; - curr_process = curr_process->next; - free( tmp_process->stack ); - free( tmp_process ); - } - free( pool ); -} - -static int push( struct tvm_pool* pool, - struct tvm_process* process, - int value ) { - if( process->stack_top == pool->max_stack_size ) - return ERROR_VALUE; - else - process->stack[process->stack_top++] = value; - return 1; -} - -static int pop( struct tvm_pool* pool, - struct tvm_process* process ) { - if( process->stack_top == 0 ) - return ERROR_VALUE; - else -{ - return process->stack[--process->stack_top]; -} -} - -void vm_modify( struct tvm_pool* pool, - int position, - int op ) { - pool->area[position] = op; -} - -void vm_exec( struct tvm_pool* pool, - int position, - int age, - int reverse ) { - struct tvm_process* new_process; - - new_process = (struct tvm_process*)malloc( sizeof(struct tvm_process) ); - new_process->position = position; - new_process->stack = (int*)malloc( pool->max_stack_size*sizeof(int) ); - new_process->stack_top = 0; - new_process->age = age; - new_process->reverse = reverse; - new_process->next = pool->processes; - pool->processes = new_process; -} - -void vm_enable_reverse( struct tvm_pool* pool, - const int enabled ) { - pool->reverse_enabled = enabled; -} - -int vm_get_reverse( struct tvm_pool* pool ) { - if( pool->reverse_enabled ) - return (int)( vm_random(&(pool->vm_random_data))*2.0/ - ( VM_RAND_MAX + 1.0 ) ); - else - return 0; -} - -void vm_iterate( struct tvm_pool* pool, - char* modified ) { - struct tvm_process* prev_process; - struct tvm_process* curr_process; - struct tvm_process* next_process; - int processes_num; - - processes_num = 0; - prev_process = NULL; - curr_process = pool->processes; - while( curr_process ) { - int op; - int arg; - int arg_2; - int arg_3; - - ++curr_process->age; - next_process = curr_process->next; - op = pool->area[curr_process->position]; - if( curr_process->reverse ) - --curr_process->position; - else - ++curr_process->position; - curr_process->position = ( curr_process->position + pool->area_size )% - pool->area_size; - switch( op ) { - case VM_OP_WAIT: - break; - - case VM_OP_STOP: - if( !prev_process ) - pool->processes = curr_process->next; - else - prev_process->next = curr_process->next; - free( curr_process->stack ); - free( curr_process ); - curr_process = prev_process; - --processes_num; - break; - - case VM_OP_EXEC: - if( (arg = pop( pool, curr_process )) == ERROR_VALUE ) { - if( !prev_process ) - pool->processes = curr_process->next; - else - prev_process->next = curr_process->next; - free( curr_process->stack ); - free( curr_process ); - curr_process = prev_process; - --processes_num; - } else { - arg = curr_process->position + arg; - if( arg < 0 ) - arg += pool->area_size; - if( arg >= pool->area_size ) - arg -= pool->area_size; - vm_exec( pool, arg, curr_process->age, vm_get_reverse(pool) ); - } - break; - - case VM_OP_COPY: - if( (arg = pop( pool, curr_process )) == ERROR_VALUE ) { - if( !prev_process ) - pool->processes = curr_process->next; - else - prev_process->next = curr_process->next; - free( curr_process->stack ); - free( curr_process ); - curr_process = prev_process; - --processes_num; - } else if( (arg_2 = pop( pool, curr_process )) == ERROR_VALUE ) { - if( !prev_process ) - pool->processes = curr_process->next; - else - prev_process->next = curr_process->next; - free( curr_process->stack ); - free( curr_process ); - curr_process = prev_process; - --processes_num; - } else if( 1 && (arg_3 = pop( pool, curr_process )) == ERROR_VALUE ) { - if( !prev_process ) - pool->processes = curr_process->next; - else - prev_process->next = curr_process->next; - free( curr_process->stack ); - free( curr_process ); - curr_process = prev_process; - --processes_num; - } else { - int count; - int direction; - - arg = curr_process->position + arg; - if( arg < 0 ) - arg += pool->area_size; - if( arg >= pool->area_size ) - arg -= pool->area_size; - arg_2 = curr_process->position + arg_2; - if( arg_2 < 0 ) - arg_2 += pool->area_size; - if( arg_2 >= pool->area_size ) - arg_2 -= pool->area_size; - if( curr_process->reverse ) - direction = -1; - else - direction = 1; - for( count = 0; count < arg_3; ++count ) { - int i, j; - int offset; - - offset = count*direction + pool->area_size; - i = pool->area[( arg_2 + offset )%pool->area_size]; - j = pool->area[( arg_2 + offset )%pool->area_size] = pool->area[( arg + offset )%pool->area_size]; - if( modified && i != j ) - modified[( arg_2 + offset )%pool->area_size] = 1; - } - } - break; - - default: /* >= VM_OP_PUSH */ - arg = op - VM_OP_PUSH; - if( push(pool, curr_process, arg) == ERROR_VALUE ) { - if( !prev_process ) - pool->processes = curr_process->next; - else - prev_process->next = curr_process->next; - free( curr_process->stack ); - free( curr_process ); - curr_process = prev_process; - --processes_num; - } - break; - } - prev_process = curr_process; - curr_process = next_process; - ++processes_num; - } - while( processes_num > pool->max_threads_num ) { - int process_num; - int curr_process_num; - - process_num = (int)( vm_random(&(pool->vm_random_data))*1.0*processes_num/ - ( VM_RAND_MAX + 1.0 ) ); -/* - process_num = (int)( rand()*1.0*processes_num/ - ( RAND_MAX + 1.0 ) ); - */ - curr_process_num = 0; - curr_process = pool->processes; - prev_process = NULL; - while( curr_process_num != process_num ) { - prev_process = curr_process; - curr_process = curr_process->next; - ++curr_process_num; - } - if( prev_process ) - prev_process->next = curr_process->next; - else - pool->processes = curr_process->next; - free( curr_process->stack ); - free( curr_process ); - --processes_num; - } -} diff --git a/kscreensaver/kdesavers/vm.h b/kscreensaver/kdesavers/vm.h deleted file mode 100644 index dc64d241..00000000 --- a/kscreensaver/kdesavers/vm.h +++ /dev/null @@ -1,52 +0,0 @@ -#ifndef __VM_H__ -#define __VM_H__ - -#include <stdlib.h> -#include <stdio.h> /* !!! */ -#include <limits.h> -#include "vm_random.h" - -#define VM_OP_STOP 1 -#define VM_OP_COPY 2 -#define VM_OP_EXEC 3 -#define VM_OP_WAIT 4 -#define VM_OP_PUSH (INT_MAX/2) - -struct tvm_process { - int position; - int* stack; - int stack_top; - int age; - int reverse; - struct tvm_process* next; -}; - -struct tvm_pool { - int* area; - int area_size; - struct tvm_process* processes; - int max_stack_size; - int max_threads_num; - int reverse_enabled; - struct vm_random_data vm_random_data; -}; - -int vm_init_pool( struct tvm_pool** pool, - int area_size, - int max_stack_size, - int max_threads_num ); -void vm_modify( struct tvm_pool* pool, - int position, - int op ); -void vm_exec( struct tvm_pool* pool, - int position, - int age, - int reverse ); -void vm_enable_reverse( struct tvm_pool* pool, - const int enabled ); -int vm_get_reverse( struct tvm_pool* pool ); -void vm_iterate( struct tvm_pool* pool, - char* modified ); -void vm_done_pool( struct tvm_pool* pool ); - -#endif /* !defined( __VM_H__ ) */ diff --git a/kscreensaver/kdesavers/vm.xbm b/kscreensaver/kdesavers/vm.xbm deleted file mode 100644 index 3d6e84cd..00000000 --- a/kscreensaver/kdesavers/vm.xbm +++ /dev/null @@ -1,191 +0,0 @@ -/* Created with The GIMP */ -#define vm_width 44 -#define vm_height 374 -static unsigned char vm_bits[] = { - 0x6d, 0xdb, 0xf6, 0xff, 0xff, 0x0f, 0xdb, 0xb6, 0x55, 0xdb, 0xb6, 0x0d, - 0x6d, 0x0b, 0xd0, 0xff, 0x07, 0x06, 0x5b, 0x1d, 0xd0, 0xdb, 0xee, 0x0c, - 0xf6, 0xf6, 0x77, 0xff, 0xbf, 0x0f, 0x8d, 0x4a, 0xd4, 0xd6, 0xba, 0x0d, - 0x05, 0x37, 0xe8, 0xd3, 0x4f, 0x0e, 0x27, 0x2c, 0xd1, 0x9a, 0xce, 0x0c, - 0x62, 0x1a, 0xd3, 0xdd, 0xeb, 0x0c, 0x52, 0x94, 0xa2, 0x39, 0xcf, 0x09, - 0x73, 0x9a, 0xd2, 0xde, 0xeb, 0x0e, 0xd2, 0x94, 0xd3, 0x39, 0xef, 0x09, - 0x53, 0x8a, 0x62, 0xdd, 0xa5, 0x0e, 0x62, 0x1c, 0xe3, 0x9a, 0xef, 0x0c, - 0x03, 0x16, 0xd0, 0xd5, 0x46, 0x0d, 0x0e, 0x75, 0xd8, 0xcb, 0x1f, 0x0d, - 0xdb, 0xae, 0x6a, 0x77, 0xff, 0x07, 0xd6, 0xaa, 0xed, 0xfe, 0xb6, 0x0e, - 0x5d, 0x5f, 0xdb, 0xf7, 0xff, 0x0f, 0x75, 0xf5, 0xd6, 0xbe, 0xb5, 0x0d, - 0xab, 0x95, 0xfa, 0xeb, 0xff, 0x07, 0x7a, 0xb7, 0xab, 0x7f, 0xb7, 0x0e, - 0xd7, 0x5a, 0xd5, 0xef, 0xfd, 0x0f, 0xad, 0x76, 0x77, 0xdd, 0xb7, 0x0d, - 0xf5, 0x0d, 0xd0, 0x7f, 0x47, 0x0c, 0x57, 0x1b, 0xd0, 0xf7, 0x5e, 0x0d, - 0x5a, 0xf5, 0xdb, 0xfe, 0xfb, 0x07, 0x6b, 0x97, 0xda, 0xad, 0xaf, 0x0e, - 0x85, 0x1a, 0xf4, 0xe5, 0x56, 0x0f, 0x87, 0x36, 0xa8, 0xe9, 0x1f, 0x0d, - 0x9a, 0xed, 0xec, 0xb7, 0x75, 0x0f, 0x16, 0x9b, 0xa8, 0xe7, 0x6f, 0x0d, - 0x8d, 0x76, 0xdc, 0xb7, 0x3f, 0x0f, 0x9d, 0xd5, 0xd4, 0xe6, 0x76, 0x0d, - 0x8b, 0xb6, 0xfc, 0xef, 0x5f, 0x0f, 0x9d, 0xad, 0xa4, 0xad, 0x5d, 0x0d, - 0x03, 0x34, 0xd0, 0xa5, 0x17, 0x0d, 0x06, 0x14, 0xc0, 0x91, 0x5e, 0x08, - 0xfd, 0xef, 0x7e, 0xff, 0xfb, 0x0f, 0xab, 0xaa, 0xe5, 0x77, 0xd7, 0x0f, - 0x6a, 0x5d, 0xdd, 0xdf, 0x7f, 0x0d, 0xde, 0xd5, 0x55, 0xfd, 0xf6, 0x0f, - 0x55, 0xb7, 0xf6, 0xef, 0xdf, 0x0a, 0xdb, 0xb6, 0xd6, 0x7d, 0xfb, 0x0f, - 0xb6, 0xea, 0xda, 0xef, 0x6f, 0x07, 0xb6, 0xaf, 0xb6, 0xbd, 0xfd, 0x0e, - 0x6d, 0x15, 0xd0, 0xef, 0x07, 0x0d, 0x5b, 0x1b, 0xd0, 0xfd, 0xae, 0x0c, - 0x76, 0xed, 0xdb, 0xef, 0xfb, 0x07, 0x8d, 0x5b, 0x5a, 0x5b, 0x5f, 0x0f, - 0x05, 0x16, 0xf0, 0xe5, 0x8b, 0x0e, 0x23, 0x14, 0xd1, 0x4c, 0x6f, 0x0c, - 0x72, 0x9e, 0xd2, 0x9e, 0xb3, 0x0d, 0x56, 0xd4, 0xf2, 0xbd, 0xff, 0x0c, - 0x1b, 0xbb, 0xd0, 0xc7, 0x36, 0x0d, 0x1b, 0xd6, 0x50, 0xdf, 0x7f, 0x0e, - 0xc6, 0x35, 0xfe, 0xf1, 0x96, 0x0b, 0x42, 0x16, 0xc2, 0xab, 0xaf, 0x0d, - 0x01, 0x0a, 0x70, 0x94, 0x45, 0x0e, 0x03, 0x1e, 0xd0, 0xa9, 0x4b, 0x0c, - 0xfd, 0xd2, 0xeb, 0xfe, 0xff, 0x07, 0xab, 0x5e, 0xdd, 0x6f, 0xdd, 0x0e, - 0xed, 0xb5, 0xd5, 0xfd, 0xf7, 0x0f, 0x5b, 0xab, 0xb6, 0x6f, 0xbf, 0x0d, - 0xd6, 0x76, 0xdb, 0xfd, 0xed, 0x07, 0xb5, 0xd6, 0xd6, 0xdb, 0xdf, 0x0e, - 0xef, 0x5a, 0xdd, 0x7f, 0xfb, 0x0f, 0xaa, 0xb7, 0xd5, 0xee, 0xbf, 0x0d, - 0x5d, 0x15, 0xf0, 0x7b, 0x03, 0x0c, 0xeb, 0x16, 0x50, 0xff, 0xb7, 0x0d, - 0x5d, 0xfb, 0xeb, 0x6b, 0xff, 0x0e, 0x55, 0x4b, 0x5c, 0xef, 0xad, 0x0d, - 0x03, 0x1d, 0xf0, 0xd1, 0x4f, 0x0e, 0x22, 0x14, 0xd1, 0x9d, 0xd6, 0x0c, - 0x57, 0x6e, 0xd3, 0xb6, 0xef, 0x0c, 0x3a, 0xda, 0xd0, 0x97, 0xbd, 0x0d, - 0x07, 0x55, 0xe8, 0xeb, 0x2f, 0x06, 0x2d, 0x5e, 0x51, 0x97, 0xfd, 0x0c, - 0x5d, 0xb4, 0xe2, 0x5f, 0xb7, 0x0d, 0x75, 0xea, 0xa3, 0x5d, 0xff, 0x09, - 0x03, 0x1a, 0xd0, 0xd6, 0x25, 0x0e, 0x02, 0x16, 0xf0, 0x88, 0xa7, 0x0c, - 0xef, 0xb5, 0xce, 0xf7, 0xdf, 0x0f, 0xad, 0xd6, 0xda, 0x7f, 0xbd, 0x0d, - 0xb5, 0xad, 0x6d, 0xef, 0xf7, 0x07, 0xb7, 0x6d, 0xeb, 0xdd, 0xdf, 0x0e, - 0xda, 0x5a, 0xdd, 0x7f, 0xfd, 0x0f, 0x56, 0xb7, 0xd5, 0xf6, 0xaf, 0x0d, - 0xfb, 0x6a, 0xdb, 0xdf, 0xfd, 0x0e, 0x56, 0xdb, 0xda, 0xfd, 0xed, 0x0d, - 0xb5, 0x0d, 0xd0, 0xb7, 0x07, 0x06, 0x6d, 0x1b, 0xd0, 0xfe, 0xdf, 0x0c, - 0xdb, 0xf6, 0xdb, 0xb7, 0xf6, 0x0f, 0xb6, 0x95, 0xda, 0xfe, 0xbf, 0x0d, - 0x0d, 0x7b, 0xe8, 0xc7, 0x36, 0x0f, 0x1b, 0xd6, 0xd8, 0xd6, 0x3f, 0x0c, - 0x06, 0x2b, 0xe8, 0xd3, 0x56, 0x0f, 0x25, 0x3a, 0xa8, 0xcb, 0x5f, 0x0d, - 0x23, 0x17, 0xe9, 0x6c, 0x4d, 0x0e, 0x23, 0x1a, 0xd9, 0xcd, 0x6b, 0x0d, - 0x02, 0x0b, 0xd0, 0xd4, 0x27, 0x0d, 0x02, 0x1a, 0xd0, 0x92, 0x26, 0x0d, - 0x2f, 0x76, 0xf0, 0xe7, 0x5f, 0x0e, 0x0a, 0x6a, 0xd0, 0x8e, 0x5d, 0x0c, - 0xfd, 0xad, 0xd7, 0xfb, 0xff, 0x07, 0x95, 0xb5, 0xb6, 0xff, 0xb5, 0x0f, - 0x7b, 0xd7, 0xda, 0xad, 0xff, 0x0e, 0x56, 0xbd, 0xb6, 0xff, 0xdb, 0x0d, - 0x75, 0xeb, 0xea, 0x5d, 0xff, 0x07, 0xd7, 0xaa, 0xae, 0xfb, 0xb6, 0x0e, - 0x5a, 0xd7, 0xf5, 0xff, 0xff, 0x0f, 0x76, 0x5d, 0xad, 0x6d, 0xab, 0x0d, - 0xad, 0x15, 0xd0, 0xff, 0x17, 0x0c, 0x6d, 0x17, 0x70, 0xdb, 0xd6, 0x0d, - 0xdb, 0xfa, 0xeb, 0xff, 0x7f, 0x07, 0xda, 0x96, 0xd6, 0xb6, 0xed, 0x0f, - 0x03, 0x2a, 0xd0, 0xc9, 0x17, 0x0c, 0x05, 0x1a, 0xd0, 0xa9, 0x4e, 0x0d, - 0xf3, 0x97, 0x6f, 0xfd, 0xeb, 0x0f, 0x02, 0x1a, 0xe8, 0xc5, 0x0f, 0x0d, - 0x03, 0x16, 0xd0, 0xaa, 0xad, 0x0c, 0x76, 0xb4, 0xd3, 0x9d, 0xff, 0x09, - 0x5b, 0x6e, 0xe1, 0xbf, 0x6a, 0x0d, 0x76, 0x58, 0x47, 0xb7, 0xff, 0x0d, - 0x01, 0x86, 0xf0, 0xcc, 0x26, 0x0c, 0x03, 0x1d, 0xd0, 0xc9, 0x4d, 0x0d, - 0xdd, 0x56, 0xed, 0xf7, 0xf7, 0x0f, 0xb5, 0x6d, 0xad, 0x7e, 0xbf, 0x0d, - 0xd7, 0xda, 0xda, 0xf7, 0xed, 0x07, 0xbd, 0xab, 0xdb, 0xaf, 0xbf, 0x0e, - 0x55, 0x5d, 0x75, 0xff, 0xed, 0x0f, 0xed, 0x75, 0xd7, 0xba, 0xff, 0x0d, - 0x5b, 0xab, 0xda, 0xff, 0x5a, 0x0f, 0xb6, 0x6e, 0xdb, 0xed, 0xff, 0x0d, - 0x6d, 0x1b, 0x70, 0xbf, 0x05, 0x06, 0x6b, 0x15, 0xd0, 0xf7, 0xaf, 0x0c, - 0xae, 0xdb, 0xeb, 0xbe, 0xfb, 0x0f, 0x5a, 0xb6, 0xda, 0x6f, 0x7f, 0x0d, - 0x05, 0x2a, 0xd0, 0xd2, 0x15, 0x0d, 0x47, 0x3e, 0xd0, 0xab, 0xaf, 0x0d, - 0xb1, 0x85, 0xef, 0xfc, 0xeb, 0x0e, 0x83, 0x1d, 0xd8, 0x65, 0x97, 0x0d, - 0x01, 0x0b, 0x68, 0xd4, 0x23, 0x0e, 0x23, 0x0a, 0xd1, 0x99, 0xe7, 0x0c, - 0x38, 0x8e, 0x71, 0xde, 0xf6, 0x06, 0x63, 0x1a, 0xe3, 0x9c, 0xc7, 0x0c, - 0x21, 0x16, 0xe8, 0xea, 0xad, 0x0e, 0x07, 0x35, 0xd8, 0xa3, 0x1f, 0x0d, - 0xad, 0xd7, 0xea, 0xfe, 0xfa, 0x0f, 0xb5, 0xb6, 0xd6, 0xef, 0xb7, 0x0d, - 0xdb, 0xda, 0x6d, 0x7b, 0xff, 0x07, 0xb6, 0xab, 0xda, 0xef, 0xad, 0x0e, - 0x6d, 0xdd, 0x76, 0xff, 0xff, 0x0f, 0xab, 0xd5, 0xea, 0xb6, 0xb5, 0x0d, - 0xdd, 0xae, 0xed, 0xff, 0xff, 0x07, 0xdb, 0xba, 0x55, 0xdb, 0xb6, 0x0e, - 0xb6, 0x15, 0xd0, 0xff, 0x47, 0x0c, 0x6d, 0x17, 0x70, 0xdb, 0xae, 0x0d, - 0xd5, 0xfa, 0xd7, 0xff, 0xff, 0x0e, 0xbd, 0x26, 0x6d, 0xdb, 0xda, 0x0d, - 0x03, 0x1c, 0xe0, 0xa1, 0x27, 0x0a, 0x02, 0x2a, 0x50, 0x97, 0xcf, 0x0c, - 0x77, 0x9a, 0xf3, 0x5d, 0xef, 0x0e, 0x6a, 0xb6, 0xa2, 0xbf, 0xdd, 0x0c, - 0x17, 0x6a, 0xf1, 0xca, 0x7f, 0x0d, 0x7d, 0xae, 0xd1, 0x5f, 0xeb, 0x0e, - 0x15, 0x5b, 0xe9, 0xef, 0x3f, 0x06, 0x37, 0x75, 0x59, 0x4d, 0xfb, 0x0e, - 0x9a, 0xd6, 0xd4, 0xf7, 0x2f, 0x0f, 0x96, 0xad, 0xd8, 0xe7, 0x7d, 0x0d, - 0x6d, 0xdb, 0x76, 0xbf, 0xff, 0x07, 0xdb, 0xb6, 0xd6, 0xfd, 0xd5, 0x0e, - 0xb6, 0xd5, 0xed, 0xb7, 0xff, 0x0f, 0xad, 0xb6, 0xda, 0xfe, 0xae, 0x0d, - 0x75, 0xdb, 0xd6, 0xdb, 0xfb, 0x07, 0x6f, 0xab, 0xb5, 0xff, 0xbf, 0x0e, - 0xaa, 0x5d, 0xdb, 0xad, 0xf5, 0x0f, 0xba, 0xd5, 0xd6, 0xff, 0xbf, 0x0d, - 0xd7, 0x0e, 0x70, 0xbb, 0x43, 0x0c, 0xb5, 0x1a, 0xd0, 0x77, 0x57, 0x0d, - 0xef, 0xed, 0xeb, 0xfe, 0xff, 0x07, 0x0a, 0x5b, 0xdc, 0xd7, 0xad, 0x0e, - 0x05, 0x15, 0xd0, 0x68, 0x8f, 0x0e, 0x23, 0x1e, 0xd1, 0x95, 0xad, 0x0c, - 0x79, 0x94, 0xf2, 0xde, 0xf7, 0x0c, 0x43, 0x96, 0xd2, 0x59, 0xc7, 0x0d, - 0x05, 0x2d, 0xd0, 0xca, 0x1d, 0x06, 0x05, 0x2a, 0xd8, 0xd3, 0x57, 0x0e, - 0x73, 0x8e, 0xd3, 0x9c, 0xe7, 0x0c, 0x52, 0x9a, 0xd2, 0xbd, 0xee, 0x0d, - 0x21, 0x16, 0x70, 0x95, 0xa3, 0x0c, 0x07, 0x2d, 0xd0, 0xd3, 0x1f, 0x0d, - 0x55, 0xdb, 0x76, 0xef, 0xf7, 0x0f, 0xdd, 0x56, 0xd5, 0xbd, 0xbe, 0x0d, - 0x6b, 0xdd, 0x76, 0xff, 0xeb, 0x07, 0xad, 0xd5, 0xd6, 0xdb, 0xbf, 0x0e, - 0x7b, 0xbb, 0xed, 0x7e, 0xef, 0x0f, 0x56, 0xab, 0xda, 0xf7, 0xfd, 0x0d, - 0x75, 0x6d, 0xeb, 0xde, 0x57, 0x0f, 0xd7, 0xdb, 0xda, 0xfd, 0xfe, 0x0d, - 0x5a, 0x15, 0xe0, 0xb7, 0x07, 0x06, 0x76, 0x17, 0x50, 0xff, 0xb7, 0x0c, - 0xad, 0xfa, 0xef, 0x6d, 0xfd, 0x0f, 0xcb, 0x27, 0xda, 0xfb, 0xaf, 0x0d, - 0x05, 0x1a, 0xe8, 0xa4, 0x0b, 0x0f, 0x22, 0x96, 0xd0, 0x55, 0x77, 0x0c, - 0x19, 0x8d, 0x69, 0xee, 0x73, 0x07, 0x71, 0x14, 0xe1, 0x9c, 0xe7, 0x0c, - 0x03, 0x8e, 0xf0, 0xc6, 0x16, 0x0e, 0x05, 0x1a, 0xc0, 0x95, 0xaf, 0x0c, - 0x2b, 0x6d, 0x79, 0xdb, 0xdd, 0x06, 0x3d, 0x5b, 0xd1, 0xdf, 0x7b, 0x0e, - 0x01, 0x15, 0xd8, 0x62, 0x97, 0x0e, 0x43, 0x17, 0xda, 0xea, 0x97, 0x0d, - 0xb5, 0xad, 0xf5, 0x7e, 0xeb, 0x0f, 0xad, 0xba, 0xd6, 0xed, 0xbf, 0x0d, - 0x7b, 0x6b, 0xed, 0xbf, 0xff, 0x07, 0xd6, 0xd6, 0x55, 0x7b, 0xb5, 0x0e, - 0xb5, 0xad, 0xee, 0xff, 0xff, 0x0f, 0x6d, 0xdb, 0x5a, 0xeb, 0xb6, 0x0d, - 0xdb, 0xb6, 0xf5, 0xbf, 0xff, 0x07, 0xb6, 0xad, 0x56, 0xfb, 0xb5, 0x0e, - 0x55, 0xdb, 0xed, 0xef, 0xff, 0x0f, 0xee, 0x16, 0xd0, 0xbe, 0x06, 0x0c, - 0xb5, 0x1a, 0xf0, 0xf7, 0x57, 0x0d, 0xd7, 0xd6, 0xcf, 0xfe, 0xfe, 0x0f, - 0xaa, 0x2d, 0xf8, 0xd5, 0xab, 0x0a, 0x03, 0x1b, 0xa0, 0xa5, 0x17, 0x0f, - 0x06, 0x35, 0xd8, 0xd5, 0xaf, 0x06, 0x0d, 0x6e, 0xd0, 0xab, 0x3d, 0x0e, - 0x25, 0x2a, 0x79, 0xdb, 0xd7, 0x0c, 0x67, 0x3a, 0xd3, 0x99, 0xce, 0x0d, - 0x02, 0x14, 0xe0, 0xa2, 0x17, 0x04, 0x03, 0x14, 0xc0, 0x2d, 0x57, 0x09, - 0x70, 0x08, 0x43, 0x5a, 0xea, 0x0a, 0x41, 0x08, 0xc2, 0x98, 0xc2, 0x01, - 0xf7, 0x7b, 0xdb, 0xff, 0x7f, 0x0f, 0xad, 0x56, 0xdb, 0xf7, 0xef, 0x0f, - 0xb5, 0x75, 0x75, 0x5f, 0xbd, 0x0e, 0xb7, 0x56, 0xd7, 0xfd, 0xf7, 0x0d, - 0xea, 0xed, 0xda, 0xf7, 0xbe, 0x07, 0x5e, 0xab, 0xd6, 0xde, 0x77, 0x0f, - 0xd5, 0x6e, 0xdd, 0xff, 0xfe, 0x0d, 0xb5, 0xda, 0xb5, 0xdb, 0xb7, 0x0f, - 0xef, 0x56, 0xeb, 0x7e, 0xfb, 0x06, 0xd5, 0x1a, 0xd0, 0xf7, 0x07, 0x0c, - 0xad, 0x0b, 0xd0, 0xde, 0xee, 0x0e, 0x7b, 0xfb, 0xf7, 0xfd, 0xdd, 0x0d, - 0x05, 0x0d, 0xa8, 0xeb, 0xb7, 0x0e, 0x03, 0x1a, 0x60, 0x09, 0x87, 0x08, - 0xa2, 0x14, 0xe5, 0xb5, 0x6f, 0x0d, 0xa7, 0x3c, 0xa5, 0x3b, 0xcd, 0x09, - 0x46, 0x14, 0xe2, 0xac, 0x6f, 0x0d, 0x05, 0x34, 0xc0, 0x91, 0x4e, 0x08, - 0xa5, 0x18, 0xc2, 0x6d, 0xab, 0x0b, 0xa7, 0x31, 0xce, 0x79, 0xce, 0x03, - 0x02, 0x0c, 0xc0, 0x4a, 0x17, 0x0a, 0x02, 0x18, 0xc0, 0x49, 0x57, 0x0a, - 0xfb, 0xf7, 0x7f, 0xff, 0xfd, 0x0f, 0x56, 0xad, 0xd4, 0xbf, 0xb7, 0x0d, - 0xad, 0x55, 0xeb, 0xfa, 0xfd, 0x0f, 0x7b, 0x77, 0xdd, 0xdf, 0x6f, 0x0d, - 0x55, 0xad, 0xeb, 0x76, 0xfb, 0x07, 0x6e, 0x6b, 0xd5, 0xff, 0x6f, 0x0f, - 0xb5, 0xfd, 0xff, 0xb6, 0xff, 0x0f, 0xb6, 0xfd, 0xff, 0x7f, 0xff, 0x0f, - 0x6d, 0xfb, 0x7f, 0xfb, 0xff, 0x0f, 0xdb, 0xfe, 0xff, 0x6f, 0xff, 0x0f, - 0xb6, 0xfd, 0x7f, 0xfb, 0xff, 0x0f, 0x55, 0xfb, 0xff, 0x7f, 0xff, 0x0f, - 0x07, 0x7e, 0x70, 0xa3, 0x1f, 0x0e, 0x05, 0x18, 0xe0, 0x25, 0x07, 0x08, - 0x71, 0x9c, 0x63, 0x9c, 0xe7, 0x08, 0xd1, 0x8c, 0xe7, 0x3d, 0xe3, 0x09, - 0x69, 0xcb, 0x7f, 0xfe, 0xf3, 0x0f, 0xd9, 0xce, 0xff, 0xec, 0xf3, 0x0f, - 0xa9, 0xcd, 0x7f, 0xbf, 0xf3, 0x0f, 0x71, 0x8d, 0x6f, 0x7a, 0xe3, 0x0f, - 0x01, 0x1c, 0xe0, 0x94, 0x47, 0x09, 0x07, 0x38, 0xe0, 0x23, 0x0f, 0x0c, - 0xad, 0xff, 0xfc, 0xfd, 0x7f, 0x0f, 0x6d, 0xfd, 0xbf, 0xdf, 0xff, 0x0f, - 0xb5, 0xfd, 0xff, 0x7d, 0xff, 0x0f, 0x6f, 0xfb, 0xff, 0xeb, 0xff, 0x0f, - 0xda, 0xfe, 0x7f, 0x7f, 0xff, 0x0f, 0xab, 0xfd, 0xff, 0xff, 0xff, 0x0f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, - 0x83, 0x1f, 0xfc, 0xe4, 0x57, 0x0f, 0x01, 0x0e, 0xf0, 0x80, 0x07, 0x0c, - 0x03, 0x1c, 0xe0, 0x08, 0x47, 0x08, 0xe7, 0x1c, 0xe7, 0x3d, 0xef, 0x09, - 0xe3, 0x9c, 0xe7, 0x38, 0xc7, 0x09, 0x03, 0x1e, 0xe0, 0x81, 0x0f, 0x0c, - 0x03, 0x1f, 0xf8, 0xc1, 0x0f, 0x0e, 0xe3, 0x1f, 0xff, 0xfd, 0xef, 0x0f, - 0x83, 0x1f, 0xfc, 0xe0, 0x07, 0x0f, 0x83, 0x1f, 0xfc, 0xe0, 0x07, 0x0f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, - 0x0f, 0x3f, 0xf8, 0xe3, 0x1f, 0x0f, 0x03, 0x1e, 0xf0, 0x81, 0x07, 0x0c, - 0x73, 0x9e, 0xf3, 0x9c, 0xe7, 0x0c, 0x73, 0x9e, 0xf3, 0xbc, 0xe7, 0x0d, - 0xc3, 0x1f, 0xfc, 0xf8, 0x87, 0x0f, 0x07, 0x3e, 0xf0, 0x81, 0x0f, 0x0c, - 0x3f, 0xfe, 0xf1, 0x9f, 0x7f, 0x0c, 0x7b, 0x9c, 0xe3, 0xbe, 0xf7, 0x0d, - 0x21, 0x0e, 0xf0, 0x88, 0x43, 0x0c, 0x03, 0x1e, 0xf0, 0xc0, 0x07, 0x0c, - 0xdf, 0xff, 0xfc, 0xff, 0x7f, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, - 0xb5, 0xfa, 0xff, 0xff, 0xff, 0x0f, 0x6e, 0xff, 0x7f, 0x55, 0xff, 0x0f, - 0xd5, 0xfa, 0xff, 0xff, 0xff, 0x0f, 0xbb, 0xfe, 0xbf, 0x7b, 0xff, 0x0f, - 0xd6, 0xfd, 0xff, 0xef, 0xff, 0x0f, 0xb5, 0xfa, 0x7f, 0x7d, 0xff, 0x0f, - 0x55, 0x8e, 0xf3, 0xd7, 0xf7, 0x0e, 0x41, 0x0c, 0x61, 0x18, 0xc3, 0x08, - 0x21, 0x1c, 0xf3, 0x9e, 0xc7, 0x0c, 0x27, 0x3a, 0xf0, 0x51, 0x0f, 0x0e, - 0x8a, 0x7b, 0xb8, 0xe3, 0x1f, 0x0f, 0x0b, 0x7e, 0x7c, 0xaf, 0x1f, 0x0f, - 0x06, 0x3b, 0xf8, 0xe1, 0x0e, 0x0e, 0x22, 0x1e, 0xf1, 0x9d, 0x4f, 0x0c, - 0x21, 0x08, 0xa1, 0xa8, 0xc2, 0x08, 0x21, 0x08, 0x61, 0x1a, 0x43, 0x08, - 0xdd, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x5b, 0xfd, 0xff, 0xeb, 0xff, 0x0f, - 0x6a, 0xfb, 0xbf, 0xbf, 0xff, 0x0f, 0xdd, 0xfe, 0x7f, 0x7d, 0xff, 0x0f, - 0xab, 0xfd, 0xff, 0xf7, 0xff, 0x0f, 0xba, 0xfa, 0xff, 0xbf, 0xff, 0x0f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x01, 0x0c, 0x60, 0x80, 0x03, 0x0c, - 0x01, 0x0e, 0x70, 0x80, 0x03, 0x0c, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f }; diff --git a/kscreensaver/kdesavers/vm.xpm b/kscreensaver/kdesavers/vm.xpm deleted file mode 100644 index 8d00a5b3..00000000 --- a/kscreensaver/kdesavers/vm.xpm +++ /dev/null @@ -1,493 +0,0 @@ -/* XPM */ -static const char *vm[] = { -/* columns rows colors chars-per-pixel */ -"44 374 113 2", -" c #005e00", -". c #003c63", -"X c #003b00", -"o c #00263e", -"O c #00b3ed", -"+ c #00c3ff", -"@ c #007095", -"# c #007ba0", -"$ c #0086b9", -"% c #0095cb", -"& c #005474", -"* c #005e80", -"= c #006d00", -"- c #008d00", -"; c #004a74", -": c #006997", -"> c #004500", -", c #005900", -"< c #002f49", -"1 c #00425f", -"2 c #00ec00", -"3 c #00dc00", -"4 c #009400", -"5 c #008a00", -"6 c #009c00", -"7 c #00cc00", -"8 c #0077a8", -"9 c #00a5dc", -"0 c #006200", -"q c #008000", -"w c #004b6a", -"e c #00688a", -"r c #00bc00", -"t c #007600", -"y c #007d00", -"u c #005985", -"i c #004f00", -"p c #003854", -"a c #00ac00", -"s c #006c00", -"d c #5d5e00", -"f c Gray0", -"g c #3b3b00", -"h c #6f7000", -"j c #b7b700", -"k c #c9c900", -"l c #a5a600", -"z c #939400", -"x c Gray11", -"c c #8d8d8d", -"v c #aaaaaa", -"b c #717171", -"n c #555555", -"m c #464600", -"M c #737300", -"N c #7e7e00", -"B c #686800", -"V c #5c5d00", -"C c Gray7", -"Z c Gray35", -"A c Gray42", -"S c Gray28", -"D c Gray21", -"F c Yellow", -"G c Gray100", -"H c #a0a000", -"J c #a0a0a0", -"K c #eded00", -"L c #818200", -"P c #e2e2e2", -"I c Gray22", -"U c #959500", -"Y c #515200", -"T c #8e8e8e", -"R c #232323", -"E c #dbdb00", -"W c #c6c6c6", -"Q c #8a8a00", -"! c #7c7c7c", -"~ c #2a2a2a", -"^ c #6a6a6a", -"/ c #808080", -"( c Gray25", -") c #1b1b1b", -"_ c #434343", -"` c #515151", -"' c #282828", -"] c #c0c0c0", -"[ c #797979", -"{ c #151515", -"} c Gray5", -"| c #959595", -" . c Gray37", -".. c #610000", -"X. c #3d0000", -"o. c #840000", -"O. c #960000", -"+. c #730000", -"@. c #530000", -"#. c #5e0000", -"$. c #480000", -"%. c #dc0000", -"&. c Red", -"*. c #ca0000", -"=. c #8a0000", -"-. c #a00000", -";. c #7f0000", -":. c #a70000", -">. c #ed0000", -",. c #690000", -"<. c #950000", -"1. c #b80000", -"2. c #740000", -/* pixels */ -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . O + + + + + + . . X X X X X X X X X X X o o @ # # # # # # o o ", -" . . $ % % % % % % . . X X X X X X X X X X X o o & * * * * * * o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" = - - . . . . ; : : . . . . X X X X > , , X X X X o o o o < 1 1 o o o o ", -" - 2 2 2 3 = . . . : + + + O ; . . X X X , 4 4 4 5 > X X o o o 1 # # # @ < o o ", -" = 2 3 - 6 2 7 . . ; + O : 8 + 9 . . X X > 4 5 , 0 4 q X X o o < # @ 1 w # e o o ", -" 6 2 - r 2 = . . 8 + : . . % + ; . X X 0 4 , X X t 4 > X o o w # 1 o o * # < o ", -" r 2 - 2 - . . % + . . . : + : . X X t 4 X X X , 4 , X o o * # o o o 1 # 1 o ", -" r 2 - 2 - . . % + . . . : + : . X X t 4 X X X , 4 , X o o * # o o o 1 # 1 o ", -" r 2 - 2 - . . % + . . . : + : . X X t 4 X X X , 4 , X o o * # o o o 1 # 1 o ", -" r 2 - 2 - . . % + . . . : + : . X X t 4 X X X , 4 , X o o * # o o o 1 # 1 o ", -" 6 2 - r 2 = . . 8 + : . . % + ; . X X 0 4 , X X t 4 > X o o w # 1 o o * # < o ", -" = 2 3 - 6 2 7 . . ; + O : 8 + 9 . . X X > 4 5 , 0 4 q X X o o < # @ 1 w # e o o ", -" - 2 2 2 3 = . . . : + + + O ; . . X X X , 4 4 4 5 > X X o o o 1 # # # @ < o o ", -" = - - . . . . ; : : . . . . X X X X > , , X X X X o o o o < 1 1 o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . O + + + + + + . . X X X X X X X X X X X o o @ # # # # # # o o ", -" . . $ % % % % % % . . X X X X X X X X X X X o o & * * * * * * o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" y . . . . . . u . . . . X X X X X X i X X X X o o o o o o p o o o o ", -" = a r 2 2 . . ; $ % + + . . . . X X > s t 4 4 X X X X o o < & * # # o o o o ", -" y 2 3 3 2 . . u + O O + . . . . X X i 4 5 5 4 X X X X o o p # @ @ # o o o o ", -" r 2 . . . . . % + . . . . X X X X X t 4 X X X X o o o o o * # o o o o ", -" r 2 . . . . . % + . . . . X X X X X t 4 X X X X o o o o o * # o o o o ", -" r 2 . . . . . % + . . . . X X X X X t 4 X X X X o o o o o * # o o o o ", -" r 2 . . . . . % + . . . . X X X X X t 4 X X X X o o o o o * # o o o o ", -" r 2 . . . . . % + . . . . X X X X X t 4 X X X X o o o o o * # o o o o ", -" r 2 . . . . . % + . . . . X X X X X t 4 X X X X o o o o o * # o o o o ", -" = r r 3 2 r r - . . ; % % O + % % : . X X > t t 5 4 t t , X o o < * * @ # * * 1 o ", -" y 2 2 2 2 2 2 a . . u + + + + + + $ . X X i 4 4 4 4 4 4 s X o o p # # # # # # & o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . O + + + + + + . . X X X X X X X X X X X o o @ # # # # # # o o ", -" . . $ % % % % % % . . X X X X X X X X X X X o o & * * * * * * o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" y - y . . . . u : u . . . . X X X X i , i X X X X o o o o p 1 p o o o o ", -" = 7 2 2 2 7 = . . ; 9 + + + 9 ; . . X X > q 4 4 4 q > X X o o < e # # # e < o o ", -" 7 2 a - a 2 7 . . 9 + $ : $ + 9 . . X X q 4 s , s 4 q X X o o e # & 1 & # e o o ", -" 3 a r 2 . . O $ . . . % + . . X X 5 s X X X t 4 X X o o @ & o o o * # o o ", -" = 3 3 . . . . . . ; O O . . X X X X X X > 5 5 X X o o o o o o < @ @ o o ", -" = 3 2 - . . . . . ; O + : . . X X X X X > 5 4 , X X o o o o o < @ # 1 o o ", -" = 3 2 a . . . . ; O + $ . . . X X X X > 5 4 s X X X o o o o < @ # & o o o ", -" - 3 2 - . . . : O + : . . . . X X X , 5 4 , X X X X o o o 1 @ # 1 o o o o ", -" - 2 3 y - a . . : + O u . : $ . . X X , 4 5 i X , s X X o o 1 # @ p o 1 & o o ", -" - 2 2 7 r r 3 2 . : + + 9 % % O + . . X , 4 4 q t t 5 4 X X o 1 # # e * * @ # o o ", -" - 2 2 2 2 2 2 2 . : + + + + + + + . . X , 4 4 4 4 4 4 4 X X o 1 # # # # # # # o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . O + + + + + + . . X X X X X X X X X X X o o @ # # # # # # o o ", -" . . $ % % % % % % . . X X X X X X X X X X X o o & * * * * * * o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" y - - . . . . u : : . . . . X X X X i , , X X X X o o o o p 1 1 o o o o ", -" = 3 2 2 2 3 = . . ; O + + + O ; . . X X > 5 4 4 4 5 > X X o o < @ # # # @ < o o ", -" r 2 6 - 6 2 7 . . % + 8 : 8 + 9 . . X X t 4 0 , 0 4 q X X o o * # w 1 w # e o o ", -" = y r 2 . . ; u . . . % + . . X X > i X X X t 4 X X o o < p o o o * # o o ", -" = - 6 2 7 . . . . ; : 8 + 9 . . X X X X > , 0 4 q X X o o o o < 1 w # e o o ", -" r 2 2 2 = . . . . % + + + ; . . X X X X t 4 4 4 > X X o o o o * # # # < o o ", -" = - a 2 r . . . . ; : $ + % . . X X X X > , s 4 t X X o o o o < 1 & # * o o ", -" 6 2 y . . . . . . . 8 + u . X X X X X X X 0 4 i X o o o o o o o w # p o ", -" 6 2 - . . . . . . . 8 + : . X X X X X X X 0 4 , X o o o o o o o w # 1 o ", -" a 6 - - a 2 2 = . . $ 8 : : $ + + ; . X X s 0 , , s 4 4 > X o o & w 1 1 & # # < o ", -" 7 2 2 2 2 3 - . . 9 + + + + O : . . X X q 4 4 4 4 5 , X X o o e # # # # @ 1 o o ", -" y - - y . . . u : : u . . . . X X X i , , i X X X X o o o p 1 1 p o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . O + + + + + + . . X X X X X X X X X X X o o @ # # # # # # o o ", -" . . $ % % % % % % . . X X X X X X X X X X X o o & * * * * * * o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" 7 2 r . . . . . 9 + % . . . X X X X X q 4 t X X X o o o o o e # * o o o ", -" - 2 2 r . . . . : + + % . . . X X X X , 4 4 t X X X o o o o 1 # # * o o o ", -" 3 3 2 r . . . . O O + % . . . X X X X 5 5 4 t X X X o o o o @ @ # * o o o ", -" a 2 - 2 r . . . $ + : + % . . . X X X s 4 , 4 t X X X o o o & # 1 # * o o o ", -" = 2 7 2 r . . ; + 9 . + % . . . X X > 4 q X 4 t X X X o o < # e o # * o o o ", -" 7 2 y 2 r . . 9 + u . + % . . . X X q 4 i X 4 t X X X o o e # p o # * o o o ", -" y 2 3 r r 2 3 - . u + O % % + O : . . X i 4 5 t t 4 5 , X X o p # @ * * # @ 1 o o ", -" - 2 2 2 2 2 2 a . : + + + + + + $ . . X , 4 4 4 4 4 4 s X X o 1 # # # # # # & o o ", -" - r 2 3 - . . . . : % + O : . . X X X X , t 4 5 , X X o o o o 1 * # @ 1 o o ", -" a 2 2 2 a . . . . $ + + + $ . . X X X X s 4 4 4 s X X o o o o & # # # & o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . O + + + + + + . . X X X X X X X X X X X o o @ # # # # # # o o ", -" . . $ % % % % % % . . X X X X X X X X X X X o o & * * * * * * o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" - 2 2 2 2 2 a . . : + + + + + $ . . X X , 4 4 4 4 4 s X X o o 1 # # # # # & o o ", -" - 2 7 r r r - . . : + 9 % % % : . . X X , 4 q t t t , X X o o 1 # e * * * 1 o o ", -" - 2 - . . : + : . . . . . . X X , 4 , X X X X X X o o 1 # 1 o o o o o o ", -" - 2 7 2 2 a . . : + 9 + + $ . . . X X , 4 q 4 4 s X X X o o 1 # e # # & o o o ", -" - 2 3 r 7 2 r . . : + O % 9 + % . . X X , 4 5 t q 4 t X X o o 1 # @ * e # * o o ", -" - r 2 y . . . : . . . % + u . X X X , X X X t 4 i X o o o 1 o o o * # p o ", -" - 2 - . . . . . . . : + : . X X X X X X X , 4 , X o o o o o o o 1 # 1 o ", -" 6 2 - . . . . . . . 8 + : . X X X X X X X 0 4 , X o o o o o o o w # 1 o ", -" y 2 a - - a 2 3 . u + $ : : $ + O . . X i 4 s , , s 4 5 X X o p # & 1 1 & # @ o o ", -" = 7 2 2 2 2 3 = . ; 9 + + + + O ; . . X > q 4 4 4 4 5 > X X o < e # # # # @ < o o ", -" = - - y . . . ; : : u . . . . X X X > , , i X X X X o o o < 1 1 p o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . O + + + + + + . . X X X X X X X X X X X o o @ # # # # # # o o ", -" . . $ % % % % % % . . X X X X X X X X X X X o o & * * * * * * o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" = - - . . . . . ; : : . . . X X X X X > , , X X X o o o o o < 1 1 o o o ", -" = 7 2 2 2 a . . . ; 9 + + + $ . . X X X > q 4 4 4 s X X o o o < e # # # & o o ", -" = 3 2 r - a - . . ; O + % : $ : . . X X > 5 4 t , s , X X o o < @ # * 1 & 1 o o ", -" a 2 - . . $ + : . . . . . . X X s 4 , X X X X X X o o & # 1 o o o o o o ", -" 2 a 6 r 6 . . + $ 8 % 8 . . . . X X 4 s 0 t 0 X X X X o o # & w * w o o o o ", -" - 2 3 2 2 2 3 . : + O + + + O . . . X , 4 5 4 4 4 5 X X X o 1 # @ # # # @ o o o ", -" - 2 2 6 a 2 6 . : + + 8 . $ + 8 . . X , 4 4 0 X s 4 0 X X o 1 # # w o & # w o o ", -" - 2 7 2 r . : + 9 . . . + % . . X , 4 q X X X 4 t X X o 1 # e o o o # * o o ", -" 2 3 = 2 r . . + O . . ; + % . . X X 4 5 X X > 4 t X X o o # @ o o < # * o o ", -" r 2 r - r 2 y . . % + % : % + u . . X X t 4 t , t 4 i X X o o * # * 1 * # p o o ", -" = 7 2 2 2 r . . ; 9 + + + % . . . X X > q 4 4 4 t X X X o o < e # # # * o o o ", -" y - = . . . . u : ; . . . . X X X X i , > X X X X o o o o p 1 < o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . O + + + + + + . . X X X X X X X X X X X o o @ # # # # # # o o ", -" . . $ % % % % % % . . X X X X X X X X X X X o o & * * * * * * o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" - 2 2 2 2 2 2 - . . : + + + + + + : . X X , 4 4 4 4 4 4 , X o o 1 # # # # # # 1 o ", -" - 2 7 r r 7 2 . . : + 9 % % 9 + . . X X , 4 q t t q 4 X X o o 1 # e * * e # o o ", -" = r = r 3 . . ; % ; . . % O . . X X > t > X X t 5 X X o o < * < o o * @ o o ", -" 2 r . . . . . . . + % . . X X X X X X X 4 t X X o o o o o o o # * o o ", -" - 2 - . . . . . . : + : . . X X X X X X , 4 , X X o o o o o o 1 # 1 o o ", -" a 2 . . . . . . $ + . . . X X X X X X s 4 X X X o o o o o o & # o o o ", -" 3 7 . . . . . . O 9 . . . X X X X X X 5 q X X X o o o o o o @ e o o o ", -" y 2 6 . . . . . u + 8 . . . X X X X X i 4 0 X X X o o o o o p # w o o o ", -" a 2 = . . . . . $ + ; . . . X X X X X s 4 > X X X o o o o o & # < o o o ", -" a 3 . . . . . $ O . . . . X X X X X s 5 X X X X o o o o o & @ o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . O + + + + + + . . X X X X X X X X X X X o o @ # # # # # # o o ", -" . . $ % % % % % % . . X X X X X X X X X X X o o & * * * * * * o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" y - y . . . . u : u . . . . X X X X i , i X X X X o o o o p 1 p o o o o ", -" = 7 2 2 2 7 = . . ; 9 + + + 9 ; . . X X > q 4 4 4 q > X X o o < e # # # e < o o ", -" 7 2 a - a 2 7 . . 9 + $ : $ + 9 . . X X q 4 s , s 4 q X X o o e # & 1 & # e o o ", -" 2 r r 2 . . + % . . . % + . . X X 4 t X X X t 4 X X o o # * o o o * # o o ", -" 7 3 y y 3 7 . . 9 O u . u O 9 . . X X q 5 i X i 5 q X X o o e @ p o p @ e o o ", -" = 7 2 2 2 7 = . . ; 9 + + + 9 ; . . X X > q 4 4 4 q > X X o o < e # # # e < o o ", -" = 3 3 r 3 3 = . . ; O O % O O ; . . X X > 5 5 t 5 5 > X X o o < @ @ * @ @ < o o ", -" 3 3 3 7 . . O O . . . O 9 . . X X 5 5 X X X 5 q X X o o @ @ o o o @ e o o ", -" 2 r r 2 . . + % . . . % + . . X X 4 t X X X t 4 X X o o # * o o o * # o o ", -" 7 2 a - a 2 7 . . 9 + $ : $ + 9 . . X X q 4 s , s 4 q X X o o e # & 1 & # e o o ", -" = 3 2 2 2 3 = . . ; O + + + O ; . . X X > 5 4 4 4 5 > X X o o < @ # # # @ < o o ", -" y - y . . . . u : u . . . . X X X X i , i X X X X o o o o p 1 p o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . O + + + + + + . . X X X X X X X X X X X o o @ # # # # # # o o ", -" . . $ % % % % % % . . X X X X X X X X X X X o o & * * * * * * o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" = - - . . . ; : : . . . . . X X X > , , X X X X X o o o < 1 1 o o o o o ", -" - 2 2 2 3 - . . : + + + O : . . . X X , 4 4 4 5 , X X X o o 1 # # # @ 1 o o o ", -" 2 3 - 6 2 3 = . . + O : 8 + O ; . . X X 4 5 , 0 4 5 > X X o o # @ 1 w # @ < o o ", -" - 2 - a 2 - . : + : . . $ + : . . X , 4 , X X s 4 , X X o 1 # 1 o o & # 1 o o ", -" - 2 6 6 2 r . : + 8 . . 8 + % . . X , 4 0 X X 0 4 t X X o 1 # w o o w # * o o ", -" 3 3 - a 2 2 r . . O O : $ + + % . . X X 5 5 , s 4 4 t X X o o @ @ 1 & # # * o o ", -" - 2 2 2 r 2 r . . : + + + % + % . . X X , 4 4 4 t 4 t X X o o 1 # # # * # * o o ", -" = - y 6 2 - . . . ; : u 8 + : . . X X X > , i 0 4 , X X o o o < 1 p w # 1 o o ", -" = 3 3 . . . . . ; O O . . . X X X X X > 5 5 X X X o o o o o < @ @ o o o ", -" = r - a 2 2 - . ; % : $ + + : . . . X > t , s 4 4 , X X X o < * 1 & # # 1 o o o ", -" y 2 2 2 3 - . u + + + O : . . . . X i 4 4 4 5 , X X X X o p # # # @ 1 o o o o ", -" = - y . . ; : u . . . . . . X X > , i X X X X X X o o < 1 p o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . O + + + + + + . . X X X X X X X X X X X o o @ # # # # # # o o ", -" . . $ % % % % % % . . X X X X X X X X X X X o o & * * * * * * o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" = - - - - . . ; : : : : . . . . X X > , , , , X X X X o o < 1 1 1 1 o o o o ", -" 6 2 2 2 2 - . . 8 + + + + : . . . X X 0 4 4 4 4 , X X X o o w # # # # 1 o o o ", -" = - 7 2 2 7 . . ; : 9 + + 9 . . . X X > , q 4 4 q X X X o o < 1 e # # e o o o ", -" 3 3 7 2 = . . . . O O 9 + ; . . X X X X 5 5 q 4 > X X o o o o @ @ e # < o o ", -" - 2 6 y 2 a . . . : + 8 u + $ . . X X X , 4 0 i 4 s X X o o o 1 # w p # & o o ", -" 7 2 3 2 . . . 9 + . . O + . . X X X q 4 X X 5 4 X X o o o e # o o @ # o o ", -" y 2 2 2 2 2 2 6 . . u + + + + + + 8 . X X i 4 4 4 4 4 4 0 X o o p # # # # # # w o ", -" a 2 r r r r 2 7 . . $ + % % % % + 9 . X X s 4 t t t t 4 q X o o & # * * * * # e o ", -" a 2 2 r = a 3 2 r . $ + + % ; . $ O + % X s 4 4 t > X s 5 4 t o & # # * < o & @ # * ", -" 3 2 2 2 y 3 2 2 2 . O + + + u . O + + + X 5 4 4 4 i X 5 4 4 4 o @ # # # p o @ # # # ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . O + + + + + + . . X X X X X X X X X X X o o @ # # # # # # o o ", -" . . $ % % % % % % . . X X X X X X X X X X X o o & * * * * * * o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" y - - - - - . . u : : : : : . . . X X i , , , , , X X X o o p 1 1 1 1 1 o o o ", -" 2 2 2 2 2 2 3 - . . + + + + + + O : . X X 4 4 4 4 4 4 5 , X o o # # # # # # @ 1 o ", -" y 2 7 - - 6 2 3 . . u + 9 : : 8 + O . X X i 4 q , , 0 4 5 X o o p # e 1 1 w # @ o ", -" 2 r r 2 . . . + % . . . % + . X X X 4 t X X X t 4 X o o o # * o o o * # o ", -" 2 7 - - a 2 a . . . + 9 : : $ + $ . X X X 4 q , , s 4 s X o o o # e 1 1 & # & o ", -" 2 2 2 2 2 2 a . . . + + + + + + $ . X X X 4 4 4 4 4 4 s X o o o # # # # # # & o ", -" 2 7 - - - 7 2 6 . . . + 9 : : : 9 + 8 X X X 4 q , , , q 4 0 o o o # e 1 1 1 e # w ", -" 2 r 2 r . . . + % . . . . + % X X X 4 t X X X X 4 t o o o # * o o o o # * ", -" a 2 3 r r r 7 2 6 . . $ + O % % % 9 + 8 X X s 4 5 t t t q 4 0 o o & # @ * * * e # w ", -" 3 2 2 2 2 2 3 a . . O + + + + + O $ . X X 5 4 4 4 4 4 5 s X o o @ # # # # # @ & o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -" . . . . . . . . . . . X X X X X X X X X X X o o o o o o o o o o o ", -"d d d d d d d d d d d f f f f f f f f f f f g g g g g g g g g g g f f f f f f f f f f f ", -"d d d d d d d d d d d f f f f f f f f f f f g g g g g g g g g g g f f f f f f f f f f f ", -"d d d d d d d d d d d f f f f f f f f f f f g g g g g g g g g g g f f f f f f f f f f f ", -"d d d d d d d d d d d f f f f f f f f f f f g g g g g g g g g g g f f f f f f f f f f f ", -"d d d d d d d d d d d f f f f f f f f f f f g g g g g g g g g g g f f f f f f f f f f f ", -"d d d d d d d d d d d f f f f f f f f f f f g g g g g g g g g g g f f f f f f f f f f f ", -"d d d h j k k l z h d f f f x c v v b n x f g g g m M N N B V m g f f f C Z A A S D C f ", -"d d z F F F F F F k d f f n G G G G G G v f g g V H H H H H H N g f f D J J J J J J A f ", -"d h F K L d h j F k d f x G P I f x c G v f g m H U Y g m M H N g f C J T R f C Z J A f ", -"d l F l d d d d E j d f b G b f f f f W c f g B H B g g g g Q M g f S J S f f f f ! Z f ", -"d k F d d d d d d d d f v G f f f f f f f f g N H g g g g g g g g f A J f f f f f f f f ", -"d k F d d d d d d d d f v G f f f f f f f f g N H g g g g g g g g f A J f f f f f f f f ", -"d k F d d d d d d d d f v G f f f f f f f f g N H g g g g g g g g f A J f f f f f f f f ", -"d l F l d d d d h L d f b G b f f f f x I f g B H B g g g g m Y g f S J S f f f f C R f ", -"d d K F E z z l K F d f f P G W n n b P G f g g U H Q V V B U H g f f T J ! D D S T J f ", -"d d h k F F F F K z d f f x v G G G G P n f g g m N H H H H U V g f f C A J J J J T D f ", -"d d d d h z z L d d d f f f f x n n I f f f g g g g m V V Y g g g f f f f C D D R f f f ", -"d d d d d d d d d d d f f f f f f f f f f f g g g g g g g g g g g f f f f f f f f f f f ", -"d d d d d d d d d d d f f f f f f f f f f f g g g g g g g g g g g f f f f f f f f f f f ", -"d d d d d d d d d d d f f f f f f f f f f f g g g g g g g g g g g f f f f f f f f f f f ", -"d d d d d d d d d d d f f f f f f f f f f f g g g g g g g g g g g f f f f f f f f f f f ", -"d d d d d d d d d d d f f f f f f f f f f f g g g g g g g g g g g f f f f f f f f f f f ", -"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ", -"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ", -"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ", -"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ", -"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ", -"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ", -"f f n n n n n x f f f f f n n n n n x f f f f f D D D D D C f f f f f D D D D D C f f f ", -"f n G G G G G G v f f f n G G G G G G v f f f D J J J J J J A f f f D J J J J J J A f f ", -"f f c G c n n W G b f f f c G c n n W G b f f f Z J Z D D ! J S f f f Z J Z D D ! J S f ", -"f f n G n f f f G v f f f n G n f f f G v f f f D J D f f f J A f f f D J D f f f J A f ", -"f f n G n f f x G v f f f n G n f f x G v f f f D J D f f C J A f f f D J D f f C J A f ", -"f f n G W v v G G I f f f n G W v v G G I f f f D J ! A A J J R f f f D J ! A A J J R f ", -"f f n G G G G W I f f f f n G G G G W I f f f f D J J J J ! R f f f f D J J J J ! R f f ", -"f f n G n f f f f f f f f n G n f f f f f f f f D J D f f f f f f f f D J D f f f f f f ", -"f x W G W v c f f f f f x W G W v c f f f f f C ! J ! A Z f f f f f C ! J ! A Z f f f f ", -"f I G G G G P f f f f f I G G G G P f f f f f R J J J J T f f f f f R J J J J T f f f f ", -"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ", -"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ", -"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ", -"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ", -"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ", -"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ", -"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ", -"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ", -"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ", -"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ", -"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ", -"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ", -"f f f ~ ^ / / ( ~ f f f f f I c v v n I f f f f f ) _ ` ` ' ) f f f f f R Z A A D R f f ", -"f f ( ] ] ] ] ] ] f f f f n G G G G G G f f f f ' [ [ [ [ [ [ f f f f D J J J J J J f f ", -"f f v v ~ f { v ] f f f f P P I f x P G f f f f A A ) f } A [ f f f f T T R f C T J f f ", -"f f ] | f f f ( ^ f f f f G W f f f n c f f f f [ .f f f ' _ f f f f J ! f f f D Z f f ", -"f f | ] | ^ ( f f f f f f W G W c n f f f f f f .[ ._ ' f f f f f f ! J ! Z D f f f f ", -"f f f ^ v ] ] ] ^ f f f f f c P G G G c f f f f f _ A [ [ [ _ f f f f f Z T J J J Z f f ", -"f f f f f ~ n v ] ~ f f f f f f I b P G I f f f f f f ) D A [ ) f f f f f f R S T J R f ", -"f ~ ] ~ f f f ( ] ( f f I G I f f f n G n f f ) [ ) f f f ' [ ' f f R J R f f f D J D f ", -"f ( ] v n ( n v ] { f f n G P b n b P G x f f ' [ A D ' D A [ } f f D J T S D S T J C f ", -"f ~ ] v ] ] ] ] ( f f f I G P G G G G n f f f ) [ A [ [ [ [ ' f f f R J T J J J J D f f ", -"f f f f ~ ( ( f f f f f f f f I n n f f f f f f f f ) ' ' f f f f f f f f R D D f f f f ", -"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ", -"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ", -"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ", -"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ", -"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ", -"......................f f f f f f f f f f f X.X.X.X.X.X.X.X.X.X.X.f f f f f f f f f f f ", -"......................f f f f f f f f f f f X.X.X.X.X.X.X.X.X.X.X.f f f f f f f f f f f ", -"......................f f f f f f f f f f f X.X.X.X.X.X.X.X.X.X.X.f f f f f f f f f f f ", -"......................f f f f f f f f f f f X.X.X.X.X.X.X.X.X.X.X.f f f f f f f f f f f ", -"......................f f f f f f f f f f f X.X.X.X.X.X.X.X.X.X.X.f f f f f f f f f f f ", -"......................f f f f f f f f f f f X.X.X.X.X.X.X.X.X.X.X.f f f f f f f f f f f ", -"..o.O.O.+...+.O.O.o...f I n n x f x n n I f X.@.#.#.$.X.$.#.#[email protected] R D D C f C D D R f ", -"..%.&.&.*...O.&.&.&...f W G G v f n G G G f X.=.-.-.;.X.#.-.-.-.X.f ! J J A f D J J J f ", -"..o.%.&.:...+.&.>.o...f I W G b f x G P I f X.@.=.-.,.X.$.-.<[email protected] R ! J S f C J T R f ", -"....+.>.&.:.>.&.o.....f f x P G b P G I f f X.X.$.<.-.,.<[email protected] f C T J S T J R f f ", -"......+.>.&.&.O.......f f f x P G G n f f f X.X.X.$.<.-.-.#.X.X.X.f f f C T J J D f f f ", -"........*.&.>.+.......f f f f v G P x f f f X.X.X.X.;.-.<.$.X.X.X.f f f f A J T C f f f ", -"......*.&.%.&.%.......f f f v G W G W f f f X.X.X.;.-.=.-.=.X.X.X.f f f A J ! J ! f f f ", -"....O.&.*...:.&.*.....f f n G v f b G v f f X.X.#.-.;.X.,.-.;.X.X.f f D J A f S J A f f ", -"..1.&.&.*...O.&.&.%.+.f c G G v f n G G W x X.2.-.-.;.X.#.-.-.=.$.f Z J J A f D J J ! C ", -"..>.&.&.>...1.&.&.&.o.f P G G P f c G G G I X.<.-.-.<[email protected] T J J T f Z J J J R ", -"......................f f f f f f f f f f f X.X.X.X.X.X.X.X.X.X.X.f f f f f f f f f f f ", -"......................f f f f f f f f f f f X.X.X.X.X.X.X.X.X.X.X.f f f f f f f f f f f ", -"......................f f f f f f f f f f f X.X.X.X.X.X.X.X.X.X.X.f f f f f f f f f f f ", -"......................f f f f f f f f f f f X.X.X.X.X.X.X.X.X.X.X.f f f f f f f f f f f ", -"......................f f f f f f f f f f f X.X.X.X.X.X.X.X.X.X.X.f f f f f f f f f f f ", -"......................f f f f f f f f f f f X.X.X.X.X.X.X.X.X.X.X.f f f f f f f f f f f ", -"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ", -"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ", -"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ", -"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ", -"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ", -"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ", -"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ", -"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ", -"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ", -"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ", -"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ", -"f P G G G G G G G I f f P G G G G G G G I f f T J J J J J J J R f f T J J J J J J J R f ", -"f c v v v v v v v x f f c v v v v v v v x f f Z A A A A A A A C f f Z A A A A A A A C f ", -"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ", -"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ", -"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ", -"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ", -"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ", -"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ", -"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ", -"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f ", -"f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f " -}; diff --git a/kscreensaver/kdesavers/vm_random.c b/kscreensaver/kdesavers/vm_random.c deleted file mode 100644 index ea0cd96a..00000000 --- a/kscreensaver/kdesavers/vm_random.c +++ /dev/null @@ -1,379 +0,0 @@ -/* - * Copyright (c) 1983 Regents of the University of California. - * All rights reserved. - * - * Redistribution and use in source and binary forms are permitted - * provided that the above copyright notice and this paragraph are - * duplicated in all such forms and that any documentation, - * advertising materials, and other materials related to such - * distribution and use acknowledge that the software was developed - * by the University of California, Berkeley. The name of the - * University may not be used to endorse or promote products derived - * from this software without specific prior written permission. - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -/* - * Please note that as of July 22, 1999, the licensees and distributors - * are no longer required to include the above mentioned acknowledgement - * within advertising materials. For full details see - * ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change - */ - -/* - * This is derived from the Berkeley source: - * @(#)random.c 5.5 (Berkeley) 7/6/88 - * It was reworked for the GNU C Library by Roland McGrath. - * Rewritten to be reentrant by Ulrich Drepper, 1995 - */ - -#include <limits.h> -#include <stdlib.h> -#include "vm_random.h" - -/* An improved random number generation package. In addition to the standard - rand()/srand() like interface, this package also has a special state info - interface. The initstate() routine is called with a seed, an array of - bytes, and a count of how many bytes are being passed in; this array is - then initialized to contain information for random number generation with - that much state information. Good sizes for the amount of state - information are 32, 64, 128, and 256 bytes. The state can be switched by - calling the setstate() function with the same array as was initialized - with initstate(). By default, the package runs with 128 bytes of state - information and generates far better random numbers than a linear - congruential generator. If the amount of state information is less than - 32 bytes, a simple linear congruential R.N.G. is used. Internally, the - state information is treated as an array of longs; the zeroth element of - the array is the type of R.N.G. being used (small integer); the remainder - of the array is the state information for the R.N.G. Thus, 32 bytes of - state information will give 7 longs worth of state information, which will - allow a degree seven polynomial. (Note: The zeroth word of state - information also has some other information stored in it; see setstate - for details). The random number generation technique is a linear feedback - shift register approach, employing trinomials (since there are fewer terms - to sum up that way). In this approach, the least significant bit of all - the numbers in the state table will act as a linear feedback shift register, - and will have period 2^deg - 1 (where deg is the degree of the polynomial - being used, assuming that the polynomial is irreducible and primitive). - The higher order bits will have longer periods, since their values are - also influenced by pseudo-random carries out of the lower bits. The - total period of the generator is approximately deg*(2**deg - 1); thus - doubling the amount of state information has a vast influence on the - period of the generator. Note: The deg*(2**deg - 1) is an approximation - only good for large deg, when the period of the shift register is the - dominant factor. With deg equal to seven, the period is actually much - longer than the 7*(2**7 - 1) predicted by this formula. */ - - - -/* For each of the currently supported random number generators, we have a - break value on the amount of state information (you need at least this many - bytes of state info to support this random number generator), a degree for - the polynomial (actually a trinomial) that the R.N.G. is based on, and - separation between the two lower order coefficients of the trinomial. */ - -/* Linear congruential. */ -#define TYPE_0 0 -#define BREAK_0 8 -#define DEG_0 0 -#define SEP_0 0 - -/* x**7 + x**3 + 1. */ -#define TYPE_1 1 -#define BREAK_1 32 -#define DEG_1 7 -#define SEP_1 3 - -/* x**15 + x + 1. */ -#define TYPE_2 2 -#define BREAK_2 64 -#define DEG_2 15 -#define SEP_2 1 - -/* x**31 + x**3 + 1. */ -#define TYPE_3 3 -#define BREAK_3 128 -#define DEG_3 31 -#define SEP_3 3 - -/* x**63 + x + 1. */ -#define TYPE_4 4 -#define BREAK_4 256 -#define DEG_4 63 -#define SEP_4 1 - - -/* Array versions of the above information to make code run faster. - Relies on fact that TYPE_i == i. */ - -#define MAX_TYPES 5 /* Max number of types above. */ - -struct vm_random_poly_info -{ - int seps[MAX_TYPES]; - int degrees[MAX_TYPES]; -}; - -static struct vm_random_poly_info vm_random_poly_info = -{ - { SEP_0, SEP_1, SEP_2, SEP_3, SEP_4 }, - { DEG_0, DEG_1, DEG_2, DEG_3, DEG_4 } -}; - -static int32_t vm_randtbl[DEG_3 + 1] = - { - TYPE_3, - - -1726662223, 379960547, 1735697613, 1040273694, 1313901226, - 1627687941, -179304937, -2073333483, 1780058412, -1989503057, - -615974602, 344556628, 939512070, -1249116260, 1507946756, - -812545463, 154635395, 1388815473, -1926676823, 525320961, - -1009028674, 968117788, -123449607, 1284210865, 435012392, - -2017506339, -911064859, -370259173, 1132637927, 1398500161, - -205601318, - }; - -/* Initialize the random number generator based on the given seed. If the - type is the trivial no-state-information type, just remember the seed. - Otherwise, initializes state[] based on the given "seed" via a linear - congruential generator. Then, the pointers are set to known locations - that are exactly rand_sep places apart. Lastly, it cycles the state - information a given number of times to get rid of any initial dependencies - introduced by the L.C.R.N.G. Note that the initialization of randtbl[] - for default usage relies on values produced by this routine. */ -int vm_srandom (unsigned int seed, - struct vm_random_data* buf) -{ - int type; - int32_t *state; - long int i; - long int word; - int32_t *dst; - int kc; - - if (buf == NULL) - goto fail; - type = buf->vm_rand_type; - if ((unsigned int) type >= MAX_TYPES) - goto fail; - - state = buf->state; - /* We must make sure the seed is not 0. Take arbitrarily 1 in this case. */ - if (seed == 0) - seed = 1; - state[0] = seed; - if (type == TYPE_0) - goto done; - - dst = state; - word = seed; - kc = buf->vm_rand_deg; - for (i = 1; i < kc; ++i) - { - /* This does: - state[i] = (16807 * state[i - 1]) % 2147483647; - but avoids overflowing 31 bits. */ - long int hi = word / 127773; - long int lo = word % 127773; - word = 16807 * lo - 2836 * hi; - if (word < 0) - word += 2147483647; - *++dst = word; - } - - buf->fptr = &state[buf->vm_rand_sep]; - buf->rptr = &state[0]; - kc *= 10; - while (--kc >= 0) - { - vm_random (buf); - } - - done: - return 0; - - fail: - return -1; -} - -/* Initialize the state information in the given array of N bytes for - future random number generation. Based on the number of bytes we - are given, and the break values for the different R.N.G.'s, we choose - the best (largest) one we can and set things up for it. srandom is - then called to initialize the state information. Note that on return - from srandom, we set state[-1] to be the type multiplexed with the current - value of the rear pointer; this is so successive calls to initstate won't - lose this information and will be able to restart with setstate. - Note: The first thing we do is save the current state, if any, just like - setstate so that it doesn't matter when initstate is called. - Returns a pointer to the old state. */ -int vm_initstate (unsigned int seed, - void* arg_state, - size_t n, - struct vm_random_data* buf) -{ - int type; - int degree; - int separation; - int32_t *state; - - if (buf == NULL) - goto fail; - - if (n >= BREAK_3) - type = n < BREAK_4 ? TYPE_3 : TYPE_4; - else if (n < BREAK_1) - { - if (n < BREAK_0) - { - goto fail; - } - type = TYPE_0; - } - else - type = n < BREAK_2 ? TYPE_1 : TYPE_2; - - degree = vm_random_poly_info.degrees[type]; - separation = vm_random_poly_info.seps[type]; - - buf->vm_rand_type = type; - buf->vm_rand_sep = separation; - buf->vm_rand_deg = degree; - state = &((int32_t *) arg_state)[1]; /* First location. */ - /* Must set END_PTR before srandom. */ - buf->end_ptr = &state[degree]; - - buf->state = state; - - vm_srandom (seed, buf); - - state[-1] = TYPE_0; - if (type != TYPE_0) - state[-1] = (buf->rptr - state) * MAX_TYPES + type; - - return 0; - - fail: - return -1; -} - -/* Restore the state from the given state array. - Note: It is important that we also remember the locations of the pointers - in the current state information, and restore the locations of the pointers - from the old state information. This is done by multiplexing the pointer - location into the zeroth word of the state information. Note that due - to the order in which things are done, it is OK to call setstate with the - same state as the current state - Returns a pointer to the old state information. */ -int vm_setstate (void* arg_state, - struct vm_random_data* buf) -{ - int32_t *new_state = (int32_t *) arg_state; - int type; - int old_type; - int32_t *old_state; - int degree; - int separation; - - if (buf == NULL) - goto fail; - - old_type = buf->vm_rand_type; - old_state = buf->state; - if (old_type == TYPE_0) - old_state[-1] = TYPE_0; - else - old_state[-1] = (MAX_TYPES * (buf->rptr - old_state)) + old_type; - - type = new_state[0] % MAX_TYPES; - if (type < TYPE_0 || type >= TYPE_4) - goto fail; - - buf->vm_rand_deg = degree = vm_random_poly_info.degrees[type]; - buf->vm_rand_sep = separation = vm_random_poly_info.seps[type]; - buf->vm_rand_type = type; - - if (type != TYPE_0) - { - int rear = new_state[0] / MAX_TYPES; - buf->rptr = &new_state[rear]; - buf->fptr = &new_state[(rear + separation) % degree]; - } - buf->state = &new_state[1]; - /* Set end_ptr too. */ - buf->end_ptr = &new_state[degree]; - - return 0; - - fail: - return -1; -} - -/* If we are using the trivial TYPE_0 R.N.G., just do the old linear - congruential bit. Otherwise, we do our fancy trinomial stuff, which is the - same in all the other cases due to all the global variables that have been - set up. The basic operation is to add the number at the rear pointer into - the one at the front pointer. Then both pointers are advanced to the next - location cyclically in the table. The value returned is the sum generated, - reduced to 31 bits by throwing away the "least random" low bit. - Note: The code takes advantage of the fact that both the front and - rear pointers can't wrap on the same call by not testing the rear - pointer if the front one has wrapped. Returns a 31-bit random number. */ - -int32_t vm_random (struct vm_random_data* buf) -{ - int32_t *state; - int32_t result; - - if (buf == NULL) - goto fail; - - state = buf->state; - - if (buf->vm_rand_type == TYPE_0) - { - int32_t val = state[0]; - val = ((state[0] * 1103515245) + 12345) & 0x7fffffff; - state[0] = val; - result = val; - } - else - { - int32_t *fptr = buf->fptr; - int32_t *rptr = buf->rptr; - int32_t *end_ptr = buf->end_ptr; - int32_t val; - - val = *fptr += *rptr; - /* Chucking least random bit. */ - result = (val >> 1) & 0x7fffffff; - ++fptr; - if (fptr >= end_ptr) - { - fptr = state; - ++rptr; - } - else - { - ++rptr; - if (rptr >= end_ptr) - rptr = state; - } - buf->fptr = fptr; - buf->rptr = rptr; - } - return result; - - fail: - return -1; -} - -void vm_default_initstate( int seed, - struct vm_random_data* buf ) { - vm_initstate( seed, - vm_randtbl, - 128, - buf ); -} diff --git a/kscreensaver/kdesavers/vm_random.h b/kscreensaver/kdesavers/vm_random.h deleted file mode 100644 index 1aa5e937..00000000 --- a/kscreensaver/kdesavers/vm_random.h +++ /dev/null @@ -1,31 +0,0 @@ -#ifndef __VM_RANDOM_H__ -#define __VM_RANDOM_H__ - -#define VM_RAND_MAX 2147483647 - -#define int32_t int - -struct vm_random_data -{ - int32_t *fptr; /* Front pointer. */ - int32_t *rptr; /* Rear pointer. */ - int32_t *state; /* Array of state values. */ - int vm_rand_type; /* Type of random number generator. */ - int vm_rand_deg; /* Degree of random number generator. */ - int vm_rand_sep; /* Distance between front and rear. */ - int32_t *end_ptr; /* Pointer behind state table. */ -}; - -int vm_initstate (unsigned int seed, - void* arg_state, - size_t n, - struct vm_random_data* buf); -int vm_setstate (void* arg_state, - struct vm_random_data* buf); -void vm_default_initstate( int seed, - struct vm_random_data* buf ); -int vm_srandom (unsigned int seed, - struct vm_random_data* buf); -int32_t vm_random (struct vm_random_data* buf); - -#endif /* !defined( __VM_RANDOM_H__ ) */ diff --git a/kscreensaver/kdesavers/wave.cpp b/kscreensaver/kdesavers/wave.cpp deleted file mode 100644 index f2f03544..00000000 --- a/kscreensaver/kdesavers/wave.cpp +++ /dev/null @@ -1,324 +0,0 @@ -//----------------------------------------------------------------------------- -// -// kwave - Waveing Flag Screen Saver for KDE 2 -// -// Copyright (c) Ian Reinhart Geiser 2001 -// -#include <stdlib.h> -#include <tqlabel.h> -#include <tqlayout.h> -#include <kapplication.h> -#include <klocale.h> -#include <kconfig.h> -#include <kcolordialog.h> -#include <kbuttonbox.h> -#include <kcolorbutton.h> -#include <kglobal.h> -#include "wave.h" -#include "wave.moc" -#ifdef TQ_WS_MACX -#include <OpenGL/glu.h> -#include <OpenGL/gl.h> -#else -#include <GL/glu.h> -#include <GL/gl.h> -#endif -#include <tqimage.h> -#include <kdebug.h> -#include <tqpainter.h> -#include <tqradiobutton.h> -#include <tqspinbox.h> -#include <kstandarddirs.h> -#include <math.h> -#include <kmessagebox.h> -#ifndef GLU_NURBS_TEXTURE_COORD -#define GLU_NURBS_TEXTURE_COORD 100168 -#endif -// libkscreensaver interface - -extern "C" -{ - KDE_EXPORT const char *kss_applicationName = "kwave.kss"; - KDE_EXPORT const char *kss_description = I18N_NOOP( "Bitmap Wave Screen Saver" ); - KDE_EXPORT const char *kss_version = "2.2.0"; - - KDE_EXPORT KScreenSaver *kss_create( WId id ) - { - return new KWaveSaver( id ); - } - - KDE_EXPORT TQDialog *kss_setup() - { - return new KWaveSetup(); - } -} - -//----------------------------------------------------------------------------- -// dialog to setup screen saver parameters -// -KWaveSetup::KWaveSetup( TQWidget *parent, const char *name ) - : SetupUi( parent, name, TRUE ) -{ - readSettings(); - - preview->setFixedSize( 220, 170 ); - preview->setBackgroundColor( black ); - preview->show(); // otherwise saver does not get correct size - saver = new KWaveSaver( preview->winId() ); - - connect( PushButton1, TQT_SIGNAL( clicked() ), TQT_SLOT( slotOkPressed() ) ); - connect( PushButton2, TQT_SIGNAL( clicked() ), TQT_SLOT( reject() ) ); - connect( PushButton3, TQT_SIGNAL( clicked() ), TQT_SLOT( aboutPressed() ) ); - connect( SpinBox1, TQT_SIGNAL( valueChanged(int)), saver, TQT_SLOT( updateSize(int))); - connect( RadioButton1, TQT_SIGNAL( toggled(bool)), saver, TQT_SLOT( doStars(bool))); - -} - -KWaveSetup::~KWaveSetup( ) -{ - delete saver; -} - - -// read settings from config file -void KWaveSetup::readSettings() -{ - TDEConfig *config = TDEGlobal::config(); - config->setGroup( "Settings" ); - -// color = config->readColorEntry( "Color", &black ); -} - -// Ok pressed - save settings and exit -void KWaveSetup::slotOkPressed() -{ - TDEConfig *config = TDEGlobal::config(); - config->setGroup( "Settings" ); - -// config->writeEntry( "Color", color ); - - config->sync(); - - accept(); -} - -void KWaveSetup::aboutPressed() -{ - KMessageBox::about(this, - i18n("<h3>Bitmap Flag Screen Saver</h3>\n<p>Waving Flag Screen Saver for TDE</p>\nCopyright (c) Ian Reinhart Geiser 2001")); -} -//----------------------------------------------------------------------------- - - -KWaveSaver::KWaveSaver( WId id ) : KScreenSaver( id ) -{ - kdDebug() << "Blank" << endl; - readSettings(); - - timer = new TQTimer( this ); - timer->start( 50, TRUE ); - setBackgroundColor( black ); - erase(); - wave = new Wave(); - embed(wave); - wave->show(); - connect( timer, TQT_SIGNAL(timeout()), this, TQT_SLOT(blank()) );; -} - -KWaveSaver::~KWaveSaver() -{ - -} - -// read configuration settings from config file -void KWaveSaver::readSettings() -{ - TDEConfig *config = TDEGlobal::config(); - config->setGroup( "Settings" ); - -// color = config->readColorEntry( "Color", &black ); -} - -void KWaveSaver::blank() -{ - // Play wave - - wave->updateGL(); - timer->start( 100, TRUE ); - -} -Wave::Wave( TQWidget * parent, const char * name) : TQGLWidget (parent,name) -{ - pNurb = 0; - - nNumPoints = 4; - index = 0; -} - -Wave::~Wave() -{ - glDeleteTextures( 1, &texture[0] ); - gluDeleteNurbsRenderer(pNurb); -} - -/** setup the GL enviroment */ -void Wave::initializeGL () -{ - - kdDebug() << "InitGL" << endl; - - /* Load in the texture */ - if ( !LoadGLTextures( ) ) - exit(0); - - /* Enable Texture Mapping ( NEW ) */ - glEnable( GL_TEXTURE_2D ); - - /* Enable smooth shading */ - glShadeModel( GL_SMOOTH ); - // Light values and coordinates - GLfloat specular[] = { 0.7f, 0.0f, 0.0f, 1.0f}; - GLfloat shine[] = { 75.0f }; - - glClearColor(0.0f, 0.0f, 0.0f, 0.0f ); - - glEnable(GL_LIGHTING); - glEnable(GL_LIGHT0); - - glEnable(GL_COLOR_MATERIAL); - - glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); - glMaterialfv(GL_FRONT, GL_SPECULAR, specular); - glMaterialfv(GL_FRONT, GL_SHININESS, shine); - - glEnable(GL_AUTO_NORMAL); - - - pNurb = gluNewNurbsRenderer(); - - gluNurbsProperty(pNurb, GLU_SAMPLING_TOLERANCE, 25.0f); - // Uncomment the next line and comment the one following to produce a - // wire frame mesh. - //gluNurbsProperty(pNurb, GLU_DISPLAY_MODE, GLU_OUTLINE_POLYGON); - gluNurbsProperty(pNurb, GLU_DISPLAY_MODE, (GLfloat)GLU_FILL); - glEnable(GL_MAP2_TEXTURE_COORD_3); - glEnable(GL_MAP2_VERTEX_3); - glEnable(GL_BLEND); - -} -/** resize the gl view */ -void Wave::resizeGL ( int w, int h) -{ - kdDebug() << "ResizeGL " << w << "," <<h<< endl; - // Prevent a divide by zero - if(h == 0) - h = 1; - - // Set Viewport to window dimensions - glViewport(0, 0, w, h); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - - // Perspective view - gluPerspective (45.0f, (GLdouble)w/(GLdouble)h, 1.0, 40.0f); - - // Modelview matrix reset - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - - // Viewing transformation, position for better view - glTranslatef (0.0f, 0.0f, -20.0f); - -} -/** paint the GL view */ -void Wave::paintGL () -{ - - float ctrlPoints[4][4][3]; - - index++; - float Z[16]; - for( int i = 0; i < 16; i++) - { - Z[i] = 3.0 * sin(16*(3.141592654 * 2.0f) * (index+(i))/360); - } - -// kdDebug() << "-----" << endl; - int counter =15; - for( int i = 0; i < 4; i++) - for( int j = 0; j < 4;j++) - { - ctrlPoints[i][j][0] = float((5*i)-10); - ctrlPoints[i][j][1] = float((3*j)-6); - ctrlPoints[i][j][2] = Z[counter--]; -// kdDebug() << Z[counter] << endl; - } - // Knot sequence for the NURB - float knots[8] = { 0, 0, 0, 0, 1, 1, 1, 1 }; - // Draw in Blu - //glColor3ub(0,0,220); - - // Clear the window with current clearing color - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - // Save the modelview matrix stack - glMatrixMode(GL_MODELVIEW); - glPushMatrix(); - - // Rotate the mesh around to make it easier to see - glRotatef(index/2, 1.0f,0.0f,0.0f); - glRotatef(index/5, 0.0f,1.0f,0.0f); - glRotatef(index/6, 0.0f,0.0f,1.0f); - - // Render the NURB - gluBeginSurface( pNurb ); - gluNurbsSurface( pNurb, 8, knots, 8, knots, - 4*3, 3, &ctrlPoints[0][0][0], 4, 4, GL_MAP2_TEXTURE_COORD_3); - //gluNurbsSurface( pNurb, 8, knots, 8, knots, - //4*3, 3, &ctrlPoints[0][0][0], 4, 4, GL_MAP2_NORMAL ); - gluNurbsSurface( pNurb, 8, knots, 8, knots, - 4*3, 3, &ctrlPoints[0][0][0], 4, 4, GL_MAP2_VERTEX_3 ); - gluEndSurface( pNurb ); - - // Restore the modelview matrix - glPopMatrix(); - - glFlush(); -} - -bool Wave::LoadGLTextures() -{ - /* Status indicator */ - bool Status = TRUE; - - TQImage buf; // = TQPixmap::grabWindow ( 0 ).convertToImage(); - kdDebug() << "Loading: " << locate("data", "kscreensaver/image.png") << endl; - if (buf.load( locate("data", "kscreensaver/image.png") ) ) - - { - tex = convertToGLFormat(buf); // flipped 32bit RGBA - kdDebug() << "Texture loaded: " << tex.numBytes () << endl; - } - else - { - TQImage dummy( 64, 64, 64 ); - dummy.fill( TQt::white.rgb() ); - buf = dummy; - tex = convertToGLFormat( buf ); - } - /* Set the status to true */ - //Status = TRUE; - glGenTextures(1, &texture[0]); /* create three textures */ - glBindTexture(GL_TEXTURE_2D, texture[0]); - /* use linear filtering */ - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); - /* actually generate the texture */ - glTexImage2D(GL_TEXTURE_2D, 0, 4, tex.width(), tex.height(), 0, - GL_RGBA, GL_UNSIGNED_BYTE, tex.bits()); - kdDebug() << "Texture Loaded: " << tex.width() << "," << tex.height() << endl; - - - return Status; -} diff --git a/kscreensaver/kdesavers/wave.h b/kscreensaver/kdesavers/wave.h deleted file mode 100644 index 7d1c2e1a..00000000 --- a/kscreensaver/kdesavers/wave.h +++ /dev/null @@ -1,100 +0,0 @@ -//----------------------------------------------------------------------------- -// -// kwave - Partical Wave Screen Saver for KDE 2 -// -// Copyright (c) Ian Reinhart Geiser 2001 -// -///// -//NOTE: -// The base particle engine did not come from me, it was designed by Jeff Molofee <[email protected]> -// I did some extensive modifications to make it work with QT's OpenGL but the base principal is about -// the same. -//// - -#ifndef __WAVE_H__ -#define __WAVE_H__ - -#include <tqdialog.h> -#include <tqgl.h> -#ifdef TQ_WS_MACX -#include <OpenGL/glu.h> -#include <OpenGL/gl.h> -#else -#include <GL/glu.h> -#include <GL/gl.h> -#endif -#include <kscreensaver.h> -#include <tqtimer.h> -#include <tqimage.h> -#include "wavecfg.h" - - -class Wave : public TQGLWidget -{ -Q_OBJECT - - -public: - Wave( TQWidget * parent=0, const char * name=0 ); - ~Wave(); - -protected: - /** paint the GL view */ - void paintGL (); - /** resize the gl view */ - void resizeGL ( int w, int h ); - /** setup the GL enviroment */ - void initializeGL (); - - -private: -// - GLUnurbsObj *pNurb; - GLint nNumPoints; -// float ctrlPoints[4][4][3]; -// float knots[8]; - int index; - bool LoadGLTextures(); - GLuint texture[1]; - TQImage tex; - -}; - -class KWaveSaver : public KScreenSaver -{ -Q_OBJECT - -public: - KWaveSaver( WId drawable ); - virtual ~KWaveSaver(); - void readSettings(); -public slots: - void blank(); - -private: - Wave *wave; - TQTimer *timer; -}; - -class KWaveSetup : public SetupUi -{ - Q_OBJECT - -public: - KWaveSetup( TQWidget *parent = NULL, const char *name = NULL ); - ~KWaveSetup( ); -protected: - void readSettings(); - -private slots: - void slotOkPressed(); - void aboutPressed(); -private: - KWaveSaver *saver; - float size; - float stars; -}; - -#endif - - diff --git a/kscreensaver/kdesavers/wavecfg.ui b/kscreensaver/kdesavers/wavecfg.ui deleted file mode 100644 index 9ad24416..00000000 --- a/kscreensaver/kdesavers/wavecfg.ui +++ /dev/null @@ -1,191 +0,0 @@ -<!DOCTYPE UI><UI version="3.0" stdsetdef="1"> -<class>SetupUi</class> -<widget class="TQDialog"> - <property name="name"> - <cstring>SetupUi</cstring> - </property> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>400</width> - <height>209</height> - </rect> - </property> - <property name="sizePolicy"> - <sizepolicy> - <hsizetype>0</hsizetype> - <vsizetype>0</vsizetype> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="minimumSize"> - <size> - <width>400</width> - <height>209</height> - </size> - </property> - <property name="baseSize"> - <size> - <width>400</width> - <height>250</height> - </size> - </property> - <property name="caption"> - <string>Bitmap Flag Setup</string> - </property> - <widget class="TQLayoutWidget"> - <property name="name"> - <cstring>Layout4</cstring> - </property> - <property name="geometry"> - <rect> - <x>1</x> - <y>1</y> - <width>398</width> - <height>206</height> - </rect> - </property> - <grid> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <property name="margin"> - <number>0</number> - </property> - <property name="spacing"> - <number>6</number> - </property> - <widget class="TQCheckBox" row="3" column="0"> - <property name="name"> - <cstring>CheckBox1</cstring> - </property> - <property name="text"> - <string>Use textures</string> - </property> - </widget> - <widget class="TQPushButton" row="4" column="2"> - <property name="name"> - <cstring>PushButton3</cstring> - </property> - <property name="text"> - <string>&About</string> - </property> - </widget> - <widget class="TQSpinBox" row="1" column="0"> - <property name="name"> - <cstring>SpinBox1</cstring> - </property> - <property name="maxValue"> - <number>500</number> - </property> - <property name="minValue"> - <number>10</number> - </property> - <property name="lineStep"> - <number>10</number> - </property> - </widget> - <widget class="TQPushButton" row="4" column="1"> - <property name="name"> - <cstring>PushButton2</cstring> - </property> - <property name="text"> - <string>&Cancel</string> - </property> - </widget> - <widget class="TQPushButton" row="4" column="0"> - <property name="name"> - <cstring>PushButton1</cstring> - </property> - <property name="text"> - <string>&OK</string> - </property> - <property name="default"> - <bool>true</bool> - </property> - </widget> - <widget class="TQGroupBox" row="2" column="0"> - <property name="name"> - <cstring>GroupBox1</cstring> - </property> - <property name="title"> - <string>Shapes</string> - </property> - <widget class="TQLayoutWidget"> - <property name="name"> - <cstring>Layout3</cstring> - </property> - <property name="geometry"> - <rect> - <x>10</x> - <y>20</y> - <width>130</width> - <height>50</height> - </rect> - </property> - <vbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <property name="margin"> - <number>0</number> - </property> - <property name="spacing"> - <number>6</number> - </property> - <widget class="TQRadioButton"> - <property name="name"> - <cstring>RadioButton1</cstring> - </property> - <property name="text"> - <string>Stars</string> - </property> - <property name="checked"> - <bool>true</bool> - </property> - </widget> - <widget class="TQRadioButton"> - <property name="name"> - <cstring>RadioButton1_2</cstring> - </property> - <property name="text"> - <string>Flares</string> - </property> - </widget> - </vbox> - </widget> - </widget> - <widget class="TQWidget" row="0" column="1" rowspan="4" colspan="2"> - <property name="name"> - <cstring>preview</cstring> - </property> - </widget> - <widget class="TQLabel" row="0" column="0"> - <property name="name"> - <cstring>TextLabel1</cstring> - </property> - <property name="text"> - <string>Particle size:</string> - </property> - </widget> - </grid> - </widget> -</widget> -<connections> - <connection> - <sender>RadioButton1_2</sender> - <signal>pressed()</signal> - <receiver>RadioButton1</receiver> - <slot>toggle()</slot> - </connection> - <connection> - <sender>RadioButton1</sender> - <signal>pressed()</signal> - <receiver>RadioButton1_2</receiver> - <slot>toggle()</slot> - </connection> -</connections> -<layoutdefaults spacing="6" margin="11"/> -</UI> |