diff options
author | toma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2009-11-25 17:56:58 +0000 |
---|---|---|
committer | toma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2009-11-25 17:56:58 +0000 |
commit | 8b2aa1b5301ab60368a03e36df4ff5216726e87d (patch) | |
tree | 36163d4ee667c23b5cf232df2f3004cd0a76202a /kscreensaver/kdesavers | |
download | tdeartwork-8b2aa1b5301ab60368a03e36df4ff5216726e87d.tar.gz tdeartwork-8b2aa1b5301ab60368a03e36df4ff5216726e87d.zip |
Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features.
BUG:215923
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdeartwork@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'kscreensaver/kdesavers')
96 files changed, 30971 insertions, 0 deletions
diff --git a/kscreensaver/kdesavers/Euphoria.cpp b/kscreensaver/kdesavers/Euphoria.cpp new file mode 100644 index 00000000..740e957c --- /dev/null +++ b/kscreensaver/kdesavers/Euphoria.cpp @@ -0,0 +1,1084 @@ +//============================================================================ +// +// 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 <qtimer.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( QWidget* parent, const char* name ) + : QGLWidget(parent, name), texName(0), _wisps(0), _backwisps(0), + feedbackmap(0), feedbacktex(0) +{ + setDefaults( Regular ); + + _frameTime = 1000 / 60; + _timer = new QTimer( this ); + connect( _timer, SIGNAL(timeout()), this, 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( QKeyEvent* e ) +{ + if( e->key() == Qt::Key_0 ) { setDefaults( 0 ); updateParameters(); } + if( e->key() == Qt::Key_1 ) { setDefaults( 1 ); updateParameters(); } + if( e->key() == Qt::Key_2 ) { setDefaults( 2 ); updateParameters(); } + if( e->key() == Qt::Key_3 ) { setDefaults( 3 ); updateParameters(); } + if( e->key() == Qt::Key_4 ) { setDefaults( 4 ); updateParameters(); } + if( e->key() == Qt::Key_5 ) { setDefaults( 5 ); updateParameters(); } + if( e->key() == Qt::Key_6 ) { setDefaults( 6 ); updateParameters(); } + if( e->key() == Qt::Key_7 ) { setDefaults( 7 ); updateParameters(); } + if( e->key() == Qt::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 QDialog* 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() +{ + KConfig* config = KGlobal::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 <qlayout.h> +#include <qlabel.h> +#include <qcombobox.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( QWidget* parent, const char* name ) + : KDialogBase( parent, name, true, i18n("Setup Euphoria Screen Saver"), + Ok|Cancel|Help, Ok, true ) +{ + setButtonText( Help, i18n( "A&bout" ) ); + + QWidget *main = makeMainWidget(); + + QHBoxLayout* top = new QHBoxLayout(main, 0, spacingHint()); + QVBoxLayout* leftCol = new QVBoxLayout; + top->addLayout( leftCol ); + + QLabel* label = new QLabel( i18n("Mode:"), main ); + leftCol->addWidget( label ); + + modeW = new QComboBox( main ); + int i = 0; + while (defaultText[i]) + modeW->insertItem( i18n(defaultText[i++]) ); + leftCol->addWidget( modeW ); + + leftCol->addStretch(); + + // Preview + QWidget* preview; + preview = new QWidget( 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, SIGNAL(activated(int)), _saver, 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>"), + QString::null, KMessageBox::AllowLink); +} + + +/** + Ok pressed - save settings and exit +*/ +void KEuphoriaSetup::slotOk() +{ + KConfig* config = KGlobal::config(); + config->setGroup("Settings"); + + QString 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 <qapplication.h> + +int main( int argc, char** argv ) +{ + QApplication 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 new file mode 100644 index 00000000..b7de2677 --- /dev/null +++ b/kscreensaver/kdesavers/Euphoria.h @@ -0,0 +1,155 @@ +#ifndef __EUPHORIASS_H__ +#define __EUPHORIASS_H__ +//============================================================================ +// +// Terence Welsh Screensaver - Euphoria +// http://www.reallyslick.com/ +// +// KDE port by Karl Robillard +// +//============================================================================ + + +#include <qgl.h> + +#include <kdialogbase.h> + +class wisp; +class QTimer; + +class EuphoriaWidget : public QGLWidget +{ + Q_OBJECT + +public: + + enum eDefault + { + Regular, + Grid, + Cubism, + BadMath, + MTheory, + UHFTEM, // ultra high frequency tunneling electron microscope + Nowhere, + Echo, + Kaleidoscope, + DefaultModes + }; + + EuphoriaWidget( QWidget* 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( QKeyEvent* ); +#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 QTimer rather than timerEvent() to avoid getting locked out of + // the QEvent loop on lower-end systems. Ian Geiser <geiseri@kde.org> + // says this is the way to go. + QTimer* _timer; + int _frameTime; + + friend class wisp; +}; + + +#ifndef UNIT_TEST +#include <qdialog.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 QComboBox; + +class KEuphoriaSetup : public KDialogBase +{ + Q_OBJECT + +public: + KEuphoriaSetup( QWidget* parent = 0, const char* name = 0 ); + ~KEuphoriaSetup(); + +private slots: + void slotHelp(); + void slotOk(); + +private: + QComboBox* modeW; + KEuphoriaScreenSaver* _saver; +}; +#endif + +#endif //__EUPHORIASS_H__ diff --git a/kscreensaver/kdesavers/EuphoriaTexture.h b/kscreensaver/kdesavers/EuphoriaTexture.h new file mode 100644 index 00000000..5a6962b4 --- /dev/null +++ b/kscreensaver/kdesavers/EuphoriaTexture.h @@ -0,0 +1,4138 @@ +/* + * 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 new file mode 100644 index 00000000..403c07b6 --- /dev/null +++ b/kscreensaver/kdesavers/Flux.cpp @@ -0,0 +1,967 @@ +//============================================================================ +// +// 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 <qtimer.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( QWidget* parent, const char* name ) + : QGLWidget(parent, name), _fluxes(0) +{ + setDefaults( Regular ); + + _frameTime = 1000 / 60; + _timer = new QTimer( this ); + connect( _timer, SIGNAL(timeout()), this, 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( QKeyEvent* e ) +{ + if( e->key() == Qt::Key_0 ) { setDefaults( 0 ); updateParameters(); } + if( e->key() == Qt::Key_1 ) { setDefaults( 1 ); updateParameters(); } + if( e->key() == Qt::Key_2 ) { setDefaults( 2 ); updateParameters(); } + if( e->key() == Qt::Key_3 ) { setDefaults( 3 ); updateParameters(); } + if( e->key() == Qt::Key_4 ) { setDefaults( 4 ); updateParameters(); } + if( e->key() == Qt::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 QDialog* 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() +{ + KConfig* config = KGlobal::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 <qlayout.h> +#include <qpushbutton.h> +#include <qlabel.h> +#include <qcombobox.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( QWidget* parent, const char* name ) + : KDialogBase( parent, name, true, i18n( "Setup Flux Screen Saver" ), + Ok|Cancel|Help, Ok, true ) +{ + setButtonText( Help, i18n( "A&bout" ) ); + QWidget *main = makeMainWidget(); + + QHBoxLayout* top = new QHBoxLayout( main, 0, spacingHint() ); + QVBoxLayout* leftCol = new QVBoxLayout; + top->addLayout( leftCol ); + + // Parameters + QLabel* label = new QLabel( i18n("Mode:"), main ); + leftCol->addWidget( label ); + + modeW = new QComboBox( main ); + int i = 0; + while (defaultText[i]) + modeW->insertItem( i18n(defaultText[i++]) ); + leftCol->addWidget( modeW ); + + leftCol->addStretch(); + + // Preview + QWidget* preview; + preview = new QWidget( 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, SIGNAL(activated(int)), _saver, 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>"), + QString::null, KMessageBox::AllowLink); +} + + +/** + Ok pressed - save settings and exit +*/ +void KFluxSetup::slotOk() +{ + KConfig* config = KGlobal::config(); + config->setGroup("Settings"); + + QString 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 <qapplication.h> + +int main( int argc, char** argv ) +{ + QApplication 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 new file mode 100644 index 00000000..7fe20172 --- /dev/null +++ b/kscreensaver/kdesavers/Flux.h @@ -0,0 +1,147 @@ +#ifndef __FLUXSS_H__ +#define __FLUXSS_H__ +//============================================================================ +// +// Terence Welsh Screensaver - Flux +// http://www.reallyslick.com/ +// +// Ported to KDE by Karl Robillard +// +//============================================================================ + + +#include <qgl.h> + + +#define LIGHTSIZE 64 + + +class flux; +class particle; +class QTimer; + +class FluxWidget : public QGLWidget +{ + Q_OBJECT + +public: + + enum eDefault + { + Regular, + Hypnotic, + Insane, + Sparklers, + Paradigm, + Galactic, + DefaultModes + }; + + FluxWidget( QWidget* 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( QKeyEvent* ); +#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 QTimer rather than timerEvent() to avoid getting locked out of + // the QEvent loop on lower-end systems. Ian Geiser <geiseri@kde.org> + // says this is the way to go. + QTimer* _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 QComboBox; + +class KFluxSetup : public KDialogBase +{ + Q_OBJECT + +public: + + KFluxSetup( QWidget* parent = 0, const char* name = 0 ); + ~KFluxSetup(); + +private slots: + + void slotHelp(); + void slotOk(); + +private: + + QComboBox* modeW; + KFluxScreenSaver* _saver; +}; +#endif + + +#endif //__FLUXSS_H__ diff --git a/kscreensaver/kdesavers/KBanner.desktop b/kscreensaver/kdesavers/KBanner.desktop new file mode 100644 index 00000000..cfc11caf --- /dev/null +++ b/kscreensaver/kdesavers/KBanner.desktop @@ -0,0 +1,243 @@ +[Desktop Entry] +Exec=kbanner.kss +Icon=kscreensaver +Type=Application +Actions=Setup;InWindow;Root; +X-KDE-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 new file mode 100644 index 00000000..13aaba1b --- /dev/null +++ b/kscreensaver/kdesavers/KBlob.desktop @@ -0,0 +1,227 @@ +[Desktop Entry] +Exec=kblob.kss +Icon=kscreensaver +Type=Application +Actions=Setup;InWindow;Root; +X-KDE-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 new file mode 100644 index 00000000..78a82d76 --- /dev/null +++ b/kscreensaver/kdesavers/KClock.desktop @@ -0,0 +1,252 @@ +[Desktop Entry] +Exec=kclock.kss +Icon=kscreensaver +Type=Application +Actions=Setup;InWindow;Root; +X-KDE-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 new file mode 100644 index 00000000..8b62da28 --- /dev/null +++ b/kscreensaver/kdesavers/KEuphoria.desktop @@ -0,0 +1,233 @@ +[Desktop Entry] +Exec=keuphoria.kss +Icon=kscreensaver +Type=Application +Actions=Setup;InWindow;Root; +X-KDE-Category=OpenGL Screen Savers +X-KDE-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 new file mode 100644 index 00000000..14946cc9 --- /dev/null +++ b/kscreensaver/kdesavers/KFiresaver.desktop @@ -0,0 +1,233 @@ +[Desktop Entry] +Exec=kfiresaver.kss +Icon=kscreensaver +Type=Application +Actions=Setup;InWindow;Root; +X-KDE-Category=OpenGL Screen Savers +X-KDE-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 new file mode 100644 index 00000000..a431e385 --- /dev/null +++ b/kscreensaver/kdesavers/KFlux.desktop @@ -0,0 +1,224 @@ +[Desktop Entry] +Exec=kflux.kss +Icon=kscreensaver +Type=Application +Actions=Setup;InWindow;Root; +X-KDE-Category=OpenGL Screen Savers +X-KDE-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 new file mode 100644 index 00000000..cb9ada0b --- /dev/null +++ b/kscreensaver/kdesavers/KFountain.desktop @@ -0,0 +1,249 @@ +[Desktop Entry] +Exec=kfountain.kss +Icon=kscreensaver +Type=Application +Actions=Setup;InWindow;Root; +X-KDE-Category=OpenGL Screen Savers +X-KDE-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 new file mode 100644 index 00000000..16981acd --- /dev/null +++ b/kscreensaver/kdesavers/KGravity.desktop @@ -0,0 +1,253 @@ +[Desktop Entry] +Exec=kgravity.kss +Icon=kscreensaver +Type=Application +Actions=Setup;InWindow;Root; +X-KDE-Category=OpenGL Screen Savers +X-KDE-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 new file mode 100644 index 00000000..1f5f6e99 --- /dev/null +++ b/kscreensaver/kdesavers/KLines-saver.desktop @@ -0,0 +1,255 @@ +[Desktop Entry] +Exec=klines.kss +Icon=kscreensaver +Type=Application +Actions=Setup;InWindow;Root; +X-KDE-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 new file mode 100644 index 00000000..e8a94651 --- /dev/null +++ b/kscreensaver/kdesavers/KLorenz.desktop @@ -0,0 +1,244 @@ +[Desktop Entry] +Exec=klorenz.kss +Icon=kscreensaver +Type=Application +Actions=Setup;InWindow;Root; +X-KDE-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 new file mode 100644 index 00000000..0361dea2 --- /dev/null +++ b/kscreensaver/kdesavers/KPendulum.desktop @@ -0,0 +1,221 @@ +[Desktop Entry] +Exec=kpendulum.kss +Icon=kscreensaver +Type=Application +Actions=Setup;InWindow;Root; +X-KDE-Category=OpenGL Screen Savers +X-KDE-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 new file mode 100644 index 00000000..62c86869 --- /dev/null +++ b/kscreensaver/kdesavers/KPolygon.desktop @@ -0,0 +1,251 @@ +[Desktop Entry] +Exec=kpolygon.kss +Icon=kscreensaver +Type=Application +Actions=Setup;InWindow;Root; +X-KDE-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 new file mode 100644 index 00000000..9ec61439 --- /dev/null +++ b/kscreensaver/kdesavers/KRotation.desktop @@ -0,0 +1,221 @@ +[Desktop Entry] +Exec=krotation.kss +Icon=kscreensaver +Type=Application +Actions=Setup;InWindow;Root; +X-KDE-Category=OpenGL Screen Savers +X-KDE-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 new file mode 100644 index 00000000..4b4c9dfd --- /dev/null +++ b/kscreensaver/kdesavers/KScience.desktop @@ -0,0 +1,254 @@ +[Desktop Entry] +Exec=kscience.kss +Icon=kscreensaver +Type=Application +Actions=Setup;InWindow;Root; +X-KDE-Category=Desktop Distortions +X-KDE-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 new file mode 100644 index 00000000..3edb75da --- /dev/null +++ b/kscreensaver/kdesavers/KSlideshow.desktop @@ -0,0 +1,251 @@ +[Desktop Entry] +Exec=kslideshow.kss +Icon=kscreensaver +Type=Application +Actions=Setup;InWindow;Root; +X-KDE-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 new file mode 100644 index 00000000..fafbe5a9 --- /dev/null +++ b/kscreensaver/kdesavers/KSolarWinds.desktop @@ -0,0 +1,243 @@ +[Desktop Entry] +Exec=ksolarwinds.kss +Icon=kscreensaver +Type=Application +Actions=Setup;InWindow;Root; +X-KDE-Category=OpenGL Screen Savers +X-KDE-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 new file mode 100644 index 00000000..c30d8014 --- /dev/null +++ b/kscreensaver/kdesavers/KVm.desktop @@ -0,0 +1,253 @@ +[Desktop Entry] +Exec=kvm.kss +Icon=kscreensaver +Type=Application +Actions=Setup;InWindow;Root; +X-KDE-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 new file mode 100644 index 00000000..3b7093d2 --- /dev/null +++ b/kscreensaver/kdesavers/KWave.desktop @@ -0,0 +1,251 @@ +[Desktop Entry] +Exec=kwave.kss +Icon=kscreensaver +Type=Application +Actions=Setup;InWindow;Root; +X-KDE-Category=OpenGL Screen Savers +X-KDE-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 new file mode 100644 index 00000000..8f399401 --- /dev/null +++ b/kscreensaver/kdesavers/Makefile.am @@ -0,0 +1,102 @@ +# $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) +AM_LDADD = $(LIB_KDEUI) -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 + +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) + +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 new file mode 100644 index 00000000..694adefd --- /dev/null +++ b/kscreensaver/kdesavers/README @@ -0,0 +1,3 @@ +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 new file mode 100644 index 00000000..ee3743c0 --- /dev/null +++ b/kscreensaver/kdesavers/SolarWinds.cpp @@ -0,0 +1,778 @@ +//============================================================================ +// +// 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 <qtimer.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( QWidget* parent, const char* name ) + : QGLWidget(parent, name), _winds(0) +{ + setDefaults( Regular ); + + _frameTime = 1000 / 60; + _timer = new QTimer( this ); + connect( _timer, SIGNAL(timeout()), this, 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( QKeyEvent* e ) +{ + if( e->key() == Qt::Key_0 ) { setDefaults( 0 ); updateParameters(); } + if( e->key() == Qt::Key_1 ) { setDefaults( 1 ); updateParameters(); } + if( e->key() == Qt::Key_2 ) { setDefaults( 2 ); updateParameters(); } + if( e->key() == Qt::Key_3 ) { setDefaults( 3 ); updateParameters(); } + if( e->key() == Qt::Key_4 ) { setDefaults( 4 ); updateParameters(); } + if( e->key() == Qt::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 QDialog* 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() +{ + KConfig* config = KGlobal::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 <qlayout.h> +#include <qlabel.h> +#include <qcombobox.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( QWidget* parent, const char* name ) + : KDialogBase( parent, name, true, i18n( "Setup Solar Wind" ), + Ok|Cancel|Help, Ok, true ) +{ + setButtonText( Help, i18n( "A&bout" ) ); + QWidget *main = makeMainWidget(); + + QHBoxLayout* top = new QHBoxLayout( main, 0, spacingHint() ); + + QVBoxLayout* leftCol = new QVBoxLayout; + top->addLayout( leftCol ); + + QLabel* label = new QLabel( i18n("Mode:"), main ); + leftCol->addWidget( label ); + + modeW = new QComboBox( main ); + int i = 0; + while (defaultText[i]) + modeW->insertItem( i18n(defaultText[i++]) ); + leftCol->addWidget( modeW ); + + leftCol->addStretch(); + + // Preview + QWidget* preview; + preview = new QWidget( 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, SIGNAL(activated(int)), _saver, 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>"), + QString::null, KMessageBox::AllowLink); +} + + +/** + Ok pressed - save settings and exit +*/ +void KSWindsSetup::slotOk() +{ + KConfig* config = KGlobal::config(); + config->setGroup("Settings"); + + QString 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 <qapplication.h> + +int main( int argc, char** argv ) +{ + QApplication 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 new file mode 100644 index 00000000..8831c015 --- /dev/null +++ b/kscreensaver/kdesavers/SolarWinds.h @@ -0,0 +1,138 @@ +#ifndef __SOLARWINDS_H__ +#define __SOLARWINDS_H__ +//============================================================================ +// +// Terence Welsh Screensaver - Solar Winds +// http://www.reallyslick.com/ +// +// Ported to KDE by Karl Robillard +// +//============================================================================ + + +#include <qgl.h> + + +#define LIGHTSIZE 64 + + +class wind; +class QTimer; + +class SWindsWidget : public QGLWidget +{ + Q_OBJECT + +public: + + enum eDefault + { + Regular, + CosmicStrings, + ColdPricklies, + SpaceFur, + Jiggly, + Undertow, + + DefaultModes + }; + + SWindsWidget( QWidget* 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( QKeyEvent* ); +#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 QTimer rather than timerEvent() to avoid getting locked out of + // the QEvent loop on lower-end systems. Ian Geiser <geiseri@kde.org> + // says this is the way to go. + QTimer* _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 QComboBox; + +class KSWindsSetup : public KDialogBase +{ + Q_OBJECT + +public: + + KSWindsSetup( QWidget* parent = 0, const char* name = 0 ); + ~KSWindsSetup(); + +private slots: + + void slotHelp(); + void slotOk(); + +private: + + QComboBox* modeW; + KSWindsScreenSaver* _saver; +}; +#endif + + +#endif //__SOLARWINDS_H__ diff --git a/kscreensaver/kdesavers/banner.cpp b/kscreensaver/kdesavers/banner.cpp new file mode 100644 index 00000000..5309c05a --- /dev/null +++ b/kscreensaver/kdesavers/banner.cpp @@ -0,0 +1,509 @@ +//----------------------------------------------------------------------------- +// +// kbanner - Basic screen saver for KDE +// +// Copyright (c) Martin R. Jones 1996 +// +// layout management added 1998/04/19 by Mario Weilguni <mweilguni@kde.org> +// clock function and color cycling added 2000/01/09 by Alexander Neundorf <alexander.neundorf@rz.tu-ilmenau.de> +// 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 <harald@bongartz.org> +// 2003/09/06 Converted to use KDialogBase - Nadeem Hasan <nhasan@kde.org> +#include <stdlib.h> + +#include <qlabel.h> +#include <qlineedit.h> +#include <qcombobox.h> +#include <qcheckbox.h> +#include <qgroupbox.h> +#include <qslider.h> +#include <qlayout.h> +#include <qdatetime.h> +#include <qfontdatabase.h> +#include <qpainter.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 QDialog *kss_setup() + { + return new KBannerSetup(); + } +} + +//----------------------------------------------------------------------------- + +KBannerSetup::KBannerSetup( QWidget *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(); + + QWidget *main = makeMainWidget(); + + QLabel *label; + + QVBoxLayout *tl = new QVBoxLayout(main, 0, spacingHint()); + QHBoxLayout *tl1 = new QHBoxLayout( 0, 0, spacingHint() ); + tl->addLayout(tl1); + QVBoxLayout *tl11 = new QVBoxLayout( 0, 0, spacingHint() ); + tl1->addLayout(tl11); + + QGroupBox *group = new QGroupBox( 0, Vertical, i18n("Font"), main ); + QGridLayout *gl = new QGridLayout(group->layout(), 6, 2, spacingHint() ); + + label = new QLabel( i18n("Family:"), group ); + gl->addWidget(label, 1, 0); + + KFontCombo* comboFonts = new KFontCombo( QFontDatabase().families(), group ); + comboFonts->setCurrentFont( fontFamily ); + gl->addWidget(comboFonts, 1, 1); + connect( comboFonts, SIGNAL( activated( const QString& ) ), + SLOT( slotFamily( const QString& ) ) ); + + label = new QLabel( i18n("Size:"), group ); + gl->addWidget(label, 2, 0); + + comboSizes = new QComboBox( TRUE, group ); + fillFontSizes(); + gl->addWidget(comboSizes, 2, 1); + connect( comboSizes, SIGNAL( activated( int ) ), SLOT( slotSize( int ) ) ); + connect( comboSizes, SIGNAL( textChanged( const QString & ) ), + SLOT( slotSizeEdit( const QString & ) ) ); + + QCheckBox *cb = new QCheckBox( i18n("Bold"), + group ); + cb->setChecked( bold ); + connect( cb, SIGNAL( toggled( bool ) ), SLOT( slotBold( bool ) ) ); + gl->addWidget(cb, 3, 0); + + cb = new QCheckBox( i18n("Italic"), group ); + cb->setChecked( italic ); + gl->addWidget(cb, 3, 1); + connect( cb, SIGNAL( toggled( bool ) ), SLOT( slotItalic( bool ) ) ); + + label = new QLabel( i18n("Color:"), group ); + gl->addWidget(label, 4, 0); + + colorPush = new KColorButton( fontColor, group ); + gl->addWidget(colorPush, 4, 1); + connect( colorPush, SIGNAL( changed(const QColor &) ), + SLOT( slotColor(const QColor &) ) ); + + QCheckBox *cyclingColorCb=new QCheckBox(i18n("Cycling color"),group); + cyclingColorCb->setMinimumSize(cyclingColorCb->sizeHint()); + gl->addMultiCellWidget(cyclingColorCb,5,5,0,1); + connect(cyclingColorCb,SIGNAL(toggled(bool)),this,SLOT(slotCyclingColor(bool))); + cyclingColorCb->setChecked(cyclingColor); + + preview = new QWidget( 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 QLabel( i18n("Speed:"), main ); + tl11->addStretch(1); + tl11->addWidget(label); + + QSlider *sb = new QSlider(0, 100, 10, speed, QSlider::Horizontal, main ); + sb->setMinimumWidth( 180); + sb->setFixedHeight(20); + sb->setTickmarks(QSlider::Below); + sb->setTickInterval(10); + tl11->addWidget(sb); + connect( sb, SIGNAL( valueChanged( int ) ), SLOT( slotSpeed( int ) ) ); + + QHBoxLayout *tl2 = new QHBoxLayout; + tl->addLayout(tl2); + + label = new QLabel( i18n("Message:"), main ); + tl2->addWidget(label); + + ed = new QLineEdit( main ); + tl2->addWidget(ed); + ed->setText( message ); + connect( ed, SIGNAL( textChanged( const QString & ) ), + SLOT( slotMessage( const QString & ) ) ); + + QCheckBox *timeCb=new QCheckBox( i18n("Show current time"), main); + timeCb->setFixedSize(timeCb->sizeHint()); + tl->addWidget(timeCb,0,Qt::AlignLeft); + connect(timeCb,SIGNAL(toggled(bool)),this,SLOT(slotTimeToggled(bool))); + timeCb->setChecked(showTime); + + tl->addStretch(); +} + +// read settings from config file +void KBannerSetup::readSettings() +{ + KConfig *config = KGlobal::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",(QApplication::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 = QFontDatabase().pointSizes( fontFamily ); + sizes << 96 << 128 << 156 << 0; + int current = 0; + while ( sizes[i] ) + { + QString 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 + { + QString fsize; + fsize.setNum( fontSize ); + comboSizes->setEditText(fsize); + slotSizeEdit( fsize ); + } + comboSizes->blockSignals( block ); +} + +void KBannerSetup::slotFamily( const QString& 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 QString& fs ) +{ + bool ok; + fontSize = fs.toInt( &ok, 10 ); + if ( ok ) + if ( saver ) + saver->setFont( fontFamily, fontSize, fontColor, bold, italic ); +} + +void KBannerSetup::slotColor( const QColor &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 QString &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() +{ + KConfig *config = KGlobal::config(); + config->setGroup( "Settings" ); + + config->writeEntry( "Speed", speed ); + config->writeEntry( "Message", message ); + config->writeEntry( "ShowTime", showTime ); + config->writeEntry( "FontFamily", fontFamily ); + + QString fsize; + if (fontSize == 0) // an non-number was entered in the font size combo + { + fontSize = 48; + } + fsize.setNum( fontSize ); + config->writeEntry( "FontSize", fsize ); + + QString 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\nmjones@kde.org\nExtended by Alexander Neundorf 2000\nalexander.neundorf@rz.tu-ilmenau.de\n")); +} + +//----------------------------------------------------------------------------- + +KBannerSaver::KBannerSaver( WId id ) : KScreenSaver( id ) +{ + krnd = new KRandomSequence(); + readSettings(); + initialize(); + colorContext = QColor::enterAllocContext(); + needBlank = TRUE; + timer.start( speed ); + connect( &timer, SIGNAL( timeout() ), SLOT( slotTimeout() ) ); +} + +KBannerSaver::~KBannerSaver() +{ + timer.stop(); + QColor::leaveAllocContext(); + QColor::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 QString& family, int size, const QColor &color, + bool b, bool i ) +{ + fontFamily = family; + fontSize = size; + fontColor = color; + bold = b; + italic = i; + + initialize(); +} + +void KBannerSaver::setColor(QColor &color) +{ + fontColor = color; + cyclingColor = FALSE; + needUpdate = TRUE; +} + +void KBannerSaver::setCyclingColor( bool on ) +{ + cyclingColor = on; + needUpdate = TRUE; +} + +void KBannerSaver::setMessage( const QString &msg ) +{ + showTime = FALSE; + message = msg; + pixmapSize = QSize(); + needBlank = TRUE; +} + +void KBannerSaver::setTimeDisplay() +{ + showTime = TRUE; + pixmapSize = QSize(); + needBlank = TRUE; +} + +// read settings from config file +void KBannerSaver::readSettings() +{ + KConfig *config = KGlobal::config(); + config->setGroup( "Settings" ); + + setSpeed( config->readNumEntry("Speed",50) ); + + message=config->readEntry("Message","KDE"); + + showTime=config->readBoolEntry("ShowTime",FALSE); + + fontFamily=config->readEntry("FontFamily",(QApplication::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() / QApplication::desktop()->height(); + + font = QFont( fontFamily, fsize, bold ? QFont::Bold : QFont::Normal, italic ); + + pixmapSize = QSize(); + needBlank = TRUE; + + xpos = width(); + ypos = fsize + (int) ((double)(height()-fsize)*krnd->getDouble()); + step = 2 * width() / QApplication::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) + { + QString new_message = KGlobal::locale()->formatTime(QTime::currentTime(), true); + if( new_message != message ) + needUpdate = TRUE; + message = new_message; + } + if ( !pixmapSize.isValid() || cyclingColor || needUpdate || needBlank ) + { + QRect rect = QFontMetrics( 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 = QPixmap( pixmapSize ); + pixmap.fill( black ); + QPainter p( &pixmap ); + p.setFont( font ); + p.setPen( fontColor ); + p.drawText( -rect.x(), -rect.y(), message ); + needUpdate = FALSE; + } + xpos -= step; + if ( xpos < -pixmapSize.width() ) { + QPainter 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 new file mode 100644 index 00000000..026b817d --- /dev/null +++ b/kscreensaver/kdesavers/banner.h @@ -0,0 +1,112 @@ +//----------------------------------------------------------------------------- +// +// kbanner - Basic screen saver for KDE +// +// Copyright (c) Martin R. Jones 1996 +// + +#ifndef __BANNER_H__ +#define __BANNER_H__ + +#include <qtimer.h> + +#include <kscreensaver.h> +#include <kdialogbase.h> + +#define SATURATION 150 +#define VALUE 255 + +class QLineEdit; +class KColorButton; +class KRandomSequence; + +class KBannerSaver : public KScreenSaver +{ + Q_OBJECT +public: + KBannerSaver( WId id ); + virtual ~KBannerSaver(); + + void setSpeed( int spd ); + void setFont( const QString &family, int size, const QColor &color, + bool b, bool i ); + void setMessage( const QString &msg ); + void setTimeDisplay(); + void setCyclingColor(bool on); + void setColor( QColor &color); + +private: + void readSettings(); + void initialize(); + +protected slots: + void slotTimeout(); + +protected: + QFont font; + QTimer timer; + QString fontFamily; + int fontSize; + bool bold; + bool italic; + QColor fontColor; + bool cyclingColor; + int currentHue; + bool needUpdate; + bool needBlank; + QString message; + bool showTime; + int xpos, ypos, step, fsize; + KRandomSequence *krnd; + int speed; + int colorContext; + QPixmap pixmap; + QSize pixmapSize; +}; + + +class KBannerSetup : public KDialogBase +{ + Q_OBJECT +public: + KBannerSetup( QWidget *parent = NULL, const char *name = NULL ); + +protected: + void readSettings(); + void fillFontSizes(); + +private slots: + void slotFamily( const QString & ); + void slotSize( int ); + void slotSizeEdit(const QString &); + void slotColor(const QColor &); + void slotCyclingColor(bool on); + void slotBold( bool ); + void slotItalic( bool ); + void slotSpeed( int ); + void slotMessage( const QString & ); + void slotOk(); + void slotHelp(); + void slotTimeToggled(bool on); + +private: + QWidget *preview; + KColorButton *colorPush; + KBannerSaver *saver; + QLineEdit *ed; + QComboBox* comboSizes; + + QString message; + bool showTime; + QString fontFamily; + int fontSize; + QColor fontColor; + bool cyclingColor; + bool bold; + bool italic; + int speed; + QValueList<int> sizes; +}; + +#endif + diff --git a/kscreensaver/kdesavers/blob.cpp b/kscreensaver/kdesavers/blob.cpp new file mode 100644 index 00000000..e717c7ee --- /dev/null +++ b/kscreensaver/kdesavers/blob.cpp @@ -0,0 +1,527 @@ +//----------------------------------------------------------------------------- +// +// 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 <qcolor.h> +#include <qlabel.h> +#include <qlistbox.h> +#include <qlayout.h> +#include <qpainter.h> +#include <qpixmap.h> +#include <qimage.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 QDialog *kss_setup() + { + return new KBlobSetup(); + } +} + +static KRandomSequence *rnd = 0; + +QString 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(); + QColor color; + float ramp = (256.0-64.0)/(float)RAMP; + QString msg = + i18n("This screen saver requires a color display."); + + blank(); + + // needs colors to work this one + if (QPixmap::defaultDepth() < 8) + { + QPainter p(this); + p.setPen( white ); + p.drawText( width()/2, height()/2, msg ); + return; + } + + colorContext = QColor::enterAllocContext(); + + // if 8-bit, create lookup table for color ramping further down + if (QPixmap::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 (QPixmap::defaultDepth() > 8 ) + setColorInc(7); + else + setColorInc(4); + } + else + { + if (QPixmap::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, SIGNAL(timeout()), SLOT(slotTimeout())); +} + +KBlobSaver::~KBlobSaver() +{ + timer.stop(); + + QColor::leaveAllocContext(); + QColor::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 + QImage img = QPixmap::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++) + { + QRgb p = img.pixel( i, j ); + p += (colorInc<<18); + img.setPixel( i, j, p ); + } + } + } + + // put the image back onto the screen + QPainter p(this); + p.drawImage( x, y, img ); +} + +void KBlobSaver::blank() +{ + setBackgroundColor( black ); + erase(); +} + +void KBlobSaver::readSettings() +{ + KConfig *config = KGlobal::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 +( + QWidget *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" ) ); + QWidget *main = makeMainWidget(); + + QHBoxLayout *tl = new QHBoxLayout( main, 0, spacingHint() ); + + QVBoxLayout *vbox = new QVBoxLayout; + tl->addLayout(vbox); + + // seconds to generate on a frame + QLabel *label = new QLabel(i18n("Frame duration:"), main); + stime = new KIntNumInput( showtime, main ); + stime->setSuffix( i18n( " sec" ) ); + vbox->addWidget(label); + vbox->addWidget(stime); + + // available algorithms + label = new QLabel(i18n("Algorithm:"), main); + algs = new QListBox(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 + QWidget *preview = new QWidget( main ); + preview->setFixedSize(220, 170); + preview->setBackgroundColor(black); + preview->show(); + tl->addWidget(preview); + saver = new KBlobSaver(preview->winId()); + saver->setDimension(3); + if (QPixmap::defaultDepth() > 8) + saver->setColorInc(7); + else + saver->setColorInc(4); + + tl->addStretch(); + + // so selecting an algorithm will start previewing that alg + connect(algs, SIGNAL(highlighted(int)), saver, + SLOT(setAlgorithm(int))); +} + +void KBlobSetup::readSettings() +{ + KConfig *config = KGlobal::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() +{ + KConfig *config = KGlobal::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\ntiaan@netsys.co.za")); + if (saver) + saver->setAlgorithm(algs->currentItem()); +} + + diff --git a/kscreensaver/kdesavers/blob.h b/kscreensaver/kdesavers/blob.h new file mode 100644 index 00000000..93a02998 --- /dev/null +++ b/kscreensaver/kdesavers/blob.h @@ -0,0 +1,117 @@ +//----------------------------------------------------------------------------- +// +// kblob - Basic screen saver for KDE +// +// Copyright (c) Tiaan Wessels, 1997 +// + +#ifndef __BLOB_H__ +#define __BLOB_H__ + +#include <qtimer.h> +#include <qptrlist.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 + { + QString Name; + AlgFunc Init; + AlgFunc NextFrame; + }; +private: + + QTimer 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 QListBox; +class KIntNumInput; + +class KBlobSetup : public KDialogBase +{ + Q_OBJECT + + int showtime; + int alg; + QListBox *algs; + KIntNumInput *stime; + +public: + KBlobSetup( QWidget *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/Makefile.am b/kscreensaver/kdesavers/data/Makefile.am new file mode 100644 index 00000000..2882f34c --- /dev/null +++ b/kscreensaver/kdesavers/data/Makefile.am @@ -0,0 +1,11 @@ +# 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 differnew file mode 100644 index 00000000..f1265ec2 --- /dev/null +++ b/kscreensaver/kdesavers/data/kfs_debris.ogg diff --git a/kscreensaver/kdesavers/data/kfs_explode.ogg b/kscreensaver/kdesavers/data/kfs_explode.ogg Binary files differnew file mode 100644 index 00000000..3eda0ef0 --- /dev/null +++ b/kscreensaver/kdesavers/data/kfs_explode.ogg diff --git a/kscreensaver/kdesavers/data/kfs_kde.png b/kscreensaver/kdesavers/data/kfs_kde.png Binary files differnew file mode 100644 index 00000000..33f53b33 --- /dev/null +++ b/kscreensaver/kdesavers/data/kfs_kde.png diff --git a/kscreensaver/kdesavers/data/kfs_letters.desc b/kscreensaver/kdesavers/data/kfs_letters.desc new file mode 100644 index 00000000..186a1b8d --- /dev/null +++ b/kscreensaver/kdesavers/data/kfs_letters.desc @@ -0,0 +1,84 @@ +#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 differnew file mode 100644 index 00000000..2f6678ba --- /dev/null +++ b/kscreensaver/kdesavers/data/kfs_letters1.png diff --git a/kscreensaver/kdesavers/data/kfs_letters2.png b/kscreensaver/kdesavers/data/kfs_letters2.png Binary files differnew file mode 100644 index 00000000..8d0442ac --- /dev/null +++ b/kscreensaver/kdesavers/data/kfs_letters2.png diff --git a/kscreensaver/kdesavers/data/kfs_particle.png b/kscreensaver/kdesavers/data/kfs_particle.png Binary files differnew file mode 100644 index 00000000..d6294dc3 --- /dev/null +++ b/kscreensaver/kdesavers/data/kfs_particle.png diff --git a/kscreensaver/kdesavers/data/kfs_particle_diastar.png b/kscreensaver/kdesavers/data/kfs_particle_diastar.png Binary files differnew file mode 100644 index 00000000..6f645ddb --- /dev/null +++ b/kscreensaver/kdesavers/data/kfs_particle_diastar.png diff --git a/kscreensaver/kdesavers/data/kfs_particle_flare.png b/kscreensaver/kdesavers/data/kfs_particle_flare.png Binary files differnew file mode 100644 index 00000000..4a4fdcb5 --- /dev/null +++ b/kscreensaver/kdesavers/data/kfs_particle_flare.png diff --git a/kscreensaver/kdesavers/data/kfs_tux.png b/kscreensaver/kdesavers/data/kfs_tux.png Binary files differnew file mode 100644 index 00000000..99f3465e --- /dev/null +++ b/kscreensaver/kdesavers/data/kfs_tux.png diff --git a/kscreensaver/kdesavers/firesaver.ChangeLog b/kscreensaver/kdesavers/firesaver.ChangeLog new file mode 100644 index 00000000..98749856 --- /dev/null +++ b/kscreensaver/kdesavers/firesaver.ChangeLog @@ -0,0 +1,106 @@ +2004-06-29 Enrico Ros <eros.kde@email.it> + + * 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 <eros.kde@email.it> + + * this file : renamed Changelog to firesaver.ChangeLog + + * general : moved / renamed files and chaged stuff to get ready + to be imported into kdeartwork. + + * general : all images are .png, all sounds are .ogg. + +2004-02-07 Enrico Ros <eros.kde@email.it> + + * 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 <eros.kde@email.it> + + * all : optimized logic and math.. kcachegrind 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 <eros.kde@email.it> + + * 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 <eros.kde@email.it> + + * 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 <eros.kde@email.it> + + * 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 <eros.kde@email.it> + + * 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 kdeartwork/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 new file mode 100644 index 00000000..fff07dde --- /dev/null +++ b/kscreensaver/kdesavers/firesaver.cpp @@ -0,0 +1,1151 @@ +// 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: asy@libero.it + +#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( QWidget* 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 QDialog *kss_setup() + { + return new KFireSaverSetupKDB; + } +} + +/* *\ +\* Factory code for KScreensaver ends *here* */ + + +KFireSaver :: KFireSaver( QWidget *parent, const char *name ) + : QGLWidget( 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 QString someStrings[] = { + i18n("www.kde.org"), + i18n("My KDE, please!"), + i18n("KoNqUeR the World"), + i18n("KFIRESAVER 3D"), + i18n("Gimme your eyes..."), + i18n("Thank you for using KDE"), + 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(QTimerEvent*) +{ + 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(QImage * 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) + { + QRgb pixel = image->pixel(x,y); + if ( qAlpha(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] = qRed(pixel) / 255.0f; + particle->colour[1] = qGreen(pixel) / 255.0f; + particle->colour[2] = qBlue(pixel) / 255.0f; + + particleList.append(particle); + } + } + if (parameters.enableSound) + playSound(sound_debris); +} + +void KFireSaver :: playSound(QString 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 (!QFile::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( QString fileName, unsigned int & textureID ) +{ + //reset texture ID to the default EMPTY value + textureID = 0; + + //load image + QImage tmp; + if ( !tmp.load( fileName ) ) + return false; + + //convert it to suitable format (flipped RGBA) + QImage texture = QGLWidget::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 () +{ + KConfig 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 ) ) + { + QColor blue = Qt::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 ) ) + { + QImage tempImage; + tempImage.setAlphaBuffer( true ); + if ( config.readBoolEntry( "LogosTux", true ) ) + if ( tempImage.load(locate("data","kfiresaver/kfs_tux.png")) ) + imageList.append( new QImage(tempImage) ); + if ( config.readBoolEntry( "LogosKonqui", true ) ) + if ( tempImage.load(locate("data","kfiresaver/kfs_kde.png")) ) + imageList.append( new QImage(tempImage) ); + if ( config.readBoolEntry( "LogosKDEIcons", true ) ) { + const QString 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 QImage(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 new file mode 100644 index 00000000..3757b64b --- /dev/null +++ b/kscreensaver/kdesavers/firesaver.h @@ -0,0 +1,170 @@ +// 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: asy@libero.it + +#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 <qgl.h> +#include <qptrlist.h> +#include <qimage.h> +#include <qstring.h> +#include <qcolor.h> + +#include <arts/kplayobject.h> +#include <arts/kartsserver.h> +#include <arts/kartsdispatcher.h> + +class Particle; +class Writer; + +class KFireSaver : public QGLWidget +{ + public: + KFireSaver( QWidget *parent=0, const char *name=0 ); + ~KFireSaver(); + + protected: + void initializeGL(); + void resizeGL( int, int ); + void paintGL(); + void timerEvent( class QTimerEvent * ); + + 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(QImage * image); + void playSound(QString file); + bool loadTexture(QString file, unsigned int & textureID); + void freeTexture(unsigned int & textureID); + void readConfig(); + + //list of particles and stars + QPtrList<Particle> + particleList, + starList; + + //stuff for 'exploding' pixmaps (kde, tux, icons..) + QPtrList<QImage> + imageList; + + //texture stuff + unsigned int + currentTexture, + particleTexture, + starTexture, + flareTexture, + diastarTexture; // (to add) novaTexture cometTexture + + //sound stuff + KArtsDispatcher artsDispatcher; + KArtsServer artsServer; + QPtrList<KPlayObject> playObjectList; + QString 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; + QColor + 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 new file mode 100644 index 00000000..421115a7 --- /dev/null +++ b/kscreensaver/kdesavers/firesaverparticle.cpp @@ -0,0 +1,273 @@ +// 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: asy@libero.it + +#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 new file mode 100644 index 00000000..de8d9ac2 --- /dev/null +++ b/kscreensaver/kdesavers/firesaverparticle.h @@ -0,0 +1,105 @@ +// 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: asy@libero.it + +#ifndef KFIRESAVER_PARTICLE_H +#define KFIRESAVER_PARTICLE_H + +#include <qgl.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 new file mode 100644 index 00000000..37614afa --- /dev/null +++ b/kscreensaver/kdesavers/firesaversetup.ui @@ -0,0 +1,1855 @@ +<!DOCTYPE UI><UI version="3.3" stdsetdef="1"> +<class>KFireSaverSetup</class> +<widget class="QWidget"> + <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="QPushButton" row="0" column="2"> + <property name="name"> + <cstring>useButton</cstring> + </property> + <property name="text"> + <string>&Load</string> + </property> + </widget> + <widget class="QComboBox" 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="QLabel" 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="QTabWidget" row="1" column="0" rowspan="1" colspan="4"> + <property name="name"> + <cstring>tabWidget</cstring> + </property> + <property name="tabShape"> + <enum>Rounded</enum> + </property> + <widget class="QWidget"> + <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="QLayoutWidget" 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="QFrame" 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="QLabel" 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="QCheckBox" 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="QPushButton" 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="QWidget"> + <property name="name"> + <cstring>tab</cstring> + </property> + <attribute name="title"> + <string>Show</string> + </attribute> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layS1</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLabel"> + <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="QComboBox"> + <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="QLayoutWidget"> + <property name="name"> + <cstring>layS2</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLabel"> + <property name="name"> + <cstring>showLabel2</cstring> + </property> + <property name="text"> + <string>Number of fireworks:</string> + </property> + </widget> + <widget class="QLabel"> + <property name="name"> + <cstring>showLabel3</cstring> + </property> + <property name="text"> + <string>few</string> + </property> + </widget> + <widget class="QSlider"> + <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="QLabel"> + <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="QLayoutWidget"> + <property name="name"> + <cstring>layS2_2</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLabel"> + <property name="name"> + <cstring>particlesLabel1</cstring> + </property> + <property name="text"> + <string>Size of particles:</string> + </property> + </widget> + <widget class="QLabel"> + <property name="name"> + <cstring>particlesLabel2</cstring> + </property> + <property name="text"> + <string>small</string> + </property> + </widget> + <widget class="QSlider"> + <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="QLabel"> + <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="QCheckBox"> + <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="QLayoutWidget"> + <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="QLabel"> + <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="QCheckBox"> + <property name="name"> + <cstring>soundsBox</cstring> + </property> + <property name="text"> + <string>Enable sounds</string> + </property> + </widget> + <widget class="QCheckBox"> + <property name="name"> + <cstring>overheadBox</cstring> + </property> + <property name="text"> + <string>Limit overload (recommended)</string> + </property> + </widget> + <widget class="QCheckBox"> + <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="QWidget"> + <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="QLayoutWidget" row="3" column="0"> + <property name="name"> + <cstring>layF2</cstring> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QCheckBox" row="0" column="1"> + <property name="name"> + <cstring>whiteBox</cstring> + </property> + <property name="text"> + <string>Blinding white</string> + </property> + </widget> + <widget class="QCheckBox" row="3" column="1"> + <property name="name"> + <cstring>purpleBox</cstring> + </property> + <property name="text"> + <string>Velvet purple</string> + </property> + </widget> + <widget class="QCheckBox" row="2" column="1"> + <property name="name"> + <cstring>seagreenBox</cstring> + </property> + <property name="text"> + <string>Deep-sea green</string> + </property> + </widget> + <widget class="QCheckBox" row="1" column="2"> + <property name="name"> + <cstring>redBox</cstring> + </property> + <property name="text"> + <string>Deep red</string> + </property> + </widget> + <widget class="QCheckBox" 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="QCheckBox" 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="QCheckBox" row="0" column="2"> + <property name="name"> + <cstring>orangeBox</cstring> + </property> + <property name="text"> + <string>Hot orange</string> + </property> + </widget> + <widget class="QCheckBox" row="2" column="2"> + <property name="name"> + <cstring>greenBox</cstring> + </property> + <property name="text"> + <string>Purest green</string> + </property> + </widget> + </grid> + </widget> + <widget class="QLabel" row="2" column="0"> + <property name="name"> + <cstring>colorsLabel1</cstring> + </property> + <property name="text"> + <string>Colors</string> + </property> + </widget> + <widget class="QLabel" row="0" column="0"> + <property name="name"> + <cstring>fireworksLabel1</cstring> + </property> + <property name="text"> + <string>Fireworks</string> + </property> + </widget> + <widget class="QLayoutWidget" row="1" column="0"> + <property name="name"> + <cstring>layF1</cstring> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QCheckBox" 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="QCheckBox" 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="QCheckBox" 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="QCheckBox" 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="QCheckBox" 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="QCheckBox" 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="QCheckBox" 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="QCheckBox" 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="QWidget"> + <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="QCheckBox" 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="QFrame" 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="QLayoutWidget" row="0" column="1"> + <property name="name"> + <cstring>layP1</cstring> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QCheckBox" 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="QCheckBox" 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="QCheckBox" 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="QCheckBox" 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="QLayoutWidget" row="1" column="1"> + <property name="name"> + <cstring>layP2</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLabel"> + <property name="name"> + <cstring>frequencyLabel</cstring> + </property> + <property name="text"> + <string>Frequency:</string> + </property> + </widget> + <widget class="QLabel"> + <property name="name"> + <cstring>neverLabel</cstring> + </property> + <property name="text"> + <string>sometimes</string> + </property> + </widget> + <widget class="QSlider"> + <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="QLabel"> + <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="QFrame" 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="QLayoutWidget" row="0" column="1"> + <property name="name"> + <cstring>layP3</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QCheckBox"> + <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="QCheckBox"> + <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="QLayoutWidget" row="1" column="1"> + <property name="name"> + <cstring>layP4</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLabel"> + <property name="name"> + <cstring>textLabel4_5</cstring> + </property> + <property name="text"> + <string>Number:</string> + </property> + </widget> + <widget class="QLabel"> + <property name="name"> + <cstring>textLabel3_2_6</cstring> + </property> + <property name="text"> + <string>less</string> + </property> + </widget> + <widget class="QSlider"> + <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="QLabel"> + <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="QCheckBox" 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="QCheckBox" 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="QWidget"> + <property name="name"> + <cstring>TabPage</cstring> + </property> + <attribute name="title"> + <string>Effects</string> + </attribute> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QCheckBox" 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="QLayoutWidget" 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="QLabel"> + <property name="name"> + <cstring>fadeLabel1</cstring> + </property> + <property name="text"> + <string>Intensity:</string> + </property> + </widget> + <widget class="QLabel"> + <property name="name"> + <cstring>fadeLabel2</cstring> + </property> + <property name="text"> + <string>small</string> + </property> + </widget> + <widget class="QSlider"> + <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="QLabel"> + <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="QCheckBox" 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="QLayoutWidget" 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="QLabel"> + <property name="name"> + <cstring>flaresLabel1</cstring> + </property> + <property name="text"> + <string>Dimension:</string> + </property> + </widget> + <widget class="QLabel"> + <property name="name"> + <cstring>flaresLabel2</cstring> + </property> + <property name="text"> + <string>small</string> + </property> + </widget> + <widget class="QSlider"> + <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="QLabel"> + <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="QCheckBox" 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="QLayoutWidget" 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="QLabel"> + <property name="name"> + <cstring>flashLabel1</cstring> + </property> + <property name="text"> + <string>Flash opacity:</string> + </property> + </widget> + <widget class="QLabel"> + <property name="name"> + <cstring>flashLabel2</cstring> + </property> + <property name="text"> + <string>min</string> + </property> + </widget> + <widget class="QSlider"> + <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="QLabel"> + <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="QCheckBox" 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="QCheckBox" 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> +<slots> + <slot>applyButton_clicked()</slot> + <slot>updatePreview()</slot> + <slot>writeConfig()</slot> + <slot>readConfig()</slot> + <slot>useButton_clicked()</slot> +</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 new file mode 100644 index 00000000..8cf478e2 --- /dev/null +++ b/kscreensaver/kdesavers/firesaversetup.ui.h @@ -0,0 +1,400 @@ +/**************************************************************************** +** ui.h extension file, included from the uic-generated form implementation. +** +** If you wish to add, delete or rename functions or slots use +** Qt 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 <qcolor.h> +#include <qtimer.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() +{ + KConfig 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() +{ + KConfig 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 )); + QColor blue = Qt::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( Qt::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( Qt::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( Qt::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( Qt::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 new file mode 100644 index 00000000..07209884 --- /dev/null +++ b/kscreensaver/kdesavers/firesaverwriter.cpp @@ -0,0 +1,247 @@ +/*************************************************************************** + * Copyright (C) 2004 by E.Ros * + * rosenric@dei.unipd.it * + * * + * 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 <qimage.h> +#include <qgl.h> +#include <qfile.h> +#include <qstring.h> +#include <kdebug.h> +#include <kstandarddirs.h> +#include <kdeversion.h> +#include <klocale.h> +#include "firesaverwriter.h" + + +/* Word: SINGLE WORD */ + +Word::Word( const char * _text, QMap<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( QString descFileName ) + : numTextures(0) +{ + wordList.setAutoDelete( true ); + + if ( !loadMap( descFileName ) ) + return; + + QString welcomeString = i18n("Welcome to KDE %1.%2.%3") + .arg(KDE_VERSION_MAJOR) + .arg(KDE_VERSION_MINOR) + .arg(KDE_VERSION_RELEASE); + spawnWords(welcomeString, Fun1); +} + +Writer::~ Writer() +{ + glDeleteTextures( numTextures, texArray ); + wordList.clear(); + QMap<char, Symbol *>::Iterator it = symbolMap.begin(); + for ( ; it != symbolMap.end(); ++it ) + delete (Symbol *)it.data(); +} + +void Writer::spawnWords( QString phrase, effectType fX ) +{ + int wordCount = 0; + float xCenter = 0, + yCenter = drand48()*40 - 20, + wordsWidth = 0; + QPtrList<Word> localWords; + while ( phrase.length() > 0 ) + { + QString 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( QString descFile ) +{ + QFile 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() ) + { + QString 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 + QString fileName = line.section("\"", 1,1 ); + QImage 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 ); + QImage texture = QGLWidget::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 new file mode 100644 index 00000000..b7bd2e78 --- /dev/null +++ b/kscreensaver/kdesavers/firesaverwriter.h @@ -0,0 +1,113 @@ +/*************************************************************************** + * Copyright (C) 2004 by E.Ros * + * rosenric@dei.unipd.it * + * * + * 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 <qgl.h> +#include <qptrlist.h> +#include <qmap.h> +#include <qstring.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, QMap<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]; + QPtrList<Symbol> symbolList; +}; + + +/* + * + **/ +class Writer +{ + public: + Writer( QString 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( QString 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( QString ); + + //texture 'references' used by GL to delete allocated textures + int numTextures; + unsigned int texArray[16]; + + //list of words and map of symbols + QPtrList<Word> wordList; + QMap<char, Symbol *> symbolMap; + + //disables standard constructor + Writer(); +}; + +#endif diff --git a/kscreensaver/kdesavers/fountain.cpp b/kscreensaver/kdesavers/fountain.cpp new file mode 100644 index 00000000..51d88343 --- /dev/null +++ b/kscreensaver/kdesavers/fountain.cpp @@ -0,0 +1,461 @@ +//----------------------------------------------------------------------------- +// +// kfountain - Partical Fountain Screen Saver for KDE 2 +// +// Copyright (c) Ian Reinhart Geiser 2001 +// +// KConfig code and KScreenSaver "Setup..." improvements by +// Nick Betcher <nbetcher@usinternet.com> 2001 +// +#include <stdlib.h> +#include <qlabel.h> +#include <qlayout.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 Q_WS_MACX +#include <OpenGL/gl.h> +#include <OpenGL/glu.h> +#else +#include <GL/glu.h> +#include <GL/gl.h> +#endif +#include <qimage.h> +#include <kdebug.h> +#include <qpainter.h> +#include <qradiobutton.h> +#include <qspinbox.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 QDialog *kss_setup() + { + return new KFountainSetup(); + } +} + +//----------------------------------------------------------------------------- +// dialog to setup screen saver parameters +// +KFountainSetup::KFountainSetup( QWidget *parent, const char *name ) + : SetupUi( parent, name, TRUE ) +{ + readSettings(); + + //QLabel *label; + //QPushButton *button; + + //setCaption( i18n("Setup Particle Fountain") ); + + //QVBoxLayout *tl = new QVBoxLayout(this, 10); + //QHBoxLayout *tl1 = new QHBoxLayout; + //tl->addLayout(tl1); + + //QVBoxLayout *tl11 = new QVBoxLayout(5); + //tl1->addLayout(tl11); + + //label = new QLabel( i18n("No options here yet...:"), this ); + ///tl11->addWidget(label);; + + //preview = new QWidget( 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, SIGNAL( clicked() ), SLOT( slotOkPressed() ) ); + connect( PushButton2, SIGNAL( clicked() ), SLOT( reject() ) ); + connect( PushButton3, SIGNAL( clicked() ), SLOT( aboutPressed() ) ); + connect( SpinBox1, SIGNAL( valueChanged(int)), saver, SLOT( updateSize(int))); + connect( RadioButton1, SIGNAL( toggled(bool)), saver, SLOT( doStars(bool))); + +} + +// read settings from config file +void KFountainSetup::readSettings() +{ + KConfig config("kssfountainrc", false, false); + + config.setGroup( "Settings" ); + QString 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); + } + } + + QString starammount = config.readEntry("StarSize", "75"); + SpinBox1->setValue(starammount.toInt()); + +} + +// Ok pressed - save settings and exit +void KFountainSetup::slotOkPressed() +{ + KConfig 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", QString::number(SpinBox1->value()) ); + + config.sync(); + + accept(); +} + +void KFountainSetup::aboutPressed() +{ + KMessageBox::about(this, + i18n("<h3>Particle Fountain</h3>\n<p>Particle Fountain Screen Saver for KDE</p>\nCopyright (c) Ian Reinhart Geiser 2001<br>\n\n<p>KConfig code and KScreenSaver \"Setup...\" improvements by Nick Betcher <nbetcher@usinternet.com> 2001</p>")); +} +//----------------------------------------------------------------------------- + + +KFountainSaver::KFountainSaver( WId id ) : KScreenSaver( id ) +{ + + kdDebug() << "Blank" << endl; + + timer = new QTimer( this ); + timer->start( 25, TRUE ); + setBackgroundColor( black ); + erase(); + fountain = new Fountain(); + embed(fountain); + fountain->show(); + connect( timer, SIGNAL(timeout()), this, 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( QWidget * parent, const char * name) : QGLWidget (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! + KConfig config("kssfountainrc", false, false); + config.setGroup( "Settings" ); + QString boolval = config.readEntry( "Stars", "false" ); + if (boolval == "true") { + setStars(true); + } else { + if (boolval == "false") + { + setStars(false); + } + } + + QString 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; + QImage 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 + { + QImage dummy( 32, 32, 32 ); + dummy.fill( Qt::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(KApplication::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((KApplication::random()%50)-26.0f)*10.0f; // Random Speed On X Axis + particle[loop].yi=float((KApplication::random()%50)-25.0f)*10.0f; // Random Speed On Y Axis + particle[loop].zi=float((KApplication::random()%50)-25.0f)*10.0f; // Random Speed On Z Axis + particle[loop].xg=0.0f; // Set Horizontal Pull To Zero + particle[loop].yg=-0.8f; // Set 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(KApplication::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((KApplication::random()%60)-32.0f); // X Axis Speed And Direction + particle[loop].yi=yspeed+float((KApplication::random()%60)-30.0f); // Y Axis Speed And Direction + particle[loop].zi=float((KApplication::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(KApplication::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((KApplication::random()%50)-26.0f)*10.0f; // Random Speed On X Axis + particle[loop].yi=float((KApplication::random()%50)-25.0f)*10.0f; // Random Speed On Y Axis + particle[loop].zi=float((KApplication::random()%50)-25.0f)*10.0f; // Random Speed On Z Axis + particle[loop].xg=0.0f; // Set Horizontal Pull To Zero + particle[loop].yg=-0.8f; // Set 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 new file mode 100644 index 00000000..fa89e6f8 --- /dev/null +++ b/kscreensaver/kdesavers/fountain.h @@ -0,0 +1,140 @@ +//----------------------------------------------------------------------------- +// +// 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 <nehe@connect.ab.ca> +// 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 <qdialog.h> +#include <qgl.h> +#ifdef Q_WS_MACX +#include <OpenGL/gl.h> +#include <OpenGL/glu.h> +#else +#include <GL/glu.h> +#include <GL/gl.h> +#endif +#include <kscreensaver.h> +#include <qtimer.h> +#include <qimage.h> +#include "fountaincfg.h" +#include <kinstance.h> +#include <qfile.h> +#include <qtextstream.h> + +#define MAX_PARTICLES 1000 + + +class Fountain : public QGLWidget +{ +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( QWidget * 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]; + QImage 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; + QTimer *timer; +}; + +class KFountainSetup : public SetupUi +{ + Q_OBJECT +public: + KFountainSetup( QWidget *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 new file mode 100644 index 00000000..94759b2f --- /dev/null +++ b/kscreensaver/kdesavers/fountaincfg.ui @@ -0,0 +1,192 @@ +<!DOCTYPE UI><UI version="3.0" stdsetdef="1"> +<class>SetupUi</class> +<widget class="QDialog"> + <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="QLayoutWidget" 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="QCheckBox" row="3" column="0"> + <property name="name"> + <cstring>CheckBox1</cstring> + </property> + <property name="text"> + <string>Use textures</string> + </property> + </widget> + <widget class="QPushButton" row="4" column="2"> + <property name="name"> + <cstring>PushButton3</cstring> + </property> + <property name="text"> + <string>&About</string> + </property> + </widget> + <widget class="QSpinBox" 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="QPushButton" row="4" column="1"> + <property name="name"> + <cstring>PushButton2</cstring> + </property> + <property name="text"> + <string>&Cancel</string> + </property> + </widget> + <widget class="QPushButton" 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="QGroupBox" 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="QLayoutWidget" 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="QRadioButton"> + <property name="name"> + <cstring>RadioButton1</cstring> + </property> + <property name="text"> + <string>Stars</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + </widget> + <widget class="QRadioButton"> + <property name="name"> + <cstring>RadioButton1_2</cstring> + </property> + <property name="text"> + <string>Flares</string> + </property> + </widget> + </vbox> + </widget> + </grid> + </widget> + <widget class="QWidget" row="0" column="1" rowspan="4" colspan="2"> + <property name="name"> + <cstring>preview</cstring> + </property> + </widget> + <widget class="QLabel" 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 new file mode 100644 index 00000000..d9f9bbd1 --- /dev/null +++ b/kscreensaver/kdesavers/gravity.cpp @@ -0,0 +1,419 @@ +//----------------------------------------------------------------------------- +// +// kgravity - Partical Gravity Screen Saver for KDE 2 +// +// Copyright (c) Ian Reinhart Geiser 2001 +// +// KConfig code and KScreenSaver "Setup..." improvements by +// Nick Betcher <nbetcher@usinternet.com> 2001 +// +#include <stdlib.h> +#include <qlabel.h> +#include <qlayout.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 Q_WS_MACX +#include <OpenGL/glu.h> +#include <OpenGL/gl.h> +#else +#include <GL/glu.h> +#include <GL/gl.h> +#endif +#include <qimage.h> +#include <kdebug.h> +#include <qpainter.h> +#include <qradiobutton.h> +#include <qspinbox.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 QDialog *kss_setup() + { + return new KGravitySetup(); + } +} + +//----------------------------------------------------------------------------- +// dialog to setup screen saver parameters +// +KGravitySetup::KGravitySetup( QWidget *parent, const char *name ) + : SetupUi( parent, name, TRUE ) +{ + readSettings(); + + preview->setFixedSize( 220, 170 ); + preview->setBackgroundColor( black ); +#ifdef Q_WS_X11 + preview->show(); // otherwise saver does not get correct size +#endif + saver = new KGravitySaver( preview->winId() ); +; + connect( PushButton1, SIGNAL( clicked() ), SLOT( slotOkPressed() ) ); + connect( PushButton2, SIGNAL( clicked() ), SLOT( reject() ) ); + connect( PushButton3, SIGNAL( clicked() ), SLOT( aboutPressed() ) ); + connect( SpinBox1, SIGNAL( valueChanged(int)), saver, SLOT( updateSize(int))); + connect( RadioButton1, SIGNAL( toggled(bool)), saver, SLOT( doStars(bool))); + +} + +KGravitySetup::~KGravitySetup() +{ + delete saver; +} + +// read settings from config file +void KGravitySetup::readSettings() +{ + KConfig config("kssgravityrc", false, false); + + config.setGroup( "Settings" ); + QString 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); + } + } + + QString starammount = config.readEntry("StarSize", "75"); + SpinBox1->setValue(starammount.toInt()); + +} + +// Ok pressed - save settings and exit +void KGravitySetup::slotOkPressed() +{ + KConfig 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", QString::number(SpinBox1->value()) ); + + config.sync(); + + accept(); +} + +void KGravitySetup::aboutPressed() +{ + KMessageBox::about(this, + i18n("<h3>Gravity</h3>\n<p>Particle Gravity Screen Saver for KDE</p>\nCopyright (c) Ian Reinhart Geiser 2001<br>\n\n<p>KConfig code and KScreenSaver \"Setup...\" improvements by Nick Betcher <nbetcher@usinternet.com> 2001</p>")); +} +//----------------------------------------------------------------------------- + + +KGravitySaver::KGravitySaver( WId id ) : KScreenSaver( id ) +{ + + kdDebug() << "Blank" << endl; + + timer = new QTimer( this ); + timer->start( 25, TRUE ); + setBackgroundColor( black ); + erase(); + gravity = new Gravity(); + embed(gravity); +#ifdef Q_WS_X11 + gravity->show(); +#endif + connect( timer, SIGNAL(timeout()), this, 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( QWidget * parent, const char * name) : QGLWidget (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! + KConfig config("kssgravityrc", false, false); + config.setGroup( "Settings" ); + QString boolval = config.readEntry( "Stars", "false" ); + if (boolval == "true") { + setStars(true); + } else { + if (boolval == "false") + { + setStars(false); + } + } + + QString 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; + QImage 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 + { + QImage dummy( 32, 32, 32 ); + dummy.fill( Qt::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=KApplication::random()%100; + particle[loop].indexo=particle[loop].index; + particle[loop].fade=float(KApplication::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(KApplication::random()%100-50)*4.0; + particle[loop].y = float(KApplication::random()%20-10)*4.0; + particle[loop].z = float(KApplication::random()%100-50)*4.0; + particle[loop].xo = particle[loop].x; + if ((1+(KApplication::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 new file mode 100644 index 00000000..2cd7080f --- /dev/null +++ b/kscreensaver/kdesavers/gravity.h @@ -0,0 +1,141 @@ +///----------------------------------------------------------------------------- +// +// 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 <nehe@connect.ab.ca> +// 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 <qdialog.h> +#include <qgl.h> +#ifdef Q_WS_MACX +#include <OpenGL/glu.h> +#include <OpenGL/gl.h> +#else +#include <GL/glu.h> +#include <GL/gl.h> +#endif +#include <kscreensaver.h> +#include <qtimer.h> +#include <qimage.h> +#include "gravitycfg.h" +#include <kinstance.h> +#include <qfile.h> +#include <qtextstream.h> + +#define MAX_PARTICLES 100 + + +class Gravity : public QGLWidget +{ +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( QWidget * 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]; + QImage 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; + QTimer *timer; +}; + +class KGravitySetup : public SetupUi +{ + Q_OBJECT +public: + KGravitySetup( QWidget *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 new file mode 100644 index 00000000..acdd2c80 --- /dev/null +++ b/kscreensaver/kdesavers/gravitycfg.ui @@ -0,0 +1,192 @@ +<!DOCTYPE UI><UI version="3.0" stdsetdef="1"> +<class>SetupUi</class> +<widget class="QDialog"> + <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="QLayoutWidget" 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="QCheckBox" row="3" column="0"> + <property name="name"> + <cstring>CheckBox1</cstring> + </property> + <property name="text"> + <string>Use textures</string> + </property> + </widget> + <widget class="QPushButton" row="4" column="2"> + <property name="name"> + <cstring>PushButton3</cstring> + </property> + <property name="text"> + <string>&About</string> + </property> + </widget> + <widget class="QSpinBox" 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="QPushButton" row="4" column="1"> + <property name="name"> + <cstring>PushButton2</cstring> + </property> + <property name="text"> + <string>&Cancel</string> + </property> + </widget> + <widget class="QPushButton" 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="QGroupBox" 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="QLayoutWidget" 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="QRadioButton"> + <property name="name"> + <cstring>RadioButton1</cstring> + </property> + <property name="text"> + <string>Stars</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + </widget> + <widget class="QRadioButton"> + <property name="name"> + <cstring>RadioButton1_2</cstring> + </property> + <property name="text"> + <string>Flares</string> + </property> + </widget> + </vbox> + </widget> + </grid> + </widget> + <widget class="QWidget" row="0" column="1" rowspan="4" colspan="2"> + <property name="name"> + <cstring>preview</cstring> + </property> + </widget> + <widget class="QLabel" 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 differnew file mode 100644 index 00000000..e717cb38 --- /dev/null +++ b/kscreensaver/kdesavers/image.png diff --git a/kscreensaver/kdesavers/kclock.cpp b/kscreensaver/kdesavers/kclock.cpp new file mode 100644 index 00000000..ac24c4b1 --- /dev/null +++ b/kscreensaver/kdesavers/kclock.cpp @@ -0,0 +1,588 @@ +// $Id$ +// +// kclock - Clock screen saver for KDE +// Copyright (c) 2003 Melchior FRANZ +// +// License: GPL v2 +// Author: Melchior FRANZ <mfranz@kde.org> +// Dependencies: libart_lgpl_2 http://www.levien.com/libart/ +// +#include <stdlib.h> +#include <string.h> + +#include <qcheckbox.h> +#include <qcolor.h> +#include <qdatetime.h> +#include <qgroupbox.h> +#include <qhbox.h> +#include <qimage.h> +#include <qlabel.h> +#include <qlayout.h> +#include <qpainter.h> +#include <qslider.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 QDialog *kss_setup() { + return new KClockSetup(); + } +} + + + + +//----------------------------------------------------------------------------- + +KClockSetup::KClockSetup(QWidget *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" ) ); + QWidget *main = makeMainWidget(); + + QVBoxLayout *top = new QVBoxLayout(main, 0, spacingHint()); + + QHBoxLayout *hbox = new QHBoxLayout; + top->addLayout( hbox ); + + QGroupBox *colgroup = new QGroupBox(i18n("Colors"), main); + colgroup->setColumnLayout( 0, Horizontal ); + QGridLayout *grid = new QGridLayout( colgroup->layout(), + 5, 2, spacingHint() ); + + QLabel *label = new QLabel(i18n("&Hour-hand:"), colgroup); + KColorButton *colorButton = new KColorButton(m_hourColor, colgroup); + colorButton->setFixedWidth(COLOR_BUTTON_WIDTH); + label->setBuddy(colorButton); + connect(colorButton, SIGNAL(changed(const QColor &)), + SLOT(slotHourColor(const QColor &))); + grid->addWidget( label, 1, 1 ); + grid->addWidget( colorButton, 1, 2 ); + + label = new QLabel(i18n("&Minute-hand:"), colgroup); + colorButton = new KColorButton(m_minColor, colgroup); + colorButton->setFixedWidth(COLOR_BUTTON_WIDTH); + label->setBuddy(colorButton); + connect(colorButton, SIGNAL(changed(const QColor &)), + SLOT(slotMinColor(const QColor &))); + grid->addWidget( label, 2, 1 ); + grid->addWidget( colorButton, 2, 2 ); + + label = new QLabel(i18n("&Second-hand:"), colgroup); + colorButton = new KColorButton(m_secColor, colgroup); + colorButton->setFixedWidth(COLOR_BUTTON_WIDTH); + label->setBuddy(colorButton); + connect(colorButton, SIGNAL(changed(const QColor &)), + SLOT(slotSecColor(const QColor &))); + grid->addWidget( label, 3, 1 ); + grid->addWidget( colorButton, 3, 2 ); + + label = new QLabel(i18n("Scal&e:"), colgroup); + colorButton = new KColorButton(m_scaleColor, colgroup); + colorButton->setFixedWidth(COLOR_BUTTON_WIDTH); + label->setBuddy(colorButton); + connect(colorButton, SIGNAL(changed(const QColor &)), + SLOT(slotScaleColor(const QColor &))); + grid->addWidget( label, 4, 1 ); + grid->addWidget( colorButton, 4, 2 ); + + label = new QLabel(i18n("&Background:"), colgroup); + colorButton = new KColorButton(m_bgndColor, colgroup); + colorButton->setFixedWidth(COLOR_BUTTON_WIDTH); + label->setBuddy(colorButton); + connect(colorButton, SIGNAL(changed(const QColor &)), + SLOT(slotBgndColor(const QColor &))); + grid->addWidget( label, 5, 1 ); + grid->addWidget( colorButton, 5, 2 ); + + hbox->addWidget(colgroup); + + QWidget *m_preview = new QWidget(main); + m_preview->setFixedSize(220, 165); + m_preview->show(); + m_saver = new KClockSaver(m_preview->winId()); + hbox->addWidget(m_preview); + + label = new QLabel( i18n( "Si&ze:" ), main ); + top->addWidget( label ); + QSlider *qs = new QSlider(0, MAX_CLOCK_SIZE, 1, m_size, Horizontal, main); + label->setBuddy( qs ); + qs->setTickInterval(1); + qs->setTickmarks(QSlider::Below); + connect(qs, SIGNAL(valueChanged(int)), this, SLOT(slotSliderMoved(int))); + top->addWidget( qs ); + + bool rtl = kapp->reverseLayout(); + QHBox *qsscale = new QHBox(main); + label = new QLabel(i18n("Small"), qsscale); + label->setAlignment(rtl ? AlignRight : AlignLeft); + label = new QLabel(i18n("Medium"), qsscale); + label->setAlignment(AlignHCenter); + label = new QLabel(i18n("Big"), qsscale); + label->setAlignment(rtl ? AlignLeft : AlignRight); + top->addWidget(qsscale); + + QCheckBox *keepCentered = new QCheckBox(i18n("&Keep clock centered"), main); + keepCentered->setChecked(m_keepCentered); + connect(keepCentered, SIGNAL(stateChanged(int)), SLOT(slotKeepCenteredChanged(int))); + top->addWidget(keepCentered); + top->addStretch(); +} + +KClockSetup::~KClockSetup() +{ + delete m_saver; +} + +void KClockSetup::readSettings() +{ + KConfig *config = KGlobal::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"); + QColor c = Qt::black; + m_bgndColor = config->readColorEntry("Background", &c); + + c = Qt::white; + m_scaleColor = config->readColorEntry("Scale", &c); + m_hourColor = config->readColorEntry("HourHand", &c); + m_minColor = config->readColorEntry("MinuteHand", &c); + + c = Qt::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() +{ + KConfig *config = KGlobal::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:mfranz@kde.org\">mfranz@kde.org</a>" + "</qt>", QString::null, KMessageBox::AllowLink); +} + + +void KClockSetup::slotBgndColor(const QColor &color) +{ + m_bgndColor = color; + if (m_saver) + m_saver->setBgndColor(m_bgndColor); +} + + +void KClockSetup::slotScaleColor(const QColor &color) +{ + m_scaleColor = color; + if (m_saver) + m_saver->setScaleColor(m_scaleColor); +} + + +void KClockSetup::slotHourColor(const QColor &color) +{ + m_hourColor = color; + if (m_saver) + m_saver->setHourColor(m_hourColor); +} + + +void KClockSetup::slotMinColor(const QColor &color) +{ + m_minColor = color; + if (m_saver) + m_saver->setMinColor(m_minColor); +} + + +void KClockSetup::slotSecColor(const QColor &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 Q_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(QImage *q, int xoffs = 0, int yoffs = 0) +{ + unsigned char *src = (unsigned char *)image(); + for (int y = 0; y < m_height; y++) { + QRgb *dest = reinterpret_cast<QRgb *>(q->scanLine(y + yoffs)) + xoffs; + for (int x = 0; x < m_width; x++, src += 3) + *dest++ = qRgba(src[0], src[1], src[2], 255); + } +} + + +void KClockPainter::setColor(const QColor &c) +{ + m_color = (c.red() << 24) | (c.green() << 16) | (c.blue() << 8) | 255; +} + + +void KClockPainter::setShadowColor(const QColor &c) +{ + m_shadow = (c.red() << 24) | (c.green() << 16) | (c.blue() << 8) | 255; +} + + +void KClockPainter::fill(const QColor &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 QColor &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, SIGNAL(timeout()), SLOT(slotTimeout())); + start(m_size); + m_timer.start(TIMER_INTERVALL); +} + + +KClockSaver::~KClockSaver() +{ + m_timer.stop(); + stop(); +} + + +void KClockSaver::start(int size) +{ + m_diameter = int(QMIN(width(), height()) * (size + 4) / 14.0); + m_x = (width() - m_diameter) / 2; + m_y = (height() - m_diameter) / 2; + + m_image = new QImage(m_diameter, m_diameter, 32); + m_scale = new KClockPainter(m_diameter, m_diameter); + m_clock = new KClockPainter(m_diameter, m_diameter); + + m_clock->setShadowColor(qRgb((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() +{ + KConfig *config = KGlobal::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"); + QColor c = Qt::black; + m_bgndColor = config->readColorEntry("Background", &c); + + c = Qt::white; + m_scaleColor = config->readColorEntry("Scale", &c); + m_hourColor = config->readColorEntry("HourHand", &c); + m_minColor = config->readColorEntry("MinuteHand", &c); + + c = Qt::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() +{ + QTime t = QTime::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(); + QPainter p(this); + + if (width() < 256) { + // intended for the control module preview: always fill the whole area + QImage *img = new QImage(width(), height(), 32); + img->fill(qRgb(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 new file mode 100644 index 00000000..b16945d6 --- /dev/null +++ b/kscreensaver/kdesavers/kclock.h @@ -0,0 +1,130 @@ +// $Id$ +// +// kclock - Clock screen saver for KDE +// Copyright (c) 2003 Melchior FRANZ +// +// License: GPL v2 +// Author: Melchior FRANZ <mfranz@kde.org> +// Dependencies: libart_lgpl_2 http://www.levien.com/libart/ +// +#ifndef __KCLOCK_H__ +#define __KCLOCK_H__ + +#include <qtimer.h> +#include <kdialogbase.h> +#include <kscreensaver.h> + + +class KClockPainter +{ + int m_width; + int m_height; + Q_UINT8 *m_buf; + double m_matrix[6]; + Q_UINT32 m_color; + Q_UINT32 m_shadow; + + public: + KClockPainter(int width, int height); + ~KClockPainter(); + void copy(KClockPainter *p); + void drawToImage(QImage *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 QColor &color); + void setShadowColor(const QColor &color); + void fill(const QColor &color); + void drawRadial(double alpha, double r0, double r1, double width); + void drawDisc(double radius); + void drawHand(const QColor &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 QColor &c) { m_bgndColor = c; drawScale(); setBackgroundColor(c); }; + inline void setScaleColor(const QColor &c) { m_scaleColor = c; drawScale(); }; + inline void setHourColor(const QColor &c) { m_hourColor = c; forceRedraw(); }; + inline void setMinColor(const QColor &c) { m_minColor = c; forceRedraw(); }; + inline void setSecColor(const QColor &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: + QTimer m_timer; + QImage *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; + + QColor m_bgndColor; + QColor m_scaleColor; + QColor m_hourColor; + QColor m_minColor; + QColor m_secColor; +}; + + +class KClockSetup : public KDialogBase +{ + Q_OBJECT + public: + KClockSetup(QWidget *parent = 0, const char *name = 0); + ~KClockSetup(); + protected: + void readSettings(); + + private slots: + void slotOk(); + void slotHelp(); + + void slotBgndColor(const QColor &); + void slotScaleColor(const QColor &); + void slotHourColor(const QColor &); + void slotMinColor(const QColor &); + void slotSecColor(const QColor &); + void slotSliderMoved(int); + void slotKeepCenteredChanged(int); + + private: + KClockSaver *m_saver; + + QColor m_bgndColor; + QColor m_scaleColor; + QColor m_hourColor; + QColor m_minColor; + QColor m_secColor; + + int m_size; + bool m_keepCentered; +}; + +#endif + + diff --git a/kscreensaver/kdesavers/kscience.png b/kscreensaver/kdesavers/kscience.png Binary files differnew file mode 100644 index 00000000..19de5909 --- /dev/null +++ b/kscreensaver/kdesavers/kscience.png diff --git a/kscreensaver/kdesavers/kvm.cpp b/kscreensaver/kdesavers/kvm.cpp new file mode 100644 index 00000000..9d7a32fa --- /dev/null +++ b/kscreensaver/kdesavers/kvm.cpp @@ -0,0 +1,384 @@ +/*- + * 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 <jwz@jwz.org> + * + * 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 <mweilguni@kde.org> + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <stdio.h> +#include <stdlib.h> + +/* for AIX at least */ +#include <time.h> + +#include <qcolor.h> +#include <qlabel.h> +#include <qlayout.h> +#include <qslider.h> +#include <qpainter.h> +#include <qbitmap.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 QDialog *kss_setup() + { + return new kVmSetup(); + } +} + + + +static void +load_images (m_state *state) +{ + if ( QPixmap::defaultDepth() > 1 ) + { + state->images = QPixmap( vm ); + } + else + { + state->images = QBitmap( 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 ( QWidget *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; + QPainter p(state->w); + p.setPen( Qt::green ); + p.setBrush( Qt::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 = QColor::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, SIGNAL( timeout() ), SLOT( slotTimeout() ) ); + timer.start( 100 - speed ); +} + +kVmSaver::~kVmSaver() +{ + timer.stop(); + vm_done_pool( pool_state->pool ); + delete[] pool_state->modified; + QColor::leaveAllocContext(); + QColor::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() +{ + KConfig *config = KGlobal::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( QWidget *parent, const char *name ) + : KDialogBase( parent, name, true, i18n( "Setup Virtual Machine" ), + Ok|Cancel|Help, Ok, true ) +{ + readSettings(); + + setButtonText( Help, i18n( "A&bout" ) ); + QWidget *main = makeMainWidget(); + + QHBoxLayout *tl = new QHBoxLayout( main, 0, spacingHint() ); + QVBoxLayout *tl1 = new QVBoxLayout(); + tl->addLayout(tl1); + + QLabel *label = new QLabel( i18n("Virtual machine speed:"), main ); + tl1->addWidget(label); + + QSlider *slider = new QSlider( QSlider::Horizontal, main ); + slider->setMinimumSize( 120, 20 ); + slider->setRange( 0, 100 ); + slider->setSteps( 10, 20 ); + slider->setTickmarks( QSlider::Below ); + slider->setTickInterval( 10 ); + slider->setValue( speed ); + connect( slider, SIGNAL( valueChanged( int ) ), + SLOT( slotSpeed( int ) ) ); + tl1->addWidget(slider); + + label = new QLabel( i18n("Display update speed:"), main ); + tl1->addWidget(label); + + slider = new QSlider( QSlider::Horizontal, main ); + slider->setMinimumSize( 120, 20 ); + slider->setRange( 0, MAX_REFRESH_TIMEOUT ); + slider->setSteps( MAX_REFRESH_TIMEOUT/10, MAX_REFRESH_TIMEOUT/5 ); + slider->setTickmarks( QSlider::Below ); + slider->setTickInterval( MAX_REFRESH_TIMEOUT/10 ); + slider->setValue( MAX_REFRESH_TIMEOUT - refreshTimeout ); + connect( slider, SIGNAL( valueChanged( int ) ), + SLOT( slotRefreshTimeout( int ) ) ); + tl1->addWidget(slider); + tl1->addStretch(); + + preview = new QWidget( 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() +{ + KConfig *config = KGlobal::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() +{ + KConfig *config = KGlobal::config(); + config->setGroup( "Settings" ); + + QString 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 <art@zeus.polsl.gliwice.pl>\n"), + i18n("About Virtual Machine") + ); +} + +#include "kvm.moc" + diff --git a/kscreensaver/kdesavers/kvm.h b/kscreensaver/kdesavers/kvm.h new file mode 100644 index 00000000..44c7eeb3 --- /dev/null +++ b/kscreensaver/kdesavers/kvm.h @@ -0,0 +1,99 @@ +//----------------------------------------------------------------------------- +// +// kvm screensaver +// + +#ifndef __KVM_H__ +#define __KVM_H__ + +#include <qtimer.h> +#include <qptrlist.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 { + QWidget *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; + + QPixmap 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: + QTimer timer; + int colorContext; + + int speed; + m_state* pool_state; + int refreshStep; + int refreshTimeout; +}; + + +class kVmSetup : public KDialogBase +{ + Q_OBJECT +public: + kVmSetup( QWidget *parent = NULL, const char *name = NULL ); + ~kVmSetup(); +protected: + void readSettings(); + +private slots: + void slotSpeed( int ); + void slotRefreshTimeout( int num ); + void slotOk(); + void slotHelp(); + +private: + QWidget *preview; + kVmSaver *saver; + + int speed; + int refreshTimeout; +}; + + +#endif + diff --git a/kscreensaver/kdesavers/lines.cpp b/kscreensaver/kdesavers/lines.cpp new file mode 100644 index 00000000..fbe31056 --- /dev/null +++ b/kscreensaver/kdesavers/lines.cpp @@ -0,0 +1,401 @@ +//----------------------------------------------------------------------------- +// +// klines 0.1.1 - Basic screen saver for KDE +// by Dirk Staneker 1997 +// based on kpolygon from Martin R. Jones 1996 +// mailto:dirk.staneker@student.uni-tuebingen.de +// +// layout management added 1998/04/19 by Mario Weilguni <mweilguni@kde.org> +// 2001/03/04 Converted to libkscreensaver by Martin R. Jones + +#include <config.h> +#include <stdlib.h> +#include <time.h> +#include <qcolor.h> +#include <qlabel.h> +#include <qslider.h> +#include <kconfig.h> +#include <kapplication.h> +#include <kmessagebox.h> +#include <kcolorbutton.h> + +#include "kcolordialog.h" +#include "lines.h" +#include "lines.moc" + +#include <qlayout.h> +#include <klocale.h> +#include <kglobal.h> +#include <qpainter.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 QDialog *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(QWidget *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" ) ); + QWidget *main = makeMainWidget(); + + QHBoxLayout *tl = new QHBoxLayout(main, 0, spacingHint()); + QVBoxLayout *tl1 = new QVBoxLayout; + tl->addLayout(tl1); + + QLabel *label=new QLabel(i18n("Length:"), main); + tl1->addWidget(label); + + QSlider *sb= new QSlider(1, MAXLENGTH+1, 16, length, QSlider::Horizontal, + main); + sb->setMinimumSize(120, 20); + sb->setTickmarks(QSlider::Below); + sb->setTickInterval(32); + connect(sb, SIGNAL(valueChanged(int)), SLOT(slotLength(int))); + tl1->addWidget(sb); + + label=new QLabel(i18n("Speed:"), main); + tl1->addWidget(label); + + sb = new QSlider(0, 100, 10, speed, QSlider::Horizontal, main); + sb->setMinimumSize(120, 20); + sb->setTickmarks(QSlider::Below); + sb->setTickInterval(10); + connect( sb, SIGNAL( valueChanged( int ) ), SLOT( slotSpeed( int ) ) ); + tl1->addWidget(sb); + + label=new QLabel(i18n("Beginning:"), main); + tl1->addWidget(label); + + colorPush0=new KColorButton(colstart, main); + connect(colorPush0, SIGNAL(changed(const QColor &)), + SLOT(slotColstart(const QColor &))); + tl1->addWidget(colorPush0); + + label=new QLabel(i18n("Middle:"), main); + tl1->addWidget(label); + + colorPush1=new KColorButton(colmid, main); + connect(colorPush1, SIGNAL(changed(const QColor &)), + SLOT(slotColmid(const QColor &))); + tl1->addWidget(colorPush1); + + label=new QLabel(i18n("End:"), main); + tl1->addWidget(label); + + colorPush2=new KColorButton(colend, main); + connect(colorPush2, SIGNAL(changed(const QColor &)), + SLOT(slotColend(const QColor &))); + tl1->addWidget(colorPush2); + tl1->addStretch(); + + preview = new QWidget( 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(){ + KConfig *config = KGlobal::config(); + config->setGroup( "Settings" ); + + QString 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 QColor &col){ + colstart = col; + if(saver) saver->setColor(colstart, colmid, colend); +} + +void kLinesSetup::slotColmid(const QColor &col){ + colmid = col; + if(saver) saver->setColor(colstart, colmid, colend); +} + +void kLinesSetup::slotColend(const QColor &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" + "dirk.stanerker@student.uni-tuebingen.de")); +} + +// Ok pressed - save settings and exit +void kLinesSetup::slotOk(){ + KConfig *config = KGlobal::config(); + config->setGroup("Settings"); + + QString slength; + slength.setNum(length); + config->writeEntry("Length", slength); + + QString sspeed; + sspeed.setNum( speed ); + config->writeEntry( "Speed", sspeed ); + + QString 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=QColor::enterAllocContext(); + blank(); + initialiseColor(); + initialiseLines(); + timer.start(speed); + connect(&timer, SIGNAL(timeout()), SLOT(slotTimeout())); +} + +kLinesSaver::~kLinesSaver(){ + timer.stop(); + QColor::leaveAllocContext(); + QColor::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 QColor& cs, const QColor& cm, const QColor& ce){ + colstart=cs; + colmid=cm; + colend=ce; + initialiseColor(); +} + +// read configuration settings from config file +void kLinesSaver::readSettings(){ + KConfig *config=KGlobal::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(); + QPainter 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 new file mode 100644 index 00000000..d3f1062c --- /dev/null +++ b/kscreensaver/kdesavers/lines.h @@ -0,0 +1,96 @@ +//----------------------------------------------------------------------------- +// +// 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 <qtimer.h> +#include <qptrlist.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 QColor&, const QColor&, const QColor&); + + private: + void readSettings(); + void blank(); + void initialiseLines(); + void initialiseColor(); + + protected slots: + void slotTimeout(); + + protected: + KRandomSequence rnd; + QTimer timer; + unsigned numLines; + int colorContext, speed; + QColor colors[64]; + QColor colstart, colmid, colend; + double colscale; + Lines* lines; +}; + +class kLinesSetup : public KDialogBase{ + Q_OBJECT + public: + kLinesSetup(QWidget *parent=NULL, const char *name=NULL); + ~kLinesSetup(); + + protected: + void readSettings(); + + private slots: + void slotLength(int); + void slotSpeed(int); + void slotColstart(const QColor &); + void slotColmid(const QColor &); + void slotColend(const QColor &); + void slotOk(); + void slotHelp(); + + private: + KColorButton *colorPush0, *colorPush1, *colorPush2; + QWidget *preview; + kLinesSaver *saver; + int length, speed; + QColor colstart, colmid, colend; +}; + +#endif + diff --git a/kscreensaver/kdesavers/lorenz.cpp b/kscreensaver/kdesavers/lorenz.cpp new file mode 100644 index 00000000..c9017bb0 --- /dev/null +++ b/kscreensaver/kdesavers/lorenz.cpp @@ -0,0 +1,569 @@ +//----------------------------------------------------------------------------- +// +// Lorenz - Lorenz Attractor screen saver +// Nicolas Brodu, brodu@kde.org, 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 <qpainter.h> +#include <qslider.h> +#include <qlayout.h> +#include <qcolor.h> +#include <qlabel.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 QDialog *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( QWidget *parent, const char *name ) + : KDialogBase( parent, name, true, i18n( "Setup Lorenz Attractor" ), + Ok|Cancel|Default|Help, Ok, true ) +{ + readSettings(); + + setButtonText( Help, i18n( "A&bout" ) ); + QWidget *main = makeMainWidget(); + + QHBoxLayout *tl = new QHBoxLayout( main, 0, spacingHint() ); + QVBoxLayout *tl1 = new QVBoxLayout; + tl->addLayout(tl1); + + QLabel *label = new QLabel( i18n("Speed:"), main ); + tl1->addWidget(label); + + sps = new QSlider(MINSPEED, MAXSPEED, 10, speed, QSlider::Horizontal, main); + sps->setMinimumSize( 120, 20 ); + sps->setTickmarks(QSlider::Below); + sps->setTickInterval(150); + connect( sps, SIGNAL( valueChanged( int ) ), SLOT( slotSpeed( int ) ) ); + tl1->addWidget(sps); + + label = new QLabel( i18n("Epoch:"), main ); + tl1->addWidget(label); + + eps = new QSlider(MINEPOCH, MAXEPOCH, 100, epoch, QSlider::Horizontal, main); + eps->setMinimumSize( 120, 20 ); + eps->setTickmarks(QSlider::Below); + eps->setTickInterval(3000); + connect( eps, SIGNAL( valueChanged( int ) ), SLOT( slotEpoch( int ) ) ); + tl1->addWidget(eps); + + label = new QLabel( i18n("Color rate:"), main ); + tl1->addWidget(label); + + crs = new QSlider(MINCOLOR, MAXCOLOR, 5, crate, QSlider::Horizontal, main); + crs->setMinimumSize( 120, 20 ); + crs->setTickmarks(QSlider::Below); + crs->setTickInterval(10); + connect( crs, SIGNAL( valueChanged( int ) ), SLOT( slotCRate( int ) ) ); + tl1->addWidget(crs); + + label = new QLabel( i18n("Rotation Z:"), main ); + tl1->addWidget(label); + + zrs = new QSlider(MINZROT, MAXZROT, 18, zrot, QSlider::Horizontal, main); + zrs->setMinimumSize( 120, 20 ); + zrs->setTickmarks(QSlider::Below); + zrs->setTickInterval(36); + connect( zrs, SIGNAL( valueChanged( int ) ), SLOT( slotZRot( int ) ) ); + tl1->addWidget(zrs); + + label = new QLabel( i18n("Rotation Y:"), main ); + tl1->addWidget(label); + + yrs = new QSlider(MINYROT, MAXYROT, 18, yrot, QSlider::Horizontal, main); + yrs->setMinimumSize( 120, 20 ); + yrs->setTickmarks(QSlider::Below); + yrs->setTickInterval(36); + connect( yrs, SIGNAL( valueChanged( int ) ), SLOT( slotYRot( int ) ) ); + tl1->addWidget(yrs); + + label = new QLabel( i18n("Rotation X:"), main ); + tl1->addWidget(label); + + xrs = new QSlider(MINXROT, MAXXROT, 18, xrot, QSlider::Horizontal, main); + xrs->setMinimumSize( 120, 20 ); + xrs->setTickmarks(QSlider::Below); + xrs->setTickInterval(36); + connect( xrs, SIGNAL( valueChanged( int ) ), SLOT( slotXRot( int ) ) ); + tl1->addWidget(xrs); + + preview = new QWidget( 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() +{ + KConfig *config = KGlobal::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 KDE\n\nCopyright (c) 2000 Nicolas Brodu")); +} + +// Ok pressed - save settings and exit +void KLorenzSetup::slotOk() +{ + KConfig *config = KGlobal::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? + + KConfig *config = KGlobal::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 = QColor::enterAllocContext(); + setBackgroundColor( black ); + newEpoch(); + + timer.start( 10 ); + connect( &timer, SIGNAL( timeout() ), SLOT( drawOnce() ) ); +} + +KLorenzSaver::~KLorenzSaver() +{ + delete mat; + mat=0; + timer.stop(); + QColor::leaveAllocContext(); + QColor::destroyAllocContext( colorContext ); +} + +// read configuration settings from config file +void KLorenzSaver::readSettings() +{ + KConfig *config = KGlobal::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; + QPainter 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( + QColor((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 new file mode 100644 index 00000000..f666db71 --- /dev/null +++ b/kscreensaver/kdesavers/lorenz.h @@ -0,0 +1,86 @@ +//----------------------------------------------------------------------------- +// +// Lorenz - Lorenz Attractor screen saver +// Nicolas Brodu, brodu@kde.org, 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 <qtimer.h> +#include <qcolor.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: + QTimer timer; + int colorContext; + +private: + void readSettings(); + +private: + double x, y, z, t; + double speed, epoch, zrot, yrot, xrot, crate; + int e; + Matrix3D *mat; +}; + +class QSlider; + +class KLorenzSetup : public KDialogBase +{ + Q_OBJECT +public: + KLorenzSetup(QWidget *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: + QWidget *preview; + QSlider *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 differnew file mode 100644 index 00000000..a777c822 --- /dev/null +++ b/kscreensaver/kdesavers/particle.png diff --git a/kscreensaver/kdesavers/pendulum.cpp b/kscreensaver/kdesavers/pendulum.cpp new file mode 100644 index 00000000..801b74dd --- /dev/null +++ b/kscreensaver/kdesavers/pendulum.cpp @@ -0,0 +1,881 @@ +//============================================================================ +// +// KPendulum screen saver for KDE +// +// The screen saver displays a physically realistic simulation of a two-part +// pendulum. +// +// Developed by Georg Drenkhahn, georg-d@users.sourceforge.net +// +// $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> + +// Qt headers +#include <qlineedit.h> +#include <qspinbox.h> +#include <qvalidator.h> +#include <qcolordialog.h> +#include <qpushbutton.h> +#include <qtooltip.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 QDialog* 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(QWidget* parent, const char* name) + : QGLWidget(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 QColor& c) +{ + if (c.isValid()) + { + m_barColor = c; + } +} + +void PendulumGLWidget::setM1Color(const QColor& c) +{ + if (c.isValid()) + { + m_m1Color = c; + } +} +void PendulumGLWidget::setM2Color(const QColor& c) +{ + if (c.isValid()) + { + m_m2Color = c; + } +} + +/* --------- protected methods ----------- */ + +void PendulumGLWidget::initializeGL(void) +{ + qglClearColor(QColor(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 QTimer(this); + timer->start(deltaT, TRUE); + connect(timer, SIGNAL(timeout()), this, SLOT(doTimeStep())); +} + +KPendulumSaver::~KPendulumSaver() +{ + // time, rotation are automatically deleted with parent KPendulumSaver + delete solver; +} + + +void KPendulumSaver::readSettings() +{ + // read configuration settings from config file + KConfig *config = KGlobal::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 QColor& c) +{ + glArea->setBarColor(c); +} +QColor KPendulumSaver::barColor(void) const +{ + return glArea->barColor(); +} + +const QColor KPendulumSaver::barColorDefault(255, 255, 127); + +void KPendulumSaver::setM1Color(const QColor& c) +{ + glArea->setM1Color(c); +} +QColor KPendulumSaver::m1Color(void) const +{ + return glArea->m1Color(); +} + +const QColor KPendulumSaver::m1ColorDefault(170, 0, 127); + +void KPendulumSaver::setM2Color(const QColor& c) +{ + glArea->setM2Color(c); +} +QColor KPendulumSaver::m2Color(void) const +{ + return glArea->m2Color(); +} + +const QColor 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(QResizeEvent* e) +{ + glArea->resize(e->size()); +} + +//----------------------------------------------------------------------------- +// KPendulumSetup: dialog to setup screen saver parameters +//----------------------------------------------------------------------------- + +KPendulumSetup::KPendulumSetup(QWidget* 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 QDoubleValidator( + KPendulumSaver::massRatioLimitLower, + KPendulumSaver::massRatioLimitUpper, + 5, mEdit)); + lEdit->setValidator(new QDoubleValidator( + KPendulumSaver::lengthRatioLimitLower, + KPendulumSaver::lengthRatioLimitUpper, + 5, lEdit)); + gEdit->setValidator(new QDoubleValidator( + KPendulumSaver::gLimitLower, + KPendulumSaver::gLimitUpper, + 5, gEdit)); + eEdit->setValidator(new QDoubleValidator( + 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 + QToolTip::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)); + QToolTip::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)); + QToolTip::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)); + QToolTip::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)); + QToolTip::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 + QString 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, SIGNAL(resized(QResizeEvent*)), + saver, SLOT(resizeGlArea(QResizeEvent*))); +} + +KPendulumSetup::~KPendulumSetup() +{ + delete saver; +} + +// Ok pressed - save settings and exit +void KPendulumSetup::okButtonClickedSlot() +{ + KConfig* config = KGlobal::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>georg-d@users.sourceforge.net</tt></p>")); +} + +void KPendulumSetup::mEditLostFocusSlot(void) +{ + if (mEdit->hasAcceptableInput()) + { + saver->setMassRatio(mEdit->text().toDouble()); + } + else + { // write current setting back into input field + QString 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 + QString 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 + QString 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 + QString text; + text.setNum(saver->E()); + eEdit->setText(text); + } +} +void KPendulumSetup::persChangeEnteredSlot(int t) +{ + saver->setPersChangeInterval(t); +} + +void KPendulumSetup::barColorButtonClickedSlot(void) +{ + QColor color = QColorDialog::getColor( + saver->barColor(), this, "bar color dialog"); + if (color.isValid()) + { + saver->setBarColor(color); + barColorButton->setPaletteBackgroundColor(color); + } +} +void KPendulumSetup::m1ColorButtonClickedSlot(void) +{ + QColor color = QColorDialog::getColor( + saver->m1Color(), this, "mass 1 color dialog"); + if (color.isValid()) + { + saver->setM1Color(color); + m1ColorButton->setPaletteBackgroundColor(color); + } +} +void KPendulumSetup::m2ColorButtonClickedSlot(void) +{ + QColor color = QColorDialog::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 new file mode 100644 index 00000000..2b917a2b --- /dev/null +++ b/kscreensaver/kdesavers/pendulum.h @@ -0,0 +1,388 @@ +//============================================================================ +// +// 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> +// Qt headers +#include <qwidget.h> +#include <qtimer.h> +#include <qgl.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 QGLWidget to display the KPendulum screen saver. */ +class PendulumGLWidget : public QGLWidget +{ + Q_OBJECT + + public: + /** @brief Constructor of KPendulum's GL widget + * @param parent parent widget, passed to QGLWidget's constructor + * @param name name of widget, passed to QGLWidget's constructor */ + PendulumGLWidget(QWidget* 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 QColor& c); + /** @brief get color of the bars + * @return color */ + inline QColor barColor(void) const {return m_barColor;} + /** @brief set color of mass 1 + * @param c color */ + void setM1Color(const QColor& c); + /** @brief get color of mass 1 + * @return color */ + inline QColor m1Color(void) const {return m_m1Color;} + /** @brief set color of mass 2 + * @param c color */ + void setM2Color(const QColor& c); + /** @brief get color of mass 2 + * @return color */ + inline QColor 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 */ + QColor m_barColor; + /** color of the 1. mass */ + QColor m_m1Color; + /** color of the 2. mass */ + QColor 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 QColor& c); + /** Get the displayed bar color of the pendulum */ + QColor barColor(void) const; + + static const QColor barColorDefault; + + /** Set the displayed color of the 1. pendulum mass */ + void setM1Color(const QColor& c); + /** Get the displayed color of the 1. pendulum mass */ + QColor m1Color(void) const; + + static const QColor m1ColorDefault; + + /** Set the displayed color of the 2. pendulum mass */ + void setM2Color(const QColor& c); + /** Get the displayed color of the 2. pendulum mass */ + QColor m2Color(void) const; + + static const QColor 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(QResizeEvent* 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 */ + QTimer* 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(QWidget* 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 new file mode 100644 index 00000000..51454a00 --- /dev/null +++ b/kscreensaver/kdesavers/pendulumcfg.ui @@ -0,0 +1,566 @@ +<!DOCTYPE UI><UI version="3.3" stdsetdef="1"> +<class>KPendulumSetupUi</class> +<widget class="QDialog"> + <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="QLayoutWidget"> + <property name="name"> + <cstring>layout18</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout16</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout15</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLabel"> + <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="QLineEdit"> + <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="QLayoutWidget"> + <property name="name"> + <cstring>layout14</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLabel"> + <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="QLineEdit"> + <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="QLayoutWidget"> + <property name="name"> + <cstring>layout13</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLabel"> + <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="QLineEdit"> + <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="QLayoutWidget"> + <property name="name"> + <cstring>layout13_2</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLabel"> + <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="QLineEdit"> + <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="QLayoutWidget"> + <property name="name"> + <cstring>layout18</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLabel"> + <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="QSpinBox"> + <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="QLayoutWidget"> + <property name="name"> + <cstring>layout15</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QPushButton"> + <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="QPushButton"> + <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="QPushButton"> + <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="QLayoutWidget"> + <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="QPushButton"> + <property name="name"> + <cstring>OkButton</cstring> + </property> + <property name="text"> + <string>&OK</string> + </property> + <property name="default"> + <bool>true</bool> + </property> + </widget> + <widget class="QPushButton"> + <property name="name"> + <cstring>CancelButton</cstring> + </property> + <property name="text"> + <string>&Cancel</string> + </property> + </widget> + <widget class="QPushButton"> + <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> +<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> +</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 new file mode 100644 index 00000000..55e052f1 --- /dev/null +++ b/kscreensaver/kdesavers/polygon.cpp @@ -0,0 +1,366 @@ +//----------------------------------------------------------------------------- +// +// kpolygon - Basic screen saver for KDE +// +// Copyright (c) Martin R. Jones 1996 +// +// layout management added 1998/04/19 by Mario Weilguni <mweilguni@kde.org> +// 2001/03/04 Converted to libkscreensaver by Martin R. Jones + +#include <config.h> +#include <stdlib.h> +#include <time.h> +#include <qcolor.h> +#include <qlabel.h> +#include <qslider.h> +#include <qlayout.h> +#include <klocale.h> +#include <kconfig.h> +#include <kglobal.h> +#include <kmessagebox.h> + +#include "polygon.h" +#include <qpainter.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 QDialog *kss_setup() + { + return new kPolygonSetup(); + } +} + +//----------------------------------------------------------------------------- +// dialog to setup screen saver parameters +// +kPolygonSetup::kPolygonSetup( QWidget *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(); + + QWidget *main = makeMainWidget(); + setButtonText( Help, i18n( "A&bout" ) ); + + QHBoxLayout *tl = new QHBoxLayout(main, 0, spacingHint()); + QVBoxLayout *tl1 = new QVBoxLayout; + tl->addLayout(tl1); + + QLabel *label = new QLabel( i18n("Length:"), main ); + tl1->addWidget(label); + + QSlider *sb = new QSlider(1, MAXLENGTH, 10, length, QSlider::Horizontal, + main ); + sb->setMinimumSize( 90, 20 ); + sb->setTickmarks(QSlider::Below); + sb->setTickInterval(10); + connect( sb, SIGNAL( valueChanged( int ) ), SLOT( slotLength( int ) ) ); + tl1->addWidget(sb); + + label = new QLabel( i18n("Vertices:"), main ); + tl1->addWidget(label); + + sb = new QSlider(3, MAXVERTICES, 2, vertices, QSlider::Horizontal, main); + sb->setMinimumSize( 90, 20 ); + sb->setTickmarks(QSlider::Below); + sb->setTickInterval(2); + connect( sb, SIGNAL( valueChanged( int ) ), SLOT( slotVertices( int ) ) ); + tl1->addWidget(sb); + + label = new QLabel( i18n("Speed:"), main ); + tl1->addWidget(label); + + sb = new QSlider(0, 100, 10, speed, QSlider::Horizontal, main); + sb->setMinimumSize( 90, 20 ); + sb->setTickmarks(QSlider::Below); + sb->setTickInterval(10); + connect( sb, SIGNAL( valueChanged( int ) ), SLOT( slotSpeed( int ) ) ); + tl1->addWidget(sb); + tl1->addStretch(); + + preview = new QWidget( 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() +{ + KConfig *config = KGlobal::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() +{ + KConfig *config = KGlobal::config(); + config->setGroup( "Settings" ); + + QString slength; + slength.setNum( length ); + config->writeEntry( "Length", slength ); + + QString svertices; + svertices.setNum( vertices ); + config->writeEntry( "Vertices", svertices ); + + QString 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"\ + "mjones@kde.org")); +} + +//----------------------------------------------------------------------------- + + +kPolygonSaver::kPolygonSaver( WId id ) : KScreenSaver( id ) +{ + polygons.setAutoDelete( TRUE ); + + readSettings(); + + directions.resize( numVertices ); + colorContext = QColor::enterAllocContext(); + + blank(); + + initialiseColor(); + initialisePolygons(); + + timer.start( speed ); + connect( &timer, SIGNAL( timeout() ), SLOT( slotTimeout() ) ); +} + +kPolygonSaver::~kPolygonSaver() +{ + timer.stop(); + QColor::leaveAllocContext(); + QColor::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() +{ + KConfig *config = KGlobal::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() +{ + QPainter 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 QPointArray( polygons.last()->copy() ) ); + moveVertices(); +} + +void kPolygonSaver::blank() +{ + setBackgroundColor( black ); + erase(); +} + +// initialise the polygon +void kPolygonSaver::initialisePolygons() +{ + int i; + + polygons.append( new QPointArray( numVertices + 1 ) ); + + QPointArray &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; + QPointArray &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 new file mode 100644 index 00000000..bfaac8a4 --- /dev/null +++ b/kscreensaver/kdesavers/polygon.h @@ -0,0 +1,79 @@ +//----------------------------------------------------------------------------- +// +// kpolygon - Basic screen saver for KDE +// +// Copyright (c) Martin R. Jones 1996 +// + +#ifndef __POLYGON_H__ +#define __POLYGON_H__ + +#include <qtimer.h> +#include <qptrlist.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: + QTimer timer; + unsigned numLines; + int numVertices; + int colorContext; + int speed; + QColor colors[64]; + int currentColor; + QPtrList<QPointArray> polygons; + QMemArray<QPoint> directions; + KRandomSequence rnd; +}; + +class kPolygonSetup : public KDialogBase +{ + Q_OBJECT +public: + kPolygonSetup( QWidget *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: + QWidget *preview; + kPolygonSaver *saver; + + int length; + int vertices; + int speed; +}; + +#endif + diff --git a/kscreensaver/kdesavers/rkodesolver.cpp b/kscreensaver/kdesavers/rkodesolver.cpp new file mode 100644 index 00000000..2127a110 --- /dev/null +++ b/kscreensaver/kdesavers/rkodesolver.cpp @@ -0,0 +1,252 @@ +//============================================================================ +// +// 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 new file mode 100644 index 00000000..d1f9d556 --- /dev/null +++ b/kscreensaver/kdesavers/rkodesolver.h @@ -0,0 +1,187 @@ +//============================================================================ +// +// 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 new file mode 100644 index 00000000..38098cb0 --- /dev/null +++ b/kscreensaver/kdesavers/rotation.cpp @@ -0,0 +1,825 @@ +//============================================================================ +// +// 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, georg-d@users.sourceforge.net +// +// $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> +// Qt headers +#include <qcheckbox.h> +#include <qlineedit.h> +#include <qvalidator.h> +#include <qtooltip.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 QDialog* 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( + QWidget* 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) + : QGLWidget(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(QColor(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(QColor(blue)); + myGlArrow(fixedAxsesLength, 0.5f, 0.03f, 0.1f); + + // x-axis, red + qglColor(QColor(red)); + glRotatef(90, 0, 1, 0); + + myGlArrow(fixedAxsesLength, 0.5f, 0.03f, 0.1f); + + // y-axis, green + qglColor(QColor(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(QColor(blue)); + myGlArrow(bodyAxsesLength, 0.5f, 0.03f, 0.1f); + + // x-axis, red + qglColor(QColor(red)); + glPushMatrix(); + glRotatef(90, 0, 1, 0); + myGlArrow(bodyAxsesLength, 0.5f, 0.03f, 0.1f); + glPopMatrix(); + + // y-axis, green + qglColor(QColor(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(QColor(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(QColor(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(QColor(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(QColor(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 QTimer(this); + timer->start(deltaT, TRUE); + connect(timer, SIGNAL(timeout()), this, 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 + KConfig *config = KGlobal::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(QResizeEvent* e) +{ + glArea->resize(e->size()); +} + +//----------------------------------------------------------------------------- +// KRotationSetup: dialog to setup screen saver parameters +//----------------------------------------------------------------------------- + +KRotationSetup::KRotationSetup(QWidget* 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 QDoubleValidator( + KRotationSaver::traceLengthSecondsLimitLower, + KRotationSaver::traceLengthSecondsLimitUpper, + 3, lengthEdit)); + LzEdit->setValidator( + new QDoubleValidator( + KRotationSaver::LzLimitLower, + KRotationSaver::LzLimitUpper, + 3, LzEdit)); + thetaEdit->setValidator( + new QDoubleValidator( + KRotationSaver::initEulerThetaLimitLower, + KRotationSaver::initEulerThetaLimitUpper, + 3, thetaEdit)); + + // set tool tips of editable fields + QToolTip::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)); + QToolTip::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)); + QToolTip::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()); + QString 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, SIGNAL(resized(QResizeEvent*)), + saver, SLOT(resizeGlArea(QResizeEvent*))); +} + +KRotationSetup::~KRotationSetup() +{ + delete saver; +} + +// Ok pressed - save settings and exit +void KRotationSetup::okButtonClickedSlot(void) +{ + KConfig* config = KGlobal::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>georg-d@users.sourceforge.net</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 QString& s) +{ + saver->setTraceLengthSeconds(s.toDouble()); +} +void KRotationSetup::LzEnteredSlot(const QString& s) +{ + saver->setLz(s.toDouble()); + if (saver!=0) saver->initData(); +} +void KRotationSetup::thetaEnteredSlot(const QString& s) +{ + saver->setInitEulerTheta(s.toDouble()); + if (saver!=0) saver->initData(); +} diff --git a/kscreensaver/kdesavers/rotation.h b/kscreensaver/kdesavers/rotation.h new file mode 100644 index 00000000..a1a73867 --- /dev/null +++ b/kscreensaver/kdesavers/rotation.h @@ -0,0 +1,325 @@ +//============================================================================ +// +// KRotation screen saver for KDE +// Copyright (C) 2004 Georg Drenkhahn +// $Id$ +// +//============================================================================ + +#ifndef __ROTATION_H__ +#define __ROTATION_H__ + +#include <math.h> +// STL headers +#include <valarray> +// Qt headers +#include <qwidget.h> +#include <qtimer.h> +#include <qgl.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 QGLWidget to display the KRotation screen saver. */ +class RotationGLWidget : public QGLWidget +{ + Q_OBJECT + + public: + /** @brief Constructor of KRotation's GL widget + * @param parent parent widget, passed to QGLWidget's constructor + * @param name name of widget, passed to QGLWidget'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(QWidget* 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 */ + QPoint 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(QResizeEvent* 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 */ + QTimer* 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(QWidget* 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 QString& s); + void LzEnteredSlot(const QString& s); + void thetaEnteredSlot(const QString& 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 new file mode 100644 index 00000000..d7e95d3b --- /dev/null +++ b/kscreensaver/kdesavers/rotationcfg.ui @@ -0,0 +1,488 @@ +<!DOCTYPE UI><UI version="3.2" stdsetdef="1"> +<class>KRotationSetupUi</class> +<widget class="QDialog"> + <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="QLayoutWidget"> + <property name="name"> + <cstring>layout17</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout6</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QButtonGroup"> + <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="QLayoutWidget" 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="QCheckBox" 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="QCheckBox" 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="QCheckBox" row="0" column="1"> + <property name="name"> + <cstring>yTrace</cstring> + </property> + <property name="text"> + <string>y</string> + </property> + </widget> + <widget class="QCheckBox" row="0" column="2"> + <property name="name"> + <cstring>zTrace</cstring> + </property> + <property name="text"> + <string>z</string> + </property> + </widget> + </grid> + </widget> + <widget class="QLabel" row="1" column="0"> + <property name="name"> + <cstring>textLabel1</cstring> + </property> + <property name="text"> + <string>Length:</string> + </property> + </widget> + <widget class="QLineEdit" 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="QLayoutWidget"> + <property name="name"> + <cstring>layout10</cstring> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLineEdit" 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="QLabel" 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="QLabel" 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="QLineEdit" 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="QLayoutWidget"> + <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="QLayoutWidget"> + <property name="name"> + <cstring>layout4</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QPushButton"> + <property name="name"> + <cstring>OkButton</cstring> + </property> + <property name="text"> + <string>&OK</string> + </property> + <property name="default"> + <bool>true</bool> + </property> + </widget> + <widget class="QPushButton"> + <property name="name"> + <cstring>CancelButton</cstring> + </property> + <property name="text"> + <string>&Cancel</string> + </property> + </widget> + <widget class="QPushButton"> + <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 QString&)</signal> + <receiver>KRotationSetupUi</receiver> + <slot>lengthEnteredSlot(const QString&)</slot> + </connection> + <connection> + <sender>LzEdit</sender> + <signal>textChanged(const QString&)</signal> + <receiver>KRotationSetupUi</receiver> + <slot>LzEnteredSlot(const QString&)</slot> + </connection> + <connection> + <sender>thetaEdit</sender> + <signal>textChanged(const QString&)</signal> + <receiver>KRotationSetupUi</receiver> + <slot>thetaEnteredSlot(const QString&)</slot> + </connection> +</connections> +<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 QString&)</slot> + <slot>LzEnteredSlot(const QString&)</slot> + <slot>thetaEnteredSlot(const QString&)</slot> +</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 new file mode 100644 index 00000000..185f3b55 --- /dev/null +++ b/kscreensaver/kdesavers/science.cpp @@ -0,0 +1,1151 @@ +//----------------------------------------------------------------------------- +// +// 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 <qpainter.h> +#include <qpixmap.h> +#include <qlabel.h> +#include <qlistbox.h> +#include <qcheckbox.h> +#include <qslider.h> +#include <qlayout.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_QTONLY +#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 QDialog *kss_setup() + { + return new KScienceSetup(); + } +} + +static struct { + QString 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( QWidget *parent ) : + QWidget ( parent ) { } + +void KPreviewWidget::paintEvent( QPaintEvent *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(qt_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( QRect ( 0, 0, width(), height() ) ); + } + + connect( &timer, SIGNAL( timeout() ), SLOT( slotTimeout() ) ); + timer.start( SCI_MAX_SPEED - speed[mode] ); +} + +KScienceSaver::~KScienceSaver() +{ + timer.stop(); + releaseLens(); + if ( d->xRootWin ) + XDestroyImage( d->xRootWin ); + XFreeGC(qt_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( QRect( 0, 0, width(), height() ) ); + else + if( diam < dm ) + { + do_refresh( QRect( (int) x+diam, (int) y, dm-diam, diam ) ); + do_refresh( QRect( (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( QRect( (int) x+diam, (int) y, dm-diam, diam ) ); + do_refresh( QRect( (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( QRect( 0, 0, width(), height() ) ); + + timer.start( SCI_MAX_SPEED - speed[mode]); +} + +void KScienceSaver::readSettings() +{ + KConfig *config = KGlobal::config(); + QString 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 QRect & rect ) +{ + if( grabPixmap ) + return; + rect.normalize(); + + if( hideBG[mode] ) + { + XSetWindowBackground( qt_xdisplay(), winId(), black.pixel() ); + XClearArea( qt_xdisplay(), winId(), rect.left(), rect.top(), + rect.width(), rect.height(), false ); + } + else + { + myAssert( d->xRootWin != 0, "root window not grabbed" ); + XPutImage( qt_xdisplay(), winId(), d->gc, d->xRootWin, + rect.left(), rect.top(), + rect.left(), rect.top(), + rect.width(), rect.height() ); + } +} + +void KScienceSaver::slotTimeout() +{ + if( grabPixmap ) { + if( !QWidget::find(winId())->isActiveWindow() ) + return; + grabPreviewWidget(); + grabPixmap = false; + initialize(); + if( hideBG[mode] ) + do_refresh( QRect ( 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( qt_xdisplay(), winId(), d->gc, d->buffer, 0, 0, xd, yd, w, h ); + if( hideBG[mode] ) + blackPixelUndo( xcoord, ycoord ); +} + +void KScienceSaver::grabRootWindow() +{ + Display *dsp = qt_xdisplay(); + Window rootwin = RootWindow( dsp, qt_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( QWidget::find(winId())->isActiveWindow(), "can't grab preview widget: dialog not active()" ); + + if( d->xRootWin ) + XDestroyImage( d->xRootWin ); + + Display *dsp = qt_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( qt_xdisplay(), qt_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( QWidget *parent, const char *name ) + : KDialogBase( parent, name, true, i18n( "Setup Science Screen Saver" ), + Ok|Cancel|Help, Ok, true ), saver( 0 ) +{ + readSettings(); + initModeInfo(); + + QWidget *main = makeMainWidget(); + + QHBoxLayout *lt = new QHBoxLayout( main, 0, spacingHint()); + QVBoxLayout *ltm = new QVBoxLayout; + lt->addLayout( ltm ); + QVBoxLayout *ltc = new QVBoxLayout; + lt->addLayout( ltc ); + + // mode + QLabel *label = new QLabel( i18n("Mode:"), main ); + ltm->addWidget( label ); + + QListBox *c = new QListBox( 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, SIGNAL( highlighted( int ) ), SLOT( slotMode( int ) ) ); + ltm->addWidget( c ); + + // inverse + QCheckBox *cbox = checkInverse = new QCheckBox( i18n("Inverse"), main ); + cbox->setEnabled( modeInfo[mode].inverseEnable ); + cbox->setChecked( inverse[mode] ); + connect( cbox, SIGNAL( clicked() ), SLOT( slotInverse() ) ); + ltm->addWidget( cbox ); + + // gravity + cbox = checkGravity = new QCheckBox( i18n("Gravity"), main ); + cbox->setChecked( gravity[mode] ); + connect( cbox, SIGNAL( clicked() ), SLOT( slotGravity() ) ); + ltm->addWidget( cbox ); + + // hide background + cbox = checkHideBG = new QCheckBox( i18n("Hide background"), main ); + cbox->setChecked( hideBG[mode] ); + connect( cbox, SIGNAL( clicked() ), SLOT( slotHideBG() ) ); + ltm->addWidget( cbox ); + ltm->addStretch(); + + // size + label = new QLabel( i18n("Size:"), main ); + ltc->addWidget( label ); + + slideSize = new QSlider(9, 50, 5, size[mode], QSlider::Horizontal, + main ); + slideSize->setMinimumSize( 90, 20 ); + slideSize->setTickmarks(QSlider::Below); + slideSize->setTickInterval(5); + connect( slideSize, SIGNAL( sliderMoved( int ) ), + SLOT( slotSize( int ) ) ); + connect( slideSize, SIGNAL( sliderPressed() ), + SLOT( slotSliderPressed() ) ); + connect( slideSize, SIGNAL( sliderReleased() ), + SLOT( slotSliderReleased() ) ); + + ltc->addWidget( slideSize ); + + // intensity + label = new QLabel( i18n("Intensity:"), main ); + ltc->addWidget( label ); + + slideIntensity = new QSlider(0, 10, 1, intensity[mode], + QSlider::Horizontal, main ); + slideIntensity->setMinimumSize( 90, 20 ); + slideIntensity->setTickmarks(QSlider::Below); + slideIntensity->setTickInterval(1); + connect( slideIntensity, SIGNAL( sliderMoved( int ) ), + SLOT( slotIntensity( int )) ); + connect( slideIntensity, SIGNAL( sliderPressed() ), + SLOT( slotSliderPressed() ) ); + connect( slideIntensity, SIGNAL( sliderReleased() ), + SLOT( slotSliderReleased() ) ); + ltc->addWidget( slideIntensity ); + + // speed + label = new QLabel( i18n("Speed:"), main ); + ltc->addWidget( label ); + + slideSpeed = new QSlider(0, SCI_MAX_SPEED, 10, speed[mode], + QSlider::Horizontal, main ); + slideSpeed->setMinimumSize( 90, 20 ); + slideSpeed->setTickmarks(QSlider::Below); + slideSpeed->setTickInterval(10); + connect( slideSpeed, SIGNAL( sliderMoved( int ) ), + SLOT( slotSpeed( int ) ) ); + ltc->addWidget( slideSpeed ); + + // motion + label = new QLabel( i18n("Motion:"), main ); + ltc->addWidget( label ); + + QHBoxLayout *ltcm = new QHBoxLayout; + ltc->addLayout( ltcm ); + + slideMoveX = new QSlider(0, SCI_MAX_MOVE, 5, moveX[mode], + QSlider::Horizontal, main ); + slideMoveX->setMinimumSize( 40, 20 ); + slideMoveX->setTickmarks(QSlider::Below); + slideMoveX->setTickInterval(5); + connect( slideMoveX, SIGNAL( sliderMoved( int ) ), + SLOT( slotMoveX( int ) ) ); + ltcm->addWidget( slideMoveX ); + + slideMoveY = new QSlider(0, SCI_MAX_MOVE, 5, moveY[mode], + QSlider::Horizontal, main ); + slideMoveY->setMinimumSize( 40, 20 ); + slideMoveY->setTickmarks(QSlider::Below); + slideMoveY->setTickInterval(5); + connect( slideMoveY, SIGNAL( sliderMoved( int ) ), + SLOT( slotMoveY( int ) ) ); + ltcm->addWidget( slideMoveY ); + + ltc->addStretch(); + + // preview + preview = new KPreviewWidget( main ); + preview->setFixedSize( 220, 170 ); + QPixmap 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() +{ + KConfig *config = KGlobal::config(); + QString 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() +{ + KConfig *config = KGlobal::config(); + QString 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() +{ + QString about = i18n("Science Version 0.26.5\n\nWritten by Rene Beutler (1998)\nrbeutler@g26.ethz.ch"); + KMessageBox::about(this, + about); +} diff --git a/kscreensaver/kdesavers/science.h b/kscreensaver/kdesavers/science.h new file mode 100644 index 00000000..7211f5d5 --- /dev/null +++ b/kscreensaver/kdesavers/science.h @@ -0,0 +1,148 @@ +// ---------------------------------------------------------------- +// +// kscience - screen saver for KDE +// +// copyright (c) Rene Beutler 1998 +// + +#ifndef __SCIENCE_H__ +#define __SCIENCE_H__ + +#include <qrect.h> +#include <qtimer.h> +#include <kdialogbase.h> +#include <kscreensaver.h> + +class QSlider; +class QCheckBox; + +#define MAX_MODES 6 + +typedef signed int T32bit; + +class KScienceSaver; + +class KPreviewWidget : public QWidget +{ + Q_OBJECT +public: + KPreviewWidget( QWidget *parent ); + void paintEvent( QPaintEvent *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 QRect & 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); + QTimer 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(QWidget *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; + QSlider *slideSize, *slideSpeed, *slideIntensity; + QSlider *slideMoveX, *slideMoveY; + QCheckBox *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 new file mode 100644 index 00000000..29df23ae --- /dev/null +++ b/kscreensaver/kdesavers/slideshow.cpp @@ -0,0 +1,1022 @@ +/* Slide Show Screen Saver + * (C) 1999 Stefan Taferner <taferner@kde.org> + * (C) 2001 Martin R. Jones <mjones@kde.org> + * (C) 2003 Chris Howells <howells@kde.org> + * (C) 2003 Sven Leiber <s.leiber@web.de> + * + * This code is under GPL + * + * 2001/03/04 Converted to libkscreensaver by Martin R. Jones. + */ + + +#include <qdir.h> +#include <qcolor.h> +#include <qlabel.h> +#include <qlayout.h> +#include <qfile.h> +#include <qpaintdevicemetrics.h> +#include <qcheckbox.h> +#include <qcombobox.h> +#include <qspinbox.h> +#include <qframe.h> +#include <qdesktopwidget.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 QDialog *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 = QColor::enterAllocContext(); + + mEffectRunning = false; + + mTimer.start(10, true); + connect(&mTimer, SIGNAL(timeout()), SLOT(slotTimeout())); + + QDesktopWidget *d = QApplication::desktop(); + if( geometry() == d->geometry() && d->numScreens() > 1) + { + for(int i = 0; i < d->numScreens(); ++i) + { + QRect 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(); + QColor::leaveAllocContext(); + QColor::destroyAllocContext(mColorContext); +} + + +//----------------------------------------------------------------------------- +void kSlideShowSaver::initNextScreen() +{ + QPaintDeviceMetrics metric(this); + int w, h; + + w = width(); + h = height(); + mNextScreen = QPixmap(w, h, metric.depth()); +} + + +//----------------------------------------------------------------------------- +void kSlideShowSaver::readConfig() +{ + KConfig *config = KGlobal::config(); + config->setGroup("Settings"); + mShowRandom = config->readBoolEntry("ShowRandom", true); + mZoomImages = config->readBoolEntry("ZoomImages", false); + mPrintName = config->readBoolEntry("PrintName", true); + mDirectory = config->readPathEntry("Directory", KGlobal::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 QPointArray 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 = KApplication::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(this, mx, my, &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 ((KApplication::random()&15) < 6) continue; + bitBlt(this, x, y+mdy, this, x, y, mdx, mh-y-mdy, CopyROP, true); + bitBlt(this, x, y, &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 QPointArray 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 = KApplication::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(this, x, 0, &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(this, 0, y, &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 = KApplication::random() % mw; + my = KApplication::random() % mh; + r = (KApplication::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 = (KApplication::random() % 3) + 1; + + w = width() >> fact; + h = height() >> fact; + sz = 1 << fact; + + for (i = (w*h)<<1; i > 0; i--) + { + x = (KApplication::random() % w) << fact; + y = (KApplication::random() % h) << fact; + bitBlt(this, x, y, &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(this, mx, my, &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(this, mix, y+miy, &mNextScreen, mix, y+miy, + mdx, mdy, CopyROP, true); + bitBlt(this, mx, y+my, &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 = KApplication::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(this, 0, 0, &mNextScreen, mix-mx, miy-my, mx, my, CopyROP, true); + bitBlt(this, x1, 0, &mNextScreen, mix, miy-my, mx, my, CopyROP, true); + bitBlt(this, 0, y1, &mNextScreen, mix-mx, miy, mx, my, CopyROP, true); + bitBlt(this, x1, y1, &mNextScreen, mix, miy, mx, my, CopyROP, true); + } + else + { + // fixed image edges + bitBlt(this, 0, 0, &mNextScreen, 0, 0, mx, my, CopyROP, true); + bitBlt(this, x1, 0, &mNextScreen, x1, 0, mx, my, CopyROP, true); + bitBlt(this, 0, y1, &mNextScreen, 0, y1, mx, my, CopyROP, true); + bitBlt(this, x1, y1, &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(this, 0, y, &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(this, x, 0, &mNextScreen, x, 0, 1, mh, CopyROP, true); + } + + mi++; + if (ixPos[mi] >= 0) return 160; + return -1; +} + + +//----------------------------------------------------------------------------- +void kSlideShowSaver::startPainter(Qt::PenStyle aPen) +{ + QBrush 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 = KApplication::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(this, 0, 0, &mNextScreen, 0, 0, + mNextScreen.width(), mNextScreen.height(), CopyROP, true); +} + + +//---------------------------------------------------------------------------- +void kSlideShowSaver::createNextScreen() +{ + QPainter 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(QColor("white")); + p.drawText(20 + (KApplication::random() % (ww>>1)), 20 + (KApplication::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); + QImage 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); + QImage 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 = (KApplication::random() % (ww - iw)) + geoptr->mXorg; + y = (KApplication::random() % (wh - ih)) + geoptr->mYorg; + } + else + { + x = ((ww - iw) >> 1) + geoptr->mXorg; + y = ((wh - ih) >> 1) + geoptr->mYorg; + } + + // bitBlt(&mNextScreen, x, y, &mImage, 0, 0, iw, ih, CopyROP, false); + p.drawImage(x, y, mImage); + } + } + + if (mPrintName) + { + p.setPen(QColor("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(QColor("white")); + p.drawText(10 + geoptr->mXorg, wh-20 + geoptr->mYorg, mImageName); + } + } + } + p.end(); +} + + +//---------------------------------------------------------------------------- +void kSlideShowSaver::loadNextImage() +{ + QString fname; + int num; + + num = mFileList.count(); + if (num <= 0) //no files in the directory + { + return; + } + + if (mShowRandom) + { + mFileIdx = KApplication::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 QString &dirName) +{ + QDir dir(dirName); + if (!dir.exists()) + { + return ; + } + dir.setFilter(QDir::Dirs | QDir::Files); + + const QFileInfoList *fileinfolist = dir.entryInfoList(); + QFileInfoListIterator it(*fileinfolist); + QFileInfo *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(QWidget *aParent, const char *aName) + : KDialogBase(aParent, aName, true, i18n( "Setup Slide Show Screen Saver" ), + Ok|Cancel|Help, Ok, true ) +{ + setButtonText( Help, i18n( "A&bout" ) ); + + QWidget *main = makeMainWidget(); + QVBoxLayout *top = new QVBoxLayout( 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, SIGNAL(returnPressed(const QString &)), + SLOT(slotDirSelected(const QString &))); + connect(cfg->mDirChooser, SIGNAL(urlSelected(const QString &)), + SLOT(slotDirSelected(const QString &))); + + readSettings(); +} + +kSlideShowSetup::~kSlideShowSetup() +{ + delete mSaver; +} + +//----------------------------------------------------------------------------- +void kSlideShowSetup::readSettings() +{ + KConfig *config = KGlobal::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() +{ + KConfig *config = KGlobal::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 QString &) +{ + writeSettings(); +} + + +//----------------------------------------------------------------------------- +void kSlideShowSetup::slotOk() +{ + writeSettings(); + accept(); +} + + +//----------------------------------------------------------------------------- +void kSlideShowSetup::slotHelp() +{ + KAboutData aboutData( "kslideshow.kss", I18N_NOOP("SlideShow"), + version, description, KAboutData::License_GPL, + "(c) 1999-2003, The KDE Team" ); + aboutData.addAuthor("Stefan Taferner", 0, "taferner@kde.org"); + aboutData.addAuthor("Chris Howells", 0, "howells@kde.org"); + aboutData.addAuthor("Sven Leiber", 0, "s.leiber@web.de"); + + KAboutApplication mAbout(&aboutData, this, 0); + mAbout.exec(); +} diff --git a/kscreensaver/kdesavers/slideshow.h b/kscreensaver/kdesavers/slideshow.h new file mode 100644 index 00000000..fa51670a --- /dev/null +++ b/kscreensaver/kdesavers/slideshow.h @@ -0,0 +1,150 @@ +/* Slide Show Screen Saver + * (C) 1999 Stefan Taferner <taferner@kde.org> + * (C) 2003 Sven Leiber <s.leiber@web.de> + */ + + +#ifndef SLIDESHOW_H +#define SLIDESHOW_H + +#include <qtimer.h> +#include <qptrlist.h> +#include <qstringlist.h> +#include <qpixmap.h> +#include <qpainter.h> +#include <qimage.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 QString &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(Qt::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; + }; + QPtrList<mScreenGeo> mGeoList; + bool mEffectRunning; + QTimer mTimer; + int mColorContext; + QStringList mFileList; + QStringList mRandomList; + int mFileIdx; + QImage mImage; + QPixmap mNextScreen; + EffectMethod* mEffectList; + EffectMethod mEffect; + int mNumEffects; + QPainter mPainter; + QString mImageName; + + // config settings: + bool mShowRandom; + bool mZoomImages; + bool mPrintName; + bool mSubdirectory; + bool mRandomPosition; + int mDelay; + QString 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(QWidget *parent=NULL, const char *name=NULL); + ~kSlideShowSetup(); + +protected: + void readSettings(); + +protected slots: + void slotOk(); + void slotHelp(); + void writeSettings(); + void slotDirSelected(const QString &where); + +private: + kSlideShowSaver *mSaver; + SlideShowCfg *cfg; +}; + +#endif /*SLIDESHOW_H*/ + diff --git a/kscreensaver/kdesavers/slideshowcfg.ui b/kscreensaver/kdesavers/slideshowcfg.ui new file mode 100644 index 00000000..544ea60b --- /dev/null +++ b/kscreensaver/kdesavers/slideshowcfg.ui @@ -0,0 +1,176 @@ +<!DOCTYPE UI><UI version="3.2" stdsetdef="1"> +<class>SlideShowCfg</class> +<widget class="QWidget"> + <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="QCheckBox" 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="QCheckBox" 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="QCheckBox" 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="QLabel" 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="QCheckBox" 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="QSpinBox" 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="QLabel" 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="QCheckBox" 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="QFrame" 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 new file mode 100644 index 00000000..d189c409 --- /dev/null +++ b/kscreensaver/kdesavers/sspreviewarea.cpp @@ -0,0 +1,21 @@ +//============================================================================ +// +// KRotation screen saver for KDE +// Copyright (C) 2004 Georg Drenkhahn +// $Id$ +// +//============================================================================ + +#include "sspreviewarea.h" +#include "sspreviewarea.moc" + +SsPreviewArea::SsPreviewArea(QWidget* parent, const char* name) + : QWidget(parent, name) +{ +} + +void SsPreviewArea::resizeEvent(QResizeEvent* e) +{ + emit resized(e); +} + diff --git a/kscreensaver/kdesavers/sspreviewarea.h b/kscreensaver/kdesavers/sspreviewarea.h new file mode 100644 index 00000000..5b14f09d --- /dev/null +++ b/kscreensaver/kdesavers/sspreviewarea.h @@ -0,0 +1,57 @@ +//============================================================================ +// +// KRotation screen saver for KDE +// Copyright (C) 2004 Georg Drenkhahn +// $Id$ +// +//============================================================================ + +#ifndef SSPREVIEWAREA_H +#define SSPREVIEWAREA_H + +#include <qwidget.h> + +/** @brief Reimplementation of QWidget emitting a signal if resized. + * + * This class is equalt to QWidget 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 QGLWidget::resizeGL() method of the GL + * widgets (PendulumGLWidget::resizeGL(), RotationGLWidget::resizeGL()) which + * really resizes the GL scenery. */ +class SsPreviewArea : public QWidget +{ + Q_OBJECT + + public: + /** @brief Constructor for SsPreviewArea + * @param parent Pointer tp parent widget, forwarded to the QWidget + * constructor + * @param name Pointer to widget name, forwarded to the QWidget constructor + * + * The constructor just calls QWidget::QWidget() with the given arguments. + */ + SsPreviewArea(QWidget* parent = NULL, const char* name = NULL); + + protected: + /** @brief Called if widget gets resized. + * @param e Pointer to the corresponding QResizeEvent object containing the + * resize information + * + * Reimplemented event handler from QWidget. Only the signal resized() is + * emitted. */ + virtual void resizeEvent(QResizeEvent* e); + + signals: + /** @brief Signal which is emitted in the resizeEvent() method. + * @param e Pointer to the corresponding QResizeEvent object */ + void resized(QResizeEvent* e); +}; + +#endif diff --git a/kscreensaver/kdesavers/vec3.cpp b/kscreensaver/kdesavers/vec3.cpp new file mode 100644 index 00000000..c66730e5 --- /dev/null +++ b/kscreensaver/kdesavers/vec3.cpp @@ -0,0 +1,105 @@ +//============================================================================ +// +// 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 new file mode 100644 index 00000000..62aeb8ed --- /dev/null +++ b/kscreensaver/kdesavers/vec3.h @@ -0,0 +1,214 @@ +//============================================================================ +// +// 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 new file mode 100644 index 00000000..6d4a1af2 --- /dev/null +++ b/kscreensaver/kdesavers/vm.c @@ -0,0 +1,264 @@ +/* + * 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 new file mode 100644 index 00000000..dc64d241 --- /dev/null +++ b/kscreensaver/kdesavers/vm.h @@ -0,0 +1,52 @@ +#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 new file mode 100644 index 00000000..3d6e84cd --- /dev/null +++ b/kscreensaver/kdesavers/vm.xbm @@ -0,0 +1,191 @@ +/* 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 new file mode 100644 index 00000000..8d00a5b3 --- /dev/null +++ b/kscreensaver/kdesavers/vm.xpm @@ -0,0 +1,493 @@ +/* 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.$.#.#.@.X.f 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.$.-.<.@.X.f R ! J S f C J T R f ", +"....+.>.&.:.>.&.o.....f f x P G b P G I f f X.X.$.<.-.,.<.-.@.X.X.f 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.<.-.-.<.X.2.-.-.-.@.f 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 new file mode 100644 index 00000000..ea0cd96a --- /dev/null +++ b/kscreensaver/kdesavers/vm_random.c @@ -0,0 +1,379 @@ +/* + * 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 new file mode 100644 index 00000000..1aa5e937 --- /dev/null +++ b/kscreensaver/kdesavers/vm_random.h @@ -0,0 +1,31 @@ +#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 new file mode 100644 index 00000000..e8a999a5 --- /dev/null +++ b/kscreensaver/kdesavers/wave.cpp @@ -0,0 +1,324 @@ +//----------------------------------------------------------------------------- +// +// kwave - Waveing Flag Screen Saver for KDE 2 +// +// Copyright (c) Ian Reinhart Geiser 2001 +// +#include <stdlib.h> +#include <qlabel.h> +#include <qlayout.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 Q_WS_MACX +#include <OpenGL/glu.h> +#include <OpenGL/gl.h> +#else +#include <GL/glu.h> +#include <GL/gl.h> +#endif +#include <qimage.h> +#include <kdebug.h> +#include <qpainter.h> +#include <qradiobutton.h> +#include <qspinbox.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 QDialog *kss_setup() + { + return new KWaveSetup(); + } +} + +//----------------------------------------------------------------------------- +// dialog to setup screen saver parameters +// +KWaveSetup::KWaveSetup( QWidget *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, SIGNAL( clicked() ), SLOT( slotOkPressed() ) ); + connect( PushButton2, SIGNAL( clicked() ), SLOT( reject() ) ); + connect( PushButton3, SIGNAL( clicked() ), SLOT( aboutPressed() ) ); + connect( SpinBox1, SIGNAL( valueChanged(int)), saver, SLOT( updateSize(int))); + connect( RadioButton1, SIGNAL( toggled(bool)), saver, SLOT( doStars(bool))); + +} + +KWaveSetup::~KWaveSetup( ) +{ + delete saver; +} + + +// read settings from config file +void KWaveSetup::readSettings() +{ + KConfig *config = KGlobal::config(); + config->setGroup( "Settings" ); + +// color = config->readColorEntry( "Color", &black ); +} + +// Ok pressed - save settings and exit +void KWaveSetup::slotOkPressed() +{ + KConfig *config = KGlobal::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 KDE</p>\nCopyright (c) Ian Reinhart Geiser 2001")); +} +//----------------------------------------------------------------------------- + + +KWaveSaver::KWaveSaver( WId id ) : KScreenSaver( id ) +{ + kdDebug() << "Blank" << endl; + readSettings(); + + timer = new QTimer( this ); + timer->start( 50, TRUE ); + setBackgroundColor( black ); + erase(); + wave = new Wave(); + embed(wave); + wave->show(); + connect( timer, SIGNAL(timeout()), this, SLOT(blank()) );; +} + +KWaveSaver::~KWaveSaver() +{ + +} + +// read configuration settings from config file +void KWaveSaver::readSettings() +{ + KConfig *config = KGlobal::config(); + config->setGroup( "Settings" ); + +// color = config->readColorEntry( "Color", &black ); +} + +void KWaveSaver::blank() +{ + // Play wave + + wave->updateGL(); + timer->start( 100, TRUE ); + +} +Wave::Wave( QWidget * parent, const char * name) : QGLWidget (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; + + QImage buf; // = QPixmap::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 + { + QImage dummy( 64, 64, 64 ); + dummy.fill( Qt::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 new file mode 100644 index 00000000..ea2f64f3 --- /dev/null +++ b/kscreensaver/kdesavers/wave.h @@ -0,0 +1,97 @@ +//----------------------------------------------------------------------------- +// +// 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 <nehe@connect.ab.ca> +// 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 <qdialog.h> +#include <qgl.h> +#ifdef Q_WS_MACX +#include <OpenGL/glu.h> +#include <OpenGL/gl.h> +#else +#include <GL/glu.h> +#include <GL/gl.h> +#endif +#include <kscreensaver.h> +#include <qtimer.h> +#include <qimage.h> +#include "wavecfg.h" + + +class Wave : public QGLWidget +{ +Q_OBJECT + +public: + Wave( QWidget * 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]; + QImage tex; + +}; + +class KWaveSaver : public KScreenSaver +{ +Q_OBJECT +public: + KWaveSaver( WId drawable ); + virtual ~KWaveSaver(); + void readSettings(); +public slots: + void blank(); + +private: + Wave *wave; + QTimer *timer; +}; + +class KWaveSetup : public SetupUi +{ + Q_OBJECT +public: + KWaveSetup( QWidget *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 new file mode 100644 index 00000000..7fcab67a --- /dev/null +++ b/kscreensaver/kdesavers/wavecfg.ui @@ -0,0 +1,191 @@ +<!DOCTYPE UI><UI version="3.0" stdsetdef="1"> +<class>SetupUi</class> +<widget class="QDialog"> + <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="QLayoutWidget"> + <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="QCheckBox" row="3" column="0"> + <property name="name"> + <cstring>CheckBox1</cstring> + </property> + <property name="text"> + <string>Use textures</string> + </property> + </widget> + <widget class="QPushButton" row="4" column="2"> + <property name="name"> + <cstring>PushButton3</cstring> + </property> + <property name="text"> + <string>&About</string> + </property> + </widget> + <widget class="QSpinBox" 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="QPushButton" row="4" column="1"> + <property name="name"> + <cstring>PushButton2</cstring> + </property> + <property name="text"> + <string>&Cancel</string> + </property> + </widget> + <widget class="QPushButton" 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="QGroupBox" row="2" column="0"> + <property name="name"> + <cstring>GroupBox1</cstring> + </property> + <property name="title"> + <string>Shapes</string> + </property> + <widget class="QLayoutWidget"> + <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="QRadioButton"> + <property name="name"> + <cstring>RadioButton1</cstring> + </property> + <property name="text"> + <string>Stars</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + </widget> + <widget class="QRadioButton"> + <property name="name"> + <cstring>RadioButton1_2</cstring> + </property> + <property name="text"> + <string>Flares</string> + </property> + </widget> + </vbox> + </widget> + </widget> + <widget class="QWidget" row="0" column="1" rowspan="4" colspan="2"> + <property name="name"> + <cstring>preview</cstring> + </property> + </widget> + <widget class="QLabel" 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> |