Page MenuHomeHEPForge

No OneTemporary

This file is larger than 256 KB, so syntax highlighting was skipped.
Index: trunk/cuba/demo-fortran
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: trunk/cuba/demo-c
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: trunk/cuba/tools/fcc
===================================================================
--- trunk/cuba/tools/fcc (revision 158)
+++ trunk/cuba/tools/fcc (revision 159)
@@ -1,54 +1,73 @@
#! /bin/sh
# script to compile C programs that are linked
# against Fortran libraries
-# last modified 7 Jun 11 th
+# last modified 3 Feb 15 th
args=
+compileonly=
objs=
ldflags=
fldflags=
-compileonly=
cc="${REALCC:-cc}"
cxx="${REALCXX:-c++}"
-[ `basename $0` = f++ ] && cc="$cxx"
+test `basename $0 .in` = f++ && cc="$cxx"
+case `$cxx --version 2>&1` in
+*clang*) cxx="$cxx -stdlib=libstdc++" ;;
+esac
-while [ $# -gt 0 ] ; do
+while test $# -gt 0 ; do
case "$1" in
+ -st | -b32 | -b64)
+ ;; # ignore mcc-specific flags
-arch)
shift
;;
- -st | -b32 | -b64)
+ -lstdc++)
+ cc="$cxx"
+ ;; # or else -static-libstdc++ has no effect
+ -Wno-long-double)
+ ;; # mcc adds this on Macs & gcc 4 doesn't like it
+ -L*CompilerAdditions*)
+ ldflags="$ldflags '$1'"
+ mldir=`echo "$1" | sed '
+ s/^-L//
+ s/Links.MathLink.DeveloperKit/Libraries/
+ s/CompilerAdditions.*$//'`
+ case "$cc" in
+ *-m32*) mldir=`echo "$mldir" | sed 's/-x86-64//g'` ;;
+ esac
+ test -f "$mldir/libuuid.a" && {
+ ldflags="$ldflads '-L$mldir'"
+ fldflags="$fldflags -luuid"
+ }
;;
-[Ll]* | -Wl*)
- ldflags="$ldflags \"$1\""
+ ldflags="$ldflags '$1'"
;;
*.tm.o)
- objs="\"$1\" $objs"
+ objs="'$1' $objs"
;;
*.a | *.o | *.so)
- objs="$objs \"$1\""
- ;;
- -Wno-long-double)
- # mcc adds this on Macs & gcc 4 doesn't like it
+ objs="$objs '$1'"
;;
*.cc)
- args="$args \"$1\""
+ args="$args '$1'"
cc="$cxx"
;;
-c)
compileonly="-c"
;;
-o)
- args="$args -o \"$2\""
+ args="$args -o '$2'"
shift
;;
*)
- args="$args \"$1\""
+ args="$args '$1'"
;;
esac
shift
done
-eval "set -x ; $cc $args ${compileonly:-$objs $ldflags $fldflags}"
+eval "set -x ; exec $cc $args ${compileonly:-$objs $ldflags $fldflags}"
Property changes on: trunk/cuba/tools/fcc
___________________________________________________________________
Modified: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/cuba/tools/mkdist.c
===================================================================
--- trunk/cuba/tools/mkdist.c (revision 0)
+++ trunk/cuba/tools/mkdist.c (revision 159)
@@ -0,0 +1,183 @@
+/*
+ mkdist.c
+
+ Usage: mkdist cvfz packagename.tar.gz packagedir files
+
+ Creates packagename.tar.gz for distribution which unpacks
+ into the directory "packagedir".
+ 1) Sets up a temporary tree in which
+ - symlinks are preserved if they point to files in the tree,
+ - all other files are hardlinked.
+ 2) Tars that tree.
+ 3) Removes the temporary tree.
+
+ last modified 4 Dec 14 th
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <dirent.h>
+#include <limits.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+
+char path[PATH_MAX], *path_end;
+
+
+static inline char *copydir(char *d, const char *s) {
+ const char *dir = strrchr(s, '/');
+ const ssize_t n = (dir) ? dir - s + 1 : 0;
+ return memcpy(d, s, n) + n;
+}
+
+
+static int depth(const char *path)
+{
+ int n = 0;
+ for( ; ; ) {
+ if( strncmp(path, "./", 2) == 0 ) path += 2;
+ else if( strncmp(path, "../", 3) == 0 ) {
+ path += 3;
+ if( --n < 0 ) return n;
+ }
+ else if( (path = strchr(path, '/')) ) ++n;
+ else return n;
+ path = path + strspn(path, "/");
+ }
+}
+
+
+static void mkdirhier(char *file)
+{
+ struct stat st;
+ char *s = file;
+ const char *e = strrchr(file, '/');
+
+ while( s < e ) {
+ s = strchr(s, '/');
+ *s = 0;
+ if( stat(file, &st) ) mkdir(file, 0777);
+ else if( !S_ISDIR(st.st_mode) ) {
+ fprintf(stderr, "Cannot create %s\n", file);
+ exit(1);
+ }
+ *s++ = '/';
+ }
+}
+
+
+static void inspect(const char *file, const int phase)
+{
+ struct stat st;
+ if( lstat(file, &st) ) {
+ fprintf(stderr, "Cannot stat %s\n", file);
+ return;
+ }
+
+ strcpy(path_end, file);
+ if( phase == 0 ) mkdirhier(path);
+
+ if( S_ISREG(st.st_mode) ) {
+ if( phase == 0 ) link(file, path);
+ return;
+ }
+
+ if( S_ISDIR(st.st_mode) ) {
+ char sub[PATH_MAX], *sub_end;
+ struct dirent *entry;
+
+ DIR *cwd = opendir(file);
+ if( cwd == NULL ) {
+ fprintf(stderr, "Cannot read directory %s\n", file);
+ exit(1);
+ }
+
+ strcpy(sub, file);
+ sub_end = sub + strlen(sub);
+ *sub_end++ = '/';
+
+ while( (entry = readdir(cwd)) )
+ if( *entry->d_name != '.' ) {
+ strcpy(sub_end, entry->d_name);
+ inspect(sub, phase);
+ }
+
+ closedir(cwd);
+ return;
+ }
+
+ if( S_ISLNK(st.st_mode) ) {
+ char src[PATH_MAX], tmp[PATH_MAX];
+ char *lnrel = copydir(src, file), *lnabs;
+ ssize_t n = readlink(file, lnrel, PATH_MAX);
+ if( n < 0 ) {
+ fprintf(stderr, "Cannot read link %s\n", file);
+ exit(1);
+ }
+ lnrel[n++] = 0;
+
+ if( *(lnabs = lnrel) != '/' &&
+ depth(lnabs = src) >= 0 ) { /* not out-of-tree */
+ if( phase == 0 ) return;
+ memcpy(copydir(tmp, path), lnrel, n);
+ if( stat(tmp, &st) == 0 ) {
+ symlink(lnrel, path);
+ return;
+ }
+ } else if( phase == 1 ) return;
+
+ if( realpath(lnabs, tmp) == NULL ||
+ link(tmp, path) == -1 )
+ fprintf(stderr, "Dangling link %s\n", file);
+ }
+}
+
+
+int main(int argc, char **argv)
+{
+ char cmd[PATH_MAX];
+ struct stat st;
+ int c;
+
+ if( argc < 5 ) {
+ fprintf(stderr,
+ "Usage:\t%s tarflags packagename.tar[.gz] packagedir files\n\n"
+ "Creates packagename.tar[.gz] for distribution which contains\n"
+ "\"files\" and unpacks into the directory \"packagedir\".\n"
+ "Symlinks are preserved if they point to files in the package.\n\n",
+ argv[0]);
+ exit(1);
+ }
+
+ if( strstr(argv[2], ".tar") == NULL ) {
+ fprintf(stderr, "%s is not a tar file\n", argv[2]);
+ exit(1);
+ }
+
+ if( stat(argv[3], &st) == 0 ) {
+ fprintf(stderr, "%s exists already\n", argv[3]);
+ exit(1);
+ }
+ strcpy(path, argv[3]);
+ path_end = path + strlen(path);
+ *path_end++ = '/';
+
+ sprintf(cmd, "rm -fr %s %s", path, argv[2]);
+ system(cmd);
+
+ for( c = 4; c < argc; ++c ) inspect(argv[c], 0);
+ for( c = 4; c < argc; ++c ) inspect(argv[c], 1);
+
+ sprintf(cmd, "tar %s %s --owner=root --group=root %s",
+ argv[1], argv[2], argv[3]);
+ system(cmd);
+
+ sprintf(cmd, "rm -fr %s", argv[3]);
+ system(cmd);
+
+ return 0;
+}
+
Index: trunk/cuba/tools/mkstatic
===================================================================
--- trunk/cuba/tools/mkstatic (revision 158)
+++ trunk/cuba/tools/mkstatic (revision 159)
@@ -1,25 +1,31 @@
#! /bin/sh
-st=-static
exe=
mach=
mlmach=
case `uname -s` in
Linux) tag=Linux
- mach=-m32
- mlmach=-b32 ;;
+ st=-static
+ #mach=-m32
+ #mlmach=-b32
+ ;;
Darwin) tag=Mac
- st=-static-libgcc ;;
+ st=-static-libgcc
+ mach=-mmacosx-version-min=10.6
+ ;;
CYG*) tag=Windows
- exe=.exe ;;
+ export CC=i686-pc-cygwin-gcc
+ st="-static -static-libgcc"
+ exe=.exe
+ ;;
esac
./configure CFLAGS="-O3 -fomit-frame-pointer -ffast-math $st $mach" MCFLAGS="-st $mlmach"
make math
for file in Vegas Suave Divonne Cuhre ; do
gzip $file$exe
mv $file$exe.gz $file$exe-$tag.gz
done
Property changes on: trunk/cuba/tools/mkstatic
___________________________________________________________________
Modified: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/cuba/tools/mcc
===================================================================
--- trunk/cuba/tools/mcc (revision 158)
+++ trunk/cuba/tools/mcc (revision 159)
@@ -1,109 +1,119 @@
#! /bin/sh
# this script jumps in if there is no working mcc on the path:
# - on Mac OS it (hopefully) figures out the location of mcc,
# - on Cygwin it substitutes mcc completely
-# last modified 2 Feb 11 th
+# last modified 16 Jan 15 th
sdkpath()
{
mathcmd="$1"
shift
mathcmd=`IFS=:
PATH="$PATH:$*" which $mathcmd`
eval `"$mathcmd" -run '
Print["sysid=\"", $SystemID, "\""];
Print["topdir=\"", $TopDirectory, "\""];
Exit[]' < /dev/null | tr '\r' ' ' | tail -2`
- # Cygwin's dlltool does not handle native 64-bit libraries yet
- [ "$sysid" = Windows-x86-64 ] && sysid=Windows
+ # check whether Cygwin's dlltool can handle 64-bit DLLs
+ test "$sysid" = Windows-x86-64 && {
+ ${DLLTOOL:-dlltool} --help | grep x86-64 > /dev/null || sysid=Windows
+ }
+
topdir=`cd "$topdir" ; echo $PWD`
for sdk in \
- "$topdir/AddOns/MathLink/DeveloperKit/$sysid/CompilerAdditions" \
"$topdir/SystemFiles/Links/MathLink/DeveloperKit/$sysid/CompilerAdditions" \
- "$topdir/SystemFiles/Links/MathLink/DeveloperKit/CompilerAdditions" ; do
- [ -d "$sdk" ] && return
+ "$topdir/SystemFiles/Links/MathLink/DeveloperKit/CompilerAdditions" \
+ "$topdir/AddOns/MathLink/DeveloperKit/$sysid/CompilerAdditions" ; do
+ test -d "$sdk" && return
done
- echo "Cannot determine Mathematica's system ID using $mathcmd" 1>&2
+ echo "MathLink SDK not found" 1>&2
exit 1
}
cygmcc()
{
sdkpath math \
- "`cygpath \"$ProgramW6432\"`/Wolfram Research/Mathematica"/* \
- "`cygpath \"$PROGRAMFILES\"`/Wolfram Research/Mathematica"/*
+ "`cygpath '$ProgramW6432'`/Wolfram Research/Mathematica"/* \
+ "`cygpath '$PROGRAMFILES'`/Wolfram Research/Mathematica"/* \
+ "/cygdrive/c/Program Files/Wolfram Research/Mathematica"/* \
+ "/cygdrive/c/Program Files (x86)/Wolfram Research/Mathematica"/*
+
for sdk in "$sdk"/m* ; do
break
done
- [ `basename "$sdk"` = cygwin ] && {
- CC=${CC:-gcc} bash -O igncr "$sdk/bin/mcc" "$@"
- return
- }
-
cache=MLcyg-cache
- [ -d $cache ] || mkdir $cache
+ test -d $cache || mkdir $cache
- MLversion=3
- for OSbits in 32 64 ; do
- dllname=ml${OSbits}i$MLversion
- libname="$sdk/lib/${dllname}m.lib"
- [ -f "$libname" ] && break
+ for libname in "$sdk"/lib/ml*m.lib ; do
+ :
done
+ dllname=`basename "$libname" m.lib`
+ OSbits=32
+ case "$dllname" in
+ *64*) OSbits=64 ;;
+ esac
lib="$cache/${dllname}m"
- [ -f "$lib.a" ] || {
+ test -f "$lib.a" || {
( echo "EXPORTS"
- nm -C --defined-only "$libname" | awk '/ T [^.]/ { print $3 }' ) > "$lib.def"
- dlltool --dllname "$dllname.dll" --def "$lib.def" --output-lib "$lib.a" -k
+ ${NM:-nm} -C --defined-only "$libname" | awk '/ T [^.]/ { print $3 }'
+ ) > "$lib.def"
+ ${DLLTOOL:-dlltool} -k --dllname "$dllname.dll" \
+ --def "$lib.def" --output-lib "$lib.a"
}
+ tmp=
+ args="-DWIN$OSbits -I'$sdk/include'"
for arg in "$@" ; do
case "$arg" in
- -l* | -L* | *.a)
- ldflags="$ldflags $arg" ;;
*.tm)
cp "$arg" "$arg.tm"
"$sdk"/bin/mprep -lines -o "$arg.c" "$arg.tm"
- tmp="$tmp $arg.c $arg.tm"
- ccflags="$ccflags $arg.c" ;;
+ tmp="$tmp '$arg.c' '$arg.tm'"
+ args="$args '$arg.c'" ;;
*)
- ccflags="$ccflags $arg" ;;
+ args="$args '$arg'" ;;
esac
done
trap "rm -f $tmp" 0 1 2 3 15
-
- set -x
- ${CC:-gcc} -DWIN$OSbits -I"$sdk/include" $ccflags $ldflags $lib.a -mwindows
+ eval "set -x ; ${CC:-gcc} $args $lib.a -mwindows"
}
macmcc()
{
- sdkpath MathKernel /Applications/Mathematica*/Contents/MacOS \
- $HOME/Desktop/Mathematica*/Contents/MacOS
+ sdkpath MathKernel \
+ /Applications/Mathematica*/Contents/MacOS \
+ $HOME/Desktop/Mathematica*/Contents/MacOS
+ exec "$sdk/mcc" "$@"
+}
- "$sdk/mcc" "$@" && exit 0
- echo "mcc not found"
+defaultmcc()
+{
+ sdkpath math \
+ /usr/local/bin \
+ /usr/local/Wolfram/bin \
+ /usr/local/Wolfram/Mathematica/*/Executables \
+ /opt/Wolfram/bin \
+ /opt/Wolfram/Mathematica/*/Executables
+ exec "$sdk/mcc" "$@"
}
-
shopt -s nullglob 2> /dev/null
-ostype=`uname -s`
-
-case $ostype in
+case `uname -s` in
Darwin) macmcc "$@" ;;
CYG*) cygmcc "$@" ;;
-*) echo "Unknown OS $ostype" 1>&2 ;;
+*) defaultmcc "$@" ;;
esac
Property changes on: trunk/cuba/tools/mcc
___________________________________________________________________
Modified: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/cuba/tools/partview.cpp
===================================================================
--- trunk/cuba/tools/partview.cpp (revision 158)
+++ trunk/cuba/tools/partview.cpp (revision 159)
@@ -1,261 +1,265 @@
/*
partview.cpp
Partition viewer for Cuba
- last modified 15 Feb 11 th
+ last modified 18 Dec 13 th
*/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <QWidget>
#include <QMainWindow>
#include <QTabWidget>
#include <QAction>
#include <QToolBar>
#include <QPainter>
#include <QPrinter>
#include <QPrintDialog>
#include <QApplication>
#include <QColorGroup>
#include <list>
#include "quit.xpm"
#include "print.xpm"
// --------------------------------------------------------------
class PartitionPlane : public QWidget
{
public:
PartitionPlane( const int dimx, const int dimy, QWidget *parent = 0 )
: QWidget(parent), m_dimx(dimx), m_dimy(dimy), m_got(0) {
}
void addBound( const int dim, const double lower, const double upper );
void drawRegion( QPainter *p, const QRect &r );
void drawRegions( QPainter *p );
QSize sizeHint() const {
return QSize(InitialSize, InitialSize);
}
QString filename() const {
return QString("%1-%2.ps").arg(m_dimx).arg(m_dimy);
}
protected:
void paintEvent( QPaintEvent * ) {
QPainter p(this);
drawRegions( &p );
}
private:
int m_dimx, m_dimy, m_got;
int m_xlower, m_xupper, m_ylower, m_yupper;
typedef std::list<QRect> regionList;
typedef regionList::iterator regionIt;
regionList m_regions;
enum {
Hue = 0, // red
InitialSize = 400,
CoordScale = 4*InitialSize };
};
void PartitionPlane::addBound( const int dim,
const double lower, const double upper )
{
if( dim == m_dimx ) {
m_xlower = int(CoordScale*lower);
m_xupper = int(CoordScale*upper);
m_got |= 1;
}
if( dim == m_dimy ) {
m_ylower = int(CoordScale*lower);
m_yupper = int(CoordScale*upper);
m_got |= 2;
}
if( m_got == 3 ) {
m_got = 0;
const QRect rect = QRect(m_xlower, CoordScale - m_yupper,
m_xupper - m_xlower + 1, m_yupper - m_ylower + 1);
const int area = rect.width()*rect.height();
regionIt r;
for( r = m_regions.begin(); r != m_regions.end(); ++r ) {
if( rect == *r ) return;
if( area > (*r).width()*(*r).height() ) break;
}
m_regions.insert(r, rect);
- QPainter p(this);
- drawRegion( &p, rect );
+// QPainter p(this);
+// drawRegion( &p, rect );
+ this->update(rect);
}
}
void PartitionPlane::drawRegion( QPainter *p, const QRect &r )
{
p->setWindow(0, 0, CoordScale, CoordScale);
QColor c;
const double ratio = r.width()*r.height()/
double(CoordScale*CoordScale);
const int saturation = int(255/(M_PI/2)*asin(1 - ratio));
c.setHsv( Hue, saturation, 255 );
p->setBrush(c);
p->setPen(palette().foreground().color());
p->drawRect(r);
}
void PartitionPlane::drawRegions( QPainter *p )
{
for( regionIt r = m_regions.begin(); r != m_regions.end(); ++r )
drawRegion( p, *r );
}
// --------------------------------------------------------------
class PartitionViewer : public QMainWindow
{
Q_OBJECT
public:
- PartitionViewer( QWidget *parent );
+ PartitionViewer( QWidget *parent = 0 );
void addPlane( const int dimx, const int dimy );
void addBound( const int dim, const double lower, const double upper );
int count() const { return m_tabs->count(); }
void tabupdate() {
if( m_tabs->currentWidget() != 0 ) m_tabs->currentWidget()->update();
}
public slots:
void print();
private:
QTabWidget *m_tabs;
QPrinter *m_printer;
};
-PartitionViewer::PartitionViewer( QWidget *parent = 0 )
+PartitionViewer::PartitionViewer( QWidget *parent )
: QMainWindow(parent)
{
setWindowTitle(tr("Cuba Partition Viewer"));
QToolBar *toolbar = new QToolBar(this);
addToolBar(Qt::LeftToolBarArea, toolbar);
QAction *quit = new QAction( QPixmap(quit_xpm), tr("&Quit"), this );
+ quit->setShortcut(QKeySequence(tr("Ctrl+Q")));
connect( quit, SIGNAL(activated()), qApp, SLOT(quit()) );
toolbar->addAction(quit);
#ifndef QT_NO_PRINTER
QAction *print = new QAction( QPixmap(print_xpm), tr("&Print..."), this );
+ print->setShortcut(QKeySequence(tr("Ctrl+P")));
connect( print, SIGNAL(activated()), this, SLOT(print()) );
toolbar->addAction(print);
m_printer = new QPrinter;
#endif
m_tabs = new QTabWidget(this);
setCentralWidget(m_tabs);
}
void PartitionViewer::addPlane( const int dimx, const int dimy )
{
PartitionPlane *plane = new PartitionPlane(dimx, dimy, this);
m_tabs->addTab( plane, tr("%1-%2 plane").arg(dimx).arg(dimy) );
}
void PartitionViewer::addBound( const int dim,
const double lower, const double upper )
{
for( int index = 0; index < m_tabs->count(); ++index ) {
PartitionPlane *plane = (PartitionPlane *)m_tabs->widget(index);
if( plane ) plane->addBound(dim, lower, upper);
}
}
void PartitionViewer::print()
{
#ifndef QT_NO_PRINTER
PartitionPlane *plane = (PartitionPlane *)m_tabs->currentWidget();
if( !plane ) return;
QPrintDialog printDialog(m_printer, this);
if( printDialog.exec() == QDialog::Accepted ) {
QPainter p;
if( p.begin(m_printer) ) {
p.setViewport( QRect(QPoint(0, 0), plane->sizeHint()) );
- plane->drawRegions( &p );
+// plane->drawRegions( &p );
+ this->update();
}
}
#endif
}
#include "partview.moc"
// --------------------------------------------------------------
int main( int argc, char **argv )
{
QApplication app(argc, argv);
PartitionViewer partview;
argc = (argc - 1) & -2;
for( int arg = 0; arg < argc; ) {
const int dimx = atoi(argv[++arg]);
const int dimy = atoi(argv[++arg]);
if( dimx > 0 && dimy > 0 ) partview.addPlane(dimx, dimy);
}
if( partview.count() == 0 ) {
fprintf(stderr, "Usage: %s dimx dimy ...\n"
"reads Cuba's verbose = 3 output from stdin and displays\n"
"the dimx-dimy plane of the tessellation on screen.\n"
"Each pair of dimensions is shown in a separate window.\n\n",
argv[0]);
exit(1);
}
partview.show();
int dim = 0;
char line[128];
while( fgets(line, sizeof line, stdin) ) {
double lower, upper;
fputs(line, stdout);
if( sscanf(line, "%*[^(](%lf) - (%lf)", &lower, &upper) == 2 )
partview.addBound(++dim, lower, upper);
else dim = 0;
app.processEvents();
}
fflush(stdout);
partview.tabupdate();
return app.exec();
}
Index: trunk/cuba/config.h.in
===================================================================
--- trunk/cuba/config.h.in (revision 158)
+++ trunk/cuba/config.h.in (revision 159)
@@ -1,41 +1,134 @@
/* config.h.in. Generated from configure.ac by autoheader. */
+/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP
+ systems. This function is required for `alloca.c' support on those systems.
+ */
+#undef CRAY_STACKSEG_END
+
+/* Define to 1 if using `alloca.c'. */
+#undef C_ALLOCA
+
+/* Define to 1 if you have `alloca', as a function or macro. */
+#undef HAVE_ALLOCA
+
+/* Define to 1 if you have <alloca.h> and it should be used (not on Ultrix).
+ */
+#undef HAVE_ALLOCA_H
+
/* Define to 1 if you have the `erf' function. */
#undef HAVE_ERF
-/* Define to 1 if long double works and has more range or precision than
- double. */
+/* Define to 1 if you have the `fork' function. */
+#undef HAVE_FORK
+
+/* Define to 1 if you have the `getloadavg' function. */
+#undef HAVE_GETLOADAVG
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define to 1 if the type `long double' works and has more range or precision
+ than `double'. */
#undef HAVE_LONG_DOUBLE
+/* Define to 1 if the type `long double' works and has more range or precision
+ than `double'. */
+#undef HAVE_LONG_DOUBLE_WIDER
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
/* Define to 1 if you have the `powl' function. */
#undef HAVE_POWL
+/* Define to 1 if you have the `shmget' function. */
+#undef HAVE_SHMGET
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Define to 1 if you have the `vfork' function. */
+#undef HAVE_VFORK
+
+/* Define to 1 if you have the <vfork.h> header file. */
+#undef HAVE_VFORK_H
+
+/* Define to 1 if `fork' works. */
+#undef HAVE_WORKING_FORK
+
+/* Define to 1 if `vfork' works. */
+#undef HAVE_WORKING_VFORK
+
/* Maximum number of dimensions */
#undef NCOMP
/* Maximum number of components */
#undef NDIM
/* Define to the address where bug reports for this package should be sent. */
#undef PACKAGE_BUGREPORT
/* Define to the full name of this package. */
#undef PACKAGE_NAME
/* Define to the full name and version of this package. */
#undef PACKAGE_STRING
/* Define to the one symbol short name of this package. */
#undef PACKAGE_TARNAME
+/* Define to the home page for this package. */
+#undef PACKAGE_URL
+
/* Define to the version of this package. */
#undef PACKAGE_VERSION
+/* If using the C implementation of alloca, define if you know the
+ direction of stack growth for your system; otherwise it will be
+ automatically deduced at runtime.
+ STACK_DIRECTION > 0 => grows toward higher addresses
+ STACK_DIRECTION < 0 => grows toward lower addresses
+ STACK_DIRECTION = 0 => direction of growth unknown */
+#undef STACK_DIRECTION
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
/* Define to empty if `const' does not conform to ANSI C. */
#undef const
/* Define to `__inline__' or `__inline' if that's what the C compiler
calls it, or to nothing if 'inline' is not supported under any name. */
#ifndef __cplusplus
#undef inline
#endif
+
+/* Define to `int' if <sys/types.h> does not define. */
+#undef pid_t
+
+/* Define to `unsigned int' if <sys/types.h> does not define. */
+#undef size_t
+
+/* Define to `int' if <sys/types.h> does not define. */
+#undef ssize_t
+
+/* Define as `fork' if `vfork' does not work. */
+#undef vfork
Index: trunk/cuba/cuba.h
===================================================================
--- trunk/cuba/cuba.h (revision 158)
+++ trunk/cuba/cuba.h (revision 159)
@@ -1,108 +1,125 @@
/*
cuba.h
Prototypes for the Cuba library
this file is part of Cuba
- last modified 16 Jun 10 th
+ last modified 13 Mar 15 th
*/
+typedef double cubareal;
+
+ /* integrand_t is intentionally a minimalistic integrand type.
+ It includes neither the nvec and core arguments nor the
+ extra arguments passed by Vegas/Suave (weight, iter) and
+ Divonne (phase).
+ In most cases, integrand_t is just what you want, otherwise
+ simply use an explicit typecast to integrand_t in the Cuba
+ invocation. */
+typedef int (*integrand_t)(const int *ndim, const cubareal x[],
+ const int *ncomp, cubareal f[], void *userdata);
+
+typedef void (*peakfinder_t)(const int *ndim, const cubareal b[],
+ int *n, cubareal x[], void *userdata);
+
#ifdef __cplusplus
extern "C" {
#endif
- /* NB: Divonne actually passes a fifth argument, a const int *
- which points to the integration phase. This is used only
- rarely and most users are confused by the warnings the
- compiler emits if the `correct' prototype is used. Thus,
- if you need to access this argument, use an explicit cast
- to integrand_t when invoking Divonne. */
-typedef int (*integrand_t)(const int *ndim, const double x[],
- const int *ncomp, double f[], void *userdata);
-
-typedef void (*peakfinder_t)(const int *ndim, const double b[],
- int *n, double x[]);
-
void Vegas(const int ndim, const int ncomp,
- integrand_t integrand, void *userdata,
- const double epsrel, const double epsabs,
+ integrand_t integrand, void *userdata, const int nvec,
+ const cubareal epsrel, const cubareal epsabs,
const int flags, const int seed,
const int mineval, const int maxeval,
const int nstart, const int nincrease, const int nbatch,
- const int gridno, const char *statefile,
+ const int gridno, const char *statefile, void *spin,
int *neval, int *fail,
- double integral[], double error[], double prob[]);
+ cubareal integral[], cubareal error[], cubareal prob[]);
void llVegas(const int ndim, const int ncomp,
- integrand_t integrand, void *userdata,
- const double epsrel, const double epsabs,
+ integrand_t integrand, void *userdata, const long long int nvec,
+ const cubareal epsrel, const cubareal epsabs,
const int flags, const int seed,
const long long int mineval, const long long int maxeval,
const long long int nstart, const long long int nincrease,
const long long int nbatch,
- const int gridno, const char *statefile,
+ const int gridno, const char *statefile, void *spin,
long long int *neval, int *fail,
- double integral[], double error[], double prob[]);
+ cubareal integral[], cubareal error[], cubareal prob[]);
void Suave(const int ndim, const int ncomp,
- integrand_t integrand, void *userdata,
- const double epsrel, const double epsabs,
+ integrand_t integrand, void *userdata, const int nvec,
+ const cubareal epsrel, const cubareal epsabs,
const int flags, const int seed,
const int mineval, const int maxeval,
- const int nnew, const double flatness,
+ const int nnew, const int nmin,
+ const cubareal flatness, const char *statefile, void *spin,
int *nregions, int *neval, int *fail,
- double integral[], double error[], double prob[]);
+ cubareal integral[], cubareal error[], cubareal prob[]);
void llSuave(const int ndim, const int ncomp,
- integrand_t integrand, void *userdata,
- const double epsrel, const double epsabs,
+ integrand_t integrand, void *userdata, const long long int nvec,
+ const cubareal epsrel, const cubareal epsabs,
const int flags, const int seed,
const long long int mineval, const long long int maxeval,
- const long long int nnew, const double flatness,
+ const long long int nnew, const long long int nmin,
+ const cubareal flatness, const char *statefile, void *spin,
int *nregions, long long int *neval, int *fail,
- double integral[], double error[], double prob[]);
+ cubareal integral[], cubareal error[], cubareal prob[]);
void Divonne(const int ndim, const int ncomp,
- integrand_t integrand, void *userdata,
- const double epsrel, const double epsabs,
+ integrand_t integrand, void *userdata, const int nvec,
+ const cubareal epsrel, const cubareal epsabs,
const int flags, const int seed,
const int mineval, const int maxeval,
const int key1, const int key2, const int key3, const int maxpass,
- const double border, const double maxchisq, const double mindeviation,
- const int ngiven, const int ldxgiven, double xgiven[],
+ const cubareal border, const cubareal maxchisq, const cubareal mindeviation,
+ const int ngiven, const int ldxgiven, cubareal xgiven[],
const int nextra, peakfinder_t peakfinder,
+ const char *statefile, void *spin,
int *nregions, int *neval, int *fail,
- double integral[], double error[], double prob[]);
+ cubareal integral[], cubareal error[], cubareal prob[]);
void llDivonne(const int ndim, const int ncomp,
- integrand_t integrand, void *userdata,
- const double epsrel, const double epsabs,
+ integrand_t integrand, void *userdata, const long long int nvec,
+ const cubareal epsrel, const cubareal epsabs,
const int flags, const int seed,
const long long int mineval, const long long int maxeval,
const int key1, const int key2, const int key3, const int maxpass,
- const double border, const double maxchisq, const double mindeviation,
- const long long int ngiven, const int ldxgiven, double xgiven[],
- const long long int nextra,
- void (*peakfinder)(const int *, const double [], int *, double []),
+ const cubareal border, const cubareal maxchisq, const cubareal mindeviation,
+ const long long int ngiven, const int ldxgiven, cubareal xgiven[],
+ const long long int nextra, peakfinder_t peakfinder,
+ const char *statefile, void *spin,
int *nregions, long long int *neval, int *fail,
- double integral[], double error[], double prob[]);
+ cubareal integral[], cubareal error[], cubareal prob[]);
void Cuhre(const int ndim, const int ncomp,
- integrand_t integrand, void *userdata,
- const double epsrel, const double epsabs,
+ integrand_t integrand, void *userdata, const int nvec,
+ const cubareal epsrel, const cubareal epsabs,
const int flags, const int mineval, const int maxeval,
const int key,
+ const char *statefile, void *spin,
int *nregions, int *neval, int *fail,
- double integral[], double error[], double prob[]);
+ cubareal integral[], cubareal error[], cubareal prob[]);
void llCuhre(const int ndim, const int ncomp,
- integrand_t integrand, void *userdata,
- const double epsrel, const double epsabs,
+ integrand_t integrand, void *userdata, const long long int nvec,
+ const cubareal epsrel, const cubareal epsabs,
const int flags,
const long long int mineval, const long long int maxeval,
const int key,
+ const char *statefile, void *spin,
int *nregions, long long int *neval, int *fail,
- double integral[], double error[], double prob[]);
+ cubareal integral[], cubareal error[], cubareal prob[]);
+
+void cubafork(void *pspin);
+void cubawait(void *pspin);
+
+void cubacores(const int n, const int p);
+void cubaaccel(const int n, const int p);
+
+void cubainit(void (*f)(), void *arg);
+void cubaexit(void (*f)(), void *arg);
#ifdef __cplusplus
}
#endif
Index: trunk/cuba/configure.ac
===================================================================
--- trunk/cuba/configure.ac (revision 158)
+++ trunk/cuba/configure.ac (revision 159)
@@ -1,97 +1,134 @@
# Process this file with autoconf to produce a configure script.
AC_PREREQ(2.59)
-AC_INIT([Cuba], [2.1], [hahn@feynarts.de])
+AC_INIT([Cuba], [4.2], [hahn@feynarts.de])
AC_CONFIG_SRCDIR([cuba.h])
LIBS=-lm
USER_CFLAGS="$CFLAGS"
AC_ARG_VAR(MCFLAGS, [MathLink C compiler flags])
AC_PROG_CC
-AC_PROG_F77
+AC_PROG_FC
AC_PROG_RANLIB
AC_PROG_INSTALL
AS_IF([test "$GCC" = yes],
[AS_CASE([`$CC --version 2>&1 < /dev/null`],
[*LLVM*], [opt=-O3],
[*gcc*4.2* | *gcc*4.4.3*], [opt=-O0],
[opt=-O3])
- CFLAGS=${USER_CFLAGS:-$opt -fomit-frame-pointer -ffast-math}],
+ CFLAGS=${USER_CFLAGS:-$opt -fomit-frame-pointer -ffast-math -Wall}],
[CFLAGS=${USER_CFLAGS:--O}])
AC_C_CONST
AC_C_INLINE
AC_C_LONG_DOUBLE
+AC_TYPE_SIZE_T
+AC_TYPE_SSIZE_T
+AC_TYPE_PID_T
+
AC_CHECK_FUNCS([powl])
AC_CHECK_FUNCS([erf])
+AC_FUNC_FORK
+AC_FUNC_ALLOCA
+
+AC_DEFUN([chk_shmget], [dnl
+AC_REQUIRE([AC_CANONICAL_HOST])
+AS_CASE([$host_os],
+ [*cygwin*], [],
+ [AC_CHECK_FUNCS([shmget])])
+])
+chk_shmget
+AC_CHECK_FUNCS([getloadavg])
MAXDIM=${MAXDIM:-16}
AC_ARG_WITH(maxdim,
[AS_HELP_STRING([--with-maxdim=N],
[the maximum dimension for integration,
if variable-size array are not supported])],
[MAXDIM=$withval])
MAXCOMP=${MAXCOMP:-4}
AC_ARG_WITH(maxcomp,
[AS_HELP_STRING([--with-maxcomp=N],
[the maximum number of components of the integrand,
if variable-size array are not supported])],
[MAXCOMP=$withval])
+REALSIZE=${REALSIZE:-8}
+AC_ARG_WITH(real,
+ [AS_HELP_STRING([--with-real=N],
+ [use N-byte floating-point numbers])],
+ [REALSIZE=$withval])
+AS_CASE([$REALSIZE],
+ [8], [],
+ [10], [SUFFIX=${SUFFIX:-l}],
+ [16], [SUFFIX=${SUFFIX:-q}
+ LIBS="-lquadmath $LIBS"],
+ [REALSIZE=8
+ AC_MSG_WARN([Unavailable real size])])
+AC_SUBST([REALSIZE])
+AC_SUBST([SUFFIX])
+
AC_MSG_CHECKING([for variable-size arrays])
AC_COMPILE_IFELSE([AC_LANG_SOURCE(,[[
void test(int n) {
char s[n];
}
]])],
[AC_MSG_RESULT([yes])],
[AC_MSG_RESULT([no, using MAXDIM=$MAXDIM and MAXCOMP=$MAXCOMP])
AC_DEFINE_UNQUOTED([NDIM], [$MAXDIM], [Maximum number of components])
AC_DEFINE_UNQUOTED([NCOMP], [$MAXCOMP], [Maximum number of dimensions])]
)
AC_MSG_CHECKING([for MathLink])
cat > conftest.tm << _EOF_
:Begin:
:Function: inc
:Pattern: Inc[i_Integer]
:Arguments: {i}
:ArgumentTypes: {Integer}
:ReturnType: Integer
:End:
#include "mathlink.h"
static int inc(const int i) { return i + 1; }
int main(int argc, char **argv) {
return MLMain(argc, argv);
}
_EOF_
FCC="$srcdir/tools/fcc"
rm -f conftest$EXEEXT
-REALCC="$CC" CC="$FCC" CXX="$FCC" PATH="$PATH:$srcdir/tools" \
- mcc $MCFLAGS $CFLAGS -o conftest$EXEEXT conftest.tm > /dev/null 2>&1
+MCSTDCPP=
+for MCSTDCPP in "" -stdlib=libstdc++ ; do
+ REALCC="$CC" CC="$FCC" CXX="$FCC $MCSTDCPP" PATH="$PATH:$srcdir/tools" \
+ mcc $MCFLAGS $CFLAGS -o conftest$EXEEXT conftest.tm > /dev/null 2>&1
+ AS_IF([test -x conftest$EXEEXT], [break])
+done
AS_IF([test -x conftest$EXEEXT],
[AC_MSG_RESULT([yes])
MATH_DEFAULT=math],
[AC_MSG_RESULT([no])])
+AC_SUBST([MCSTDCPP])
AC_SUBST([MATH_DEFAULT])
AC_CHECK_PROGS([HAVE_QMAKE], [qmake])
-test -n "$HAVE_QMAKE" && TOOLS_DEFAULT=tools
+AS_IF([test -n "$HAVE_QMAKE"],
+ [AS_CASE([`qmake -v`],
+ [*Qt?version?4*], [TOOLS_DEFAULT=tools])])
AC_SUBST([TOOLS_DEFAULT])
-test -n "$F77" && DEMO_FORTRAN_DEFAULT=demo-fortran
+test -n "$FC" && DEMO_FORTRAN_DEFAULT=demo-fortran
AC_SUBST([DEMO_FORTRAN_DEFAULT])
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_FILES([makefile])
AC_OUTPUT
Index: trunk/cuba/cuba.tex
===================================================================
--- trunk/cuba/cuba.tex (revision 0)
+++ trunk/cuba/cuba.tex (revision 159)
@@ -0,0 +1,2433 @@
+\documentclass[12pt]{article}
+\usepackage{a4wide,amsmath,amssymb,alltt}
+\usepackage{colordvi}
+
+\parskip=2pt
+\raggedbottom
+\sloppy
+
+\newcommand\cuba{\textsc{Cuba}}
+\newcommand\ie{i.e.\ }
+\newcommand\eg{e.g.\ }
+\newcommand\rd{\mathrm{d}}
+\newcommand\order{\mathcal{O}}
+\newcommand\epsabs{\varepsilon_{\text{abs}}}
+\newcommand\epsrel{\varepsilon_{\text{rel}}}
+\newcommand\nnew{n_s^{\text{new}}}
+\newcommand\nmin{n_s^{\text{min}}}
+\newcommand\nmax{n_s^{\text{max}}}
+\newcommand\nneed{n_{\text{need}}}
+\newcommand\tot{_{\text{tot}}}
+\newcommand\ctot{_{c,\text{tot}}}
+\newcommand\cvec[1]{\vec #1}
+\newcommand\dvec[1]{\mathbf{#1}}
+\newcommand\norm[1]{\|#1\|_1}
+\newcommand\lbrac{\symbol{123}}
+\newcommand\rbrac{\symbol{125}}
+\newcommand\uscore{\symbol{95}}
+\newcommand\accel{_{\mathrm{accel}}}
+\newcommand\cores{_{\mathrm{cores}}}
+\newcommand\Code[1]{\ensuremath{\texttt{#1}}}
+\newcommand\Var[1]{\ensuremath{\mathit{#1}}}
+\newcommand\VarIn[1]{\item\Code{#1} \textit{$\langle$in\/$\rangle$},}
+\newcommand\VarOut[1]{\item\Code{#1} \textit{$\langle$out\,$\rangle$},}
+\newcommand\Option[2]{\item\Code{#1 -> #2},}
+\newcommand\ul[1]{\underline{\vphantom{g}#1}}
+
+\renewcommand{\thefootnote}{\fnsymbol{footnote}}
+
+\makeatletter
+\def\reportno#1{\gdef\@reportno{#1}}
+\def\@maketitle{%
+ \hfill{\small\begin{tabular}[t]{r}%
+ \@reportno
+ \end{tabular}\par}%
+ \vskip 2em%
+ \begin{center}%
+ \let \footnote \thanks
+ {\large \@title \par}%
+ \vskip 1.5em%
+ {%\large
+ \lineskip .5em%
+ \begin{tabular}[t]{c}%
+ \@author
+ \end{tabular}\par}%
+ \vskip 1em%
+ {%\large
+ \@date}%
+ \end{center}%
+ \par
+ \vskip 1.5em}
+\makeatother
+
+
+\begin{document}
+
+\reportno{MPP--2004--40\\hep--ph/0404043}
+
+\title{\cuba\ -- a library for multidimensional numerical integration}
+
+\author{T. Hahn \\
+Max-Planck-Institut f\"ur Physik \\
+F\"ohringer Ring 6, D--80805 Munich, Germany}
+
+\date{Mar 27, 2015}
+
+\maketitle
+
+\begin{abstract}
+The \cuba\ library provides new implementations of four general-purpose
+multidimensional integration algorithms: Vegas, Suave, Divonne, and
+Cuhre. Suave is a new algorithm, Divonne is a known algorithm to which
+important details have been added, and Vegas and Cuhre are new
+implementations of existing algorithms with only few improvements over
+the original versions. All four algorithms can integrate vector
+integrands and have very similar Fortran, C/C++, and Mathematica
+interfaces.
+\end{abstract}
+
+%========================================================================
+
+\section{Introduction}
+
+Many problems in physics (and elsewhere) involve computing an integral,
+and often enough this has to be done numerically, as the analytical
+result is known only in a limited number of cases. In one dimension,
+the situation is quite satisfactory: standard packages, such as
+\textsc{Quadpack} \cite{quadpack}, reliably integrate a broad class of
+functions in modest CPU time. The same is unfortunately not true for
+multidimensional integrals.
+
+This paper presents the \cuba\ library with new implementations of four
+algorithms for multidimensional numerical integration: Vegas, Suave,
+Divonne, and Cuhre. They have a C/C++, Fortran, and Mathematica
+interface each and are invoked in a very similar way, thus making them
+easily interchangeable, \eg for comparison purposes. All four can
+integrate vector integrands. Cuhre is a deterministic algorithm, the
+others use Monte Carlo methods.
+
+Vegas is the simplest of the four. It uses importance sampling for
+variance reduction, but is only in some cases competitive in terms of
+the number of samples needed to reach a prescribed accuracy.
+Nevertheless, it has a few improvements over the original algorithm
+\cite{Vegas1,Vegas2} and comes in handy for cross-checking the results
+of other methods.
+
+Suave is a new algorithm which combines the advantages of two popular
+methods: importance sampling as done by Vegas and subregion sampling in
+a manner similar to Miser \cite{Miser}. By dividing into subregions,
+Suave manages to a certain extent to get around Vegas' difficulty to
+adapt its weight function to structures not aligned with the coordinate
+axes.
+
+Divonne is a further development of the CERNLIB routine D151
+\cite{Divonne}. Divonne works by stratified sampling, where the
+partitioning of the integration region is aided by methods from
+numerical optimization. A number of improvements have been added to
+this algorithm, the most significant being the possibility to supply
+knowledge about the integrand. Narrow peaks in particular are difficult
+to find without sampling very many points, especially in high
+dimensions. Often the exact or approximate location of such peaks is
+known from analytic considerations, however, and with such hints the
+desired accuracy can be reached with far fewer points.
+
+Cuhre\footnote{%
+ The D from the original name was dropped since the \cuba\
+ library uses double precision throughout.}
+employs a cubature rule for subregion estimation in a globally adaptive
+subdivision scheme \cite{dcuhre}. It is hence a deterministic, not a
+Monte Carlo method. In each iteration, the subregion with the largest
+error is halved along the axis where the integrand has the largest
+fourth difference. Cuhre is quite powerful in moderate dimensions, and
+is usually the only viable method to obtain high precision, say relative
+accuracies much below $10^{-3}$.
+
+The new algorithms were coded from scratch in C, which is a compromise
+of sorts between C++ and Fortran 77, combining ease of linking to
+Fortran code with the availability of reasonable memory management. The
+declarations have been chosen such that the routines can be called from
+Fortran directly. The Mathematica versions are based on the same C code
+and use the MathLink API to communicate with Mathematica.
+
+%========================================================================
+
+\section{Vegas}
+
+Vegas is a Monte Carlo algorithm that uses importance sampling as a
+variance-reduction technique. Vegas iteratively builds up a
+piecewise constant weight function, represented on a rectangular grid.
+Each iteration consists of a sampling step followed by a refinement of
+the grid. The exact details of the algorithm can be found in
+\cite{Vegas1,Vegas2} and shall not be reproduced here.
+
+Changes with respect to the original version are:
+\begin{itemize}
+\item
+Sobol quasi-random numbers \cite{Sobol} rather than pseudo-random
+numbers are used by default. Empirically, this seems to accelerate
+convergence quite a bit, most noticeably in the early stages of the
+integration.
+
+From theoretical considerations it is of course known (see \eg
+\cite{Niederreiter}) that quasi-random sequences yield a convergence
+rate of $\order(\log^{n_d} n_s/n_s)$, where $n_d$ is the number of
+dimensions and $n_s$ the number of samples, which is much better than
+the usual $\order(1/\sqrt{n_s})$ for ordinary Monte Carlo. But these
+convergence rates are meaningful only for large $n_s$ and so it came as
+a pleasant surprise that the gains are considerable already at the
+beginning of the sampling process. It shows that quasi-Monte Carlo
+methods blend well with variance-reduction techniques such as importance
+sampling.
+
+Similarly, it was not clear from the outset whether the statistical
+standard error would furnish a suitable error estimate since
+quasi-random numbers are decidedly non-random in a number of respects.
+Yet also here empirical evidence suggests that the standard error works
+just as well as for pseudo-random numbers.
+
+\item
+The present implementation allows the number of samples to be increased
+in each iteration. With this one can mimic the strategy of calling
+Vegas with a small number of samples first to `get the grid right' and
+then using an alternate entry point to perform the `full job' on the
+same grid with a larger number of samples.
+
+\item
+The option to add simple stratified sampling on top of the importance
+sampling, as proposed in the appendix of \cite{Vegas1}, has not been
+implemented in the present version. Tests with the Vegas version from
+\cite{NumRecipes}, which contains this feature, showed that convergence
+was accelerated only when the original pseudo-random numbers were used
+and that with quasi-random numbers convergence was in fact even slower
+in some cases.
+\end{itemize}
+Vegas' major weakness is that it uses a separable (product) weight
+function. As a consequence, Vegas can offer significant improvements
+only as far as the integrand's characteristic regions are aligned with
+the coordinate axes.
+
+%========================================================================
+
+\section{Suave}
+
+Suave (short for \textsc{su}bregion-\textsc{a}daptive \textsc{ve}gas)
+uses Vegas-like importance sampling combined with a globally adaptive
+subdivision strategy: Until the requested accuracy is reached, the
+region with the largest error at the time is bisected in the dimension
+in which the fluctuations of the integrand are reduced most. The number
+of new samples in each half is prorated for the fluctuation in that
+half.
+
+A similar method, known as recursive stratified sampling, is implemented
+in Miser \cite{Miser}. Miser always samples a fixed number of points,
+however, which is somewhat undesirable since it does not stop once the
+prescribed accuracy is reached.
+
+Suave first samples the integration region in a Vegas-like step, \ie
+using importance sampling with a separable weight function. It then
+slices the integration region in two, as Miser would do. Suave does not
+immediately recurse on those subregions, however, but maintains a list
+of all subregions and selects the region with the largest absolute error
+for the next cycle of sampling and subdivision. That is, Suave uses
+global error estimation and terminates when the requested relative or
+absolute accuracy is attained.
+
+The information on the weight function collected in one Vegas step is
+not lost. Rather, the grid from which the weight function is computed
+is stretched and re-used on the subregions. A region which is the
+result of $m - 1$ subdivisions thus has had $m$ Vegas iterations
+performed on it.
+
+The improvements over Vegas and Miser come at a price, which is the
+amount of memory required to hold all the samples. Memory consumption
+is not really severe on modern hardware, however. The component that
+scales worst is the one proportional to the number of samples, which is
+$$
+8 (n_d + n_c + 1) n_s\text{ bytes}\,,
+$$
+where $n_d$ is the number of dimensions of the integral, $n_c$ the
+number of components of the integrand, and $n_s$ the number of samples.
+For a million samples on a scalar integrand of 10 variables, this works
+out to 96 megabytes -- not all that enormous these days.
+
+
+\subsection{Description of the algorithm}
+
+As Suave is a new algorithm, the following description will be fairly
+detailed. For greater notational clarity, $n_c$-dimensional vectors are
+denoted with a vector arrow ($\cvec f$\,) and $n_d$-dimensional vectors
+with boldface letters ($\dvec x$) in the following, where $n_d$ is the
+dimension of the integral and $n_c$ the number of components of the
+integrand.
+
+The essential inputs are $\epsrel$ and $\epsabs$, the relative and
+absolute accuracies, $\nnew$, the number of samples added in each
+iteration, $\nmax$, the maximum number of samples allowed, and $p$, a
+flatness parameter described below.
+
+Suave has a main loop which calls a Vegas-like sampling step. The main
+loop is responsible for subdividing the subregions and maintaining the
+totals. The sampling step does the actual sampling on the subregions
+and computes the region results.
+
+
+\subsubsection{Main loop}
+\label{sect:suavemain}
+
+\begin{enumerate}
+\item
+Initialize the random-number generator and allocate a data structure for
+the entire integration region. Initialize its Vegas grid with
+equidistant bins.
+
+\item
+Sample the entire integration region with $\nnew$ points. This gives an
+initial estimate of the integral $\cvec I\tot$, the variance
+$\cvec\sigma\tot^{\,2}$, and $\cvec\chi\tot^{\,2}$.
+
+\item
+Find the component $c$ for which $r_c = \sigma\ctot/
+\max(\epsabs, \epsrel |I\ctot|)$ is maximal.
+
+If none of the $r_c$'s exceeds unity, indicate success and return.
+
+\item
+If the number of samples spent so far equals or exceeds $\nmax$,
+indicate failure and return.
+
+\item
+Find the region $r$ with the largest $\sigma_c^2$.
+
+\item
+Find the dimension $d$ which minimizes $F_c(r_L^d) + F_c(r_R^d)$, where
+$r_{L,R}^d$ are the left and right halves of $r$ with respect to $d$.
+$F_c(r_{L,R}^d)$ is the fluctuation of the samples that fall into
+$r_{L,R}^d$ and is computed as
+\begin{equation}
+\label{eq:fluct}
+F_c(r_{L,R}^d)
+= \biggl[\left\|
+ 1 + \tilde F_c(\dvec x_i\in r_{L,R}^d)
+ \right\|_p\biggr]^{2/3}
+= \biggl[\sum\left|
+ 1 + \tilde F_c(\dvec x_i\in r_{L,R}^d)
+ \right|^p\,\biggr]^{2/(3p)},
+\end{equation}
+where all samples $\dvec x_i$ that fall into the respective half are
+used in the norm/sum and the single-sample fluctuation $\tilde F_c$ is
+defined as
+$$
+\tilde F_c(\dvec x) =
+ w(\dvec x) \, \left|\frac{f_c(\dvec x) - I_c(r)}{I_c(r)}\right|
+ \, \frac{|f_c(\dvec x) - I_c(r)|}{\sigma_c(r)}\,.
+$$
+This empirical recipe combines the relative deviation from the region
+mean, $(f - I)/I$, with the $\chi$ value, $|f - I|/\sigma$, weighted by
+the Vegas weight $w$ corresponding to sample $\dvec x$. Note that the
+$I_c$ and $\sigma_c$ values of the entire region $r$ are used.
+
+Samples strongly contribute to $F$ the more they lie away from the
+predicted mean \emph{and} the more they lie out of the predicted error
+band. Tests have shown that large values of $p$ are beneficial for
+`flat' integrands, whereas small values are preferred if the integrand
+is `volatile' and has high peaks. $p$ has thus been dubbed a flatness
+parameter. The effect comes from the fact that with increasing $p$, $F$
+becomes more and more dominated by `outliers,' \ie points with a large
+$\tilde F$.
+
+The power 2/3 in Eq.~(\ref{eq:fluct}) is also used in Miser, where it is
+motivated as the exponent that gives the best variance reduction
+(\cite{NumRecipes}, p.~315).
+
+\item
+Refine the grid associated with $r$, \ie incorporate the information
+gathered on the integrand in the most recent sample over $r$ into the
+weight function. This is done precisely as in Vegas (see
+\cite{Vegas1}), with the extension that if the integrand has more than
+one component, the marginal densities are computed not from $f^2$ but
+from the weighted sum\footnote{%
+ It is fairly obvious that scale-invariant quantities must be
+ used in the sum, otherwise the component with the largest
+ absolute scale would dominate. It is less clear whether $\eta_0
+ = (\int f_c\,\rd\dvec x)^2 = I\ctot^2$, $\eta_1 = (\int
+ |f_c|\,\rd\dvec x)^2$, or $\eta_2 = \int f_c^2\,\rd\dvec x$ (or
+ any other) make the best weights. Empirically, $\eta_0$ turns
+ out to be both slightly superior in convergence and easier to
+ compute than $\eta_1$ and $\eta_2$ and has thus been chosen in
+ Suave.
+
+ A possible explanation for this is that in cases where there
+ are large compensations within the integral, \ie when $\int
+ f_c\,\rd\dvec x\ll\int |f_c|\,\rd\dvec x$, it is particularly
+ necessary for the overall accuracy that component $c$ be sampled
+ accurately, and thus be given more weight in $\overline{f^2}$,
+ and this is better accomplished by dividing $f_c^2$ by the
+ ``small'' number $\eta_0$ than by the ``large'' number $\eta_1$
+ or $\eta_2$.}
+$$
+\overline{f^2} = \sum_{c = 1}^{n_c} \frac{f_c^2}{I\ctot^2}\,.
+$$
+
+\item
+Bisect $r$ in dimension $d$:
+
+Allocate a new region, $r_L$, and copy to $r_L$ those of $r$'s samples
+falling into the left half. Compute the Vegas grid for $r_L$ by
+appropriately ``stretching'' $r$'s grid, \ie by interpolating all grid
+points of $r$ with values less than 1/2.
+
+Set up $r_R$ for the right half analogously.
+
+\item
+Sample $r_L$ with $n_L = \max\Bigl(\frac{F_c(r_L)}{F_c(r_L) + F_c(r_R)}
+\nnew, \nmin\Bigr)$ and $r_R$ with $n_R = \max(\nnew - n_L, \nmin)$
+points, where $\nmin = 10$.
+
+\item
+To safeguard against underestimated errors, supplement the variances
+by the difference of the integral values in the following way:
+$$
+\sigma_{c,\text{new}}^2(r_{R,L}) = \sigma_c^2(r_{R,L})
+ \left(1 + \frac{\Delta_c}
+ {\sqrt{\sigma_c^2(r_L) + \sigma_c^2(r_R)}}\right)^2 +
+ \Delta_c^2
+$$
+for each component $c$, where $\cvec\Delta = \frac 14 |\cvec I(r_L) +
+\cvec I(r_R) - \cvec I(r)|$.
+
+This acts as a penalty for regions whose integral value changes
+significantly by the subdivision and effectively moves them up in the
+order of regions to be subdivided next.
+
+\item
+Update the totals: Subtract $r$'s integral, variance, and $\chi^2$-value
+from the totals and add those of $r_L$ and $r_R$.
+
+\item
+Discard $r$, put $r_L$ and $r_R$ in the list of regions.
+
+\item
+Go to Step 3.
+\end{enumerate}
+
+
+\subsubsection{Sampling step}
+
+The function which does the actual sampling is a modified Vegas
+iteration. It is invoked with two arguments: $r$, the region to be
+sampled and $n_m$, the number of new samples.
+
+\begin{enumerate}
+\item
+Sample a set of $n_m$ new points using the weight function given by the
+grid associated with $r$. For a region which is the result of $m - 1$
+subdivisions, the list of samples now consists of $m$ sets of samples.
+
+\item
+For each set of samples, compute the mean $\cvec I_i$ and variance
+$\cvec\sigma_i^{\,2}$.
+
+\item
+Compute the results for the region as
+$$
+I_c = \frac{\sum_{i = 1}^m w_{i,c} I_{i,c}}{\sum_{i = 1}^m w_{i,c}},
+\quad
+\sigma_c^2 = \frac 1{\sum_{i = 1}^m w_{i,c}},
+\quad
+\chi_c^2 = \frac 1{\sigma_c^2}\left[
+ \frac{\sum_{i = 1}^m w_{i,c} I_{i,c}^2}{\sum_{i = 1}^m w_{i,c}} -
+ I_c^2\right],
+$$
+where the inverse of the set variances are used as weights, $w_{i,c} =
+1/\sigma_{i,c}^2$. This is simply Gaussian error propagation.
+
+For greater numerical stability, $\chi_c^2$ is actually computed as
+$$
+\chi_c^2
+= \sum_{i = 1}^m w_{i,c} I_{i,c}^2 -
+ I_c \sum_{i = 1}^m w_{i,c} I_{i,c}
+= \sum_{i = 2}^m w_{i,c} I_{i,c} (I_{i,c} - I_{1,c}) -
+ I_c \sum_{i = 2}^m w_{i,c} (I_{i,c} - I_{1,c})\,.
+$$
+\end{enumerate}
+
+%========================================================================
+
+\section{Divonne}
+
+Divonne uses stratified sampling for variance reduction, that is, it
+partitions the integration region such that all subregions have an
+approximately equal value of a quantity called the spread $\cvec s$,
+defined as
+\begin{equation}
+\cvec s(r) = \frac 12 V(r)
+ \Bigl(\max_{\dvec x\in r} \cvec f(\dvec x) -
+ \min_{\dvec x\in r} \cvec f(\dvec x)\Bigr)\,,
+\end{equation}
+where $V(r)$ is the volume of region $r$. What sets Divonne apart from
+Suave is that the minimum and maximum of the integrand are sought using
+methods from numerical optimization. Particularly in high dimensions,
+the chance that one of the previously sampled points lies in or even
+close to the true extremum is fairly small.
+
+On the other hand, the numerical minimization is beset with the usual
+pitfalls, \ie starting from the lowest of a (relatively small) number of
+sampled points, Divonne will move directly into the local minimum
+closest to the starting point, which may or may not be close to the
+absolute minimum.
+
+Divonne is a lot more complex than Suave and Vegas but also
+significantly faster for many integrands. For details on the methods
+used in Divonne please consult the original references \cite{Divonne}.
+New features with respect to the CERNLIB version (Divonne 4) are:
+\begin{itemize}
+\item
+Integration is possible in dimensions 2 through 33 (not 9 as before).
+Going to higher dimensions is a matter of extending internal tables
+only.
+
+\item
+The possibility has been added to specify the location of possible
+peaks, if such are known from analytical considerations. The idea here
+is to help the integrator find the extrema of the integrand, and narrow
+peaks in particular are a challenge for the algorithm. Even if only the
+approximate location is known, this feature of hinting the integrator
+can easily cut an order of magnitude out of the number of samples needed
+to reach the required accuracy for complicated integrands. The points
+can be specified either statically, by passing a list of points at the
+invocation, or dynamically, through a subroutine called for each
+subregion.
+
+\item
+Often the integrand function cannot sample points lying on or very
+close to the integration border. This can be a problem with Divonne
+which actively searches for the extrema of the integrand and homes in on
+peaks regardless of whether they lie on the border. The user may
+however specify a border region in which integrand values are not
+obtained directly, but extrapolated from two points inside the `safe'
+interior.
+
+\item
+The present algorithm works in three phases, not two as before. Phase 1
+performs the partitioning as outlined above. From the preliminary
+results obtained in this phase, Divonne estimates the number of samples
+necessary to reach the desired accuracy in phase 2, the final
+integration phase. Once the phase-2 sample for a particular subregion
+is in, a $\chi^2$ test is used to assess whether the two sample averages
+are consistent with each other within their error bounds. Subregions
+which fail this test move on to phase 3, the refinement phase, where
+they can be subdivided again or sampled a third time with more points,
+depending on the parameters set by the user.
+
+\item
+For all three phases the user has a selection of methods to obtain the
+integral estimate: a Korobov \cite{Korobov} or Sobol \cite{Sobol}
+quasi-random sample of given size, a Mersenne Twister
+\cite{MersenneTwister} or Ranlux \cite{Ranlux} pseudo-random sample of
+given size, and the cubature rules of Genz and Malik \cite{GenzMalik}
+of degree 7, 9, 11, and 13 that are also used in Cuhre. The latter are
+embedded rules and hence provide an intrinsic error estimate (that is,
+an error estimate not based on the spread). When this independent
+error estimate is available, it supersedes the spread-based error when
+computing the total error. Also, regions whose spread-based error
+exceeds the intrinsic error are selected for refinement, too.
+
+In spite of these novel options, the cubature rules of the original
+Divonne algorithm were not implemented.
+\end{itemize}
+
+Due to its complexity, the new Divonne implementation was painstakingly
+tested against the CERNLIB routine to make sure it produces the same
+results before adding the new features.
+
+%========================================================================
+
+\section{Cuhre}
+
+Cuhre is a deterministic algorithm which uses one of several cubature
+rules of polynomial degree in a globally adaptive subdivision scheme.
+The subdivision algorithm is similar to Suave's (see Sect.\
+\ref{sect:suavemain}) and works as follows:
+
+While the total estimated error exceeds the requested bounds:
+
+1) choose the region with the largest estimated error,
+
+2) bisect this region along the axis with the largest fourth
+ difference,
+
+3) apply the cubature rule to the two subregions,
+
+4) merge the subregions into the list of regions and update the
+ totals.
+
+Details on the algorithm and on the cubature rules employed in Cuhre can
+be found in the original references \cite{dcuhre}. The present
+implementation offers only superficial improvements, such as an
+interface consistent with the other \cuba\ routines and a slightly
+simpler invocation, \eg one does not have to allocate a workspace.
+
+In moderate dimensions Cuhre is very competitive, particularly if the
+integrand is well approximated by polynomials. As the dimension
+increases, the number of points sampled by the cubature rules rises
+considerably, however, and by the same token the usefulness declines.
+For the lower dimensions, the actual number of points that are spent per
+invocation of the basic integration rule are listed in the following
+table.
+\begin{center}
+\begin{tabular}{l|ccccccccc}
+number of dimensions &
+ 4 & 5 & 6 & 7 & 8 & 9 & 10 & 11 & 12 \\ \hline
+points in degree-7 rule &
+ 65 & 103 & 161 & 255 & 417 & 711 & 1265 & 2335 & 4433 \\
+points in degree-9 rule &
+ 153 & 273 & 453 & 717 & 1105 & 1689 & 2605 & 4117 & 6745
+\end{tabular}
+\end{center}
+
+%========================================================================
+
+\section{Download and Compilation}
+
+The \cuba\ package can be downloaded from
+\Code{http://feynarts.de/cuba}. The gzipped tar file unpacks into
+a directory \Code{Cuba-$m$.$n$}. Change into this directory and type
+\begin{verbatim}
+ ./configure
+ make
+\end{verbatim}
+This should create
+\begin{tabbing}
+\verb= =\Code{libcuba.a} \hspace{10em}
+\= --- the \cuba\ library, \\
+\verb= =\Code{Vegas}, \Code{Suave}, \Code{Divonne}, \Code{Cuhre}
+\> --- the MathLink executables, \\
+\verb= =\Code{demo-c}, \Code{demo-fortran}
+\> --- the demonstration programs, \\
+\verb= =\Code{partview}
+\> --- the partition viewer.
+\end{tabbing}
+\cuba\ can also be built in parts: ``make lib'' builds only the \cuba\
+library, ``make math'' builds only the MathLink executables, ``make
+demos'' builds only the demo programs, and ``make tools'' builds only
+the partition viewer.
+
+The MathLink executables require mcc, the MathLink compiler, and the
+partition viewer needs Qt. Compilation of the corresponding parts will
+be switched off by default if configure does not find these tools.
+
+Besides the usual autoconf options, configure understands
+\begin{itemize}
+\item
+\Code{--with-maxdim=\Var{n_d^{\text{max}}}} sets an upper limit on the
+number of dimensions.
+
+\item
+\Code{--with-maxcomp=\Var{n_c^{\text{max}}}} sets an upper limit on the
+number of components.
+
+\item
+\Code{--with-real=10} uses \Code{long double} instead of \Code{double}
+for all real variables. On x86 hardware this typically corresponds to
+80-bit extended precision (\Code{REAL*10}). Resulting files are
+suffixed with `$\ell$' (\Code{libcubal.a}, \Code{cubal.h},
+\Code{Vegasl}, etc.).
+
+\item
+\Code{--with-real=16} uses \Code{\uscore\uscore float128} (128-bit
+quadruple precision, \Code{REAL*16}) for all real variables. This
+requires gcc version 4.6 or higher. No MathLink executables are built
+in this case as no MathLink functions are available for this type.
+Resulting files are suffixed with `q' (\Code{libcubaq.a},
+\Code{cubaq.h}).
+\end{itemize}
+
+Linking Fortran or C/C++ code that uses one of the algorithms is
+straightforward, just add \Code{-lcuba} (for the \cuba\ library) and
+\Code{-lm} (for the math library) to the compiler command line, as in
+\begin{verbatim}
+ f77 -o myexecutable mysource.f -lcuba -lm
+ cc -o myexecutable mysource.c -lcuba -lm
+\end{verbatim}
+The \Code{demo} subdirectory contains the source for the demonstration
+programs in Fortran 77, C, and Mathematica, as well as the test suite
+used in Sect.~\ref{sect:tests}, which is also written in Mathematica.
+
+%========================================================================
+
+\section{User Manual}
+
+\subsection{Usage in Fortran}
+
+Although written in C, the declarations have been chosen such that the
+routines are directly accessible from Fortran, \ie no wrapper code is
+needed. In fact, Vegas, Suave, Divonne, and Cuhre can be called as if
+they were Fortran subroutines respectively declared as
+\begin{verbatim}
+ subroutine vegas(ndim, ncomp, integrand, userdata, nvec,
+ & epsrel, epsabs, flags, seed, mineval, maxeval,
+ & nstart, nincrease, nbatch, gridno, statefile, spin,
+ & neval, fail, integral, error, prob)
+\end{verbatim}
+\begin{verbatim}
+ subroutine suave(ndim, ncomp, integrand, userdata, nvec,
+ & epsrel, epsabs, flags, seed, mineval, maxeval,
+ & nnew, nmin, flatness, statefile, spin,
+ & nregions, neval, fail, integral, error, prob)
+\end{verbatim}
+\begin{verbatim}
+ subroutine divonne(ndim, ncomp, integrand, userdata, nvec,
+ & epsrel, epsabs, flags, seed, mineval, maxeval,
+ & key1, key2, key3, maxpass,
+ & border, maxchisq, mindeviation,
+ & ngiven, ldxgiven, xgiven, nextra, peakfinder,
+ & statefile, spin,
+ & nregions, neval, fail, integral, error, prob)
+\end{verbatim}
+\begin{verbatim}
+ subroutine cuhre(ndim, ncomp, integrand, userdata, nvec,
+ & epsrel, epsabs, flags, mineval, maxeval,
+ & key, statefile, spin,
+ & nregions, neval, fail, integral, error, prob)
+\end{verbatim}
+
+
+\subsubsection{Common Arguments}
+\label{sect:commonargs}
+
+\begin{itemize}
+\VarIn{integer ndim}
+the number of dimensions of the integral.
+
+\VarIn{integer ncomp}
+the number of components of the integrand.
+
+\VarIn{integer integrand}
+the integrand. The external function which computes the
+integrand is expected to be declared as
+\begin{verbatim}
+ integer function integrand(ndim, x, ncomp, f, userdata, nvec, core)
+ integer ndim, ncomp, nvec, core
+ double precision x(ndim,nvec), f(ncomp,nvec)
+\end{verbatim}
+The integrand receives \Code{nvec} samples in \Code{x} and is supposed
+to fill the array \Code{f} with the corresponding integrand values.
+Note that \Code{nvec} indicates the actual number of points passed to
+the integrand here and may be smaller than the \Code{nvec} given to the
+integrator.
+
+The return value is irrelevant unless it is $-999$, in the case of which
+the integration will be aborted immediately. This might happen if a
+parameterized integrand turns out not to yield sensible values for a
+particular parameter set (passed \eg through \Code{userdata}).
+
+The worker process the integrand is running on is indicated in
+\Code{core}, where $\Code{core} < 0$ indicates an Accelerator,
+$\Code{core}\geqslant 0$ a regular (CPU) core, and \Code{32768} the
+master itself (more details in Sect.~\ref{sect:cores}).
+
+The latter three arguments, \Code{userdata}, \Code{nvec}, and
+\Code{core} are optional and may be omitted if unused, \ie the integrand
+is minimally declared (for $\Code{nvec} = 1$) as
+\begin{verbatim}
+ integer function integrand(ndim, x, ncomp, f)
+ integer ndim, ncomp
+ double precision x(ndim), f(ncomp)
+\end{verbatim}
+
+\VarIn{(arbitrary type) userdata}
+user data passed to the integrand. Unlike its counterpart in the
+integrand definition, this argument must be present though it may
+contain a dummy value, \eg \Code{0}.
+
+\VarIn{integer nvec}
+The maximum number of points to be given to the integrand
+routine in each invocation. Usually this is 1 but if the integrand
+can profit from \eg SIMD vectorization, a larger value can be chosen.
+
+\VarIn{double precision epsrel, epsabs}
+the requested relative and absolute accuracies.
+The integrator tries to find an estimate $\hat I$ for the integral $I$
+which for every component $c$ fulfills $|\hat I_c - I_c|\leqslant
+\max(\epsabs, \epsrel |I_c|)$.
+
+\VarIn{integer flags}
+flags governing the integration:
+\begin{itemize}
+\item Bits 0 and 1 are taken as the verbosity level, \ie 0 to 3,
+unless the \Code{CUBAVERBOSE} environment variable contains an even
+higher value (used for debugging).
+
+Level 0 does not print any output, level 1 prints `reasonable'
+information on the progress of the integration, level 2 also echoes the
+input parameters, and level 3 further prints the subregion results (if
+applicable).
+
+\item Bit 2 = 0,
+all sets of samples collected on a subregion during the various
+iterations or phases contribute to the final result.
+
+Bit 2 = 1,
+only the last (largest) set of samples is used in the final result.
+
+\item (Vegas and Suave only)
+
+Bit 3 = 0,
+apply additional smoothing to the importance function, this moderately
+improves convergence for many integrands,
+
+Bit 3 = 1,
+use the importance function without smoothing, this should be chosen if
+the integrand has sharp edges.
+
+\item Bit 4 = 0,
+delete the state file (if one is chosen) when the integration terminates
+successfully,
+
+Bit 4 = 1,
+retain the state file.
+
+\item
+(Vegas only)
+
+Bit 5 = 0,
+take the integrator's state from the state file, if one is present.
+
+Bit 5 = 1,
+reset the integrator's state even if a state file is present, \ie
+keep only the grid. Together with Bit 4 this allows a grid adapted by
+one integration to be used for another integrand.
+
+\item Bits 8--31 =: \Code{level} determines the random-number generator
+(see below).
+\end{itemize}
+
+To select \eg last samples only and verbosity level 2, pass 6 = 4 + 2
+for the flags.
+
+\VarIn{integer seed}
+the seed for the pseudo-random-number generator.
+
+The random-number generator is chosen as follows:
+\begin{center}
+\begin{tabular}{l|l|l}
+\Code{seed} & \Code{level} & Generator \\
+& {\small (bits 8--31 of \Code{flags})} & \\ \hline
+zero & N/A & Sobol (quasi-random), \\
+non-zero & zero & Mersenne Twister (pseudo-random), \\
+non-zero & non-zero & Ranlux (pseudo-random).
+\end{tabular}
+\end{center}
+
+Ranlux implements Marsaglia and Zaman's 24-bit RCARRY algorithm with
+generation period $p$, \ie for every 24 generated numbers used, another
+$p - 24$ are skipped. The luxury level is encoded in \Code{level} as
+follows:
+\begin{itemize}
+\item Level 1 ($p = 48$):
+ very long period, passes the gap test but fails spectral test.
+\item Level 2 ($p = 97$):
+ passes all known tests, but theoretically still defective.
+\item Level 3 ($p = 223$):
+ any theoretically possible correlations have very small
+ chance of being observed.
+\item Level 4 ($p = 389$):
+ highest possible luxury, all 24 bits chaotic.
+\end{itemize}
+Levels 5--23 default to 3, values above 24 directly specify the period
+$p$. Note that Ranlux's original level 0, (mis)used for selecting
+Mersenne Twister in \cuba, is equivalent to \Code{level = 24}.
+
+\VarIn{integer mineval}
+the minimum number of integrand evaluations required.
+
+\VarIn{integer maxeval}
+the (approximate) maximum number of integrand evaluations allowed.
+
+\VarIn{character*(*) statefile}
+a filename for storing the internal state. To not store the internal
+state, put \Code{""} (empty string) or \Code{\%VAL(0)} (null pointer).
+
+\cuba\ can store its entire internal state (\ie all the information to
+resume an interrupted integration) in an external file. The state file
+is updated after every iteration. If, on a subsequent invocation, a
+\cuba\ routine finds a file of the specified name, it loads the internal
+state and continues from the point it left off. Needless to say, using
+an existing state file with a different integrand generally leads to
+wrong results.
+
+This feature is useful mainly to define `check-points' in long-running
+integrations from which the calculation can be restarted.
+
+Once the integration reaches the prescribed accuracy, the state file
+is removed, unless bit 4 of \Code{flags} (see above) explicitly requests
+that it be kept.
+
+\VarIn{integer*8 spin}
+the `spinning cores' pointer, which has three options:
+\begin{itemize}
+\item A value of \Code{-1} or \Code{\%VAL(0)} (null pointer) means that
+the integrator completely takes care of starting and terminating child
+processes for the integration (if available/enabled), \ie after the
+integrator returns there are no child processes running any longer.
+Note that a `naive' \Code{-1} (which is an \Code{integer}, not an
+\Code{integer*8}) is explicitly allowed.
+
+\item A zero-initialized variable \Code{spin} instructs the integrator
+to start child processes for the integration but keep them running and
+store the `spinning cores' pointer in \Code{spin} on exit. Take care
+that in this case you have to explicitly terminate the child processes
+using \Code{cubawait} later on (see Sect.~\ref{sect:spinning}).
+
+\item A non-zero variable \Code{spin} means that the cores are already
+running as the result of some prior integration or an explicit
+\Code{cubafork} call (see Sect.~\ref{sect:spinning}).
+\end{itemize}
+The actual type of \Code{spin} is irrelevant, the variable must merely
+be wide enough to store a C \Code{void *}.
+
+\VarOut{integer nregions}
+the actual number of subregions needed (not present in Vegas).
+
+\VarOut{integer neval}
+the actual number of integrand evaluations needed.
+
+\VarOut{integer fail}
+an error flag:
+\begin{itemize}
+\item
+$\Code{fail} = 0$, the desired accuracy was reached,
+\item
+$\Code{fail} = -1$, dimension out of range,
+\item
+$\Code{fail} > 0$, the accuracy goal was not met within the allowed
+maximum number of integrand evaluations. While Vegas, Suave, and Cuhre
+simply return 1, Divonne can estimate the number of points by which
+\Code{maxeval} needs to be increased to reach the desired accuracy and
+returns this value.
+\end{itemize}
+
+\VarOut{double precision integral(ncomp)}
+the integral of \Code{integrand} over the unit hypercube.
+
+\VarOut{double precision error(ncomp)}
+the presumed absolute error of \Code{integral}.
+
+\VarOut{double precision prob(ncomp)}
+the $\chi^2$-probability (not the $\chi^2$-value itself!) that
+\Code{error} is not a reliable estimate of the true integration
+error\footnote{%
+ To judge the reliability of the result expressed through
+ \Code{prob}, remember that it is the null hypothesis that is
+ tested by the $\chi^2$ test, which is that \Code{error}
+ \emph{is} a reliable estimate. In statistics, the null
+ hypothesis may be rejected only if \Code{prob} is fairly close
+ to unity, say $\Code{prob} > .95$.}.
+\end{itemize}
+
+
+\subsubsection{Vegas-specific Arguments}
+\label{sect:vegasargs}
+
+\begin{itemize}
+\VarIn{integer nstart}
+the number of integrand evaluations per iteration to start with.
+
+\VarIn{integer nincrease}
+the increase in the number of integrand evaluations per iteration.
+
+\VarIn{integer nbatch}
+the batch size for sampling.
+
+Vegas samples points not all at once, but in batches of size
+\Code{nbatch}, to avoid excessive memory consumption. 1000 is a
+reasonable value, though it should not affect performance too much.
+
+\VarIn{integer gridno}
+the slot in the internal grid table.
+
+It may accelerate convergence to keep the grid accumulated during one
+integration for the next one, if the integrands are reasonably similar
+to each other. Vegas maintains an internal table with space for ten
+grids for this purpose. The slot in this grid is specified by
+\Code{gridno}.
+
+If a grid number between 1 and 10 is selected, the grid is not discarded
+at the end of the integration, but stored in the respective slot of the
+table for a future invocation. The grid is only re-used if the
+dimension of the subsequent integration is the same as the one it
+originates from.
+
+In repeated invocations it may become necessary to flush a slot in
+memory, in which case the negative of the grid number should be set.
+\end{itemize}
+
+Vegas actually passes the integrand two more arguments, \ie the
+integrand function is really declared as
+\begin{verbatim}
+ integer function integrand(ndim, x, ncomp, f, userdata, nvec, core,
+ weight, iter)
+ integer ndim, ncomp, nvec, core, iter
+ double precision x(ndim,nvec), f(ncomp,nvec), weight(nvec)
+\end{verbatim}
+where \Code{weight} contains the weight of the point being sampled and
+\Code{iter} the current iteration number. These extra arguments may
+safely be ignored, however.
+
+
+\subsubsection{Suave-specific Arguments}
+
+\begin{itemize}
+\VarIn{integer nnew}
+the number of new integrand evaluations in each subdivision.
+
+\VarIn{integer nmin}
+the minimum number of samples a former pass must contribute to a
+subregion to be considered in that region's compound integral value.
+Increasing \Code{nmin} may reduce jumps in the $\chi^2$ value.
+
+\VarIn{double precision flatness}
+the parameter $p$ in Eq.~(\ref{eq:fluct}), \ie the type of norm used to
+compute the fluctuation of a sample. This determines how prominently
+`outliers,' \ie individual samples with a large fluctuation, figure in
+the total fluctuation, which in turn determines how a region is split
+up. As suggested by its name, \Code{flatness} should be chosen large
+for `flat' integrands and small for `volatile' integrands with high
+peaks. Note that since \Code{flatness} appears in the exponent, one
+should not use too large values (say, no more than a few hundred) lest
+terms be truncated internally to prevent overflow.
+\end{itemize}
+
+Like Vegas, Suave also passes the two optional arguments \Code{weight}
+and \Code{iter} to the integrand (see Sect.~\ref{sect:vegasargs}).
+
+
+\subsubsection{Divonne-specific Arguments}
+\label{sect:divonneargs}
+
+\begin{itemize}
+\VarIn{integer key1}
+determines sampling in the partitioning phase:
+
+$\Code{key1} = 7, 9, 11, 13$ selects the cubature rule of degree
+\Code{key1}. Note that the degree-11 rule is available only in 3
+dimensions, the degree-13 rule only in 2 dimensions.
+
+For other values of \Code{key1}, a quasi-random sample of
+$n_1 = |\Code{key1}|$ points is used, where the sign of \Code{key1}
+determines the type of sample,
+\begin{itemize}
+\item
+$\Code{key1} > 0$, use a Korobov quasi-random sample,
+\item
+$\Code{key1} < 0$, use a ``standard'' sample
+(a Sobol quasi-random sample if \Code{seed} = 0, otherwise a
+pseudo-random sample).
+\end{itemize}
+
+\VarIn{integer key2}
+determines sampling in the final integration phase:
+
+$\Code{key2} = 7, 9, 11, 13$ selects the cubature rule of degree
+\Code{key2}. Note that the degree-11 rule is available only in 3
+dimensions, the degree-13 rule only in 2 dimensions.
+
+For other values of \Code{key2}, a quasi-random sample is used, where
+the sign of \Code{key2} determines the type of sample,
+\begin{itemize}
+\item
+$\Code{key2} > 0$, use a Korobov quasi-random sample,
+\item
+$\Code{key2} < 0$, use a ``standard'' sample (see description of
+\Code{key1} above),
+\end{itemize}
+and $n_2 = |\Code{key2}|$ determines the number of points,
+\begin{itemize}
+\item
+$n_2\geqslant 40$, sample $n_2$ points,
+\item
+$n_2 < 40$, sample $n_2\,\nneed$ points, where $\nneed$ is the number of
+points needed to reach the prescribed accuracy, as estimated by Divonne
+from the results of the partitioning phase.
+\end{itemize}
+
+\VarIn{integer key3}
+sets the strategy for the refinement phase:
+
+$\Code{key3} = 0$, do not treat the subregion any further.
+
+$\Code{key3} = 1$, split the subregion up once more.
+
+Otherwise, the subregion is sampled a third time with \Code{key3}
+specifying the sampling parameters exactly as \Code{key2} above.
+
+\VarIn{integer maxpass}
+controls the thoroughness of the partitioning phase:
+The partitioning phase terminates when the estimated total number of
+integrand evaluations (partitioning plus final integration) does not
+decrease for \Code{maxpass} successive iterations.
+
+A decrease in points generally indicates that Divonne discovered new
+structures of the integrand and was able to find a more effective
+partitioning. \Code{maxpass} can be understood as the number of
+`safety' iterations that are performed before the partition is accepted
+as final and counting consequently restarts at zero whenever new
+structures are found.
+
+\VarIn{double precision border}
+the width of the border of the integration region. Points falling into
+this border region will not be sampled directly, but will be
+extrapolated from two samples from the interior. Use a non-zero
+\Code{border} if the integrand function cannot produce values
+directly on the integration boundary.
+
+\VarIn{double precision maxchisq}
+the maximum $\chi^2$ value a single subregion is allowed to have in the
+final integration phase. Regions which fail this $\chi^2$ test and
+whose sample averages differ by more than \Code{mindeviation} move on
+to the refinement phase.
+
+\VarIn{double precision mindeviation}
+a bound, given as the fraction of the requested error of the entire
+integral, which determines whether it is worthwhile further examining a
+region that failed the $\chi^2$ test. Only if the two sampling averages
+obtained for the region differ by more than this bound is the region
+further treated.
+
+\VarIn{integer ngiven}
+the number of points in the \Code{xgiven} array.
+
+\VarIn{integer ldxgiven}
+the leading dimension of \Code{xgiven}, \ie the offset between one
+point and the next in memory.
+
+\VarIn{double precision xgiven(ldxgiven,ngiven)}
+a list of points where the integrand might have peaks. Divonne will
+consider these points when partitioning the integration region. The
+idea here is to help the integrator find the extrema of the integrand in
+the presence of very narrow peaks. Even if only the approximate
+location of such peaks is known, this can considerably speed up
+convergence.
+
+\VarIn{integer nextra}
+the maximum number of extra points the peak-finder subroutine will
+return. If \Code{nextra} is zero, \Code{peakfinder} is not called
+and an arbitrary object may be passed in its place, \eg just 0.
+
+\VarIn{external peakfinder}
+the peak-finder subroutine. This subroutine is called whenever a region
+is up for subdivision and is supposed to point out possible peaks lying
+in the region, thus acting as the dynamic counterpart of the static list
+of points supplied in \Code{xgiven}. It is expected to be declared as
+\begin{verbatim}
+ subroutine peakfinder(ndim, b, n, x, userdata)
+ integer ndim, n
+ double precision b(2,ndim)
+ double precision x(ldxgiven,n)
+\end{verbatim}
+The bounds of the subregion are passed in the array \Code{b}, where
+\Code{b(1,\Var{d})} is the lower and \Code{b(2,\Var{d})} the upper
+bound in dimension \Var{d}. On entry, \Code{n} specifies the maximum
+number of points that may be written to \Code{x}. On exit, \Code{n}
+must contain the actual number of points in \Code{x}.
+\end{itemize}
+Divonne actually passes the integrand one more argument, \ie the
+integrand function is really declared as
+\begin{verbatim}
+ integer function integrand(ndim, x, ncomp, f, userdata, nvec, core, phase)
+ integer ndim, ncomp, nvec, core, phase
+ double precision x(ndim,nvec), f(ncomp,nvec)
+\end{verbatim}
+The last argument, \Code{phase}, indicates the integration phase:
+\begin{itemize}
+\item 0, sampling of the points in \Code{xgiven},
+\item 1, partitioning phase,
+\item 2, final integration phase,
+\item 3, refinement phase.
+\end{itemize}
+This information might be useful if the integrand takes long to compute
+and a sufficiently accurate approximation of the integrand is available.
+The actual value of the integral is only of minor importance in the
+partitioning phase, which is instead much more dependent on the peak
+structure of the integrand to find an appropriate tessellation. An
+approximation which reproduces the peak structure while leaving out the
+fine details might hence be a perfectly viable and much faster
+substitute when $\Code{phase} < 2$.
+
+In all other instances, \Code{phase} can be ignored and it is
+entirely admissible to define the integrand without it.
+
+
+\subsubsection{Cuhre-specific Arguments}
+
+\begin{itemize}
+\VarIn{integer key}
+chooses the basic integration rule:
+
+$\Code{key} = 7, 9, 11, 13$ selects the cubature rule of degree
+\Code{key}. Note that the degree-11 rule is available only in 3
+dimensions, the degree-13 rule only in 2 dimensions.
+
+For other values, the default rule is taken, which is the degree-13 rule
+in 2 dimensions, the degree-11 rule in 3 dimensions, and the degree-9
+rule otherwise.
+\end{itemize}
+
+
+\subsubsection{Visualizing the Tessellation}
+
+Suave, Divonne, and Cuhre work by dividing the integration region into
+subregions for integration. When verbosity level 3 is selected in the
+flags, the actual tessellation is written out on screen and can be
+visualized with the partview tool. To this end, the output of the
+program invoking \cuba\ is piped through partview, \eg
+\begin{verbatim}
+ mycubaprogram | partview 1 2 1 3
+\end{verbatim}
+opens a window with two tabs showing the 1--2 and 1--3 plane of the
+tessellation. The saturation of the colours corresponds to the area of
+the region, \ie smaller regions are displayed in a darker shade.
+
+
+\subsection{Usage in C/C++}
+
+Being written in C, the algorithms can of course be used in C/C++
+directly. The declarations are as follows:
+\begin{verbatim}
+typedef int (*integrand_t)(const int *ndim, const double x[],
+ const int *ncomp, double f[], void *userdata);
+
+typedef void (*peakfinder_t)(const int *ndim, const double b[],
+ int *n, double x[], void *userdata);
+\end{verbatim}
+\begin{verbatim}
+void Vegas(const int ndim, const int ncomp,
+ integrand_t integrand, void *userdata, const int nvec,
+ const double epsrel, const double epsabs,
+ const int flags, const int seed,
+ const int mineval, const int maxeval,
+ const int nstart, const int nincrease, const int nbatch,
+ const int gridno, const char *statefile, void *spin,
+ int *neval, int *fail,
+ double integral[], double error[], double prob[])
+\end{verbatim}
+\begin{verbatim}
+void Suave(const int ndim, const int ncomp,
+ integrand_t integrand, void *userdata, const int nvec,
+ const double epsrel, const double epsabs,
+ const int flags, const int seed,
+ const int mineval, const int maxeval,
+ const int nnew, const int nmin,
+ const double flatness, const char *statefile, void *spin,
+ int *nregions, int *neval, int *fail,
+ double integral[], double error[], double prob[])
+\end{verbatim}
+\begin{verbatim}
+void Divonne(const int ndim, const int ncomp,
+ integrand_t integrand, void *userdata, const int nvec,
+ const double epsrel, const double epsabs,
+ const int flags, const int seed,
+ const int mineval, const int maxeval,
+ const int key1, const int key2, const int key3,
+ const int maxpass, const double border,
+ const double maxchisq, const double mindeviation,
+ const int ngiven, const int ldxgiven, double xgiven[],
+ const int nextra, peakfinder_t peakfinder,
+ const char *statefile, void *spin,
+ int *nregions, int *neval, int *fail,
+ double integral[], double error[], double prob[])
+\end{verbatim}
+\begin{verbatim}
+void Cuhre(const int ndim, const int ncomp,
+ integrand_t integrand, void *userdata, const int nvec,
+ const double epsrel, const double epsabs,
+ const int flags,
+ const int mineval, const int maxeval,
+ const int key, const char *statefile, void *spin,
+ int *nregions, int *neval, int *fail,
+ double integral[], double error[], double prob[])
+\end{verbatim}
+These prototypes are contained in \Code{cuba.h} which should (in C) or
+must (in C++) be included when using the \cuba\ routines. The arguments
+are as in the Fortran case, with the obvious translations, \eg
+\Code{double precision} = \Code{double}. Note, however, the
+declarations of the integrand and peak-finder functions, which expect
+pointers to integers rather than integers. This is required for
+compatibility with Fortran.
+
+The \verb=integrand_t= type glosses over the fact that the extra
+\Code{nvec} argument is routinely passed to the integrand and neither
+does it mention the extra arguments passed by \Code{Vegas},
+\Code{Suave}, and \Code{Divonne} (see Sects.\ \ref{sect:vegasargs} and
+\ref{sect:divonneargs}). This is usually just what is needed for
+`simple' invocations, \ie with the `correct' prototypes the compiler
+would only generate unnecessary warnings (in C) or errors (in C++). In
+the rare cases where the integrand actually has more arguments, an
+explicit typecast to \verb=integrand_t= must be used in the invocation.
+In the presence of an \Code{nvec} argument, the \Code{x} and \Code{f}
+arguments are actually two-dimensional arrays, \Code{x[*nvec][*ndim]}
+and \Code{f[*nvec][*ncomp]}.
+
+
+\subsection{Usage in Mathematica}
+
+The Mathematica versions are based on essentially the same C code and
+communicate with Mathematica via the MathLink API. When building the
+package, the executables \Code{Vegas}, \Code{Suave},
+\Code{Divonne}, and \Code{Cuhre} are compiled for use in
+Mathematica. In Mathematica one first needs to load them with the
+\Code{Install} function, as in
+\begin{verbatim}
+ Install["Divonne"]
+\end{verbatim}
+which makes a Mathematica function of the same name available. These
+functions are used almost like \Code{NIntegrate}, only some options
+are different. For example,
+\begin{verbatim}
+ Vegas[x^2/(Cos[x + y + 1] + 5), {x,0,5}, {y,0,5}]
+\end{verbatim}
+integrates a scalar function, or
+\begin{verbatim}
+ Suave[{Sin[z] Exp[-x^2 - y^2],
+ Cos[z] Exp[-x^2 - y^2]}, {x,-1,1}, {y,-1,3}, {z,0,1}]
+\end{verbatim}
+integrates a vector. As is evident, the integration region can be
+chosen different from the unit hypercube. Innermore boundaries may
+depend on outermore integration variables, \eg
+\verb=Cuhre[1, {x,0,1}, {y,0,x}]= gives the area of the unit triangle.
+
+The sampling function uses \Code{MapSample} to map the integrand over
+the data points. This is by default set to \Code{Map}, but can be
+changed (after \Code{Install}) \eg to \Code{ParallelMap} to take
+advantage of parallelization (see Sect.~\ref{sect:parallel} for more
+details).
+
+The functions return a list which contains the results for each
+component of the integrand in a sublist \{integral estimate, estimated
+absolute error, $\chi^2$ probability\}. For the Suave example above
+this would be
+\begin{verbatim}
+ {{1.1216, 0.000991577, 0.0000104605},
+ {2.05246, 0.00146661, 0.00920716}}
+\end{verbatim}
+The other parameters are specified via the following options. Default
+values are given on the right-hand sides of the rules.
+
+
+\subsubsection{Common Options}
+
+\begin{itemize}
+\Option{PrecisionGoal}{3}
+the number of digits of relative accuracy to seek, that is, $\epsrel =
+10^{-\Code{PrecisionGoal}}$.
+
+\Option{AccuracyGoal}{12}
+the number of digits of absolute accuracy to seek, that is, $\epsabs =
+10^{-\Code{AccuracyGoal}}$. The integrator tries to find an estimate
+$\hat I$ for the integral $I$ which for every component $c$ fulfills
+$|\hat I_c - I_c|\leqslant \max(\epsabs, \epsrel I_c)$.
+
+\Option{MinPoints}{0}
+the minimum number of integrand evaluations required.
+
+\Option{MaxPoints}{50000}
+the (approximate) maximum number of integrand evaluations allowed.
+
+\Option{Verbose}{1}
+how much information to print on intermediate results, can take values
+from 0 to 3.
+
+Level 0 does not print any output, level 1 prints `reasonable'
+information on the progress of the integration, level 2 also echoes the
+input parameters, and level 3 further prints the subregion results (if
+applicable). Note that the subregion boundaries in the level-3 printout
+refer to the unit hypercube, \ie are possibly scaled with respect to the
+integration limits passed to Mathematica. This is because the
+underlying C code, which emits the output, is unaware of any scaling of
+the integration region, which is done entirely in Mathematica.
+
+\Option{Final}{All \Var{or} Last}
+whether only the last (largest) or all sets of samples collected on a
+subregion during the various iterations or phases contribute to the
+final result.
+
+\Option{PseudoRandom}{False}
+whether pseudo-random numbers are used for sampling instead of Sobol
+quasi-random numbers. Values \Code{True} and \Code{0} select the
+Mersenne Twister algorithm, any other integer $n$ chooses Ranlux with
+luxury level $n$ (see Sect.~\ref{sect:commonargs}).
+
+\Option{PseudoRandomSeed}{Automatic}
+the seed for the pseudo-random-number generator.
+
+\Option{Regions}{False}
+whether to return the tessellation of the integration region (thus not
+present in Vegas, which does not partition the integration region).
+
+If \Code{Regions -> True} is chosen, a two-component list is returned,
+where the first element is the list of regions, and the second element
+is the integration result as described above. Each region is specified
+in the form \Code{Region[\Var{x_{\mathrm{ll}}},\,\Var{x_{\mathrm{ur}}},%
+\,\Var{res},\,\Var{df}]}, where \Var{x_{\text{ll}}} and
+\Var{x_{\text{ur}}} are the multidimensional equivalents of the lower
+left and upper right corner, \Var{res} is the integration result for the
+subregion, given in the same form as the total result but with the
+$\chi^2$ value instead of the $\chi^2$ probability, and \Var{df} are the
+degrees of freedom corresponding to the $\chi^2$ values.
+
+Cuhre cannot state a $\chi^2$ value separately for each region, hence
+the $\chi^2$ values and degrees of freedom are omitted from the
+\Code{Region} information.
+
+\Option{StateFile}{""}
+the file name for storing the internal state. If a non-empty string is
+given here, Vegas will store its entire internal state (\ie all the
+information to resume an interrupted integration) in this file after
+every iteration. If, on a subsequent invocation, Vegas finds a file of
+the specified name, it loads the internal state and continues from the
+point it left off. Needless to say, using an existing state file with a
+different integrand generally leads to wrong results.
+
+This feature is useful mainly to define `check-points' in long-running
+integrations from which the calculation can be restarted.
+
+\Option{RetainStateFile}{False}
+whether the state file shall be kept even if the integration terminates
+normally, \ie reaches either the prescribed accuracy or the maximum
+number of points.
+
+\Option{Compiled}{True}
+whether to compile the integrand function before use. Note two caveats:
+\begin{itemize}
+\item
+The function values still have to pass through the MathLink interface,
+and in the course of this are truncated to machine precision. Not
+compiling the integrand will thus in general not deliver more accurate
+results.
+\item
+Compilation should be switched off if the compiled integrand shows
+unexpected behaviour. As the Mathematica online help points out, ``the
+number of times and the order in which objects are evaluated by
+\Code{Compile} may be different from ordinary Mathematica code.''
+\end{itemize}
+\end{itemize}
+
+
+\subsubsection{Vegas-specific Options}
+
+\begin{itemize}
+\Option{NStart}{1000}
+the number of integrand evaluations per iteration to start with.
+
+\Option{NIncrease}{500}
+the increase in the number of integrand evaluations per iteration.
+
+\Option{NBatch}{1000}
+the number of points sent in one MathLink packet to be sampled by
+Mathematica. This setting will at most affect performance and should
+not normally need to be changed.
+
+\Option{GridNo}{0}
+the slot in the internal grid table.
+
+It may accelerate convergence to keep the grid accumulated during one
+integration for the next one, if the integrands are reasonably similar
+to each other. Vegas maintains an internal table with space for ten
+grids for this purpose. If a \Code{GridNo} between 1 and 10 is chosen,
+the grid is not discarded at the end of the integration, but stored for
+a future invocation. The grid is only re-used if the dimension of the
+subsequent integration is the same as the one it originates from.
+A negative grid number initializes the indicated slot before the
+integration (for details see Sect.~\ref{sect:vegasargs}).
+
+\Option{ResetState}{False}
+whether the integrator's state should be reset even if a state file is
+present, \ie only the grid be kept. Together with the
+\Code{RetainStateFile} option this allows a grid adapted by one
+integration to be used for another integrand.
+
+\item
+During the evaluation of the integrand, the global variable
+\Code{\$Weight} is set to the weight of the point being sampled and
+\Code{\$Iteration} to the current iteration number.
+\end{itemize}
+
+
+\subsubsection{Suave-specific Options}
+
+\begin{itemize}
+\Option{NNew}{1000}
+the number of new integrand evaluations in each subdivision.
+
+\Option{NMin}{2}
+the minimum number of samples a former pass must contribute to a
+subregion to be considered in that region's compound integral value.
+Increasing \Code{NMin} may reduce jumps in the $\chi^2$ value.
+
+\Option{Flatness}{50}
+the parameter $p$ in Eq.~(\ref{eq:fluct}), \ie the type of norm used to
+compute the fluctuation of a sample. This determines how prominently
+`outliers,' \ie individual samples with a large fluctuation, figure in
+the total fluctuation, which in turn determines how a region is split
+up. As suggested by its name, \Code{Flatness} should be chosen large
+for `flat' integrands and small for `volatile' integrands with high
+peaks. Note that since \Code{Flatness} appears in the exponent, one
+should not use too large values (say, no more than a few hundred) lest
+terms be truncated internally to prevent overflow.
+
+\item
+During the evaluation of the integrand, the global variable
+\Code{\$Weight} is set to the weight of the point being sampled and
+\Code{\$Iteration} to the current iteration number.
+\end{itemize}
+
+
+\subsubsection{Divonne-specific Options}
+
+\begin{itemize}
+\Option{Key1}{47}
+an integer which governs sampling in the partitioning phase:
+
+$\Code{Key1} = 7, 9, 11, 13$ selects the cubature rule of degree
+\Code{Key1}. Note that the degree-11 rule is available only in 3
+dimensions, the degree-13 rule only in 2 dimensions.
+
+For other values of \Code{Key1}, a quasi-random sample of
+$n_1 = |\Code{Key1}|$ points is used, where the sign of \Code{Key1}
+determines the type of sample,
+\begin{itemize}
+\item
+$\Code{Key1} > 0$, use a Korobov quasi-random sample,
+\item
+$\Code{Key1} < 0$, use a ``standard'' sample
+(a Sobol quasi-random sample in the case \Code{PseudoRandom -> False},
+otherwise a pseudo-random sample).
+\end{itemize}
+
+\Option{Key2}{1}
+an integer which governs sampling in the final integration phase:
+
+$\Code{Key2} = 7, 9, 11, 13$ selects the cubature rule of degree
+\Code{Key2}. Note that the degree-11 rule is available only in 3
+dimensions, the degree-13 rule only in 2 dimensions.
+
+For other values of \Code{Key2}, a quasi-random sample is used, where
+the sign of \Code{Key2} determines the type of sample,
+\begin{itemize}
+\item
+$\Code{Key2} > 0$, use a Korobov quasi-random sample,
+\item
+$\Code{Key2} < 0$, use a ``standard'' sample
+(see description of \Code{Key1} above),
+\end{itemize}
+and $n_2 = |\Code{Key2}|$ determines the number of points,
+\begin{itemize}
+\item
+$n_2\geqslant 40$, sample $n_2$ points,
+\item
+$n_2 < 40$, sample $n_2\,\nneed$ points, where $\nneed$ is the number of
+points needed to reach the prescribed accuracy, as estimated by Divonne
+from the results of the partitioning phase.
+\end{itemize}
+
+\Option{Key3}{1}
+an integer which sets the strategy for the refinement phase:
+
+$\Code{Key3} = 0$, do not treat the subregion any further.
+
+$\Code{Key3} = 1$, split the subregion up once more.
+
+Otherwise, the subregion is sampled a third time with \Code{Key3}
+specifying the sampling parameters exactly as \Code{Key2} above.
+
+\Option{MaxPass}{5}
+the number of passes after which the partitioning phase terminates.
+The partitioning phase terminates when the estimated total number of
+integrand evaluations (partitioning plus final integration) does not
+decrease for \Code{MaxPass} successive iterations.
+
+A decrease in points generally indicates that Divonne discovered new
+structures of the integrand and was able to find a more effective
+partitioning. \Code{MaxPass} can be understood as the number of
+`safety' iterations that are performed before the partition is accepted
+as final and counting consequently restarts at zero whenever new
+structures are found.
+
+\Option{Border}{0}
+the width of the border of the integration region. Points falling into
+this border region are not sampled directly, but are extrapolated from
+two samples from the interior. Use a non-zero \Code{Border} if the
+integrand function cannot produce values directly on the integration
+boundary.
+
+The border width always refers to the unit hypercube, \ie it is not
+rescaled if the integration region is not the unit hypercube.
+
+\Option{MaxChisq}{10}
+the maximum $\chi^2$ value a single subregion is allowed to have in the
+final integration phase. Regions which fail this $\chi^2$ test and
+whose sample averages differ by more than \Code{MinDeviation} move on
+to the refinement phase.
+
+\Option{MinDeviation}{.25}
+a bound, given as the fraction of the requested error of the entire
+integral, which determines whether it is worthwhile further examining a
+region that failed the $\chi^2$ test. Only if the two sampling averages
+obtained for the region differ by more than this bound is the region
+further treated.
+
+\Option{Given}{\lbrac\rbrac}
+a list of points where the integrand might have peaks. A point is a
+list of $n_d$ real numbers, where $n_d$ is the dimension of the
+integral.
+
+Divonne will consider these points when partitioning the integration
+region. The idea here is to help the integrator find the extrema of the
+integrand in the presence of very narrow peaks. Even if only the
+approximate location of such peaks is known, this can considerably speed
+up convergence.
+
+\Option{NExtra}{0}
+the maximum number of points that will be considered in the output of
+the \Code{PeakFinder} function.
+
+\Option{PeakFinder}{(\lbrac\rbrac\&)}
+the peak-finder function. This function is called whenever a region is
+up for subdivision and is supposed to point out possible peaks lying in
+the region, thus acting as the dynamic counterpart of the static list of
+points supplied with \Code{Given}. It is invoked with two arguments,
+the multidimensional equivalents of the lower left and upper right
+corners of the region being investigated, and must return a (possibly
+empty) list of points. A point is a list of $n_d$ real numbers, where
+$n_d$ is the dimension of the integral.
+\end{itemize}
+
+
+\subsubsection{Cuhre-specific Options}
+
+\begin{itemize}
+\Option{Key}{0}
+chooses the basic integration rule:
+
+$\Code{Key} = 7, 9, 11, 13$ selects the cubature rule of degree
+\Code{Key}. Note that the degree-11 rule is available only in 3
+dimensions, the degree-13 rule only in 2 dimensions.
+
+For other values, the default rule is taken, which is the degree-13 rule
+in 2 dimensions, the degree-11 rule in 3 dimensions, and the degree-9
+rule otherwise.
+\end{itemize}
+
+
+\subsubsection{Visualizing the Tessellation}
+
+Suave, Divonne, and Cuhre work by dividing the integration region into
+subregions for integration. The tessellation is returned together with
+the integration results when the option \Code{Regions -> True} is
+set. Such output can be visualized using the Mathematica program
+\Code{partview.m} that comes with \cuba. The invocation is \eg
+\begin{verbatim}
+ result = Divonne[..., Regions -> True]
+ << tools/partview.m
+ PartView[result, 1, 2]
+\end{verbatim}
+which displays the 1--2 plane of the tessellation. The saturation of
+the colours corresponds to the area of the region, \ie smaller regions
+are displayed in a darker shade.
+
+
+\subsection{Long-integer Versions}
+
+For both Fortran and C/C++ there exist versions of the integration
+routines that take 64-bit integers for all number-of-points-type
+quantities. These should be used in cases where convergence is not
+reached within the ordinary 32-bit integer range ($2^{31} - 1$).
+
+The long-integer versions are distinguished by the ``\Code{ll}''
+prefix. Their specific invocations are, in Fortran,
+\begin{alltt}
+ subroutine llvegas(ndim, ncomp, integrand, userdata, \ul{nvec},
+ & epsrel, epsabs, flags, seed, \ul{mineval}, \ul{maxeval},
+ & \ul{nstart}, \ul{nincrease}, \ul{nbatch}, gridno, statefile, spin,
+ & \ul{neval}, fail, integral, error, prob)
+\end{alltt}
+\begin{alltt}
+ subroutine llsuave(ndim, ncomp, integrand, userdata, \ul{nvec},
+ & epsrel, epsabs, flags, seed, \ul{mineval}, \ul{maxeval},
+ & \ul{nnew}, \ul{nmin}, flatness, statefile, spin,
+ & nregions, \ul{neval}, fail, integral, error, prob)
+\end{alltt}
+\begin{alltt}
+ subroutine lldivonne(ndim, ncomp, integrand, userdata, \ul{nvec},
+ & epsrel, epsabs, flags, seed, \ul{mineval}, \ul{maxeval},
+ & key1, key2, key3, maxpass,
+ & border, maxchisq, mindeviation,
+ & \ul{ngiven}, ldxgiven, xgiven, \ul{nextra}, peakfinder,
+ & statefile, spin,
+ & nregions, \ul{neval}, fail, integral, error, prob)
+\end{alltt}
+\begin{alltt}
+ subroutine llcuhre(ndim, ncomp, integrand, userdata, \ul{nvec},
+ & epsrel, epsabs, flags, seed, \ul{mineval}, \ul{maxeval},
+ & key, statefile, spin,
+ & nregions, \ul{neval}, fail, integral, error, prob)
+\end{alltt}
+The correspondences for C/C++ are obvious and are given explicitly in
+the include file \Code{cuba.h}. The arguments are as for the normal
+versions except that all underlined variables are of type
+\Code{integer*8} in Fortran and \Code{long long int} in C/C++.
+
+%========================================================================
+
+\section{Parallelization}
+\label{sect:parallel}
+
+Numerical integration is perfectly suited for parallel execution, which
+can significantly speed up the computation as it generally incurs only a
+very small overhead. The parallelization procedure is rather different
+in Fortran/C/C++ and in Mathematica. We shall deal with the latter
+first because it needs only a short explanation. The remainder of this
+chapter is then devoted to the Fortran/C/C++ case.
+
+%------------------------------------------------------------------------
+
+\subsection{Parallelization in Mathematica}
+
+The Mathematica version of \cuba\ performs its sampling through a
+function \Code{MapSample}. By default this is identical to \Code{Map},
+\ie the serial version, so to parallelize one merely needs to redefine
+\Code{MapSample = ParallelMap} (after loading \cuba).
+
+If the integrand depends on user-defined symbols or functions, their
+definitions must be distributed to the workers beforehand using
+\Code{DistributeDefinitions} and likewise required packages must be
+loaded with \Code{ParallelNeeds} instead of \Code{Needs}; this is
+explained in detail in the Mathematica manual.
+
+%------------------------------------------------------------------------
+
+\subsection{Parallelization in Fortran and C/C++}
+
+In Fortran and C/C++ the \cuba\ library can (and usually does)
+automatically parallelize the sampling of the integrand. It
+parallelizes through \Code{fork} and \Code{wait} which, though slightly
+less performant than pthreads, do not require reentrant code.
+(Reentrancy may not even be under full control of the programmer, for
+example Fortran's I/O is usually non-reentrant.) Worker processes are
+started and shut down only as few times as possible, however, so the
+performance penalty is really quite minor even for non-native fork
+implementations such as Cygwin's. Parallelization is not available on
+native Windows for lack of the \Code{fork} function.
+
+The communication of samples to and from the workers happens through IPC
+shared memory (\Code{shmget} and colleagues), or if that is not
+available, through a \Code{socketpair} (two-way pipe). Remarkably, the
+former's anticipated performance advantage turned out to be hardly
+perceptible. Possibly there are cache-coherence issues introduced by
+several workers writing simultaneously to the same shared-memory area.
+
+%------------------------------------------------------------------------
+
+\subsubsection{Starting and stopping the workers}
+\label{sect:spinning}
+
+The workers are usually started and stopped automatically by \cuba's
+integration routines, but the user may choose to start them manually or
+keep them running after one integration and shut them down later, \eg at
+the end of the program, which can be slightly more efficient. The
+latter mode is referred to as `Spinning Cores' and must be employed with
+certain care, for running workers will not `see' subsequent changes in
+the main program's data (\eg global variables, common blocks) or code
+(\eg via \Code{dlsym}) unless special arrangements are made (\eg shared
+memory).
+
+The spinning cores are controlled through the `\Code{spin}' argument of
+the \cuba\ integration routines (Sect.~\ref{sect:commonargs}):
+\begin{itemize}
+\item A value of \Code{-1} or \Code{\%VAL(0)} (in Fortran) or
+\Code{NULL} (in C/C++) tells the integrator to start and shut down the
+workers autonomously. This is the usual case. No workers will still be
+running after the integrator returns. No special precautions need to be
+taken to communicate \eg global data to the workers. Note that it is
+expressly allowed to pass a `naive' \Code{-1} (which is an
+\Code{integer}, not an \Code{integer*8}) in Fortran.
+
+\item Passing a zero-initialized variable for \Code{spin} instructs the
+integrator to start the workers but keep them running on return and
+store the `spinning cores' pointer in \Code{spin} for future use. The
+spinning cores must later be terminated explicitly by \Code{cubawait},
+thus invocation would schematically look like this:
+
+\hfill\begin{minipage}{.4\hsize}
+\begin{verbatim}
+integer*8 spin
+spin = 0
+call vegas(..., spin, ...)
+...
+call cubawait(spin)
+\end{verbatim}
+\end{minipage}\hfill\begin{minipage}{.4\hsize}
+\begin{verbatim}
+void *spin = NULL;
+
+Vegas(..., &spin, ...);
+...
+cubawait(&spin);
+\end{verbatim}
+\end{minipage}\hfill
+
+\item A non-zero \Code{spin} variable is assumed to contain a valid
+`spinning cores' pointer either from a former integration or an explicit
+invocation of \Code{cubafork}, as in:
+
+\hfill\begin{minipage}{.4\hsize}
+\begin{verbatim}
+integer*8 spin
+call cubafork(spin)
+call vegas(..., spin, ...)
+...
+call cubawait(spin)
+\end{verbatim}
+\end{minipage}\hfill\begin{minipage}{.4\hsize}
+\begin{verbatim}
+void *spin;
+cubafork(&spin);
+Vegas(..., &spin, ...);
+...
+cubawait(&spin);
+\end{verbatim}
+\end{minipage}\hfill
+\end{itemize}
+
+%------------------------------------------------------------------------
+
+\subsubsection{Accelerators and Cores}
+\label{sect:cores}
+
+Based on the strategy used to distribute samples, \cuba\ distinguishes
+two kinds of workers.
+
+Workers of the first kind are referred to as `Accelerators' even though
+\cuba\ does not actually send anything to a GPU or Accelerator in the
+system by itself -- this can only be done by the integrand routine. The
+assumption behind this strategy is that the integrand evaluation is
+running on a device so highly parallel that the sampling time is more or
+less independent of the number of points, up to the number of threads
+$p\accel$ available in hardware. \cuba\ tries to send exactly $p\accel$
+points to each core -- never more, less only for the last batch. To
+sample \eg 2400 points on three accelerators with $p\accel = 1000$,
+\cuba\ sends batches of 1000/1000/400 and not, for example, 800/800/800
+or 1200/1200. The number of accelerators $n\accel$ and their value of
+$p\accel$ can be set through the environment variables
+\begin{tabbing}
+\verb| CUBAACCEL=|$n\accel$ \hspace{10em}\= (default: 0) \\
+\verb| CUBAACCELMAX=|$p\accel$ \> (default: 1000)
+\end{tabbing}
+or, superseding the environment, an explicit
+\begin{alltt}
+ call cubaaccel(\(n\accel\), \(p\accel\))
+\end{alltt}
+
+CPU-bound workers are just called `Cores'. Their distribution strategy
+is different in that all available cores are used and points are
+distributed evenly. In the example above, the batches would be
+800/800/800 thus. Each core receives at least 10 points, or else fewer
+cores are used. If no more than 10 points are requested in total,
+\cuba\ uses no workers at all but lets the master sample those few
+points. This happens during the partitioning phase of Divonne for
+instance, where only single points are evaluated in the minimum/maximum
+search. Conversely, if the division of points by cores does not come out
+even, the remaining few points ($< n\cores$) are simply added to the
+existing batches, to avoid an extra batch because of rounding. Sampling
+2001 points on two cores with $p\cores = 1000$ will hence give two
+batches 1001/1000 and not three batches 1000/1000/1.
+
+Although there is typically no hardware limit, a maximum number of
+points per core, $p\cores$, can be prescribed for Cores, too. Unless
+the integrand is known to evaluate equally fast at all points, a
+moderate number for $p\cores$ (10000, say) may actually increase
+performance because it effectively load-levels the sampling. For, a
+batch always goes to the next free core so it doesn't matter much
+if one core is tied up with a batch that takes longer.
+
+The number of cores $n\cores$ and the value of $p\cores$ can be set
+analogously through the environment variables
+\begin{tabbing}
+\verb| CUBACORES=|$n\cores$ \hspace{10em}\= (default: no.\ of idle cores) \\
+\verb| CUBACORESMAX=|$p\cores$ \> (default: 10000)
+\end{tabbing}
+If \Code{CUBACORES} is unset, the idle cores on the present system are
+taken (total cores minus load average), which means that a program
+calling a \cuba\ routine will by default automatically parallelize on
+the available cores. Again, the environment can be overruled with an
+explicit
+\begin{alltt}
+ call cubacores(\(n\cores\), \(p\cores\))
+\end{alltt}
+Using the environment has the advantage, though, that changing the
+number of cores to use does not require a re-compile, which is
+particularly useful if one wants to run the program on several computers
+(with potentially different numbers of cores) simultaneously, say in a
+batch queue.
+
+The integrand function may use the `\Code{core}' argument
+(Sect.~\ref{sect:commonargs}) to distinguish Accelerators ($\Code{core}
+< 0$) and Cores ($\Code{core}\geqslant 0$). The special value
+$\Code{core} = 32768$ ($2^{15}$) indicates that the master itself is
+doing the sampling.
+
+%------------------------------------------------------------------------
+
+\subsubsection{Worker initialization}
+
+User subroutines for (de)initialization may be registered with
+\begin{alltt}
+ call cubainit(initfun, initarg) \textrm{Fortran}
+ call cubaexit(exitfun, exitarg)
+\end{alltt}
+\begin{alltt}
+ cubainit(initfun, initarg); \textrm{C/C++}
+ cubaexit(exitfun, exitarg);
+\end{alltt}
+and will be executed in every process before and after sampling.
+Passing a null pointer (\Code{\%VAL(0)} in Fortran, \Code{NULL} in
+C/C++) as the first argument unregisters either subroutine.
+
+The init/exit functions are actually called as
+\begin{alltt}
+ call initfun(initarg, core) \textrm{Fortran}
+ call exitfun(exitarg, core)
+\end{alltt}
+\begin{alltt}
+ initfun(initarg, &core); \textrm{C/C++}
+ exitfun(exitarg, &core);
+\end{alltt}
+where \Code{initarg} and \Code{exitarg} are the user arguments given
+with the registration (arbitrary in Fortran, \Code{void *} in C/C++)
+and \Code{core} indicates the core the function is being executed on,
+with (as before) $\Code{core} < 0$ for Accelerators,
+$\Code{core}\geqslant 0$ for Cores, and $\Code{core} = 32768$ for the
+master.
+
+On worker processes, the functions are respectively executed after
+\Code{fork} and before \Code{wait}, independently of whether the worker
+actually receives any samples. The master executes them only when
+actual sampling is done.
+For Accelerators, the init and exit functions are typically used to set
+up the device for the integrand evaluations, which for many devices must
+be done per process, \ie after the \Code{fork}.
+
+%------------------------------------------------------------------------
+
+\subsubsection{Concurrency issues}
+
+By creating a new process image, \Code{fork} circumvents all memory
+concurrency, to wit: each worker modifies only its own copy of the
+parent's memory and never overwrites any other's data. The programmer
+should be aware of a few potential problems nevertheless:
+\begin{itemize}
+\item Communicating back results other than the intended output from the
+integrand to the main program is not straightforward because, by the
+same token, a worker cannot overwrite any common data of the master, it
+will only modify its own copy.
+
+Data exchange between workers is likewise not directly possible. For
+example, if one worker stores an intermediate result in a common block,
+this will not be seen by the other workers.
+
+Possible solutions include using shared memory (\Code{shmget} etc., see
+App.~\ref{app:shm}) and writing the output to file (but see next item
+below).
+
+\item \Code{fork} does not guard against competing use of other common
+resources. For example, if the integrand function writes to a file
+(debug output, say), there is no telling in which order the lines will
+end up in the file, or even if they will end up as complete lines at
+all. Buffered output should be avoided at the very least; better still,
+every worker should write the output to its own file, \eg with a
+filename that includes the process id, as in:
+\begin{verbatim}
+ character*32 filename
+ integer pid
+ data pid /0/
+ if( pid .eq. 0 ) then
+ pid = getpid()
+ write(filename,'("output.",I5.5)') pid
+ open(unit=4711, file=filename)
+ endif
+\end{verbatim}
+
+\item Fortran users are advised to flush (or close) any open files
+before calling \cuba, \ie \Code{call flush(\Var{unit})}. The reason is
+that the child processes inherit all file buffers, and \emph{each} of
+them will write out the buffer content at exit. \cuba\ preemptively
+flushes the system buffers already (\Code{fflush(NULL)}) but has no
+control over Fortran's buffers.
+\end{itemize}
+For debugging, or if a malfunction due to concurrency issues is
+suspected, a program should be tested in serial mode first, \eg by
+setting $\Code{CUBACORES} = 0$ (Sect.~\ref{sect:cores}).
+
+%------------------------------------------------------------------------
+
+\subsubsection{Vectorization}
+
+Vectorization means evaluating the integrand function for several points
+at once. This is also known as Single Instruction Multiple Data (SIMD)
+paradigm and is different from ordinary parallelization where
+independent threads are executed concurrently. It is usually possible
+to employ vectorization on top of parallelization.
+
+Vector instructions are commonly available in hardware, \eg on x86
+platforms under acronyms such as SSE or AVX. Language support varies:
+Fortran 90's syntax naturally embeds vector operations. Many C/C++
+compilers offer auto-vectorization options, some have extensions for
+vector data types (usually for a limited set of mathematical functions),
+and even hardware-specific access to the CPU's vector instructions. And
+then there are vectorized libraries of numerical functions available.
+
+\cuba\ cannot automatically vectorize the integrand function, of course,
+but it does pass (up to) \Code{nvec} points per integrand call
+(Sect.~\ref{sect:commonargs}). This value need not correspond to the
+hardware vector length -- computing several points in one call can also
+make sense \eg if the computations have significant intermediate results
+in common. The actual number of points passed is indicated through the
+corresponding \Code{nvec} argument of the integrand.
+
+\medskip
+
+A note for disambiguation: The \Code{nbatch} argument of Vegas is
+related in purpose but not identical to \Code{nvec}. It internally
+partitions the sampling done by Vegas but has no bearing on the number
+of points given to the integrand. On the other hand, it it pointless to
+choose $\Code{nvec} > \Code{nbatch}$ for Vegas.
+
+%========================================================================
+
+\section{Tests and Comparisons}
+\label{sect:tests}
+
+Four integration routines may seem three too many, but as the following
+tests show, all have their strengths and weaknesses. Fine-tuning the
+algorithm parameters can also significantly affect performance.
+
+In the following, the test suite of Genz \cite{Genz} is used. Rather
+than testing individual integrands, Genz proposes the following six
+families of integrands:
+\begin{equation}
+\label{eq:families}
+\begin{array}{ll}
+\text{1. Oscillatory:} &
+ f_1(\dvec x) = \cos(\dvec c\cdot\dvec x + 2\pi w_1)\,, \\[2ex]
+\text{2. Product peak:} &
+ f_2(\dvec x) = \prod\limits_{i = 1}^{n_d}
+ \dfrac 1{(x_i - w_i)^2 + c_i^{-2}}\,, \\[3ex]
+\text{3. Corner peak:} &
+ f_3(\dvec x) = \dfrac 1{(1 + \dvec c\cdot\dvec x)^{n_d + 1}}\,, \\[3ex]
+\text{4. Gaussian:} &
+ f_4(\dvec x) = \exp(-\dvec c^2 (\dvec x - \dvec w)^2)\,, \\[2ex]
+\text{5. $C^0$-continuous:}\quad &
+ f_5(\dvec x) = \exp(-\dvec c\cdot |\dvec x - \dvec w|)\,, \\[2ex]
+\text{6. Discontinuous:} &
+ f_6(\dvec x) = \begin{cases}
+ 0 & \text{for }x_1 > w_1 \vee x_2 > w_2\,, \\
+ \exp(\dvec c\cdot\dvec x) & \text{otherwise}.
+ \end{cases}
+\end{array}
+\end{equation}
+Parameters designated by $w$ are non-affective, they vary \eg the
+location of peaks, but should in principle not affect the difficulty of
+the integral. Parameters designated by $c$ are affective and in a sense
+``define'' the difficulty of the integral, \eg the width of peaks are of
+this kind. The $c_i$ are positive and the difficulty increases with
+$\norm{\dvec c} = \sum_{i = 1}^{n_d} c_i$.
+
+The testing procedure is thus: Choose uniform random numbers from
+$[0,1)$ for the $c_i$ and $w_i$. Renormalize $\dvec c$ for a given
+difficulty. Run the algorithms with the integrands thus determined.
+Repeat this procedure 20 times and take the average.
+
+For comparison, Mathematica's \Code{NIntegrate} function was included
+in the test. Unfortunately, when a maximum number of samples is
+prescribed, \Code{NIntegrate} invariably uses non-adaptive methods, by
+default the Halton--Hammersley--Wozniakowski quasi-Monte Carlo
+algorithm. The comparison may thus seem not quite balanced, but this is
+not entirely true: Lacking an upper bound on the number of integrand
+evaluations, \Code{NIntegrate}'s adaptive method in some cases `locks
+up' (spends an inordinate amount of time and samples) and the user can
+at most abort a running calculation, but not extract a preliminary
+result. The adaptive method could reasonably be used only for some of
+the integrand families in the test, and it was felt that such a
+selection should not be done, as the comparisons should in the first
+place give an idea about the \emph{average} performance of the
+integration methods, without any fine-tuning.
+
+Table \ref{tab:comp} gives the results of the tests as described above.
+This comparison chart should be interpreted with care, however, and
+serves only as a rough measure of the performance of the integration
+methods. Many integrands appearing in actual calculations bear few or
+no similarities with the integrand families tested here, and neither
+have the integration parameters been tuned to `get the most' out of each
+method.
+
+The Mathematica code of the test suite is included in the downloadable
+\cuba\ package.
+
+\begin{table}
+$$
+\begin{array}{|c|r@{\,\pm\,}r|r@{\,\pm\,}r|r@{\,\pm\,}r
+ |r@{\,\pm\,}r|r@{\,\pm\,}r|}
+\multicolumn{11}{c}{n_d = 5} \\ \hline
+j &
+\multicolumn{2}{|c|}{\text{Vegas}} &
+\multicolumn{2}{|c|}{\text{Suave}} &
+\multicolumn{2}{|c|}{\text{Divonne}} &
+\multicolumn{2}{|c|}{\text{Cuhre}} &
+\multicolumn{2}{|c|}{\text{NIntegrate}} \\ \hline
+1 & 162000 & 0 &
+ 127300 & 32371 &
+ 21313 & 11039 &
+ 819 & 0 &
+ 218281 & 0 \\
+2 & 11750 & 1795 &
+ 13500 & 1539 &
+ 17353 & 3743 &
+ 56238 & 40917 &
+ 218281 & 0 \\
+3 & 16125 & 2411 &
+ 11500 & 1000 &
+ 17208 & 2517 &
+ 1174 & 444 &
+ 218281 & 0 \\
+4 & 56975 & 11372 &
+ 20100 & 4745 &
+ 19636 & 6159 &
+ 22577 & 31424 &
+ 218281 & 0 \\
+5 & 14600 & 3085 &
+ 15250 & 2337 &
+ 21675 & 4697 &
+ 150423 & 0 &
+ 218281 & 0 \\
+6 & 19750 & 4999 &
+ 23850 & 2700 &
+ 39694 & 14001 &
+ 1884 & 215 &
+ 218281 & 0 \\ \hline
+\multicolumn{11}{c}{} \\
+\multicolumn{11}{c}{n_d = 8} \\ \hline
+j &
+\multicolumn{2}{|c|}{\text{Vegas}} &
+\multicolumn{2}{|c|}{\text{Suave}} &
+\multicolumn{2}{|c|}{\text{Divonne}} &
+\multicolumn{2}{|c|}{\text{Cuhre}} &
+\multicolumn{2}{|c|}{\text{NIntegrate}} \\ \hline
+1 & 153325 & 20274 &
+ 124350 & 35467 &
+ 28463 & 31646 &
+ 3315 & 0 &
+ 212939 & 13557 \\
+2 & 12650 & 1987 &
+ 21050 & 4594 &
+ 22030 & 3041 &
+ 91826 & 58513 &
+ 218281 & 0 \\
+3 & 24325 & 3753 &
+ 29350 & 3588 &
+ 67104 & 16906 &
+ 18785 & 22354 &
+ 218281 & 0 \\
+4 & 38575 & 16169 &
+ 29250 & 8873 &
+ 24849 & 5015 &
+ 62322 & 44328 &
+ 218281 & 0 \\
+5 & 15150 & 2616 &
+ 25500 & 6444 &
+ 32885 & 5945 &
+ 151385 & 0 &
+ 218281 & 0 \\
+6 & 18875 & 2512 &
+ 40900 & 7196 &
+ 116744 & 32533 &
+ 9724 & 9151 &
+ 218281 & 0 \\ \hline
+\multicolumn{11}{c}{} \\
+\multicolumn{11}{c}{n_d = 10} \\ \hline
+j &
+\multicolumn{2}{|c|}{\text{Vegas}} &
+\multicolumn{2}{|c|}{\text{Suave}} &
+\multicolumn{2}{|c|}{\text{Divonne}} &
+\multicolumn{2}{|c|}{\text{Cuhre}} &
+\multicolumn{2}{|c|}{\text{NIntegrate}} \\ \hline
+1 & 156050 & 21549 &
+ 129800 & 30595 &
+ 32176 & 30424 &
+ 7815 & 0 &
+ 214596 & 16481 \\
+2 & 14175 & 2672 &
+ 24800 & 5464 &
+ 25684 & 7582 &
+ 144056 & 25983 &
+ 218281 & 0 \\
+3 & 30275 & 6296 &
+ 51150 & 15608 &
+ 139737 & 18505 &
+ 109150 & 58224 &
+ 218281 & 0 \\
+4 & 29475 & 10277 &
+ 34050 & 10200 &
+ 27385 & 8498 &
+ 105763 & 49789 &
+ 218281 & 0 \\
+5 & 16150 & 2791 &
+ 31400 & 7715 &
+ 44393 & 18654 &
+ 153695 & 0 &
+ 218281 & 0 \\
+6 & 22100 & 3085 &
+ 74900 & 32203 &
+ 136508 & 17067 &
+ 73200 & 64621 &
+ 218281 & 0 \\ \hline
+\end{array}
+$$
+Test parameters:
+\begin{itemize}
+\item number of dimensions: $n_d = 5, 8, 10$,
+\item requested relative accuracy: $\epsrel = 10^{-3}$,
+\item maximum number of samples: $\nmax = 150000$,
+\item integrand difficulties:
+$
+\begin{array}{r||c|c|c|c|c|c}
+\text{Integrand family }j & 1 & 2 & 3 & 4 & 5 & 6 \\
+\hline
+\norm{\dvec c_j} & 6.0 & 18.0 & 2.2 & 15.2 & 16.1 & 16.4
+\end{array}
+$
+\end{itemize}
+
+\caption{\label{tab:comp}The number of samples used, averaged from 20
+randomly chosen integrands from each integrand family $j$ defined in
+Eq.~(\ref{eq:families}). Values in the vicinity of $\nmax$ generally
+indicate failure to converge. \Code{NIntegrate} seems not to be able
+to stop at around the limit of \Code{MaxPoints -> $\nmax$}, but always
+samples considerably more points.}
+\end{table}
+
+%========================================================================
+
+\section{Summary}
+
+The \cuba\ library offers a choice of four independent routines for
+multidimensional numerical integration: Vegas, Suave, Divonne, and
+Cuhre. They work by very different methods, summarized in the following
+table:
+\begin{center}
+\begin{small}
+\begin{tabular}{llll}
+Routine &
+ Basic integration method &
+ Algorithm type &
+ Variance reduction \\ \hline \\[-1.5ex]
+Vegas &
+ Sobol quasi-random sample &
+ Monte Carlo &
+ importance sampling \\
+&
+ \textit{or} pseudo-random sample &
+ Monte Carlo \\[1.5ex]
+Suave &
+ Sobol quasi-random sample &
+ Monte Carlo &
+ globally adaptive subdivision \\
+&
+ \textit{or} pseudo-random sample &
+ Monte Carlo \\[1.5ex]
+Divonne &
+ Korobov quasi-random sample &
+ Monte Carlo &
+ stratified sampling, \\
+&
+ \textit{or} Sobol quasi-random sample &
+ Monte Carlo &
+ \quad aided by methods from \\
+&
+ \textit{or} pseudo-random sample &
+ Monte Carlo &
+ \quad numerical optimization \\
+&
+ \textit{or} cubature rules &
+ deterministic \\[1.5ex]
+Cuhre &
+ cubature rules &
+ deterministic &
+ globally adaptive subdivision
+\end{tabular}
+\end{small}
+\end{center}
+
+All four have a C/C++, Fortran, and Mathematica interface and can
+integrate vector integrands. Their invocation is very similar, so it is
+easy to substitute one method by another for cross-checking. For
+further safeguarding, the output is supplemented by a $\chi^2$
+probability which quantifies the reliability of the error estimate.
+
+The source code is available from \Code{http://feynarts.de/cuba}
+and compiles with gcc, the GNU C compiler. The C functions can be
+called from Fortran directly, so there is no need for adapter code.
+Similarly, linking Fortran code with the library is straightforward
+and requires no extra tools.
+
+The routines in the \cuba\ library have all been carefully tested, but
+it would of course be folly to believe they are completely error-free.
+The author welcomes any kind of feedback, in particular bug and
+performance reports, at hahn@feynarts.de.
+
+%========================================================================
+
+\section*{Acknowledgements}
+
+I thank A.~Hoang for involving me in a discussion out of which the
+concept of the Mathematica interface was born and T.~Fritzsche,
+M.~Rauch, and A.M.~de~la~Ossa for testing. B.~Chokoufe implemented
+check-pointing (state file) for Suave, Divonne, and Cuhre.
+
+%========================================================================
+
+\begin{appendix}
+
+\section{Shared Memory in Fortran}
+\label{app:shm}
+
+IPC shared memory is not natively available in Fortran, but it is not
+difficult to make it available using two small C functions
+\Code{shmalloc} and \Code{shmfree}:
+\begin{verbatim}
+#include <sys/shm.h>
+#include <assert.h>
+
+typedef long long int memindex;
+typedef struct { void *addr; int id; } shminfo;
+
+void shmalloc_(shminfo *base, memindex *i, const int *n, const int *size) {
+ base->id = shmget(IPC_PRIVATE, *size*(*n + 1) - 1, IPC_CREAT | 0600);
+ assert(base->id != -1);
+ base->addr = shmat(base->id, NULL, 0);
+ assert(base->addr != (void *)-1);
+ *i = ((char *)(base->addr + *size - 1) - (char *)base)/(long)*size;
+}
+
+void shmfree_(shminfo *base) {
+ shmdt(base->addr);
+ shmctl(base->id, IPC_RMID, NULL);
+}
+\end{verbatim}
+The function \Code{shmalloc} allocates (suitably aligned) \Code{n}
+elements of size \Code{size} and returns a mock index into \Code{base},
+through which the memory is addressed in Fortran. The array \Code{base}
+must be of the desired type and large enough to store the struct
+\Code{shminfo}, \eg two doubles wide. Be careful to invoke
+\Code{shmfree} after use, for the memory will not automatically be freed
+upon exit but stay allocated until the next reboot (or explicit removal
+with \Code{ipcs}).
+
+The following test program demonstrates how to use \Code{shmalloc} and
+\Code{shmfree}:
+\begin{verbatim}
+ program test
+ implicit none
+ integer*8 i
+ double precision base(2)
+
+ call shmalloc(base, i, 100, 8) ! allocate 100 doubles
+
+ base(i) = 1 ! now use the memory
+ ...
+ base(i+99) = 100
+
+ call shmfree(base) ! don't forget to free it
+ end
+\end{verbatim}
+
+\end{appendix}
+
+%========================================================================
+
+\begin{thebibliography}{99}
+
+\newcommand{\volyearpage}[3]{\textbf{#1} (#2) #3}
+\newcommand{\cpc}{\textsl{Comp.\ Phys.\ Commun.} \volyearpage}
+\newcommand{\jpc}{\textsl{J.\ Comp.\ Phys.} \volyearpage}
+\newcommand{\cip}{\textsl{Comp.\ in Phys.} \volyearpage}
+\newcommand{\toms}{\textsl{ACM Trans.\ Math.\ Software} \volyearpage}
+\newcommand{\tomacs}{\textsl{ACM Trans.\ Modeling Comp.\ Simulation} \volyearpage}
+\newcommand{\siam}{\textsl{SIAM J.\ Numer.\ Anal.} \volyearpage}
+\newcommand{\numa}{\textsl{Numer.\ Math.} \volyearpage}
+
+\bibitem{quadpack}
+R.~Piessens, E.~de~Doncker, C.~\"Uberhuber, D.~Kahaner,
+\textsc{Quadpack} -- a subroutine package for automatic integration,
+Springer-Verlag, 1983.
+
+\bibitem{Vegas1}
+G.P.~Lepage, \jpc{27}{1978}{192}.
+
+\bibitem{Vegas2}
+G.P.~Lepage, Report CLNS-80/447, Cornell Univ., Ithaca, N.Y., 1980.
+
+\bibitem{Miser}
+W.H.~Press, G.R.~Farrar, \cip{4}{1990}{190}.
+
+\bibitem{Divonne}
+J.H.~Friedman, M.H.~Wright, \toms{7}{1981}{76}; \\
+J.H.~Friedman, M.H.~Wright, SLAC Report CGTM-193-REV, CGTM-193, 1981.
+
+\bibitem{dcuhre}
+J.~Berntsen, T.~Espelid, A.~Genz, \toms{17}{1991}{437}; \\
+J.~Berntsen, T.~Espelid, A.~Genz, \toms{17}{1991}{452}; \\
+TOMS algorithm 698.
+
+\bibitem{Sobol}
+P.~Bratley, B.L.~Fox, \toms{14}{1988}{88}; \\
+TOMS algorithm 659.
+
+\bibitem{Niederreiter}
+H.~Niederreiter, Random number generation and quasi-Monte Carlo methods,
+SIAM, 1992.
+
+\bibitem{NumRecipes}
+W.H.~Press, S.A.~Teukolsky, W.T.~Vetterling, B.P.~Flannery, Numerical
+recipes in Fortran, 2$^{\text{nd}}$ edition, Cambridge University Press,
+1992.
+
+\bibitem{Korobov}
+N.M.~Korobov, Number theoretic methods in approximate analysis
+(in Russian), Fizmatgiz, Moscow, 1963.
+
+A comprehensive English reference on the topic of good lattice points
+(of which the Korobov points are a special case) is H.L.~Keng, W.~Yuan,
+Applications of number theory to numerical analysis, Springer-Verlag,
+1981.
+
+\bibitem{MersenneTwister}
+M.~Matsumoto, T.~Nishimura, \tomacs{8}{1998}{3}. \\
+See also
+\Code{http://www.math.sci.hiroshima-u.ac.jp/$\sim$m-mat/MT/emt.html}.
+
+\bibitem{Ranlux}
+M.~L\"uscher, \cpc{79}{1994}{100}; \\
+F.~James, \cpc{79}{1994}{111}.
+
+\bibitem{GenzMalik}
+A.~Genz, A.~Malik, \siam{20}{1983}{580}.
+
+\bibitem{Genz}
+A.~Genz, A package for testing multiple integration subroutines, in:
+P.~Keast, G.~Fairweather (eds.), Numerical Integration, Kluwer,
+Dordrecht, 1986.
+
+\end{thebibliography}
+
+\end{document}
+
Index: trunk/cuba/makefile
===================================================================
--- trunk/cuba/makefile (revision 0)
+++ trunk/cuba/makefile (revision 159)
@@ -0,0 +1,354 @@
+CC = gcc
+SUFFIX =
+CFLAGS = -O3 -fomit-frame-pointer -ffast-math -Wall -DHAVE_CONFIG_H -DREALSIZE=8 -I$(common) -I. -I$(srcdir)
+MCFLAGS =
+FC = gfortran
+FCFLAGS = -g -O2 -DREALSIZE=8
+LIBS = -lm
+INSTALL = /usr/bin/install -c
+INSTALL_DATA = ${INSTALL} -m 644
+INSTALL_PROGRAM = ${INSTALL}
+RANLIB = ranlib
+EXE =
+
+prefix = /usr/local
+exec_prefix = ${prefix}
+srcdir = .
+bindir = ${exec_prefix}/bin
+libdir = ${exec_prefix}/lib
+includedir = ${prefix}/include
+datarootdir = ${prefix}/share
+datadir = ${datarootdir}
+
+MATH_DEFAULT =
+TOOLS_DEFAULT =
+DEMO_FORTRAN_DEFAULT = demo-fortran$(EXE)
+
+MCC = CC="$(tools)/fcc" CXX="$(tools)/fcc -stdlib=libstdc++" \
+ REALCC="$(CC)" PATH="$(PATH):$(tools)" mcc
+
+TARDIR = Cuba-4.2
+TARFILE = $(TARDIR).tar.gz
+
+
+HEADERS = cuba$(SUFFIX).h
+LIB = libcuba$(SUFFIX).a
+MATH = Vegas$(SUFFIX)$(EXE) Suave$(SUFFIX)$(EXE) Divonne$(SUFFIX)$(EXE) Cuhre$(SUFFIX)$(EXE)
+TOOLS = partview$(EXE)
+
+
+all: lib demos $(MATH_DEFAULT) $(TOOLS_DEFAULT)
+
+lib: $(LIB) $(HEADERS)
+
+demos: demo-c$(EXE) $(DEMO_FORTRAN_DEFAULT)
+
+math: $(MATH)
+
+tools: $(TOOLS)
+
+
+install: lib $(TOOLS_DEFAULT)
+ $(INSTALL) -m 755 -d $(DESTDIR)$(libdir) \
+ $(DESTDIR)$(includedir) \
+ $(DESTDIR)$(bindir) \
+ $(DESTDIR)$(datadir)
+ $(INSTALL_DATA) $(LIB) $(DESTDIR)$(libdir)
+ for f in $(HEADERS) ; do \
+ $(INSTALL_DATA) `test -f $$f || echo $(srcdir)/`$$f $(DESTDIR)$(includedir); \
+ done
+ for f in $(MATH) $(TOOLS) ; do \
+ test -f $$f && $(INSTALL_PROGRAM) $$f $(DESTDIR)$(bindir) || : ; \
+ done
+ $(INSTALL_DATA) $(srcdir)/cuba.pdf $(DESTDIR)$(datadir)
+
+
+check: demo-c
+ ./demo-c | grep RESULT > demo-c.out
+ @echo diff demo-c.out $(demo)/demo-c.out
+ @diff demo-c.out $(demo)/demo-c.out || \
+ echo "Note: This is serious only if the results deviate significantly."
+
+.SUFFIXES:
+.SUFFIXES: .c .f .tm
+
+common = $(srcdir)/src/common
+vegas = $(srcdir)/src/vegas
+suave = $(srcdir)/src/suave
+divonne = $(srcdir)/src/divonne
+cuhre = $(srcdir)/src/cuhre
+demo = $(srcdir)/demo
+tools = $(srcdir)/tools
+
+
+COMMON_DEPS = $(common)/stddecl.h $(common)/ChiSquare.c $(common)/Erf.c
+COMMON_CDEPS = $(COMMON_DEPS) $(common)/CSample.c $(common)/Parallel.c $(common)/sock.h
+COMMON_TMDEPS = $(COMMON_DEPS) $(common)/MSample.c
+
+VEGAS_C = $(vegas)/Vegas.c
+VEGAS_TM = $(vegas)/Vegas.tm
+VEGAS_DEPS = $(common)/Random.c \
+ $(vegas)/decl.h $(vegas)/common.c \
+ $(vegas)/Grid.c $(vegas)/Integrate.c
+VEGAS = $(VEGAS_C) $(VEGAS_TM) $(VEGAS_DEPS)
+
+$(LIB)(Vegas.o): config.h $(VEGAS_C) $(VEGAS_DEPS) $(COMMON_CDEPS)
+ $(CC) $(CFLAGS) -I$(vegas) -DNOUNDERSCORE -c -o Vegas.o $(VEGAS_C)
+ $(AR) $(ARFLAGS) $(LIB) Vegas.o
+ $(RM) Vegas.o
+
+$(LIB)(llVegas.o): config.h $(VEGAS_C) $(VEGAS_DEPS) $(COMMON_CDEPS)
+ $(CC) $(CFLAGS) -I$(vegas) -DLONGLONGINT -DNOUNDERSCORE -c -o llVegas.o $(VEGAS_C)
+ $(AR) $(ARFLAGS) $(LIB) llVegas.o
+ $(RM) llVegas.o
+
+$(LIB)(Vegas_.o): config.h $(VEGAS_C) $(VEGAS_DEPS) $(COMMON_CDEPS)
+ $(CC) $(CFLAGS) -I$(vegas) -c -o Vegas_.o $(VEGAS_C)
+ $(AR) $(ARFLAGS) $(LIB) Vegas_.o
+ $(RM) Vegas_.o
+
+$(LIB)(llVegas_.o): config.h $(VEGAS_C) $(VEGAS_DEPS) $(COMMON_CDEPS)
+ $(CC) $(CFLAGS) -I$(vegas) -DLONGLONGINT -c -o llVegas_.o $(VEGAS_C)
+ $(AR) $(ARFLAGS) $(LIB) llVegas_.o
+ $(RM) llVegas_.o
+
+Vegas$(EXE): config.h $(VEGAS_TM) $(VEGAS_DEPS) $(COMMON_TMDEPS)
+ $(MCC) $(MCFLAGS) $(CFLAGS) -I$(vegas) -o Vegas$(EXE) $(VEGAS_TM)
+ strip Vegas$(EXE)
+
+Vegasl$(EXE): config.h $(VEGAS_TM) $(VEGAS_DEPS) $(COMMON_TMDEPS)
+ sed '/:Begin:/,/:End:/ s/Real64/Real128/g' $(VEGAS_TM) > Vegasl.tm
+ $(MCC) $(MCFLAGS) $(CFLAGS) -I$(vegas) -o Vegasl$(EXE) Vegasl.tm
+ strip Vegasl$(EXE)
+ $(RM) Vegasl.tm
+
+Vegasq$(EXE):
+
+
+SUAVE_C = $(suave)/Suave.c
+SUAVE_TM = $(suave)/Suave.tm
+SUAVE_DEPS = $(common)/Random.c \
+ $(suave)/decl.h $(suave)/common.c \
+ $(suave)/Grid.c $(suave)/Fluct.c $(suave)/Sample.c \
+ $(suave)/Integrate.c
+SUAVE = $(SUAVE_C) $(SUAVE_TM) $(SUAVE_DEPS)
+
+$(LIB)(Suave.o): config.h $(SUAVE_C) $(SUAVE_DEPS) $(COMMON_CDEPS)
+ $(CC) $(CFLAGS) -I$(suave) -DNOUNDERSCORE -c -o Suave.o $(SUAVE_C)
+ $(AR) $(ARFLAGS) $(LIB) Suave.o
+ $(RM) Suave.o
+
+$(LIB)(llSuave.o): config.h $(SUAVE_C) $(SUAVE_DEPS) $(COMMON_CDEPS)
+ $(CC) $(CFLAGS) -I$(suave) -DLONGLONGINT -DNOUNDERSCORE -c -o llSuave.o $(SUAVE_C)
+ $(AR) $(ARFLAGS) $(LIB) llSuave.o
+ $(RM) llSuave.o
+
+$(LIB)(Suave_.o): config.h $(SUAVE_C) $(SUAVE_DEPS) $(COMMON_CDEPS)
+ $(CC) $(CFLAGS) -I$(suave) -c -o Suave_.o $(SUAVE_C)
+ $(AR) $(ARFLAGS) $(LIB) Suave_.o
+ $(RM) Suave_.o
+
+$(LIB)(llSuave_.o): config.h $(SUAVE_C) $(SUAVE_DEPS) $(COMMON_CDEPS)
+ $(CC) $(CFLAGS) -I$(suave) -DLONGLONGINT -c -o llSuave_.o $(SUAVE_C)
+ $(AR) $(ARFLAGS) $(LIB) llSuave_.o
+ $(RM) llSuave_.o
+
+Suave$(EXE): config.h $(SUAVE_TM) $(SUAVE_DEPS) $(COMMON_TMDEPS)
+ $(MCC) $(MCFLAGS) $(CFLAGS) -I$(suave) -o Suave$(EXE) $(SUAVE_TM)
+ strip Suave$(EXE)
+
+Suavel$(EXE): config.h $(SUAVE_TM) $(SUAVE_DEPS) $(COMMON_TMDEPS)
+ sed '/:Begin:/,/:End:/ s/Real64/Real128/g' $(SUAVE_TM) > Suavel.tm
+ $(MCC) $(MCFLAGS) $(CFLAGS) -I$(suave) -o Suavel$(EXE) Suavel.tm
+ strip Suavel$(EXE)
+ $(RM) Suavel.tm
+
+Suaveq$(EXE):
+
+
+DIVONNE_C = $(divonne)/Divonne.c
+DIVONNE_TM = $(divonne)/Divonne.tm
+DIVONNE_DEPS = $(common)/Random.c \
+ $(divonne)/decl.h $(divonne)/common.c \
+ $(divonne)/KorobovCoeff.c $(divonne)/Rule.c $(divonne)/Sample.c \
+ $(divonne)/FindMinimum.c $(divonne)/Iterate.c $(divonne)/Explore.c \
+ $(divonne)/Split.c $(divonne)/Integrate.c
+DIVONNE = $(DIVONNE_C) $(DIVONNE_TM) $(DIVONNE_DEPS)
+
+$(LIB)(Divonne.o): config.h $(DIVONNE_C) $(DIVONNE_DEPS) $(COMMON_CDEPS)
+ $(CC) $(CFLAGS) -I$(divonne) -DNOUNDERSCORE -c -o Divonne.o $(DIVONNE_C)
+ $(AR) $(ARFLAGS) $(LIB) Divonne.o
+ $(RM) Divonne.o
+
+$(LIB)(llDivonne.o): config.h $(DIVONNE_C) $(DIVONNE_DEPS) $(COMMON_CDEPS)
+ $(CC) $(CFLAGS) -I$(divonne) -DLONGLONGINT -DNOUNDERSCORE -c -o llDivonne.o $(DIVONNE_C)
+ $(AR) $(ARFLAGS) $(LIB) llDivonne.o
+ $(RM) llDivonne.o
+
+$(LIB)(Divonne_.o): config.h $(DIVONNE_C) $(DIVONNE_DEPS) $(COMMON_CDEPS)
+ $(CC) $(CFLAGS) -I$(divonne) -c -o Divonne_.o $(DIVONNE_C)
+ $(AR) $(ARFLAGS) $(LIB) Divonne_.o
+ $(RM) Divonne_.o
+
+$(LIB)(llDivonne_.o): config.h $(DIVONNE_C) $(DIVONNE_DEPS) $(COMMON_CDEPS)
+ $(CC) $(CFLAGS) -I$(divonne) -DLONGLONGINT -c -o llDivonne_.o $(DIVONNE_C)
+ $(AR) $(ARFLAGS) $(LIB) llDivonne_.o
+ $(RM) llDivonne_.o
+
+Divonne$(EXE): config.h $(DIVONNE_TM) $(DIVONNE_DEPS) $(COMMON_TMDEPS)
+ $(MCC) $(MCFLAGS) $(CFLAGS) -I$(divonne) -o Divonne$(EXE) $(DIVONNE_TM)
+ strip Divonne$(EXE)
+
+Divonnel$(EXE): config.h $(DIVONNE_TM) $(DIVONNE_DEPS) $(COMMON_TMDEPS)
+ sed '/:Begin:/,/:End:/ s/Real64/Real128/g' $(DIVONNE_TM) > Divonnel.tm
+ $(MCC) $(MCFLAGS) $(CFLAGS) -I$(divonne) -o Divonnel$(EXE) Divonnel.tm
+ strip Divonnel$(EXE)
+ $(RM) Divonnel.tm
+
+Divonneq$(EXE):
+
+
+CUHRE_C = $(cuhre)/Cuhre.c
+CUHRE_TM = $(cuhre)/Cuhre.tm
+CUHRE_DEPS = \
+ $(cuhre)/decl.h $(cuhre)/common.c \
+ $(cuhre)/Rule.c $(cuhre)/Integrate.c
+CUHRE = $(CUHRE_C) $(CUHRE_TM) $(CUHRE_DEPS)
+
+$(LIB)(Cuhre.o): config.h $(CUHRE_C) $(CUHRE_DEPS) $(COMMON_CDEPS)
+ $(CC) $(CFLAGS) -I$(cuhre) -DNOUNDERSCORE -c -o Cuhre.o $(CUHRE_C)
+ $(AR) $(ARFLAGS) $(LIB) Cuhre.o
+ $(RM) Cuhre.o
+
+$(LIB)(llCuhre.o): config.h $(CUHRE_C) $(CUHRE_DEPS) $(COMMON_CDEPS)
+ $(CC) $(CFLAGS) -I$(cuhre) -DLONGLONGINT -DNOUNDERSCORE -c -o llCuhre.o $(CUHRE_C)
+ $(AR) $(ARFLAGS) $(LIB) llCuhre.o
+ $(RM) llCuhre.o
+
+$(LIB)(Cuhre_.o): config.h $(CUHRE_C) $(CUHRE_DEPS) $(COMMON_CDEPS)
+ $(CC) $(CFLAGS) -I$(cuhre) -c -o Cuhre_.o $(CUHRE_C)
+ $(AR) $(ARFLAGS) $(LIB) Cuhre_.o
+ $(RM) Cuhre_.o
+
+$(LIB)(llCuhre_.o): config.h $(CUHRE_C) $(CUHRE_DEPS) $(COMMON_CDEPS)
+ $(CC) $(CFLAGS) -I$(cuhre) -DLONGLONGINT -c -o llCuhre_.o $(CUHRE_C)
+ $(AR) $(ARFLAGS) $(LIB) llCuhre_.o
+ $(RM) llCuhre_.o
+
+Cuhre$(EXE): config.h $(CUHRE_TM) $(CUHRE_DEPS) $(COMMON_TMDEPS)
+ $(MCC) $(MCFLAGS) $(CFLAGS) -I$(cuhre) -o Cuhre$(EXE) $(CUHRE_TM)
+ strip Cuhre$(EXE)
+
+Cuhrel$(EXE): config.h $(CUHRE_TM) $(CUHRE_DEPS) $(COMMON_TMDEPS)
+ sed '/:Begin:/,/:End:/ s/Real64/Real128/g' $(CUHRE_TM) > Cuhrel.tm
+ $(MCC) $(MCFLAGS) $(CFLAGS) -I$(cuhre) -o Cuhrel$(EXE) Cuhrel.tm
+ strip Cuhrel$(EXE)
+ $(RM) Cuhrel.tm
+
+Cuhreq$(EXE):
+
+
+$(LIB)(Fork.o): $(common)/Fork.c $(common)/stddecl.h $(common)/sock.h
+ $(CC) $(CFLAGS) -DNOUNDERSCORE -c -o Fork.o $(common)/Fork.c
+ $(AR) $(ARFLAGS) $(LIB) Fork.o
+ $(RM) Fork.o
+
+$(LIB)(Fork_.o): $(common)/Fork.c $(common)/stddecl.h $(common)/sock.h
+ $(CC) $(CFLAGS) -c -o Fork_.o $(common)/Fork.c
+ $(AR) $(ARFLAGS) $(LIB) Fork_.o
+ $(RM) Fork_.o
+
+
+$(LIB)(Global.o): $(common)/Global.c $(common)/stddecl.h
+ $(CC) $(CFLAGS) -DNOUNDERSCORE -c -o Global.o $(common)/Global.c
+ $(AR) $(ARFLAGS) $(LIB) Global.o
+ $(RM) Global.o
+
+$(LIB)(Global_.o): $(common)/Global.c $(common)/stddecl.h
+ $(CC) $(CFLAGS) -c -o Global_.o $(common)/Global.c
+ $(AR) $(ARFLAGS) $(LIB) Global_.o
+ $(RM) Global_.o
+
+
+$(LIB)(Data.o): $(common)/Data.c $(common)/stddecl.h
+ $(CC) $(CFLAGS) -c -o Data.o $(common)/Data.c
+ $(AR) $(ARFLAGS) $(LIB) Data.o
+ $(RM) Data.o
+
+
+$(LIB): $(LIB)(Vegas.o) $(LIB)(Vegas_.o) \
+ $(LIB)(llVegas.o) $(LIB)(llVegas_.o) \
+ $(LIB)(Suave.o) $(LIB)(Suave_.o) \
+ $(LIB)(llSuave.o) $(LIB)(llSuave_.o) \
+ $(LIB)(Divonne.o) $(LIB)(Divonne_.o) \
+ $(LIB)(llDivonne.o) $(LIB)(llDivonne_.o) \
+ $(LIB)(Cuhre.o) $(LIB)(Cuhre_.o) \
+ $(LIB)(llCuhre.o) $(LIB)(llCuhre_.o) \
+ $(LIB)(Fork.o) $(LIB)(Fork_.o) \
+ $(LIB)(Global.o) $(LIB)(Global_.o) \
+ $(LIB)(Data.o)
+ -$(RANLIB) $(LIB)
+
+
+cubal.h: cuba.h
+ sed 's/double/long double/g' cuba.h > cubal.h
+
+cubaq.h: cuba.h
+ sed 's/double/__float128/g' cuba.h > cubaq.h
+
+
+DEMO_F = $(demo)/demo-fortran.F
+DEMO_C = $(demo)/demo-c.c
+DEMO_TM = $(demo)/demo-math.m $(demo)/testsuite.m
+DEMO = $(DEMO_F) $(DEMO_C) $(DEMO_TM) $(demo)/demo-c.out $(demo)/cuba.F
+
+demo-fortran$(EXE): $(DEMO_F) $(LIB)
+ $(FC) $(FCFLAGS) -o demo-fortran$(EXE) $(DEMO_F) $(LIB) $(LIBS)
+
+demo-c$(EXE): $(DEMO_C) $(srcdir)/cuba.h $(LIB)
+ $(CC) $(CFLAGS) -o demo-c$(EXE) $(DEMO_C) $(LIB) $(LIBS)
+
+
+PARTVIEW = $(tools)/partview.cpp $(tools)/partview.pro \
+ $(tools)/quit.xpm $(tools)/print.xpm
+
+partview$(EXE): $(PARTVIEW)
+ qmake -o makefile.partview $(tools)/partview.pro
+ $(MAKE) -f makefile.partview
+ $(RM) partview.o partview.moc makefile.partview
+ -strip partview$(EXE)
+
+
+TARCONTENTS = $(srcdir)/COPYING $(srcdir)/ChangeLog \
+ $(srcdir)/configure $(srcdir)/configure.ac \
+ $(srcdir)/config.sub $(srcdir)/config.guess $(srcdir)/install-sh \
+ $(srcdir)/makefile.in $(srcdir)/config.h.in \
+ $(srcdir)/cuba.pdf $(srcdir)/cuba.tex $(srcdir)/cuba.h \
+ $(COMMON_CDEPS) $(COMMON_TMDEPS) \
+ $(common)/Global.c $(common)/Fork.c $(common)/Data.c \
+ $(VEGAS) $(SUAVE) $(DIVONNE) $(divonne)/KorobovCoeff.c-* $(CUHRE) \
+ $(DEMO) $(PARTVIEW) $(tools)/partview.m \
+ $(tools)/mcc $(tools)/fcc $(tools)/mkstatic $(tools)/mkdist.c
+
+dist:
+ mkdist cvfz $(TARFILE) $(TARDIR) \
+ $(patsubst $(srcdir)/%,%, $(sort $(TARCONTENTS)))
+
+# ln -s . $(TARDIR)
+# tar cvfz $(TARFILE) --owner=root --group=root \
+# $(patsubst $(srcdir)/%,$(TARDIR)/%, $(sort $(TARCONTENTS)))
+# $(RM) $(TARDIR)
+
+pub: dist
+ mv -f $(TARFILE) web/
+ ./mkwebpage
+
+clean:
+ -$(RM) $(TARFILE) $(TARDIR) demo-c.out \
+ partview.moc partview.o makefile.partview \
+ cubal.h cubaq.h *.o */*.o */*.tm.c *.tm
+
+distclean: clean
+ -$(RM) $(LIB) demo-c demo-fortran $(MATH) $(TOOLS) \
+ config.h config.log config.status makefile
+
Index: trunk/cuba/install-sh
===================================================================
--- trunk/cuba/install-sh (revision 158)
+++ trunk/cuba/install-sh (revision 159)
Property changes on: trunk/cuba/install-sh
___________________________________________________________________
Modified: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/cuba/configure
===================================================================
--- trunk/cuba/configure (revision 158)
+++ trunk/cuba/configure (revision 159)
@@ -1,4788 +1,6043 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.61 for Cuba 2.1.
+# Generated by GNU Autoconf 2.69 for Cuba 4.2.
#
# Report bugs to <hahn@feynarts.de>.
#
-# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
-# 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+#
+# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
+#
+#
# This configure script is free software; the Free Software Foundation
# gives unlimited permission to copy, distribute and modify it.
-## --------------------- ##
-## M4sh Initialization. ##
-## --------------------- ##
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
# Be more Bourne compatible
DUALCASE=1; export DUALCASE # for MKS sh
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
emulate sh
NULLCMD=:
- # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
# is contrary to our usage. Disable this feature.
alias -g '${1+"$@"}'='"$@"'
setopt NO_GLOB_SUBST
else
- case `(set -o) 2>/dev/null` in
- *posix*) set -o posix ;;
+ case `(set -o) 2>/dev/null` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
esac
-
fi
-
-
-# PATH needs CR
-# Avoid depending upon Character Ranges.
-as_cr_letters='abcdefghijklmnopqrstuvwxyz'
-as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
-as_cr_Letters=$as_cr_letters$as_cr_LETTERS
-as_cr_digits='0123456789'
-as_cr_alnum=$as_cr_Letters$as_cr_digits
-
-# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
- echo "#! /bin/sh" >conf$$.sh
- echo "exit 0" >>conf$$.sh
- chmod +x conf$$.sh
- if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
- PATH_SEPARATOR=';'
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='print -r --'
+ as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='printf %s\n'
+ as_echo_n='printf %s'
+else
+ if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+ as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+ as_echo_n='/usr/ucb/echo -n'
else
- PATH_SEPARATOR=:
+ as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+ as_echo_n_body='eval
+ arg=$1;
+ case $arg in #(
+ *"$as_nl"*)
+ expr "X$arg" : "X\\(.*\\)$as_nl";
+ arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+ esac;
+ expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+ '
+ export as_echo_n_body
+ as_echo_n='sh -c $as_echo_n_body as_echo'
fi
- rm -f conf$$.sh
+ export as_echo_body
+ as_echo='sh -c $as_echo_body as_echo'
fi
-# Support unset when possible.
-if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
- as_unset=unset
-else
- as_unset=false
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+ (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+ PATH_SEPARATOR=';'
+ }
fi
# IFS
# We need space, tab and new line, in precisely that order. Quoting is
# there to prevent editors from complaining about space-tab.
# (If _AS_PATH_WALK were called with IFS unset, it would disable word
# splitting by setting IFS to empty value.)
-as_nl='
-'
IFS=" "" $as_nl"
# Find who we are. Look in the path if we contain no directory separator.
-case $0 in
+as_myself=
+case $0 in #((
*[\\/]* ) as_myself=$0 ;;
*) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
- test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
-done
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+ done
IFS=$as_save_IFS
;;
esac
# We did not find ourselves, most probably we were run as `sh COMMAND'
# in which case we are not to be found in the path.
if test "x$as_myself" = x; then
as_myself=$0
fi
if test ! -f "$as_myself"; then
- echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
- { (exit 1); exit 1; }
+ $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ exit 1
fi
-# Work around bugs in pre-3.0 UWIN ksh.
-for as_var in ENV MAIL MAILPATH
-do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there. '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
done
PS1='$ '
PS2='> '
PS4='+ '
# NLS nuisances.
-for as_var in \
- LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
- LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
- LC_TELEPHONE LC_TIME
-do
- if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
- eval $as_var=C; export $as_var
- else
- ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
- fi
-done
-
-# Required to use basename.
-if expr a : '\(a\)' >/dev/null 2>&1 &&
- test "X`expr 00001 : '.*\(...\)'`" = X001; then
- as_expr=expr
-else
- as_expr=false
-fi
-
-if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
- as_basename=basename
-else
- as_basename=false
-fi
-
-
-# Name of the executable.
-as_me=`$as_basename -- "$0" ||
-$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
- X"$0" : 'X\(//\)$' \| \
- X"$0" : 'X\(/\)' \| . 2>/dev/null ||
-echo X/"$0" |
- sed '/^.*\/\([^/][^/]*\)\/*$/{
- s//\1/
- q
- }
- /^X\/\(\/\/\)$/{
- s//\1/
- q
- }
- /^X\/\(\/\).*/{
- s//\1/
- q
- }
- s/.*/./; q'`
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
# CDPATH.
-$as_unset CDPATH
-
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+# Use a proper internal environment variable to ensure we don't fall
+ # into an infinite loop, continuously re-executing ourselves.
+ if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then
+ _as_can_reexec=no; export _as_can_reexec;
+ # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+ *v*x* | *x*v* ) as_opts=-vx ;;
+ *v* ) as_opts=-v ;;
+ *x* ) as_opts=-x ;;
+ * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+as_fn_exit 255
+ fi
+ # We don't want this to propagate to other subprocesses.
+ { _as_can_reexec=; unset _as_can_reexec;}
if test "x$CONFIG_SHELL" = x; then
- if (eval ":") 2>/dev/null; then
- as_have_required=yes
+ as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '\${1+\"\$@\"}'='\"\$@\"'
+ setopt NO_GLOB_SUBST
else
- as_have_required=no
+ case \`(set -o) 2>/dev/null\` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
+esac
fi
-
- if test $as_have_required = yes && (eval ":
-(as_func_return () {
- (exit \$1)
-}
-as_func_success () {
- as_func_return 0
-}
-as_func_failure () {
- as_func_return 1
-}
-as_func_ret_success () {
- return 0
-}
-as_func_ret_failure () {
- return 1
-}
+"
+ as_required="as_fn_return () { (exit \$1); }
+as_fn_success () { as_fn_return 0; }
+as_fn_failure () { as_fn_return 1; }
+as_fn_ret_success () { return 0; }
+as_fn_ret_failure () { return 1; }
exitcode=0
-if as_func_success; then
- :
-else
- exitcode=1
- echo as_func_success failed.
-fi
-
-if as_func_failure; then
- exitcode=1
- echo as_func_failure succeeded.
-fi
-
-if as_func_ret_success; then
- :
+as_fn_success || { exitcode=1; echo as_fn_success failed.; }
+as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
+as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
+as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
+if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
+
+else
+ exitcode=1; echo positional parameters were not saved.
+fi
+test x\$exitcode = x0 || exit 1
+test -x / || exit 1"
+ as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
+ as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
+ eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
+ test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
+test \$(( 1 + 1 )) = 2 || exit 1"
+ if (eval "$as_required") 2>/dev/null; then :
+ as_have_required=yes
else
- exitcode=1
- echo as_func_ret_success failed.
-fi
-
-if as_func_ret_failure; then
- exitcode=1
- echo as_func_ret_failure succeeded.
+ as_have_required=no
fi
+ if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
-if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
- :
else
- exitcode=1
- echo positional parameters were not saved.
-fi
-
-test \$exitcode = 0) || { (exit 1); exit 1; }
-
-(
- as_lineno_1=\$LINENO
- as_lineno_2=\$LINENO
- test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" &&
- test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; }
-") 2> /dev/null; then
- :
-else
- as_candidate_shells=
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
- case $as_dir in
+ as_found=:
+ case $as_dir in #(
/*)
for as_base in sh bash ksh sh5; do
- as_candidate_shells="$as_candidate_shells $as_dir/$as_base"
+ # Try only shells that exist, to save several forks.
+ as_shell=$as_dir/$as_base
+ if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+ { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
+ CONFIG_SHELL=$as_shell as_have_required=yes
+ if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
+ break 2
+fi
+fi
done;;
esac
+ as_found=false
done
+$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
+ { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
+ CONFIG_SHELL=$SHELL as_have_required=yes
+fi; }
IFS=$as_save_IFS
- for as_shell in $as_candidate_shells $SHELL; do
- # Try only shells that exist, to save several forks.
- if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
- { ("$as_shell") 2> /dev/null <<\_ASEOF
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
- emulate sh
- NULLCMD=:
- # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
- # is contrary to our usage. Disable this feature.
- alias -g '${1+"$@"}'='"$@"'
- setopt NO_GLOB_SUBST
-else
- case `(set -o) 2>/dev/null` in
- *posix*) set -o posix ;;
-esac
-
-fi
-
-
-:
-_ASEOF
-}; then
- CONFIG_SHELL=$as_shell
- as_have_required=yes
- if { "$as_shell" 2> /dev/null <<\_ASEOF
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
- emulate sh
- NULLCMD=:
- # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
- # is contrary to our usage. Disable this feature.
- alias -g '${1+"$@"}'='"$@"'
- setopt NO_GLOB_SUBST
-else
- case `(set -o) 2>/dev/null` in
- *posix*) set -o posix ;;
-esac
-
-fi
-
-
-:
-(as_func_return () {
- (exit $1)
-}
-as_func_success () {
- as_func_return 0
-}
-as_func_failure () {
- as_func_return 1
-}
-as_func_ret_success () {
- return 0
-}
-as_func_ret_failure () {
- return 1
-}
-
-exitcode=0
-if as_func_success; then
- :
-else
- exitcode=1
- echo as_func_success failed.
-fi
-
-if as_func_failure; then
- exitcode=1
- echo as_func_failure succeeded.
-fi
-
-if as_func_ret_success; then
- :
-else
- exitcode=1
- echo as_func_ret_success failed.
-fi
-
-if as_func_ret_failure; then
- exitcode=1
- echo as_func_ret_failure succeeded.
-fi
-
-if ( set x; as_func_ret_success y && test x = "$1" ); then
- :
-else
- exitcode=1
- echo positional parameters were not saved.
+ if test "x$CONFIG_SHELL" != x; then :
+ export CONFIG_SHELL
+ # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+ *v*x* | *x*v* ) as_opts=-vx ;;
+ *v* ) as_opts=-v ;;
+ *x* ) as_opts=-x ;;
+ * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+exit 255
+fi
+
+ if test x$as_have_required = xno; then :
+ $as_echo "$0: This script requires a shell more modern than all"
+ $as_echo "$0: the shells that I found on your system."
+ if test x${ZSH_VERSION+set} = xset ; then
+ $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
+ $as_echo "$0: be upgraded to zsh 4.3.4 or later."
+ else
+ $as_echo "$0: Please tell bug-autoconf@gnu.org and hahn@feynarts.de
+$0: about your system, including any error possibly output
+$0: before this message. Then install a modern shell, or
+$0: manually run the script under such a shell if you do
+$0: have one."
+ fi
+ exit 1
fi
-
-test $exitcode = 0) || { (exit 1); exit 1; }
-
-(
- as_lineno_1=$LINENO
- as_lineno_2=$LINENO
- test "x$as_lineno_1" != "x$as_lineno_2" &&
- test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; }
-
-_ASEOF
-}; then
- break
fi
-
fi
+SHELL=${CONFIG_SHELL-/bin/sh}
+export SHELL
+# Unset more variables known to interfere with behavior of common tools.
+CLICOLOR_FORCE= GREP_OPTIONS=
+unset CLICOLOR_FORCE GREP_OPTIONS
- done
+## --------------------- ##
+## M4sh Shell Functions. ##
+## --------------------- ##
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+ { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
- if test "x$CONFIG_SHELL" != x; then
- for as_var in BASH_ENV ENV
- do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
- done
- export CONFIG_SHELL
- exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"}
-fi
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+ return $1
+} # as_fn_set_status
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+ set +e
+ as_fn_set_status $1
+ exit $1
+} # as_fn_exit
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
- if test $as_have_required = no; then
- echo This script requires a shell more modern than all the
- echo shells that I found on your system. Please install a
- echo modern shell, or manually run the script under such a
- echo shell if you do have one.
- { (exit 1); exit 1; }
-fi
+ case $as_dir in #(
+ -*) as_dir=./$as_dir;;
+ esac
+ test -d "$as_dir" || eval $as_mkdir_p || {
+ as_dirs=
+ while :; do
+ case $as_dir in #(
+ *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *) as_qdir=$as_dir;;
+ esac
+ as_dirs="'$as_qdir' $as_dirs"
+ as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ test -d "$as_dir" && break
+ done
+ test -z "$as_dirs" || eval "mkdir $as_dirs"
+ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
-fi
+} # as_fn_mkdir_p
-fi
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+ test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+ eval 'as_fn_append ()
+ {
+ eval $1+=\$2
+ }'
+else
+ as_fn_append ()
+ {
+ eval $1=\$$1\$2
+ }
+fi # as_fn_append
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+ eval 'as_fn_arith ()
+ {
+ as_val=$(( $* ))
+ }'
+else
+ as_fn_arith ()
+ {
+ as_val=`expr "$@" || test $? -eq 1`
+ }
+fi # as_fn_arith
-(eval "as_func_return () {
- (exit \$1)
-}
-as_func_success () {
- as_func_return 0
-}
-as_func_failure () {
- as_func_return 1
-}
-as_func_ret_success () {
- return 0
-}
-as_func_ret_failure () {
- return 1
-}
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+ as_status=$1; test $as_status -eq 0 && as_status=1
+ if test "$4"; then
+ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ fi
+ $as_echo "$as_me: error: $2" >&2
+ as_fn_exit $as_status
+} # as_fn_error
-exitcode=0
-if as_func_success; then
- :
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
else
- exitcode=1
- echo as_func_success failed.
-fi
-
-if as_func_failure; then
- exitcode=1
- echo as_func_failure succeeded.
+ as_expr=false
fi
-if as_func_ret_success; then
- :
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+ as_basename=basename
else
- exitcode=1
- echo as_func_ret_success failed.
-fi
-
-if as_func_ret_failure; then
- exitcode=1
- echo as_func_ret_failure succeeded.
+ as_basename=false
fi
-if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
- :
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+ as_dirname=dirname
else
- exitcode=1
- echo positional parameters were not saved.
+ as_dirname=false
fi
-test \$exitcode = 0") || {
- echo No shell found that supports shell functions.
- echo Please tell autoconf@gnu.org about your system,
- echo including any error possibly output before this
- echo message
-}
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
- as_lineno_1=$LINENO
- as_lineno_2=$LINENO
- test "x$as_lineno_1" != "x$as_lineno_2" &&
- test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
-
- # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
- # uniformly replaced by the line number. The first 'sed' inserts a
- # line-number line after each line using $LINENO; the second 'sed'
- # does the real work. The second script uses 'N' to pair each
- # line-number line with the line containing $LINENO, and appends
- # trailing '-' during substitution so that $LINENO is not a special
- # case at line end.
- # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
- # scripts with optimization help from Paolo Bonzini. Blame Lee
- # E. McMahon (1931-1989) for sed's syntax. :-)
+ as_lineno_1=$LINENO as_lineno_1a=$LINENO
+ as_lineno_2=$LINENO as_lineno_2a=$LINENO
+ eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
+ test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
+ # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-)
sed -n '
p
/[$]LINENO/=
' <$as_myself |
sed '
s/[$]LINENO.*/&-/
t lineno
b
:lineno
N
:loop
s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
t loop
s/-\n.*//
' >$as_me.lineno &&
chmod +x "$as_me.lineno" ||
- { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
- { (exit 1); exit 1; }; }
+ { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
+ # If we had to re-execute with $CONFIG_SHELL, we're ensured to have
+ # already done that, so ensure we don't try to do so again and fall
+ # in an infinite loop. This has already happened in practice.
+ _as_can_reexec=no; export _as_can_reexec
# Don't try to exec as it changes $[0], causing all sort of problems
# (the dirname of $[0] is not the place where we might find the
# original and so on. Autoconf is especially sensitive to this).
. "./$as_me.lineno"
# Exit status is that of the last command.
exit
}
-
-if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
- as_dirname=dirname
-else
- as_dirname=false
-fi
-
ECHO_C= ECHO_N= ECHO_T=
-case `echo -n x` in
+case `echo -n x` in #(((((
-n*)
- case `echo 'x\c'` in
+ case `echo 'xy\c'` in
*c*) ECHO_T=' ';; # ECHO_T is single tab character.
- *) ECHO_C='\c';;
+ xy) ECHO_C='\c';;
+ *) echo `echo ksh88 bug on AIX 6.1` > /dev/null
+ ECHO_T=' ';;
esac;;
*)
ECHO_N='-n';;
esac
-if expr a : '\(a\)' >/dev/null 2>&1 &&
- test "X`expr 00001 : '.*\(...\)'`" = X001; then
- as_expr=expr
-else
- as_expr=false
-fi
-
rm -f conf$$ conf$$.exe conf$$.file
if test -d conf$$.dir; then
rm -f conf$$.dir/conf$$.file
else
rm -f conf$$.dir
- mkdir conf$$.dir
+ mkdir conf$$.dir 2>/dev/null
fi
-echo >conf$$.file
-if ln -s conf$$.file conf$$ 2>/dev/null; then
- as_ln_s='ln -s'
- # ... but there are two gotchas:
- # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
- # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
- # In both cases, we have to default to `cp -p'.
- ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
- as_ln_s='cp -p'
-elif ln conf$$.file conf$$ 2>/dev/null; then
- as_ln_s=ln
+if (echo >conf$$.file) 2>/dev/null; then
+ if ln -s conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s='ln -s'
+ # ... but there are two gotchas:
+ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+ # In both cases, we have to default to `cp -pR'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+ as_ln_s='cp -pR'
+ elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+ else
+ as_ln_s='cp -pR'
+ fi
else
- as_ln_s='cp -p'
+ as_ln_s='cp -pR'
fi
rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
rmdir conf$$.dir 2>/dev/null
if mkdir -p . 2>/dev/null; then
- as_mkdir_p=:
+ as_mkdir_p='mkdir -p "$as_dir"'
else
test -d ./-p && rmdir ./-p
as_mkdir_p=false
fi
-if test -x / >/dev/null 2>&1; then
- as_test_x='test -x'
-else
- if ls -dL / >/dev/null 2>&1; then
- as_ls_L_option=L
- else
- as_ls_L_option=
- fi
- as_test_x='
- eval sh -c '\''
- if test -d "$1"; then
- test -d "$1/.";
- else
- case $1 in
- -*)set "./$1";;
- esac;
- case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in
- ???[sx]*):;;*)false;;esac;fi
- '\'' sh
- '
-fi
-as_executable_p=$as_test_x
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
# Sed expression to map a string onto a valid CPP name.
as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
# Sed expression to map a string onto a valid variable name.
as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
-
-exec 7<&0 </dev/null 6>&1
+test -n "$DJDIR" || exec 7<&0 </dev/null
+exec 6>&1
# Name of the host.
-# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
+# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,
# so uname gets run too.
ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
#
# Initializations.
#
ac_default_prefix=/usr/local
ac_clean_files=
ac_config_libobj_dir=.
LIBOBJS=
cross_compiling=no
subdirs=
MFLAGS=
MAKEFLAGS=
-SHELL=${CONFIG_SHELL-/bin/sh}
# Identity of this package.
PACKAGE_NAME='Cuba'
PACKAGE_TARNAME='cuba'
-PACKAGE_VERSION='2.1'
-PACKAGE_STRING='Cuba 2.1'
+PACKAGE_VERSION='4.2'
+PACKAGE_STRING='Cuba 4.2'
PACKAGE_BUGREPORT='hahn@feynarts.de'
+PACKAGE_URL=''
ac_unique_file="cuba.h"
-ac_subst_vars='SHELL
-PATH_SEPARATOR
-PACKAGE_NAME
-PACKAGE_TARNAME
-PACKAGE_VERSION
-PACKAGE_STRING
-PACKAGE_BUGREPORT
-exec_prefix
-prefix
-program_transform_name
-bindir
-sbindir
-libexecdir
-datarootdir
-datadir
-sysconfdir
-sharedstatedir
-localstatedir
-includedir
-oldincludedir
-docdir
-infodir
-htmldir
-dvidir
-pdfdir
-psdir
-libdir
-localedir
-mandir
-DEFS
-ECHO_C
-ECHO_N
-ECHO_T
-LIBS
-build_alias
-host_alias
-target_alias
-MCFLAGS
-CC
-CFLAGS
-LDFLAGS
-CPPFLAGS
-ac_ct_CC
-EXEEXT
-OBJEXT
-F77
-FFLAGS
-ac_ct_F77
-RANLIB
-INSTALL_PROGRAM
-INSTALL_SCRIPT
-INSTALL_DATA
-MATH_DEFAULT
-HAVE_QMAKE
-TOOLS_DEFAULT
-DEMO_FORTRAN_DEFAULT
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stdio.h>
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#ifdef STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# ifdef HAVE_STDLIB_H
+# include <stdlib.h>
+# endif
+#endif
+#ifdef HAVE_STRING_H
+# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
+# include <memory.h>
+# endif
+# include <string.h>
+#endif
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+ac_subst_vars='LTLIBOBJS
LIBOBJS
-LTLIBOBJS'
+DEMO_FORTRAN_DEFAULT
+TOOLS_DEFAULT
+HAVE_QMAKE
+MATH_DEFAULT
+MCSTDCPP
+SUFFIX
+REALSIZE
+host_os
+host_vendor
+host_cpu
+host
+build_os
+build_vendor
+build_cpu
+build
+ALLOCA
+EGREP
+GREP
+CPP
+INSTALL_DATA
+INSTALL_SCRIPT
+INSTALL_PROGRAM
+RANLIB
+ac_ct_FC
+FCFLAGS
+FC
+OBJEXT
+EXEEXT
+ac_ct_CC
+CPPFLAGS
+LDFLAGS
+CFLAGS
+CC
+MCFLAGS
+target_alias
+host_alias
+build_alias
+LIBS
+ECHO_T
+ECHO_N
+ECHO_C
+DEFS
+mandir
+localedir
+libdir
+psdir
+pdfdir
+dvidir
+htmldir
+infodir
+docdir
+oldincludedir
+includedir
+localstatedir
+sharedstatedir
+sysconfdir
+datadir
+datarootdir
+libexecdir
+sbindir
+bindir
+program_transform_name
+prefix
+exec_prefix
+PACKAGE_URL
+PACKAGE_BUGREPORT
+PACKAGE_STRING
+PACKAGE_VERSION
+PACKAGE_TARNAME
+PACKAGE_NAME
+PATH_SEPARATOR
+SHELL'
ac_subst_files=''
+ac_user_opts='
+enable_option_checking
+with_maxdim
+with_maxcomp
+with_real
+'
ac_precious_vars='build_alias
host_alias
target_alias
MCFLAGS
CC
CFLAGS
LDFLAGS
LIBS
CPPFLAGS
-F77
-FFLAGS'
+FC
+FCFLAGS
+CPP'
# Initialize some variables set by options.
ac_init_help=
ac_init_version=false
+ac_unrecognized_opts=
+ac_unrecognized_sep=
# The variables have the same names as the options, with
# dashes changed to underlines.
cache_file=/dev/null
exec_prefix=NONE
no_create=
no_recursion=
prefix=NONE
program_prefix=NONE
program_suffix=NONE
program_transform_name=s,x,x,
silent=
site=
srcdir=
verbose=
x_includes=NONE
x_libraries=NONE
# Installation directory options.
# These are left unexpanded so users can "make install exec_prefix=/foo"
# and all the variables that are supposed to be based on exec_prefix
# by default will actually change.
# Use braces instead of parens because sh, perl, etc. also accept them.
# (The list follows the same order as the GNU Coding Standards.)
bindir='${exec_prefix}/bin'
sbindir='${exec_prefix}/sbin'
libexecdir='${exec_prefix}/libexec'
datarootdir='${prefix}/share'
datadir='${datarootdir}'
sysconfdir='${prefix}/etc'
sharedstatedir='${prefix}/com'
localstatedir='${prefix}/var'
includedir='${prefix}/include'
oldincludedir='/usr/include'
docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
infodir='${datarootdir}/info'
htmldir='${docdir}'
dvidir='${docdir}'
pdfdir='${docdir}'
psdir='${docdir}'
libdir='${exec_prefix}/lib'
localedir='${datarootdir}/locale'
mandir='${datarootdir}/man'
ac_prev=
ac_dashdash=
for ac_option
do
# If the previous option needs an argument, assign it.
if test -n "$ac_prev"; then
eval $ac_prev=\$ac_option
ac_prev=
continue
fi
case $ac_option in
- *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
- *) ac_optarg=yes ;;
+ *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+ *=) ac_optarg= ;;
+ *) ac_optarg=yes ;;
esac
# Accept the important Cygnus configure options, so we can diagnose typos.
case $ac_dashdash$ac_option in
--)
ac_dashdash=yes ;;
-bindir | --bindir | --bindi | --bind | --bin | --bi)
ac_prev=bindir ;;
-bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
bindir=$ac_optarg ;;
-build | --build | --buil | --bui | --bu)
ac_prev=build_alias ;;
-build=* | --build=* | --buil=* | --bui=* | --bu=*)
build_alias=$ac_optarg ;;
-cache-file | --cache-file | --cache-fil | --cache-fi \
| --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
ac_prev=cache_file ;;
-cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
| --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
cache_file=$ac_optarg ;;
--config-cache | -C)
cache_file=config.cache ;;
-datadir | --datadir | --datadi | --datad)
ac_prev=datadir ;;
-datadir=* | --datadir=* | --datadi=* | --datad=*)
datadir=$ac_optarg ;;
-datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
| --dataroo | --dataro | --datar)
ac_prev=datarootdir ;;
-datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
| --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
datarootdir=$ac_optarg ;;
-disable-* | --disable-*)
- ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+ ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
# Reject names that are not valid shell variable names.
- expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null &&
- { echo "$as_me: error: invalid feature name: $ac_feature" >&2
- { (exit 1); exit 1; }; }
- ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'`
- eval enable_$ac_feature=no ;;
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid feature name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"enable_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval enable_$ac_useropt=no ;;
-docdir | --docdir | --docdi | --doc | --do)
ac_prev=docdir ;;
-docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
docdir=$ac_optarg ;;
-dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
ac_prev=dvidir ;;
-dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
dvidir=$ac_optarg ;;
-enable-* | --enable-*)
- ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+ ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
# Reject names that are not valid shell variable names.
- expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null &&
- { echo "$as_me: error: invalid feature name: $ac_feature" >&2
- { (exit 1); exit 1; }; }
- ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'`
- eval enable_$ac_feature=\$ac_optarg ;;
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid feature name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"enable_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval enable_$ac_useropt=\$ac_optarg ;;
-exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
| --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
| --exec | --exe | --ex)
ac_prev=exec_prefix ;;
-exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
| --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
| --exec=* | --exe=* | --ex=*)
exec_prefix=$ac_optarg ;;
-gas | --gas | --ga | --g)
# Obsolete; use --with-gas.
with_gas=yes ;;
-help | --help | --hel | --he | -h)
ac_init_help=long ;;
-help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
ac_init_help=recursive ;;
-help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
ac_init_help=short ;;
-host | --host | --hos | --ho)
ac_prev=host_alias ;;
-host=* | --host=* | --hos=* | --ho=*)
host_alias=$ac_optarg ;;
-htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
ac_prev=htmldir ;;
-htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
| --ht=*)
htmldir=$ac_optarg ;;
-includedir | --includedir | --includedi | --included | --include \
| --includ | --inclu | --incl | --inc)
ac_prev=includedir ;;
-includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
| --includ=* | --inclu=* | --incl=* | --inc=*)
includedir=$ac_optarg ;;
-infodir | --infodir | --infodi | --infod | --info | --inf)
ac_prev=infodir ;;
-infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
infodir=$ac_optarg ;;
-libdir | --libdir | --libdi | --libd)
ac_prev=libdir ;;
-libdir=* | --libdir=* | --libdi=* | --libd=*)
libdir=$ac_optarg ;;
-libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
| --libexe | --libex | --libe)
ac_prev=libexecdir ;;
-libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
| --libexe=* | --libex=* | --libe=*)
libexecdir=$ac_optarg ;;
-localedir | --localedir | --localedi | --localed | --locale)
ac_prev=localedir ;;
-localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
localedir=$ac_optarg ;;
-localstatedir | --localstatedir | --localstatedi | --localstated \
| --localstate | --localstat | --localsta | --localst | --locals)
ac_prev=localstatedir ;;
-localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
| --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
localstatedir=$ac_optarg ;;
-mandir | --mandir | --mandi | --mand | --man | --ma | --m)
ac_prev=mandir ;;
-mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
mandir=$ac_optarg ;;
-nfp | --nfp | --nf)
# Obsolete; use --without-fp.
with_fp=no ;;
-no-create | --no-create | --no-creat | --no-crea | --no-cre \
| --no-cr | --no-c | -n)
no_create=yes ;;
-no-recursion | --no-recursion | --no-recursio | --no-recursi \
| --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
no_recursion=yes ;;
-oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
| --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
| --oldin | --oldi | --old | --ol | --o)
ac_prev=oldincludedir ;;
-oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
| --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
| --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
oldincludedir=$ac_optarg ;;
-prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
ac_prev=prefix ;;
-prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
prefix=$ac_optarg ;;
-program-prefix | --program-prefix | --program-prefi | --program-pref \
| --program-pre | --program-pr | --program-p)
ac_prev=program_prefix ;;
-program-prefix=* | --program-prefix=* | --program-prefi=* \
| --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
program_prefix=$ac_optarg ;;
-program-suffix | --program-suffix | --program-suffi | --program-suff \
| --program-suf | --program-su | --program-s)
ac_prev=program_suffix ;;
-program-suffix=* | --program-suffix=* | --program-suffi=* \
| --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
program_suffix=$ac_optarg ;;
-program-transform-name | --program-transform-name \
| --program-transform-nam | --program-transform-na \
| --program-transform-n | --program-transform- \
| --program-transform | --program-transfor \
| --program-transfo | --program-transf \
| --program-trans | --program-tran \
| --progr-tra | --program-tr | --program-t)
ac_prev=program_transform_name ;;
-program-transform-name=* | --program-transform-name=* \
| --program-transform-nam=* | --program-transform-na=* \
| --program-transform-n=* | --program-transform-=* \
| --program-transform=* | --program-transfor=* \
| --program-transfo=* | --program-transf=* \
| --program-trans=* | --program-tran=* \
| --progr-tra=* | --program-tr=* | --program-t=*)
program_transform_name=$ac_optarg ;;
-pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
ac_prev=pdfdir ;;
-pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
pdfdir=$ac_optarg ;;
-psdir | --psdir | --psdi | --psd | --ps)
ac_prev=psdir ;;
-psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
psdir=$ac_optarg ;;
-q | -quiet | --quiet | --quie | --qui | --qu | --q \
| -silent | --silent | --silen | --sile | --sil)
silent=yes ;;
-sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
ac_prev=sbindir ;;
-sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
| --sbi=* | --sb=*)
sbindir=$ac_optarg ;;
-sharedstatedir | --sharedstatedir | --sharedstatedi \
| --sharedstated | --sharedstate | --sharedstat | --sharedsta \
| --sharedst | --shareds | --shared | --share | --shar \
| --sha | --sh)
ac_prev=sharedstatedir ;;
-sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
| --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
| --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
| --sha=* | --sh=*)
sharedstatedir=$ac_optarg ;;
-site | --site | --sit)
ac_prev=site ;;
-site=* | --site=* | --sit=*)
site=$ac_optarg ;;
-srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
ac_prev=srcdir ;;
-srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
srcdir=$ac_optarg ;;
-sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
| --syscon | --sysco | --sysc | --sys | --sy)
ac_prev=sysconfdir ;;
-sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
| --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
sysconfdir=$ac_optarg ;;
-target | --target | --targe | --targ | --tar | --ta | --t)
ac_prev=target_alias ;;
-target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
target_alias=$ac_optarg ;;
-v | -verbose | --verbose | --verbos | --verbo | --verb)
verbose=yes ;;
-version | --version | --versio | --versi | --vers | -V)
ac_init_version=: ;;
-with-* | --with-*)
- ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+ ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
# Reject names that are not valid shell variable names.
- expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null &&
- { echo "$as_me: error: invalid package name: $ac_package" >&2
- { (exit 1); exit 1; }; }
- ac_package=`echo $ac_package | sed 's/[-.]/_/g'`
- eval with_$ac_package=\$ac_optarg ;;
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid package name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"with_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval with_$ac_useropt=\$ac_optarg ;;
-without-* | --without-*)
- ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+ ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
# Reject names that are not valid shell variable names.
- expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null &&
- { echo "$as_me: error: invalid package name: $ac_package" >&2
- { (exit 1); exit 1; }; }
- ac_package=`echo $ac_package | sed 's/[-.]/_/g'`
- eval with_$ac_package=no ;;
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid package name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"with_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval with_$ac_useropt=no ;;
--x)
# Obsolete; use --with-x.
with_x=yes ;;
-x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
| --x-incl | --x-inc | --x-in | --x-i)
ac_prev=x_includes ;;
-x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
| --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
x_includes=$ac_optarg ;;
-x-libraries | --x-libraries | --x-librarie | --x-librari \
| --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
ac_prev=x_libraries ;;
-x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
| --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
x_libraries=$ac_optarg ;;
- -*) { echo "$as_me: error: unrecognized option: $ac_option
-Try \`$0 --help' for more information." >&2
- { (exit 1); exit 1; }; }
+ -*) as_fn_error $? "unrecognized option: \`$ac_option'
+Try \`$0 --help' for more information"
;;
*=*)
ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
# Reject names that are not valid shell variable names.
- expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
- { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
- { (exit 1); exit 1; }; }
+ case $ac_envvar in #(
+ '' | [0-9]* | *[!_$as_cr_alnum]* )
+ as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
+ esac
eval $ac_envvar=\$ac_optarg
export $ac_envvar ;;
*)
# FIXME: should be removed in autoconf 3.0.
- echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+ $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
- echo "$as_me: WARNING: invalid host type: $ac_option" >&2
- : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
+ $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+ : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
;;
esac
done
if test -n "$ac_prev"; then
ac_option=--`echo $ac_prev | sed 's/_/-/g'`
- { echo "$as_me: error: missing argument to $ac_option" >&2
- { (exit 1); exit 1; }; }
+ as_fn_error $? "missing argument to $ac_option"
+fi
+
+if test -n "$ac_unrecognized_opts"; then
+ case $enable_option_checking in
+ no) ;;
+ fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
+ *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+ esac
fi
-# Be sure to have absolute directory names.
+# Check all directory arguments for consistency.
for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \
datadir sysconfdir sharedstatedir localstatedir includedir \
oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
libdir localedir mandir
do
eval ac_val=\$$ac_var
+ # Remove trailing slashes.
+ case $ac_val in
+ */ )
+ ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
+ eval $ac_var=\$ac_val;;
+ esac
+ # Be sure to have absolute directory names.
case $ac_val in
[\\/$]* | ?:[\\/]* ) continue;;
NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
esac
- { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
- { (exit 1); exit 1; }; }
+ as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
done
# There might be people who depend on the old broken behavior: `$host'
# used to hold the argument of --host etc.
# FIXME: To remove some day.
build=$build_alias
host=$host_alias
target=$target_alias
# FIXME: To remove some day.
if test "x$host_alias" != x; then
if test "x$build_alias" = x; then
cross_compiling=maybe
- echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
- If a cross compiler is detected then cross compile mode will be used." >&2
elif test "x$build_alias" != "x$host_alias"; then
cross_compiling=yes
fi
fi
ac_tool_prefix=
test -n "$host_alias" && ac_tool_prefix=$host_alias-
test "$silent" = yes && exec 6>/dev/null
ac_pwd=`pwd` && test -n "$ac_pwd" &&
ac_ls_di=`ls -di .` &&
ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
- { echo "$as_me: error: Working directory cannot be determined" >&2
- { (exit 1); exit 1; }; }
+ as_fn_error $? "working directory cannot be determined"
test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
- { echo "$as_me: error: pwd does not report name of working directory" >&2
- { (exit 1); exit 1; }; }
+ as_fn_error $? "pwd does not report name of working directory"
# Find the source files, if location was not specified.
if test -z "$srcdir"; then
ac_srcdir_defaulted=yes
# Try the directory containing this script, then the parent directory.
- ac_confdir=`$as_dirname -- "$0" ||
-$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
- X"$0" : 'X\(//\)[^/]' \| \
- X"$0" : 'X\(//\)$' \| \
- X"$0" : 'X\(/\)' \| . 2>/dev/null ||
-echo X"$0" |
+ ac_confdir=`$as_dirname -- "$as_myself" ||
+$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_myself" : 'X\(//\)[^/]' \| \
+ X"$as_myself" : 'X\(//\)$' \| \
+ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_myself" |
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
s//\1/
q
}
/^X\(\/\/\)[^/].*/{
s//\1/
q
}
/^X\(\/\/\)$/{
s//\1/
q
}
/^X\(\/\).*/{
s//\1/
q
}
s/.*/./; q'`
srcdir=$ac_confdir
if test ! -r "$srcdir/$ac_unique_file"; then
srcdir=..
fi
else
ac_srcdir_defaulted=no
fi
if test ! -r "$srcdir/$ac_unique_file"; then
test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
- { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
- { (exit 1); exit 1; }; }
+ as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
fi
ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
ac_abs_confdir=`(
- cd "$srcdir" && test -r "./$ac_unique_file" || { echo "$as_me: error: $ac_msg" >&2
- { (exit 1); exit 1; }; }
+ cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"
pwd)`
# When building in place, set srcdir=.
if test "$ac_abs_confdir" = "$ac_pwd"; then
srcdir=.
fi
# Remove unnecessary trailing slashes from srcdir.
# Double slashes in file names in object file debugging info
# mess up M-x gdb in Emacs.
case $srcdir in
*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
esac
for ac_var in $ac_precious_vars; do
eval ac_env_${ac_var}_set=\${${ac_var}+set}
eval ac_env_${ac_var}_value=\$${ac_var}
eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
eval ac_cv_env_${ac_var}_value=\$${ac_var}
done
#
# Report the --help message.
#
if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
-\`configure' configures Cuba 2.1 to adapt to many kinds of systems.
+\`configure' configures Cuba 4.2 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
To assign environment variables (e.g., CC, CFLAGS...), specify them as
VAR=VALUE. See below for descriptions of some of the useful variables.
Defaults for the options are specified in brackets.
Configuration:
-h, --help display this help and exit
--help=short display options specific to this package
--help=recursive display the short help of all the included packages
-V, --version display version information and exit
- -q, --quiet, --silent do not print \`checking...' messages
+ -q, --quiet, --silent do not print \`checking ...' messages
--cache-file=FILE cache test results in FILE [disabled]
-C, --config-cache alias for \`--cache-file=config.cache'
-n, --no-create do not create output files
--srcdir=DIR find the sources in DIR [configure dir or \`..']
Installation directories:
--prefix=PREFIX install architecture-independent files in PREFIX
- [$ac_default_prefix]
+ [$ac_default_prefix]
--exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
- [PREFIX]
+ [PREFIX]
By default, \`make install' will install all the files in
\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify
an installation prefix other than \`$ac_default_prefix' using \`--prefix',
for instance \`--prefix=\$HOME'.
For better control, use the options below.
Fine tuning of the installation directories:
- --bindir=DIR user executables [EPREFIX/bin]
- --sbindir=DIR system admin executables [EPREFIX/sbin]
- --libexecdir=DIR program executables [EPREFIX/libexec]
- --sysconfdir=DIR read-only single-machine data [PREFIX/etc]
- --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
- --localstatedir=DIR modifiable single-machine data [PREFIX/var]
- --libdir=DIR object code libraries [EPREFIX/lib]
- --includedir=DIR C header files [PREFIX/include]
- --oldincludedir=DIR C header files for non-gcc [/usr/include]
- --datarootdir=DIR read-only arch.-independent data root [PREFIX/share]
- --datadir=DIR read-only architecture-independent data [DATAROOTDIR]
- --infodir=DIR info documentation [DATAROOTDIR/info]
- --localedir=DIR locale-dependent data [DATAROOTDIR/locale]
- --mandir=DIR man documentation [DATAROOTDIR/man]
- --docdir=DIR documentation root [DATAROOTDIR/doc/cuba]
- --htmldir=DIR html documentation [DOCDIR]
- --dvidir=DIR dvi documentation [DOCDIR]
- --pdfdir=DIR pdf documentation [DOCDIR]
- --psdir=DIR ps documentation [DOCDIR]
+ --bindir=DIR user executables [EPREFIX/bin]
+ --sbindir=DIR system admin executables [EPREFIX/sbin]
+ --libexecdir=DIR program executables [EPREFIX/libexec]
+ --sysconfdir=DIR read-only single-machine data [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data [PREFIX/var]
+ --libdir=DIR object code libraries [EPREFIX/lib]
+ --includedir=DIR C header files [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc [/usr/include]
+ --datarootdir=DIR read-only arch.-independent data root [PREFIX/share]
+ --datadir=DIR read-only architecture-independent data [DATAROOTDIR]
+ --infodir=DIR info documentation [DATAROOTDIR/info]
+ --localedir=DIR locale-dependent data [DATAROOTDIR/locale]
+ --mandir=DIR man documentation [DATAROOTDIR/man]
+ --docdir=DIR documentation root [DATAROOTDIR/doc/cuba]
+ --htmldir=DIR html documentation [DOCDIR]
+ --dvidir=DIR dvi documentation [DOCDIR]
+ --pdfdir=DIR pdf documentation [DOCDIR]
+ --psdir=DIR ps documentation [DOCDIR]
_ACEOF
cat <<\_ACEOF
+
+System types:
+ --build=BUILD configure for building on BUILD [guessed]
+ --host=HOST cross-compile to build programs to run on HOST [BUILD]
_ACEOF
fi
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of Cuba 2.1:";;
+ short | recursive ) echo "Configuration of Cuba 4.2:";;
esac
cat <<\_ACEOF
Optional Packages:
--with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
--without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
--with-maxdim=N the maximum dimension for integration, if
variable-size array are not supported
--with-maxcomp=N the maximum number of components of the integrand,
if variable-size array are not supported
+ --with-real=N use N-byte floating-point numbers
Some influential environment variables:
MCFLAGS MathLink C compiler flags
CC C compiler command
CFLAGS C compiler flags
LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a
nonstandard directory <lib dir>
LIBS libraries to pass to the linker, e.g. -l<library>
- CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I<include dir> if
+ CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
you have headers in a nonstandard directory <include dir>
- F77 Fortran 77 compiler command
- FFLAGS Fortran 77 compiler flags
+ FC Fortran compiler command
+ FCFLAGS Fortran compiler flags
+ CPP C preprocessor
Use these variables to override the choices made by `configure' or to help
it to find libraries and programs with nonstandard names/locations.
Report bugs to <hahn@feynarts.de>.
_ACEOF
ac_status=$?
fi
if test "$ac_init_help" = "recursive"; then
# If there are subdirs, report their specific --help.
for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
- test -d "$ac_dir" || continue
+ test -d "$ac_dir" ||
+ { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
+ continue
ac_builddir=.
case "$ac_dir" in
.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
*)
- ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+ ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
# A ".." for each directory in $ac_dir_suffix.
- ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'`
+ ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
case $ac_top_builddir_sub in
"") ac_top_builddir_sub=. ac_top_build_prefix= ;;
*) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
esac ;;
esac
ac_abs_top_builddir=$ac_pwd
ac_abs_builddir=$ac_pwd$ac_dir_suffix
# for backward compatibility:
ac_top_builddir=$ac_top_build_prefix
case $srcdir in
.) # We are building in place.
ac_srcdir=.
ac_top_srcdir=$ac_top_builddir_sub
ac_abs_top_srcdir=$ac_pwd ;;
[\\/]* | ?:[\\/]* ) # Absolute name.
ac_srcdir=$srcdir$ac_dir_suffix;
ac_top_srcdir=$srcdir
ac_abs_top_srcdir=$srcdir ;;
*) # Relative name.
ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
ac_top_srcdir=$ac_top_build_prefix$srcdir
ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
esac
ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
cd "$ac_dir" || { ac_status=$?; continue; }
# Check for guested configure.
if test -f "$ac_srcdir/configure.gnu"; then
echo &&
$SHELL "$ac_srcdir/configure.gnu" --help=recursive
elif test -f "$ac_srcdir/configure"; then
echo &&
$SHELL "$ac_srcdir/configure" --help=recursive
else
- echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+ $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
fi || ac_status=$?
cd "$ac_pwd" || { ac_status=$?; break; }
done
fi
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
-Cuba configure 2.1
-generated by GNU Autoconf 2.61
+Cuba configure 4.2
+generated by GNU Autoconf 2.69
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
-2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+Copyright (C) 2012 Free Software Foundation, Inc.
This configure script is free software; the Free Software Foundation
gives unlimited permission to copy, distribute and modify it.
_ACEOF
exit
fi
+
+## ------------------------ ##
+## Autoconf initialization. ##
+## ------------------------ ##
+
+# ac_fn_c_try_compile LINENO
+# --------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_compile ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext
+ if { { ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_compile") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_compile
+
+# ac_fn_fc_try_compile LINENO
+# ---------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_fc_try_compile ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext
+ if { { ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_compile") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_fc_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_fc_try_compile
+
+# ac_fn_c_check_type LINENO TYPE VAR INCLUDES
+# -------------------------------------------
+# Tests whether TYPE exists after having included INCLUDES, setting cache
+# variable VAR accordingly.
+ac_fn_c_check_type ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ eval "$3=no"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main ()
+{
+if (sizeof ($2))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main ()
+{
+if (sizeof (($2)))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+ eval "$3=yes"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_type
+
+# ac_fn_c_try_cpp LINENO
+# ----------------------
+# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_cpp ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if { { ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } > conftest.i && {
+ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ }; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_cpp
+
+# ac_fn_c_try_run LINENO
+# ----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
+# that executables *can* be run.
+ac_fn_c_try_run ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
+ { { case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: program exited with status $ac_status" >&5
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=$ac_status
+fi
+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_run
+
+# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists and can be compiled using the include files in
+# INCLUDES, setting the cache variable VAR accordingly.
+ac_fn_c_check_header_compile ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ eval "$3=yes"
+else
+ eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_header_compile
+
+# ac_fn_c_try_link LINENO
+# -----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_link ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext conftest$ac_exeext
+ if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ test -x conftest$ac_exeext
+ }; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+ # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+ # interfere with the next link command; also delete a directory that is
+ # left behind by Apple's compiler. We do this before executing the actions.
+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_link
+
+# ac_fn_c_check_func LINENO FUNC VAR
+# ----------------------------------
+# Tests whether FUNC exists, setting the cache variable VAR accordingly
+ac_fn_c_check_func ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $2 innocuous_$2
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $2 (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $2
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $2 ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined __stub_$2 || defined __stub___$2
+choke me
+#endif
+
+int
+main ()
+{
+return $2 ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$3=yes"
+else
+ eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_func
+
+# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists, giving a warning if it cannot be compiled using
+# the include files in INCLUDES and setting the cache variable VAR
+# accordingly.
+ac_fn_c_check_header_mongrel ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if eval \${$3+:} false; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+else
+ # Is the header compilable?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
+$as_echo_n "checking $2 usability... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_header_compiler=yes
+else
+ ac_header_compiler=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
+$as_echo "$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
+$as_echo_n "checking $2 presence... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <$2>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+ ac_header_preproc=yes
+else
+ ac_header_preproc=no
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
+$as_echo "$ac_header_preproc" >&6; }
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #((
+ yes:no: )
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
+$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+ ;;
+ no:yes:* )
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
+$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5
+$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
+$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5
+$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+( $as_echo "## ------------------------------- ##
+## Report this to hahn@feynarts.de ##
+## ------------------------------- ##"
+ ) | sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ eval "$3=\$ac_header_compiler"
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_header_mongrel
cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
-It was created by Cuba $as_me 2.1, which was
-generated by GNU Autoconf 2.61. Invocation command line was
+It was created by Cuba $as_me 4.2, which was
+generated by GNU Autoconf 2.69. Invocation command line was
$ $0 $@
_ACEOF
exec 5>>config.log
{
cat <<_ASUNAME
## --------- ##
## Platform. ##
## --------- ##
hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
uname -m = `(uname -m) 2>/dev/null || echo unknown`
uname -r = `(uname -r) 2>/dev/null || echo unknown`
uname -s = `(uname -s) 2>/dev/null || echo unknown`
uname -v = `(uname -v) 2>/dev/null || echo unknown`
/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown`
/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown`
/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown`
/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown`
/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown`
/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown`
/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown`
_ASUNAME
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
- echo "PATH: $as_dir"
-done
+ $as_echo "PATH: $as_dir"
+ done
IFS=$as_save_IFS
} >&5
cat >&5 <<_ACEOF
## ----------- ##
## Core tests. ##
## ----------- ##
_ACEOF
# Keep a trace of the command line.
# Strip out --no-create and --no-recursion so they do not pile up.
# Strip out --silent because we don't want to record it for future runs.
# Also quote any args containing shell meta-characters.
# Make two passes to allow for proper duplicate-argument suppression.
ac_configure_args=
ac_configure_args0=
ac_configure_args1=
ac_must_keep_next=false
for ac_pass in 1 2
do
for ac_arg
do
case $ac_arg in
-no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
-q | -quiet | --quiet | --quie | --qui | --qu | --q \
| -silent | --silent | --silen | --sile | --sil)
continue ;;
*\'*)
- ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
esac
case $ac_pass in
- 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;;
+ 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
2)
- ac_configure_args1="$ac_configure_args1 '$ac_arg'"
+ as_fn_append ac_configure_args1 " '$ac_arg'"
if test $ac_must_keep_next = true; then
ac_must_keep_next=false # Got value, back to normal.
else
case $ac_arg in
*=* | --config-cache | -C | -disable-* | --disable-* \
| -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
| -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
| -with-* | --with-* | -without-* | --without-* | --x)
case "$ac_configure_args0 " in
"$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
esac
;;
-* ) ac_must_keep_next=true ;;
esac
fi
- ac_configure_args="$ac_configure_args '$ac_arg'"
+ as_fn_append ac_configure_args " '$ac_arg'"
;;
esac
done
done
-$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; }
-$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; }
+{ ac_configure_args0=; unset ac_configure_args0;}
+{ ac_configure_args1=; unset ac_configure_args1;}
# When interrupted or exit'd, cleanup temporary files, and complete
# config.log. We remove comments because anyway the quotes in there
# would cause problems or look ugly.
# WARNING: Use '\'' to represent an apostrophe within the trap.
# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
trap 'exit_status=$?
# Save into config.log some information that might help in debugging.
{
echo
- cat <<\_ASBOX
-## ---------------- ##
+ $as_echo "## ---------------- ##
## Cache variables. ##
-## ---------------- ##
-_ASBOX
+## ---------------- ##"
echo
# The following way of writing the cache mishandles newlines in values,
(
for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
eval ac_val=\$$ac_var
case $ac_val in #(
*${as_nl}*)
case $ac_var in #(
- *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5
-echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;;
+ *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
esac
case $ac_var in #(
_ | IFS | as_nl) ;; #(
- *) $as_unset $ac_var ;;
+ BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+ *) { eval $ac_var=; unset $ac_var;} ;;
esac ;;
esac
done
(set) 2>&1 |
case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
*${as_nl}ac_space=\ *)
sed -n \
"s/'\''/'\''\\\\'\'''\''/g;
s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
;; #(
*)
sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
;;
esac |
sort
)
echo
- cat <<\_ASBOX
-## ----------------- ##
+ $as_echo "## ----------------- ##
## Output variables. ##
-## ----------------- ##
-_ASBOX
+## ----------------- ##"
echo
for ac_var in $ac_subst_vars
do
eval ac_val=\$$ac_var
case $ac_val in
- *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
esac
- echo "$ac_var='\''$ac_val'\''"
+ $as_echo "$ac_var='\''$ac_val'\''"
done | sort
echo
if test -n "$ac_subst_files"; then
- cat <<\_ASBOX
-## ------------------- ##
+ $as_echo "## ------------------- ##
## File substitutions. ##
-## ------------------- ##
-_ASBOX
+## ------------------- ##"
echo
for ac_var in $ac_subst_files
do
eval ac_val=\$$ac_var
case $ac_val in
- *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
esac
- echo "$ac_var='\''$ac_val'\''"
+ $as_echo "$ac_var='\''$ac_val'\''"
done | sort
echo
fi
if test -s confdefs.h; then
- cat <<\_ASBOX
-## ----------- ##
+ $as_echo "## ----------- ##
## confdefs.h. ##
-## ----------- ##
-_ASBOX
+## ----------- ##"
echo
cat confdefs.h
echo
fi
test "$ac_signal" != 0 &&
- echo "$as_me: caught signal $ac_signal"
- echo "$as_me: exit $exit_status"
+ $as_echo "$as_me: caught signal $ac_signal"
+ $as_echo "$as_me: exit $exit_status"
} >&5
rm -f core *.core core.conftest.* &&
rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
exit $exit_status
' 0
for ac_signal in 1 2 13 15; do
- trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
+ trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
done
ac_signal=0
# confdefs.h avoids OS command line length limits that DEFS can exceed.
rm -f -r conftest* confdefs.h
+$as_echo "/* confdefs.h */" > confdefs.h
+
# Predefined preprocessor variables.
cat >>confdefs.h <<_ACEOF
#define PACKAGE_NAME "$PACKAGE_NAME"
_ACEOF
-
cat >>confdefs.h <<_ACEOF
#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
_ACEOF
-
cat >>confdefs.h <<_ACEOF
#define PACKAGE_VERSION "$PACKAGE_VERSION"
_ACEOF
-
cat >>confdefs.h <<_ACEOF
#define PACKAGE_STRING "$PACKAGE_STRING"
_ACEOF
-
cat >>confdefs.h <<_ACEOF
#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
_ACEOF
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_URL "$PACKAGE_URL"
+_ACEOF
+
# Let the site file select an alternate cache file if it wants to.
-# Prefer explicitly selected file to automatically selected ones.
+# Prefer an explicitly selected file to automatically selected ones.
+ac_site_file1=NONE
+ac_site_file2=NONE
if test -n "$CONFIG_SITE"; then
- set x "$CONFIG_SITE"
+ # We do not want a PATH search for config.site.
+ case $CONFIG_SITE in #((
+ -*) ac_site_file1=./$CONFIG_SITE;;
+ */*) ac_site_file1=$CONFIG_SITE;;
+ *) ac_site_file1=./$CONFIG_SITE;;
+ esac
elif test "x$prefix" != xNONE; then
- set x "$prefix/share/config.site" "$prefix/etc/config.site"
+ ac_site_file1=$prefix/share/config.site
+ ac_site_file2=$prefix/etc/config.site
else
- set x "$ac_default_prefix/share/config.site" \
- "$ac_default_prefix/etc/config.site"
+ ac_site_file1=$ac_default_prefix/share/config.site
+ ac_site_file2=$ac_default_prefix/etc/config.site
fi
-shift
-for ac_site_file
+for ac_site_file in "$ac_site_file1" "$ac_site_file2"
do
- if test -r "$ac_site_file"; then
- { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
-echo "$as_me: loading site script $ac_site_file" >&6;}
+ test "x$ac_site_file" = xNONE && continue
+ if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
+$as_echo "$as_me: loading site script $ac_site_file" >&6;}
sed 's/^/| /' "$ac_site_file" >&5
- . "$ac_site_file"
+ . "$ac_site_file" \
+ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "failed to load site script $ac_site_file
+See \`config.log' for more details" "$LINENO" 5; }
fi
done
if test -r "$cache_file"; then
- # Some versions of bash will fail to source /dev/null (special
- # files actually), so we avoid doing that.
- if test -f "$cache_file"; then
- { echo "$as_me:$LINENO: loading cache $cache_file" >&5
-echo "$as_me: loading cache $cache_file" >&6;}
+ # Some versions of bash will fail to source /dev/null (special files
+ # actually), so we avoid doing that. DJGPP emulates it as a regular file.
+ if test /dev/null != "$cache_file" && test -f "$cache_file"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
+$as_echo "$as_me: loading cache $cache_file" >&6;}
case $cache_file in
[\\/]* | ?:[\\/]* ) . "$cache_file";;
*) . "./$cache_file";;
esac
fi
else
- { echo "$as_me:$LINENO: creating cache $cache_file" >&5
-echo "$as_me: creating cache $cache_file" >&6;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
+$as_echo "$as_me: creating cache $cache_file" >&6;}
>$cache_file
fi
# Check that the precious variables saved in the cache have kept the same
# value.
ac_cache_corrupted=false
for ac_var in $ac_precious_vars; do
eval ac_old_set=\$ac_cv_env_${ac_var}_set
eval ac_new_set=\$ac_env_${ac_var}_set
eval ac_old_val=\$ac_cv_env_${ac_var}_value
eval ac_new_val=\$ac_env_${ac_var}_value
case $ac_old_set,$ac_new_set in
set,)
- { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
-echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
ac_cache_corrupted=: ;;
,set)
- { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
-echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
ac_cache_corrupted=: ;;
,);;
*)
if test "x$ac_old_val" != "x$ac_new_val"; then
- { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
-echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
- { echo "$as_me:$LINENO: former value: $ac_old_val" >&5
-echo "$as_me: former value: $ac_old_val" >&2;}
- { echo "$as_me:$LINENO: current value: $ac_new_val" >&5
-echo "$as_me: current value: $ac_new_val" >&2;}
- ac_cache_corrupted=:
+ # differences in whitespace do not lead to failure.
+ ac_old_val_w=`echo x $ac_old_val`
+ ac_new_val_w=`echo x $ac_new_val`
+ if test "$ac_old_val_w" != "$ac_new_val_w"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
+$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+ ac_cache_corrupted=:
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+ eval $ac_var=\$ac_old_val
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5
+$as_echo "$as_me: former value: \`$ac_old_val'" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5
+$as_echo "$as_me: current value: \`$ac_new_val'" >&2;}
fi;;
esac
# Pass precious variables to config.status.
if test "$ac_new_set" = set; then
case $ac_new_val in
- *\'*) ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+ *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
*) ac_arg=$ac_var=$ac_new_val ;;
esac
case " $ac_configure_args " in
*" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy.
- *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+ *) as_fn_append ac_configure_args " '$ac_arg'" ;;
esac
fi
done
if $ac_cache_corrupted; then
- { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
-echo "$as_me: error: changes in the environment can compromise the build" >&2;}
- { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
-echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
- { (exit 1); exit 1; }; }
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
+$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+ as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
+fi
+## -------------------- ##
+## Main body of script. ##
+## -------------------- ##
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
LIBS=-lm
USER_CFLAGS="$CFLAGS"
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
set dummy ${ac_tool_prefix}gcc; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
-if test "${ac_cv_prog_CC+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
else
if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_CC="${ac_tool_prefix}gcc"
- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
-done
+ done
IFS=$as_save_IFS
fi
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
- { echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
else
- { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
fi
fi
if test -z "$ac_cv_prog_CC"; then
ac_ct_CC=$CC
# Extract the first word of "gcc", so it can be a program name with args.
set dummy gcc; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
else
if test -n "$ac_ct_CC"; then
ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_CC="gcc"
- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
-done
+ done
IFS=$as_save_IFS
fi
fi
ac_ct_CC=$ac_cv_prog_ac_ct_CC
if test -n "$ac_ct_CC"; then
- { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
-echo "${ECHO_T}$ac_ct_CC" >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
else
- { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
fi
if test "x$ac_ct_CC" = x; then
CC=""
else
case $cross_compiling:$ac_tool_warned in
yes:)
-{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
-whose name does not start with the host triplet. If you think this
-configuration is useful to you, please write to autoconf@gnu.org." >&5
-echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
-whose name does not start with the host triplet. If you think this
-configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
CC=$ac_ct_CC
fi
else
CC="$ac_cv_prog_CC"
fi
if test -z "$CC"; then
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
set dummy ${ac_tool_prefix}cc; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
-if test "${ac_cv_prog_CC+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
else
if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_CC="${ac_tool_prefix}cc"
- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
-done
+ done
IFS=$as_save_IFS
fi
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
- { echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
else
- { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
fi
fi
fi
if test -z "$CC"; then
# Extract the first word of "cc", so it can be a program name with args.
set dummy cc; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
-if test "${ac_cv_prog_CC+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
else
if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
ac_prog_rejected=no
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
ac_prog_rejected=yes
continue
fi
ac_cv_prog_CC="cc"
- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
-done
+ done
IFS=$as_save_IFS
if test $ac_prog_rejected = yes; then
# We found a bogon in the path, so make sure we never use it.
set dummy $ac_cv_prog_CC
shift
if test $# != 0; then
# We chose a different compiler from the bogus one.
# However, it has the same basename, so the bogon will be chosen
# first if we set CC to just the basename; use the full file name.
shift
ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
fi
fi
fi
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
- { echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
else
- { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
fi
fi
if test -z "$CC"; then
if test -n "$ac_tool_prefix"; then
for ac_prog in cl.exe
do
# Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
-if test "${ac_cv_prog_CC+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
else
if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
-done
+ done
IFS=$as_save_IFS
fi
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
- { echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
else
- { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
fi
test -n "$CC" && break
done
fi
if test -z "$CC"; then
ac_ct_CC=$CC
for ac_prog in cl.exe
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
else
if test -n "$ac_ct_CC"; then
ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_CC="$ac_prog"
- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
-done
+ done
IFS=$as_save_IFS
fi
fi
ac_ct_CC=$ac_cv_prog_ac_ct_CC
if test -n "$ac_ct_CC"; then
- { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
-echo "${ECHO_T}$ac_ct_CC" >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
else
- { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
fi
test -n "$ac_ct_CC" && break
done
if test "x$ac_ct_CC" = x; then
CC=""
else
case $cross_compiling:$ac_tool_warned in
yes:)
-{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
-whose name does not start with the host triplet. If you think this
-configuration is useful to you, please write to autoconf@gnu.org." >&5
-echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
-whose name does not start with the host triplet. If you think this
-configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
CC=$ac_ct_CC
fi
fi
fi
-test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
-See \`config.log' for more details." >&5
-echo "$as_me: error: no acceptable C compiler found in \$PATH
-See \`config.log' for more details." >&2;}
- { (exit 1); exit 1; }; }
+test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "no acceptable C compiler found in \$PATH
+See \`config.log' for more details" "$LINENO" 5; }
# Provide some information about the compiler.
-echo "$as_me:$LINENO: checking for C compiler version" >&5
-ac_compiler=`set X $ac_compile; echo $2`
-{ (ac_try="$ac_compiler --version >&5"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
- (eval "$ac_compiler --version >&5") 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }
-{ (ac_try="$ac_compiler -v >&5"
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+ { { ac_try="$ac_compiler $ac_option >&5"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
- (eval "$ac_compiler -v >&5") 2>&5
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_compiler $ac_option >&5") 2>conftest.err
ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }
-{ (ac_try="$ac_compiler -V >&5"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
- (eval "$ac_compiler -V >&5") 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }
+ if test -s conftest.err; then
+ sed '10a\
+... rest of stderr output deleted ...
+ 10q' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ fi
+ rm -f conftest.er1 conftest.err
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+done
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
main ()
{
;
return 0;
}
_ACEOF
ac_clean_files_save=$ac_clean_files
-ac_clean_files="$ac_clean_files a.out a.exe b.out"
+ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
# Try to create an executable without -o first, disregard a.out.
# It will help us diagnose broken compilers, and finding out an intuition
# of exeext.
-{ echo "$as_me:$LINENO: checking for C compiler default output file name" >&5
-echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6; }
-ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
-#
-# List of possible output files, starting from the most likely.
-# The algorithm is not robust to junk in `.', hence go to wildcards (a.*)
-# only as a last resort. b.out is created by i960 compilers.
-ac_files='a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out'
-#
-# The IRIX 6 linker writes into existing files which may not be
-# executable, retaining their permissions. Remove them first so a
-# subsequent execution test works.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
+$as_echo_n "checking whether the C compiler works... " >&6; }
+ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+
+# The possible output files:
+ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
+
ac_rmfiles=
for ac_file in $ac_files
do
case $ac_file in
- *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;;
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
* ) ac_rmfiles="$ac_rmfiles $ac_file";;
esac
done
rm -f $ac_rmfiles
-if { (ac_try="$ac_link_default"
+if { { ac_try="$ac_link_default"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
(eval "$ac_link_default") 2>&5
ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; then
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then :
# Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
# in a Makefile. We should not override ac_cv_exeext if it was cached,
# so that the user can short-circuit this test for compilers unknown to
# Autoconf.
for ac_file in $ac_files ''
do
test -f "$ac_file" || continue
case $ac_file in
- *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj )
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
;;
[ab].out )
# We found the default executable, but exeext='' is most
# certainly right.
break;;
*.* )
- if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+ if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
then :; else
ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
fi
# We set ac_cv_exeext here because the later test for it is not
# safe: cross compilers may not add the suffix if given an `-o'
# argument, so we may need to know it at that point already.
# Even if this section looks crufty: it has the advantage of
# actually working.
break;;
* )
break;;
esac
done
test "$ac_cv_exeext" = no && ac_cv_exeext=
else
ac_file=''
fi
-
-{ echo "$as_me:$LINENO: result: $ac_file" >&5
-echo "${ECHO_T}$ac_file" >&6; }
-if test -z "$ac_file"; then
- echo "$as_me: failed program was:" >&5
+if test -z "$ac_file"; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+$as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
-{ { echo "$as_me:$LINENO: error: C compiler cannot create executables
-See \`config.log' for more details." >&5
-echo "$as_me: error: C compiler cannot create executables
-See \`config.log' for more details." >&2;}
- { (exit 77); exit 77; }; }
-fi
-
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "C compiler cannot create executables
+See \`config.log' for more details" "$LINENO" 5; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
+$as_echo_n "checking for C compiler default output file name... " >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
+$as_echo "$ac_file" >&6; }
ac_exeext=$ac_cv_exeext
-# Check that the compiler produces executables we can run. If not, either
-# the compiler is broken, or we cross compile.
-{ echo "$as_me:$LINENO: checking whether the C compiler works" >&5
-echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6; }
-# FIXME: These cross compiler hacks should be removed for Autoconf 3.0
-# If not cross compiling, check that we can run a simple program.
-if test "$cross_compiling" != yes; then
- if { ac_try='./$ac_file'
- { (case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
- (eval "$ac_try") 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- cross_compiling=no
- else
- if test "$cross_compiling" = maybe; then
- cross_compiling=yes
- else
- { { echo "$as_me:$LINENO: error: cannot run C compiled programs.
-If you meant to cross compile, use \`--host'.
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot run C compiled programs.
-If you meant to cross compile, use \`--host'.
-See \`config.log' for more details." >&2;}
- { (exit 1); exit 1; }; }
- fi
- fi
-fi
-{ echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6; }
-
-rm -f a.out a.exe conftest$ac_cv_exeext b.out
+rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
ac_clean_files=$ac_clean_files_save
-# Check that the compiler produces executables we can run. If not, either
-# the compiler is broken, or we cross compile.
-{ echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
-echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6; }
-{ echo "$as_me:$LINENO: result: $cross_compiling" >&5
-echo "${ECHO_T}$cross_compiling" >&6; }
-
-{ echo "$as_me:$LINENO: checking for suffix of executables" >&5
-echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6; }
-if { (ac_try="$ac_link"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
+$as_echo_n "checking for suffix of executables... " >&6; }
+if { { ac_try="$ac_link"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
(eval "$ac_link") 2>&5
ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; then
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then :
# If both `conftest.exe' and `conftest' are `present' (well, observable)
# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will
# work properly (i.e., refer to `conftest.exe'), while it won't with
# `rm'.
for ac_file in conftest.exe conftest conftest.*; do
test -f "$ac_file" || continue
case $ac_file in
- *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;;
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
*.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
break;;
* ) break;;
esac
done
else
- { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute suffix of executables: cannot compile and link
-See \`config.log' for more details." >&2;}
- { (exit 1); exit 1; }; }
-fi
-
-rm -f conftest$ac_cv_exeext
-{ echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
-echo "${ECHO_T}$ac_cv_exeext" >&6; }
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest conftest$ac_cv_exeext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
+$as_echo "$ac_cv_exeext" >&6; }
rm -f conftest.$ac_ext
EXEEXT=$ac_cv_exeext
ac_exeext=$EXEEXT
-{ echo "$as_me:$LINENO: checking for suffix of object files" >&5
-echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6; }
-if test "${ac_cv_objext+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h. */
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdio.h>
+int
+main ()
+{
+FILE *f = fopen ("conftest.out", "w");
+ return ferror (f) || fclose (f) != 0;
+
+ ;
+ return 0;
+}
_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
+ac_clean_files="$ac_clean_files conftest.out"
+# Check that the compiler produces executables we can run. If not, either
+# the compiler is broken, or we cross compile.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
+$as_echo_n "checking whether we are cross compiling... " >&6; }
+if test "$cross_compiling" != yes; then
+ { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+ if { ac_try='./conftest$ac_cv_exeext'
+ { { case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }; then
+ cross_compiling=no
+ else
+ if test "$cross_compiling" = maybe; then
+ cross_compiling=yes
+ else
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details" "$LINENO" 5; }
+ fi
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
+$as_echo "$cross_compiling" >&6; }
+
+rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
+$as_echo_n "checking for suffix of object files... " >&6; }
+if ${ac_cv_objext+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
main ()
{
;
return 0;
}
_ACEOF
rm -f conftest.o conftest.obj
-if { (ac_try="$ac_compile"
+if { { ac_try="$ac_compile"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
(eval "$ac_compile") 2>&5
ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; then
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then :
for ac_file in conftest.o conftest.obj conftest.*; do
test -f "$ac_file" || continue;
case $ac_file in
- *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf ) ;;
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
*) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
break;;
esac
done
else
- echo "$as_me: failed program was:" >&5
+ $as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
-{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute suffix of object files: cannot compile
-See \`config.log' for more details." >&2;}
- { (exit 1); exit 1; }; }
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of object files: cannot compile
+See \`config.log' for more details" "$LINENO" 5; }
fi
-
rm -f conftest.$ac_cv_objext conftest.$ac_ext
fi
-{ echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
-echo "${ECHO_T}$ac_cv_objext" >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
+$as_echo "$ac_cv_objext" >&6; }
OBJEXT=$ac_cv_objext
ac_objext=$OBJEXT
-{ echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
-echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6; }
-if test "${ac_cv_c_compiler_gnu+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
+$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
+if ${ac_cv_c_compiler_gnu+:} false; then :
+ $as_echo_n "(cached) " >&6
else
- cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
main ()
{
#ifndef __GNUC__
choke me
#endif
;
return 0;
}
_ACEOF
-rm -f conftest.$ac_objext
-if { (ac_try="$ac_compile"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
- (eval "$ac_compile") 2>conftest.er1
- ac_status=$?
- grep -v '^ *+' conftest.er1 >conftest.err
- rm -f conftest.er1
- cat conftest.err >&5
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } && {
- test -z "$ac_c_werror_flag" ||
- test ! -s conftest.err
- } && test -s conftest.$ac_objext; then
+if ac_fn_c_try_compile "$LINENO"; then :
ac_compiler_gnu=yes
else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
- ac_compiler_gnu=no
+ ac_compiler_gnu=no
fi
-
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
ac_cv_c_compiler_gnu=$ac_compiler_gnu
fi
-{ echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
-echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6; }
-GCC=`test $ac_compiler_gnu = yes && echo yes`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+$as_echo "$ac_cv_c_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+ GCC=yes
+else
+ GCC=
+fi
ac_test_CFLAGS=${CFLAGS+set}
ac_save_CFLAGS=$CFLAGS
-{ echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
-echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6; }
-if test "${ac_cv_prog_cc_g+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+$as_echo_n "checking whether $CC accepts -g... " >&6; }
+if ${ac_cv_prog_cc_g+:} false; then :
+ $as_echo_n "(cached) " >&6
else
ac_save_c_werror_flag=$ac_c_werror_flag
ac_c_werror_flag=yes
ac_cv_prog_cc_g=no
CFLAGS="-g"
- cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
main ()
{
;
return 0;
}
_ACEOF
-rm -f conftest.$ac_objext
-if { (ac_try="$ac_compile"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
- (eval "$ac_compile") 2>conftest.er1
- ac_status=$?
- grep -v '^ *+' conftest.er1 >conftest.err
- rm -f conftest.er1
- cat conftest.err >&5
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } && {
- test -z "$ac_c_werror_flag" ||
- test ! -s conftest.err
- } && test -s conftest.$ac_objext; then
+if ac_fn_c_try_compile "$LINENO"; then :
ac_cv_prog_cc_g=yes
else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
- CFLAGS=""
- cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
+ CFLAGS=""
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
main ()
{
;
return 0;
}
_ACEOF
-rm -f conftest.$ac_objext
-if { (ac_try="$ac_compile"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
- (eval "$ac_compile") 2>conftest.er1
- ac_status=$?
- grep -v '^ *+' conftest.er1 >conftest.err
- rm -f conftest.er1
- cat conftest.err >&5
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } && {
- test -z "$ac_c_werror_flag" ||
- test ! -s conftest.err
- } && test -s conftest.$ac_objext; then
- :
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
+if ac_fn_c_try_compile "$LINENO"; then :
- ac_c_werror_flag=$ac_save_c_werror_flag
+else
+ ac_c_werror_flag=$ac_save_c_werror_flag
CFLAGS="-g"
- cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
main ()
{
;
return 0;
}
_ACEOF
-rm -f conftest.$ac_objext
-if { (ac_try="$ac_compile"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
- (eval "$ac_compile") 2>conftest.er1
- ac_status=$?
- grep -v '^ *+' conftest.er1 >conftest.err
- rm -f conftest.er1
- cat conftest.err >&5
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } && {
- test -z "$ac_c_werror_flag" ||
- test ! -s conftest.err
- } && test -s conftest.$ac_objext; then
+if ac_fn_c_try_compile "$LINENO"; then :
ac_cv_prog_cc_g=yes
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-
fi
-
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
-
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
-
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
ac_c_werror_flag=$ac_save_c_werror_flag
fi
-{ echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
-echo "${ECHO_T}$ac_cv_prog_cc_g" >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+$as_echo "$ac_cv_prog_cc_g" >&6; }
if test "$ac_test_CFLAGS" = set; then
CFLAGS=$ac_save_CFLAGS
elif test $ac_cv_prog_cc_g = yes; then
if test "$GCC" = yes; then
CFLAGS="-g -O2"
else
CFLAGS="-g"
fi
else
if test "$GCC" = yes; then
CFLAGS="-O2"
else
CFLAGS=
fi
fi
-{ echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5
-echo $ECHO_N "checking for $CC option to accept ISO C89... $ECHO_C" >&6; }
-if test "${ac_cv_prog_cc_c89+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
+$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
+if ${ac_cv_prog_cc_c89+:} false; then :
+ $as_echo_n "(cached) " >&6
else
ac_cv_prog_cc_c89=no
ac_save_CC=$CC
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <stdarg.h>
#include <stdio.h>
-#include <sys/types.h>
-#include <sys/stat.h>
+struct stat;
/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
struct buf { int x; };
FILE * (*rcsopen) (struct buf *, struct stat *, int);
static char *e (p, i)
char **p;
int i;
{
return p[i];
}
static char *f (char * (*g) (char **, int), char **p, ...)
{
char *s;
va_list v;
va_start (v,p);
s = g (p, va_arg (v,int));
va_end (v);
return s;
}
/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has
function prototypes and stuff, but not '\xHH' hex character constants.
These don't provoke an error unfortunately, instead are silently treated
as 'x'. The following induces an error, until -std is added to get
proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an
array size at least. It's necessary to write '\x00'==0 to get something
that's true only with -std. */
int osf4_cc_array ['\x00' == 0 ? 1 : -1];
/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
inside strings and character constants. */
#define FOO(x) 'x'
int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
int test (int i, double x);
struct s1 {int (*f) (int a);};
struct s2 {int (*f) (double a);};
int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
int argc;
char **argv;
int
main ()
{
return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1];
;
return 0;
}
_ACEOF
for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
-Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
do
CC="$ac_save_CC $ac_arg"
- rm -f conftest.$ac_objext
-if { (ac_try="$ac_compile"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
- (eval "$ac_compile") 2>conftest.er1
- ac_status=$?
- grep -v '^ *+' conftest.er1 >conftest.err
- rm -f conftest.er1
- cat conftest.err >&5
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } && {
- test -z "$ac_c_werror_flag" ||
- test ! -s conftest.err
- } && test -s conftest.$ac_objext; then
+ if ac_fn_c_try_compile "$LINENO"; then :
ac_cv_prog_cc_c89=$ac_arg
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-
fi
-
rm -f core conftest.err conftest.$ac_objext
test "x$ac_cv_prog_cc_c89" != "xno" && break
done
rm -f conftest.$ac_ext
CC=$ac_save_CC
fi
# AC_CACHE_VAL
case "x$ac_cv_prog_cc_c89" in
x)
- { echo "$as_me:$LINENO: result: none needed" >&5
-echo "${ECHO_T}none needed" >&6; } ;;
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
xno)
- { echo "$as_me:$LINENO: result: unsupported" >&5
-echo "${ECHO_T}unsupported" >&6; } ;;
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
*)
CC="$CC $ac_cv_prog_cc_c89"
- { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5
-echo "${ECHO_T}$ac_cv_prog_cc_c89" >&6; } ;;
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
esac
+if test "x$ac_cv_prog_cc_c89" != xno; then :
+fi
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
-ac_ext=f
-ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5'
-ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_f77_compiler_gnu
+ac_ext=${ac_fc_srcext-f}
+ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
+ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_fc_compiler_gnu
if test -n "$ac_tool_prefix"; then
- for ac_prog in g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77 xlf90 f90 pgf90 pghpf epcf90 gfortran g95 xlf95 f95 fort ifort ifc efc pgf95 lf95 ftn
+ for ac_prog in gfortran g95 xlf95 f95 fort ifort ifc efc pgfortran pgf95 lf95 ftn nagfor xlf90 f90 pgf90 pghpf epcf90 g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77
do
# Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
-if test "${ac_cv_prog_F77+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_FC+:} false; then :
+ $as_echo_n "(cached) " >&6
else
- if test -n "$F77"; then
- ac_cv_prog_F77="$F77" # Let the user override the test.
+ if test -n "$FC"; then
+ ac_cv_prog_FC="$FC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
- ac_cv_prog_F77="$ac_tool_prefix$ac_prog"
- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_FC="$ac_tool_prefix$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
-done
+ done
IFS=$as_save_IFS
fi
fi
-F77=$ac_cv_prog_F77
-if test -n "$F77"; then
- { echo "$as_me:$LINENO: result: $F77" >&5
-echo "${ECHO_T}$F77" >&6; }
+FC=$ac_cv_prog_FC
+if test -n "$FC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FC" >&5
+$as_echo "$FC" >&6; }
else
- { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
fi
- test -n "$F77" && break
+ test -n "$FC" && break
done
fi
-if test -z "$F77"; then
- ac_ct_F77=$F77
- for ac_prog in g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77 xlf90 f90 pgf90 pghpf epcf90 gfortran g95 xlf95 f95 fort ifort ifc efc pgf95 lf95 ftn
+if test -z "$FC"; then
+ ac_ct_FC=$FC
+ for ac_prog in gfortran g95 xlf95 f95 fort ifort ifc efc pgfortran pgf95 lf95 ftn nagfor xlf90 f90 pgf90 pghpf epcf90 g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
-if test "${ac_cv_prog_ac_ct_F77+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_FC+:} false; then :
+ $as_echo_n "(cached) " >&6
else
- if test -n "$ac_ct_F77"; then
- ac_cv_prog_ac_ct_F77="$ac_ct_F77" # Let the user override the test.
+ if test -n "$ac_ct_FC"; then
+ ac_cv_prog_ac_ct_FC="$ac_ct_FC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
- ac_cv_prog_ac_ct_F77="$ac_prog"
- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_FC="$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
-done
+ done
IFS=$as_save_IFS
fi
fi
-ac_ct_F77=$ac_cv_prog_ac_ct_F77
-if test -n "$ac_ct_F77"; then
- { echo "$as_me:$LINENO: result: $ac_ct_F77" >&5
-echo "${ECHO_T}$ac_ct_F77" >&6; }
+ac_ct_FC=$ac_cv_prog_ac_ct_FC
+if test -n "$ac_ct_FC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_FC" >&5
+$as_echo "$ac_ct_FC" >&6; }
else
- { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
fi
- test -n "$ac_ct_F77" && break
+ test -n "$ac_ct_FC" && break
done
- if test "x$ac_ct_F77" = x; then
- F77=""
+ if test "x$ac_ct_FC" = x; then
+ FC=""
else
case $cross_compiling:$ac_tool_warned in
yes:)
-{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
-whose name does not start with the host triplet. If you think this
-configuration is useful to you, please write to autoconf@gnu.org." >&5
-echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
-whose name does not start with the host triplet. If you think this
-configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
- F77=$ac_ct_F77
+ FC=$ac_ct_FC
fi
fi
# Provide some information about the compiler.
-echo "$as_me:$LINENO: checking for Fortran 77 compiler version" >&5
-ac_compiler=`set X $ac_compile; echo $2`
-{ (ac_try="$ac_compiler --version >&5"
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for Fortran compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+ { { ac_try="$ac_compiler $ac_option >&5"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
- (eval "$ac_compiler --version >&5") 2>&5
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_compiler $ac_option >&5") 2>conftest.err
ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }
-{ (ac_try="$ac_compiler -v >&5"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
- (eval "$ac_compiler -v >&5") 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }
-{ (ac_try="$ac_compiler -V >&5"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
- (eval "$ac_compiler -V >&5") 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }
+ if test -s conftest.err; then
+ sed '10a\
+... rest of stderr output deleted ...
+ 10q' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ fi
+ rm -f conftest.er1 conftest.err
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+done
rm -f a.out
# If we don't use `.F' as extension, the preprocessor is not run on the
# input file. (Note that this only needs to work for GNU compilers.)
ac_save_ext=$ac_ext
ac_ext=F
-{ echo "$as_me:$LINENO: checking whether we are using the GNU Fortran 77 compiler" >&5
-echo $ECHO_N "checking whether we are using the GNU Fortran 77 compiler... $ECHO_C" >&6; }
-if test "${ac_cv_f77_compiler_gnu+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU Fortran compiler" >&5
+$as_echo_n "checking whether we are using the GNU Fortran compiler... " >&6; }
+if ${ac_cv_fc_compiler_gnu+:} false; then :
+ $as_echo_n "(cached) " >&6
else
- cat >conftest.$ac_ext <<_ACEOF
+ cat > conftest.$ac_ext <<_ACEOF
program main
#ifndef __GNUC__
choke me
#endif
end
_ACEOF
-rm -f conftest.$ac_objext
-if { (ac_try="$ac_compile"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
- (eval "$ac_compile") 2>conftest.er1
- ac_status=$?
- grep -v '^ *+' conftest.er1 >conftest.err
- rm -f conftest.er1
- cat conftest.err >&5
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } && {
- test -z "$ac_f77_werror_flag" ||
- test ! -s conftest.err
- } && test -s conftest.$ac_objext; then
+if ac_fn_fc_try_compile "$LINENO"; then :
ac_compiler_gnu=yes
else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
- ac_compiler_gnu=no
+ ac_compiler_gnu=no
fi
-
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-ac_cv_f77_compiler_gnu=$ac_compiler_gnu
+ac_cv_fc_compiler_gnu=$ac_compiler_gnu
fi
-{ echo "$as_me:$LINENO: result: $ac_cv_f77_compiler_gnu" >&5
-echo "${ECHO_T}$ac_cv_f77_compiler_gnu" >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_fc_compiler_gnu" >&5
+$as_echo "$ac_cv_fc_compiler_gnu" >&6; }
ac_ext=$ac_save_ext
-ac_test_FFLAGS=${FFLAGS+set}
-ac_save_FFLAGS=$FFLAGS
-FFLAGS=
-{ echo "$as_me:$LINENO: checking whether $F77 accepts -g" >&5
-echo $ECHO_N "checking whether $F77 accepts -g... $ECHO_C" >&6; }
-if test "${ac_cv_prog_f77_g+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
+ac_test_FCFLAGS=${FCFLAGS+set}
+ac_save_FCFLAGS=$FCFLAGS
+FCFLAGS=
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $FC accepts -g" >&5
+$as_echo_n "checking whether $FC accepts -g... " >&6; }
+if ${ac_cv_prog_fc_g+:} false; then :
+ $as_echo_n "(cached) " >&6
else
- FFLAGS=-g
-cat >conftest.$ac_ext <<_ACEOF
+ FCFLAGS=-g
+cat > conftest.$ac_ext <<_ACEOF
program main
end
_ACEOF
-rm -f conftest.$ac_objext
-if { (ac_try="$ac_compile"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
- (eval "$ac_compile") 2>conftest.er1
- ac_status=$?
- grep -v '^ *+' conftest.er1 >conftest.err
- rm -f conftest.er1
- cat conftest.err >&5
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } && {
- test -z "$ac_f77_werror_flag" ||
- test ! -s conftest.err
- } && test -s conftest.$ac_objext; then
- ac_cv_prog_f77_g=yes
+if ac_fn_fc_try_compile "$LINENO"; then :
+ ac_cv_prog_fc_g=yes
else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
- ac_cv_prog_f77_g=no
+ ac_cv_prog_fc_g=no
fi
-
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
-{ echo "$as_me:$LINENO: result: $ac_cv_prog_f77_g" >&5
-echo "${ECHO_T}$ac_cv_prog_f77_g" >&6; }
-if test "$ac_test_FFLAGS" = set; then
- FFLAGS=$ac_save_FFLAGS
-elif test $ac_cv_prog_f77_g = yes; then
- if test "x$ac_cv_f77_compiler_gnu" = xyes; then
- FFLAGS="-g -O2"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_fc_g" >&5
+$as_echo "$ac_cv_prog_fc_g" >&6; }
+if test "$ac_test_FCFLAGS" = set; then
+ FCFLAGS=$ac_save_FCFLAGS
+elif test $ac_cv_prog_fc_g = yes; then
+ if test "x$ac_cv_fc_compiler_gnu" = xyes; then
+ FCFLAGS="-g -O2"
else
- FFLAGS="-g"
+ FCFLAGS="-g"
fi
else
- if test "x$ac_cv_f77_compiler_gnu" = xyes; then
- FFLAGS="-O2"
+ if test "x$ac_cv_fc_compiler_gnu" = xyes; then
+ FCFLAGS="-O2"
else
- FFLAGS=
+ FCFLAGS=
fi
fi
-G77=`test $ac_compiler_gnu = yes && echo yes`
+if test $ac_compiler_gnu = yes; then
+ GFC=yes
+else
+ GFC=
+fi
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
set dummy ${ac_tool_prefix}ranlib; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
-if test "${ac_cv_prog_RANLIB+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_RANLIB+:} false; then :
+ $as_echo_n "(cached) " >&6
else
if test -n "$RANLIB"; then
ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
-done
+ done
IFS=$as_save_IFS
fi
fi
RANLIB=$ac_cv_prog_RANLIB
if test -n "$RANLIB"; then
- { echo "$as_me:$LINENO: result: $RANLIB" >&5
-echo "${ECHO_T}$RANLIB" >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
+$as_echo "$RANLIB" >&6; }
else
- { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
fi
fi
if test -z "$ac_cv_prog_RANLIB"; then
ac_ct_RANLIB=$RANLIB
# Extract the first word of "ranlib", so it can be a program name with args.
set dummy ranlib; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
-if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_RANLIB+:} false; then :
+ $as_echo_n "(cached) " >&6
else
if test -n "$ac_ct_RANLIB"; then
ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_RANLIB="ranlib"
- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
-done
+ done
IFS=$as_save_IFS
fi
fi
ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
if test -n "$ac_ct_RANLIB"; then
- { echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5
-echo "${ECHO_T}$ac_ct_RANLIB" >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
+$as_echo "$ac_ct_RANLIB" >&6; }
else
- { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
fi
if test "x$ac_ct_RANLIB" = x; then
RANLIB=":"
else
case $cross_compiling:$ac_tool_warned in
yes:)
-{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
-whose name does not start with the host triplet. If you think this
-configuration is useful to you, please write to autoconf@gnu.org." >&5
-echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
-whose name does not start with the host triplet. If you think this
-configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
RANLIB=$ac_ct_RANLIB
fi
else
RANLIB="$ac_cv_prog_RANLIB"
fi
ac_aux_dir=
for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
if test -f "$ac_dir/install-sh"; then
ac_aux_dir=$ac_dir
ac_install_sh="$ac_aux_dir/install-sh -c"
break
elif test -f "$ac_dir/install.sh"; then
ac_aux_dir=$ac_dir
ac_install_sh="$ac_aux_dir/install.sh -c"
break
elif test -f "$ac_dir/shtool"; then
ac_aux_dir=$ac_dir
ac_install_sh="$ac_aux_dir/shtool install -c"
break
fi
done
if test -z "$ac_aux_dir"; then
- { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&5
-echo "$as_me: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&2;}
- { (exit 1); exit 1; }; }
+ as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5
fi
# These three variables are undocumented and unsupported,
# and are intended to be withdrawn in a future Autoconf release.
# They can cause serious problems if a builder's source tree is in a directory
# whose full name contains unusual characters.
ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var.
ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var.
ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var.
# Find a good install program. We prefer a C program (faster),
# so one script is as good as another. But avoid the broken or
# incompatible versions:
# SysV /etc/install, /usr/sbin/install
# SunOS /usr/etc/install
# IRIX /sbin/install
# AIX /bin/install
# AmigaOS /C/install, which installs bootblocks on floppy discs
# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
# AFS /usr/afsws/bin/install, which mishandles nonexistent args
# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
# OS/2's system install, which has a completely different semantic
# ./install, which can be erroneously created by make from ./install.sh.
-{ echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
-echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6; }
+# Reject install programs that cannot install multiple files.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
+$as_echo_n "checking for a BSD-compatible install... " >&6; }
if test -z "$INSTALL"; then
-if test "${ac_cv_path_install+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
+if ${ac_cv_path_install+:} false; then :
+ $as_echo_n "(cached) " >&6
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
- # Account for people who put trailing slashes in PATH elements.
-case $as_dir/ in
- ./ | .// | /cC/* | \
+ # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in #((
+ ./ | .// | /[cC]/* | \
/etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
- ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \
+ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
/usr/ucb/* ) ;;
*)
# OSF1 and SCO ODT 3.0 have their own names for install.
# Don't use installbsd from OSF since it installs stuff as root
# by default.
for ac_prog in ginstall scoinst install; do
for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then
+ if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
if test $ac_prog = install &&
grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
# AIX install. It has an incompatible calling convention.
:
elif test $ac_prog = install &&
grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
# program-specific install script used by HP pwplus--don't use.
:
else
- ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
- break 3
+ rm -rf conftest.one conftest.two conftest.dir
+ echo one > conftest.one
+ echo two > conftest.two
+ mkdir conftest.dir
+ if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
+ test -s conftest.one && test -s conftest.two &&
+ test -s conftest.dir/conftest.one &&
+ test -s conftest.dir/conftest.two
+ then
+ ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+ break 3
+ fi
fi
fi
done
done
;;
esac
-done
+
+ done
IFS=$as_save_IFS
+rm -rf conftest.one conftest.two conftest.dir
fi
if test "${ac_cv_path_install+set}" = set; then
INSTALL=$ac_cv_path_install
else
# As a last resort, use the slow shell script. Don't cache a
# value for INSTALL within a source directory, because that will
# break other packages using the cache if that directory is
# removed, or if the value is a relative name.
INSTALL=$ac_install_sh
fi
fi
-{ echo "$as_me:$LINENO: result: $INSTALL" >&5
-echo "${ECHO_T}$INSTALL" >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
+$as_echo "$INSTALL" >&6; }
# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
# It thinks the first close brace ends the variable substitution.
test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
-if test "$GCC" = yes; then
- case `$CC --version 2>&1 < /dev/null` in
- *LLVM*) opt=-O3 ;;
- *gcc*4.2* | *gcc*4.4.3*) opt=-O0 ;;
- *) opt=-O3 ;;
+if test "$GCC" = yes; then :
+ case `$CC --version 2>&1 < /dev/null` in #(
+ *LLVM*) :
+ opt=-O3 ;; #(
+ *gcc*4.2* | *gcc*4.4.3*) :
+ opt=-O0 ;; #(
+ *) :
+ opt=-O3 ;;
esac
-
- CFLAGS=${USER_CFLAGS:-$opt -fomit-frame-pointer -ffast-math}
+ CFLAGS=${USER_CFLAGS:-$opt -fomit-frame-pointer -ffast-math -Wall}
else
CFLAGS=${USER_CFLAGS:--O}
fi
-
-{ echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5
-echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6; }
-if test "${ac_cv_c_const+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5
+$as_echo_n "checking for an ANSI C-conforming const... " >&6; }
+if ${ac_cv_c_const+:} false; then :
+ $as_echo_n "(cached) " >&6
else
- cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
main ()
{
-/* FIXME: Include the comments suggested by Paul. */
+
#ifndef __cplusplus
- /* Ultrix mips cc rejects this. */
+ /* Ultrix mips cc rejects this sort of thing. */
typedef int charset[2];
- const charset cs;
+ const charset cs = { 0, 0 };
/* SunOS 4.1.1 cc rejects this. */
char const *const *pcpcc;
char **ppc;
/* NEC SVR4.0.2 mips cc rejects this. */
struct point {int x, y;};
static struct point const zero = {0,0};
/* AIX XL C 1.02.0.0 rejects this.
It does not let you subtract one const X* pointer from another in
an arm of an if-expression whose if-part is not a constant
expression */
const char *g = "string";
pcpcc = &g + (g ? g-g : 0);
/* HPUX 7.0 cc rejects these. */
++pcpcc;
ppc = (char**) pcpcc;
pcpcc = (char const *const *) ppc;
- { /* SCO 3.2v4 cc rejects this. */
- char *t;
+ { /* SCO 3.2v4 cc rejects this sort of thing. */
+ char tx;
+ char *t = &tx;
char const *s = 0 ? (char *) 0 : (char const *) 0;
*t++ = 0;
if (s) return 0;
}
{ /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */
int x[] = {25, 17};
const int *foo = &x[0];
++foo;
}
{ /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */
typedef const int *iptr;
iptr p = 0;
++p;
}
- { /* AIX XL C 1.02.0.0 rejects this saying
+ { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying
"k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
- struct s { int j; const int *ap[3]; };
- struct s *b; b->j = 5;
+ struct s { int j; const int *ap[3]; } bx;
+ struct s *b = &bx; b->j = 5;
}
{ /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
const int foo = 10;
if (!foo) return 0;
}
return !cs[0] && !zero.x;
#endif
;
return 0;
}
_ACEOF
-rm -f conftest.$ac_objext
-if { (ac_try="$ac_compile"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
- (eval "$ac_compile") 2>conftest.er1
- ac_status=$?
- grep -v '^ *+' conftest.er1 >conftest.err
- rm -f conftest.er1
- cat conftest.err >&5
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } && {
- test -z "$ac_c_werror_flag" ||
- test ! -s conftest.err
- } && test -s conftest.$ac_objext; then
+if ac_fn_c_try_compile "$LINENO"; then :
ac_cv_c_const=yes
else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
- ac_cv_c_const=no
+ ac_cv_c_const=no
fi
-
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
-{ echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5
-echo "${ECHO_T}$ac_cv_c_const" >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5
+$as_echo "$ac_cv_c_const" >&6; }
if test $ac_cv_c_const = no; then
-cat >>confdefs.h <<\_ACEOF
-#define const
-_ACEOF
+$as_echo "#define const /**/" >>confdefs.h
fi
-{ echo "$as_me:$LINENO: checking for inline" >&5
-echo $ECHO_N "checking for inline... $ECHO_C" >&6; }
-if test "${ac_cv_c_inline+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5
+$as_echo_n "checking for inline... " >&6; }
+if ${ac_cv_c_inline+:} false; then :
+ $as_echo_n "(cached) " >&6
else
ac_cv_c_inline=no
for ac_kw in inline __inline__ __inline; do
- cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#ifndef __cplusplus
typedef int foo_t;
static $ac_kw foo_t static_foo () {return 0; }
$ac_kw foo_t foo () {return 0; }
#endif
_ACEOF
-rm -f conftest.$ac_objext
-if { (ac_try="$ac_compile"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
- (eval "$ac_compile") 2>conftest.er1
- ac_status=$?
- grep -v '^ *+' conftest.er1 >conftest.err
- rm -f conftest.er1
- cat conftest.err >&5
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } && {
- test -z "$ac_c_werror_flag" ||
- test ! -s conftest.err
- } && test -s conftest.$ac_objext; then
+if ac_fn_c_try_compile "$LINENO"; then :
ac_cv_c_inline=$ac_kw
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-
fi
-
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
test "$ac_cv_c_inline" != no && break
done
fi
-{ echo "$as_me:$LINENO: result: $ac_cv_c_inline" >&5
-echo "${ECHO_T}$ac_cv_c_inline" >&6; }
-
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5
+$as_echo "$ac_cv_c_inline" >&6; }
case $ac_cv_c_inline in
inline | yes) ;;
*)
case $ac_cv_c_inline in
no) ac_val=;;
*) ac_val=$ac_cv_c_inline;;
esac
cat >>confdefs.h <<_ACEOF
#ifndef __cplusplus
#define inline $ac_val
#endif
_ACEOF
;;
esac
- { echo "$as_me:$LINENO: checking for long double with more range or precision than double" >&5
-echo $ECHO_N "checking for long double with more range or precision than double... $ECHO_C" >&6; }
-if test "${ac_cv_type_long_double_wider+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for long double with more range or precision than double" >&5
+$as_echo_n "checking for long double with more range or precision than double... " >&6; }
+if ${ac_cv_type_long_double_wider+:} false; then :
+ $as_echo_n "(cached) " >&6
else
- cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <float.h>
long double const a[] =
{
0.0L, DBL_MIN, DBL_MAX, DBL_EPSILON,
LDBL_MIN, LDBL_MAX, LDBL_EPSILON
};
long double
f (long double x)
{
return ((x + (unsigned long int) 10) * (-1 / x) + a[0]
+ (x ? f (x) : 'c'));
}
int
main ()
{
static int test_array [1 - 2 * !((0 < ((DBL_MAX_EXP < LDBL_MAX_EXP)
+ (DBL_MANT_DIG < LDBL_MANT_DIG)
- (LDBL_MAX_EXP < DBL_MAX_EXP)
- (LDBL_MANT_DIG < DBL_MANT_DIG)))
&& (int) LDBL_EPSILON == 0
)];
-test_array [0] = 0
+test_array [0] = 0;
+return test_array [0];
;
return 0;
}
_ACEOF
-rm -f conftest.$ac_objext
-if { (ac_try="$ac_compile"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
- (eval "$ac_compile") 2>conftest.er1
- ac_status=$?
- grep -v '^ *+' conftest.er1 >conftest.err
- rm -f conftest.er1
- cat conftest.err >&5
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } && {
- test -z "$ac_c_werror_flag" ||
- test ! -s conftest.err
- } && test -s conftest.$ac_objext; then
+if ac_fn_c_try_compile "$LINENO"; then :
ac_cv_type_long_double_wider=yes
else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
- ac_cv_type_long_double_wider=no
+ ac_cv_type_long_double_wider=no
fi
-
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
-{ echo "$as_me:$LINENO: result: $ac_cv_type_long_double_wider" >&5
-echo "${ECHO_T}$ac_cv_type_long_double_wider" >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_long_double_wider" >&5
+$as_echo "$ac_cv_type_long_double_wider" >&6; }
if test $ac_cv_type_long_double_wider = yes; then
-cat >>confdefs.h <<\_ACEOF
-#define HAVE_LONG_DOUBLE_WIDER 1
-_ACEOF
+$as_echo "#define HAVE_LONG_DOUBLE_WIDER 1" >>confdefs.h
fi
ac_cv_c_long_double=$ac_cv_type_long_double_wider
if test $ac_cv_c_long_double = yes; then
-cat >>confdefs.h <<\_ACEOF
-#define HAVE_LONG_DOUBLE 1
-_ACEOF
+$as_echo "#define HAVE_LONG_DOUBLE 1" >>confdefs.h
fi
-
-for ac_func in powl
-do
-as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
-{ echo "$as_me:$LINENO: checking for $ac_func" >&5
-echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
-if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
+$as_echo_n "checking how to run the C preprocessor... " >&6; }
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+ CPP=
+fi
+if test -z "$CPP"; then
+ if ${ac_cv_prog_CPP+:} false; then :
+ $as_echo_n "(cached) " >&6
else
- cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h. */
+ # Double quotes because CPP needs to be expanded
+ for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+ do
+ ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
-/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
- For example, HP-UX 11i <limits.h> declares gettimeofday. */
-#define $ac_func innocuous_$ac_func
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+ # Broken: success on invalid input.
+continue
+else
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
-/* System header to define __stub macros and hopefully few prototypes,
- which can conflict with char $ac_func (); below.
- Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
- <limits.h> exists even on freestanding compilers. */
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+ break
+fi
+
+ done
+ ac_cv_prog_CPP=$CPP
+fi
+ CPP=$ac_cv_prog_CPP
+else
+ ac_cv_prog_CPP=$CPP
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
+$as_echo "$CPP" >&6; }
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
#ifdef __STDC__
# include <limits.h>
#else
# include <assert.h>
#endif
+ Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
-#undef $ac_func
+else
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
-/* Override any GCC internal prototype to avoid an error.
- Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
-#endif
-char $ac_func ();
-/* The GNU C library defines this for functions which it implements
- to always fail with ENOSYS. Some functions are actually named
- something starting with __ and the normal name is an alias. */
-#if defined __stub_$ac_func || defined __stub___$ac_func
-choke me
-#endif
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+ # Broken: success on invalid input.
+continue
+else
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+
+else
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
+$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
+if ${ac_cv_path_GREP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -z "$GREP"; then
+ ac_path_GREP_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_prog in grep ggrep; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_GREP" || continue
+# Check for GNU ac_path_GREP and select it if it is found.
+ # Check for GNU $ac_path_GREP
+case `"$ac_path_GREP" --version 2>&1` in
+*GNU*)
+ ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+*)
+ ac_count=0
+ $as_echo_n 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ $as_echo 'GREP' >> "conftest.nl"
+ "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_GREP_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_GREP="$ac_path_GREP"
+ ac_path_GREP_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_GREP_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_GREP"; then
+ as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ fi
+else
+ ac_cv_path_GREP=$GREP
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
+$as_echo "$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
+$as_echo_n "checking for egrep... " >&6; }
+if ${ac_cv_path_EGREP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+ then ac_cv_path_EGREP="$GREP -E"
+ else
+ if test -z "$EGREP"; then
+ ac_path_EGREP_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_prog in egrep; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_EGREP" || continue
+# Check for GNU ac_path_EGREP and select it if it is found.
+ # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+ ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+ ac_count=0
+ $as_echo_n 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ $as_echo 'EGREP' >> "conftest.nl"
+ "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_EGREP="$ac_path_EGREP"
+ ac_path_EGREP_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_EGREP_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_EGREP"; then
+ as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ fi
+else
+ ac_cv_path_EGREP=$EGREP
+fi
+
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
+$as_echo "$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
+$as_echo_n "checking for ANSI C header files... " >&6; }
+if ${ac_cv_header_stdc+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
int
main ()
{
-return $ac_func ();
+
;
return 0;
}
_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (ac_try="$ac_link"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
- (eval "$ac_link") 2>conftest.er1
- ac_status=$?
- grep -v '^ *+' conftest.er1 >conftest.err
- rm -f conftest.er1
- cat conftest.err >&5
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } && {
- test -z "$ac_c_werror_flag" ||
- test ! -s conftest.err
- } && test -s conftest$ac_exeext &&
- $as_test_x conftest$ac_exeext; then
- eval "$as_ac_var=yes"
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_header_stdc=yes
else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
+ ac_cv_header_stdc=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+ # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "memchr" >/dev/null 2>&1; then :
+
+else
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
- eval "$as_ac_var=no"
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "free" >/dev/null 2>&1; then :
+
+else
+ ac_cv_header_stdc=no
fi
+rm -f conftest*
-rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
- conftest$ac_exeext conftest.$ac_ext
fi
-ac_res=`eval echo '${'$as_ac_var'}'`
- { echo "$as_me:$LINENO: result: $ac_res" >&5
-echo "${ECHO_T}$ac_res" >&6; }
-if test `eval echo '${'$as_ac_var'}'` = yes; then
+
+if test $ac_cv_header_stdc = yes; then
+ # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+ if test "$cross_compiling" = yes; then :
+ :
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ctype.h>
+#include <stdlib.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+ (('a' <= (c) && (c) <= 'i') \
+ || ('j' <= (c) && (c) <= 'r') \
+ || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+ int i;
+ for (i = 0; i < 256; i++)
+ if (XOR (islower (i), ISLOWER (i))
+ || toupper (i) != TOUPPER (i))
+ return 2;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+
+else
+ ac_cv_header_stdc=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
+$as_echo "$ac_cv_header_stdc" >&6; }
+if test $ac_cv_header_stdc = yes; then
+
+$as_echo "#define STDC_HEADERS 1" >>confdefs.h
+
+fi
+
+# On IRIX 5.3, sys/types and inttypes.h are conflicting.
+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+ inttypes.h stdint.h unistd.h
+do :
+ as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
+"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
_ACEOF
fi
+
done
-for ac_func in erf
-do
-as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
-{ echo "$as_me:$LINENO: checking for $ac_func" >&5
-echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
-if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
+ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default"
+if test "x$ac_cv_type_size_t" = xyes; then :
+
+else
+
+cat >>confdefs.h <<_ACEOF
+#define size_t unsigned int
+_ACEOF
+
+fi
+
+ac_fn_c_check_type "$LINENO" "ssize_t" "ac_cv_type_ssize_t" "$ac_includes_default"
+if test "x$ac_cv_type_ssize_t" = xyes; then :
+
+else
+
+cat >>confdefs.h <<_ACEOF
+#define ssize_t int
+_ACEOF
+
+fi
+
+ac_fn_c_check_type "$LINENO" "pid_t" "ac_cv_type_pid_t" "$ac_includes_default"
+if test "x$ac_cv_type_pid_t" = xyes; then :
+
else
- cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h. */
+
+cat >>confdefs.h <<_ACEOF
+#define pid_t int
+_ACEOF
+
+fi
+
+
+for ac_func in powl
+do :
+ ac_fn_c_check_func "$LINENO" "powl" "ac_cv_func_powl"
+if test "x$ac_cv_func_powl" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_POWL 1
_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
+
+fi
+done
+
+for ac_func in erf
+do :
+ ac_fn_c_check_func "$LINENO" "erf" "ac_cv_func_erf"
+if test "x$ac_cv_func_erf" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_ERF 1
+_ACEOF
+
+fi
+done
+
+for ac_header in vfork.h
+do :
+ ac_fn_c_check_header_mongrel "$LINENO" "vfork.h" "ac_cv_header_vfork_h" "$ac_includes_default"
+if test "x$ac_cv_header_vfork_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_VFORK_H 1
+_ACEOF
+
+fi
+
+done
+
+for ac_func in fork vfork
+do :
+ as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
+if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+if test "x$ac_cv_func_fork" = xyes; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working fork" >&5
+$as_echo_n "checking for working fork... " >&6; }
+if ${ac_cv_func_fork_works+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test "$cross_compiling" = yes; then :
+ ac_cv_func_fork_works=cross
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
-/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
- For example, HP-UX 11i <limits.h> declares gettimeofday. */
-#define $ac_func innocuous_$ac_func
+$ac_includes_default
+int
+main ()
+{
-/* System header to define __stub macros and hopefully few prototypes,
- which can conflict with char $ac_func (); below.
- Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
- <limits.h> exists even on freestanding compilers. */
+ /* By Ruediger Kuhlmann. */
+ return fork () < 0;
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+ ac_cv_func_fork_works=yes
+else
+ ac_cv_func_fork_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
-#undef $ac_func
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_fork_works" >&5
+$as_echo "$ac_cv_func_fork_works" >&6; }
-/* Override any GCC internal prototype to avoid an error.
- Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
+else
+ ac_cv_func_fork_works=$ac_cv_func_fork
+fi
+if test "x$ac_cv_func_fork_works" = xcross; then
+ case $host in
+ *-*-amigaos* | *-*-msdosdjgpp*)
+ # Override, as these systems have only a dummy fork() stub
+ ac_cv_func_fork_works=no
+ ;;
+ *)
+ ac_cv_func_fork_works=yes
+ ;;
+ esac
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: result $ac_cv_func_fork_works guessed because of cross compilation" >&5
+$as_echo "$as_me: WARNING: result $ac_cv_func_fork_works guessed because of cross compilation" >&2;}
+fi
+ac_cv_func_vfork_works=$ac_cv_func_vfork
+if test "x$ac_cv_func_vfork" = xyes; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working vfork" >&5
+$as_echo_n "checking for working vfork... " >&6; }
+if ${ac_cv_func_vfork_works+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test "$cross_compiling" = yes; then :
+ ac_cv_func_vfork_works=cross
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+/* Thanks to Paul Eggert for this test. */
+$ac_includes_default
+#include <sys/wait.h>
+#ifdef HAVE_VFORK_H
+# include <vfork.h>
+#endif
+/* On some sparc systems, changes by the child to local and incoming
+ argument registers are propagated back to the parent. The compiler
+ is told about this with #include <vfork.h>, but some compilers
+ (e.g. gcc -O) don't grok <vfork.h>. Test for this by using a
+ static variable whose address is put into a register that is
+ clobbered by the vfork. */
+static void
#ifdef __cplusplus
-extern "C"
+sparc_address_test (int arg)
+# else
+sparc_address_test (arg) int arg;
#endif
-char $ac_func ();
-/* The GNU C library defines this for functions which it implements
- to always fail with ENOSYS. Some functions are actually named
- something starting with __ and the normal name is an alias. */
-#if defined __stub_$ac_func || defined __stub___$ac_func
-choke me
+{
+ static pid_t child;
+ if (!child) {
+ child = vfork ();
+ if (child < 0) {
+ perror ("vfork");
+ _exit(2);
+ }
+ if (!child) {
+ arg = getpid();
+ write(-1, "", 0);
+ _exit (arg);
+ }
+ }
+}
+
+int
+main ()
+{
+ pid_t parent = getpid ();
+ pid_t child;
+
+ sparc_address_test (0);
+
+ child = vfork ();
+
+ if (child == 0) {
+ /* Here is another test for sparc vfork register problems. This
+ test uses lots of local variables, at least as many local
+ variables as main has allocated so far including compiler
+ temporaries. 4 locals are enough for gcc 1.40.3 on a Solaris
+ 4.1.3 sparc, but we use 8 to be safe. A buggy compiler should
+ reuse the register of parent for one of the local variables,
+ since it will think that parent can't possibly be used any more
+ in this routine. Assigning to the local variable will thus
+ munge parent in the parent process. */
+ pid_t
+ p = getpid(), p1 = getpid(), p2 = getpid(), p3 = getpid(),
+ p4 = getpid(), p5 = getpid(), p6 = getpid(), p7 = getpid();
+ /* Convince the compiler that p..p7 are live; otherwise, it might
+ use the same hardware register for all 8 local variables. */
+ if (p != p1 || p != p2 || p != p3 || p != p4
+ || p != p5 || p != p6 || p != p7)
+ _exit(1);
+
+ /* On some systems (e.g. IRIX 3.3), vfork doesn't separate parent
+ from child file descriptors. If the child closes a descriptor
+ before it execs or exits, this munges the parent's descriptor
+ as well. Test for this by closing stdout in the child. */
+ _exit(close(fileno(stdout)) != 0);
+ } else {
+ int status;
+ struct stat st;
+
+ while (wait(&status) != child)
+ ;
+ return (
+ /* Was there some problem with vforking? */
+ child < 0
+
+ /* Did the child fail? (This shouldn't happen.) */
+ || status
+
+ /* Did the vfork/compiler bug occur? */
+ || parent != getpid()
+
+ /* Did the file descriptor bug occur? */
+ || fstat(fileno(stdout), &st) != 0
+ );
+ }
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+ ac_cv_func_vfork_works=yes
+else
+ ac_cv_func_vfork_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_vfork_works" >&5
+$as_echo "$ac_cv_func_vfork_works" >&6; }
+
+fi;
+if test "x$ac_cv_func_fork_works" = xcross; then
+ ac_cv_func_vfork_works=$ac_cv_func_vfork
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: result $ac_cv_func_vfork_works guessed because of cross compilation" >&5
+$as_echo "$as_me: WARNING: result $ac_cv_func_vfork_works guessed because of cross compilation" >&2;}
+fi
+
+if test "x$ac_cv_func_vfork_works" = xyes; then
+
+$as_echo "#define HAVE_WORKING_VFORK 1" >>confdefs.h
+
+else
+
+$as_echo "#define vfork fork" >>confdefs.h
+
+fi
+if test "x$ac_cv_func_fork_works" = xyes; then
+
+$as_echo "#define HAVE_WORKING_FORK 1" >>confdefs.h
+
+fi
+
+# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
+# for constant arguments. Useless!
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working alloca.h" >&5
+$as_echo_n "checking for working alloca.h... " >&6; }
+if ${ac_cv_working_alloca_h+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <alloca.h>
+int
+main ()
+{
+char *p = (char *) alloca (2 * sizeof (int));
+ if (p) return 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_working_alloca_h=yes
+else
+ ac_cv_working_alloca_h=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_working_alloca_h" >&5
+$as_echo "$ac_cv_working_alloca_h" >&6; }
+if test $ac_cv_working_alloca_h = yes; then
+
+$as_echo "#define HAVE_ALLOCA_H 1" >>confdefs.h
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for alloca" >&5
+$as_echo_n "checking for alloca... " >&6; }
+if ${ac_cv_func_alloca_works+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifdef __GNUC__
+# define alloca __builtin_alloca
+#else
+# ifdef _MSC_VER
+# include <malloc.h>
+# define alloca _alloca
+# else
+# ifdef HAVE_ALLOCA_H
+# include <alloca.h>
+# else
+# ifdef _AIX
+ #pragma alloca
+# else
+# ifndef alloca /* predefined by HP cc +Olibcalls */
+void *alloca (size_t);
+# endif
+# endif
+# endif
+# endif
#endif
int
main ()
{
-return $ac_func ();
+char *p = (char *) alloca (1);
+ if (p) return 0;
;
return 0;
}
_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (ac_try="$ac_link"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
- (eval "$ac_link") 2>conftest.er1
- ac_status=$?
- grep -v '^ *+' conftest.er1 >conftest.err
- rm -f conftest.er1
- cat conftest.err >&5
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } && {
- test -z "$ac_c_werror_flag" ||
- test ! -s conftest.err
- } && test -s conftest$ac_exeext &&
- $as_test_x conftest$ac_exeext; then
- eval "$as_ac_var=yes"
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_func_alloca_works=yes
else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
+ ac_cv_func_alloca_works=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_alloca_works" >&5
+$as_echo "$ac_cv_func_alloca_works" >&6; }
+
+if test $ac_cv_func_alloca_works = yes; then
+
+$as_echo "#define HAVE_ALLOCA 1" >>confdefs.h
+
+else
+ # The SVR3 libPW and SVR4 libucb both contain incompatible functions
+# that cause trouble. Some versions do not even contain alloca or
+# contain a buggy version. If you still want to use their alloca,
+# use ar to extract alloca.o from them instead of compiling alloca.c.
+
+ALLOCA=\${LIBOBJDIR}alloca.$ac_objext
+
+$as_echo "#define C_ALLOCA 1" >>confdefs.h
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether \`alloca.c' needs Cray hooks" >&5
+$as_echo_n "checking whether \`alloca.c' needs Cray hooks... " >&6; }
+if ${ac_cv_os_cray+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#if defined CRAY && ! defined CRAY2
+webecray
+#else
+wenotbecray
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "webecray" >/dev/null 2>&1; then :
+ ac_cv_os_cray=yes
+else
+ ac_cv_os_cray=no
+fi
+rm -f conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_os_cray" >&5
+$as_echo "$ac_cv_os_cray" >&6; }
+if test $ac_cv_os_cray = yes; then
+ for ac_func in _getb67 GETB67 getb67; do
+ as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
+if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
+
+cat >>confdefs.h <<_ACEOF
+#define CRAY_STACKSEG_END $ac_func
+_ACEOF
- eval "$as_ac_var=no"
+ break
fi
-rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
- conftest$ac_exeext conftest.$ac_ext
+ done
fi
-ac_res=`eval echo '${'$as_ac_var'}'`
- { echo "$as_me:$LINENO: result: $ac_res" >&5
-echo "${ECHO_T}$ac_res" >&6; }
-if test `eval echo '${'$as_ac_var'}'` = yes; then
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking stack direction for C alloca" >&5
+$as_echo_n "checking stack direction for C alloca... " >&6; }
+if ${ac_cv_c_stack_direction+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test "$cross_compiling" = yes; then :
+ ac_cv_c_stack_direction=0
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_includes_default
+int
+find_stack_direction (int *addr, int depth)
+{
+ int dir, dummy = 0;
+ if (! addr)
+ addr = &dummy;
+ *addr = addr < &dummy ? 1 : addr == &dummy ? 0 : -1;
+ dir = depth ? find_stack_direction (addr, depth - 1) : 0;
+ return dir + dummy;
+}
+
+int
+main (int argc, char **argv)
+{
+ return find_stack_direction (0, argc + !argv + 20) < 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+ ac_cv_c_stack_direction=1
+else
+ ac_cv_c_stack_direction=-1
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_stack_direction" >&5
+$as_echo "$ac_cv_c_stack_direction" >&6; }
+cat >>confdefs.h <<_ACEOF
+#define STACK_DIRECTION $ac_cv_c_stack_direction
+_ACEOF
+
+
+fi
+
+
+
+# Make sure we can run config.sub.
+$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
+ as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
+$as_echo_n "checking build system type... " >&6; }
+if ${ac_cv_build+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_build_alias=$build_alias
+test "x$ac_build_alias" = x &&
+ ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
+test "x$ac_build_alias" = x &&
+ as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
+ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
+ as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
+$as_echo "$ac_cv_build" >&6; }
+case $ac_cv_build in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
+esac
+build=$ac_cv_build
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_build
+shift
+build_cpu=$1
+build_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+build_os=$*
+IFS=$ac_save_IFS
+case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
+$as_echo_n "checking host system type... " >&6; }
+if ${ac_cv_host+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test "x$host_alias" = x; then
+ ac_cv_host=$ac_cv_build
+else
+ ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
+ as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
+$as_echo "$ac_cv_host" >&6; }
+case $ac_cv_host in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
+esac
+host=$ac_cv_host
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_host
+shift
+host_cpu=$1
+host_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+host_os=$*
+IFS=$ac_save_IFS
+case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
+
+
+
+case $host_os in #(
+ *cygwin*) :
+ ;; #(
+ *) :
+ for ac_func in shmget
+do :
+ ac_fn_c_check_func "$LINENO" "shmget" "ac_cv_func_shmget"
+if test "x$ac_cv_func_shmget" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_SHMGET 1
+_ACEOF
+
+fi
+done
+ ;;
+esac
+
+for ac_func in getloadavg
+do :
+ ac_fn_c_check_func "$LINENO" "getloadavg" "ac_cv_func_getloadavg"
+if test "x$ac_cv_func_getloadavg" = xyes; then :
cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+#define HAVE_GETLOADAVG 1
_ACEOF
fi
done
MAXDIM=${MAXDIM:-16}
# Check whether --with-maxdim was given.
-if test "${with_maxdim+set}" = set; then
+if test "${with_maxdim+set}" = set; then :
withval=$with_maxdim; MAXDIM=$withval
fi
MAXCOMP=${MAXCOMP:-4}
# Check whether --with-maxcomp was given.
-if test "${with_maxcomp+set}" = set; then
+if test "${with_maxcomp+set}" = set; then :
withval=$with_maxcomp; MAXCOMP=$withval
fi
-{ echo "$as_me:$LINENO: checking for variable-size arrays" >&5
-echo $ECHO_N "checking for variable-size arrays... $ECHO_C" >&6; }
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
+REALSIZE=${REALSIZE:-8}
+
+# Check whether --with-real was given.
+if test "${with_real+set}" = set; then :
+ withval=$with_real; REALSIZE=$withval
+fi
+
+case $REALSIZE in #(
+ 8) :
+ ;; #(
+ 10) :
+ SUFFIX=${SUFFIX:-l} ;; #(
+ 16) :
+ SUFFIX=${SUFFIX:-q}
+ LIBS="-lquadmath $LIBS" ;; #(
+ *) :
+ REALSIZE=8
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unavailable real size" >&5
+$as_echo "$as_me: WARNING: Unavailable real size" >&2;} ;;
+esac
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for variable-size arrays" >&5
+$as_echo_n "checking for variable-size arrays... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
_ACEOF
-rm -f conftest.$ac_objext
-if { (ac_try="$ac_compile"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
- (eval "$ac_compile") 2>conftest.er1
- ac_status=$?
- grep -v '^ *+' conftest.er1 >conftest.err
- rm -f conftest.er1
- cat conftest.err >&5
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } && {
- test -z "$ac_c_werror_flag" ||
- test ! -s conftest.err
- } && test -s conftest.$ac_objext; then
- { echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6; }
+if ac_fn_c_try_compile "$LINENO"; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
- { echo "$as_me:$LINENO: result: no, using MAXDIM=$MAXDIM and MAXCOMP=$MAXCOMP" >&5
-echo "${ECHO_T}no, using MAXDIM=$MAXDIM and MAXCOMP=$MAXCOMP" >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using MAXDIM=$MAXDIM and MAXCOMP=$MAXCOMP" >&5
+$as_echo "no, using MAXDIM=$MAXDIM and MAXCOMP=$MAXCOMP" >&6; }
cat >>confdefs.h <<_ACEOF
#define NDIM $MAXDIM
_ACEOF
cat >>confdefs.h <<_ACEOF
#define NCOMP $MAXCOMP
_ACEOF
fi
-
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-{ echo "$as_me:$LINENO: checking for MathLink" >&5
-echo $ECHO_N "checking for MathLink... $ECHO_C" >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for MathLink" >&5
+$as_echo_n "checking for MathLink... " >&6; }
cat > conftest.tm << _EOF_
:Begin:
:Function: inc
:Pattern: Inci_Integer
:Arguments: {i}
:ArgumentTypes: {Integer}
:ReturnType: Integer
:End:
#include "mathlink.h"
static int inc(const int i) { return i + 1; }
int main(int argc, char **argv) {
return MLMain(argc, argv);
}
_EOF_
FCC="$srcdir/tools/fcc"
rm -f conftest$EXEEXT
-REALCC="$CC" CC="$FCC" CXX="$FCC" PATH="$PATH:$srcdir/tools" \
- mcc $MCFLAGS $CFLAGS -o conftest$EXEEXT conftest.tm > /dev/null 2>&1
-if test -x conftest$EXEEXT; then
- { echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6; }
+MCSTDCPP=
+for MCSTDCPP in "" -stdlib=libstdc++ ; do
+ REALCC="$CC" CC="$FCC" CXX="$FCC $MCSTDCPP" PATH="$PATH:$srcdir/tools" \
+ mcc $MCFLAGS $CFLAGS -o conftest$EXEEXT conftest.tm > /dev/null 2>&1
+ if test -x conftest$EXEEXT; then :
+ break
+fi
+done
+if test -x conftest$EXEEXT; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
MATH_DEFAULT=math
else
- { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
fi
for ac_prog in qmake
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
-if test "${ac_cv_prog_HAVE_QMAKE+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_HAVE_QMAKE+:} false; then :
+ $as_echo_n "(cached) " >&6
else
if test -n "$HAVE_QMAKE"; then
ac_cv_prog_HAVE_QMAKE="$HAVE_QMAKE" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_HAVE_QMAKE="$ac_prog"
- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
-done
+ done
IFS=$as_save_IFS
fi
fi
HAVE_QMAKE=$ac_cv_prog_HAVE_QMAKE
if test -n "$HAVE_QMAKE"; then
- { echo "$as_me:$LINENO: result: $HAVE_QMAKE" >&5
-echo "${ECHO_T}$HAVE_QMAKE" >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HAVE_QMAKE" >&5
+$as_echo "$HAVE_QMAKE" >&6; }
else
- { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
fi
test -n "$HAVE_QMAKE" && break
done
-test -n "$HAVE_QMAKE" && TOOLS_DEFAULT=tools
+if test -n "$HAVE_QMAKE"; then :
+ case `qmake -v` in #(
+ *Qt?version?4*) :
+ TOOLS_DEFAULT=tools ;; #(
+ *) :
+ ;;
+esac
+fi
-test -n "$F77" && DEMO_FORTRAN_DEFAULT=demo-fortran
+test -n "$FC" && DEMO_FORTRAN_DEFAULT=demo-fortran
ac_config_headers="$ac_config_headers config.h"
ac_config_files="$ac_config_files makefile"
cat >confcache <<\_ACEOF
# This file is a shell script that caches the results of configure
# tests run on this system so they can be shared between configure
# scripts and configure runs, see configure's option --config-cache.
# It is not useful on other systems. If it contains results you don't
# want to keep, you may remove or edit it.
#
# config.status only pays attention to the cache file if you give it
# the --recheck option to rerun configure.
#
# `ac_cv_env_foo' variables (set or unset) will be overridden when
# loading this file, other *unset* `ac_cv_foo' will be assigned the
# following values.
_ACEOF
# The following way of writing the cache mishandles newlines in values,
# but we know of no workaround that is simple, portable, and efficient.
# So, we kill variables containing newlines.
# Ultrix sh set writes to stderr and can't be redirected directly,
# and sets the high bit in the cache file unless we assign to the vars.
(
for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
eval ac_val=\$$ac_var
case $ac_val in #(
*${as_nl}*)
case $ac_var in #(
- *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5
-echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;;
+ *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
esac
case $ac_var in #(
_ | IFS | as_nl) ;; #(
- *) $as_unset $ac_var ;;
+ BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+ *) { eval $ac_var=; unset $ac_var;} ;;
esac ;;
esac
done
(set) 2>&1 |
case $as_nl`(ac_space=' '; set) 2>&1` in #(
*${as_nl}ac_space=\ *)
- # `set' does not quote correctly, so add quotes (double-quote
- # substitution turns \\\\ into \\, and sed turns \\ into \).
+ # `set' does not quote correctly, so add quotes: double-quote
+ # substitution turns \\\\ into \\, and sed turns \\ into \.
sed -n \
"s/'/'\\\\''/g;
s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
;; #(
*)
# `set' quotes correctly as required by POSIX, so do not add quotes.
sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
;;
esac |
sort
) |
sed '
/^ac_cv_env_/b end
t clear
:clear
s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
t end
s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
:end' >>confcache
if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
if test -w "$cache_file"; then
- test "x$cache_file" != "x/dev/null" &&
- { echo "$as_me:$LINENO: updating cache $cache_file" >&5
-echo "$as_me: updating cache $cache_file" >&6;}
- cat confcache >$cache_file
+ if test "x$cache_file" != "x/dev/null"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
+$as_echo "$as_me: updating cache $cache_file" >&6;}
+ if test ! -f "$cache_file" || test -h "$cache_file"; then
+ cat confcache >"$cache_file"
+ else
+ case $cache_file in #(
+ */* | ?:*)
+ mv -f confcache "$cache_file"$$ &&
+ mv -f "$cache_file"$$ "$cache_file" ;; #(
+ *)
+ mv -f confcache "$cache_file" ;;
+ esac
+ fi
+ fi
else
- { echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5
-echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
+$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
fi
fi
rm -f confcache
test "x$prefix" = xNONE && prefix=$ac_default_prefix
# Let make expand exec_prefix.
test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
DEFS=-DHAVE_CONFIG_H
ac_libobjs=
ac_ltlibobjs=
+U=
for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
# 1. Remove the extension, and $U if already installed.
ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
- ac_i=`echo "$ac_i" | sed "$ac_script"`
+ ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
# 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR
# will be set to the directory where LIBOBJS objects are built.
- ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext"
- ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo'
+ as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+ as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
done
LIBOBJS=$ac_libobjs
LTLIBOBJS=$ac_ltlibobjs
-: ${CONFIG_STATUS=./config.status}
+: "${CONFIG_STATUS=./config.status}"
+ac_write_fail=0
ac_clean_files_save=$ac_clean_files
ac_clean_files="$ac_clean_files $CONFIG_STATUS"
-{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
-echo "$as_me: creating $CONFIG_STATUS" >&6;}
-cat >$CONFIG_STATUS <<_ACEOF
+{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
+$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
+as_write_fail=0
+cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
#! $SHELL
# Generated by $as_me.
# Run this file to recreate the current configuration.
# Compiler output produced by configure, useful for debugging
# configure, is in config.log if it exists.
debug=false
ac_cs_recheck=false
ac_cs_silent=false
-SHELL=\${CONFIG_SHELL-$SHELL}
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF
-## --------------------- ##
-## M4sh Initialization. ##
-## --------------------- ##
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
# Be more Bourne compatible
DUALCASE=1; export DUALCASE # for MKS sh
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
emulate sh
NULLCMD=:
- # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
# is contrary to our usage. Disable this feature.
alias -g '${1+"$@"}'='"$@"'
setopt NO_GLOB_SUBST
else
- case `(set -o) 2>/dev/null` in
- *posix*) set -o posix ;;
+ case `(set -o) 2>/dev/null` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
esac
-
fi
-
-
-# PATH needs CR
-# Avoid depending upon Character Ranges.
-as_cr_letters='abcdefghijklmnopqrstuvwxyz'
-as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
-as_cr_Letters=$as_cr_letters$as_cr_LETTERS
-as_cr_digits='0123456789'
-as_cr_alnum=$as_cr_Letters$as_cr_digits
-
-# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
- echo "#! /bin/sh" >conf$$.sh
- echo "exit 0" >>conf$$.sh
- chmod +x conf$$.sh
- if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
- PATH_SEPARATOR=';'
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='print -r --'
+ as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='printf %s\n'
+ as_echo_n='printf %s'
+else
+ if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+ as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+ as_echo_n='/usr/ucb/echo -n'
else
- PATH_SEPARATOR=:
+ as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+ as_echo_n_body='eval
+ arg=$1;
+ case $arg in #(
+ *"$as_nl"*)
+ expr "X$arg" : "X\\(.*\\)$as_nl";
+ arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+ esac;
+ expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+ '
+ export as_echo_n_body
+ as_echo_n='sh -c $as_echo_n_body as_echo'
fi
- rm -f conf$$.sh
+ export as_echo_body
+ as_echo='sh -c $as_echo_body as_echo'
fi
-# Support unset when possible.
-if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
- as_unset=unset
-else
- as_unset=false
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+ (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+ PATH_SEPARATOR=';'
+ }
fi
# IFS
# We need space, tab and new line, in precisely that order. Quoting is
# there to prevent editors from complaining about space-tab.
# (If _AS_PATH_WALK were called with IFS unset, it would disable word
# splitting by setting IFS to empty value.)
-as_nl='
-'
IFS=" "" $as_nl"
# Find who we are. Look in the path if we contain no directory separator.
-case $0 in
+as_myself=
+case $0 in #((
*[\\/]* ) as_myself=$0 ;;
*) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
- test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
-done
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+ done
IFS=$as_save_IFS
;;
esac
# We did not find ourselves, most probably we were run as `sh COMMAND'
# in which case we are not to be found in the path.
if test "x$as_myself" = x; then
as_myself=$0
fi
if test ! -f "$as_myself"; then
- echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
- { (exit 1); exit 1; }
+ $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ exit 1
fi
-# Work around bugs in pre-3.0 UWIN ksh.
-for as_var in ENV MAIL MAILPATH
-do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there. '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
done
PS1='$ '
PS2='> '
PS4='+ '
# NLS nuisances.
-for as_var in \
- LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
- LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
- LC_TELEPHONE LC_TIME
-do
- if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
- eval $as_var=C; export $as_var
- else
- ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+ as_status=$1; test $as_status -eq 0 && as_status=1
+ if test "$4"; then
+ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
fi
-done
+ $as_echo "$as_me: error: $2" >&2
+ as_fn_exit $as_status
+} # as_fn_error
+
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+ return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+ set +e
+ as_fn_set_status $1
+ exit $1
+} # as_fn_exit
+
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+ { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+ eval 'as_fn_append ()
+ {
+ eval $1+=\$2
+ }'
+else
+ as_fn_append ()
+ {
+ eval $1=\$$1\$2
+ }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+ eval 'as_fn_arith ()
+ {
+ as_val=$(( $* ))
+ }'
+else
+ as_fn_arith ()
+ {
+ as_val=`expr "$@" || test $? -eq 1`
+ }
+fi # as_fn_arith
+
-# Required to use basename.
if expr a : '\(a\)' >/dev/null 2>&1 &&
test "X`expr 00001 : '.*\(...\)'`" = X001; then
as_expr=expr
else
as_expr=false
fi
if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
as_basename=basename
else
as_basename=false
fi
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+ as_dirname=dirname
+else
+ as_dirname=false
+fi
-# Name of the executable.
as_me=`$as_basename -- "$0" ||
$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
X"$0" : 'X\(//\)$' \| \
X"$0" : 'X\(/\)' \| . 2>/dev/null ||
-echo X/"$0" |
+$as_echo X/"$0" |
sed '/^.*\/\([^/][^/]*\)\/*$/{
s//\1/
q
}
/^X\/\(\/\/\)$/{
s//\1/
q
}
/^X\/\(\/\).*/{
s//\1/
q
}
s/.*/./; q'`
-# CDPATH.
-$as_unset CDPATH
-
-
-
- as_lineno_1=$LINENO
- as_lineno_2=$LINENO
- test "x$as_lineno_1" != "x$as_lineno_2" &&
- test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
-
- # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
- # uniformly replaced by the line number. The first 'sed' inserts a
- # line-number line after each line using $LINENO; the second 'sed'
- # does the real work. The second script uses 'N' to pair each
- # line-number line with the line containing $LINENO, and appends
- # trailing '-' during substitution so that $LINENO is not a special
- # case at line end.
- # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
- # scripts with optimization help from Paolo Bonzini. Blame Lee
- # E. McMahon (1931-1989) for sed's syntax. :-)
- sed -n '
- p
- /[$]LINENO/=
- ' <$as_myself |
- sed '
- s/[$]LINENO.*/&-/
- t lineno
- b
- :lineno
- N
- :loop
- s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
- t loop
- s/-\n.*//
- ' >$as_me.lineno &&
- chmod +x "$as_me.lineno" ||
- { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
- { (exit 1); exit 1; }; }
-
- # Don't try to exec as it changes $[0], causing all sort of problems
- # (the dirname of $[0] is not the place where we might find the
- # original and so on. Autoconf is especially sensitive to this).
- . "./$as_me.lineno"
- # Exit status is that of the last command.
- exit
-}
-
-
-if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
- as_dirname=dirname
-else
- as_dirname=false
-fi
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
ECHO_C= ECHO_N= ECHO_T=
-case `echo -n x` in
+case `echo -n x` in #(((((
-n*)
- case `echo 'x\c'` in
+ case `echo 'xy\c'` in
*c*) ECHO_T=' ';; # ECHO_T is single tab character.
- *) ECHO_C='\c';;
+ xy) ECHO_C='\c';;
+ *) echo `echo ksh88 bug on AIX 6.1` > /dev/null
+ ECHO_T=' ';;
esac;;
*)
ECHO_N='-n';;
esac
-if expr a : '\(a\)' >/dev/null 2>&1 &&
- test "X`expr 00001 : '.*\(...\)'`" = X001; then
- as_expr=expr
-else
- as_expr=false
-fi
-
rm -f conf$$ conf$$.exe conf$$.file
if test -d conf$$.dir; then
rm -f conf$$.dir/conf$$.file
else
rm -f conf$$.dir
- mkdir conf$$.dir
+ mkdir conf$$.dir 2>/dev/null
fi
-echo >conf$$.file
-if ln -s conf$$.file conf$$ 2>/dev/null; then
- as_ln_s='ln -s'
- # ... but there are two gotchas:
- # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
- # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
- # In both cases, we have to default to `cp -p'.
- ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
- as_ln_s='cp -p'
-elif ln conf$$.file conf$$ 2>/dev/null; then
- as_ln_s=ln
+if (echo >conf$$.file) 2>/dev/null; then
+ if ln -s conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s='ln -s'
+ # ... but there are two gotchas:
+ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+ # In both cases, we have to default to `cp -pR'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+ as_ln_s='cp -pR'
+ elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+ else
+ as_ln_s='cp -pR'
+ fi
else
- as_ln_s='cp -p'
+ as_ln_s='cp -pR'
fi
rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
rmdir conf$$.dir 2>/dev/null
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+ case $as_dir in #(
+ -*) as_dir=./$as_dir;;
+ esac
+ test -d "$as_dir" || eval $as_mkdir_p || {
+ as_dirs=
+ while :; do
+ case $as_dir in #(
+ *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *) as_qdir=$as_dir;;
+ esac
+ as_dirs="'$as_qdir' $as_dirs"
+ as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ test -d "$as_dir" && break
+ done
+ test -z "$as_dirs" || eval "mkdir $as_dirs"
+ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
if mkdir -p . 2>/dev/null; then
- as_mkdir_p=:
+ as_mkdir_p='mkdir -p "$as_dir"'
else
test -d ./-p && rmdir ./-p
as_mkdir_p=false
fi
-if test -x / >/dev/null 2>&1; then
- as_test_x='test -x'
-else
- if ls -dL / >/dev/null 2>&1; then
- as_ls_L_option=L
- else
- as_ls_L_option=
- fi
- as_test_x='
- eval sh -c '\''
- if test -d "$1"; then
- test -d "$1/.";
- else
- case $1 in
- -*)set "./$1";;
- esac;
- case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in
- ???[sx]*):;;*)false;;esac;fi
- '\'' sh
- '
-fi
-as_executable_p=$as_test_x
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+ test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
# Sed expression to map a string onto a valid CPP name.
as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
# Sed expression to map a string onto a valid variable name.
as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
exec 6>&1
+## ----------------------------------- ##
+## Main body of $CONFIG_STATUS script. ##
+## ----------------------------------- ##
+_ASEOF
+test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1
-# Save the log message, to keep $[0] and so on meaningful, and to
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# Save the log message, to keep $0 and so on meaningful, and to
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
-This file was extended by Cuba $as_me 2.1, which was
-generated by GNU Autoconf 2.61. Invocation command line was
+This file was extended by Cuba $as_me 4.2, which was
+generated by GNU Autoconf 2.69. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
CONFIG_HEADERS = $CONFIG_HEADERS
CONFIG_LINKS = $CONFIG_LINKS
CONFIG_COMMANDS = $CONFIG_COMMANDS
$ $0 $@
on `(hostname || uname -n) 2>/dev/null | sed 1q`
"
_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF
+case $ac_config_files in *"
+"*) set x $ac_config_files; shift; ac_config_files=$*;;
+esac
+
+case $ac_config_headers in *"
+"*) set x $ac_config_headers; shift; ac_config_headers=$*;;
+esac
+
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
# Files that config.status was made for.
config_files="$ac_config_files"
config_headers="$ac_config_headers"
_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
ac_cs_usage="\
-\`$as_me' instantiates files from templates according to the
-current configuration.
+\`$as_me' instantiates files and other configuration actions
+from templates according to the current configuration. Unless the files
+and actions are specified as TAGs, all are instantiated by default.
-Usage: $0 [OPTIONS] [FILE]...
+Usage: $0 [OPTION]... [TAG]...
-h, --help print this help, then exit
-V, --version print version number and configuration settings, then exit
- -q, --quiet do not print progress messages
+ --config print configuration, then exit
+ -q, --quiet, --silent
+ do not print progress messages
-d, --debug don't remove temporary files
--recheck update $as_me by reconfiguring in the same conditions
- --file=FILE[:TEMPLATE]
- instantiate the configuration file FILE
- --header=FILE[:TEMPLATE]
- instantiate the configuration header FILE
+ --file=FILE[:TEMPLATE]
+ instantiate the configuration file FILE
+ --header=FILE[:TEMPLATE]
+ instantiate the configuration header FILE
Configuration files:
$config_files
Configuration headers:
$config_headers
-Report bugs to <bug-autoconf@gnu.org>."
+Report bugs to <hahn@feynarts.de>."
_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\
-Cuba config.status 2.1
-configured by $0, generated by GNU Autoconf 2.61,
- with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
+Cuba config.status 4.2
+configured by $0, generated by GNU Autoconf 2.69,
+ with options \\"\$ac_cs_config\\"
-Copyright (C) 2006 Free Software Foundation, Inc.
+Copyright (C) 2012 Free Software Foundation, Inc.
This config.status script is free software; the Free Software Foundation
gives unlimited permission to copy, distribute and modify it."
ac_pwd='$ac_pwd'
srcdir='$srcdir'
INSTALL='$INSTALL'
+test -n "\$AWK" || AWK=awk
_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF
-# If no file are specified by the user, then we need to provide default
-# value. By we need to know if files were specified by the user.
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# The default lists apply if the user does not specify any file.
ac_need_defaults=:
while test $# != 0
do
case $1 in
- --*=*)
+ --*=?*)
ac_option=`expr "X$1" : 'X\([^=]*\)='`
ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
ac_shift=:
;;
+ --*=)
+ ac_option=`expr "X$1" : 'X\([^=]*\)='`
+ ac_optarg=
+ ac_shift=:
+ ;;
*)
ac_option=$1
ac_optarg=$2
ac_shift=shift
;;
esac
case $ac_option in
# Handling of the options.
-recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
ac_cs_recheck=: ;;
--version | --versio | --versi | --vers | --ver | --ve | --v | -V )
- echo "$ac_cs_version"; exit ;;
+ $as_echo "$ac_cs_version"; exit ;;
+ --config | --confi | --conf | --con | --co | --c )
+ $as_echo "$ac_cs_config"; exit ;;
--debug | --debu | --deb | --de | --d | -d )
debug=: ;;
--file | --fil | --fi | --f )
$ac_shift
- CONFIG_FILES="$CONFIG_FILES $ac_optarg"
+ case $ac_optarg in
+ *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ '') as_fn_error $? "missing file argument" ;;
+ esac
+ as_fn_append CONFIG_FILES " '$ac_optarg'"
ac_need_defaults=false;;
--header | --heade | --head | --hea )
$ac_shift
- CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg"
+ case $ac_optarg in
+ *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ as_fn_append CONFIG_HEADERS " '$ac_optarg'"
ac_need_defaults=false;;
--he | --h)
# Conflict between --help and --header
- { echo "$as_me: error: ambiguous option: $1
-Try \`$0 --help' for more information." >&2
- { (exit 1); exit 1; }; };;
+ as_fn_error $? "ambiguous option: \`$1'
+Try \`$0 --help' for more information.";;
--help | --hel | -h )
- echo "$ac_cs_usage"; exit ;;
+ $as_echo "$ac_cs_usage"; exit ;;
-q | -quiet | --quiet | --quie | --qui | --qu | --q \
| -silent | --silent | --silen | --sile | --sil | --si | --s)
ac_cs_silent=: ;;
# This is an error.
- -*) { echo "$as_me: error: unrecognized option: $1
-Try \`$0 --help' for more information." >&2
- { (exit 1); exit 1; }; } ;;
+ -*) as_fn_error $? "unrecognized option: \`$1'
+Try \`$0 --help' for more information." ;;
- *) ac_config_targets="$ac_config_targets $1"
+ *) as_fn_append ac_config_targets " $1"
ac_need_defaults=false ;;
esac
shift
done
ac_configure_extra_args=
if $ac_cs_silent; then
exec 6>/dev/null
ac_configure_extra_args="$ac_configure_extra_args --silent"
fi
_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
if \$ac_cs_recheck; then
- echo "running CONFIG_SHELL=$SHELL $SHELL $0 "$ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6
- CONFIG_SHELL=$SHELL
+ set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+ shift
+ \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
+ CONFIG_SHELL='$SHELL'
export CONFIG_SHELL
- exec $SHELL "$0"$ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+ exec "\$@"
fi
_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
exec 5>>config.log
{
echo
sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
## Running $as_me. ##
_ASBOX
- echo "$ac_log"
+ $as_echo "$ac_log"
} >&5
_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# Handling of arguments.
for ac_config_target in $ac_config_targets
do
case $ac_config_target in
"config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
"makefile") CONFIG_FILES="$CONFIG_FILES makefile" ;;
- *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
-echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
- { (exit 1); exit 1; }; };;
+ *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
esac
done
# If the user did not use the arguments to specify the items to instantiate,
# then the envvar interface is used. Set only those that are not.
# We use the long form for the default assignment because of an extremely
# bizarre bug on SunOS 4.1.3.
if $ac_need_defaults; then
test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
fi
# Have a temporary directory for convenience. Make it in the build tree
# simply because there is no reason against having it here, and in addition,
# creating and moving files from /tmp can sometimes cause problems.
# Hook for its removal unless debugging.
# Note that there is a small window in which the directory will not be cleaned:
# after its creation but before its name has been assigned to `$tmp'.
$debug ||
{
- tmp=
+ tmp= ac_tmp=
trap 'exit_status=$?
- { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status
+ : "${ac_tmp:=$tmp}"
+ { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
' 0
- trap '{ (exit 1); exit 1; }' 1 2 13 15
+ trap 'as_fn_exit 1' 1 2 13 15
}
# Create a (secure) tmp directory for tmp files.
{
tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
- test -n "$tmp" && test -d "$tmp"
+ test -d "$tmp"
} ||
{
tmp=./conf$$-$RANDOM
(umask 077 && mkdir "$tmp")
-} ||
-{
- echo "$me: cannot create a temporary directory in ." >&2
- { (exit 1); exit 1; }
-}
-
-#
-# Set up the sed scripts for CONFIG_FILES section.
-#
+} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
+ac_tmp=$tmp
-# No need to generate the scripts if there are no CONFIG_FILES.
-# This happens for instance when ./config.status config.h
+# Set up the scripts for CONFIG_FILES section.
+# No need to generate them if there are no CONFIG_FILES.
+# This happens for instance with `./config.status config.h'.
if test -n "$CONFIG_FILES"; then
-_ACEOF
+ac_cr=`echo X | tr X '\015'`
+# On cygwin, bash can eat \r inside `` if the user requested igncr.
+# But we know of no other shell where ac_cr would be empty at this
+# point, so we can use a bashism as a fallback.
+if test "x$ac_cr" = x; then
+ eval ac_cr=\$\'\\r\'
+fi
+ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
+if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
+ ac_cs_awk_cr='\\r'
+else
+ ac_cs_awk_cr=$ac_cr
+fi
+
+echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
+_ACEOF
+{
+ echo "cat >conf$$subs.awk <<_ACEOF" &&
+ echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
+ echo "_ACEOF"
+} >conf$$subs.sh ||
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
ac_delim='%!_!# '
for ac_last_try in false false false false false :; do
- cat >conf$$subs.sed <<_ACEOF
-SHELL!$SHELL$ac_delim
-PATH_SEPARATOR!$PATH_SEPARATOR$ac_delim
-PACKAGE_NAME!$PACKAGE_NAME$ac_delim
-PACKAGE_TARNAME!$PACKAGE_TARNAME$ac_delim
-PACKAGE_VERSION!$PACKAGE_VERSION$ac_delim
-PACKAGE_STRING!$PACKAGE_STRING$ac_delim
-PACKAGE_BUGREPORT!$PACKAGE_BUGREPORT$ac_delim
-exec_prefix!$exec_prefix$ac_delim
-prefix!$prefix$ac_delim
-program_transform_name!$program_transform_name$ac_delim
-bindir!$bindir$ac_delim
-sbindir!$sbindir$ac_delim
-libexecdir!$libexecdir$ac_delim
-datarootdir!$datarootdir$ac_delim
-datadir!$datadir$ac_delim
-sysconfdir!$sysconfdir$ac_delim
-sharedstatedir!$sharedstatedir$ac_delim
-localstatedir!$localstatedir$ac_delim
-includedir!$includedir$ac_delim
-oldincludedir!$oldincludedir$ac_delim
-docdir!$docdir$ac_delim
-infodir!$infodir$ac_delim
-htmldir!$htmldir$ac_delim
-dvidir!$dvidir$ac_delim
-pdfdir!$pdfdir$ac_delim
-psdir!$psdir$ac_delim
-libdir!$libdir$ac_delim
-localedir!$localedir$ac_delim
-mandir!$mandir$ac_delim
-DEFS!$DEFS$ac_delim
-ECHO_C!$ECHO_C$ac_delim
-ECHO_N!$ECHO_N$ac_delim
-ECHO_T!$ECHO_T$ac_delim
-LIBS!$LIBS$ac_delim
-build_alias!$build_alias$ac_delim
-host_alias!$host_alias$ac_delim
-target_alias!$target_alias$ac_delim
-MCFLAGS!$MCFLAGS$ac_delim
-CC!$CC$ac_delim
-CFLAGS!$CFLAGS$ac_delim
-LDFLAGS!$LDFLAGS$ac_delim
-CPPFLAGS!$CPPFLAGS$ac_delim
-ac_ct_CC!$ac_ct_CC$ac_delim
-EXEEXT!$EXEEXT$ac_delim
-OBJEXT!$OBJEXT$ac_delim
-F77!$F77$ac_delim
-FFLAGS!$FFLAGS$ac_delim
-ac_ct_F77!$ac_ct_F77$ac_delim
-RANLIB!$RANLIB$ac_delim
-INSTALL_PROGRAM!$INSTALL_PROGRAM$ac_delim
-INSTALL_SCRIPT!$INSTALL_SCRIPT$ac_delim
-INSTALL_DATA!$INSTALL_DATA$ac_delim
-MATH_DEFAULT!$MATH_DEFAULT$ac_delim
-HAVE_QMAKE!$HAVE_QMAKE$ac_delim
-TOOLS_DEFAULT!$TOOLS_DEFAULT$ac_delim
-DEMO_FORTRAN_DEFAULT!$DEMO_FORTRAN_DEFAULT$ac_delim
-LIBOBJS!$LIBOBJS$ac_delim
-LTLIBOBJS!$LTLIBOBJS$ac_delim
-_ACEOF
+ . ./conf$$subs.sh ||
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
- if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 58; then
+ ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
+ if test $ac_delim_n = $ac_delim_num; then
break
elif $ac_last_try; then
- { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
-echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
- { (exit 1); exit 1; }; }
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
else
ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
fi
done
+rm -f conf$$subs.sh
-ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed`
-if test -n "$ac_eof"; then
- ac_eof=`echo "$ac_eof" | sort -nru | sed 1q`
- ac_eof=`expr $ac_eof + 1`
-fi
-
-cat >>$CONFIG_STATUS <<_ACEOF
-cat >"\$tmp/subs-1.sed" <<\CEOF$ac_eof
-/@[a-zA-Z_][a-zA-Z_0-9]*@/!b end
-_ACEOF
-sed '
-s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g
-s/^/s,@/; s/!/@,|#_!!_#|/
-:n
-t n
-s/'"$ac_delim"'$/,g/; t
-s/$/\\/; p
-N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n
-' >>$CONFIG_STATUS <conf$$subs.sed
-rm -f conf$$subs.sed
-cat >>$CONFIG_STATUS <<_ACEOF
-:end
-s/|#_!!_#|//g
-CEOF$ac_eof
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
_ACEOF
+sed -n '
+h
+s/^/S["/; s/!.*/"]=/
+p
+g
+s/^[^!]*!//
+:repl
+t repl
+s/'"$ac_delim"'$//
+t delim
+:nl
+h
+s/\(.\{148\}\)..*/\1/
+t more1
+s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
+p
+n
+b repl
+:more1
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t nl
+:delim
+h
+s/\(.\{148\}\)..*/\1/
+t more2
+s/["\\]/\\&/g; s/^/"/; s/$/"/
+p
+b
+:more2
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t delim
+' <conf$$subs.awk | sed '
+/^[^""]/{
+ N
+ s/\n//
+}
+' >>$CONFIG_STATUS || ac_write_fail=1
+rm -f conf$$subs.awk
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACAWK
+cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
+ for (key in S) S_is_set[key] = 1
+ FS = ""
+
+}
+{
+ line = $ 0
+ nfields = split(line, field, "@")
+ substed = 0
+ len = length(field[1])
+ for (i = 2; i < nfields; i++) {
+ key = field[i]
+ keylen = length(key)
+ if (S_is_set[key]) {
+ value = S[key]
+ line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
+ len += length(value) + length(field[++i])
+ substed = 1
+ } else
+ len += 1 + keylen
+ }
+ print line
+}
+
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
+ sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
+else
+ cat
+fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
+ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5
+_ACEOF
-# VPATH may cause trouble with some makes, so we remove $(srcdir),
-# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
+# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and
# trailing colons and then remove the whole line if VPATH becomes empty
# (actually we leave an empty line to preserve line numbers).
if test "x$srcdir" = x.; then
- ac_vpsub='/^[ ]*VPATH[ ]*=/{
-s/:*\$(srcdir):*/:/
-s/:*\${srcdir}:*/:/
-s/:*@srcdir@:*/:/
-s/^\([^=]*=[ ]*\):*/\1/
+ ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{
+h
+s///
+s/^/:/
+s/[ ]*$/:/
+s/:\$(srcdir):/:/g
+s/:\${srcdir}:/:/g
+s/:@srcdir@:/:/g
+s/^:*//
s/:*$//
+x
+s/\(=[ ]*\).*/\1/
+G
+s/\n//
s/^[^=]*=[ ]*$//
}'
fi
-cat >>$CONFIG_STATUS <<\_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
fi # test -n "$CONFIG_FILES"
+# Set up the scripts for CONFIG_HEADERS section.
+# No need to generate them if there are no CONFIG_HEADERS.
+# This happens for instance with `./config.status Makefile'.
+if test -n "$CONFIG_HEADERS"; then
+cat >"$ac_tmp/defines.awk" <<\_ACAWK ||
+BEGIN {
+_ACEOF
+
+# Transform confdefs.h into an awk script `defines.awk', embedded as
+# here-document in config.status, that substitutes the proper values into
+# config.h.in to produce config.h.
+
+# Create a delimiter string that does not exist in confdefs.h, to ease
+# handling of long lines.
+ac_delim='%!_!# '
+for ac_last_try in false false :; do
+ ac_tt=`sed -n "/$ac_delim/p" confdefs.h`
+ if test -z "$ac_tt"; then
+ break
+ elif $ac_last_try; then
+ as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5
+ else
+ ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+ fi
+done
+
+# For the awk script, D is an array of macro values keyed by name,
+# likewise P contains macro parameters if any. Preserve backslash
+# newline sequences.
+
+ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
+sed -n '
+s/.\{148\}/&'"$ac_delim"'/g
+t rset
+:rset
+s/^[ ]*#[ ]*define[ ][ ]*/ /
+t def
+d
+:def
+s/\\$//
+t bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3"/p
+s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p
+d
+:bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3\\\\\\n"\\/p
+t cont
+s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p
+t cont
+d
+:cont
+n
+s/.\{148\}/&'"$ac_delim"'/g
+t clear
+:clear
+s/\\$//
+t bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/"/p
+d
+:bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p
+b cont
+' <confdefs.h | sed '
+s/'"$ac_delim"'/"\\\
+"/g' >>$CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ for (key in D) D_is_set[key] = 1
+ FS = ""
+}
+/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ {
+ line = \$ 0
+ split(line, arg, " ")
+ if (arg[1] == "#") {
+ defundef = arg[2]
+ mac1 = arg[3]
+ } else {
+ defundef = substr(arg[1], 2)
+ mac1 = arg[2]
+ }
+ split(mac1, mac2, "(") #)
+ macro = mac2[1]
+ prefix = substr(line, 1, index(line, defundef) - 1)
+ if (D_is_set[macro]) {
+ # Preserve the white space surrounding the "#".
+ print prefix "define", macro P[macro] D[macro]
+ next
+ } else {
+ # Replace #undef with comments. This is necessary, for example,
+ # in the case of _POSIX_SOURCE, which is predefined and required
+ # on some systems where configure will not decide to define it.
+ if (defundef == "undef") {
+ print "/*", prefix defundef, macro, "*/"
+ next
+ }
+ }
+}
+{ print }
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ as_fn_error $? "could not setup config headers machinery" "$LINENO" 5
+fi # test -n "$CONFIG_HEADERS"
+
-for ac_tag in :F $CONFIG_FILES :H $CONFIG_HEADERS
+eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS "
+shift
+for ac_tag
do
case $ac_tag in
:[FHLC]) ac_mode=$ac_tag; continue;;
esac
case $ac_mode$ac_tag in
:[FHL]*:*);;
- :L* | :C*:*) { { echo "$as_me:$LINENO: error: Invalid tag $ac_tag." >&5
-echo "$as_me: error: Invalid tag $ac_tag." >&2;}
- { (exit 1); exit 1; }; };;
+ :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
:[FH]-) ac_tag=-:-;;
:[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
esac
ac_save_IFS=$IFS
IFS=:
set x $ac_tag
IFS=$ac_save_IFS
shift
ac_file=$1
shift
case $ac_mode in
:L) ac_source=$1;;
:[FH])
ac_file_inputs=
for ac_f
do
case $ac_f in
- -) ac_f="$tmp/stdin";;
+ -) ac_f="$ac_tmp/stdin";;
*) # Look for the file first in the build tree, then in the source tree
# (if the path is not absolute). The absolute path cannot be DOS-style,
# because $ac_f cannot contain `:'.
test -f "$ac_f" ||
case $ac_f in
[\\/$]*) false;;
*) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
esac ||
- { { echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5
-echo "$as_me: error: cannot find input file: $ac_f" >&2;}
- { (exit 1); exit 1; }; };;
+ as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
esac
- ac_file_inputs="$ac_file_inputs $ac_f"
+ case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+ as_fn_append ac_file_inputs " '$ac_f'"
done
# Let's still pretend it is `configure' which instantiates (i.e., don't
# use $as_me), people would be surprised to read:
# /* config.h. Generated by config.status. */
- configure_input="Generated from "`IFS=:
- echo $* | sed 's|^[^:]*/||;s|:[^:]*/|, |g'`" by configure."
+ configure_input='Generated from '`
+ $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+ `' by configure.'
if test x"$ac_file" != x-; then
configure_input="$ac_file. $configure_input"
- { echo "$as_me:$LINENO: creating $ac_file" >&5
-echo "$as_me: creating $ac_file" >&6;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
+$as_echo "$as_me: creating $ac_file" >&6;}
fi
+ # Neutralize special characters interpreted by sed in replacement strings.
+ case $configure_input in #(
+ *\&* | *\|* | *\\* )
+ ac_sed_conf_input=`$as_echo "$configure_input" |
+ sed 's/[\\\\&|]/\\\\&/g'`;; #(
+ *) ac_sed_conf_input=$configure_input;;
+ esac
case $ac_tag in
- *:-:* | *:-) cat >"$tmp/stdin";;
+ *:-:* | *:-) cat >"$ac_tmp/stdin" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
esac
;;
esac
ac_dir=`$as_dirname -- "$ac_file" ||
$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
X"$ac_file" : 'X\(//\)[^/]' \| \
X"$ac_file" : 'X\(//\)$' \| \
X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
-echo X"$ac_file" |
- sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
- s//\1/
- q
- }
- /^X\(\/\/\)[^/].*/{
- s//\1/
- q
- }
- /^X\(\/\/\)$/{
- s//\1/
- q
- }
- /^X\(\/\).*/{
- s//\1/
- q
- }
- s/.*/./; q'`
- { as_dir="$ac_dir"
- case $as_dir in #(
- -*) as_dir=./$as_dir;;
- esac
- test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || {
- as_dirs=
- while :; do
- case $as_dir in #(
- *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #(
- *) as_qdir=$as_dir;;
- esac
- as_dirs="'$as_qdir' $as_dirs"
- as_dir=`$as_dirname -- "$as_dir" ||
-$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
- X"$as_dir" : 'X\(//\)[^/]' \| \
- X"$as_dir" : 'X\(//\)$' \| \
- X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
-echo X"$as_dir" |
+$as_echo X"$ac_file" |
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
s//\1/
q
}
/^X\(\/\/\)[^/].*/{
s//\1/
q
}
/^X\(\/\/\)$/{
s//\1/
q
}
/^X\(\/\).*/{
s//\1/
q
}
s/.*/./; q'`
- test -d "$as_dir" && break
- done
- test -z "$as_dirs" || eval "mkdir $as_dirs"
- } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5
-echo "$as_me: error: cannot create directory $as_dir" >&2;}
- { (exit 1); exit 1; }; }; }
+ as_dir="$ac_dir"; as_fn_mkdir_p
ac_builddir=.
case "$ac_dir" in
.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
*)
- ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+ ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
# A ".." for each directory in $ac_dir_suffix.
- ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'`
+ ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
case $ac_top_builddir_sub in
"") ac_top_builddir_sub=. ac_top_build_prefix= ;;
*) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
esac ;;
esac
ac_abs_top_builddir=$ac_pwd
ac_abs_builddir=$ac_pwd$ac_dir_suffix
# for backward compatibility:
ac_top_builddir=$ac_top_build_prefix
case $srcdir in
.) # We are building in place.
ac_srcdir=.
ac_top_srcdir=$ac_top_builddir_sub
ac_abs_top_srcdir=$ac_pwd ;;
[\\/]* | ?:[\\/]* ) # Absolute name.
ac_srcdir=$srcdir$ac_dir_suffix;
ac_top_srcdir=$srcdir
ac_abs_top_srcdir=$srcdir ;;
*) # Relative name.
ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
ac_top_srcdir=$ac_top_build_prefix$srcdir
ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
esac
ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
case $ac_mode in
:F)
#
# CONFIG_FILE
#
case $INSTALL in
[\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
*) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
esac
_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# If the template does not know about datarootdir, expand it.
# FIXME: This hack should be removed a few years after 2.60.
ac_datarootdir_hack=; ac_datarootdir_seen=
-
-case `sed -n '/datarootdir/ {
+ac_sed_dataroot='
+/datarootdir/ {
p
q
}
/@datadir@/p
/@docdir@/p
/@infodir@/p
/@localedir@/p
-/@mandir@/p
-' $ac_file_inputs` in
+/@mandir@/p'
+case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
*datarootdir*) ac_datarootdir_seen=yes;;
*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
- { echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
-echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_datarootdir_hack='
s&@datadir@&$datadir&g
s&@docdir@&$docdir&g
s&@infodir@&$infodir&g
s&@localedir@&$localedir&g
s&@mandir@&$mandir&g
- s&\\\${datarootdir}&$datarootdir&g' ;;
+ s&\\\${datarootdir}&$datarootdir&g' ;;
esac
_ACEOF
# Neutralize VPATH when `$srcdir' = `.'.
# Shell code in configure.ac might set extrasub.
# FIXME: do we really want to maintain this feature?
-cat >>$CONFIG_STATUS <<_ACEOF
- sed "$ac_vpsub
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_sed_extra="$ac_vpsub
$extrasub
_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
:t
/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
-s&@configure_input@&$configure_input&;t t
+s|@configure_input@|$ac_sed_conf_input|;t t
s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@top_build_prefix@&$ac_top_build_prefix&;t t
s&@srcdir@&$ac_srcdir&;t t
s&@abs_srcdir@&$ac_abs_srcdir&;t t
s&@top_srcdir@&$ac_top_srcdir&;t t
s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
s&@builddir@&$ac_builddir&;t t
s&@abs_builddir@&$ac_abs_builddir&;t t
s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
s&@INSTALL@&$ac_INSTALL&;t t
$ac_datarootdir_hack
-" $ac_file_inputs | sed -f "$tmp/subs-1.sed" >$tmp/out
+"
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
+ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5
test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
- { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } &&
- { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } &&
- { echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir'
-which seems to be undefined. Please make sure it is defined." >&5
-echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
-which seems to be undefined. Please make sure it is defined." >&2;}
+ { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
+ { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \
+ "$ac_tmp/out"`; test -z "$ac_out"; } &&
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined. Please make sure it is defined" >&5
+$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined. Please make sure it is defined" >&2;}
- rm -f "$tmp/stdin"
+ rm -f "$ac_tmp/stdin"
case $ac_file in
- -) cat "$tmp/out"; rm -f "$tmp/out";;
- *) rm -f "$ac_file"; mv "$tmp/out" $ac_file;;
- esac
+ -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
+ *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
+ esac \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
;;
:H)
#
# CONFIG_HEADER
#
-_ACEOF
-
-# Transform confdefs.h into a sed script `conftest.defines', that
-# substitutes the proper values into config.h.in to produce config.h.
-rm -f conftest.defines conftest.tail
-# First, append a space to every undef/define line, to ease matching.
-echo 's/$/ /' >conftest.defines
-# Then, protect against being on the right side of a sed subst, or in
-# an unquoted here document, in config.status. If some macros were
-# called several times there might be several #defines for the same
-# symbol, which is useless. But do not sort them, since the last
-# AC_DEFINE must be honored.
-ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
-# These sed commands are passed to sed as "A NAME B PARAMS C VALUE D", where
-# NAME is the cpp macro being defined, VALUE is the value it is being given.
-# PARAMS is the parameter list in the macro definition--in most cases, it's
-# just an empty string.
-ac_dA='s,^\\([ #]*\\)[^ ]*\\([ ]*'
-ac_dB='\\)[ (].*,\\1define\\2'
-ac_dC=' '
-ac_dD=' ,'
-
-uniq confdefs.h |
- sed -n '
- t rset
- :rset
- s/^[ ]*#[ ]*define[ ][ ]*//
- t ok
- d
- :ok
- s/[\\&,]/\\&/g
- s/^\('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/ '"$ac_dA"'\1'"$ac_dB"'\2'"${ac_dC}"'\3'"$ac_dD"'/p
- s/^\('"$ac_word_re"'\)[ ]*\(.*\)/'"$ac_dA"'\1'"$ac_dB$ac_dC"'\2'"$ac_dD"'/p
- ' >>conftest.defines
-
-# Remove the space that was appended to ease matching.
-# Then replace #undef with comments. This is necessary, for
-# example, in the case of _POSIX_SOURCE, which is predefined and required
-# on some systems where configure will not decide to define it.
-# (The regexp can be short, since the line contains either #define or #undef.)
-echo 's/ $//
-s,^[ #]*u.*,/* & */,' >>conftest.defines
-
-# Break up conftest.defines:
-ac_max_sed_lines=50
-
-# First sed command is: sed -f defines.sed $ac_file_inputs >"$tmp/out1"
-# Second one is: sed -f defines.sed "$tmp/out1" >"$tmp/out2"
-# Third one will be: sed -f defines.sed "$tmp/out2" >"$tmp/out1"
-# et cetera.
-ac_in='$ac_file_inputs'
-ac_out='"$tmp/out1"'
-ac_nxt='"$tmp/out2"'
-
-while :
-do
- # Write a here document:
- cat >>$CONFIG_STATUS <<_ACEOF
- # First, check the format of the line:
- cat >"\$tmp/defines.sed" <<\\CEOF
-/^[ ]*#[ ]*undef[ ][ ]*$ac_word_re[ ]*\$/b def
-/^[ ]*#[ ]*define[ ][ ]*$ac_word_re[( ]/b def
-b
-:def
-_ACEOF
- sed ${ac_max_sed_lines}q conftest.defines >>$CONFIG_STATUS
- echo 'CEOF
- sed -f "$tmp/defines.sed"' "$ac_in >$ac_out" >>$CONFIG_STATUS
- ac_in=$ac_out; ac_out=$ac_nxt; ac_nxt=$ac_in
- sed 1,${ac_max_sed_lines}d conftest.defines >conftest.tail
- grep . conftest.tail >/dev/null || break
- rm -f conftest.defines
- mv conftest.tail conftest.defines
-done
-rm -f conftest.defines conftest.tail
-
-echo "ac_result=$ac_in" >>$CONFIG_STATUS
-cat >>$CONFIG_STATUS <<\_ACEOF
if test x"$ac_file" != x-; then
- echo "/* $configure_input */" >"$tmp/config.h"
- cat "$ac_result" >>"$tmp/config.h"
- if diff $ac_file "$tmp/config.h" >/dev/null 2>&1; then
- { echo "$as_me:$LINENO: $ac_file is unchanged" >&5
-echo "$as_me: $ac_file is unchanged" >&6;}
+ {
+ $as_echo "/* $configure_input */" \
+ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs"
+ } >"$ac_tmp/config.h" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
+$as_echo "$as_me: $ac_file is unchanged" >&6;}
else
- rm -f $ac_file
- mv "$tmp/config.h" $ac_file
+ rm -f "$ac_file"
+ mv "$ac_tmp/config.h" "$ac_file" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
fi
else
- echo "/* $configure_input */"
- cat "$ac_result"
+ $as_echo "/* $configure_input */" \
+ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \
+ || as_fn_error $? "could not create -" "$LINENO" 5
fi
- rm -f "$tmp/out12"
;;
esac
done # for ac_tag
-{ (exit 0); exit 0; }
+as_fn_exit 0
_ACEOF
-chmod +x $CONFIG_STATUS
ac_clean_files=$ac_clean_files_save
+test $ac_write_fail = 0 ||
+ as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5
+
# configure is writing to config.log, and then calls config.status.
# config.status does its own redirection, appending to config.log.
# Unfortunately, on DOS this fails, as config.log is still kept open
# by configure, so config.status won't be able to write to it; its
# output is simply discarded. So we exec the FD to /dev/null,
# effectively closing config.log, so it can be properly (re)opened and
# appended to by config.status. When coming back to configure, we
# need to make the FD available again.
if test "$no_create" != yes; then
ac_cs_success=:
ac_config_status_args=
test "$silent" = yes &&
ac_config_status_args="$ac_config_status_args --quiet"
exec 5>/dev/null
$SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
exec 5>>config.log
# Use ||, not &&, to avoid exiting from the if with $? = 1, which
# would make configure fail if this is the last instruction.
- $ac_cs_success || { (exit 1); exit 1; }
+ $ac_cs_success || as_fn_exit 1
+fi
+if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
fi
Property changes on: trunk/cuba/configure
___________________________________________________________________
Modified: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/cuba/makefile.in
===================================================================
--- trunk/cuba/makefile.in (revision 158)
+++ trunk/cuba/makefile.in (revision 159)
@@ -1,274 +1,354 @@
CC = @CC@
-CFLAGS = @CFLAGS@ @DEFS@ -I$(common) -I. -I$(srcdir)
+SUFFIX = @SUFFIX@
+CFLAGS = @CFLAGS@ @DEFS@ -DREALSIZE=@REALSIZE@ -I$(common) -I. -I$(srcdir)
MCFLAGS = @MCFLAGS@
-F77 = @F77@
-FFLAGS = @FFLAGS@
+FC = @FC@
+FCFLAGS = @FCFLAGS@ -DREALSIZE=@REALSIZE@
LIBS = @LIBS@
INSTALL = @INSTALL@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
RANLIB = @RANLIB@
EXE = @EXEEXT@
prefix = @prefix@
exec_prefix = @exec_prefix@
srcdir = @srcdir@
bindir = @bindir@
libdir = @libdir@
includedir = @includedir@
datarootdir = @datarootdir@
datadir = @datadir@
MATH_DEFAULT = @MATH_DEFAULT@
TOOLS_DEFAULT = @TOOLS_DEFAULT@
DEMO_FORTRAN_DEFAULT = @DEMO_FORTRAN_DEFAULT@$(EXE)
-MCC = CC="$(tools)/fcc" CXX="$(tools)/fcc" REALCC="$(CC)" PATH="$(PATH):$(tools)" mcc
+MCC = CC="$(tools)/fcc" CXX="$(tools)/fcc @MCSTDCPP@" \
+ REALCC="$(CC)" PATH="$(PATH):$(tools)" mcc
TARDIR = @PACKAGE_NAME@-@PACKAGE_VERSION@
TARFILE = $(TARDIR).tar.gz
-HEADERS = cuba.h
-LIB = libcuba.a
-MATH = Vegas$(EXE) Suave$(EXE) Divonne$(EXE) Cuhre$(EXE)
+HEADERS = cuba$(SUFFIX).h
+LIB = libcuba$(SUFFIX).a
+MATH = Vegas$(SUFFIX)$(EXE) Suave$(SUFFIX)$(EXE) Divonne$(SUFFIX)$(EXE) Cuhre$(SUFFIX)$(EXE)
TOOLS = partview$(EXE)
all: lib demos $(MATH_DEFAULT) $(TOOLS_DEFAULT)
-lib: $(LIB)
+lib: $(LIB) $(HEADERS)
demos: demo-c$(EXE) $(DEMO_FORTRAN_DEFAULT)
math: $(MATH)
tools: $(TOOLS)
install: lib $(TOOLS_DEFAULT)
$(INSTALL) -m 755 -d $(DESTDIR)$(libdir) \
$(DESTDIR)$(includedir) \
$(DESTDIR)$(bindir) \
$(DESTDIR)$(datadir)
$(INSTALL_DATA) $(LIB) $(DESTDIR)$(libdir)
for f in $(HEADERS) ; do \
$(INSTALL_DATA) `test -f $$f || echo $(srcdir)/`$$f $(DESTDIR)$(includedir); \
done
for f in $(MATH) $(TOOLS) ; do \
test -f $$f && $(INSTALL_PROGRAM) $$f $(DESTDIR)$(bindir) || : ; \
done
$(INSTALL_DATA) $(srcdir)/cuba.pdf $(DESTDIR)$(datadir)
check: demo-c
./demo-c | grep RESULT > demo-c.out
@echo diff demo-c.out $(demo)/demo-c.out
@diff demo-c.out $(demo)/demo-c.out || \
echo "Note: This is serious only if the results deviate significantly."
.SUFFIXES:
.SUFFIXES: .c .f .tm
common = $(srcdir)/src/common
vegas = $(srcdir)/src/vegas
suave = $(srcdir)/src/suave
divonne = $(srcdir)/src/divonne
cuhre = $(srcdir)/src/cuhre
demo = $(srcdir)/demo
tools = $(srcdir)/tools
COMMON_DEPS = $(common)/stddecl.h $(common)/ChiSquare.c $(common)/Erf.c
-
+COMMON_CDEPS = $(COMMON_DEPS) $(common)/CSample.c $(common)/Parallel.c $(common)/sock.h
+COMMON_TMDEPS = $(COMMON_DEPS) $(common)/MSample.c
VEGAS_C = $(vegas)/Vegas.c
VEGAS_TM = $(vegas)/Vegas.tm
-VEGAS_DEPS = $(COMMON_DEPS) $(common)/Random.c \
+VEGAS_DEPS = $(common)/Random.c \
$(vegas)/decl.h $(vegas)/common.c \
$(vegas)/Grid.c $(vegas)/Integrate.c
VEGAS = $(VEGAS_C) $(VEGAS_TM) $(VEGAS_DEPS)
-$(LIB)(Vegas.o): $(VEGAS_C) $(VEGAS_DEPS)
- $(CC) $(CFLAGS) -I$(vegas) -c -o Vegas.o $(VEGAS_C)
+$(LIB)(Vegas.o): config.h $(VEGAS_C) $(VEGAS_DEPS) $(COMMON_CDEPS)
+ $(CC) $(CFLAGS) -I$(vegas) -DNOUNDERSCORE -c -o Vegas.o $(VEGAS_C)
$(AR) $(ARFLAGS) $(LIB) Vegas.o
$(RM) Vegas.o
-$(LIB)(llVegas.o): $(VEGAS_C) $(VEGAS_DEPS)
- $(CC) $(CFLAGS) -I$(vegas) -DLONGLONGINT -c -o llVegas.o $(VEGAS_C)
+$(LIB)(llVegas.o): config.h $(VEGAS_C) $(VEGAS_DEPS) $(COMMON_CDEPS)
+ $(CC) $(CFLAGS) -I$(vegas) -DLONGLONGINT -DNOUNDERSCORE -c -o llVegas.o $(VEGAS_C)
$(AR) $(ARFLAGS) $(LIB) llVegas.o
$(RM) llVegas.o
-$(LIB)(Vegas_.o): $(VEGAS_C) $(VEGAS_DEPS)
- $(CC) $(CFLAGS) -I$(vegas) -DUNDERSCORE -c -o Vegas_.o $(VEGAS_C)
+$(LIB)(Vegas_.o): config.h $(VEGAS_C) $(VEGAS_DEPS) $(COMMON_CDEPS)
+ $(CC) $(CFLAGS) -I$(vegas) -c -o Vegas_.o $(VEGAS_C)
$(AR) $(ARFLAGS) $(LIB) Vegas_.o
$(RM) Vegas_.o
-$(LIB)(llVegas_.o): $(VEGAS_C) $(VEGAS_DEPS)
- $(CC) $(CFLAGS) -I$(vegas) -DLONGLONGINT -DUNDERSCORE -c -o llVegas_.o $(VEGAS_C)
+$(LIB)(llVegas_.o): config.h $(VEGAS_C) $(VEGAS_DEPS) $(COMMON_CDEPS)
+ $(CC) $(CFLAGS) -I$(vegas) -DLONGLONGINT -c -o llVegas_.o $(VEGAS_C)
$(AR) $(ARFLAGS) $(LIB) llVegas_.o
$(RM) llVegas_.o
-Vegas$(EXE): $(VEGAS_TM) $(VEGAS_DEPS)
+Vegas$(EXE): config.h $(VEGAS_TM) $(VEGAS_DEPS) $(COMMON_TMDEPS)
$(MCC) $(MCFLAGS) $(CFLAGS) -I$(vegas) -o Vegas$(EXE) $(VEGAS_TM)
strip Vegas$(EXE)
+Vegasl$(EXE): config.h $(VEGAS_TM) $(VEGAS_DEPS) $(COMMON_TMDEPS)
+ sed '/:Begin:/,/:End:/ s/Real64/Real128/g' $(VEGAS_TM) > Vegasl.tm
+ $(MCC) $(MCFLAGS) $(CFLAGS) -I$(vegas) -o Vegasl$(EXE) Vegasl.tm
+ strip Vegasl$(EXE)
+ $(RM) Vegasl.tm
+
+Vegasq$(EXE):
+
SUAVE_C = $(suave)/Suave.c
SUAVE_TM = $(suave)/Suave.tm
-SUAVE_DEPS = $(COMMON_DEPS) $(common)/Random.c \
+SUAVE_DEPS = $(common)/Random.c \
$(suave)/decl.h $(suave)/common.c \
$(suave)/Grid.c $(suave)/Fluct.c $(suave)/Sample.c \
$(suave)/Integrate.c
SUAVE = $(SUAVE_C) $(SUAVE_TM) $(SUAVE_DEPS)
-$(LIB)(Suave.o): $(SUAVE_C) $(SUAVE_DEPS)
- $(CC) $(CFLAGS) -I$(suave) -c -o Suave.o $(SUAVE_C)
+$(LIB)(Suave.o): config.h $(SUAVE_C) $(SUAVE_DEPS) $(COMMON_CDEPS)
+ $(CC) $(CFLAGS) -I$(suave) -DNOUNDERSCORE -c -o Suave.o $(SUAVE_C)
$(AR) $(ARFLAGS) $(LIB) Suave.o
$(RM) Suave.o
-$(LIB)(llSuave.o): $(SUAVE_C) $(SUAVE_DEPS)
- $(CC) $(CFLAGS) -I$(suave) -DLONGLONGINT -c -o llSuave.o $(SUAVE_C)
+$(LIB)(llSuave.o): config.h $(SUAVE_C) $(SUAVE_DEPS) $(COMMON_CDEPS)
+ $(CC) $(CFLAGS) -I$(suave) -DLONGLONGINT -DNOUNDERSCORE -c -o llSuave.o $(SUAVE_C)
$(AR) $(ARFLAGS) $(LIB) llSuave.o
$(RM) llSuave.o
-$(LIB)(Suave_.o): $(SUAVE_C) $(SUAVE_DEPS)
- $(CC) $(CFLAGS) -I$(suave) -DUNDERSCORE -c -o Suave_.o $(SUAVE_C)
+$(LIB)(Suave_.o): config.h $(SUAVE_C) $(SUAVE_DEPS) $(COMMON_CDEPS)
+ $(CC) $(CFLAGS) -I$(suave) -c -o Suave_.o $(SUAVE_C)
$(AR) $(ARFLAGS) $(LIB) Suave_.o
$(RM) Suave_.o
-$(LIB)(llSuave_.o): $(SUAVE_C) $(SUAVE_DEPS)
- $(CC) $(CFLAGS) -I$(suave) -DLONGLONGINT -DUNDERSCORE -c -o llSuave_.o $(SUAVE_C)
+$(LIB)(llSuave_.o): config.h $(SUAVE_C) $(SUAVE_DEPS) $(COMMON_CDEPS)
+ $(CC) $(CFLAGS) -I$(suave) -DLONGLONGINT -c -o llSuave_.o $(SUAVE_C)
$(AR) $(ARFLAGS) $(LIB) llSuave_.o
$(RM) llSuave_.o
-Suave$(EXE): $(SUAVE_TM) $(SUAVE_DEPS)
+Suave$(EXE): config.h $(SUAVE_TM) $(SUAVE_DEPS) $(COMMON_TMDEPS)
$(MCC) $(MCFLAGS) $(CFLAGS) -I$(suave) -o Suave$(EXE) $(SUAVE_TM)
strip Suave$(EXE)
+Suavel$(EXE): config.h $(SUAVE_TM) $(SUAVE_DEPS) $(COMMON_TMDEPS)
+ sed '/:Begin:/,/:End:/ s/Real64/Real128/g' $(SUAVE_TM) > Suavel.tm
+ $(MCC) $(MCFLAGS) $(CFLAGS) -I$(suave) -o Suavel$(EXE) Suavel.tm
+ strip Suavel$(EXE)
+ $(RM) Suavel.tm
+
+Suaveq$(EXE):
+
DIVONNE_C = $(divonne)/Divonne.c
DIVONNE_TM = $(divonne)/Divonne.tm
-DIVONNE_DEPS = $(COMMON_DEPS) $(common)/Random.c \
+DIVONNE_DEPS = $(common)/Random.c \
$(divonne)/decl.h $(divonne)/common.c \
$(divonne)/KorobovCoeff.c $(divonne)/Rule.c $(divonne)/Sample.c \
- $(divonne)/FindMinimum.c $(divonne)/Explore.c $(divonne)/Split.c \
- $(divonne)/Integrate.c
+ $(divonne)/FindMinimum.c $(divonne)/Iterate.c $(divonne)/Explore.c \
+ $(divonne)/Split.c $(divonne)/Integrate.c
DIVONNE = $(DIVONNE_C) $(DIVONNE_TM) $(DIVONNE_DEPS)
-$(LIB)(Divonne.o): $(DIVONNE_C) $(DIVONNE_DEPS)
- $(CC) $(CFLAGS) -I$(divonne) -c -o Divonne.o $(DIVONNE_C)
+$(LIB)(Divonne.o): config.h $(DIVONNE_C) $(DIVONNE_DEPS) $(COMMON_CDEPS)
+ $(CC) $(CFLAGS) -I$(divonne) -DNOUNDERSCORE -c -o Divonne.o $(DIVONNE_C)
$(AR) $(ARFLAGS) $(LIB) Divonne.o
$(RM) Divonne.o
-$(LIB)(llDivonne.o): $(DIVONNE_C) $(DIVONNE_DEPS)
- $(CC) $(CFLAGS) -I$(divonne) -DLONGLONGINT -c -o llDivonne.o $(DIVONNE_C)
+$(LIB)(llDivonne.o): config.h $(DIVONNE_C) $(DIVONNE_DEPS) $(COMMON_CDEPS)
+ $(CC) $(CFLAGS) -I$(divonne) -DLONGLONGINT -DNOUNDERSCORE -c -o llDivonne.o $(DIVONNE_C)
$(AR) $(ARFLAGS) $(LIB) llDivonne.o
$(RM) llDivonne.o
-$(LIB)(Divonne_.o): $(DIVONNE_C) $(DIVONNE_DEPS)
- $(CC) $(CFLAGS) -I$(divonne) -DUNDERSCORE -c -o Divonne_.o $(DIVONNE_C)
+$(LIB)(Divonne_.o): config.h $(DIVONNE_C) $(DIVONNE_DEPS) $(COMMON_CDEPS)
+ $(CC) $(CFLAGS) -I$(divonne) -c -o Divonne_.o $(DIVONNE_C)
$(AR) $(ARFLAGS) $(LIB) Divonne_.o
$(RM) Divonne_.o
-$(LIB)(llDivonne_.o): $(DIVONNE_C) $(DIVONNE_DEPS)
- $(CC) $(CFLAGS) -I$(divonne) -DLONGLONGINT -DUNDERSCORE -c -o llDivonne_.o $(DIVONNE_C)
+$(LIB)(llDivonne_.o): config.h $(DIVONNE_C) $(DIVONNE_DEPS) $(COMMON_CDEPS)
+ $(CC) $(CFLAGS) -I$(divonne) -DLONGLONGINT -c -o llDivonne_.o $(DIVONNE_C)
$(AR) $(ARFLAGS) $(LIB) llDivonne_.o
$(RM) llDivonne_.o
-Divonne$(EXE): $(DIVONNE_TM) $(DIVONNE_DEPS)
+Divonne$(EXE): config.h $(DIVONNE_TM) $(DIVONNE_DEPS) $(COMMON_TMDEPS)
$(MCC) $(MCFLAGS) $(CFLAGS) -I$(divonne) -o Divonne$(EXE) $(DIVONNE_TM)
strip Divonne$(EXE)
+Divonnel$(EXE): config.h $(DIVONNE_TM) $(DIVONNE_DEPS) $(COMMON_TMDEPS)
+ sed '/:Begin:/,/:End:/ s/Real64/Real128/g' $(DIVONNE_TM) > Divonnel.tm
+ $(MCC) $(MCFLAGS) $(CFLAGS) -I$(divonne) -o Divonnel$(EXE) Divonnel.tm
+ strip Divonnel$(EXE)
+ $(RM) Divonnel.tm
+
+Divonneq$(EXE):
+
CUHRE_C = $(cuhre)/Cuhre.c
CUHRE_TM = $(cuhre)/Cuhre.tm
-CUHRE_DEPS = $(COMMON_DEPS) \
+CUHRE_DEPS = \
$(cuhre)/decl.h $(cuhre)/common.c \
$(cuhre)/Rule.c $(cuhre)/Integrate.c
CUHRE = $(CUHRE_C) $(CUHRE_TM) $(CUHRE_DEPS)
-$(LIB)(Cuhre.o): $(CUHRE_C) $(CUHRE_DEPS)
- $(CC) $(CFLAGS) -I$(cuhre) -c -o Cuhre.o $(CUHRE_C)
+$(LIB)(Cuhre.o): config.h $(CUHRE_C) $(CUHRE_DEPS) $(COMMON_CDEPS)
+ $(CC) $(CFLAGS) -I$(cuhre) -DNOUNDERSCORE -c -o Cuhre.o $(CUHRE_C)
$(AR) $(ARFLAGS) $(LIB) Cuhre.o
$(RM) Cuhre.o
-$(LIB)(llCuhre.o): $(CUHRE_C) $(CUHRE_DEPS)
- $(CC) $(CFLAGS) -I$(cuhre) -DLONGLONGINT -c -o llCuhre.o $(CUHRE_C)
+$(LIB)(llCuhre.o): config.h $(CUHRE_C) $(CUHRE_DEPS) $(COMMON_CDEPS)
+ $(CC) $(CFLAGS) -I$(cuhre) -DLONGLONGINT -DNOUNDERSCORE -c -o llCuhre.o $(CUHRE_C)
$(AR) $(ARFLAGS) $(LIB) llCuhre.o
$(RM) llCuhre.o
-$(LIB)(Cuhre_.o): $(CUHRE_C) $(CUHRE_DEPS)
- $(CC) $(CFLAGS) -I$(cuhre) -DUNDERSCORE -c -o Cuhre_.o $(CUHRE_C)
+$(LIB)(Cuhre_.o): config.h $(CUHRE_C) $(CUHRE_DEPS) $(COMMON_CDEPS)
+ $(CC) $(CFLAGS) -I$(cuhre) -c -o Cuhre_.o $(CUHRE_C)
$(AR) $(ARFLAGS) $(LIB) Cuhre_.o
$(RM) Cuhre_.o
-$(LIB)(llCuhre_.o): $(CUHRE_C) $(CUHRE_DEPS)
- $(CC) $(CFLAGS) -I$(cuhre) -DLONGLONGINT -DUNDERSCORE -c -o llCuhre_.o $(CUHRE_C)
+$(LIB)(llCuhre_.o): config.h $(CUHRE_C) $(CUHRE_DEPS) $(COMMON_CDEPS)
+ $(CC) $(CFLAGS) -I$(cuhre) -DLONGLONGINT -c -o llCuhre_.o $(CUHRE_C)
$(AR) $(ARFLAGS) $(LIB) llCuhre_.o
$(RM) llCuhre_.o
-Cuhre$(EXE): $(CUHRE_TM) $(CUHRE_DEPS)
+Cuhre$(EXE): config.h $(CUHRE_TM) $(CUHRE_DEPS) $(COMMON_TMDEPS)
$(MCC) $(MCFLAGS) $(CFLAGS) -I$(cuhre) -o Cuhre$(EXE) $(CUHRE_TM)
strip Cuhre$(EXE)
+Cuhrel$(EXE): config.h $(CUHRE_TM) $(CUHRE_DEPS) $(COMMON_TMDEPS)
+ sed '/:Begin:/,/:End:/ s/Real64/Real128/g' $(CUHRE_TM) > Cuhrel.tm
+ $(MCC) $(MCFLAGS) $(CFLAGS) -I$(cuhre) -o Cuhrel$(EXE) Cuhrel.tm
+ strip Cuhrel$(EXE)
+ $(RM) Cuhrel.tm
+
+Cuhreq$(EXE):
+
+
+$(LIB)(Fork.o): $(common)/Fork.c $(common)/stddecl.h $(common)/sock.h
+ $(CC) $(CFLAGS) -DNOUNDERSCORE -c -o Fork.o $(common)/Fork.c
+ $(AR) $(ARFLAGS) $(LIB) Fork.o
+ $(RM) Fork.o
+
+$(LIB)(Fork_.o): $(common)/Fork.c $(common)/stddecl.h $(common)/sock.h
+ $(CC) $(CFLAGS) -c -o Fork_.o $(common)/Fork.c
+ $(AR) $(ARFLAGS) $(LIB) Fork_.o
+ $(RM) Fork_.o
+
+
+$(LIB)(Global.o): $(common)/Global.c $(common)/stddecl.h
+ $(CC) $(CFLAGS) -DNOUNDERSCORE -c -o Global.o $(common)/Global.c
+ $(AR) $(ARFLAGS) $(LIB) Global.o
+ $(RM) Global.o
+
+$(LIB)(Global_.o): $(common)/Global.c $(common)/stddecl.h
+ $(CC) $(CFLAGS) -c -o Global_.o $(common)/Global.c
+ $(AR) $(ARFLAGS) $(LIB) Global_.o
+ $(RM) Global_.o
+
+
+$(LIB)(Data.o): $(common)/Data.c $(common)/stddecl.h
+ $(CC) $(CFLAGS) -c -o Data.o $(common)/Data.c
+ $(AR) $(ARFLAGS) $(LIB) Data.o
+ $(RM) Data.o
+
$(LIB): $(LIB)(Vegas.o) $(LIB)(Vegas_.o) \
$(LIB)(llVegas.o) $(LIB)(llVegas_.o) \
$(LIB)(Suave.o) $(LIB)(Suave_.o) \
$(LIB)(llSuave.o) $(LIB)(llSuave_.o) \
$(LIB)(Divonne.o) $(LIB)(Divonne_.o) \
$(LIB)(llDivonne.o) $(LIB)(llDivonne_.o) \
$(LIB)(Cuhre.o) $(LIB)(Cuhre_.o) \
- $(LIB)(llCuhre.o) $(LIB)(llCuhre_.o)
+ $(LIB)(llCuhre.o) $(LIB)(llCuhre_.o) \
+ $(LIB)(Fork.o) $(LIB)(Fork_.o) \
+ $(LIB)(Global.o) $(LIB)(Global_.o) \
+ $(LIB)(Data.o)
-$(RANLIB) $(LIB)
+cubal.h: cuba.h
+ sed 's/double/long double/g' cuba.h > cubal.h
+
+cubaq.h: cuba.h
+ sed 's/double/__float128/g' cuba.h > cubaq.h
+
+
DEMO_F = $(demo)/demo-fortran.F
DEMO_C = $(demo)/demo-c.c
DEMO_TM = $(demo)/demo-math.m $(demo)/testsuite.m
DEMO = $(DEMO_F) $(DEMO_C) $(DEMO_TM) $(demo)/demo-c.out $(demo)/cuba.F
demo-fortran$(EXE): $(DEMO_F) $(LIB)
- $(F77) $(FFLAGS) -o demo-fortran$(EXE) $(DEMO_F) $(LIB) $(LIBS)
+ $(FC) $(FCFLAGS) -o demo-fortran$(EXE) $(DEMO_F) $(LIB) $(LIBS)
demo-c$(EXE): $(DEMO_C) $(srcdir)/cuba.h $(LIB)
$(CC) $(CFLAGS) -o demo-c$(EXE) $(DEMO_C) $(LIB) $(LIBS)
PARTVIEW = $(tools)/partview.cpp $(tools)/partview.pro \
$(tools)/quit.xpm $(tools)/print.xpm
partview$(EXE): $(PARTVIEW)
qmake -o makefile.partview $(tools)/partview.pro
$(MAKE) -f makefile.partview
- strip partview$(EXE)
+ $(RM) partview.o partview.moc makefile.partview
+ -strip partview$(EXE)
TARCONTENTS = $(srcdir)/COPYING $(srcdir)/ChangeLog \
- $(srcdir)/configure $(srcdir)/configure.ac $(srcdir)/install-sh \
+ $(srcdir)/configure $(srcdir)/configure.ac \
+ $(srcdir)/config.sub $(srcdir)/config.guess $(srcdir)/install-sh \
$(srcdir)/makefile.in $(srcdir)/config.h.in \
- $(srcdir)/cuba.pdf $(srcdir)/cuba.h \
- $(VEGAS) $(SUAVE) $(DIVONNE) $(CUHRE) \
+ $(srcdir)/cuba.pdf $(srcdir)/cuba.tex $(srcdir)/cuba.h \
+ $(COMMON_CDEPS) $(COMMON_TMDEPS) \
+ $(common)/Global.c $(common)/Fork.c $(common)/Data.c \
+ $(VEGAS) $(SUAVE) $(DIVONNE) $(divonne)/KorobovCoeff.c-* $(CUHRE) \
$(DEMO) $(PARTVIEW) $(tools)/partview.m \
- $(tools)/mcc $(tools)/fcc $(tools)/mkstatic
+ $(tools)/mcc $(tools)/fcc $(tools)/mkstatic $(tools)/mkdist.c
dist:
- ln -s . $(TARDIR)
- tar cvfzh $(TARFILE) --owner=root --group=root \
- $(patsubst $(srcdir)/%,$(TARDIR)/%, $(sort $(TARCONTENTS)))
- $(RM) $(TARDIR)
+ mkdist cvfz $(TARFILE) $(TARDIR) \
+ $(patsubst $(srcdir)/%,%, $(sort $(TARCONTENTS)))
+
+# ln -s . $(TARDIR)
+# tar cvfz $(TARFILE) --owner=root --group=root \
+# $(patsubst $(srcdir)/%,$(TARDIR)/%, $(sort $(TARCONTENTS)))
+# $(RM) $(TARDIR)
pub: dist
mv -f $(TARFILE) web/
./mkwebpage
clean:
-$(RM) $(TARFILE) $(TARDIR) demo-c.out \
partview.moc partview.o makefile.partview \
- *.o */*.o */*.tm.c
+ cubal.h cubaq.h *.o */*.o */*.tm.c *.tm
distclean: clean
-$(RM) $(LIB) demo-c demo-fortran $(MATH) $(TOOLS) \
config.h config.log config.status makefile
Index: trunk/cuba/cuba.pdf
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: trunk/cuba/demo/demo-fortran.F
===================================================================
--- trunk/cuba/demo/demo-fortran.F (revision 158)
+++ trunk/cuba/demo/demo-fortran.F (revision 159)
@@ -1,171 +1,187 @@
* demo-fortran.F
* test program for the Cuba library
-* last modified 19 May 10 th
+* last modified 13 Mar 15 th
+
+#define cubareal real*REALSIZE
program CubaTest
implicit none
- integer ndim, ncomp, verbose, last, seed, mineval, maxeval
- double precision epsrel, epsabs, userdata
+ integer ndim, ncomp, nvec, last, seed, mineval, maxeval
+ cubareal epsrel, epsabs, userdata
parameter (ndim = 3)
parameter (ncomp = 1)
parameter (userdata = 0)
+ parameter (nvec = 1)
parameter (epsrel = 1D-3)
parameter (epsabs = 1D-12)
- parameter (verbose = 2)
parameter (last = 4)
parameter (seed = 0)
parameter (mineval = 0)
parameter (maxeval = 50000)
integer nstart, nincrease, nbatch, gridno
+ integer*8 spin
character*(*) statefile
parameter (nstart = 1000)
parameter (nincrease = 500)
parameter (nbatch = 1000)
parameter (gridno = 0)
parameter (statefile = "")
+ parameter (spin = -1)
- integer nnew
- double precision flatness
+ integer nnew, nmin
+ cubareal flatness
parameter (nnew = 1000)
+ parameter (nmin = 2)
parameter (flatness = 25D0)
integer key1, key2, key3, maxpass
- double precision border, maxchisq, mindeviation
+ cubareal border, maxchisq, mindeviation
integer ngiven, ldxgiven, nextra
parameter (key1 = 47)
parameter (key2 = 1)
parameter (key3 = 1)
parameter (maxpass = 5)
parameter (border = 0D0)
parameter (maxchisq = 10D0)
parameter (mindeviation = .25D0)
parameter (ngiven = 0)
parameter (ldxgiven = ndim)
parameter (nextra = 0)
integer key
parameter (key = 0)
external integrand
- double precision integral(ncomp), error(ncomp), prob(ncomp)
- integer nregions, neval, fail
+ cubareal integral(ncomp), error(ncomp), prob(ncomp)
+ integer verbose, nregions, neval, fail
+ character*16 env
integer c
+ call getenv("CUBAVERBOSE", env)
+ verbose = 2
+ read(env, *, iostat=fail, end=999, err=999) verbose
+999 continue
+
print *, "-------------------- Vegas test --------------------"
- call vegas(ndim, ncomp, integrand, userdata,
+ call vegas(ndim, ncomp, integrand, userdata, nvec,
& epsrel, epsabs, verbose, seed,
& mineval, maxeval, nstart, nincrease, nbatch,
- & gridno, statefile,
+ & gridno, statefile, spin,
& neval, fail, integral, error, prob)
print *, "neval =", neval
print *, "fail =", fail
print '(F20.12," +- ",F20.12," p = ",F8.3)',
& (integral(c), error(c), prob(c), c = 1, ncomp)
print *, " "
print *, "-------------------- Suave test --------------------"
- call suave(ndim, ncomp, integrand, userdata,
+ call suave(ndim, ncomp, integrand, userdata, nvec,
& epsrel, epsabs, verbose + last, seed,
- & mineval, maxeval, nnew, flatness,
+ & mineval, maxeval, nnew, nmin, flatness,
+ & statefile, spin,
& nregions, neval, fail, integral, error, prob)
print *, "nregions =", nregions
print *, "neval =", neval
print *, "fail =", fail
print '(F20.12," +- ",F20.12," p = ",F8.3)',
& (integral(c), error(c), prob(c), c = 1, ncomp)
print *, " "
print *, "------------------- Divonne test -------------------"
- call divonne(ndim, ncomp, integrand, userdata,
+ call divonne(ndim, ncomp, integrand, userdata, nvec,
& epsrel, epsabs, verbose, seed,
& mineval, maxeval, key1, key2, key3, maxpass,
& border, maxchisq, mindeviation,
& ngiven, ldxgiven, 0, nextra, 0,
+ & statefile, spin,
& nregions, neval, fail, integral, error, prob)
print *, "nregions =", nregions
print *, "neval =", neval
print *, "fail =", fail
print '(F20.12," +- ",F20.12," p = ",F8.3)',
& (integral(c), error(c), prob(c), c = 1, ncomp)
print *, " "
print *, "-------------------- Cuhre test --------------------"
- call cuhre(ndim, ncomp, integrand, userdata,
+ call cuhre(ndim, ncomp, integrand, userdata, nvec,
& epsrel, epsabs, verbose + last,
& mineval, maxeval, key,
+ & statefile, spin,
& nregions, neval, fail, integral, error, prob)
print *, "nregions =", nregions
print *, "neval =", neval
print *, "fail =", fail
print '(F20.12," +- ",F20.12," p = ",F8.3)',
& (integral(c), error(c), prob(c), c = 1, ncomp)
end
************************************************************************
integer function integrand(ndim, xx, ncomp, ff)
implicit none
integer ndim, ncomp
- double precision xx(*), ff(*)
+ cubareal xx(*), ff(*)
#define x xx(1)
#define y xx(2)
#define z xx(3)
#define f ff(1)
+#ifndef FUN
#define FUN 1
+#endif
- double precision pi, rsq
+ cubareal pi, rsq
parameter (pi = 3.14159265358979323846D0)
rsq = x**2 + y**2 + z**2
#if FUN == 1
f = sin(x)*cos(y)*exp(z)
#elif FUN == 2
f = 1/((x + y)**2 + .003D0)*cos(y)*exp(z)
#elif FUN == 3
f = 1/(3.75D0 - cos(pi*x) - cos(pi*y) - cos(pi*z))
#elif FUN == 4
f = abs(rsq - .125D0)
#elif FUN == 5
f = exp(-rsq)
#elif FUN == 6
f = 1/(1 - x*y*z + 1D-10)
#elif FUN == 7
f = sqrt(abs(x - y - z))
#elif FUN == 8
f = exp(-x*y*z)
#elif FUN == 9
f = x**2/(cos(x + y + z + 1) + 5)
#elif FUN == 10
if( x .gt. .5D0 ) then
f = 1/sqrt(x*y*z + 1D-5)
else
f = sqrt(x*y*z)
endif
#else
if( rsq .lt. 1 ) then
f = 1
else
f = 0
endif
#endif
integrand = 0
end
Index: trunk/cuba/demo/demo-c.c
===================================================================
--- trunk/cuba/demo/demo-c.c (revision 158)
+++ trunk/cuba/demo/demo-c.c (revision 159)
@@ -1,148 +1,176 @@
+/*
+ demo-c.c
+ test program for the Cuba library
+ last modified 13 Mar 15 th
+*/
+
#include <stdio.h>
+#include <stdlib.h>
#include <math.h>
+
+#if REALSIZE == 16
+#include "cubaq.h"
+#elif REALSIZE == 10
+#include "cubal.h"
+#else
#include "cuba.h"
+#endif
-static inline double Sq(double x)
-{
+static inline cubareal Sq(cubareal x) {
return x*x;
}
-static int Integrand(const int *ndim, const double xx[],
- const int *ncomp, double ff[], void *userdata)
-{
+static int Integrand(const int *ndim, const cubareal xx[],
+ const int *ncomp, cubareal ff[], void *userdata) {
+
#define x xx[0]
#define y xx[1]
#define z xx[2]
#define f ff[0]
+#ifndef FUN
#define FUN 1
+#endif
- const double rsq = Sq(x) + Sq(y) + Sq(z);
+#define rsq (Sq(x) + Sq(y) + Sq(z))
#if FUN == 1
f = sin(x)*cos(y)*exp(z);
#elif FUN == 2
f = 1/(Sq(x + y) + .003)*cos(y)*exp(z);
#elif FUN == 3
f = 1/(3.75 - cos(M_PI*x) - cos(M_PI*y) - cos(M_PI*z));
#elif FUN == 4
f = fabs(rsq - .125);
#elif FUN == 5
f = exp(-rsq);
#elif FUN == 6
f = 1/(1 - x*y*z + 1e-10);
#elif FUN == 7
f = sqrt(fabs(x - y - z));
#elif FUN == 8
f = exp(-x*y*z);
#elif FUN == 9
f = Sq(x)/(cos(x + y + z + 1) + 5);
#elif FUN == 10
f = (x > .5) ? 1/sqrt(x*y*z + 1e-5) : sqrt(x*y*z);
#else
f = (rsq < 1) ? 1 : 0;
#endif
return 0;
}
/*********************************************************************/
#define NDIM 3
#define NCOMP 1
#define USERDATA NULL
+#define NVEC 1
#define EPSREL 1e-3
#define EPSABS 1e-12
#define VERBOSE 2
#define LAST 4
#define SEED 0
#define MINEVAL 0
#define MAXEVAL 50000
#define NSTART 1000
#define NINCREASE 500
#define NBATCH 1000
#define GRIDNO 0
#define STATEFILE NULL
+#define SPIN NULL
#define NNEW 1000
+#define NMIN 2
#define FLATNESS 25.
#define KEY1 47
#define KEY2 1
#define KEY3 1
#define MAXPASS 5
#define BORDER 0.
#define MAXCHISQ 10.
#define MINDEVIATION .25
#define NGIVEN 0
#define LDXGIVEN NDIM
#define NEXTRA 0
#define KEY 0
-int main()
-{
+int main() {
int comp, nregions, neval, fail;
- double integral[NCOMP], error[NCOMP], prob[NCOMP];
+ cubareal integral[NCOMP], error[NCOMP], prob[NCOMP];
+#if 1
printf("-------------------- Vegas test --------------------\n");
- Vegas(NDIM, NCOMP, Integrand, USERDATA,
+ Vegas(NDIM, NCOMP, Integrand, USERDATA, NVEC,
EPSREL, EPSABS, VERBOSE, SEED,
MINEVAL, MAXEVAL, NSTART, NINCREASE, NBATCH,
- GRIDNO, STATEFILE,
+ GRIDNO, STATEFILE, SPIN,
&neval, &fail, integral, error, prob);
printf("VEGAS RESULT:\tneval %d\tfail %d\n",
neval, fail);
for( comp = 0; comp < NCOMP; ++comp )
printf("VEGAS RESULT:\t%.8f +- %.8f\tp = %.3f\n",
- integral[comp], error[comp], prob[comp]);
+ (double)integral[comp], (double)error[comp], (double)prob[comp]);
+#endif
+#if 1
printf("\n-------------------- Suave test --------------------\n");
- Suave(NDIM, NCOMP, Integrand, USERDATA,
+ Suave(NDIM, NCOMP, Integrand, USERDATA, NVEC,
EPSREL, EPSABS, VERBOSE | LAST, SEED,
- MINEVAL, MAXEVAL, NNEW, FLATNESS,
+ MINEVAL, MAXEVAL, NNEW, NMIN, FLATNESS,
+ STATEFILE, SPIN,
&nregions, &neval, &fail, integral, error, prob);
printf("SUAVE RESULT:\tnregions %d\tneval %d\tfail %d\n",
nregions, neval, fail);
for( comp = 0; comp < NCOMP; ++comp )
printf("SUAVE RESULT:\t%.8f +- %.8f\tp = %.3f\n",
- integral[comp], error[comp], prob[comp]);
+ (double)integral[comp], (double)error[comp], (double)prob[comp]);
+#endif
+#if 1
printf("\n------------------- Divonne test -------------------\n");
- Divonne(NDIM, NCOMP, Integrand, USERDATA,
+ Divonne(NDIM, NCOMP, Integrand, USERDATA, NVEC,
EPSREL, EPSABS, VERBOSE, SEED,
MINEVAL, MAXEVAL, KEY1, KEY2, KEY3, MAXPASS,
BORDER, MAXCHISQ, MINDEVIATION,
NGIVEN, LDXGIVEN, NULL, NEXTRA, NULL,
+ STATEFILE, SPIN,
&nregions, &neval, &fail, integral, error, prob);
printf("DIVONNE RESULT:\tnregions %d\tneval %d\tfail %d\n",
nregions, neval, fail);
for( comp = 0; comp < NCOMP; ++comp )
printf("DIVONNE RESULT:\t%.8f +- %.8f\tp = %.3f\n",
- integral[comp], error[comp], prob[comp]);
+ (double)integral[comp], (double)error[comp], (double)prob[comp]);
+#endif
+#if 1
printf("\n-------------------- Cuhre test --------------------\n");
- Cuhre(NDIM, NCOMP, Integrand, USERDATA,
+ Cuhre(NDIM, NCOMP, Integrand, USERDATA, NVEC,
EPSREL, EPSABS, VERBOSE | LAST,
MINEVAL, MAXEVAL, KEY,
+ STATEFILE, SPIN,
&nregions, &neval, &fail, integral, error, prob);
printf("CUHRE RESULT:\tnregions %d\tneval %d\tfail %d\n",
nregions, neval, fail);
for( comp = 0; comp < NCOMP; ++comp )
printf("CUHRE RESULT:\t%.8f +- %.8f\tp = %.3f\n",
- integral[comp], error[comp], prob[comp]);
+ (double)integral[comp], (double)error[comp], (double)prob[comp]);
+#endif
return 0;
}
Index: trunk/cuba/demo/demo-c.out
===================================================================
--- trunk/cuba/demo/demo-c.out (revision 158)
+++ trunk/cuba/demo/demo-c.out (revision 159)
@@ -1,8 +1,8 @@
VEGAS RESULT: neval 10000 fail 0
VEGAS RESULT: 0.66481073 +- 0.00049218 p = 0.089
SUAVE RESULT: nregions 7 neval 7000 fail 0
SUAVE RESULT: 0.66444529 +- 0.00056577 p = 0.210
-DIVONNE RESULT: nregions 14 neval 3084 fail 0
-DIVONNE RESULT: 0.66461951 +- 0.00063681 p = 0.000
+DIVONNE RESULT: nregions 14 neval 3052 fail 0
+DIVONNE RESULT: 0.66461951 +- 0.00063503 p = 0.000
CUHRE RESULT: nregions 2 neval 381 fail 0
CUHRE RESULT: 0.66466968 +- 0.00000000 p = 0.000
Index: trunk/cuba/config.log
===================================================================
--- trunk/cuba/config.log (revision 158)
+++ trunk/cuba/config.log (revision 159)
@@ -1,353 +1,839 @@
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
-It was created by Cuba configure 2.1, which was
-generated by GNU Autoconf 2.61. Invocation command line was
+It was created by Cuba configure 4.2, which was
+generated by GNU Autoconf 2.69. Invocation command line was
$ ./configure
## --------- ##
## Platform. ##
## --------- ##
-hostname = Tobias-Tolls-MacBook-Pro.local
-uname -m = i386
-uname -r = 10.8.0
-uname -s = Darwin
-uname -v = Darwin Kernel Version 10.8.0: Tue Jun 7 16:33:36 PDT 2011; root:xnu-1504.15.3~1/RELEASE_I386
+hostname = tollto-XPS13-9333
+uname -m = x86_64
+uname -r = 3.13.0-48-generic
+uname -s = Linux
+uname -v = #80-Ubuntu SMP Thu Mar 12 11:16:15 UTC 2015
-/usr/bin/uname -p = i386
+/usr/bin/uname -p = unknown
/bin/uname -X = unknown
/bin/arch = unknown
/usr/bin/arch -k = unknown
/usr/convex/getsysinfo = unknown
-/usr/bin/hostinfo = Mach kernel version:
- Darwin Kernel Version 10.8.0: Tue Jun 7 16:33:36 PDT 2011; root:xnu-1504.15.3~1/RELEASE_I386
-Kernel configured for up to 4 processors.
-2 processors are physically available.
-4 processors are logically available.
-Processor type: i486 (Intel 80486)
-Processors active: 0 1 2 3
-Primary memory available: 4.00 gigabytes
-Default processor set: 135 tasks, 691 threads, 4 processors
-Load average: 1.45, Mach factor: 2.53
+/usr/bin/hostinfo = unknown
/bin/machine = unknown
/usr/bin/oslevel = unknown
/bin/universe = unknown
-PATH: /Users/macl/Software/cernlib/2005/bin
-PATH: .
-PATH: /Users/tollto/bin/
-PATH: /usr/X11R6/bin
-PATH: /Applications/Wired/bin
-PATH: /usr/bin
+PATH: /home/tollto/SNU/root-5.34.30/bin
+PATH: /usr/local/sbin
PATH: /usr/local/bin
-PATH: /Users/macl/bin
-PATH: /usr/local/include/freetype2
-PATH: /sw/include/pythia6205
-PATH: /sw/bin
-PATH: /usr/lib/root/bin
-PATH: /sw/bin
-PATH: /sw/sbin
-PATH: /usr/bin
-PATH: /bin
PATH: /usr/sbin
+PATH: /usr/bin
PATH: /sbin
-PATH: /usr/local/bin
-PATH: /usr/texbin
-PATH: /usr/X11/bin
-PATH: /usr/X11R6/bin
+PATH: /bin
+PATH: /usr/games
+PATH: /usr/local/games
## ----------- ##
## Core tests. ##
## ----------- ##
-configure:1725: checking for gcc
-configure:1741: found /usr/bin/gcc
-configure:1752: result: gcc
-configure:1990: checking for C compiler version
-configure:1997: gcc --version >&5
-i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5666) (dot 3)
-Copyright (C) 2007 Free Software Foundation, Inc.
+configure:2279: checking for gcc
+configure:2295: found /usr/bin/gcc
+configure:2306: result: gcc
+configure:2535: checking for C compiler version
+configure:2544: gcc --version >&5
+gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2
+Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-configure:2000: $? = 0
-configure:2007: gcc -v >&5
+configure:2555: $? = 0
+configure:2544: gcc -v >&5
Using built-in specs.
-Target: i686-apple-darwin10
-Configured with: /var/tmp/gcc/gcc-5666.3~6/src/configure --disable-checking --enable-werror --prefix=/usr --mandir=/share/man --enable-languages=c,objc,c++,obj-c++ --program-transform-name=/^[cg][^.-]*$/s/$/-4.2/ --with-slibdir=/usr/lib --build=i686-apple-darwin10 --program-prefix=i686-apple-darwin10- --host=x86_64-apple-darwin10 --target=i686-apple-darwin10 --with-gxx-include-dir=/include/c++/4.2.1
+COLLECT_GCC=gcc
+COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.8/lto-wrapper
+Target: x86_64-linux-gnu
+Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.8.2-19ubuntu1' --with-bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.8 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.8 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-libmudflap --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.8-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
-gcc version 4.2.1 (Apple Inc. build 5666) (dot 3)
-configure:2010: $? = 0
-configure:2017: gcc -V >&5
-gcc-4.2: argument to `-V' is missing
-configure:2020: $? = 1
-configure:2043: checking for C compiler default output file name
-configure:2070: gcc conftest.c -lm >&5
-configure:2073: $? = 0
-configure:2111: result: a.out
-configure:2128: checking whether the C compiler works
-configure:2138: ./a.out
-configure:2141: $? = 0
-configure:2158: result: yes
-configure:2165: checking whether we are cross compiling
-configure:2167: result: no
-configure:2170: checking for suffix of executables
-configure:2177: gcc -o conftest conftest.c -lm >&5
-configure:2180: $? = 0
-configure:2204: result:
-configure:2210: checking for suffix of object files
-configure:2236: gcc -c conftest.c >&5
-configure:2239: $? = 0
-configure:2262: result: o
-configure:2266: checking whether we are using the GNU C compiler
-configure:2295: gcc -c conftest.c >&5
-configure:2301: $? = 0
-configure:2318: result: yes
-configure:2323: checking whether gcc accepts -g
-configure:2353: gcc -c -g conftest.c >&5
-configure:2359: $? = 0
-configure:2458: result: yes
-configure:2475: checking for gcc option to accept ISO C89
-configure:2549: gcc -c -g -O2 conftest.c >&5
+gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1)
configure:2555: $? = 0
-configure:2578: result: none needed
-configure:2649: checking for g77
-configure:2679: result: no
-configure:2649: checking for xlf
-configure:2679: result: no
-configure:2649: checking for f77
-configure:2679: result: no
-configure:2649: checking for frt
-configure:2679: result: no
-configure:2649: checking for pgf77
-configure:2679: result: no
-configure:2649: checking for cf77
-configure:2679: result: no
-configure:2649: checking for fort77
-configure:2679: result: no
-configure:2649: checking for fl32
-configure:2679: result: no
-configure:2649: checking for af77
-configure:2679: result: no
-configure:2649: checking for xlf90
-configure:2679: result: no
-configure:2649: checking for f90
-configure:2679: result: no
-configure:2649: checking for pgf90
-configure:2679: result: no
-configure:2649: checking for pghpf
-configure:2679: result: no
-configure:2649: checking for epcf90
-configure:2679: result: no
-configure:2649: checking for gfortran
-configure:2665: found /usr/local/bin/gfortran
-configure:2676: result: gfortran
-configure:2706: checking for Fortran 77 compiler version
-configure:2713: gfortran --version >&5
-GNU Fortran (GCC) 4.3.0 20071026 (experimental)
-Copyright (C) 2007 Free Software Foundation, Inc.
+configure:2544: gcc -V >&5
+gcc: error: unrecognized command line option '-V'
+gcc: fatal error: no input files
+compilation terminated.
+configure:2555: $? = 4
+configure:2544: gcc -qversion >&5
+gcc: error: unrecognized command line option '-qversion'
+gcc: fatal error: no input files
+compilation terminated.
+configure:2555: $? = 4
+configure:2575: checking whether the C compiler works
+configure:2597: gcc conftest.c -lm >&5
+configure:2601: $? = 0
+configure:2649: result: yes
+configure:2652: checking for C compiler default output file name
+configure:2654: result: a.out
+configure:2660: checking for suffix of executables
+configure:2667: gcc -o conftest conftest.c -lm >&5
+configure:2671: $? = 0
+configure:2693: result:
+configure:2715: checking whether we are cross compiling
+configure:2723: gcc -o conftest conftest.c -lm >&5
+configure:2727: $? = 0
+configure:2734: ./conftest
+configure:2738: $? = 0
+configure:2753: result: no
+configure:2758: checking for suffix of object files
+configure:2780: gcc -c conftest.c >&5
+configure:2784: $? = 0
+configure:2805: result: o
+configure:2809: checking whether we are using the GNU C compiler
+configure:2828: gcc -c conftest.c >&5
+configure:2828: $? = 0
+configure:2837: result: yes
+configure:2846: checking whether gcc accepts -g
+configure:2866: gcc -c -g conftest.c >&5
+configure:2866: $? = 0
+configure:2907: result: yes
+configure:2924: checking for gcc option to accept ISO C89
+configure:2987: gcc -c -g -O2 conftest.c >&5
+configure:2987: $? = 0
+configure:3000: result: none needed
+configure:3073: checking for gfortran
+configure:3089: found /usr/bin/gfortran
+configure:3100: result: gfortran
+configure:3126: checking for Fortran compiler version
+configure:3135: gfortran --version >&5
+GNU Fortran (Ubuntu 4.8.2-19ubuntu1) 4.8.2
+Copyright (C) 2013 Free Software Foundation, Inc.
GNU Fortran comes with NO WARRANTY, to the extent permitted by law.
You may redistribute copies of GNU Fortran
under the terms of the GNU General Public License.
For more information about these matters, see the file named COPYING
-configure:2716: $? = 0
-configure:2723: gfortran -v >&5
+configure:3146: $? = 0
+configure:3135: gfortran -v >&5
Using built-in specs.
-Target: i386-apple-darwin9.0.0
-Configured with: ../gcc-4.3-20071026/configure --enable-languages=fortran
+COLLECT_GCC=gfortran
+COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.8/lto-wrapper
+Target: x86_64-linux-gnu
+Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.8.2-19ubuntu1' --with-bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.8 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.8 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-libmudflap --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.8-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
-gcc version 4.3.0 20071026 (experimental) (GCC)
-configure:2726: $? = 0
-configure:2733: gfortran -V >&5
-gfortran: '-V' option must have argument
-configure:2736: $? = 1
-configure:2744: checking whether we are using the GNU Fortran 77 compiler
-configure:2763: gfortran -c conftest.F >&5
-configure:2769: $? = 0
-configure:2786: result: yes
-configure:2792: checking whether gfortran accepts -g
-configure:2809: gfortran -c -g conftest.f >&5
-configure:2815: $? = 0
-configure:2831: result: yes
-configure:2899: checking for ranlib
-configure:2915: found /usr/bin/ranlib
-configure:2926: result: ranlib
-configure:2996: checking for a BSD-compatible install
-configure:3052: result: /usr/bin/install -c
-configure:3078: checking for an ANSI C-conforming const
-configure:3153: gcc -c -O0 -fomit-frame-pointer -ffast-math conftest.c >&5
-configure:3159: $? = 0
-configure:3174: result: yes
-configure:3184: checking for inline
-configure:3210: gcc -c -O0 -fomit-frame-pointer -ffast-math conftest.c >&5
-configure:3216: $? = 0
-configure:3234: result: inline
-configure:3255: checking for long double with more range or precision than double
-configure:3300: gcc -c -O0 -fomit-frame-pointer -ffast-math conftest.c >&5
-configure:3306: $? = 0
-configure:3321: result: yes
-configure:3345: checking for powl
-configure:3401: gcc -o conftest -O0 -fomit-frame-pointer -ffast-math conftest.c -lm >&5
-conftest.c:33: warning: conflicting types for built-in function 'powl'
-configure:3407: $? = 0
-configure:3425: result: yes
-configure:3439: checking for erf
-configure:3495: gcc -o conftest -O0 -fomit-frame-pointer -ffast-math conftest.c -lm >&5
-conftest.c:34: warning: conflicting types for built-in function 'erf'
-configure:3501: $? = 0
-configure:3519: result: yes
-configure:3546: checking for variable-size arrays
-configure:3562: gcc -c -O0 -fomit-frame-pointer -ffast-math conftest.c >&5
-configure:3568: $? = 0
-configure:3573: result: yes
-configure:3596: checking for MathLink
-configure:3624: result: no
-configure:3634: checking for qmake
-configure:3664: result: no
-configure:3783: creating ./config.status
+gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1)
+configure:3146: $? = 0
+configure:3135: gfortran -V >&5
+gfortran: error: unrecognized command line option '-V'
+gfortran: fatal error: no input files
+compilation terminated.
+configure:3146: $? = 4
+configure:3135: gfortran -qversion >&5
+gfortran: error: unrecognized command line option '-qversion'
+gfortran: fatal error: no input files
+compilation terminated.
+configure:3146: $? = 4
+configure:3155: checking whether we are using the GNU Fortran compiler
+configure:3168: gfortran -c conftest.F >&5
+configure:3168: $? = 0
+configure:3177: result: yes
+configure:3183: checking whether gfortran accepts -g
+configure:3194: gfortran -c -g conftest.f >&5
+configure:3194: $? = 0
+configure:3202: result: yes
+configure:3274: checking for ranlib
+configure:3290: found /usr/bin/ranlib
+configure:3301: result: ranlib
+configure:3366: checking for a BSD-compatible install
+configure:3434: result: /usr/bin/install -c
+configure:3461: checking for an ANSI C-conforming const
+configure:3527: gcc -c -O3 -fomit-frame-pointer -ffast-math -Wall conftest.c >&5
+configure:3527: $? = 0
+configure:3534: result: yes
+configure:3542: checking for inline
+configure:3558: gcc -c -O3 -fomit-frame-pointer -ffast-math -Wall conftest.c >&5
+configure:3558: $? = 0
+configure:3566: result: inline
+configure:3586: checking for long double with more range or precision than double
+configure:3622: gcc -c -O3 -fomit-frame-pointer -ffast-math -Wall conftest.c >&5
+configure:3622: $? = 0
+configure:3629: result: yes
+configure:3650: checking how to run the C preprocessor
+configure:3681: gcc -E conftest.c
+configure:3681: $? = 0
+configure:3695: gcc -E conftest.c
+conftest.c:11:28: fatal error: ac_nonexistent.h: No such file or directory
+ #include <ac_nonexistent.h>
+ ^
+compilation terminated.
+configure:3695: $? = 1
+configure: failed program was:
+| /* confdefs.h */
+| #define PACKAGE_NAME "Cuba"
+| #define PACKAGE_TARNAME "cuba"
+| #define PACKAGE_VERSION "4.2"
+| #define PACKAGE_STRING "Cuba 4.2"
+| #define PACKAGE_BUGREPORT "hahn@feynarts.de"
+| #define PACKAGE_URL ""
+| #define HAVE_LONG_DOUBLE_WIDER 1
+| #define HAVE_LONG_DOUBLE 1
+| /* end confdefs.h. */
+| #include <ac_nonexistent.h>
+configure:3720: result: gcc -E
+configure:3740: gcc -E conftest.c
+configure:3740: $? = 0
+configure:3754: gcc -E conftest.c
+conftest.c:11:28: fatal error: ac_nonexistent.h: No such file or directory
+ #include <ac_nonexistent.h>
+ ^
+compilation terminated.
+configure:3754: $? = 1
+configure: failed program was:
+| /* confdefs.h */
+| #define PACKAGE_NAME "Cuba"
+| #define PACKAGE_TARNAME "cuba"
+| #define PACKAGE_VERSION "4.2"
+| #define PACKAGE_STRING "Cuba 4.2"
+| #define PACKAGE_BUGREPORT "hahn@feynarts.de"
+| #define PACKAGE_URL ""
+| #define HAVE_LONG_DOUBLE_WIDER 1
+| #define HAVE_LONG_DOUBLE 1
+| /* end confdefs.h. */
+| #include <ac_nonexistent.h>
+configure:3783: checking for grep that handles long lines and -e
+configure:3841: result: /bin/grep
+configure:3846: checking for egrep
+configure:3908: result: /bin/grep -E
+configure:3913: checking for ANSI C header files
+configure:3933: gcc -c -O3 -fomit-frame-pointer -ffast-math -Wall conftest.c >&5
+configure:3933: $? = 0
+configure:4006: gcc -o conftest -O3 -fomit-frame-pointer -ffast-math -Wall conftest.c -lm >&5
+configure:4006: $? = 0
+configure:4006: ./conftest
+configure:4006: $? = 0
+configure:4017: result: yes
+configure:4030: checking for sys/types.h
+configure:4030: gcc -c -O3 -fomit-frame-pointer -ffast-math -Wall conftest.c >&5
+configure:4030: $? = 0
+configure:4030: result: yes
+configure:4030: checking for sys/stat.h
+configure:4030: gcc -c -O3 -fomit-frame-pointer -ffast-math -Wall conftest.c >&5
+configure:4030: $? = 0
+configure:4030: result: yes
+configure:4030: checking for stdlib.h
+configure:4030: gcc -c -O3 -fomit-frame-pointer -ffast-math -Wall conftest.c >&5
+configure:4030: $? = 0
+configure:4030: result: yes
+configure:4030: checking for string.h
+configure:4030: gcc -c -O3 -fomit-frame-pointer -ffast-math -Wall conftest.c >&5
+configure:4030: $? = 0
+configure:4030: result: yes
+configure:4030: checking for memory.h
+configure:4030: gcc -c -O3 -fomit-frame-pointer -ffast-math -Wall conftest.c >&5
+configure:4030: $? = 0
+configure:4030: result: yes
+configure:4030: checking for strings.h
+configure:4030: gcc -c -O3 -fomit-frame-pointer -ffast-math -Wall conftest.c >&5
+configure:4030: $? = 0
+configure:4030: result: yes
+configure:4030: checking for inttypes.h
+configure:4030: gcc -c -O3 -fomit-frame-pointer -ffast-math -Wall conftest.c >&5
+configure:4030: $? = 0
+configure:4030: result: yes
+configure:4030: checking for stdint.h
+configure:4030: gcc -c -O3 -fomit-frame-pointer -ffast-math -Wall conftest.c >&5
+configure:4030: $? = 0
+configure:4030: result: yes
+configure:4030: checking for unistd.h
+configure:4030: gcc -c -O3 -fomit-frame-pointer -ffast-math -Wall conftest.c >&5
+configure:4030: $? = 0
+configure:4030: result: yes
+configure:4042: checking for size_t
+configure:4042: gcc -c -O3 -fomit-frame-pointer -ffast-math -Wall conftest.c >&5
+configure:4042: $? = 0
+configure:4042: gcc -c -O3 -fomit-frame-pointer -ffast-math -Wall conftest.c >&5
+conftest.c: In function 'main':
+conftest.c:57:21: error: expected expression before ')' token
+ if (sizeof ((size_t)))
+ ^
+configure:4042: $? = 1
+configure: failed program was:
+| /* confdefs.h */
+| #define PACKAGE_NAME "Cuba"
+| #define PACKAGE_TARNAME "cuba"
+| #define PACKAGE_VERSION "4.2"
+| #define PACKAGE_STRING "Cuba 4.2"
+| #define PACKAGE_BUGREPORT "hahn@feynarts.de"
+| #define PACKAGE_URL ""
+| #define HAVE_LONG_DOUBLE_WIDER 1
+| #define HAVE_LONG_DOUBLE 1
+| #define STDC_HEADERS 1
+| #define HAVE_SYS_TYPES_H 1
+| #define HAVE_SYS_STAT_H 1
+| #define HAVE_STDLIB_H 1
+| #define HAVE_STRING_H 1
+| #define HAVE_MEMORY_H 1
+| #define HAVE_STRINGS_H 1
+| #define HAVE_INTTYPES_H 1
+| #define HAVE_STDINT_H 1
+| #define HAVE_UNISTD_H 1
+| /* end confdefs.h. */
+| #include <stdio.h>
+| #ifdef HAVE_SYS_TYPES_H
+| # include <sys/types.h>
+| #endif
+| #ifdef HAVE_SYS_STAT_H
+| # include <sys/stat.h>
+| #endif
+| #ifdef STDC_HEADERS
+| # include <stdlib.h>
+| # include <stddef.h>
+| #else
+| # ifdef HAVE_STDLIB_H
+| # include <stdlib.h>
+| # endif
+| #endif
+| #ifdef HAVE_STRING_H
+| # if !defined STDC_HEADERS && defined HAVE_MEMORY_H
+| # include <memory.h>
+| # endif
+| # include <string.h>
+| #endif
+| #ifdef HAVE_STRINGS_H
+| # include <strings.h>
+| #endif
+| #ifdef HAVE_INTTYPES_H
+| # include <inttypes.h>
+| #endif
+| #ifdef HAVE_STDINT_H
+| # include <stdint.h>
+| #endif
+| #ifdef HAVE_UNISTD_H
+| # include <unistd.h>
+| #endif
+| int
+| main ()
+| {
+| if (sizeof ((size_t)))
+| return 0;
+| ;
+| return 0;
+| }
+configure:4042: result: yes
+configure:4053: checking for ssize_t
+configure:4053: gcc -c -O3 -fomit-frame-pointer -ffast-math -Wall conftest.c >&5
+configure:4053: $? = 0
+configure:4053: gcc -c -O3 -fomit-frame-pointer -ffast-math -Wall conftest.c >&5
+conftest.c: In function 'main':
+conftest.c:57:22: error: expected expression before ')' token
+ if (sizeof ((ssize_t)))
+ ^
+configure:4053: $? = 1
+configure: failed program was:
+| /* confdefs.h */
+| #define PACKAGE_NAME "Cuba"
+| #define PACKAGE_TARNAME "cuba"
+| #define PACKAGE_VERSION "4.2"
+| #define PACKAGE_STRING "Cuba 4.2"
+| #define PACKAGE_BUGREPORT "hahn@feynarts.de"
+| #define PACKAGE_URL ""
+| #define HAVE_LONG_DOUBLE_WIDER 1
+| #define HAVE_LONG_DOUBLE 1
+| #define STDC_HEADERS 1
+| #define HAVE_SYS_TYPES_H 1
+| #define HAVE_SYS_STAT_H 1
+| #define HAVE_STDLIB_H 1
+| #define HAVE_STRING_H 1
+| #define HAVE_MEMORY_H 1
+| #define HAVE_STRINGS_H 1
+| #define HAVE_INTTYPES_H 1
+| #define HAVE_STDINT_H 1
+| #define HAVE_UNISTD_H 1
+| /* end confdefs.h. */
+| #include <stdio.h>
+| #ifdef HAVE_SYS_TYPES_H
+| # include <sys/types.h>
+| #endif
+| #ifdef HAVE_SYS_STAT_H
+| # include <sys/stat.h>
+| #endif
+| #ifdef STDC_HEADERS
+| # include <stdlib.h>
+| # include <stddef.h>
+| #else
+| # ifdef HAVE_STDLIB_H
+| # include <stdlib.h>
+| # endif
+| #endif
+| #ifdef HAVE_STRING_H
+| # if !defined STDC_HEADERS && defined HAVE_MEMORY_H
+| # include <memory.h>
+| # endif
+| # include <string.h>
+| #endif
+| #ifdef HAVE_STRINGS_H
+| # include <strings.h>
+| #endif
+| #ifdef HAVE_INTTYPES_H
+| # include <inttypes.h>
+| #endif
+| #ifdef HAVE_STDINT_H
+| # include <stdint.h>
+| #endif
+| #ifdef HAVE_UNISTD_H
+| # include <unistd.h>
+| #endif
+| int
+| main ()
+| {
+| if (sizeof ((ssize_t)))
+| return 0;
+| ;
+| return 0;
+| }
+configure:4053: result: yes
+configure:4064: checking for pid_t
+configure:4064: gcc -c -O3 -fomit-frame-pointer -ffast-math -Wall conftest.c >&5
+configure:4064: $? = 0
+configure:4064: gcc -c -O3 -fomit-frame-pointer -ffast-math -Wall conftest.c >&5
+conftest.c: In function 'main':
+conftest.c:57:20: error: expected expression before ')' token
+ if (sizeof ((pid_t)))
+ ^
+configure:4064: $? = 1
+configure: failed program was:
+| /* confdefs.h */
+| #define PACKAGE_NAME "Cuba"
+| #define PACKAGE_TARNAME "cuba"
+| #define PACKAGE_VERSION "4.2"
+| #define PACKAGE_STRING "Cuba 4.2"
+| #define PACKAGE_BUGREPORT "hahn@feynarts.de"
+| #define PACKAGE_URL ""
+| #define HAVE_LONG_DOUBLE_WIDER 1
+| #define HAVE_LONG_DOUBLE 1
+| #define STDC_HEADERS 1
+| #define HAVE_SYS_TYPES_H 1
+| #define HAVE_SYS_STAT_H 1
+| #define HAVE_STDLIB_H 1
+| #define HAVE_STRING_H 1
+| #define HAVE_MEMORY_H 1
+| #define HAVE_STRINGS_H 1
+| #define HAVE_INTTYPES_H 1
+| #define HAVE_STDINT_H 1
+| #define HAVE_UNISTD_H 1
+| /* end confdefs.h. */
+| #include <stdio.h>
+| #ifdef HAVE_SYS_TYPES_H
+| # include <sys/types.h>
+| #endif
+| #ifdef HAVE_SYS_STAT_H
+| # include <sys/stat.h>
+| #endif
+| #ifdef STDC_HEADERS
+| # include <stdlib.h>
+| # include <stddef.h>
+| #else
+| # ifdef HAVE_STDLIB_H
+| # include <stdlib.h>
+| # endif
+| #endif
+| #ifdef HAVE_STRING_H
+| # if !defined STDC_HEADERS && defined HAVE_MEMORY_H
+| # include <memory.h>
+| # endif
+| # include <string.h>
+| #endif
+| #ifdef HAVE_STRINGS_H
+| # include <strings.h>
+| #endif
+| #ifdef HAVE_INTTYPES_H
+| # include <inttypes.h>
+| #endif
+| #ifdef HAVE_STDINT_H
+| # include <stdint.h>
+| #endif
+| #ifdef HAVE_UNISTD_H
+| # include <unistd.h>
+| #endif
+| int
+| main ()
+| {
+| if (sizeof ((pid_t)))
+| return 0;
+| ;
+| return 0;
+| }
+configure:4064: result: yes
+configure:4078: checking for powl
+configure:4078: gcc -o conftest -O3 -fomit-frame-pointer -ffast-math -Wall conftest.c -lm >&5
+conftest.c:44:6: warning: conflicting types for built-in function 'powl' [enabled by default]
+ char powl ();
+ ^
+configure:4078: $? = 0
+configure:4078: result: yes
+configure:4089: checking for erf
+configure:4089: gcc -o conftest -O3 -fomit-frame-pointer -ffast-math -Wall conftest.c -lm >&5
+conftest.c:45:6: warning: conflicting types for built-in function 'erf' [enabled by default]
+ char erf ();
+ ^
+configure:4089: $? = 0
+configure:4089: result: yes
+configure:4100: checking vfork.h usability
+configure:4100: gcc -c -O3 -fomit-frame-pointer -ffast-math -Wall conftest.c >&5
+conftest.c:56:19: fatal error: vfork.h: No such file or directory
+ #include <vfork.h>
+ ^
+compilation terminated.
+configure:4100: $? = 1
+configure: failed program was:
+| /* confdefs.h */
+| #define PACKAGE_NAME "Cuba"
+| #define PACKAGE_TARNAME "cuba"
+| #define PACKAGE_VERSION "4.2"
+| #define PACKAGE_STRING "Cuba 4.2"
+| #define PACKAGE_BUGREPORT "hahn@feynarts.de"
+| #define PACKAGE_URL ""
+| #define HAVE_LONG_DOUBLE_WIDER 1
+| #define HAVE_LONG_DOUBLE 1
+| #define STDC_HEADERS 1
+| #define HAVE_SYS_TYPES_H 1
+| #define HAVE_SYS_STAT_H 1
+| #define HAVE_STDLIB_H 1
+| #define HAVE_STRING_H 1
+| #define HAVE_MEMORY_H 1
+| #define HAVE_STRINGS_H 1
+| #define HAVE_INTTYPES_H 1
+| #define HAVE_STDINT_H 1
+| #define HAVE_UNISTD_H 1
+| #define HAVE_POWL 1
+| #define HAVE_ERF 1
+| /* end confdefs.h. */
+| #include <stdio.h>
+| #ifdef HAVE_SYS_TYPES_H
+| # include <sys/types.h>
+| #endif
+| #ifdef HAVE_SYS_STAT_H
+| # include <sys/stat.h>
+| #endif
+| #ifdef STDC_HEADERS
+| # include <stdlib.h>
+| # include <stddef.h>
+| #else
+| # ifdef HAVE_STDLIB_H
+| # include <stdlib.h>
+| # endif
+| #endif
+| #ifdef HAVE_STRING_H
+| # if !defined STDC_HEADERS && defined HAVE_MEMORY_H
+| # include <memory.h>
+| # endif
+| # include <string.h>
+| #endif
+| #ifdef HAVE_STRINGS_H
+| # include <strings.h>
+| #endif
+| #ifdef HAVE_INTTYPES_H
+| # include <inttypes.h>
+| #endif
+| #ifdef HAVE_STDINT_H
+| # include <stdint.h>
+| #endif
+| #ifdef HAVE_UNISTD_H
+| # include <unistd.h>
+| #endif
+| #include <vfork.h>
+configure:4100: result: no
+configure:4100: checking vfork.h presence
+configure:4100: gcc -E conftest.c
+conftest.c:23:19: fatal error: vfork.h: No such file or directory
+ #include <vfork.h>
+ ^
+compilation terminated.
+configure:4100: $? = 1
+configure: failed program was:
+| /* confdefs.h */
+| #define PACKAGE_NAME "Cuba"
+| #define PACKAGE_TARNAME "cuba"
+| #define PACKAGE_VERSION "4.2"
+| #define PACKAGE_STRING "Cuba 4.2"
+| #define PACKAGE_BUGREPORT "hahn@feynarts.de"
+| #define PACKAGE_URL ""
+| #define HAVE_LONG_DOUBLE_WIDER 1
+| #define HAVE_LONG_DOUBLE 1
+| #define STDC_HEADERS 1
+| #define HAVE_SYS_TYPES_H 1
+| #define HAVE_SYS_STAT_H 1
+| #define HAVE_STDLIB_H 1
+| #define HAVE_STRING_H 1
+| #define HAVE_MEMORY_H 1
+| #define HAVE_STRINGS_H 1
+| #define HAVE_INTTYPES_H 1
+| #define HAVE_STDINT_H 1
+| #define HAVE_UNISTD_H 1
+| #define HAVE_POWL 1
+| #define HAVE_ERF 1
+| /* end confdefs.h. */
+| #include <vfork.h>
+configure:4100: result: no
+configure:4100: checking for vfork.h
+configure:4100: result: no
+configure:4113: checking for fork
+configure:4113: gcc -o conftest -O3 -fomit-frame-pointer -ffast-math -Wall conftest.c -lm >&5
+conftest.c:46:6: warning: conflicting types for built-in function 'fork' [enabled by default]
+ char fork ();
+ ^
+configure:4113: $? = 0
+configure:4113: result: yes
+configure:4113: checking for vfork
+configure:4113: gcc -o conftest -O3 -fomit-frame-pointer -ffast-math -Wall conftest.c -lm >&5
+configure:4113: $? = 0
+configure:4113: result: yes
+configure:4123: checking for working fork
+configure:4145: gcc -o conftest -O3 -fomit-frame-pointer -ffast-math -Wall conftest.c -lm >&5
+configure:4145: $? = 0
+configure:4145: ./conftest
+configure:4145: $? = 0
+configure:4155: result: yes
+configure:4176: checking for working vfork
+configure:4286: result: yes
+configure:4313: checking for working alloca.h
+configure:4330: gcc -o conftest -O3 -fomit-frame-pointer -ffast-math -Wall conftest.c -lm >&5
+configure:4330: $? = 0
+configure:4338: result: yes
+configure:4346: checking for alloca
+configure:4383: gcc -o conftest -O3 -fomit-frame-pointer -ffast-math -Wall conftest.c -lm >&5
+configure:4383: $? = 0
+configure:4391: result: yes
+configure:4503: checking build system type
+configure:4517: result: x86_64-unknown-linux-gnu
+configure:4537: checking host system type
+configure:4550: result: x86_64-unknown-linux-gnu
+configure:4577: checking for shmget
+configure:4577: gcc -o conftest -O3 -fomit-frame-pointer -ffast-math -Wall conftest.c -lm >&5
+configure:4577: $? = 0
+configure:4577: result: yes
+configure:4590: checking for getloadavg
+configure:4590: gcc -o conftest -O3 -fomit-frame-pointer -ffast-math -Wall conftest.c -lm >&5
+configure:4590: $? = 0
+configure:4590: result: yes
+configure:4639: checking for variable-size arrays
+configure:4645: gcc -c -O3 -fomit-frame-pointer -ffast-math -Wall conftest.c >&5
+configure:4645: $? = 0
+configure:4646: result: yes
+configure:4665: checking for MathLink
+configure:4699: result: no
+configure:4709: checking for qmake
+configure:4725: found /usr/bin/qmake
+configure:4736: result: qmake
+configure:4879: creating ./config.status
## ---------------------- ##
## Running config.status. ##
## ---------------------- ##
-This file was extended by Cuba config.status 2.1, which was
-generated by GNU Autoconf 2.61. Invocation command line was
+This file was extended by Cuba config.status 4.2, which was
+generated by GNU Autoconf 2.69. Invocation command line was
CONFIG_FILES =
CONFIG_HEADERS =
CONFIG_LINKS =
CONFIG_COMMANDS =
$ ./config.status
-on Tobias-Tolls-MacBook-Pro.local
+on tollto-XPS13-9333
-config.status:601: creating makefile
-config.status:601: creating config.h
-config.status:813: config.h is unchanged
+config.status:834: creating makefile
+config.status:834: creating config.h
+config.status:1009: config.h is unchanged
## ---------------- ##
## Cache variables. ##
## ---------------- ##
+ac_cv_build=x86_64-unknown-linux-gnu
ac_cv_c_compiler_gnu=yes
ac_cv_c_const=yes
ac_cv_c_inline=inline
ac_cv_c_long_double=yes
ac_cv_env_CC_set=
ac_cv_env_CC_value=
ac_cv_env_CFLAGS_set=
ac_cv_env_CFLAGS_value=
ac_cv_env_CPPFLAGS_set=
ac_cv_env_CPPFLAGS_value=
-ac_cv_env_F77_set=
-ac_cv_env_F77_value=
-ac_cv_env_FFLAGS_set=
-ac_cv_env_FFLAGS_value=
+ac_cv_env_CPP_set=
+ac_cv_env_CPP_value=
+ac_cv_env_FCFLAGS_set=
+ac_cv_env_FCFLAGS_value=
+ac_cv_env_FC_set=
+ac_cv_env_FC_value=
ac_cv_env_LDFLAGS_set=
ac_cv_env_LDFLAGS_value=
ac_cv_env_LIBS_set=
ac_cv_env_LIBS_value=
ac_cv_env_MCFLAGS_set=
ac_cv_env_MCFLAGS_value=
ac_cv_env_build_alias_set=
ac_cv_env_build_alias_value=
ac_cv_env_host_alias_set=
ac_cv_env_host_alias_value=
ac_cv_env_target_alias_set=
ac_cv_env_target_alias_value=
-ac_cv_f77_compiler_gnu=yes
+ac_cv_fc_compiler_gnu=yes
+ac_cv_func_alloca_works=yes
ac_cv_func_erf=yes
+ac_cv_func_fork=yes
+ac_cv_func_fork_works=yes
+ac_cv_func_getloadavg=yes
ac_cv_func_powl=yes
+ac_cv_func_shmget=yes
+ac_cv_func_vfork=yes
+ac_cv_func_vfork_works=yes
+ac_cv_header_inttypes_h=yes
+ac_cv_header_memory_h=yes
+ac_cv_header_stdc=yes
+ac_cv_header_stdint_h=yes
+ac_cv_header_stdlib_h=yes
+ac_cv_header_string_h=yes
+ac_cv_header_strings_h=yes
+ac_cv_header_sys_stat_h=yes
+ac_cv_header_sys_types_h=yes
+ac_cv_header_unistd_h=yes
+ac_cv_header_vfork_h=no
+ac_cv_host=x86_64-unknown-linux-gnu
ac_cv_objext=o
+ac_cv_path_EGREP='/bin/grep -E'
+ac_cv_path_GREP=/bin/grep
ac_cv_path_install='/usr/bin/install -c'
+ac_cv_prog_CPP='gcc -E'
+ac_cv_prog_HAVE_QMAKE=qmake
ac_cv_prog_ac_ct_CC=gcc
-ac_cv_prog_ac_ct_F77=gfortran
+ac_cv_prog_ac_ct_FC=gfortran
ac_cv_prog_ac_ct_RANLIB=ranlib
ac_cv_prog_cc_c89=
ac_cv_prog_cc_g=yes
-ac_cv_prog_f77_g=yes
+ac_cv_prog_fc_g=yes
ac_cv_type_long_double_wider=yes
+ac_cv_type_pid_t=yes
+ac_cv_type_size_t=yes
+ac_cv_type_ssize_t=yes
+ac_cv_working_alloca_h=yes
## ----------------- ##
## Output variables. ##
## ----------------- ##
+ALLOCA=''
CC='gcc'
-CFLAGS='-O0 -fomit-frame-pointer -ffast-math'
+CFLAGS='-O3 -fomit-frame-pointer -ffast-math -Wall'
+CPP='gcc -E'
CPPFLAGS=''
DEFS='-DHAVE_CONFIG_H'
DEMO_FORTRAN_DEFAULT='demo-fortran'
-ECHO_C='ECHO_N=''
+ECHO_C=''
+ECHO_N='-n'
ECHO_T=''
+EGREP='/bin/grep -E'
EXEEXT=''
-F77='gfortran'
-FFLAGS='-g -O2'
-HAVE_QMAKE=''
+FC='gfortran'
+FCFLAGS='-g -O2'
+GREP='/bin/grep'
+HAVE_QMAKE='qmake'
INSTALL_DATA='${INSTALL} -m 644'
INSTALL_PROGRAM='${INSTALL}'
INSTALL_SCRIPT='${INSTALL}'
LDFLAGS=''
LIBOBJS=''
LIBS='-lm'
LTLIBOBJS=''
MATH_DEFAULT=''
MCFLAGS=''
+MCSTDCPP='-stdlib=libstdc++'
OBJEXT='o'
PACKAGE_BUGREPORT='hahn@feynarts.de'
PACKAGE_NAME='Cuba'
-PACKAGE_STRING='Cuba 2.1'
+PACKAGE_STRING='Cuba 4.2'
PACKAGE_TARNAME='cuba'
-PACKAGE_VERSION='2.1'
+PACKAGE_URL=''
+PACKAGE_VERSION='4.2'
PATH_SEPARATOR=':'
RANLIB='ranlib'
-SHELL='/bin/sh'
+REALSIZE='8'
+SHELL='/bin/bash'
+SUFFIX=''
TOOLS_DEFAULT=''
ac_ct_CC='gcc'
-ac_ct_F77='gfortran'
+ac_ct_FC='gfortran'
bindir='${exec_prefix}/bin'
+build='x86_64-unknown-linux-gnu'
build_alias=''
+build_cpu='x86_64'
+build_os='linux-gnu'
+build_vendor='unknown'
datadir='${datarootdir}'
datarootdir='${prefix}/share'
docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
dvidir='${docdir}'
exec_prefix='${prefix}'
+host='x86_64-unknown-linux-gnu'
host_alias=''
+host_cpu='x86_64'
+host_os='linux-gnu'
+host_vendor='unknown'
htmldir='${docdir}'
includedir='${prefix}/include'
infodir='${datarootdir}/info'
libdir='${exec_prefix}/lib'
libexecdir='${exec_prefix}/libexec'
localedir='${datarootdir}/locale'
localstatedir='${prefix}/var'
mandir='${datarootdir}/man'
oldincludedir='/usr/include'
pdfdir='${docdir}'
prefix='/usr/local'
program_transform_name='s,x,x,'
psdir='${docdir}'
sbindir='${exec_prefix}/sbin'
sharedstatedir='${prefix}/com'
sysconfdir='${prefix}/etc'
target_alias=''
## ----------- ##
## confdefs.h. ##
## ----------- ##
+/* confdefs.h */
#define PACKAGE_NAME "Cuba"
#define PACKAGE_TARNAME "cuba"
-#define PACKAGE_VERSION "2.1"
-#define PACKAGE_STRING "Cuba 2.1"
+#define PACKAGE_VERSION "4.2"
+#define PACKAGE_STRING "Cuba 4.2"
#define PACKAGE_BUGREPORT "hahn@feynarts.de"
+#define PACKAGE_URL ""
#define HAVE_LONG_DOUBLE_WIDER 1
#define HAVE_LONG_DOUBLE 1
+#define STDC_HEADERS 1
+#define HAVE_SYS_TYPES_H 1
+#define HAVE_SYS_STAT_H 1
+#define HAVE_STDLIB_H 1
+#define HAVE_STRING_H 1
+#define HAVE_MEMORY_H 1
+#define HAVE_STRINGS_H 1
+#define HAVE_INTTYPES_H 1
+#define HAVE_STDINT_H 1
+#define HAVE_UNISTD_H 1
#define HAVE_POWL 1
#define HAVE_ERF 1
+#define HAVE_FORK 1
+#define HAVE_VFORK 1
+#define HAVE_WORKING_VFORK 1
+#define HAVE_WORKING_FORK 1
+#define HAVE_ALLOCA_H 1
+#define HAVE_ALLOCA 1
+#define HAVE_SHMGET 1
+#define HAVE_GETLOADAVG 1
configure: exit 0
Index: trunk/cuba/src/divonne/Split.c
===================================================================
--- trunk/cuba/src/divonne/Split.c (revision 158)
+++ trunk/cuba/src/divonne/Split.c (revision 159)
@@ -1,345 +1,312 @@
/*
Split.c
determine optimal cuts for splitting a region
this file is part of Divonne
- last modified 20 Jul 10 th
+ last modified 12 Mar 15 th
*/
#define BNDTOL .05
#define FRACT .5
-#define BIG 1e10
+#define SMALL 1e-10
#define SINGTOL 1e-4
#define LHSTOL .1
#define GAMMATOL .1
/* the next four macros must be in sync with the typedef of Bounds! */
#define Lower(d) (2*d)
#define Upper(d) (2*d + 1)
#define Dim(i) ((i) >> 1)
#define SignedDelta(i) (2*(i & 1) - 1)*delta[i]
typedef struct {
count i;
real save, delta;
real f, df, fold;
real lhs, row, sol;
} Cut;
-typedef struct {
- real diff, err, spread;
-} Errors;
-
-typedef const Errors cErrors;
-
/*********************************************************************/
static inline real Div(creal a, creal b)
{
- return (b != 0 && fabs(b) < BIG*fabs(a)) ? a/b : a;
+ return (b != 0 /*&& fabsx(a) > SMALL*fabsx(b)*/) ? a/b : a;
}
/*********************************************************************/
static void SomeCut(This *t, Cut *cut, Bounds *b)
{
+ Vector(real, xmid, NDIM);
+ real ymid, maxdev;
count dim, maxdim;
static count nextdim = 0;
- real xmid[NDIM], ymid, maxdev;
for( dim = 0; dim < t->ndim; ++dim )
xmid[dim] = .5*(b[dim].upper + b[dim].lower);
ymid = Sample(t, xmid);
maxdev = 0;
maxdim = 0;
for( dim = 0; dim < t->ndim; ++dim ) {
real ylower, yupper, dev;
creal x = xmid[dim];
xmid[dim] = b[dim].lower;
ylower = Sample(t, xmid);
xmid[dim] = b[dim].upper;
yupper = Sample(t, xmid);
xmid[dim] = x;
- dev = fabs(ymid - .5*(ylower + yupper));
+ dev = fabsx(ymid - .5*(ylower + yupper));
if( dev >= maxdev ) {
maxdev = dev;
maxdim = dim;
}
}
if( maxdev > 0 ) nextdim = 0;
else maxdim = nextdim++ % t->ndim;
cut->i = Upper(maxdim);
cut->save = b[maxdim].upper;
b[maxdim].upper = xmid[maxdim];
}
/*********************************************************************/
static inline real Volume(cThis *t, creal *delta)
{
real vol = 1;
count dim;
for( dim = 0; dim < t->ndim; ++dim )
vol *= delta[Lower(dim)] + delta[Upper(dim)];
return vol;
}
/*********************************************************************/
-static inline real SetupEqs(Cut *cut, ccount ncut, real f)
+static inline real SetupEqs(Cut *cut, ccount ncuts, real f)
{
real sqsum = 0;
- Cut *c = &cut[ncut];
+ Cut *c = &cut[ncuts];
while( --c >= cut ) {
sqsum += Sq(c->lhs = f - c->f);
f = c->f;
}
return sqsum;
}
/*********************************************************************/
-static inline void SolveEqs(Cut *cut, count ncut,
+static inline void SolveEqs(Cut *cut, count ncuts,
creal *delta, creal diff)
{
real last = 0;
real r = 1;
Cut *c;
for( c = cut; ; ++c ) {
ccount dim = Dim(c->i);
c->row = r -=
Div(diff, (delta[Lower(dim)] + delta[Upper(dim)])*c->df);
- if( --ncut == 0 ) break;
+ if( --ncuts == 0 ) break;
last += r*c->lhs;
}
last = Div(c->lhs - last, r);
for( ; c >= cut; last += (--c)->lhs ) {
creal delmin = -(c->delta = delta[c->i]);
creal delmax = FRACT*(delmin + c->save);
c->sol = Div(last, c->df);
if( c->sol > delmax ) c->sol = .75*delmax;
if( c->sol < delmin ) c->sol = .75*delmin;
}
}
/*********************************************************************/
static count FindCuts(This *t, Cut *cut, Bounds *bounds, creal vol,
real *xmajor, creal fmajor, creal fdiff)
{
cint sign = (fdiff < 0) ? -1 : 1;
- count ncut = 0, icut;
- real delta[2*NDIM];
+ count ncuts = 0, icut;
+ Vector(real, delta, 2*NDIM);
real gamma, fgamma, lhssq;
count dim, div;
for( dim = 0; dim < t->ndim; ++dim ) {
cBounds *b = &bounds[dim];
creal xsave = xmajor[dim];
real dist = b->upper - xsave;
if( dist >= BNDTOL*(b->upper - b->lower) ) {
- Cut *c = &cut[ncut++];
+ Cut *c = &cut[ncuts++];
c->i = Upper(dim);
c->save = dist;
xmajor[dim] += dist *= FRACT;
c->f = Sample(t, xmajor);
xmajor[dim] = xsave;
}
delta[Upper(dim)] = dist;
}
for( dim = 0; dim < t->ndim; ++dim ) {
cBounds *b = &bounds[dim];
creal xsave = xmajor[dim];
real dist = xsave - b->lower;
if( dist >= BNDTOL*(b->upper - b->lower) ) {
- Cut *c = &cut[ncut++];
+ Cut *c = &cut[ncuts++];
c->i = Lower(dim);
c->save = dist;
xmajor[dim] -= dist *= FRACT;
c->f = Sample(t, xmajor);
xmajor[dim] = xsave;
}
delta[Lower(dim)] = dist;
}
- if( ncut == 0 ) {
+ if( ncuts == 0 ) {
SomeCut(t, cut, bounds);
return 1;
}
for( ; ; ) {
real mindiff = INFTY;
Cut *mincut = cut;
- for( icut = 0; icut < ncut; ++icut ) {
+ for( icut = 0; icut < ncuts; ++icut ) {
Cut *c = &cut[icut];
- creal diff = fabs(fmajor - c->f);
+ creal diff = fabsx(fmajor - c->f);
if( diff <= mindiff ) {
mindiff = diff;
mincut = c;
}
}
gamma = Volume(t, delta)/vol;
fgamma = fmajor + (gamma - 1)*fdiff;
if( sign*(mincut->f - fgamma) < 0 ) break;
- if( --ncut == 0 ) {
+ if( --ncuts == 0 ) {
SomeCut(t, cut, bounds);
return 1;
}
delta[mincut->i] = mincut->save;
- memcpy(mincut, mincut + 1, (char *)&cut[ncut] - (char *)mincut);
+ memmove(mincut, mincut + 1, (char *)&cut[ncuts] - (char *)mincut);
}
- for( icut = 0; icut < ncut; ++icut ) {
+ for( icut = 0; icut < ncuts; ++icut ) {
Cut *c = &cut[icut];
c->fold = c->f;
c->df = (c->f - fmajor)/delta[c->i];
}
- lhssq = SetupEqs(cut, ncut, fgamma);
+ lhssq = SetupEqs(cut, ncuts, fgamma);
repeat:
- SolveEqs(cut, ncut, delta, gamma*fdiff);
+ SolveEqs(cut, ncuts, delta, gamma*fdiff);
for( div = 1; div <= 16; div *= 4 ) {
real gammanew, lhssqnew;
- for( icut = 0; icut < ncut; ++icut ) {
+ for( icut = 0; icut < ncuts; ++icut ) {
Cut *c = &cut[icut];
real *x = &xmajor[Dim(c->i)];
creal xsave = *x;
delta[c->i] = c->delta + c->sol/div;
*x += SignedDelta(c->i);
c->f = Sample(t, xmajor);
*x = xsave;
}
gammanew = Volume(t, delta)/vol;
fgamma = fmajor + (gammanew - 1)*fdiff;
- lhssqnew = SetupEqs(cut, ncut, fgamma);
+ lhssqnew = SetupEqs(cut, ncuts, fgamma);
if( lhssqnew <= lhssq ) {
real fmax;
- if( fabs(gammanew - gamma) < GAMMATOL*gamma ) break;
+ if( fabsx(gammanew - gamma) < GAMMATOL*gamma ) break;
gamma = gammanew;
- fmax = fabs(fgamma);
- for( icut = 0; icut < ncut; ++icut ) {
+ fmax = fabsx(fgamma);
+ for( icut = 0; icut < ncuts; ++icut ) {
Cut *c = &cut[icut];
creal dfmin = SINGTOL*c->df;
creal sol = c->sol/div;
real df = c->f - c->fold;
- df = (fabs(sol) < BIG*fabs(df)) ? df/sol : 1;
- c->df = (fabs(df) < fabs(dfmin)) ? dfmin : df;
- fmax = Max(fmax, fabs(c->f));
+ df = (fabsx(df) > SMALL*fabsx(sol)) ? df/sol : 1;
+ c->df = (fabsx(df) < fabsx(dfmin)) ? dfmin : df;
+ fmax = Max(fmax, fabsx(c->f));
c->fold = c->f;
}
if( lhssqnew < Sq((1 + fmax)*LHSTOL) ) break;
lhssq = lhssqnew;
goto repeat;
}
}
- for( icut = 0; icut < ncut; ++icut ) {
+ for( icut = 0; icut < ncuts; ++icut ) {
Cut *c = &cut[icut];
real *b = (real *)bounds + c->i;
c->save = *b;
*b = xmajor[Dim(c->i)] + SignedDelta(c->i);
}
- return ncut;
+ return ncuts;
}
/*********************************************************************/
-static void Split(This *t, count iregion, int depth)
+static void Split(This *t, ccount iregion)
{
- TYPEDEFREGION;
-
- Cut cut[2*NDIM];
- Errors errors[NCOMP];
- count comp, ncut, nsplit, xregion, ireg, xreg;
- real tmp;
+ csize_t regionsize = RegionSize;
+ Region *region = RegionPtr(iregion);
+ Vector(Cut, cut, 2*NDIM);
+ Cut *c;
+ count ncuts, succ;
+ int depth;
+ real *b;
-{
- Region *const region = RegionPtr(iregion);
t->selectedcomp = region->cutcomp;
t->neval_cut -= t->neval;
- ncut = FindCuts(t, cut, region->bounds, region->vol,
- (real *)region->result + region->xmajor, region->fmajor,
+ ncuts = FindCuts(t, cut, region->bounds, region->vol,
+ RegionMinMax(region) + region->xmajor, region->fmajor,
region->fmajor - region->fminor);
t->neval_cut += t->neval;
- for( comp = 0; comp < t->ncomp; ++comp ) {
- Errors *e = &errors[comp];
- e->diff = region->result[comp].avg;
- e->spread = e->err = 0;
- }
-}
-
- xregion = t->nregions;
+ depth = region->depth - ncuts;
- depth -= ncut;
- if( Explore(t, iregion, &t->samples[0], depth, 1) ) {
- Cut *c;
- for( c = cut; ncut--; ++c ) {
- real *b = (real *)RegionPtr(iregion)->bounds;
- ccount c0 = c->i, c1 = c0 ^ 1;
- creal tmp = b[c1];
- b[c1] = b[c0];
- b[c0] = c->save;
- if( !Explore(t, iregion, &t->samples[0], depth++, ncut != 0) ) break;
- if( ncut ) ((real *)RegionPtr(iregion)->bounds)[c1] = tmp;
- }
- }
-
- nsplit = t->nregions - xregion + 1;
-
- for( ireg = iregion, xreg = xregion; ireg < t->nregions; ireg = xreg++ ) {
- cResult *result = RegionPtr(ireg)->result;
- for( comp = 0; comp < t->ncomp; ++comp ) {
- cResult *r = &result[comp];
- Errors *e = &errors[comp];
- e->diff -= r->avg;
- e->err += r->err;
- e->spread += Sq(r->spread);
- }
- }
-
- tmp = 1./nsplit;
- for( comp = 0; comp < t->ncomp; ++comp ) {
- Errors *e = &errors[comp];
- e->diff = tmp*fabs(e->diff);
- e->err = (e->err == 0) ? 1 : 1 + e->diff/e->err;
- e->spread = (e->spread == 0) ? 1 : 1 + e->diff/sqrt(e->spread);
- }
-
- tmp = 1 - tmp;
- for( ireg = iregion, xreg = xregion; ireg < t->nregions; ireg = xreg++ ) {
- Result *result = RegionPtr(ireg)->result;
- for( comp = 0; comp < t->ncomp; ++comp ) {
- Result *r = &result[comp];
- cErrors *e = &errors[comp];
- creal c = tmp*e->diff;
- if( r->err > 0 ) r->err = r->err*e->err + c;
- r->spread = r->spread*e->spread + c*t->samples[0].neff;
- }
+ EnlargeRegions(t, ++ncuts);
+ region = RegionPtr(iregion);
+ region->depth = -ncuts;
+ succ = iregion + region->next;
+ region->next = t->nregions - iregion;
+ b = (real *)region->bounds;
+
+ region = RegionPtr(t->nregions);
+ XCopy(region->bounds, b);
+ region->depth = IDim(depth) + 1;
+ region->next = 1;
+ region->isamples = 0;
+ for( c = cut; --ncuts; ++c ) {
+ ccount ci = c->i;
+ creal tmp = b[ci ^ 1];
+ b[ci ^ 1] = b[ci];
+ b[ci] = c->save;
+ region = RegionPtr(++t->nregions);
+ XCopy(region->bounds, b);
+ region->depth = IDim(depth) + 1;
+ region->next = 1;
+ region->isamples = 0;
+ ++depth;
+ b[ci ^ 1] = tmp;
}
+ region->next = succ - t->nregions++;
}
Index: trunk/cuba/src/divonne/Iterate.c
===================================================================
--- trunk/cuba/src/divonne/Iterate.c (revision 158)
+++ trunk/cuba/src/divonne/Iterate.c (revision 159)
@@ -1,136 +1,132 @@
/*
Iterate.c
recursion over regions
this file is part of Divonne
- last modified 21 Dec 11 th
+ last modified 12 Mar 15 th
*/
static void Iterate(This *t, count iregion, cint depth, cint isamples,
Totals *totals)
{
- TYPEDEFREGION;
+ csize_t regionsize = RegionSize;
Region *parent, *region;
typedef struct {
real avg, err, spread, spreadsq;
} Corr;
- Corr corr[NCOMP];
+ Vector(Corr, corr, NCOMP);
+ Corr *c, *C = corr + t->ncomp;
+ Result *res;
count ireg, mreg = iregion;
count comp, maxsplit;
int last, idest, isrc;
region = RegionPtr(iregion);
region->depth = depth;
region->next = -iregion - 1;
if( isamples < 0 ) Split(t, iregion);
else {
region->isamples = isamples;
ExploreSerial(t, iregion);
}
ireg = iregion + RegionPtr(iregion)->next;
do {
region = RegionPtr(ireg);
if( region->depth > 0 ) {
--region->depth;
FORK_ONLY(more:)
ireg = Explore(t, ireg);
if( ireg == -1 ) return;
region = RegionPtr(ireg);
}
if( region->depth < 0 ) mreg = IMax(mreg, ireg);
ireg += region->next;
} while( ireg > 0 );
FORK_ONLY(if( t->running ) goto more;)
maxsplit = 1;
for( ireg = mreg; ireg >= iregion; --ireg ) {
parent = RegionPtr(ireg);
maxsplit -= NegQ(parent->depth);
if( parent->depth < 0 ) {
count xreg;
struct {
count from, to;
} todo[maxsplit], *tdmax = todo, *td;
count nsplit = 0;
real norm;
- memset(corr, 0, sizeof corr);
+ FClear(corr);
tdmax->from = ireg + parent->next;
tdmax->to = tdmax->from - parent->depth;
++tdmax;
for( td = todo; td < tdmax; ++td ) {
for( xreg = td->from; xreg < td->to; ++xreg ) {
Region *region = RegionPtr(xreg);
if( region->depth < 0 ) {
tdmax->from = xreg + region->next;
tdmax->to = tdmax->from - region->depth;
++tdmax;
}
else {
++nsplit;
- for( comp = 0; comp < t->ncomp; ++comp ) {
- cResult *r = &region->result[comp];
- Corr *c = &corr[comp];
- c->avg += r->avg;
- c->err += r->err;
- c->spread += Sq(r->spread);
+ for( res = RegionResult(region), c = corr; c < C; ++res, ++c ) {
+ c->avg += res->avg;
+ c->err += res->err;
+ c->spread += Sq(res->spread);
}
}
}
}
norm = 1./nsplit--;
- for( comp = 0; comp < t->ncomp; ++comp ) {
- Result *p = &parent->result[comp];
- Corr *c = &corr[comp];
- creal diff = fabs(p->avg - c->avg)*norm;
+ for( res = RegionResult(parent), c = corr; c < C; ++res, ++c ) {
+ creal diff = fabsx(res->avg - c->avg)*norm;
c->avg = diff*norm*nsplit;
c->err = (c->err == 0) ? 1 : 1 + diff/c->err;
- c->spread = (c->spread == 0) ? 1 : 1 + diff/sqrt(c->spread);
+ c->spread = (c->spread == 0) ? 1 : 1 + diff/sqrtx(c->spread);
}
for( td = todo; td < tdmax; ++td )
for( xreg = td->from; xreg < td->to; ++xreg ) {
Region *region = RegionPtr(xreg);
if( region->depth >= 0 ) {
cnumber neff = t->samples[region->isamples].neff;
- for( comp = 0; comp < t->ncomp; ++comp ) {
- Result *r = &region->result[comp];
- Corr *c = &corr[comp];
- if( r->err > 0 ) r->err = r->err*c->err + c->avg;
- r->spread = r->spread*c->spread + c->avg*neff;
- c->spreadsq += Sq(r->spread);
+ for( res = RegionResult(region), c = corr; c < C; ++res, ++c ) {
+ if( res->err > 0 ) res->err = res->err*c->err + c->avg;
+ res->spread = res->spread*c->spread + c->avg*neff;
+ c->spreadsq += Sq(res->spread);
}
}
}
}
}
if( totals )
for( comp = 0; comp < t->ncomp; ++comp )
totals[comp].spreadsq += corr[comp].spreadsq;
for( last = -1, idest = isrc = iregion; iregion <= mreg; ++iregion ) {
Region *region = RegionPtr(iregion);
cint cur = NegQ(region->depth);
switch( cur - last ) {
case -1:
memmove(RegionPtr(idest), RegionPtr(isrc),
- (iregion - isrc)*sizeof(Region));
+ (iregion - isrc)*regionsize);
idest += iregion - isrc;
break;
case 1:
isrc = iregion;
}
last = cur;
}
memmove(RegionPtr(idest), RegionPtr(iregion),
- (t->nregions - iregion)*sizeof(Region));
+ (t->nregions - iregion)*regionsize);
t->nregions += idest - iregion;
}
Index: trunk/cuba/src/divonne/KorobovCoeff.c-16033
===================================================================
--- trunk/cuba/src/divonne/KorobovCoeff.c-16033 (revision 0)
+++ trunk/cuba/src/divonne/KorobovCoeff.c-16033 (revision 159)
@@ -0,0 +1,1370 @@
+#define KOROBOV_MINDIM 2
+#define KOROBOV_MAXDIM 257
+#define MAXPRIME 16033
+
+#define Hash(x) ((32879 - x)*(-47 + x))/212544
+
+static int prime[] = {
+ FIRST,47,53,59,67,73,79,83,89,97,107,113,127,131,137,139,149,151,157,
+ 163,173,179,181,191,197,199,211,223,227,229,233,241,251,257,263,269,277,
+ 281,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,
+ 401,409,419,421,431,433,439,449,457,461,467,479,487,491,499,503,509,521,
+ 523,541,547,557,563,569,571,577,587,593,599,601,607,613,617,619,631,641,
+ 643,647,653,661,673,677,683,691,701,709,719,727,733,739,743,751,757,761,
+ 769,773,787,797,809,811,821,823,827,829,839,853,857,859,863,877,881,883,
+ 887,907,911,919,929,937,941,947,953,967,971,977,983,991,997,1009,1013,
+ 1019,1021,1031,1033,1039,1049,1051,1061,1063,1069,1087,1091,1093,1097,
+ 1103,1109,1117,1123,1129,1151,1153,1163,1171,1181,1187,1193,1201,1213,
+ 1217,1223,1229,1231,1237,1249,1259,1277,1279,1283,1289,1291,1297,1301,
+ 1303,1307,1319,1321,1327,1361,1367,1373,1381,1399,1409,1423,1427,1429,
+ 1433,1439,1447,1451,1453,1459,1471,1481,1483,1487,1489,1493,1499,1511,
+ 1523,1531,1543,1549,1553,1559,1567,1571,1579,1583,1597,1601,1607,1609,
+ 1613,1619,1621,1627,1637,1657,1663,1667,1669,1693,1697,1699,1709,1721,
+ 1723,1733,1741,1747,1753,1759,1777,1783,1787,1789,1801,1811,1823,1831,
+ 1847,1861,1867,1871,1873,1877,1879,1889,1901,1907,1913,1931,1933,1949,
+ 1951,1973,1979,1987,1993,1997,1999,2003,2011,2017,2027,2029,2039,2053,
+ 2063,2069,2081,2083,2087,2089,2099,2111,2113,2129,2131,2137,2141,2143,
+ 2153,2161,2179,2203,2207,2213,2221,2237,2239,2243,2251,2267,2269,2273,
+ 2281,2287,2293,2297,2309,2311,2333,2339,2341,2347,2351,2357,2371,2377,
+ 2381,2383,2389,2393,2399,2411,2417,2423,2437,2441,2447,2459,2467,2473,
+ 2477,2503,2521,2531,2539,2543,2549,2551,2557,2579,2591,2593,2609,2617,
+ 2621,2633,2647,2657,2659,2663,2671,2677,2683,2687,2689,2693,2699,2707,
+ 2711,2713,2719,2729,2731,2741,2749,2753,2767,2777,2789,2791,2797,2801,
+ 2803,2819,2833,2837,2843,2851,2857,2861,2879,2887,2897,2903,2909,2917,
+ 2927,2939,2953,2957,2963,2969,2971,2999,3001,3011,3019,3023,3037,3041,
+ 3049,3061,3067,3079,3083,3089,3109,3119,3121,3137,3163,3167,3169,3181,
+ 3187,3191,3203,3209,3217,3221,3229,3251,3253,3257,3259,3271,3299,3301,
+ 3307,3313,3319,3323,3329,3331,3343,3347,3359,3361,3371,3373,3389,3391,
+ 3407,3413,3433,3449,3457,3461,3463,3467,3469,3491,3499,3511,3517,3527,
+ 3529,3533,3539,3541,3547,3557,3559,3571,3581,3583,3593,3607,3613,3617,
+ 3623,3631,3637,3643,3659,3671,3673,3677,3691,3697,3701,3709,3719,3727,
+ 3733,3739,3761,3767,3769,3779,3793,3797,3803,3821,3823,3833,3847,3851,
+ 3853,3863,3877,3881,3889,3907,3911,3917,3919,3923,3929,3931,3943,3947,
+ 3967,3989,4001,4003,4007,4013,4019,4021,4027,4049,4051,4057,4073,4079,
+ 4091,4093,4099,4111,4127,4129,4133,4139,4153,4157,4159,4177,4201,4211,
+ 4217,4219,4229,4231,4241,4243,4253,4259,4261,4271,4273,4283,4289,4297,
+ 4327,4337,4339,4349,4357,4363,4373,4391,4397,4409,4421,4423,4441,4447,
+ 4451,4457,4463,4481,4483,4493,4507,4513,4517,4519,4523,4547,4549,4561,
+ 4567,4583,4591,4597,4603,4621,4637,4639,4643,4649,4651,4657,4663,4673,
+ 4679,4691,4703,4721,4723,4729,4733,4751,4759,4783,4787,4789,4793,4799,
+ 4801,4813,4817,4831,4861,4871,4877,4889,4903,4909,4919,4931,4933,4937,
+ 4943,4951,4957,4967,4969,4973,4987,4993,4999,5003,5009,5011,5021,5023,
+ 5039,5051,5059,5077,5081,5087,5099,5101,5107,5113,5119,5147,5153,5167,
+ 5171,5179,5189,5197,5209,5227,5231,5233,5237,5261,5273,5279,5281,5297,
+ 5303,5309,5323,5333,5347,5351,5381,5387,5393,5399,5407,5413,5417,5419,
+ 5431,5437,5441,5443,5449,5471,5477,5479,5483,5501,5503,5507,5519,5521,
+ 5527,5531,5557,5563,5569,5573,5581,5591,5623,5639,5641,5647,5651,5653,
+ 5657,5659,5669,5683,5689,5693,5701,5711,5717,5737,5741,5749,5779,5783,
+ 5791,5801,5807,5813,5821,5827,5839,5851,5861,5869,5881,5897,5903,5923,
+ 5927,5939,5953,5981,5987,6007,6011,6029,6037,6043,6047,6053,6067,6073,
+ 6079,6089,6091,6101,6113,6121,6131,6133,6143,6151,6163,6173,6197,6199,
+ 6203,6217,6229,6247,6257,6263,6269,6277,6287,6301,6311,6323,6329,6343,
+ 6353,6361,6373,6389,6397,6421,6427,6449,6451,6469,6473,6481,6491,6521,
+ 6529,6547,6551,6553,6563,6569,6571,6577,6581,6599,6607,6619,6637,6653,
+ 6659,6661,6673,6689,6691,6709,6719,6733,6737,6761,6763,6779,6781,6793,
+ 6803,6823,6827,6841,6857,6863,6871,6883,6899,6907,6917,6947,6949,6959,
+ 6961,6971,6983,6991,7001,7013,7027,7039,7043,7057,7069,7079,7103,7109,
+ 7121,7129,7151,7159,7177,7187,7193,7207,7211,7219,7229,7243,7253,7283,
+ 7297,7307,7309,7321,7331,7333,7349,7351,7369,7393,7411,7417,7433,7451,
+ 7457,7459,7477,7481,7489,7499,7517,7523,7537,7549,7561,7573,7583,7591,
+ 7607,7621,7639,7643,7649,7669,7681,7691,7703,7717,7727,7741,7753,7759,
+ 7789,7793,7817,7823,7829,7841,7853,7867,7877,7883,7901,7919,7927,7937,
+ 7951,7963,7993,8009,8011,8017,8039,8053,8059,8069,8081,8089,8101,8117,
+ 8123,8147,8161,8167,8179,8191,8209,8219,8231,8243,8263,8269,8287,8293,
+ 8311,8317,8329,8353,8363,8377,8387,8389,8419,8429,8443,8447,8467,8501,
+ 8513,8521,8527,8537,8543,8563,8573,8581,8599,8609,8627,8641,8647,8669,
+ 8681,8693,8707,8719,8737,8747,8761,8779,8783,8807,8819,8831,8849,8861,
+ 8867,8887,8893,8923,8933,8941,8963,8971,8999,9001,9013,9029,9043,9059,
+ 9067,9091,9103,9109,9133,9151,9161,9173,9187,9203,9221,9239,9241,9257,
+ 9277,9293,9311,9323,9337,9349,9371,9377,9397,9413,9431,9439,9461,9473,
+ 9491,9497,9521,9533,9551,9587,9601,9613,9619,9629,9643,9661,9677,9689,
+ 9697,9721,9739,9749,9767,9781,9803,9817,9833,9851,9859,9883,9901,9907,
+ 9929,9941,9967,9973,10007,10009,10037,10039,10061,10079,10093,10111,
+ 10133,10141,10159,10177,10193,10211,10223,10247,10259,10273,10301,10313,
+ 10331,10343,10369,10391,10399,10427,10433,10453,10477,10487,10501,10529,
+ 10531,10559,10589,10597,10613,10631,10651,10667,10687,10709,10723,10739,
+ 10771,10781,10799,10831,10837,10859,10883,10891,10909,10937,10949,10973,
+ 10993,11003,11027,11047,11069,11087,11113,11131,11149,11171,11197,11213,
+ 11239,11251,11273,11287,11311,11329,11353,11369,11393,11411,11437,11467,
+ 11483,11497,11519,11549,11551,11587,11617,11633,11657,11677,11699,11719,
+ 11743,11777,11789,11807,11831,11863,11887,11903,11923,11953,11971,11987,
+ 12011,12043,12071,12097,12119,12143,12163,12197,12211,12241,12263,12289,
+ 12323,12343,12373,12391,12421,12451,12473,12497,12527,12553,12583,12611,
+ 12637,12659,12689,12721,12743,12781,12809,12841,12853,12893,12923,12953,
+ 12983,13009,13049,13093,13109,13147,13171,13217,13241,13267,13309,13339,
+ 13367,13411,13441,13477,13513,13553,13591,13627,13669,13697,13729,13781,
+ 13829,13859,13901,13933,13997,14029,14071,14107,14159,14207,14251,14303,
+ 14347,14407,14461,14519,14563,14627,14683,14747,14813,14869,14939,15013,
+ 15091,15161,15259,15349,15443,15551,15679,15823,MarkLast(16033)
+};
+
+static short coeff[][256] = {
+ {13,11,10,3,9,2,2,2,2,9,2,2,7,2,2,2,2,2,2,6,2,2,2,13,11,10,3,9,2,2,2,2,9,2,2,7,2,2,2,2,2,2,6,2,2,2,13,11,10,3,9,2,2,2,2,9,2,2,7,2,2,2,2,2,2,6,2,2,2,13,11,10,3,9,2,2,2,2,9,2,2,7,2,2,2,2,2,2,6,2,2,2,13,11,10,3,9,2,2,2,2,9,2,2,7,2,2,2,2,2,2,6,2,2,2,13,11,10,3,9,2,2,2,2,9,2,2,7,2,2,2,2,2,2,6,2,2,2,13,11,10,3,9,2,2,2,2,9,2,2,7,2,2,2,2,2,2,6,2,2,2,13,11,10,3,9,2,2,2,2,9,2,2,7,2,2,2,2,2,2,6,2,2,2,13,11,10,3,9,2,2,2,2,9,2,2,7,2,2,2,2,2,2,6,2,2,2,13,11,10,3,9,2,2,2,2,9,2,2,7,2,2,2,2,2,2,6,2,2,2,13,11,10,3,9,2,2,2,2,9,2,2,7,2,2,2,2,2,2,6,2,2,2,13,11,10},
+ {23,17,12,11,14,14,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,12,12,12,14,14,14,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,12,12,12,14,14,14,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,12,12,12,14,14,14,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,12,12,12,14,14,14,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,12,12,12,14,14,14,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,12,12,12,14,14,14,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,12,12,12,14,14,14,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,12,12,12,14,14,14,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,12,12,12,14,14,14,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {18,14,5,14,2,2,19,19,25,25,18,18,18,2,2,2,2,2,2,2,2,2,2,2,25,6,2,2,2,18,14,5,14,2,2,19,19,25,25,18,18,18,2,2,2,2,2,2,2,2,2,2,2,25,6,2,2,2,18,14,5,14,2,2,19,19,25,25,18,18,18,2,2,2,2,2,2,2,2,2,2,2,25,6,2,2,2,18,14,5,14,2,2,19,19,25,25,18,18,18,2,2,2,2,2,2,2,2,2,2,2,25,6,2,2,2,18,14,5,14,2,2,19,19,25,25,18,18,18,2,2,2,2,2,2,2,2,2,2,2,25,6,2,2,2,18,14,5,14,2,2,19,19,25,25,18,18,18,2,2,2,2,2,2,2,2,2,2,2,25,6,2,2,2,18,14,5,14,2,2,19,19,25,25,18,18,18,2,2,2,2,2,2,2,2,2,2,2,25,6,2,2,2,18,14,5,14,2,2,19,19,25,25,18,18,18,2,2,2,2,2,2,2,2,2,2,2,25,6,2,2,2,18,14,5,14,2,2,19,19,25,25,18,18,18,2,2,2,2,2,2,2,2,2,2,2},
+ {18,13,23,5,2,12,6,12,12,12,10,10,16,2,16,16,2,2,2,2,2,2,2,10,2,2,2,2,10,2,2,2,2,18,13,23,23,2,12,6,12,12,12,10,10,16,2,16,16,2,2,2,2,2,2,2,10,2,2,2,2,10,2,2,2,2,18,13,23,23,2,12,6,12,12,12,10,10,16,2,16,16,2,2,2,2,2,2,2,10,2,2,2,2,10,2,2,2,2,18,13,23,23,2,12,6,12,12,12,10,10,16,2,16,16,2,2,2,2,2,2,2,10,2,2,2,2,10,2,2,2,2,18,13,23,23,2,12,6,12,12,12,10,10,16,2,16,16,2,2,2,2,2,2,2,10,2,2,2,2,10,2,2,2,2,18,13,23,23,2,12,6,12,12,12,10,10,16,2,16,16,2,2,2,2,2,2,2,10,2,2,2,2,10,2,2,2,2,18,13,23,23,2,12,6,12,12,12,10,10,16,2,16,16,2,2,2,2,2,2,2,10,2,2,2,2,10,2,2,2,2,18,13,23,23,2,12,6,12,12,12,10,10,16,2,16,16,2,2,2,2,2,2,2,10,2},
+ {27,14,10,14,2,4,13,2,2,16,4,4,4,6,6,6,6,6,6,25,25,31,31,15,31,2,2,31,15,14,14,6,31,5,5,5,31,14,11,14,13,5,13,13,13,13,5,5,5,6,6,6,6,6,6,25,15,31,31,15,31,31,31,31,15,14,14,15,31,5,5,5,31,14,11,14,13,5,13,13,13,13,5,5,5,5,5,11,6,6,31,15,15,31,31,15,31,31,31,31,15,14,14,15,31,5,5,5,31,14,11,14,13,5,13,13,13,13,5,5,5,5,5,11,6,31,31,15,15,31,31,15,31,31,31,31,15,14,14,15,31,5,5,5,31,14,11,14,13,5,13,13,13,13,5,5,5,5,5,11,31,31,31,15,15,31,31,15,31,31,31,31,15,14,14,15,31,5,5,5,31,14,11,14,13,5,13,13,13,13,5,5,5,5,5,11,31,31,31,15,15,31,31,15,31,31,31,31,15,14,14,15,31,5,5,5,31,14,11,14,13,5,13,13,13,13,5,5,5,5,5,11,31,31,31,15,15,31,31,15,31,31,31,31,15,14,14,15,31,5,5,5,31,14,11,14},
+ {29,19,27,32,6,8,2,2,2,2,2,8,8,2,2,2,2,9,9,9,9,2,2,2,2,2,2,2,9,9,2,2,2,2,2,4,2,2,2,29,19,28,32,6,6,2,2,2,2,2,2,2,2,2,2,2,9,9,9,9,2,2,2,2,2,2,2,9,9,2,2,2,2,2,4,2,2,2,29,19,28,32,6,6,2,2,2,2,2,2,2,2,2,2,2,9,9,9,9,2,2,2,2,2,2,2,9,9,2,2,2,2,2,4,2,2,2,29,19,28,32,6,6,2,2,2,2,2,2,2,2,2,2,2,9,9,9,9,2,2,2,2,2,2,2,9,9,2,2,2,2,2,4,2,2,2,29,19,28,32,6,6,2,2,2,2,2,2,2,2,2,2,2,9,9,9,9,2,2,2,2,2,2,2,9,9,2,2,2,2,2,4,2,2,2,29,19,28,32,6,6,2,2,2,2,2,2,2,2,2,2,2,9,9,9,9,2,2,2,2,2,2,2,9,9,2,2,2,2,2,4,2,2,2,29,19,28,32,6,6,2,2,2,2,2,2,2,2,2,2,2,9,9,9,9,2},
+ {30,19,24,16,22,8,2,2,22,5,9,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,17,2,2,2,6,2,2,2,30,19,24,16,22,8,2,2,22,5,9,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,17,2,2,2,6,2,2,2,30,19,24,16,22,8,2,2,22,5,9,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,17,2,2,2,6,2,2,2,30,19,24,16,22,8,2,2,22,5,9,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,17,2,2,2,6,2,2,2,30,19,24,16,22,8,2,2,22,5,9,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,17,2,2,2,6,2,2,2,30,19,24,16,22,8,2,2,22,5,9,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,17,2,2,2,6,2,2,2,30,19,24,16,22,8,2,2,22,5},
+ {34,28,13,28,27,27,2,4,2,2,2,16,16,4,20,20,36,20,36,5,5,5,36,36,5,5,5,7,5,7,7,2,2,25,16,6,20,20,36,29,24,3,3,3,27,28,13,28,27,27,27,27,27,2,2,27,27,13,20,20,13,20,36,13,5,5,36,7,7,7,7,7,7,7,7,7,7,7,6,6,24,28,28,29,24,3,3,3,27,28,13,28,27,27,27,27,27,13,7,27,27,13,24,13,13,13,13,13,5,5,7,7,7,7,7,7,7,7,7,7,7,7,6,6,24,28,28,29,24,3,3,3,27,28,13,28,27,27,27,27,27,13,7,27,27,13,24,13,13,13,13,13,13,13,7,7,7,7,7,7,7,7,7,7,7,7,6,6,24,28,28,29,24,3,3,3,27,28,13,28,27,27,27,27,27,13,7,27,27,13,24,13,13,13,13,13,13,13,7,7,7,7,7,7,7,7,7,7,7,7,6,6,24,28,28,29,24,3,3,3,27,28,13,28,27,27,27,27,27,13,7,27,27,13,24,13,13,13,13,13,13,13,7,7,7,7,7,7,7,7,7,7,7,7,6,6},
+ {35,19,33,8,21,30,8,2,4,2,4,4,2,2,2,2,2,2,2,2,2,17,2,2,11,25,11,17,17,17,17,17,17,17,17,17,7,7,7,7,17,2,2,17,26,5,5,5,26,23,21,23,21,21,17,17,17,17,17,17,21,21,17,7,7,2,17,17,17,17,2,2,17,17,17,17,17,17,17,17,17,17,17,17,7,7,7,7,17,17,17,17,26,5,5,5,26,23,21,23,21,21,17,17,17,17,17,17,21,21,17,7,7,7,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,7,7,7,7,17,17,17,17,26,5,5,5,26,23,21,23,21,21,17,17,17,17,17,17,21,21,17,7,7,7,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,7,7,7,7,17,17,17,17,26,5,5,5,26,23,21,23,21,21,17,17,17,17,17,17,21,21,17,7,7,7,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,7,7,7,7,17,17,17,17,26,5,5,5,26,23,21,23,21,21,17,17,17,17,17,17,21,21,17,7},
+ {41,22,15,7,26,29,29,2,2,2,2,2,2,41,41,2,2,2,31,31,2,31,31,2,31,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,6,2,2,2,41,22,15,7,26,29,29,2,2,2,2,2,2,41,41,2,2,2,31,31,2,31,31,2,31,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,6,2,2,2,41,22,15,7,26,29,29,2,2,2,2,2,2,41,41,2,2,2,31,31,2,31,31,2,31,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,6,2,2,2,41,22,15,7,26,29,29,2,2,2,2,2,2,41,41,2,2,2,31,31,2,31,31,2,31,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,6,2,2,2,41,22,15,7,26,29,29,2,2,2,2,2,2,41,41,2,2,2,31,31,2,31,31,2,31,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {35,22,37,9,35,12,35,8,2,2,50,50,2,2,32,32,32,31,13,8,8,8,2,22,50,9,9,9,22,22,22,10,10,10,10,10,22,22,50,10,2,2,12,12,12,12,12,17,23,17,6,6,12,3,3,3,24,23,37,24,5,12,12,6,27,10,27,27,27,27,27,27,27,27,27,27,27,12,12,12,12,12,9,9,22,22,22,10,10,10,10,10,10,10,10,10,10,10,12,12,12,12,12,17,23,17,6,6,12,3,3,3,24,23,37,24,5,12,12,6,27,10,27,27,27,27,27,27,27,27,27,27,27,12,12,12,12,12,9,9,12,12,27,10,10,10,10,10,10,10,10,10,10,10,12,12,12,12,12,17,23,17,6,6,12,3,3,3,24,23,37,24,5,12,12,6,27,10,27,27,27,27,27,27,27,27,27,27,27,12,12,12,12,12,12,12,12,12,27,10,10,10,10,10,10,10,10,10,10,10,12,12,12,12,12,17,23,17,6,6,12,3,3,3,24,23,37,24,5,12,12,6,27,10,27,27,27,27,27,27,27,27,27,27,27,12,12,12,12,12,12,12,12,12,27,10},
+ {29,24,43,36,49,2,2,8,4,25,49,25,2,2,8,10,10,10,5,5,5,40,10,33,40,40,2,27,10,25,25,25,25,25,25,10,10,49,10,5,5,5,40,10,33,40,40,45,6,45,45,25,25,25,25,6,6,6,43,34,3,3,3,29,26,43,36,49,11,11,46,46,46,49,49,49,49,29,49,49,6,6,5,5,40,6,6,6,6,31,29,9,9,9,9,9,9,9,49,49,49,49,49,5,5,49,49,49,45,45,45,6,45,45,45,45,36,36,6,6,6,43,34,3,3,3,29,26,43,36,49,11,11,46,46,46,49,49,49,49,29,49,49,6,6,6,6,6,6,6,6,6,31,29,9,9,9,9,9,9,9,49,49,49,49,49,49,49,49,49,49,45,45,45,6,45,45,45,45,36,36,6,6,6,43,34,3,3,3,29,26,43,36,49,11,11,46,46,46,49,49,49,49,29,49,49,6,6,6,6,6,6,6,6,6,31,29,9,9,9,9,9,9,9,49,49,49,49,49,49,49,49,49,49,45,45,45,6,45,45,45,45,36,36,6,6,6,43,34,3,3,3,29,26,43,36},
+ {50,18,32,39,21,2,2,2,4,4,36,36,14,14,14,14,2,2,2,17,17,17,16,16,2,14,14,14,14,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,14,6,2,2,2,50,17,43,6,21,2,2,2,4,4,36,36,14,14,14,14,2,2,2,17,17,17,16,16,2,14,14,14,14,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,14,6,2,2,2,50,17,43,6,21,2,2,2,4,4,36,36,14,14,14,14,2,2,2,17,17,17,16,16,2,14,14,14,14,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,14,6,2,2,2,50,17,43,6,21,2,2,2,4,4,36,36,14,14,14,14,2,2,2,17,17,17,16,16,2,14,14,14,14,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,14},
+ {31,28,45,20,18,43,43,13,28,2,2,2,31,31,31,31,31,2,2,2,43,43,2,2,2,2,2,2,2,2,30,2,2,2,28,7,9,9,31,31,31,31,31,2,31,43,43,43,43,43,43,43,43,31,43,31,31,43,43,31,43,43,43,45,24,3,3,3,31,27,45,20,45,43,43,13,13,26,26,31,31,31,31,31,31,31,9,31,43,43,31,31,31,43,2,43,31,43,43,31,2,2,28,31,31,43,31,31,31,31,31,31,31,43,43,43,43,43,43,43,43,31,43,31,31,43,43,31,43,43,43,45,24,3,3,3,31,27,45,20,45,43,43,13,13,26,26,31,31,31,31,31,31,31,31,31,43,43,31,31,31,43,43,43,31,43,43,31,2,43,31,31,31,43,31,31,31,31,31,31,31,43,43,43,43,43,43,43,43,31,43,31,31,43,43,31,43,43,43,45,24,3,3,3,31,27,45,20,45,43,43,13,13,26,26,31,31,31,31,31,31,31,31,31,43,43,31,31,31,43,43,43,31,43,43,31,43,43,31,31,31,43,31,31,31,31,31,31,31,43,43,43,43,43,43,43},
+ {39,15,41,7,24,2,2,30,40,2,2,25,25,25,25,2,2,2,2,2,2,6,6,2,25,2,5,2,2,25,2,2,25,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,2,2,2,2,41,15,41,7,24,2,2,30,40,2,2,25,25,25,25,2,2,2,2,2,2,2,2,2,25,2,5,2,2,25,2,2,25,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,2,2,2,2,41,15,41,7,24,2,2,30,40,2,2,25,25,25,25,2,2,2,2,2,2,2,2,2,25,2,5,2,2,25,2,2,25,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,2,2,2,2,41,15,41,7,24,2,2,30,40,2,2,25,25,25,25,2,2,2,2,2,2,2,2,2,25,2,5,2,2,25,2,2,25,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {44,20,29,39,7,21,21,21,2,2,45,2,2,2,49,49,49,49,49,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,66,66,66,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,55,55,10,13,60,21,21,21,2,2,2,2,2,2,2,13,13,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,66,66,66,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,55,55,10,13,60,21,21,21,2,2,2,2,2,2,2,13,13,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,66,66,66,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,55,55,10,13,60,21,21,21,2,2,2,2,2,2,2,13,13,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {56,20,22,13,18,35,35,6,2,4,2,4,2,2,2,23,16,16,4,23,2,34,52,2,34,2,4,2,2,2,23,16,16,4,23,23,6,23,37,4,2,4,10,2,2,23,16,52,52,52,52,52,22,10,10,10,10,10,2,2,10,10,10,52,10,10,37,51,51,51,51,18,5,5,5,56,22,22,13,18,35,35,6,10,7,34,7,14,13,7,51,7,7,7,34,34,34,52,34,34,34,34,34,34,10,22,22,6,22,22,22,6,35,37,37,37,37,10,10,10,52,52,52,52,52,52,52,22,10,10,10,10,10,10,10,10,10,10,52,10,10,37,51,51,51,51,18,5,5,5,56,22,22,13,18,35,35,6,10,7,34,7,14,13,7,51,7,7,7,34,34,34,52,34,34,34,34,34,34,10,22,22,6,22,22,22,6,35,37,37,37,37,10,10,10,52,52,52,52,52,52,52,22,10,10,10,10,10,10,10,10,10,10,52,10,10,37,51,51,51,51,18,5,5,5,56,22,22,13,18,35,35,6,10,7,34,7,14,13,7,51,7,7,7,34,34,34,52,34,34,34,34,34,34,10,22},
+ {46,32,17,18,29,27,31,31,31,2,2,4,15,2,2,2,2,2,2,2,2,2,2,2,2,2,23,32,32,32,15,15,15,15,2,2,2,2,2,2,2,2,2,2,15,15,2,2,15,2,2,2,23,23,32,23,23,2,2,2,2,2,2,2,2,2,2,2,6,6,6,66,6,6,6,5,5,5,66,20,53,18,18,6,6,15,70,70,15,15,15,15,38,43,43,43,38,38,38,38,2,2,2,2,23,38,15,15,15,15,15,15,15,15,2,38,38,38,43,2,2,15,15,15,15,15,15,15,2,2,23,23,38,38,38,38,38,38,20,6,6,6,18,18,38,38,6,6,6,66,6,6,6,5,5,5,66,20,53,18,18,6,6,15,70,70,15,15,15,15,38,43,43,43,38,38,38,38,38,43,15,15,38,38,15,15,15,15,15,15,15,15,15,38,38,38,43,43,43,15,15,15,15,15,15,15,15,15,20,15,38,38,38,38,38,38,20,6,6,6,18,18,38,38,6,6,6,66,6,6,6,5,5,5,66,20,53,18,18,6,6,15,70,70,15,15,15,15,38,43,43,43,38,38,38,38},
+ {62,42,43,17,23,13,13,2,2,13,2,2,2,2,2,2,2,10,2,2,2,2,9,10,2,2,2,19,9,9,9,9,2,2,2,2,2,2,9,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9,9,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,62,42,43,42,10,11,67,2,2,2,2,2,2,2,2,2,2,10,2,2,2,2,9,10,2,2,2,19,9,9,9,9,2,2,2,2,2,2,9,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9,9,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,62,42,43,42,10,11,67,2,2,2,2,2,2,2,2,2,2,10,2,2,2,2,9,10,2,2,2,19,9,9,9,9,2,2,2,2,2,2,9,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9,9,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,62,42,43,42,10,11,67,2,2,2,2,2,2},
+ {64,34,16,28,16,51,47,2,2,2,6,18,39,39,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,12,12,2,2,2,2,2,2,2,2,2,2,4,2,2,2,12,2,53,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,12,12,2,2,2,2,2,2,2,2,2,2,12,12,2,2,2,2,2,66,28,28,28,30,44,19,2,2,2,2,18,39,39,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,12,12,2,2,2,2,2,2,2,2,2,2,2,2,2,2,12,2,53,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,12,12,2,2,2,2,2,2,2,2,2,2,12,12,2,2,2,2,2,66,28,28,28,30,44,19,2,2,2,2,18,39,39,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,12,12,2,2,2,2,2,2,2,2,2,2,2,2,2,2,12,2,53,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,12,12,2,2,2,2,2,2,2,2,2,2,12,12,2,2,2},
+ {74,26,44,25,50,24,54,39,58,42,2,42,42,2,2,2,2,2,2,2,2,33,33,2,2,39,11,2,2,58,39,58,2,58,58,58,39,2,39,58,2,2,2,2,2,2,2,2,2,2,2,2,2,2,58,58,58,58,2,2,2,2,2,39,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,2,10,2,2,2,74,26,44,25,50,24,54,39,58,42,2,42,42,2,2,2,2,2,2,2,2,33,33,2,2,39,11,2,2,58,39,58,2,58,58,58,39,2,39,58,2,2,2,2,2,2,2,2,2,2,2,2,2,2,58,58,58,58,2,2,2,2,2,39,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,2,10,2,2,2,74,26,44,25,50,24,54,39,58,42,2,42,42,2,2,2,2,2,2,2,2,33,33,2,2,39,11,2,2,58,39,58,2,58,58,58,39,2,39,58,2,2,2,2,2,2,2,2,2,2,2,2,2,2,58,58,58,58,2,2,2,2,2,39,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {70,22,50,22,16,9,25,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,10,2,2,2,50,41,50,58,21,10,66,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,10,2,2,2,50,41,50,58,21,10,66,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {74,21,17,25,35,33,10,2,10,20,20,57,57,57,2,2,57,2,2,2,2,2,2,2,13,2,2,2,2,2,2,2,2,2,2,2,57,57,2,2,2,57,57,2,2,2,2,2,57,57,57,57,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,12,2,2,2,74,21,17,35,35,33,10,2,10,20,20,57,57,57,2,2,57,2,2,2,2,2,2,2,13,2,2,2,2,2,2,2,2,2,2,2,57,57,2,2,2,57,57,2,2,2,2,2,57,57,57,57,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,12,2,2,2,74,21,17,35,35,33,10,2,10,20,20,57,57,57,2,2,57,2,2,2,2,2,2,2,13,2,2,2,2,2,2,2,2,2,2,2,57,57,2,2,2,57,57,2,2,2,2,2,57,57,57,57,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {71,68,68,27,71,39,81,44,2,2,2,12,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,21,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,71,48,31,27,71,35,13,44,2,2,2,12,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,21,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,71,48,31,27,71,35,13,44,2,2,2,12,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,21,2,2,2,2,2,2,2,2},
+ {55,30,85,42,16,36,45,67,2,2,68,2,2,2,2,2,2,2,68,10,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,10,10,2,2,2,45,30,47,29,16,36,45,23,2,2,68,2,2,2,2,2,2,2,68,10,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,10,10,2,2,2,45,30,47,29,16,36,45,23,2,2,68,2,2,2,2,2,2,2,68,10,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {64,17,24,26,49,12,10,39,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,59,2,2,2,2,2,59,59,2,2,59,59,2,2,2,59,59,59,2,2,59,2,59,59,59,2,2,2,59,59,2,59,59,59,84,84,84,59,59,2,2,59,59,2,59,59,2,2,59,59,59,2,59,2,59,59,59,59,59,59,59,59,59,2,2,2,2,2,2,2,2,2,2,2,2,2,46,17,24,72,49,9,2,39,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,59,2,2,2,2,2,59,59,2,2,59,59,2,2,2,59,59,59,2,2,59,2,59,59,59,2,2,2,59,59,2,59,59,59,84,84,84,59,59,2,2,59,59,2,59,59,2,2,59,59,59,2,59,2,59,59,59,59,59,59,59,59,59,2,2,2,2,2,2,2,2,2,2,2,2,2,46,17,24,72,49,9,2,39,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,59,2,2,2,2,2,59,59,2,2,59,59,2,2,2,59,59},
+ {68,57,23,38,61,38,13,13,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2,68,15,2,44,44,44,2,2,2,4,4,2,2,2,41,64,49,49,8,7,30,24,24,24,24,45,24,2,2,2,24,2,25,44,25,25,25,25,25,25,24,24,24,24,2,24,24,24,24,2,2,41,64,49,43,43,24,24,24,43,43,44,44,44,44,24,44,44,44,44,24,44,24,24,24,24,24,24,24,24,24,22,22,22,18,3,3,3,80,57,23,38,61,38,38,18,75,24,19,19,24,22,44,44,44,24,24,24,35,31,31,31,31,44,44,44,44,44,44,44,24,24,44,44,24,24,44,44,24,53,53,24,24,24,24,24,45,24,24,24,24,24,25,25,44,25,25,25,25,25,25,24,24,24,24,44,24,24,24,24,24,24,24,24,43,43,43,24,24,24,43,43,44,44,44,44,24,44,44,44,44,24,44,24,24,24,24,24,24,24,24,24,22,22,22,18,3,3,3,80,57,23,38,61,38,38,18,75,24,19,19,24,22,44,44,44,24,24,24,35,31,31,31,31,44,44,44,44,44,44,44,24,24},
+ {94,28,58,29,13,5,15,8,66,2,2,2,39,39,15,66,2,2,6,6,2,2,66,66,66,66,2,2,2,2,2,66,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,66,66,2,66,15,15,15,2,2,15,15,2,2,15,15,2,66,15,15,15,15,15,15,15,2,2,2,2,2,2,2,15,15,15,15,15,15,2,2,2,2,15,15,15,15,15,15,2,2,2,2,2,66,2,2,2,2,2,2,2,2,6,2,2,2,94,28,58,29,13,5,15,8,66,2,2,2,39,39,15,66,2,2,6,6,2,2,66,66,66,66,2,2,2,2,2,66,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,66,66,2,66,15,15,15,2,2,15,15,2,2,15,15,2,66,15,15,15,15,15,15,15,2,2,2,2,2,2,2,15,15,15,15,15,15,2,2,2,2,15,15,15,15,15,15,2,2,2,2,2,66,2,2,2,2,2,2,2,2,6,2,2,2,94,28,58,29,13,5,15,8,66,2,2,2,39,39,15,66,2,2,6,6,2,2,66,66,66,66,2,2,2,2},
+ {94,85,9,41,41,37,29,29,17,2,2,2,7,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,8,8,8,8,8,2,2,2,34,8,34,8,8,22,7,7,7,2,13,13,29,29,29,29,2,2,2,2,2,2,2,2,102,102,102,13,2,2,8,8,8,8,30,2,2,2,34,8,34,34,8,22,22,29,29,2,31,29,29,7,29,7,7,29,29,7,29,29,35,35,35,35,35,29,41,29,29,41,102,6,6,6,6,6,50,29,65,41,41,102,29,29,29,102,102,40,7,7,29,39,29,39,39,24,39,28,35,29,29,29,29,29,29,29,29,29,29,29,29,29,2,29,29,35,77,77,29,29,7,7,7,7,7,7,29,29,29,29,29,29,29,92,29,7,7,102,102,102,102,102,102,102,31,31,29,29,31,31,31,31,31,31,31,31,29,29,29,29,29,29,31,29,29,7,29,7,7,29,29,7,29,29,35,35,35,35,35,29,41,29,29,41,102,6,6,6,6,6,50,29,65,41,41,102,29,29,29,102,102,40,7,7,29,39,29,39,39,24,39,28,35,29,29,29,29,29},
+ {89,32,75,77,77,13,2,30,30,2,2,2,2,2,2,2,2,2,2,67,67,2,2,2,2,2,2,2,2,8,19,32,23,23,98,2,98,8,2,25,2,2,2,2,2,2,2,62,2,55,25,2,2,2,14,2,7,7,60,33,33,33,33,13,62,95,60,2,95,5,5,95,95,95,2,2,2,95,95,95,95,95,2,2,2,2,2,8,8,32,23,23,67,2,67,95,95,95,67,67,67,67,67,67,67,6,6,67,24,24,24,24,40,3,3,3,84,57,75,77,77,45,73,17,45,95,95,95,95,21,95,95,2,2,95,67,67,67,67,67,67,95,2,2,2,8,8,32,23,23,95,2,95,27,27,95,95,95,95,95,95,95,2,52,2,2,25,2,2,62,14,67,7,7,60,33,33,33,67,95,95,95,95,95,95,5,5,95,95,95,95,95,95,95,95,95,95,95,95,67,67,2,2,67,67,67,67,67,67,67,67,95,95,95,67,67,67,67,67,67,67,6,6,67,24,24,24,24,40,3,3,3,84,57,75,77,77,45,73,17,45,95,95,95,95,21,95,95,45,95,95,67,67,67,67,67},
+ {101,33,76,13,45,63,2,2,6,19,2,2,32,32,32,32,32,65,2,63,63,11,11,11,19,19,19,19,9,63,63,63,63,19,2,29,29,29,19,45,45,45,45,45,45,45,11,11,19,19,50,72,72,72,72,18,12,3,3,3,18,18,12,12,45,72,72,72,45,55,11,11,50,50,50,50,46,46,46,46,71,14,14,14,14,39,39,39,39,39,39,51,51,51,11,29,71,71,71,45,45,45,71,71,71,71,46,46,46,46,42,14,42,74,74,42,42,7,7,7,55,34,34,13,13,71,14,14,13,13,13,13,34,34,34,13,13,13,45,45,45,45,46,46,46,46,46,46,46,14,74,14,14,14,14,29,14,45,45,45,45,45,45,45,45,45,45,12,12,46,50,72,72,71,71,71,12,71,3,3,18,18,12,12,45,72,55,55,55,55,55,55,55,55,51,51,46,46,46,46,71,14,14,14,14,39,39,39,39,39,39,51,51,51,51,51,71,71,71,71,71,71,71,71,71,71,46,46,46,46,42,14,42,74,74,42,42,7,7,7,55,34,34,13,13,71,14,14,13,13,13,13,34,34,34,13},
+ {70,89,44,37,19,45,2,2,2,8,10,8,54,54,80,80,80,80,80,2,116,2,116,2,2,80,40,51,100,100,8,2,2,2,8,10,8,116,61,80,80,80,61,61,2,40,8,53,2,2,80,40,51,116,116,116,2,61,116,116,116,116,116,116,80,80,80,53,53,61,53,35,35,2,2,80,35,35,35,35,35,35,35,35,61,61,61,71,53,53,53,53,53,30,46,61,46,46,46,46,46,53,53,53,53,53,53,53,53,53,53,55,55,62,53,61,61,62,62,117,117,14,3,3,3,70,89,44,37,19,45,22,74,74,54,54,44,54,54,54,44,83,83,44,44,116,116,116,116,116,116,116,116,116,35,35,116,116,116,35,61,116,116,61,53,53,53,61,61,35,53,35,53,53,61,61,61,61,116,116,116,61,61,116,116,116,116,116,116,116,53,53,53,53,61,53,35,35,46,46,35,35,35,35,35,35,35,35,35,61,61,61,71,53,53,53,53,53,30,46,61,46,46,46,46,46,53,53,53,53,53,53,53,53,53,53,55,55,62,53,61,61,62,62,117,117,14,3,3,3,70,89,44,37,19,45},
+ {71,54,83,51,42,98,2,2,8,8,14,30,93,22,15,15,30,30,30,44,44,44,2,2,22,22,22,117,44,11,11,11,81,81,81,81,81,81,73,73,73,73,22,22,22,22,15,15,44,44,42,44,42,42,42,98,42,42,114,114,42,9,9,9,42,13,13,13,13,13,9,9,21,21,21,21,36,36,36,36,36,44,26,26,26,26,20,21,20,42,21,71,21,71,11,11,81,81,81,69,63,63,63,28,28,28,28,28,28,41,83,33,41,38,38,38,41,41,38,38,63,38,6,12,66,3,3,3,71,54,83,51,63,85,93,93,93,93,14,93,93,93,85,85,14,14,93,93,14,65,69,69,65,65,65,65,65,65,65,65,65,65,65,65,65,28,28,28,28,28,19,19,28,19,19,19,19,19,19,19,19,19,19,19,19,42,39,39,36,9,9,9,42,13,13,13,13,13,9,13,80,13,21,80,80,80,80,80,93,93,93,42,20,20,20,20,20,20,20,71,71,71,71,69,69,69,69,69,63,63,63,28,28,28,28,28,28,41,83,33,41,38,38,38,41,41,38,38,63,38,6,12,66,3,3,3},
+ {109,37,51,113,17,10,2,2,17,17,55,2,55,55,55,55,55,55,2,2,2,57,48,48,55,55,2,2,55,2,2,55,55,55,55,55,55,55,55,55,55,55,55,2,2,48,72,48,48,55,55,55,2,2,2,2,2,2,2,2,2,55,55,2,2,2,2,55,58,58,58,58,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,55,2,2,2,2,2,2,2,2,2,2,2,48,2,2,48,48,2,2,48,2,55,2,2,2,2,2,2,48,48,48,2,55,55,2,2,2,2,2,12,2,2,2,109,37,51,113,17,10,2,2,17,17,55,2,55,55,55,55,55,55,2,2,2,57,48,48,55,55,2,2,55,2,2,55,55,55,55,55,55,55,55,55,55,55,55,2,2,48,72,48,48,55,55,55,2,2,2,2,2,2,2,2,2,55,55,2,2,2,2,55,58,58,58,58,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,55,2,2,2,2,2,2,2,2,2,2,2,48,2,2,48,48,2,2,48,2,55,2,2,2,2,2,2,48,48,48,2,55,55,2,2,2},
+ {75,38,68,89,11,52,2,2,81,39,2,38,2,2,2,2,2,2,2,2,2,2,2,19,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,19,19,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,19,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,19,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,75,35,68,33,60,10,2,2,2,39,2,39,2,2,2,2,2,2,2,2,2,2,2,19,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,19,19,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,19,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,19,2,2,2,2,2},
+ {81,84,35,34,20,93,2,12,12,12,2,96,2,96,96,2,96,2,2,2,2,2,2,2,2,2,2,2,2,56,56,56,56,2,2,2,2,2,2,2,2,2,8,2,2,2,82,82,8,61,38,96,2,96,96,96,2,82,2,2,82,2,56,56,2,2,2,2,2,2,2,2,2,2,96,96,96,96,96,96,2,2,2,56,2,2,2,96,96,96,2,2,82,82,61,96,96,96,56,96,56,56,56,56,14,56,96,96,96,56,56,2,56,56,56,56,56,96,96,96,96,96,96,96,96,96,96,96,96,56,2,96,14,6,6,5,5,5,105,68,53,14,20,93,93,93,93,93,17,96,96,96,96,96,96,96,96,96,24,96,96,24,24,24,24,96,96,56,56,56,56,56,56,56,56,56,2,2,56,56,56,96,2,2,82,61,61,96,96,96,96,96,96,96,96,96,56,56,56,56,56,56,56,56,56,56,56,56,96,56,56,56,96,96,96,96,96,96,96,56,56,56,56,56,56,96,96,96,96,96,96,96,56,96,96,96,56,96,56,56,56,56,14,56,96,96,96,56,56,56,56,56,56,56,56,96},
+ {109,72,60,96,67,32,85,84,27,91,91,2,10,29,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,25,25,25,25,25,25,66,66,66,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,106,106,2,106,66,14,2,5,5,106,72,72,18,72,18,106,106,2,46,46,46,46,46,91,46,91,91,91,2,2,2,2,2,2,2,2,2,2,2,2,2,21,2,2,25,25,25,2,2,91,66,2,91,91,91,91,91,2,2,106,91,2,2,46,46,46,91,91,91,91,91,91,12,12,12,131,3,3,3,76,96,91,96,21,26,27,84,27,91,91,91,71,21,21,46,106,106,106,106,46,46,106,106,106,46,46,46,46,91,91,57,57,2,46,46,57,104,91,91,91,46,46,46,46,46,46,106,106,106,106,46,46,46,46,11,11,11,11,11,11,106,106,106,106,106,14,11,5,5,106,72,46,46,46,91,91,91,91,46,46,46,46,46,91,46,91,91,91,91,91,91,106,106,46,46,46,91,21,21,21,21,21,21,21,21,21,21,46,91,91,91,91,91,91,91},
+ {81,103,25,35,28,15,20,20,20,2,2,2,2,20,20,20,107,107,2,2,2,2,2,2,2,2,2,2,2,2,13,13,13,13,13,13,2,13,13,13,13,13,2,2,2,2,2,2,2,2,20,20,13,13,13,13,13,2,2,2,2,20,20,2,2,2,2,2,2,2,2,4,2,2,2,130,2,130,130,13,13,2,2,2,2,13,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,20,2,2,2,2,2,2,2,2,20,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,79,103,72,75,28,105,20,20,20,2,2,2,2,20,20,20,20,2,2,2,2,2,2,2,2,2,2,2,2,2,13,13,13,13,13,13,2,13,13,13,13,13,2,2,2,2,2,2,2,2,20,20,13,13,13,13,13,2,2,2,2,20,20,2,2,2,2,2,2,2,2,2,2,2,2,130,2,130,130,13,13,2,2,2,2,13,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,20,2},
+ {119,75,42,29,74,23,54,36,39,2,2,4,4,19,19,2,2,2,2,2,2,2,2,54,2,2,2,2,2,2,2,54,2,2,2,2,2,2,2,2,2,2,2,2,4,4,32,2,45,2,2,125,125,125,68,37,37,37,37,37,37,37,37,37,37,37,37,37,37,16,16,52,52,52,52,52,37,37,37,37,52,52,52,52,52,52,37,37,37,37,37,2,52,52,52,37,37,37,37,37,2,2,37,37,37,37,52,52,37,37,37,15,37,37,37,37,37,37,37,52,52,52,37,37,15,15,15,52,52,37,37,37,37,37,37,52,37,37,37,37,37,37,37,100,82,88,52,52,14,14,5,5,5,119,75,42,29,74,23,56,69,39,109,109,109,109,109,52,52,52,52,45,71,52,37,52,52,52,52,15,15,52,52,52,52,15,15,52,52,52,37,37,37,37,37,37,37,37,37,45,45,45,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,52,52,52,52,52,52,37,37,37,37,52,52,52,52,52,52,37,37,37,37,37,37,52,52,52,37,37,37,37,37,37,37,37},
+ {115,73,22,102,75,138,16,73,50,16,2,50,2,2,2,133,2,2,2,2,2,2,2,2,2,2,2,2,2,33,33,33,2,2,33,33,2,2,2,2,2,2,2,2,2,33,33,2,2,2,2,2,2,33,33,33,30,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,45,45,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,45,2,2,2,33,45,45,2,2,33,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,2,12,2,2,2,115,73,22,102,75,138,16,73,50,16,2,50,2,2,2,133,2,2,2,2,2,2,2,2,2,2,2,2,2,33,33,33,2,2,33,33,2,2,2,2,2,2,2,2,2,33,33,2,2,2,2,2,2,33,33,33,30,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,45,45,2,2},
+ {119,48,66,51,14,22,20,20,2,2,2,2,2,60,2,2,2,2,2,2,2,2,60,2,2,2,2,2,2,60,2,65,2,2,2,2,60,60,60,60,60,65,65,65,65,65,2,2,2,60,60,2,2,2,2,2,2,2,60,60,2,2,65,2,2,2,60,60,2,2,2,65,65,2,2,65,2,2,22,66,66,66,65,65,65,65,65,65,65,65,65,65,65,65,60,60,65,65,65,65,65,65,60,60,65,65,60,60,65,60,60,60,60,60,60,65,65,65,65,60,60,60,65,65,65,65,65,65,65,65,65,65,2,65,65,65,65,65,65,65,60,65,65,65,65,65,65,65,65,65,60,60,80,10,10,10,86,34,77,77,14,15,20,20,20,20,65,65,65,60,60,60,60,65,65,60,65,65,60,65,65,65,65,60,60,60,60,65,60,60,60,60,60,60,60,60,60,65,65,65,65,65,65,65,65,60,60,60,60,60,60,60,60,60,60,60,60,65,65,65,60,60,60,60,60,60,60,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,60,60,65,65,65,65},
+ {121,94,80,29,51,69,42,36,14,14,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,17,2,2,2,2,2,46,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,17,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,17,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,130,120,80,29,80,69,35,33,14,14,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,17,2,2,2,2,2,46,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,17,2,2},
+ {129,123,41,79,43,34,24,11,2,2,4,2,2,2,2,75,16,16,16,75,75,75,16,16,16,25,2,99,2,2,75,16,16,16,75,99,99,99,99,99,99,99,99,2,2,75,16,16,99,99,99,99,99,7,7,99,99,99,2,2,75,16,16,41,41,41,26,44,44,36,36,36,35,2,2,75,44,44,82,44,44,44,20,20,5,5,5,5,5,5,93,93,44,93,93,44,44,44,44,44,44,44,44,93,93,24,24,24,24,24,24,35,35,35,35,35,35,35,35,35,26,35,35,129,129,129,129,129,129,129,129,129,35,129,129,129,129,129,129,17,17,17,129,24,86,35,35,35,35,6,6,6,42,42,42,42,6,60,26,6,6,42,3,3,3,129,123,41,42,43,25,24,11,11,87,87,87,87,93,25,25,25,99,99,25,25,25,25,25,25,25,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,41,41,41,26,44,44,36,36,36,35,35,35,44,44,44,82,44,44,44,20,20,5,5,5,5,5,5,93},
+ {128,33,35,68,22,8,62,94,2,2,2,62,62,2,98,2,2,4,98,2,2,32,81,32,32,32,98,98,98,98,98,98,98,98,98,98,41,98,98,9,9,9,98,98,98,98,98,98,41,41,41,41,41,115,41,113,50,98,98,98,98,2,98,98,113,113,113,113,98,98,14,14,14,98,98,98,98,86,86,14,12,3,3,3,91,86,86,86,91,91,91,91,91,91,91,91,70,94,94,94,94,94,98,94,94,94,94,94,94,94,50,50,50,98,98,98,98,19,19,19,19,19,19,19,9,9,98,98,98,98,98,19,19,19,115,115,115,115,113,115,19,19,19,70,70,70,70,113,70,94,70,94,94,14,14,14,67,151,151,151,22,22,22,90,90,10,10,10,80,33,99,68,22,68,68,106,106,90,106,34,34,34,106,34,29,29,29,29,29,29,29,106,61,61,106,61,61,115,61,61,61,61,61,61,61,61,61,61,61,61,61,61,70,70,61,70,51,70,70,51,51,51,51,70,31,31,31,31,31,31,31,31,31,31,31,31,31,14,31,14,23,94,31,31,31,31,61,14,31,70,3,3,91,86,70,70},
+ {101,109,154,15,57,6,27,36,2,2,37,37,2,2,2,2,2,2,2,107,2,2,2,107,107,2,2,2,2,2,2,2,2,107,107,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,107,2,2,2,2,2,107,2,2,2,6,2,2,2,101,109,154,15,57,6,27,36,2,2,37,37,2,2,2,2,2,2,2,107,2,2,2,107,107,2,2,2,2,2,2,2,2,107,107,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {106,40,24,38,61,118,106,106,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,132,40,40,54,46,114,114,112,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {149,111,58,79,127,13,41,33,27,16,30,2,61,2,72,2,2,2,2,2,2,2,2,2,2,2,2,75,75,2,2,2,2,2,2,2,2,2,2,2,8,93,2,2,29,29,8,8,23,17,17,17,2,48,48,48,48,2,48,48,23,48,48,2,2,93,48,2,2,93,93,45,93,93,93,93,23,23,93,23,23,2,2,92,78,9,9,9,76,76,25,25,25,39,39,39,39,27,75,75,75,72,72,72,72,72,93,2,2,27,2,2,2,93,27,27,27,27,27,27,27,48,27,48,27,2,2,27,93,27,2,2,29,29,45,45,45,45,45,45,45,27,27,27,27,45,45,45,45,27,27,48,48,45,75,27,75,75,48,48,75,48,48,48,48,45,151,151,151,54,115,117,151,3,3,3,149,48,69,79,117,13,79,33,27,27,27,26,37,37,48,56,56,48,75,75,48,45,45,48,48,37,37,75,75,75,75,75,75,75,75,75,75,48,48,48,93,75,2,2,75,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,45,48,45,45,45,48,48,48,48},
+ {105,92,43,156,25,53,57,115,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,19,2,2,2,2,2,2,2,2,19,19,19,19,19,2,2,2,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,2,19,19,19,19,19,19,23,19,19,19,19,19,19,2,2,2,2,2,2,51,19,19,19,51,51,51,2,2,2,2,19,2,19,19,2,2,2,19,19,2,2,2,2,2,2,2,19,2,2,19,19,19,2,19,2,51,2,2,2,2,2,23,23,2,2,2,2,2,2,2,2,2,2,2,2,71,71,2,2,2,2,2,2,2,2,6,18,2,2,2,105,92,43,156,25,53,57,115,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,19,2,2,2,2,2,2,2,2,19,19,19,19,19,2,2,2,19,19,19,19,19,19,19},
+ {99,40,62,67,66,29,99,99,99,78,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,79,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,79,2,2,2,2,2,2,2,2,2,2,79,2,2,2,2,79,2,2,79,79,79,2,79,2,79,79,79,79,79,2,79,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,79,79,79,2,79,2,2,2,2,2,2,79,2,2,79,2,2,79,79,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,12,2,2,2,2,2,2,4,2,2,2,99,112,62,67,66,77,99,99,99,78,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,79,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,79,2,2,2,2,2,2,2,2,2,2,79,2,2},
+ {109,42,96,95,66,41,103,84,13,103,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,60,60,60,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,60,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,6,2,2,2,99,42,166,78,78,166,82,77,26,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {111,72,16,89,25,86,117,29,14,14,2,2,2,2,2,60,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,60,60,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,60,60,60,60,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,75,2,75,2,2,2,2,2,2,60,60,60,60,60,60,60,2,2,60,2,60,75,75,60,60,75,2,2,2,2,2,2,2,2,2,60,2,2,10,2,2,2,105,72,16,89,50,72,117,117,28,2,2,2,2,2,2,60,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,60,60,2,2,2,2,2,2,2,2,2},
+ {106,72,49,94,140,44,97,157,75,2,2,4,123,123,2,2,123,123,123,123,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,123,2,2,2,2,75,75,2,2,2,123,2,2,2,2,2,2,2,2,123,123,2,2,2,123,123,123,123,123,123,75,75,75,123,123,123,123,123,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,123,123,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,8,16,2,2,2,106,72,49,94,140,44,97,157,75,2,2,4,123,123,2,2,123,123,123,123,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,123},
+ {115,67,74,32,43,50,21,36,135,36,85,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,51,51,51,51,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,105,60,135,32,43,50,21,31,135,2,92,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,51,51,51,51,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {151,71,157,42,41,37,80,27,18,2,2,2,2,2,2,2,2,2,2,2,2,2,115,128,128,128,128,128,32,2,128,80,2,113,2,113,2,2,2,2,15,15,2,2,8,128,15,15,15,113,113,113,113,113,2,15,15,15,68,68,60,103,68,15,15,15,103,95,95,95,95,55,15,15,17,17,17,15,17,17,17,17,17,17,113,113,2,2,51,113,15,113,113,113,60,113,21,21,21,21,21,21,15,59,59,59,15,15,15,15,15,15,15,15,15,15,15,113,113,15,15,15,60,68,68,68,60,103,68,15,15,15,103,95,95,95,95,55,15,51,146,146,146,146,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,45,45,45,45,45,45,45,45,45,143,143,143,45,15,133,45,45,45,45,45,138,138,138,45,45,45,45,45,45,28,6,138,46,24,38,18,5,5,5,146,50,46,50,21,138,80,18,18,18,18,18,18,138,18,18,18,18,18,18,18,146,146,146,59,59,59,59,21,21,59,80,80,80,80,80,80,80,80,6,38,38,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80},
+ {119,91,38,30,92,44,32,76,22,2,34,2,2,2,2,2,2,2,2,2,2,2,2,2,2,129,2,2,129,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,53,53,2,2,53,53,53,53,53,2,2,140,138,11,11,160,53,53,53,129,53,53,53,129,129,53,53,53,53,53,53,53,53,129,129,53,53,53,53,129,129,129,53,53,53,53,53,129,129,53,53,53,129,129,129,53,53,53,53,53,129,129,53,129,129,129,129,53,53,53,129,129,129,129,129,53,53,53,53,53,129,53,53,53,53,53,129,129,129,129,129,129,129,129,53,53,2,53,53,53,53,53,53,53,53,53,129,187,3,3,3,124,91,38,132,92,187,21,120,34,34,34,34,129,129,129,129,129,129,66,53,53,129,129,129,129,129,129,129,129,53,53,53,53,53,53,53,53,53,53,53,53,53,53,129,53,53,53,53,53,53,53,53,53,53,53,53},
+ {121,126,31,52,120,37,57,10,171,2,2,2,2,35,35,35,2,2,97,97,97,97,97,97,97,35,35,35,97,97,97,2,2,97,97,2,2,97,97,2,2,35,35,97,97,97,2,97,2,2,2,2,2,10,2,2,2,2,2,2,2,2,166,97,97,97,2,97,2,2,2,97,35,35,35,97,97,97,2,2,2,2,35,35,2,97,2,2,2,97,97,97,97,97,97,12,2,2,12,97,2,2,60,32,32,32,128,97,97,97,97,2,2,97,97,97,97,35,35,97,35,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,35,97,35,35,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,35,35,97,35,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,42,21,21,21,171,126,76,52,26,37,57,171,171,171,171,124,35,35,35,35,97,97,97,97,97,97,97,97,97,35,35,35,97,97,97,97,97,97,97,97,97,97,97,97,97,35,35,97,97,97,97,97,97,97,97,97},
+ {155,86,49,104,87,94,64,45,61,91,91,91,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,116,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,48,48,103,48,103,2,2,2,48,2,91,91,91,2,2,2,2,2,2,2,2,2,2,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,2,48,48,48,48,48,2,48,48,48,48,2,48,48,2,48,48,48,48,48,48,48,48,48,48,48,48,48,2,48,48,48,48,2,2,2,48,48,2,48,48,2,48,48,48,48,48,48,2,2,48,2,2,2,2,2,2,2,2,2,2,2,2,2,48,2,2,2,2,2,48,48,2,48,4,48,2,14,2,2,2,155,86,32,104,87,94,64,45,61,91,91,91,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,116,2,2,2,2,2},
+ {164,121,44,166,47,33,7,15,13,2,2,122,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,14,2,2,2,98,53,43,66,50,18,40,14,22,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {128,120,133,17,71,52,25,107,42,21,21,2,2,2,2,4,4,96,2,9,9,2,9,94,94,94,94,94,94,94,94,96,8,128,133,133,128,6,6,18,2,2,2,133,133,133,81,81,81,128,128,128,81,110,2,2,2,4,96,96,96,18,35,35,35,35,35,94,94,94,96,96,110,96,35,35,128,128,18,35,6,6,45,112,2,2,133,133,133,81,81,81,128,128,128,81,110,2,2,45,45,45,35,35,35,45,45,8,45,45,45,45,45,45,45,35,35,35,35,128,35,83,83,74,7,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,129,129,129,129,129,129,45,45,45,45,45,129,45,45,45,7,7,35,35,35,35,35,35,35,35,45,35,35,35,35,35,35,35,35,35,35,112,112,35,45,45,45,45,45,45,45,45,45,45,45,45,45,45,148,45,148,114,44,161,120,172,22,5,5,5,187,120,138,17,71,52,25,21,42,21,21,21,21,21,62,62,42,57,137,137,57,57,52,52,52,90,90,45,45,45,90,90,90,90,45,45,45,45,45,35,35},
+ {179,82,157,76,61,35,13,90,197,2,69,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,39,39,2,2,2,2,32,32,35,35,69,69,103,37,103,103,103,103,103,103,103,103,103,103,69,103,103,103,103,103,103,103,103,103,103,103,103,103,119,42,42,42,119,86,86,86,86,86,86,103,103,103,103,103,103,103,103,103,103,103,69,103,103,103,103,103,103,103,103,103,103,103,6,6,6,6,6,6,44,44,13,44,44,18,13,13,82,135,103,103,103,103,19,19,103,103,103,103,103,83,83,83,103,103,56,83,56,103,39,97,97,42,42,42,119,86,86,86,83,83,83,19,19,19,19,83,83,83,19,103,103,103,103,103,103,103,19,19,19,19,19,103,83,103,33,56,135,56,56,135,135,135,135,135,83,83,95,83,110,135,135,135,135,20,20,20,20,56,55,55,56,56,28,110,110,19,19,87,87,87,124,124,58,5,5,5,126,135,76,76,61,85,205,14,7,7,7,7,7,7,7,55,55,61,38,56,56,56,56,135,135,135,135,135,135,135,39,135,135,135,135,56,56,56,135,135},
+ {136,136,148,63,66,10,169,95,95,163,30,28,28,2,41,130,2,2,2,21,2,2,2,2,2,2,2,2,2,2,2,36,36,2,2,2,2,2,2,2,2,28,2,2,2,2,2,2,2,2,2,21,2,2,2,2,2,2,2,2,2,2,2,2,2,14,4,14,2,14,2,2,2,84,84,72,72,98,98,151,24,13,41,13,41,41,13,13,13,13,13,13,13,13,13,13,13,41,41,41,41,41,41,41,41,41,13,13,13,13,13,13,41,41,13,41,41,41,13,13,13,13,13,13,41,41,13,13,13,124,124,124,124,124,2,2,41,41,13,13,13,13,13,13,2,2,41,41,41,41,41,41,41,41,41,41,13,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,83,83,13,13,41,41,41,41,13,13,41,41,13,13,13,13,13,13,13,13,13,13,13,41,41,41,41,41,41,13,13,41,41,41,41,41,10,52,176,10,10,20,5,5,5,136,136,148,173,66,10,169,95,95,163,30,30,41,41,41,41,30,41,59,59,59,59,59,59,59,205,13,129,129,41,41,41,129,129,129,129,41},
+ {165,81,92,48,9,110,12,40,40,34,2,2,2,107,107,107,2,107,2,2,2,2,2,2,2,2,2,2,2,15,41,41,2,2,2,2,2,2,2,2,2,2,2,15,15,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,15,2,2,2,2,2,2,2,2,2,2,2,2,2,14,2,2,2,154,70,70,70,180,180,180,164,180,107,2,78,15,15,15,15,15,15,15,15,15,2,15,107,2,2,107,15,107,107,41,107,107,107,107,107,107,107,15,15,107,107,107,107,107,107,2,2,2,107,107,15,15,15,15,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,15,15,15,15,107,107,107,107,15,15,107,107,107,107,15,15,107,107,107,107,15,15,15,15,15,15,2,6,149,60,116,3,3,3,165,138,62,48,19,54,12,15,117,34,34,34,85,107,107,107,107,107,107,107,107,152,15,65,65,65,107,107,15,15,15,15},
+ {169,66,170,97,35,56,55,86,32,32,2,2,2,2,14,2,40,2,37,2,2,37,40,40,40,2,2,2,37,37,37,37,37,2,32,37,2,2,32,25,25,34,84,40,55,32,32,32,2,40,32,37,40,40,40,40,40,40,40,48,40,37,37,14,14,14,14,40,40,40,40,10,20,5,5,5,148,148,148,5,113,113,20,86,148,148,148,117,148,48,48,48,48,48,48,48,148,37,37,40,48,48,48,48,48,37,48,12,12,126,12,3,3,3,12,51,51,51,47,47,47,47,47,65,47,92,92,92,30,30,71,71,71,71,71,71,71,71,71,71,71,71,71,40,40,26,26,26,26,26,5,5,148,148,148,5,113,113,26,26,26,26,26,26,26,92,92,92,92,92,92,92,92,92,92,92,92,14,14,92,92,92,92,26,26,26,26,26,26,92,92,26,26,26,26,26,92,92,30,92,92,92,92,26,92,92,92,92,92,92,92,71,71,71,124,124,124,124,122,118,118,118,118,122,118,13,13,13,142,66,164,97,35,120,45,26,26,23,92,92,71,23,45,45,77,77,77,92,92,92,92,92,92,92,92,30},
+ {135,63,126,156,70,18,49,143,6,117,2,109,109,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,35,35,2,2,2,2,35,2,2,2,2,2,2,2,2,2,2,2,2,35,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,35,35,2,2,2,2,2,2,35,35,2,2,2,35,35,2,2,2,2,2,2,2,2,2,35,35,35,35,35,35,35,35,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,35,35,35,2,35,35,35,2,2,2,2,35,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,35,2,35,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,10,2,2,2,135,63,152,82,50,18,99,2,117,117,2,2,98,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {193,59,51,68,68,15,170,170,170,143,143,12,2,2,2,63,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,63,2,2,2,2,2,2,2,2,2,2,2,2,2,63,63,63,2,63,63,63,63,38,38,38,38,38,63,63,63,63,63,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,63,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,10,18,2,2,2,193,59,51,68,68,15,170,170,170,143,143,12,2,2,2,63,2,2,2,2,2,2,2},
+ {145,101,56,65,23,76,110,2,4,4,4,146,146,146,2,146,2,2,2,2,2,2,2,2,2,2,2,2,2,2,146,146,146,146,94,94,94,2,2,2,2,2,2,2,2,2,2,146,146,146,146,146,146,146,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,94,94,94,94,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,146,2,2,2,25,25,25,25,25,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,146,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,20,2,2,2,145,101,56,65,23,76,110,2,4,4,4,146,146,146,2,146,2},
+ {144,129,26,98,36,46,47,52,52,52,82,2,2,2,2,2,17,2,2,2,2,2,2,2,2,2,2,2,2,91,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,91,91,2,2,2,91,2,91,91,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,91,91,2,2,91,91,91,91,91,91,2,2,91,2,2,91,2,2,2,2,2,2,2,2,2,91,91,91,91,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,2,2,2,176,129,190,98,36,46,47,52,52,52,82,2,2},
+ {145,78,166,171,56,20,63,2,2,33,33,33,33,2,78,47,47,47,47,47,2,2,2,2,2,78,78,78,2,2,2,2,217,12,2,2,2,2,2,2,2,2,2,2,2,78,2,2,47,2,2,2,2,217,217,217,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,47,2,2,2,2,2,2,2,47,47,2,78,78,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,47,47,47,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,47,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,78,78,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,6,2,2,2,145,78,166,171,103,140,89,2,2,33,33},
+ {191,69,176,54,47,75,167,2,2,2,188,188,188,30,30,2,67,67,117,2,117,117,117,2,2,36,2,2,2,2,2,2,2,2,2,2,36,36,2,36,2,2,2,2,2,2,2,2,2,2,2,67,67,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,4,72,67,2,2,18,18,32,2,2,2,72,177,177,54,54,54,54,2,2,191,4,14,14,14,14,14,67,24,24,119,117,117,117,117,117,36,36,14,14,14,14,14,4,4,14,14,36,36,39,36,36,36,2,2,2,2,2,2,2,2,2,67,67,67,67,14,14,2,2,2,2,24,14,14,14,14,2,2,2,4,4,4,72,60,60,10,10,14,14,14,14,2,2,72,177,177,54,14,14,14,14,14,14,14,60,14,14,14,14,14,14,14,14,14,117,14,14,14,14,10,14,14,106,106,106,14,14,14,14,14,10,10,10,10,10,10,14,14,14,14,14,14,10,10,10,168,168,168,14,14,14,66,10,119,119,14,14,14,119,119,119,119,210,210,210,69,60,60,119,119,14,224,10,5,5,5,185,69,176,116,47,75,109},
+ {186,96,29,122,47,96,170,157,157,157,157,108,159,2,195,195,26,26,26,26,26,2,2,2,2,132,132,132,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,132,132,2,2,2,157,157,157,2,157,157,132,132,132,132,132,2,157,132,2,203,2,2,2,2,2,2,157,2,2,2,2,2,2,157,2,157,2,2,2,157,2,2,2,2,2,2,2,2,2,157,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,157,2,2,2,157,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,6,18,2,2,2,186,96,29,122,47},
+ {151,118,226,91,54,49,33,2,2,2,2,4,4,4,143,143,2,2,143,25,25,25,2,143,143,143,143,143,143,143,143,143,143,143,143,143,74,74,74,2,2,143,143,74,2,74,74,74,74,74,2,2,143,2,143,143,2,2,2,2,2,90,90,2,2,2,2,2,2,2,2,2,90,2,2,2,2,2,2,143,143,143,2,2,2,2,2,2,2,2,2,2,2,74,74,2,2,2,2,143,143,143,2,143,143,143,2,2,2,2,2,2,2,2,143,2,143,2,2,2,2,2,2,2,2,143,143,74,74,143,2,2,90,143,2,2,2,2,143,2,2,2,143,143,143,2,2,2,2,2,2,2,2,2,2,2,2,2,2,143,143,2,143,143,143,143,2,143,2,143,2,2,2,2,2,143,2,2,2,2,2,2,2,143,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,151,98},
+ {144,91,237,82,81,75,138,163,163,163,117,117,44,2,44,136,136,136,136,2,2,2,2,2,122,122,122,122,2,2,2,136,2,2,44,2,2,2,2,2,2,136,136,136,136,136,136,136,2,2,44,44,2,2,2,136,136,2,2,2,136,136,2,2,2,2,2,2,2,2,136,2,2,2,2,2,2,2,2,2,136,136,2,2,2,136,2,2,2,2,2,2,2,2,2,2,136,2,2,2,2,2,2,2,2,2,136,136,136,136,136,2,2,136,136,136,2,136,2,2,136,136,2,136,136,2,136,136,2,2,69,168,168,183,102,44,44,136,136,136,136,136,136,136,248,163,163,163,163,136,163,2,2,163,163,15,15,15,15,15,136,136,136,136,136,136,136,136,136,136,136,136,136,163,163,163,136,136,163,136,136,163,163,163,136,163,136,136,136,163,136,136,163,163,136,163,136,136,163,136,136,136,163,163,163,163,163,163,163,163,163,163,163,136,136,163,163,163,163,136,136,136,136,136,136,163,136,136,136,136,136,136,136,163,163,136,136,163,163,163,163,163,136,136,136,136,163,163,136,136,136,136,163,163,163,136},
+ {189,78,178,64,118,27,189,2,2,67,67,110,110,110,110,2,28,28,2,2,2,2,2,2,2,102,2,2,2,2,2,2,2,2,2,2,2,2,28,28,28,2,2,2,2,2,2,2,2,2,2,28,28,28,28,28,28,28,28,28,28,28,2,2,2,28,28,28,28,28,28,28,28,28,28,28,28,102,102,102,102,102,102,2,2,2,40,40,28,28,28,28,28,28,2,2,28,28,28,28,28,28,2,2,2,2,2,2,2,2,2,102,2,28,28,28,2,2,2,2,2,2,2,40,2,2,2,2,2,2,28,102,2,102,102,102,102,102,102,102,102,102,102,28,28,28,28,2,2,2,102,2,2,2,2,2,2,2,2,2,102,102,2,2,2,2,2,2,28,28,28,28,2,2,2,2,2,40,40,2,40,40,40,40,40,40,2,2,40,40,2,2,2,2,28,28,102,102,102,102,102,2,2,102,102,102,28,28,28,28,28,2,2,2,28,28,28,2,2,2,2,28,2,2,2,2,2,28,2,28,28,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,28,28},
+ {165,202,83,76,125,65,42,2,44,44,23,2,23,23,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {209,204,92,75,85,146,104,2,7,18,8,2,2,2,204,95,95,95,2,2,2,95,95,95,95,95,95,95,2,2,2,95,2,2,2,2,2,95,95,95,95,95,95,2,2,2,2,2,99,134,134,134,2,2,2,2,2,2,2,2,2,2,2,2,2,2,99,99,2,2,2,134,134,134,99,99,134,134,134,134,134,2,134,2,95,95,95,95,95,2,2,2,2,2,2,2,2,2,99,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,95,2,2,2,2,2,2,95,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,95,95,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,95,95,95,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,95,95,2,2,2,2,2,2,2,2,2,2,2},
+ {169,68,89,16,193,82,33,262,262,175,148,148,148,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,92,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,92,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {171,162,78,43,61,17,112,10,171,182,118,33,2,2,2,2,118,2,2,2,2,2,2,151,2,2,2,2,2,2,2,2,2,2,2,2,2,2,151,2,2,151,151,151,2,2,151,151,151,2,151,151,2,151,151,2,2,151,2,2,2,2,151,151,2,2,151,151,151,151,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,151,151,2,151,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {211,121,119,55,90,211,96,89,225,25,178,36,36,36,2,2,108,2,2,2,2,2,2,2,2,2,2,2,2,184,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,184,184,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,108,108,108,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,36,144,2,108,108,2,2,52,151,208,208,108,108,108,108,108,108,184,184,184,184,108,184,108,108,184,108,184,108,184,184,108,108,184,184,184,184,108,184,184,184,184,184,184,108,108,108,108,108,184,184,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,184,108,108,108,108,184,184,184,108,184,184,184,184,184,184,108,108,184,184,184,184,184,184,184,108,108,108,108,108,184,184,184,184,184,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108},
+ {154,101,83,17,16,210,41,79,70,158,2,27,27,2,2,2,2,2,2,2,2,2,2,2,2,153,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,75,75,75,75,75,75,75,2,2,153,2,153,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,83,83,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,75,75,75,75,75,75,75,2,2,153,2,153,153,2,2,2,153,153,153,2,63,153,153,2,2,2,2,2,153,153,153,2,63,63,63,63,2,2,2,153,153,2,2,2,83,83,83,83,83,83,83,83,83,83,83,2,2,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,40,40,40,40,40,40,40,40,40,63,153,63,153,40,40,40,40,40,83,83,83,63,40,40,83,83,83,83,83,83,83,83,83,83,40,63,63,2,40,40,63,83,83,83,40,83,83,40,40,40,40,40,40,40,83,83,63,83,83,40,83,40,40,83,83,40,40},
+ {169,179,130,79,148,180,136,17,47,119,2,119,119,169,169,2,169,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,169,13,13,169,169,184,169,169,2,169,169,169,169,169,2,2,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,2,2,114,114,108,114,114,128,135,169,169,169,169,169,169,17,17,13,13,135,135,135,135,135,135,169,169,2,2,169,17,169,169,2,2,2,169,169,169,169,169,169,169,169,169,110,110,110,169,135,135,169,135,135,135,169,169,169,169,169,135,245,245,17,245,169,110,110,44,136,44,17,17,17,44,44,132,200,75,75,136,75,75,75,44,44,135,169,135,110,110,110,110,110,110,110,110,110,110,135,135,135,110,135,110,110,245,245,245,135,135,245,245,245,200,245,245,245,245,110,110,110,245,245,245,169,169,169,169,169,169,245,245,245,169,169,169,245,169,169,169,169,169,110,110,169,245,245,245,13,13,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,110,110,245,245,245,245,245,110,245,245,245,245,245,245,245,245,245},
+ {241,171,148,31,172,34,66,60,156,140,2,2,2,75,75,2,2,2,2,2,2,2,190,190,2,2,2,30,2,2,2,2,2,2,2,2,2,2,2,190,190,2,2,190,190,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,190,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,190,190,190,190,2,2,2,190,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,30,2,2,2,30,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,67,2,2,2,2,30,30,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,30,30,2,2,2,190,190,190,91,91,91,30,2,2,2,30,2,2,2,2,190,30,30,30,30,2,2,190,190,30,30,190,2,190,190,190,2,2,2,2,2,2,170,170,2,2,2,2,30,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {229,189,183,106,118,138,82,149,265,39,2,2,265,2,2,2,2,2,2,130,2,2,2,71,71,2,2,2,71,2,2,71,71,71,71,2,71,71,2,2,2,71,71,71,71,2,2,71,71,71,2,84,71,2,71,71,71,2,2,71,71,71,71,71,71,104,104,104,2,104,71,130,2,2,97,110,158,158,71,71,71,119,71,71,71,71,71,104,71,2,2,130,71,130,130,104,104,104,104,104,104,130,130,71,104,130,104,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,104,130,130,130,130,130,130,130,130,130,130,130,130,130,130,98,98,130,98,9,9,9,106,171,109,109,171,171,25,95,95,95,95,95,95,95,95,95,104,95,95,95,95,149,149,149,149,95,95,104,95,149,149,104,71,71,71,71,71,71,104,104,104,104,71,104,71,104,104,104,104,95,95,95,149,71,95,95,104,104,104,104,71,71,104,71,71,104,104,104,104,104,104,104,104,104,104,71,95,95,71,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,149,104,149,104,104,104,104,149,104},
+ {165,157,127,21,64,15,80,130,130,130,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,74,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,83,2,83,83,83,83,83,2,83,2,2,2,2,2,2,2,2,2,2,2,2,83,83,83,83,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,143,2,2,83,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,143,2,2,2,2,2,2,2,2,2,74,74,74,74,74,74,2,2,83,2,2,2,2,2,2,2,2,2,2,83,2,2,74,2,74,74,74,2,2,2,2,74},
+ {221,130,203,84,83,83,29,121,54,54,2,141,2,2,94,94,94,4,4,4,2,4,2,2,2,54,54,108,16,16,94,52,52,52,52,52,52,36,52,134,134,134,52,52,52,52,52,26,26,26,227,227,227,101,101,101,101,101,101,101,67,67,67,67,2,74,74,12,12,6,12,12,3,3,3,94,94,36,36,36,36,36,9,52,52,9,203,203,203,94,94,94,52,52,271,271,271,31,31,31,83,198,31,83,83,83,83,83,191,83,83,83,83,83,134,134,134,134,134,52,31,52,52,80,80,80,80,80,80,80,170,170,170,170,170,78,78,78,92,92,113,92,92,92,80,10,20,10,10,10,69,61,61,61,78,135,78,78,121,121,39,39,113,113,94,94,113,121,121,121,121,113,80,92,92,123,123,123,170,170,80,80,80,22,22,22,271,271,271,83,83,271,271,271,271,271,271,31,31,31,83,198,31,83,83,83,83,83,83,171,171,175,175,175,175,175,175,122,122,122,12,33,33,3,3,94,94,36,36,36,113,113,170,170,170,110,110,110,110,110,110,110,110,110,110,110,110,110,73,73,73,110,110,110,110,110},
+ {230,166,20,160,121,102,153,94,16,67,2,2,2,2,2,2,97,97,97,2,2,97,97,2,97,97,97,97,97,97,97,97,97,2,97,2,2,97,97,2,97,97,2,97,2,2,2,2,2,2,2,2,2,2,2,2,97,97,97,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,97,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,280,280,280,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,97,97,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,97,97,2,2,97,2,97,97,2,2,2,2,2,2,97,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {181,79,137,119,139,24,77,17,50,25,25,25,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,13,2,2,2,2,2,200,200,200,200,2,200,200,2,2,2,200,2,200,200,200,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,200,200,200,200,200,2,13,13,13,13,13,2,200,200,200,13,13,13,13,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {239,242,192,40,41,62,124,193,193,31,193,2,2,2,2,2,2,2,2,2,2,2,2,148,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,47,47,47,47,2,2,148,2,2,2,2,2,2,148,148,2,123,148,148,2,2,2,148,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,148,148,2,148,148,148,148,148,2,2,2,30,43,2,2,2,148,148,2,2,2,2,2,2,2,148,148,148,148,148,30,148,22,7,7,7,118,112,112,112,30,30,30,112,112,112,112,9,22,97,97,97,132,132,22,132,132,132,148,148,148,148,148,148,243,243,2,123,123,132,132,132,132,132,132,132,132,132,132,132,148,132,132,148,132,148,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,148,148,92,92,123,123,123,132,132,132,132,132,132,132,132,132,132,132,132},
+ {239,178,73,122,239,51,95,48,78,88,78,2,2,2,2,2,2,2,2,2,2,2,144,144,2,2,144,144,144,2,144,144,144,144,144,144,144,144,144,144,144,144,144,2,2,2,144,2,2,2,144,144,144,2,2,2,2,2,2,2,2,2,2,2,158,2,2,2,2,2,2,2,2,2,2,2,2,2,2,144,144,144,2,2,2,2,144,144,2,144,2,144,2,2,2,144,144,144,144,144,144,144,144,144,144,144,2,2,144,144,144,144,144,144,2,144,144,144,144,2,144,144,144,144,144,144,144,144,144,144,144,144,144,53,53,144,144,144,2,2,144,144,144,2,144,144,2,144,144,144,144,144,144,144,2,144,144,144,144,144,144,144,144,144,144,144,144,2,2,144,144,144,144,144,144,144,144,2,2,2,144,2,2,2,2,2,2,2,2,2,2,144,2,2,2,2,144,144,2,2,2,144,144,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,144,2,144,144,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {234,117,198,34,143,21,74,6,252,252,98,2,2,2,2,197,38,2,2,2,2,2,47,2,47,47,47,47,2,2,2,47,2,2,2,2,4,2,2,2,2,4,2,2,2,47,128,128,128,128,57,57,57,128,128,128,2,2,2,2,201,201,2,201,201,2,73,201,73,47,47,73,201,201,201,201,201,2,201,201,201,4,2,2,2,2,4,201,2,2,47,128,128,128,128,132,132,201,201,132,132,2,132,132,132,132,132,132,132,132,2,73,73,73,47,47,73,73,2,73,132,73,2,132,132,160,4,2,112,112,2,22,201,2,2,47,128,128,128,112,112,128,128,132,112,112,112,112,112,112,112,174,112,112,112,112,112,112,112,132,132,160,160,160,160,160,160,160,112,201,112,112,112,112,112,174,174,132,2,2,47,128,174,174,174,112,112,112,112,112,174,112,174,132,132,132,174,112,112,112,112,112,112,112,112,112,112,112,112,14,174,174,174,174,174,174,174,174,112,112,112,112,112,112,112,160,160,160,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,112,112,112,112,112,112,112,112,112,112,112},
+ {179,110,38,28,58,39,16,29,42,125,202,8,8,129,4,4,2,2,2,67,67,2,2,2,2,2,2,8,67,67,2,2,50,125,20,20,67,67,67,77,67,67,67,8,8,117,117,117,67,67,67,117,67,67,67,2,2,134,42,168,42,21,21,21,58,232,58,58,124,124,124,42,104,104,104,98,98,104,104,104,104,117,117,67,117,117,117,117,117,98,117,117,117,117,2,98,117,67,67,108,104,104,104,108,108,108,108,108,117,98,98,112,67,112,112,112,104,104,104,104,112,112,117,117,104,104,21,21,58,104,104,104,104,104,104,104,104,104,112,112,112,112,272,112,112,104,104,104,104,104,104,73,22,131,277,114,22,7,7,7,220,225,98,98,98,98,98,98,93,93,185,185,185,185,22,112,112,112,112,112,112,112,112,112,112,112,112,112,112,108,21,21,112,106,106,106,272,272,272,272,272,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,96,96,117,104,104,272,104,104,104,104,104,104,104,104,104,104,104,104,98,98,104,104,104,104,117,117,117,117,299,23,23,41,41,41,41,41,108,23,23},
+ {246,53,189,50,18,59,179,179,7,137,137,2,2,103,103,103,103,40,40,40,2,2,2,2,73,73,73,2,103,103,103,103,103,2,73,73,73,73,73,73,73,73,73,73,73,2,2,2,2,2,35,2,2,2,2,2,71,73,73,2,2,2,61,73,73,73,2,2,2,73,61,73,73,73,24,24,73,73,73,73,73,73,73,73,73,35,73,73,73,197,73,73,73,73,73,24,24,24,24,24,12,73,73,50,61,2,2,50,45,27,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,73,73,73,73,73,73,73,73,73,73,73,61,61,61,61,73,73,61,61,61,61,61,73,61,61,61,61,61,73,73,73,73,73,73,73,73,73,73,73,73,73,2,73,73,73,73,73,73,2,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,61,61,61,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,2,2,50,73,61,61,73,73,73,61,61,61,61,61,61,61,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,61,73,73,73,73,197},
+ {239,133,87,92,193,12,206,238,238,238,31,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,18,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,241,2,241,241,2,241,241,2,2,2,241,241,241,241,2,2,2,2,2,2,2,2,241,241,2,2,2,2,18,18,18,18,18,18,2,238,2,2,241,2,2,2,2,2,2,2,241,2,241,241,241,2,2,2,2,2,2,18,241,241,241,2,2,2,2,18,241,2,2,2,241,2,18,2,2,18,18,18,18,18,18,2,18,241,241,241,241,2,2,2,241,241,241,241,2,2,241,241,241,18,18,18,18,241,241,241,241,241,241,241,241,241,241,18,18,241,241,241,241,241,241,241,241,241,2,2,18,241,241,241,2,2,2,2,2,2,2,2,241,241,2,2,2,2,2,2,241,241,2,2,2,2,2,2,241,2,241,241,241,241,241,241,2,2,2,2,2,2,2,2,2,2,2},
+ {191,244,60,193,18,32,193,104,74,125,125,66,2,2,2,2,2,2,2,2,2,2,125,125,2,125,125,125,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,125,2,2,2,2,125,125,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {253,143,54,39,122,32,75,107,234,2,6,6,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {282,89,71,88,30,23,81,105,105,2,2,105,105,131,107,2,2,2,2,2,195,195,2,2,29,29,21,21,128,195,195,195,195,195,195,195,195,195,131,195,195,195,195,195,261,57,57,57,201,77,228,228,228,228,228,57,57,57,59,59,131,131,195,195,195,195,195,195,195,195,2,195,195,131,195,195,195,195,195,195,195,195,195,195,195,195,131,195,195,195,195,195,195,57,57,57,201,77,228,228,228,228,228,228,131,131,59,83,227,131,131,195,195,195,170,170,170,170,170,170,170,170,170,170,170,170,195,195,195,195,261,131,195,195,131,195,195,195,195,195,104,104,57,57,201,77,228,228,104,104,104,104,104,104,104,104,104,104,104,6,104,104,106,6,6,6,6,6,89,138,170,89,89,222,89,89,89,104,104,104,89,89,91,91,91,83,83,83,44,44,57,57,44,44,44,44,44,44,44,44,44,44,44,44,261,89,89,261,261,261,261,261,261,261,261,261,261,261,261,261,261,261,261,261,74,74,74,74,74,74,74,30,30,17,17,17,17,17,57,57,201,17,17,261,261,261,261,261,91,91,91,204,91,91,261,261},
+ {259,115,171,40,156,71,67,24,24,2,2,2,24,4,4,4,2,234,2,2,2,2,2,2,2,2,2,74,74,2,2,2,234,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,234,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,234,234,2,2,74,2,2,2,234,2,234,234,234,234,234,2,2,234,2,234,234,2,2,234,234,234,234,234,74,2,2,234,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {264,237,49,203,247,108,75,75,75,2,2,32,16,8,16,16,16,164,14,164,2,2,32,16,8,16,16,32,42,42,42,2,2,32,16,8,24,24,24,298,298,95,2,2,32,16,102,102,42,42,42,42,298,2,2,262,262,262,42,298,298,298,298,121,2,115,121,115,115,115,115,115,115,115,141,141,141,115,115,115,115,115,115,115,115,115,115,298,298,298,167,167,167,167,167,121,121,298,298,298,298,298,298,298,298,298,298,298,125,125,125,125,125,298,298,213,213,284,284,284,284,284,284,284,97,97,97,97,97,97,156,156,13,13,97,97,113,97,113,113,113,113,113,113,113,113,113,113,113,113,100,113,113,113,170,170,170,170,170,170,170,170,139,100,100,251,251,251,251,251,251,261,261,251,251,251,251,261,261,261,261,261,261,261,261,261,261,261,261,261,261,261,68,68,68,68,68,68,68,12,12,12,68,12,12,12,12,12,68,68,12,12,12,12,12,12,113,113,174,113,113,97,113,97,97,261,97,97,14,14,14,14,14,14,14,14,14,14,139,139,139,139,139,174,174,174,174,139,156,139,139,139,232,232,139,139},
+ {264,106,89,51,29,226,23,286,286,151,151,151,151,151,2,2,2,2,2,2,31,31,31,2,2,2,2,2,2,2,2,284,284,94,2,2,94,2,2,2,151,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,94,2,2,2,2,2,2,94,2,2,2,2,284,284,284,151,2,2,2,2,2,2,2,151,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,2,2,4,4,16,16,2,2,2,80,76,107,168,168,168,76,4,4,151,151,151,151,80,2,187,94,94,94,94,94,94,94,12,12,2,94,94,94,94,94,94,94,94,2,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,2,94,2,2,12,2,2,2,2,2,2,12,12,284,284,284,284,284,94,94,12,12,12,12,284,2,2,2,2,151,2,150,94,94,94,94,2,2,2,2,2,2,94,94,2,2,12,94,12,12,12,94,94,94,94,94,94,94,94,2,2,80,76,107,168,168,94,12,12,261,261,261,261,12,261,261,261,12,12,94,12,12,12,12,187,187,94},
+ {194,215,82,23,213,23,108,127,74,2,201,32,178,2,285,2,2,2,2,285,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,285,285,285,2,2,2,2,2,2,2,285,285,2,2,285,285,2,2,2,285,285,285,285,285,2,2,285,285,2,2,285,285,285,285,285,285,285,285,2,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,2,2,2,285,285,285,2,2,2,285,285,285,285,285,285,285,285,285,285,285,285,285,285,2,2,2,285,2,285,285,285,2,2,2,2,2,2,2,2,2,2,285,285,2,2,2,2,2,285,2,2,2,285,285,2,2,285,285,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,285,285,285,285,285,285,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {196,267,251,111,231,14,30,52,95,2,154,53,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {266,67,22,101,102,157,53,95,130,2,42,76,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,162,2,2,2,2,2,2,2,2,2,2,2,2,112,112,2,2,2,2,2,2,2,162,2,2,2,2,2,2,2,2,2,162,2,2,2,2,2,2,162,2,2,2,2,2,2,2,2,2,2,2,2,2,162,162,162,162,162,162,162,162,162,2,2,162,162,162,2,2,2,2,2,162,2,162,2,2,162,2,162,162,162,2,2,162,162,162,2,2,18,18,2,2,2,2,2,2,162,2,2,2,162,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,112,2,2,2,2,2,2},
+ {281,205,107,178,236,122,122,316,76,215,215,2,60,2,2,2,2,2,2,227,2,2,2,2,2,2,2,2,27,2,2,2,2,2,2,2,2,2,2,99,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9,9,9,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,211,2,2,2,227,211,211,211,2,211,2,4,2,2,2,144,48,108,12,12,257,22,316,316,132,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,112,112,112,112,2,112,112,112,112,112,211,211,2,2,2,2,2,2,2,2,2,2,2,211,2,2,2,211,211,112,9,112,115,115,112,211,112,211,211,2,2,2,211,211,211,2,211,211,211,211,211,211,211,211,211,112,112,112,112,112,119,112,112,112,2,2,2,112,112,112,2,2,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,2,2,144,48,112,112,112,211,211,211,211,211,211,112,112,112},
+ {271,89,65,195,132,162,102,45,56,174,104,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,13,13,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,80,80,2,2,2,2,2,2,2,2,2,2,2,80,80,80,2,80,80,2,2,2,2,2,2,2,2,2,156,103,103,193,67,67,38,38,209,80,80,80,80,2,80,2,2,2,2,2,2,2,326,326,326,326,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,326,326,326,326,326,326,326,326,326,326,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,80,80,13,13,13,13,13,13,2,2,2,326,326,326,326,326,13,13,80,2,2,2,2,2,2,326,2,2,80,103,103,193,67,67,38,38,209,80,80,80},
+ {200,169,170,121,155,68,131,167,78,113,113,2,2,64,2,2,2,2,2,2,2,2,2,2,2,2,2,173,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,29,2,2,2,113,2,29,2,2,2,2,2,2,2,2,113,113,113,113,113,2,113,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,40,13,13,13,13,13,104,2,4,29,29,29,62,2,2,2,2,62,62,62,62,62,62,62,62,62,62,173,173,29,29,29,2,29,29,2,2,2,29,29,29,29,62,62,62,113,29,29,62,62,113,113,2,2,113,62,29,29,29,29,113,113,113,113,113,29,29,29,29,62,62,62,62,62,2,113,113,113,29,29,29,29,29,29,29,113,113,62,62,62,62,62,62,62,62,29,29,62,62,62,62,62,29,29,29,29,29,29,29,29,29,29,29,29,2,29,29,29,29,29,29,2,2,40,29,29,62,62,62,62,62,29,29},
+ {288,143,265,264,71,19,231,169,27,27,27,2,2,2,2,2,2,2,2,2,2,2,2,2,51,2,2,2,2,2,2,2,114,2,2,2,2,51,51,2,2,2,2,2,2,2,2,2,2,2,2,2,51,51,51,2,2,2,2,2,2,2,51,51,2,2,2,51,51,51,51,51,51,2,2,2,114,114,114,114,2,2,2,51,2,2,131,2,2,131,2,2,2,2,2,114,51,51,51,2,2,2,2,2,114,114,2,2,2,2,2,2,2,2,114,114,51,51,51,51,51,51,51,114,114,51,51,51,51,114,114,114,114,114,114,114,114,51,252,252,114,114,114,51,51,2,114,114,51,51,51,2,2,2,2,2,2,2,114,114,2,2,2,2,2,2,2,2,2,2,114,114,114,2,114,114,114,131,131,131,2,2,51,2,2,51,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,114,114,114,114,2,2,2,2,114,114,114,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,114,114,2,114,114},
+ {311,141,96,173,90,119,134,151,35,252,39,2,39,39,2,2,2,2,2,2,2,2,2,113,113,2,2,2,2,2,2,113,2,2,113,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,113,113,113,113,113,113,2,2,113,2,2,2,2,113,113,2,2,113,113,113,113,113,113,113,2,113,113,2,2,113,113,113,113,2,113,113,2,2,2,2,2,2,2,2,2,113,2,2,2,113,2,2,113,113,113,2,2,2,2,2,2,2,2,2,113,113,113,113,2,2,2,2,2,2,2,2,2,2,113,2,2,2,113,113,113,2,2,113,2,2,113,2,2,2,2,2,113,2,2,2,2,2,2,2,2,2,2,2,2,2,113,113,2,113,113,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,113,113,113,113,113,2,113,2,2,2,2,113,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {311,230,52,138,225,346,162,216,216,91,160,182,91,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {275,167,128,244,184,184,44,210,237,139,139,139,139,2,2,2,2,2,2,2,2,2,2,73,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,73,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,73,2,2,2,197,2,2,2,2,2,2,197,197,73,197,197,197,2,2,197,197,197,2,2,2,197,197,2,197,197,197,197,197,197,197,197,197,197,2,2,2,197,197,197,2,197,2,197,73,2,197,197,197,2,2,197,73,73,73,2,197,197,73,197,197,197,197,197,2,2,2,2,2,2,2,2,2,73,73,73,73,73,73,2,2,2,2,197,197,2,197,2,2,2,2,197,197,2,197,2,2,2,197,197,2,2,2,2,2,2,2,2,197,197,197,197,2,10,197,2,10,197,2,2,121,318,47,47,47,180,47,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,197,2,2,197,197,197,197,197,73,197,197,197,197,197,197,197,197,197,197,197,197,197},
+ {176,156,83,135,46,197,108,63,33,33,33,2,133,2,213,213,213,213,133,133,2,133,2,2,133,133,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,213,2,2,2,2,2,2,2,2,2,2,213,2,133,2,213,213,213,2,2,2,2,2,2,2,2,2,133,133,133,133,133,2,133,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,213,24,133,2,2,279,54,259,259,213,133,133,133,133,133,213,133,133,133,213,213,213,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,213,213,213,213,213,213,213,213,213,213,213,213,213,133,133,133,133,133,133,133,213,133,213,213},
+ {283,125,141,192,89,181,106,208,124,124,2,112,112,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,112,2,2,2,2,2,2,2,2,2,212,212,212,2,212,2,112,112,112,112,112,112,112,2,2,112,112,112,112,112,112,112,112,112,112,112,2,112,186,186,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,2,2,2,2,2,2,2,112,112,112,2,112,212,212,212,212,212,2,2,2,212,212,2,2,2,2,2,2,2,2,2,2,2,2,2,212,212,212,212,212,212,212,112,112,112,112,112,112,112,2,112,112,112,2,2,124,124,2,2,2,124,2,2,2,2,2,2,2,2,2,2,2,112,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,112,2,2,2,2,2,112,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,124,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {289,191,171,152,191,173,54,13,21,56,56,56,2,2,2,2,2,2,2,2,2,220,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,158,158,158,220,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,220,220,2,2,220,220,2,2,220,220,220,220,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,220,220,220,220,2,220,220,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {334,305,132,132,99,126,54,116,164,105,2,105,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,287,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,149,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {240,166,44,193,153,333,15,99,246,99,2,2,99,99,2,2,2,2,195,195,195,2,195,195,2,263,263,2,195,195,195,263,195,263,2,195,195,195,195,195,195,195,195,195,263,35,35,35,35,263,263,263,263,263,263,2,263,263,263,263,263,2,2,263,263,263,263,2,263,263,263,263,263,263,263,263,263,263,263,263,263,263,263,263,263,263,263,263,263,193,193,2,2,35,193,263,263,263,263,263,263,263,2,35,35,35,35,263,2,2,2,2,263,263,263,263,263,2,2,2,35,110,110,110,263,263,263,263,263,263,35,35,35,2,2,35,263,263,263,263,263,2,2,2,2,2,263,2,2,263,2,2,35,35,35,35,35,35,2,2,2,2,2,2,2,2,2,2,2,2,2,2,263,2,2,2,263,2,2,263,2,2,263,263,263,263,2,35,2,2,2,2,2,2,2,2,2,2,2,2,2,2,266,297,297,146,263,263,36,263,123,123,263,263,263,263,2,2,195,195,195,195,263,263,263,263,263,263,263,263,263,195,263,263,195,195,263,263,263,263,263,263,263,263,263,263,263,263,263,195,195,195,195,195,195,195},
+ {246,194,265,79,225,65,24,62,46,181,2,2,2,314,2,2,2,2,2,2,2,215,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,215,182,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,231,231,231,2,231,2,2,2,2,2,2,2,2,2,2,2,2,23,2,2,2,2,2,2,2,2,2,2,2,2,2,231,231,231,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,16,2,2,2,133,285,259,259,259,65,170,234,189,182,2,231,231,97,97,2,2,2,2,2,2,215,2,308,231,182,2,182,231,231,2,2,182,2,2,2,2,182,182,182,2,182,23,231,182,182,182,182,182,182,182,182,182,182,182,2,182,2,2,2,2,2,2,2,2,97,2,2,2,2,182,182,182,182,182,182,182,182,182,182,182,2,2,2,182,23,23,2,2,231,231,231,231,2,2,2,2,2,182,23,23,2,23,23,23,23,23,23,23,2,182,182,182,2,2,23,23,2,2,2,2},
+ {229,334,285,302,21,26,24,97,64,40,2,2,2,231,231,231,231,65,2,148,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,65,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,65,65,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,65,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,65,65,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,65,2,2,2,2},
+ {251,295,55,249,135,173,164,78,261,261,2,2,2,2,114,2,2,2,2,2,256,142,142,2,2,2,2,2,2,2,2,185,2,2,2,2,142,2,2,2,2,142,142,2,2,2,2,2,2,142,142,142,2,2,142,142,142,142,142,142,185,2,2,2,142,142,142,142,142,142,142,142,142,142,142,142,2,142,142,142,142,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,142,142,142,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,142,142,142,142,2,2,2,2,2,2,2,2,2,2,2,2,142,142,2,2,2,2,2,2,142,142,142,2,142,142,142,142,142,142,142,142,142,2,2,2,2,2,2,2,2,2,2,2,2,2,2,142,2,2,2,2,2,2,2,142,142,142,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,185,185,2,2,2,2,2,2,2,2,2,2,2,2,2,108,142,2,2,2,2},
+ {232,153,55,60,181,79,107,70,29,35,2,2,58,58,2,58,2,2,2,2,61,61,2,61,61,2,2,61,61,90,2,90,90,2,61,61,2,2,2,126,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,144,144,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,144,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {246,116,45,146,109,90,32,103,133,119,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {246,113,146,232,162,262,204,47,45,331,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,29,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,274,274,2,2,160,160,2,29,29,29,2,2,160,2,274,29,274,274,274,274,274,2,274,274,29,29,2,2,160,160,160,160,2,2,160,29,29,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,274,2,274,274,2,2,2,274,274,274,274,2,2,160,2,2,2,2,2,2,117,117,160,160,160,2,274,274,274,160,160,160,160,160,160,160,2,2,160,160,160,160,160,160,160,160,160,160,160,160,160,2,2,2,2,2,160,2,2,2,2,2,2,2,2,2,160,160,160,2,2,2,2,2,160,160,2,2,2,160,160,2,2,2,2,2,2,2,2,2,2,2,2,2,117,2,2,2,2,2,2,29,2,2,2,2,2,2,2,2,2,2,2,2,2,160,160,2,160,160,160,160,160,160,160,160,29,29,29,29,160,160,2,2,160,160,160,160,160},
+ {360,150,84,275,13,26,368,49,244,244,63,63,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,38,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {239,295,174,87,30,87,85,36,103,36,2,278,2,2,2,2,2,2,163,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,163,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,163,2,2,2,2,2,2,2,163,163,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,163,163,2,2,163,2,2,2,2,2,2,2,163,2,2,2,2,2,2,163,163,159,2,2,159,2,163,2,2,163,163,163,2,2,2,2,2,2,2,190,190,2,128,2,2,2,128,46,292,292,199,15,338,338,29,338,338,159,159,159,159,2,163,159,159,2,159,159,159,159,159,159,159,163,159,159,159,159,159,159,2,159,159,159,2,159,159,159},
+ {356,300,75,310,123,301,200,107,183,37,218,37,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,148,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,148,2,2,2,2,148,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {358,207,168,150,150,21,156,50,195,275,275,275,2,2,2,2,2,251,2,2,2,251,251,251,251,251,251,251,251,251,2,2,2,2,2,2,2,251,251,251,251,2,2,2,2,2,2,2,2,2,2,251,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,251,251,2,2,2,2,2,2,2,251,2,2,251,251,251,251,251,251,2,2,2,251,2,2,2,2,251,2,2,2,2,2,2,2,2,251,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,227,2,227,2,2,2,2,2,2,2,2,2,2,251,2,2,2,2,2,2,2,2,200,2,2,2,2,251,251,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {322,194,234,62,236,147,239,400,255,255,80,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,80,80,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {326,276,134,100,143,113,115,221,13,339,194,194,194,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,198,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,8,2,2,2,16,16,16,16,16,209,16,16,16,16,198,198,198,198,198,198,198,2,2,2,2,2,2,2,2,2,2,2,198,198,198,198,2,198,198,198,198,198,198,198,198,2,198,198,198,198,198,198,198,198,282,282,25,25,25,107,214,205,205,121,65,174,174,174,174,174,198,198,174,27,27,27,198,198,198,198,198,198,198,198,198,198,198,198,152,198,152,198,198,198,198,198,198,27,27,27,27,27,2,2,2,2,198,198,84,84,203,203,2,2,16,16,16,16,51,203,203,203,203,203,203,203,198,198,198,198,203,203,51,152,152,152,198,198,198,198,198,198,198,198,198,198,198,198,79,198,198,198,194,194,152,152,152,152,152,152,164,164,107,86,352,20,25,5,5,125,125,52,52,241,241,71,71,71,20,194,194,331,194,194,194,194,194,139,352,352,352,352,152,352,352,352,352,198,352,152,152,198,198,254,254},
+ {337,132,27,45,14,81,110,84,238,224,211,2,29,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,21,21,2,2,2,2,2,2,2,2,21,21,21,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,21,21,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,21,2,2,2,2,2,2,2,2,2,2,2,2,2,21,2,2,2,2,2,2,2,2,2,2,2,2,2,2,21,2,2,2,2,21,21,21,2,2,2,2,2,2,21,21,21,21,21,2,2,2,200,21,200,2,2,2,2,2,2,2,21,21,2,200,21,21,21,21,21,21,21,21,21,21,2,2,2,2,2,2,2,2,2,133,133,133,2,133,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,21,21,21,21,2,2,2,2,2,2,2,2,2,2},
+ {192,213,113,174,403,117,342,342,311,35,35,2,2,2,2,2,2,2,2,101,2,2,2,2,2,2,2,2,2,101,101,101,2,2,2,101,101,101,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,101,101,2,2,2,2,2,101,101,101,101,101,101,101,101,101,101,101,11,11,101,101,2,101,101,2,2,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,2,101,101,101,101,101,101,101,101,2,101,101,101,101,101,2,101,101,101,101,101,101,2,101,101,101,101,101,101,101,101,101,2,2,101,101,101,101,101,101,33,33,33,33,2,2,2,2,2,2,2,2,2,2,33,33,2,2,2,2,2,2,2,11,2,2,101,11,33,33,2,2,33,33,101,101,101,2,2,2,101,101,11,11,11,2,2,101,2,2,2,2,2,11,11,33,2,164,164,164,164,2,2,2,2,101,164,33,33,33,33,101,33,101,394,394,394,394,394,394,394,394,33,394,101,101,101,2,2,2,2,164,164,164,164,164,2,164,164,164,2,164,2,2,2,2,2},
+ {264,273,316,53,40,330,51,285,115,219,147,2,2,2,335,2,2,2,2,2,173,2,173,2,2,173,173,173,173,173,173,83,2,2,173,173,173,173,173,173,173,173,2,2,2,2,2,2,173,173,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,83,173,2,2,2,2,2,83,83,2,2,2,2,2,2,2,173,173,173,2,2,173,173,2,173,173,173,2,2,2,173,173,173,173,173,173,2,173,173,2,2,224,224,173,2,173,173,173,173,173,173,2,173,173,2,2,173,2,2,173,2,2,173,173,2,2,2,173,173,173,173,173,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,173,2,83,2,83,83,2,2,2,2,2,173,173,2,173,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,173,83,83,173,2,2,2,2},
+ {254,293,407,118,54,296,160,231,4,4,93,2,2,2,2,2,60,61,2,2,120,127,127,127,88,88,88,88,88,88,88,88,88,127,2,258,258,127,88,88,2,2,2,215,215,88,215,215,215,215,88,88,215,88,88,215,215,127,127,127,127,127,127,180,2,180,180,215,215,195,195,2,215,215,215,2,2,8,8,2,2,88,88,88,186,2,2,4,2,2,2,210,247,56,105,105,88,61,61,88,120,180,2,2,71,71,71,120,61,2,2,120,97,180,180,88,88,88,88,180,180,180,180,180,180,180,180,180,180,88,88,2,97,97,195,195,195,195,180,180,180,180,180,180,180,180,180,293,157,127,293,293,180,180,180,180,180,180,180,157,157,157,157,157,157,157,180,180,180,180,180,180,180,215,215,215,215,180,180,180,2,2,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,101,180,180,180,180,180,180,180,180,180,180,180,180,180,215,215,215,215,215,215,215,215,215,215,180},
+ {341,78,336,263,281,164,99,334,296,114,109,2,163,163,163,163,2,2,2,2,2,2,2,125,125,292,292,292,292,125,125,125,2,2,2,125,292,125,125,125,125,125,381,381,381,381,381,2,2,381,381,381,381,125,381,381,381,381,25,25,25,25,25,25,25,381,381,381,125,125,125,125,125,125,292,292,292,125,232,232,232,232,125,125,125,232,292,292,292,125,2,2,2,292,292,125,125,125,125,125,125,125,25,25,25,25,381,381,125,125,2,25,25,125,2,260,292,25,265,265,25,25,25,25,25,25,2,25,25,25,125,125,125,125,292,292,125,2,144,2,144,2,2,2,25,25,4,4,2,4,2,2,2,125,87,329,12,283,283,287,283,12,12,292,210,210,210,210,210,210,210,2,2,2,381,381,381,25,25,292,292,125,125,125,125,125,2,2,292,292,125,125,125,125,125,125,25,25,25,25,25,25,25,25,25,292,292,292,292,292,292,381,265,265,265,265,265,260,260,265,265,125,292,292,292,292,260,260,25,25,25,125,260,260,260,260,260,260,260,260,260,260,260,292,292,292,292,381,381,381,381,381,381,292,292,381},
+ {355,87,212,100,89,210,133,344,120,45,45,138,138,138,138,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,138,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,138,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,120,120,2,2,2,138,120,120,120,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,120,2,120,2,120,120,120,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,120,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,120,120,120,120,2,138,2,2,2,2,2,2,138,138,2,2,2,138,138,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,8,2,2,2,250,71,71,55,61,61,334,193,55,55,55,120,120,120,120,120,120,120,120,120,138,138,138,120},
+ {274,141,46,219,158,284,38,79,73,185,35,6,81,2,2,2,2,53,2,2,81,81,2,81,2,2,2,53,53,53,53,53,53,2,2,334,2,81,81,334,2,2,2,2,2,2,81,81,81,81,53,81,81,81,53,334,81,81,81,81,81,334,334,126,2,2,2,2,2,2,334,334,122,334,334,334,334,334,2,2,2,2,2,2,2,81,81,81,81,81,81,126,126,126,126,110,110,110,110,110,126,24,126,2,2,2,110,128,353,353,12,126,12,18,2,2,2,256,256,96,96,96,128,29,29,29,12,12,73,73,2,2,53,53,12,12,12,53,53,53,201,2,2,201,201,201,201,201,201,201,53,110,110,110,53,53,110,53,53,2,2,2,53,53,53,53,53,53,53,53,53,53,334,110,110,110,334,126,126,126,53,110,334,110,110,334,110,110,334,334,334,53,53,53,53,42,110,53,53,53,53,53,53,81,42,42,42,53,53,53,53,53,53,334,334,334,334,334,334,334,334,334,334,204,296,296,204,204,150,98,62,17,17,17,186,200,111,34,34,200,200,200,200,121,121,121,121,212,334,179,179,53,53,334,334,179},
+ {349,303,439,19,95,240,174,191,2,162,162,2,2,2,76,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,76,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {360,91,201,205,67,181,59,77,2,44,103,103,103,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,125,2,2,2,2,2,2,125,125,2,2,125,2,2,2,2,2,2,2,2,2,2,2,2,25,2,2,2,125,2,2,2,2,2,125,125,2,2,2,125,125,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,125,125,125,125,125,125,125,125,125,125,2,2,2,125,125,125,125,125,2,2,2,2,2,2,2,125,2,125,125,125,2,2,125,2,2,2,2,2,2,125,2,2,2,2,2,125,2,2,2,2,125,2,2,2,2,2,2,2,2,125,2,2,2,2,2,2,2,2,2,125,125,125,125,125,125,125,125,2,2,2,2,2,125,125,125,2,125,125,125,125,125,125,125,125,125,125,125,2,2,2,125,125,125,2,2,2,125,125,2,2,2,125,125,2,125,125,125,125,125,125,125,2,125,125,2,2,2,2,2,2,2,2,2,125,125,2,125,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {283,154,261,91,77,147,227,105,116,311,256,256,2,116,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,32,2,2,2,32,138,138,32,32,32,246,246,2,246,385,90,90,90,90,90,2,2,90,90,90,90,90,246,246,2,90,62,62,90,90,21,21,21,168,39,42,171,171,227,227,227,246,90,90,90,62,42,42,42,42,42,90,42,195,195,195,195,52,52,52,192,192,181,90,246,2,2,90,90,90,90,52,52,52,246,52,246,171,90,90,90,90,90,52,52,52,52,52,52,52,52,52,42,90,62,62,90,90,21,21,21,78,39,168,171,171,171,227,227,42,90,90,171,171,42,171,171,181,47,181,47,47,47,181,195,195,195,195,36,36,36,36,36,195,195,195,90,90,120,120,120,52,52,52,52,52,90,181,52,181,181,181,460,181,181,195,195,195,120,120,120,120,36,62,90,90,21,21,21,78,168,168,171,171,42,52,195,36,36,120,120,120,120,120,120,120,211,211,164,164,164,164,164,164,164,164,164,272,460,208,9,9,9,190,173,25,175,272,272,113,259,259,259,259,259,131,131,224,224,224,259},
+ {287,288,111,89,249,370,55,16,248,67,67,115,2,2,134,134,2,2,2,2,2,2,2,2,2,2,2,2,2,22,22,22,22,22,22,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,360,360,360,360,360,360,360,360,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,22,22,22,22,22,22,22,22,2,2,2,2,2,2,2,2,2,2,2,2,2,381,2,2,381,381,2,2,2,2,2,22,22,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,49,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,360,360,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,360,360,360,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {284,270,282,37,29,181,160,49,285,285,374,250,2,374,374,2,2,2,179,179,35,2,179,179,2,179,179,2,2,285,285,285,179,179,179,179,179,2,2,2,2,2,2,2,2,2,2,2,2,2,2,179,179,179,179,179,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,8,2,2,2,2,64,64,64,64,135,64,64,64,2,4,4,179,2,99,99,2,2,2,179,312,199,199,179,199,199,199,199,2,199,285,285,285,179,179,179,179,179,199,2,2,2,2,2,2,2,2,2,2,2,2,2,179,2,2,179,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,8,35,35,2,2,64,64,64,64,135,64,64,64,2,4,18,35,35,159,159,2,2,2,35,35,35,35,35,35,35,35,35,35,159,159,159,159,199,199,199,199,199,199,199,199,199,2,2,2,199,199,199,2,199,2,2,312,312,312,312,312,312,312,2,2,2,2},
+ {359,305,52,36,243,231,7,92,2,68,68,307,62,45,2,2,112,311,311,311,2,2,2,2,2,2,2,2,2,2,2,2,2,311,2,311,2,2,2,2,2,2,2,106,106,2,2,2,2,2,2,2,2,2,2,2,2,112,2,2,2,2,2,2,2,2,2,2,2,2,106,106,2,2,2,106,2,106,2,106,106,106,106,106,106,2,106,106,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,106,106,2,2,2,170,170,2,2,2,112,112,112,2,2,2,311,311,106,106,106,106,106,106,106,106,311,106,106,106,106,106,106,106,106,106,106,2,2,106,106,106,106,311,311,311,106,106,106,106,106,106,106,106,106,106,106,106,106,311,311,106,106,2,106,106,106,106,106,106,2,2,106,106,106,106,106,106,106,106,311,311,311,311,311,311,311,311,106,106,106,106,106,106,2,106,106,2,106,106,106,106,106,106,106,106,106,106,2,106,112,112,106,112,106,106,2,106,2,2,36,2,2,2,162,265,144,240,240,240,330,330,106,395,395,106},
+ {288,119,218,137,364,38,27,380,2,2,211,23,33,2,2,2,2,2,225,225,225,2,2,225,225,225,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,225,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,225,225,2,2,2,225,225,225,2,225,225,225,2,2,2,2,2,2,225,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,225,2,2,2,225,225,225,225,225,225,2,2,2,225,225,225,225,225,225,225,225,2,2,2,2,2,2,225,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {277,155,232,309,370,365,348,75,214,214,214,4,4,2,2,2,210,210,210,210,210,210,210,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,41,2,2,2,2,2,2,2,2,2,2,2,2,210,210,210,210,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,210,2,2,2,2,2,2,2,2,210,210,2,210,2,210,210,2,210,210,210,2,2,2,2,2,2,2,2,2,2,2,2,210,210,210,2,2,2,2,210,2,2,2,2,2,210,210,210,210,210,2,2,2,2,2,2,210,2,2,2,2,2,2,2,2,2,2,2,2},
+ {292,204,91,41,124,190,107,322,125,125,125,125,125,25,25,62,2,2,146,146,2,2,62,146,2,146,114,146,114,2,2,2,2,2,2,2,2,2,2,2,2,2,146,146,146,146,146,146,2,2,146,146,2,2,2,2,146,2,2,2,2,2,2,2,146,146,146,2,2,2,62,62,2,2,2,114,114,2,2,2,2,2,2,2,2,114,2,114,114,114,114,114,114,114,114,114,114,114,114,2,2,2,2,2,2,2,2,146,146,146,114,114,2,2,2,2,2,2,2,2,2,114,2,2,2,2,2,2,2,2,2,2,377,377,377,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,114,2,2,2,2,72,6,50,62,146,146,2,2,283,50,113,370,18,18,18,146,125,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,2,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,114,114,146,146,146,146,146,146,146,146,146,114,114,114,114,114,146,146,146,146,114,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146},
+ {282,195,192,409,68,99,253,106,2,2,2,231,55,55,2,323,323,55,55,285,285,285,285,2,2,2,2,2,2,285,285,323,2,2,2,2,2,2,2,285,2,2,2,2,2,2,2,2,2,2,2,2,2,2,285,2,2,2,2,2,2,285,285,2,285,2,285,285,55,55,55,285,285,285,285,285,285,285,285,285,285,2,285,285,285,2,2,2,2,285,2,2,2,2,285,2,2,2,285,285,2,2,285,2,285,2,2,2,285,2,2,285,285,285,285,285,285,285,285,285,285,2,2,285,285,2,2,2,285,2,2,2,2,2,2,2,285,285,285,2,285,285,285,285,285,285,285,285,285,285,285,285,2,2,2,2,2,2,2,285,285,285,285,285,285,285,285,285,285,2,2,285,285,285,2,285,285,285,285,285,285,285,2,285,285,285,285,285,285,2,2,285,285,285,285,285,285,2,285,285,2,285,285,2,2,2,285,285,285,285,285,285,285,285,285,285,285,285,285,285,285,2,2,2,2,285,55,285,55,55,285,285,2,285,285,285,285,285,285,285,285,285,285,285,285,285,2,2,18,2,2,2,45,120,120,21},
+ {299,122,174,403,113,77,63,275,2,2,2,138,276,227,38,227,2,237,2,2,2,2,2,2,2,2,2,2,352,352,352,2,2,2,2,2,88,88,2,2,8,8,22,2,2,2,293,293,293,293,293,293,180,180,2,2,180,104,184,180,180,184,184,180,2,180,88,2,88,88,88,88,88,2,352,352,352,2,2,2,2,293,88,293,293,2,8,180,22,2,2,2,293,293,293,293,293,293,88,88,2,2,180,180,180,180,139,326,139,139,326,326,326,88,88,88,139,139,139,139,139,139,237,237,2,86,237,237,333,333,333,2,8,180,326,139,2,2,293,237,237,237,139,333,333,333,139,139,326,326,326,326,326,326,326,326,326,326,326,326,326,104,104,86,147,147,147,147,147,147,326,326,326,326,326,326,326,326,326,72,326,72,2,72,72,237,237,237,237,237,237,326,326,237,237,237,237,237,237,237,139,139,139,139,139,326,326,326,326,326,326,139,139,139,139,139,132,132,276,276,72,139,139,139,139,139,72,333,72,72,72,72,132,132,132,132,132,72,72,72,72,72,72,72,72,132,132,132,333,333,333,6,6,411,72,72},
+ {282,222,268,86,21,109,353,408,2,2,2,2,135,12,12,216,241,241,241,241,241,241,241,241,241,303,303,303,135,135,135,2,2,2,135,135,135,241,99,99,99,99,99,99,99,2,2,2,2,241,135,135,135,241,135,135,2,241,135,135,241,241,241,241,241,241,241,241,241,135,2,135,135,135,2,2,2,2,2,2,2,2,99,2,241,2,241,52,52,52,52,2,2,2,241,241,241,135,154,135,135,2,2,2,2,2,2,2,2,2,2,2,2,2,2,241,2,2,99,154,154,154,135,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,73,73,2,135,135,135,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,241,2,2,2,2,2,2,2,241,241,2,241,241,241,2,2,241,2,241,2,2,2,2,2,2,2,2,2,2,2,2,241,241,2,154,154,2,2,2,2,2,241,241,241,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {374,94,89,257,137,246,186,196,2,2,2,2,2,454,122,122,122,122,2,2,2,28,28,94,94,94,94,94,122,122,122,122,122,122,122,122,122,122,122,122,94,94,94,94,2,2,122,2,2,2,2,2,2,94,94,94,2,122,122,28,94,94,94,28,28,94,94,94,139,139,139,139,139,139,139,139,139,139,139,2,2,2,2,2,2,2,2,2,2,2,94,94,94,139,139,139,139,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,94,94,2,2,2,2,2,2,2,2,2,2,2,2,2,122,122,122,122,2,2,2,2,2,94,122,122,122,2,2,2,2,2,2,2,2,6,6,6,28,28,6,28,24,6,2,2,2,331,52,52,189,84,323,323,331,2,2,2,2,454,129,129,129,129,129,2,2,122,122,122,122,122,122,122,122,28,28,129,129,129,129,122,122,122,122,122,122,122,122,122,122,122,122,122,94,94,122,122,122,122,122,122,122,94,94,94,94,94,94,94,94,122,122,122,122,139,122,122,122,122,122,122,122,122,122,122,94,94,94,122,122,94,94},
+ {288,92,62,428,122,153,481,66,2,2,2,250,250,177,177,177,177,279,279,279,279,279,279,279,2,2,279,177,177,177,177,177,279,177,177,279,2,2,279,279,408,408,408,279,2,2,2,2,2,2,279,279,279,2,2,279,177,177,54,54,2,2,279,2,2,2,2,2,2,2,2,279,279,2,2,279,2,2,279,408,279,2,2,2,279,279,2,2,2,2,279,279,177,177,2,2,2,2,2,2,2,2,2,2,2,408,408,408,408,408,408,408,2,2,2,408,408,2,2,2,2,2,2,279,2,2,2,2,2,279,2,2,279,279,2,279,279,279,279,279,279,2,2,2,177,2,2,2,279,279,279,2,2,2,2,2,279,279,279,2,2,2,2,2,2,54,2,279,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,279,2,2,2,2,2,2,2,2,2,2,2,2,279,2,2,2,2,279,279,279,279,279,279,2,279,2,2,279,2,2,2,279,279,279,2,2,2,2,279,279,279,279,2,2,2,2,279,279,279,279,279,279,2,279,2,279,279,279,279,2,2,2,279,2,2,2,279,279},
+ {288,370,141,284,207,192,450,67,2,2,2,183,217,217,217,183,183,167,202,202,202,202,167,167,2,2,2,164,164,80,167,167,167,167,2,202,167,167,80,167,167,2,2,2,2,2,2,2,167,167,202,202,167,167,202,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,167,2,2,2,2,202,202,2,2,2,2,2,2,2,2,2,2,2,2,202,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,202,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,98,211,211,211,230,148,148,175,202,202,202,202,202,202,202,2,2,2,114,114,114,114,114,114,2,2,2,202,202,2,2,2,2,2,2,2,2,2,54,202,202,202,202,202,202,2,2,167,202,2,2,202,167,19,202,202,2,202,167,202,202,202,202,80,80,80,202,202,202,202,202,202,202,202,202,202,2,202,202,202,202,202,202,202,202,202,202,202,2,69,69,2,69,69,2,202,202,2,2,2,202,202,202,202,202,202,202,202,202,202,202,202,202,202,80,80,80,80,80,12,80,202,202,323,202,12,3},
+ {286,293,199,39,158,332,242,103,2,2,2,408,266,315,2,2,365,253,315,315,315,315,315,2,2,315,2,2,2,2,2,2,2,2,315,315,315,315,315,315,2,2,291,253,253,291,253,2,2,315,315,2,2,315,315,315,2,2,315,315,315,315,315,315,315,315,315,315,2,315,315,315,315,315,315,253,253,253,253,253,253,315,315,315,315,315,315,315,315,315,315,315,315,315,315,315,315,315,315,315,315,315,315,315,315,315,315,315,315,315,315,315,315,315,315,315,315,315,315,2,2,2,2,315,2,315,315,2,253,253,2,2,2,253,253,253,253,253,315,315,315,2,2,2,2,253,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,315,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,315,2,2,2,2,2,2,2,2,2,2,2,2,2,315,315,315,2,2,2,315,315,315,2,2,2,2,315,315,2,2,2,2,2,2,2,2,2,2,2,2,2,2,315,315,315,315,2},
+ {407,83,435,187,40,16,52,65,2,2,244,39,77,119,119,2,2,2,119,342,342,2,2,2,2,2,342,2,2,58,58,119,119,119,119,119,2,2,169,2,2,2,2,2,2,342,2,2,342,342,342,342,342,342,342,2,2,342,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,342,119,119,119,2,342,2,2,2,2,342,342,342,342,342,342,342,342,2,342,2,2,342,342,342,342,342,342,2,2,2,342,342,119,119,342,342,342,342,342,342,342,342,342,2,2,342,342,342,342,4,4,2,342,342,2,2,90,84,84,84,169,342,342,342,342,342,342,342,342,342,342,342,342,342,342,342,342,342,77,342,342,342,342,342,342,342,342,342,342,342,342,342,342,342,342,342,342,2,342,342,342,342,342,342,342,342,342,342,77,77,342,342,342,342,342,342,342,342,342,342,342,342,278,278,278,342,342,342,342,342,342,342,342,342,342,342,2,342,278,278,278,342,342,342,342,342,342,278,278,342,342,342,342,342,342,342,342,342,342,342,342,342,342,342,342,342,342,342,342,342,342,342,342,342,342,342,342,342,342,342,342},
+ {398,88,78,57,260,203,203,43,131,131,131,204,204,322,204,2,102,2,325,325,325,325,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,39,291,95,95,111,111,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,218,2,2,2,2,2,2,2,2,2,2,2,2,2,2,218,218,2,218,218,218},
+ {390,174,70,155,163,67,225,49,2,34,34,151,151,2,2,111,2,2,111,111,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,111,111,2,111,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,111,111,111,2,2,2,2,2,2},
+ {393,129,393,169,23,192,168,47,2,2,312,150,71,2,150,2,2,2,61,2,2,61,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,61,61,61,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,61,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,61,2,2,61,61,61,2,61,2,2,2,2,2},
+ {408,136,71,63,63,159,222,68,181,181,124,227,14,14,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,219,219,219,219,219,2,2,2,2,2,2,2,2,2,2,2,2,408,2,408,2,2,408,408,2,408,408,2,408,408,408,2,408,2,408,2,2,2,2,2,2,2,2,408,408,408,408,408,408,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,8,102,2,2,2,2,187,190,21,21,396,118,118,21,2,2,124,124,124,303,2,2,2,2,2,2,2,2,2,181,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,219,2,219,219,2,2,2,2,2,2,219,219,219,2,2,219,219,219,219,2,219,219,219,219,219,219,219,219,219,219,219,219,2,219,219,219,2},
+ {294,169,79,242,160,123,178,290,186,186,56,399,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,33,33,33,33,33,33,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,33,33,33,2,2,2,2,2,2,2,2,2,2,2},
+ {415,228,69,68,193,122,21,362,33,22,362,57,2,2,2,2,46,46,196,196,196,2,196,196,196,2,196,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,196,196,2,2,196,196,196,196,196,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,196,2,33,33,33,2,2,196,33,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,196,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {415,130,241,185,312,175,309,199,94,281,47,47,2,2,2,2,206,307,221,2,2,2,2,2,239,239,239,239,239,206,206,206,2,2,2,2,307,2,2,2,307,307,2,2,2,2,2,2,2,2,335,335,335,335,335,335,335,335,335,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,307,307,307,307,307,307,307,2,2,2,2,2,2,2,2,2,2,307,307,2,2,335,307,307,307,307,307,206,206,2,307,2,2,2,2,307,307,307,307,307,307,307,2,307,307,307,307,2,307,2,2,2,2,2,2,2,2,2,307,307,206,307,307,2,307,2,2,2,2,307,307,307,307,2,2,2,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,2,2,216,216,54,216,216,307,307,307,307,307,307,307,2,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307},
+ {417,238,147,165,346,19,92,164,266,291,291,43,2,2,2,345,2,2,2,345,345,2,2,2,2,2,345,2,2,2,2,2,2,2,161,2,2,2,2,2,2,2,2,2,2,161,161,161,2,2,2,2,2,2,236,236,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,266,266,2,345,2,2,2,2,2,2,2,345,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,2,4,2,2,2,190,153,153,95,254,199,345,345,345,345,345,345,345,345,345,345,2,345,345,345,345,345,345,345,345,345,345,345,345,345,345,345,345,345,345,345,345,345,345,345,345,345,345,345,345,345,345,345,345,345,345,345,345,345,345,345,345,345,345,345,345,345,345,345,345,2,345,345,2,2,345,345,345,2,345,345,345,345,345,345,345,345,345,345,345,2,345,345,345,345,345,345,345,345,345,345,345,345,345,345,345,345,345,345,345,345,2,2,2,345,345,345,345,345,345,345,345,345,345},
+ {456,192,86,182,35,174,342,102,210,210,210,393,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,256,256,158,158,256,459,256,64,2,128,459,16,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,128,16,158,158,256,256,256,256,2,2,2,16,2,2,2,2,2,459,2,2,2,2,140,2,459,2,2,2,2,128,16,158,64,256,256,256,172,172,172,172,172,106,106,106,106,106,106,2,2,144,144,106,106,106,106,106,2,2,128,16,158,64,106,106,106,106,106,106,106,106,106,106,106,106,329,329,329,329,106,329,329,329,329,329,67,2,2,67,67,67,67,67,67,67,67,67,22,22,22,22,22,22,22,22,22,22,22,22,22,172,172,172,172,172,172,172,172,172,172,172,172,172,172,141,27,62,22,27,27,27,27,27,22,62,62,62,62,75,75,75,75,62,62,62,75,75,27,27,27,75,75,75,27,140,27,27,140,140,140,36,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,222,222,222,222,222,222,222,222,222,222,222,222},
+ {307,255,92,38,325,61,103,246,176,319,80,89,2,241,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,283,283,283,283,283,283,2,2,2,2,2,2,2,2,2,283,283,283,283,283,283,283,2,2,2,2,2,2,2,2,2,2,2,283,283,283,283,2,2,2,283,2,2,283,283,283,283,283,283,283,283,283,2,283,2,2,2,283,283,283,283,283,283,283,283,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {432,168,63,154,166,46,479,145,144,288,288,288,288,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {341,256,113,85,188,233,161,29,110,167,91,91,253,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,253,253,2,2,253,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,253,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,253,253,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,253,253,2,2,2,2,2,2,2,2,2,2,253,253,253,253,253,253,253,2,253,253,253,253,253,253,253,253,253,253,253,2,253,253,253,253,253,110,110,110,110,253,253,253,253,253,2,253,253,253,253,253,253,2,2,253,253,253,253,253,253,181,253,253,253,253,253,253},
+ {311,360,312,158,73,16,106,209,472,48,24,203,203,2,2,2,2,234,234,234,2,234,234,203,2,2,2,234,234,234,234,234,234,234,234,2,2,234,2,2,2,2,2,234,2,2,2,2,2,2,203,203,203,203,2,2,2,2,2,2,2,2,2,2,2,2,2,2,234,203,203,203,2,2,2,2,2,234,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,203,203,2,2,2,2,2,234,234,2,2,2,234,234,234,2,2,2,2,2,2,203,203,203,234,2,2,2,2,2,2,2,234,234,234,2,2,2,2,2,2,2,234,234,234,2,2,2,2,2,203,234,234,2,234,234,2,203,234,234,234,234,234,2,234,203,203,234,234,234,203,2,203,203,2,203,234,2,203,203,203,203,234,203,2,2,2,2,203,203,203,234,234,203,203,203,203,234,203,203,234,234,234,234,234,234,234,234,203,203,2,2,203,203,234,234,234,234,2,2,2,203,203,203,203,203,203,203,203,234,234,234,234,234,234,234,234,234,234,203,203,203,203,203,203,234,234,234,234},
+ {437,196,161,100,132,246,395,187,35,35,35,2,2,35,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,24,24,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,459,2,459,459,459,2,2,2,2,2,2,2,2,70,70,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {438,174,338,145,155,276,422,374,4,463,463,99,224,70,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,32,2,2,2,78,78,78,78,94,94,121,121,70,70,398,24,24,24,24,24,24,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,24,24,24,24,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,364,2,2,136,136,136,136,136,2,136,2,2,2,2,2,2,2,24,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {426,225,211,130,325,283,353,96,282,23,299,2,2,2,63,63,2,276,276,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,276,276,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,8,8,2,2,2,159,502,502,502,502,16,120,203,430,430,430,2,2,2,2,2,480,480,480,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,276,2,2,2,2,2,41,41,41,41,2,2,2,2,2,2,2,2,94,2,94,2,2,2,2,41,41,2,2,159,502,502,502,502,77,502,51,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,41,2,41,2,94,55,55,2,2,41,41,41,41,41,2,2,94,94,94,94,94,94,94,94,41,41,41,41,41,41,41,41,41,41,41,41,94,94,94,94,94,94,94,94,430,41,41,41,41,41,41,41,41,41,41,41,41,41,2,2,41,41,41,41,41,41,41},
+ {430,101,288,38,200,332,325,193,123,123,88,2,2,2,2,2,231,231,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,478,478,478,478,478,478,478,2,2,2,2,2,2,2,139,478,478,478,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,139,139,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,139,139,139,2,2,139,139,139,2,2,2,2,2,139,139,2,2,2,2,2,2,2,2,2,2,2,2,139,2,2,2,2,2,2,2,139,2,2,2,2,139,2,139,139,139,139,139,139,2,2,139,139,2,2,139,2,2,2,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,2,139},
+ {434,143,308,389,365,363,174,63,121,125,260,2,2,260,260,2,2,2,2,2,2,2,2,2,2,258,2,2,2,258,2,2,2,2,2,2,2,2,258,2,258,2,2,2,2,2,258,258,258,258,258,258,258,2,2,389,258,378,378,42,42,42,2,2,2,2,2,258,258,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,19,35,35,35,35,35,22,19,22,22,22,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,258,258,258,2,2,2,2,389,389,258,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,19,35,35,35,35,22,2,22,22,22,2,2,2,2,2,2,2,2,2,2},
+ {453,123,201,141,229,223,234,494,102,102,102,2,2,102,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,252,252,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,252,252,252,252,2,252,252,252,2,2,252,252,2,252,252,252,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,100,100,100,100,2,100,2,2,2,2,2,2,2,2,2,2,2,2,252,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {438,168,65,264,304,74,168,88,114,132,187,2,127,127,2,2,2,2,2,81,81,56,2,2,2,307,2,2,2,2,81,81,2,2,2,81,2,2,307,2,2,2,2,2,2,2,81,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,307,2,2,81,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,307,307,307,4,4,2,42,2,2,2,204,206,64,64,64,64,64,64,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,321,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,2,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,307,2,307,307,307,307,307,307},
+ {324,181,141,129,33,171,173,291,227,373,52,301,301,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,168,2,2,2,168,168,168,2,2,2,2,2,2,168,168,2,2,2,2,2,2,2,2,2,259,168,168,168,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,168,2,2,2,2,2,2,2,2,2,2,2,2,175,175,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,168,168,168,168,2,2,2,2,2,2,2,2,196,261,2,2,210,108,210,128,128,128,128,128,128,128,128,128,244,244,259,196,196,196,2,168,168,168,168,168,168,2,2,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,175,175,168,168,168,168,168,175,175,175,175,175,175,168,175,175,175,175,168,168,168,168,168,168,168,175,175,259,259,259,259,259,259,259,259,168,175,175,175,175,2,168,2,175,175,175,175,259,261,175,261,2,2,259,259,175,175,2},
+ {448,119,431,111,135,50,242,95,148,49,49,49,68,2,2,2,2,2,2,2,2,49,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,89,2,2,2,89,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {335,114,55,47,33,173,287,345,198,198,136,238,238,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,313,313,313,313,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,8,2,2,2,261,51,128,386,386,386,314,39,39,39,39,39,91,2,55,55,55,55,55,55,55,313,55,419,419,419,419,419,419,419,2,2,2,419,2,2,2,2,419,2,2,2,2,2,313,74,74,74,74,2,2,2,419,55,55,55,55,2,2,313,313,313,74,74,2,2,2,2,2,2,2,74,8,55,15,15,276,113,47,113,66,15,388,55,419,419,292,292,419,2,419,419,55,55,55,55,55,55,292,292,292,292,292,292,292,348,348,348,348,2,82,2,2,2,419,419,2,2,55,55,55,55,55,55,292,55,242,242,242,242,242,242,242,55,55,2,55,55,55,55,2,55,55,55,2,2,2,90,55,55,2,2,454,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55},
+ {468,377,243,237,332,512,27,167,22,169,14,14,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,35,35,2,2,2,2,2,2,2,2,2,35,2,2,2,2,2,2,2,2,126,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,121,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,35,35,35,2,2,2,35,35,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,35,35,35,35,202,2,35,35,35,202,35,35,2,35,202,202,202,202,202,202,202,202,202,202,2,2,2,35,35,35,35,2,35,35,35,2,35,35,2,35,35,35,35,35,35,35,35,2,35,35,35,35,35,35,35},
+ {456,162,188,223,408,209,28,164,299,299,258,186,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {445,391,115,226,96,456,239,214,556,158,158,282,2,2,2,2,2,2,2,2,2,2,2,2,2,331,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,331,331,2,2,331,331,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,331,331,331,2,2,2,2,2,2,2,331,331,331,2,2,2,331,2,2,331,2,2,331,2,2,331,331,331,331,2,331,331,331,331,331,331,331,331,331,331,331,331,2,2,331,331,2,331,2,2,331,2,2,331,331,2},
+ {360,397,130,172,407,479,295,13,38,199,199,346,2,2,2,2,2,2,145,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,46,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {512,136,129,361,180,61,274,128,422,27,292,165,2,2,2,2,2,2,363,117,117,117,117,2,2,2,2,363,2,2,2,2,2,363,2,2,2,2,2,2,2,2,2,2,2,2,363,363,363,363,2,363,363,363,363,363,363,363,2,2,363,363,2,2,2,363,363,363,363,363,363,2,363,363,432,432,2,2,136,324,363,363,363,363,363,363,363,363,363,363,363,363,363,363,363,363,363,432,432,432,363,432,363,363,363,363,363,363,363,363,363,363,363,363,363,363,363,363,363,363,363,363,363,363,363,363,363,363,363,363,363,363,363,363,363,363,363,363,363,363,363,363,363,363,363,363,363,363,363,363,432,130,200,117,18,18,363,130,173,173,288,363,363,18,363,363,363,432,432,432,432,432,432,432,432,5,5,5,432,432,432,363,363,363,432,363,363,363,363,363,432,432,432,432,432,422,422,432,432,432,432,432,432,432,432,432,432,363,422,422,422,422,432,422,422,422,422,422,422,432,432,432,432,432,432,432,432,432,432,432,422,422,422,422,422,422,422,422,422,422,422,422,363,363,363,363,363,363,432,432,363,363,422,422,422,422},
+ {478,433,483,302,200,227,273,27,171,171,371,102,2,2,2,2,2,20,2,2,2,2,2,2,2,2,403,403,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,403,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,106,106,106,403,403,403,2,403,106,106,106,106,403,106,106,2,106,106,106,106,106,106,106,2,2,2,2,2,2,2,2,2,2,2,2,106,106,106,2,2,2,2,2,106,2,2,2,2,2,2,106,2,2,106,106,106,106,106,106,106,106,106,106,2,2,2,403,403,403,403,106,106,2,2,403,403,2,2,2,2,403,403,2,403,403,403,2,2,2,2,2,2,403,2,2,2,2,2,2,106,403,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,44,44,403,44,44,44,2,44,403,2,2,106,2,2,2,2,2,2,2,2,2,2,2,2,2,2,403,403,403,2,2,403,403,403,403,403,403,403,403,403,403},
+ {485,158,454,86,212,60,93,40,209,188,188,106,2,231,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,348,348,348,2,348,348,348,348,348,348,348,2,348,348,348,348,348,348,348,2,2,2,348,348,348,348,348,348,348,348,348,348,348,348,2,2,2,237,2,2,2,2,2,2,348,326,326,326,326,348,348,348,348,348,348,348,348,326,326,326,326,237,326,326,237,237,348,348,326,326,326,237,237,237,237,237,237,237,2,326,326,2,2,348,348,2,2,2,2,2,500,2,326,326,326,326,326,2,326,326,326,326,326,326,326,348,348,348,348,348,348,237,237,237,237,237,2,237,326,237,326,326,2,348,326,2,2,2,2,2,2,2,2,2,2,2,2,2,326,2,2,2,2,348,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,500,2,2,2,2,2,326,326,326,326,326,326,326,326,326,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,326,2,2,2,2,2,237,2},
+ {390,448,111,145,47,555,367,317,315,52,429,435,429,429,2,2,2,2,2,2,2,2,229,2,2,229,2,2,2,229,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,229,229,229,229,229,229,229,206,206,206,229,229,229,229,229,229,229,229,2,229,229,229,229,229,229,229,229,229,229,2,229,229,229,229,2,2,229,229,229,229,2,2,229,229,229,229,2,2,2,2,2,2,2,2,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,2,229,229,229,229,2,2,2,2,2,2,2,2,2,2,2,2,2,229,229,2,229,2,229,229,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {490,331,187,398,407,373,497,219,423,423,378,378,2,419,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,84,2,2,2,2,2,84,84,84,84,84,84,84,84,84,2,2,84,2,2,84,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,228,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,228,228,228,2,228,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,228,2,2,2,2,93,2,2,2,2,2,2,2,84,2,2,2,2,2,2,2,2,2,2,2,2},
+ {378,406,112,198,539,550,516,59,240,240,23,316,2,122,2,2,2,2,2,2,2,2,2,2,111,111,2,2,2,95,2,2,2,2,2,2,2,2,2,195,2,2,2,2,95,195,195,95,378,2,195,2,2,2,95,95,195,2,2,2,2,95,95,95,95,111,2,195,95,95,95,95,95,95,95,195,2,195,195,2,2,195,195,2,195,195,2,2,195,195,2,2,378,195,2,2,2,2,195,195,2,195,2,2,2,182,2,195,195,195,2,2,195,195,2,2,2,195,195,195,195,195,195,195,195,195,195,195,2,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,2,2,151,501,98,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,182,195,182,195,195,378,195,378,378,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195},
+ {474,373,248,330,40,113,105,273,103,407,2,165,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,44,44,2,2,2,2,2,44,2,2,2,2,2,2,2,2,2,44,44,44,44,44,44,44,139,2,2,2,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,2,44,139,44,44,44,44,2,2,2,44,44,44,44,2,2,2,2,2,2,2,2,2,2,44,44,44,44,44,44,44,2,2,2,2,2,2,2,2,2,44,44,2,2,2,44,44,44,2,44,44,44,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,44,2,2,139,2,2,2,2,2,139,139,139,139,139,139,139,139,139,2,2,2,139,139,2,2,2,2,2,139,44,2,2,2,44,2,2,2,2,44,44,2,2,2,139,139,139,2,2,2,44,2,2,2,2,44,44,44,139,139,139,2,2,44,44,44,2,2,2,2,2,2,44,44,44,44,2,44},
+ {495,406,306,239,172,323,236,50,37,435,2,310,56,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,105,105,2,2,2,2,105,105,105,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,111,111,2,105,105,2,111,111,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,111,111,105,105,105,105,105,105,105,2,2,2,2,2,2,111,2,2,2,111,111,111,111,2,2,2,2,111,111,2,105,2,2,105,2,2,111,111,111,2,2,2,111,2,2,2,2,2,2,2,2,2,2,111,111,2,2,111,111,111,2,2,111,2,2,2,2,105,111,111,111,2,2,2,2,111,111,2,2,2,105,105,105,105,105,111,111,111,111,2,111,105,105,105,2,105,2,2,2,105,105,105,105,2,105,105,2,2,105,105,105,105,105,105},
+ {498,447,112,241,552,119,227,189,140,140,140,140,140,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,315,2,2,315,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,315,315,315,2,315,315,315,315,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {505,132,169,418,342,28,319,301,172,530,317,317,335,2,2,2,2,2,2,376,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,376,376,2,2,2,2,2,2,2,2,376,2,2,2,2,2,2,2,2,376,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,376,376,2,2,2,2,2,2,2,2,2,2,376,376,2,2,2,2,376,376,2,2,2,2,2,2,2,2,376,2,2,2,2,2,2,2,2,2,2,2,418,418,122,376,376,376,376,376,376,376,78,78,78,78,78,78,78,2,2,2,376,376,122,2,2,376,376,376,376,376,376,376,376,376,376,376,376,376,2,122,376,122,376,376,122,376,418,418,2,2,376,376,376,2,376,376,376,2,2,376,2,2,2,2,122,122,122,2,2,2,2,2,2,2,122,2,2,2,2},
+ {397,393,191,269,462,151,264,134,307,307,2,163,163,2,2,2,2,2,2,2,2,2,2,2,2,2,159,2,2,2,2,2,2,2,2,2,2,2,2,193,2,2,2,2,2,193,193,2,193,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,193,193,193,193,193,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {485,491,325,149,122,145,228,100,311,64,2,62,137,2,137,2,2,2,2,2,2,2,392,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,392,2,2,2,2,392,2,2,2,2,2,2,2,2,2,2,2,2,2,2,392,392,392,392,2,392,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,83,83,83,83,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,392,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,28,28,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {364,462,360,383,182,187,123,69,129,146,2,156,149,2,149,2,2,2,2,2,2,2,303,303,303,2,2,2,2,2,149,266,266,266,149,303,303,303,303,303,303,303,68,68,68,303,303,68,303,303,303,303,68,68,303,68,233,68,68,68,303,470,163,163,303,303,303,303,303,303,303,68,303,68,303,303,303,303,303,303,303,303,303,303,303,303,68,68,303,303,303,303,303,303,303,303,303,303,303,303,238,238,238,238,68,238,238,238,303,303,303,303,296,238,238,381,233,68,68,68,303,470,163,163,303,303,303,303,303,303,185,68,41,41,41,303,303,303,303,303,303,303,303,303,68,68,68,185,185,185,185,185,185,185,185,185,185,185,185,185,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,41,41,106,41,41,41,41,41,41,41,41,41,41,41,41,238,238,238,238,238,238,238,238,238,238,238,41,41,41,41,41,41,238,296,296,296,296,296,296,296,296,296,238,238,86,86,86,238,238,238,238,238,238,238,238,238,238,238,86,86,86,86,86,86,86,86,86,86,238,238,238},
+ {507,195,130,401,363,171,483,20,86,464,2,89,89,2,26,2,2,2,2,2,425,425,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,82,82,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,255,2,2,2,2,2,2,2,425,2,2,2,2,425,425,425,425,425,425,2,425,425,2,2,255,435,2,435,435,2,2,2,2,255,2,255,255,2,255,2,2,2,2,425,136,255,2,2,2,2,136,136,2,255,425,425,425,425,425,2,255,255,255,255,255,2,2,255,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,255,255,255,255,2,2,2,2,2,2,2,2,2,2,2,2,2,255,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,425,425,2,2,2,2,2,2,2,2,2,2,255,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,571,571,222,205,205,275,69,224,67,67,67,2,2,2,2,2,2,2,2,2,82,82,82,82,82,82,2,2,2,2,2,2,2,2,2},
+ {380,220,87,122,242,78,207,371,95,305,2,2,2,2,440,440,445,358,358,331,331,358,445,445,445,445,445,445,445,445,445,445,445,358,358,358,2,2,358,358,331,331,2,331,2,2,2,2,2,445,331,331,331,331,331,445,331,331,331,331,331,358,2,2,358,358,2,172,172,2,172,2,2,331,331,331,2,358,358,146,358,358,358,358,358,358,358,331,358,358,331,331,331,358,358,358,358,358,358,358,358,358,358,358,2,2,331,331,2,172,2,331,331,2,2,2,358,445,331,331,358,358,358,358,358,358,358,358,358,2,2,358,358,358,358,358,358,358,358,358,358,2,2,2,2,2,2,2,2,2,2,2,2,2,172,2,358,358,358,172,172,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,331,445,2,2,2,2,358,358,358,358,2,2,2,2,2,2,2,2,2,2,2,146,146,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,358,358,358,358,2,2,358,358,358,358,358,2,358,358,358,2,2,2,2,2,2,2,2,2,2,2,2,358,2,2,2,2,2,2,2,2,2},
+ {507,221,247,137,182,90,28,207,325,438,2,2,2,2,2,187,232,438,2,2,68,37,37,37,37,37,37,37,37,37,161,2,2,2,170,170,472,472,472,2,2,472,2,2,472,472,472,472,472,472,472,472,472,472,2,2,2,2,47,472,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,47,47,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,37,2,2,2,2,2,2,37,37,37,37,2,2,2,2,37,37,37,37,37,37,37,2,2,37,2,2,2},
+ {509,265,101,126,203,86,152,416,352,85,2,2,2,284,391,368,2,2,152,2,2,2,325,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,14,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,325,325,325,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {572,359,332,480,68,535,59,504,365,21,2,2,246,54,246,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {415,178,178,372,415,400,73,82,348,99,2,23,325,44,2,2,2,2,2,2,2,2,325,2,2,2,2,2,2,2,2,2,2,2,2,300,300,2,2,325,325,2,325,2,2,2,2,2,216,216,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,277,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,216,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,325,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,44,22,54,256,256,137,137,137,137,399,2,2,44,44,2,44,2,2,2,2,2,507,507},
+ {430,275,236,361,42,552,368,236,653,74,65,458,288,307,307,2,2,2,2,2,2,2,65,65,2,2,2,2,2,2,2,2,2,209,209,2,2,2,2,2,209,2,2,2,2,2,2,2,2,209,2,2,2,2,2,2,2,2,2,209,209,209,209,2,2,2,2,2,2,405,65,65,209,209,209,405,2,405,405,405,2,2,209,65,65,209,209,209,209,209,209,209,209,209,2,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,2,209,209,209,209,405,405,405,405,405,405,405,405,405,405,2,405,405,209,209,209,2,2,209,2,2,2,405,2,2,2,405,405,405,405,405,405,405,405,405,405,405,405,405,405,405,405,405,405,405,2,2,2,2,2,2,2,2,209,2,2,2,2,2,2,2,2,2,2,2,2,2,2,405,405,2,2,2,2,2,2,2,405,405,405,405,405,405,405,405,2,2,2,2,2,405,405,405,2,2,2,2,2,2,2,2,2,2,2,2,2,209,209,209,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,405,405,405},
+ {434,139,58,437,130,441,188,15,63,145,145,145,300,2,2,2,2,300,2,2,2,2,2,2,2,2,401,401,401,401,401,401,605,605,605,2,2,2,2,2,2,2,605,282,282,282,605,2,2,2,605,282,2,605,605,605,605,306,2,300,2,2,2,2,2,2,605,282,605,605,605,349,349,349,282,605,605,605,2,605,282,2,2,2,2,282,282,282,605,2,605,605,2,2,605,605,605,605,605,605,605,605,605,2,282,282,2,282,2,2,2,2,2,2,2,300,2,282,282,2,282,282,2,2,2,401,401,401,401,401,401,2,2,2,2,282,282,605,605,605,605,2,605,605,605,605,605,282,605,282,282,401,282,401,605,605,605,605,605,605,605,282,2,605,605,605,605,605,605,605,282,605,605,605,605,605,605,605,605,401,605,605,605,605,605,605,605,605,605,605,605,2,605,2,2,605,605,605,2,605,2,605,2,2,401,401,401,2,2,2,2,282,2,401,401,2,2,2,2,2,2,2,2,2,2,4,4,2,2,2,2,2,2,4,2,2,2,259,92,212,195,195,51,292,32,209,32,282,282,282,2,2,282,282,282,282},
+ {542,138,266,514,552,202,103,197,574,48,2,96,96,2,2,96,96,217,2,2,2,2,2,2,2,2,2,2,2,2,2,217,217,2,2,2,2,217,217,217,2,217,217,48,48,217,217,217,217,217,217,217,217,217,217,217,217,2,217,2,2,2,2,2,2,2,2,2,217,217,48,2,2,48,48,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,217,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {546,494,72,272,550,219,213,209,169,404,69,464,86,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,83,83,83,155,155,155,155,155,155,155,155,83,83,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,83,83,83,155,155,155,155,155,155,155,155,83,83,83,83,83,14,2,2,83,2,2,2,2,2,2,155,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,83,83,83,155,155,155,104,155,104,104,104,104,104,83,83,83,104,2,33,83,2,33,33,2,2,2,365,365,2,365,365,2,365,365,365,365,365,365,365,365,2,2,83,83,83,155,155,136,136,365,365,365,365,365,209,209,209,365,365,365,365,209,209,209,209,209,209,168,168,168,168,56,56,322,322,56,168,56,56,365,365,56,56,168,56,56,56,365,56,365,365,365,365,365,322,56,322,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,104,104,104,104,104,56,56,56,312,312,312,312,312,312,312,312},
+ {602,466,332,458,99,244,255,183,446,670,2,186,323,2,2,2,2,2,2,2,2,2,2,2,2,2,2,292,165,165,165,165,165,165,292,292,2,292,2,292,2,2,292,165,2,2,2,2,2,2,2,292,292,292,2,292,2,2,2,2,292,292,2,2,2,2,2,2,292,2,2,292,2,2,2,2,2,2,2,2,2,2,2,2,292,2,2,292,292,2,292,292,2,2,2,292,292,292,292,292,2,2,2,2,292,292,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,292,292,292,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,292,2,2,2,292,292,4,2,2,2,2,2,99,387,387,387,387,275,409,409,292,292,292,292,292,2,2,2,2,2,2,2,2,2,165,292,2,2,165,292,292,2,292,292,292,292,292,292,2,292,2,292,2,2,292,165,2,2,2,2,2,2,2,292,165,165,2,292,2,165,165,165,292,292,2,2,2,2,2,2,292,165,165,292,165,165,182,165,2},
+ {422,413,561,110,242,62,436,478,18,150,606,88,643,2,249,2,2,2,2,456,2,2,2,2,2,2,2,2,2,2,2,456,456,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,456,643,643,643,643,456,2,2,2,2,643,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,456,456,456,2,2,2,2,2,2,2,2,2,238,2,2,2,2,2,2,2,2,2,2,2,2,456,2,2,238,238,238,2,2,2,2,2,2,2,2,2,2,2,2,456,456,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,211,211,2,2,2,2,238,238,238,238,238,2,2,2,2,2,2,456,456,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {522,141,154,253,264,53,120,93,274,52,44,203,556,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,301,301,129,129,129,2,2,2,129,129,129,2,2,129,129,129,129,129,129,2,129,129,2,2,2,2,129,129,129,129,129,129,129,2,129,129,2,129,129,2,2,129,129,2,129,129,2,129,129,129,129,129,129,129,129,129,2,129,129,2,129,129,129,2,2,129,129,2,129,2,2,301,2,301,2,2,2,2,2,2,2,2,2,2,2,2,2,129,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {600,249,375,555,421,322,317,84,517,517,268,106,353,2,2,2,2,2,2,2,2,2,268,2,2,2,2,2,2,302,2,2,2,2,2,268,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,268,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,494,268,2,268,268,2,268,268,302,2,302,268,268,268,268,268,2,268,494,302,302,302,302,2,2,268,2,2,302,268,268,268,2,2,2,302,302,302,302,302,302,302,2,2,2,2,2,2,2,2,2,2,2,2,302,2,302,302,302,302,2,302,2,2,2,2,2,302,302,302,302,302,302,302,268,268,2,2,2,302,302,302,302,302,302,302,302,302,302,2,302,2,2,2,302,302,302,302,302,302,302,302,2,2,2,2,2,302,2,2,2,2,2,302,2,302,302,2,268,302,302,302,2,2,2,302,302,2,2,2,2,2,2,2,2,2,2,302},
+ {555,516,310,438,290,559,52,265,248,193,285,441,285,285,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,615,615,2,615,2,2,2,2,2,2,615,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {555,300,232,386,470,300,355,177,57,407,450,279,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,27,27,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,133,133,133,133,133,133,2,2,2,2,2,2,2,133,133,2,2,2,2,2,142,9,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,27,2,2,2,2,27,27,2,2,2,2,2,2,27,27,2,2,27,2,27,27,27,27,27,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,27,27,27,27,27,27,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,295,295,295,56,56,216,87,87,87,40,350,142,2},
+ {544,177,79,306,256,402,205,496,398,115,115,43,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,151,2,151,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,544,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,544,2,2,2,151,2,2,2,2,2,2,2,2,2,2,2,151,151,151,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,151,151,151,2,2,2,2,2,2,2,259,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,160,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,544,2,2,160,160,2,2,2,2,2,2,2,2,2,544,2,2,2,2,2,2,2,2,2,2,2,2,4,2,2,2,2,99,317,333,54,23,23,349,2,349,409,23},
+ {534,274,194,220,575,81,206,544,341,85,137,429,429,429,429,344,2,2,2,2,2,315,315,315,315,315,315,72,72,72,2,2,2,2,72,72,72,315,72,2,2,2,2,2,2,2,2,2,2,2,315,315,429,429,2,72,72,429,2,2,2,2,2,429,2,2,2,2,2,344,178,178,344,2,2,2,178,178,2,2,2,344,344,315,315,315,2,2,315,2,2,2,344,2,2,2,72,315,2,429,2,2,2,315,315,315,315,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,315,2,2,2,2,2,2,2,2,2,72,72,72,2,2,2,2,2,2,2,429,315,72,72,2,2,72,72,2,2,2,72,72,72,2,72,72,72,72,72,2,72,44,2,72,2,2,72,4,2,2,8,4,2,4,2,2,2,338,228,474,87,109,399,72,72,72,72,72,72,72,72,72,72,2,2,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,315,315,315,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,344},
+ {400,136,112,136,273,277,205,578,122,122,230,230,2,2,2,2,2,2,2,2,2,2,2,2,2,2,302,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,302,302,302,302,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,317,2,2,302,302,302,302,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,302,2,2,2,2,2,2,2,2,302,2,2,2,2,2,2,2,302,302,2,2,2,2,2,2,2,2,2,302,302,302,2,2,2,2,2,302,302,302,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,302,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,302,2,2,2,2,2,2,302,302,2,2,2,2,2,302,302,302,302,2,2,2,2,302,2,302,2,2,302,302,2,2,302,302,302,302,302,302},
+ {576,421,115,52,253,373,17,657,43,178,178,58,485,485,485,485,485,485,2,2,2,159,159,159,159,2,619,2,2,2,2,2,2,2,2,2,2,2,2,2,2,518,2,159,159,159,2,159,159,2,159,2,159,2,159,159,159,159,159,159,2,2,2,2,2,2,2,2,2,2,159,159,159,159,159,159,159,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,159,2,159,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,159,159,159,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,518,159,159,159,518,159,159},
+ {576,301,142,329,96,41,302,528,126,112,206,206,2,2,2,2,2,2,206,206,2,206,206,2,191,206,206,191,191,191,191,206,191,191,191,206,206,191,2,206,2,206,206,206,206,2,2,2,206,2,2,2,2,206,206,206,206,206,206,206,2,206,2,2,2,2,2,206,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,191,2,2,2,2,2,2,2,2,2,2,2,2,2,206,2,2,2,206,2,2,2,2,191,191,191,191,2,191,191,191,206,206,2,2,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,2,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,206,191,191,2,191,2,2,191,191,191,206,191,191,2,2,206,191,206,206,206,274,2,2,2,2,191,191,191,191,191,191,191,191,191,206,206,206,206,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,191,2,2,2,2,2,2,2,2,2,2},
+ {548,538,508,250,539,102,73,285,119,433,480,480,2,2,2,480,480,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,72,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,72,72,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,72,2,2,2,72,72,72,2,2,2,2,2,2,2,72,72,72,72,2,72,2,2,2,2,72,2,2,2,2,72,72,72,72,2,2,72,2,72,72,72,2,72,72,72,72,72,72,72,72,2,72,2,72,72,72,2,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,2,72,72,72,72,72,72,72,2,2,72,2,2,2,72,72,72,2,2,72,72,2,72,72,72,2,2,72,2,2,2,72,72,72,72,72,72,72,72,72},
+ {622,526,294,56,498,176,237,351,25,26,474,55,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,358,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,358,358,358,2,358,358,358,358,358,358,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,584,2,2,2,358,584,584,584,584,2,2,358,358,358,358,358,358,358,358,358,2,358,358,358,2,358,2,358,358,358,358,358,358,2,2,358,358,358,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,358,2,358,2,358,2,2,2,2,2,358,358,358},
+ {446,163,469,481,240,278,51,373,491,13,22,419,2,2,2,2,2,2,2,2,2,176,176,2,2,2,2,2,2,2,2,2,2,2,2,2,176,176,2,176,2,176,176,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,176,2,2,2,2,2,2,2,2,2,2,2,2,176,2,2,2,2,2,134,2,134,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,214,214,2,2,2,2,2,2,134,214,2,111,2,2,2,2,2,134,134,134,134,134,134,134,2,2,2,134,2,2,2,2,2,2,2,2,2,2,2,134,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,214,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {445,223,102,108,120,166,68,214,737,504,96,96,206,377,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,39,39,528,528,528,2,2,2,2,2,39,39,39,39,39,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,528,365,2,365,365,365,365,2,2,2,528,2,2,528,528,528,2,2,2,2,39,39,39,39,39,2,2,2,2,39,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,528,39,39,2},
+ {453,121,489,84,434,505,78,575,468,372,468,468,83,468,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,83,83,83,83,2,2,2,2,83,83,83,2,2,83,2,2,2,2,83,2,2,83,83,492,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,2,2,2,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,2,2,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,2,83,83,83,83,83,83,83,492,83,492,492,492,378,378,492,492,83,83,378,83,83,492,492,492,492,492,492,492,492,492,2,83,492,2,2,492,492,492,2,2,83,83,83,83,83,83,83,2,83,83,83,492,492,492,83,83,2,83,83,83,83,363,363,83,363,363,363,363,363,363,363,363,363,2,363,83,83,83,2,83},
+ {425,355,128,58,194,82,438,117,10,34,34,35,112,107,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,303,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {432,479,328,443,253,634,271,429,406,543,406,543,543,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,244,244,244,2,2,2,111,2,2,2,2,2,2,2,2,2,2,244,2,2,2,2,2,2,2,2,2,244,244,2,244,244,2,244,244,2,244,244,244,244,244,2,244,244,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,95,2,2,2,2,2,2,2,2,2,2,2,2,244,244,244,244,244,244,244,244,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,95,95,2,2,2,95,2,2,95,95,2,2,2,244,244,95,95,2,244,244,95,95,244,244,95,95,95,95,95,95,95,95,95,95,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,244,244,2,2,2,111,2,111,111,111,111,111,2,111,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,95,95,2,2,2,2,2,2,2,2,2,2,2,2,2,244,244,244,244,244,244,2,244,244,244,244,244,244,244,244,244,2,2,244,244,244},
+ {433,294,192,205,152,70,99,68,392,169,309,390,390,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,199,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,189,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,189,2,2,2,2,189,189,2,189,2,2,2,8,677,189,189,4,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,266,266,266,189,189,189,189,189,189,189,266,266,266,266,266,266,266,189,189,189,189,189,189,189,189,189,189,189,189,189,189,162,270,270,23,23,23,450,450,450,23,450,607,607,450,606,606,189,266,189,266,266,100,189,189,189,266,266,266,266,266,266,266,189,266,266,266,266,266,266,189,189,189,166,166,166,266,266,266,266,266,189,189,266,266,189,189,189,189,284,284,284,284,189,189,189,189,189,189},
+ {456,383,487,311,57,579,673,264,582,187,184,43,43,2,2,2,2,501,501,501,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,501,501,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,501,501,501,501,501,501,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,501,501,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,43,501,2,2,2,2,501,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,501,2,501,2,2,501,501,501,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {437,561,384,619,363,420,614,117,217,247,405,142,142,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,28,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {434,372,239,508,478,26,375,255,151,151,650,112,251,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,161,2,2,2,161,2,161,161,2,2,2,2,2,2,2,2,161,2,161,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,455,455,455,455,2,161,161,161,2,161,161,161,251,251,251,251,161,161,161,161,161,161,161,161,161,161,161,161,2,2,2,161,161,161,161,161,161,161,161,161,161,161,2,2,2,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,455,161,2,161,161,161,161,455,2,161,161,161,161,161,161,161,161,161,161,161,161,161,455,161,161,161,161,455,455,455,2,455,455,161,2,455,455,455,161,455,455,455,455,455,2,2,455,455,161,161,161,161,455,2,455,2,2,2,2,161,161,2,455,455,455,455,2,2,2,2,455,455,161,161,161,2,161,455,455,455,455,455,455,455,455,455,455,455,455,161,161,455,455,455,455,2,455,455,455,455,455,161,2,2,161},
+ {437,133,516,423,305,90,135,25,266,487,6,286,286,2,2,2,2,2,2,2,2,2,2,2,2,510,510,2,2,2,2,2,146,146,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,146,146,146,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,146,146,146,2,2,2,2,2,2,510,2,122,122,146,146,146,2,122,122,122,122,2,146,146,2,2,2,2,2,2,2,2,2,146,2,2,2,2,2,2,146,146,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,510,2,510,510,2,2,2,2,2,2,2,2,2,2,2,2},
+ {463,341,170,401,178,79,305,98,162,166,32,392,335,335,335,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,116,2,2,2,2,116,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,116,116,116,116,116,116,116,116,116,116,116,116,116,2,2,2,116,2,2,2,2,2,2,2,2,116,116,2,2,2,2,116,116,116,2,2,2,2,2,2,2,2,2,221,221,221,221,2,2,221,116,2,221,2,635,635,635,635,116,116,2,2,2,2,2,2,2,2,2,2,116,116,221,116,116,116,2,2,116,116,116,116,116,116,116,116,116,116,2,116,116,116,116,2,116,116,116,2,116,116,116,116,116,116,116,116,116,116,116,116},
+ {610,477,478,516,318,184,267,423,190,494,494,2,336,336,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,551,551,551,551,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,647,647,647,2,647,647,647,647,647,551,2,2,647,2,2,647,647,647,647,551,551,2,2,2,2,647,647,551,551,647,647,647,647,2,2,2,647,647,647,647,647,647,647,647,403,647,2,647,647,647,647,647,647,647,647,647,2,647,647,647,647,647,647,647,314,314,314,314,551,647,647,647,2,647,647,647,647,647,2,2,2,2,647,551,551,551,647,647,647,647,647,551,551,551,551,551,551,551,551,647,647,647,647,647,647,2,647,647,647,647,647,647,647,2,647,647,647,2,647,647,647,647,647,647,551,551,551,647,647,647,647,647,647,647,45,45,647,647,647,96,647,647,2,647,647,96,2,96,96,96,96,96,96,96,551,551,551,551,647,2,2,647,96,96,96,96,96,96},
+ {611,211,491,224,47,54,124,268,271,271,223,2,2,2,2,2,2,2,2,2,2,2,2,359,2,2,2,2,2,2,2,2,359,2,2,2,2,2,2,2,359,2,2,2,2,2,2,2,359,2,2,2,2,359,359,359,359,359,2,2,359,359,359,359,359,359,2,2,359,359,359,2,359,359,359,49,49,49,359,49,49,2,2,2,2,359,359,2,359,2,151,359,49,49,359,2,2,2,2,2,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,2,2,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,2,2,359,359,359,359,359,359,359,359,359,359,359,359,359,359,2,359,359,359,359,359,359,359,2,359,359,359,359,359,359,359,2,359,359,359,2,359,2,2,359,359,359,359,359,359,2,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,2,2,364,269,308,381,552,269,269,359,359,359,128,128,128,273,2,273,359,359,2,287,273,273,273,49,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,273,273,273,287,287,287,359,359,359,359},
+ {590,463,461,162,162,622,167,254,29,377,377,75,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,75,75,2,2,2,75,75,75,75,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,205,205,205,2,2,2,2,2,2,2,2,58,2,2,2,75,75,2,2,2,2,75,75,205,75,205,2,2,205,2,2,2,2,2,75,75,75,75,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,75,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,75,2,2,75,75,75,75,2,75,2,2,2,2,2,2,2,2,2,75,75,2,2,75,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {478,388,612,404,491,561,180,80,262,58,94,2,2,275,2,2,2,2,2,151,2,2,2,2,2,312,312,312,2,2,2,275,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,312,2,2,275,2,275,2,2,2,312,2,2,2,2,2,2,2,2,2,275,312,312,312,2,312,312,312,275,2,2,2,2,2,2,2,2,275,275,275,275,2,2,2,312,312,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,275,2,2,275,2,2,2,2,2,2,2,2,275,275,275,275,2,2,2,2,2,2,2,2,2,2,2,4,288,4,44,2,2,2,234,234,234,234,234,234,234,234,302,234,26,234,50,50,50,50,50,50,50,275,132,132,132,132,132,132,132,132,132,2,2,275,275,275,275,2,2,508,2,2,2,2,2,2,312,2,2,2,2,2,2,2,132,132,132},
+ {629,225,67,623,298,588,354,49,41,185,176,63,63,63,2,2,2,2,2,2,2,2,2,2,2,2,8,435,32,32,435,435,435,435,63,419,419,63,63,2,2,2,2,2,2,2,2,2,2,2,2,2,8,435,32,8,435,435,2,2,63,419,2,2,2,2,2,2,2,2,2,2,2,2,8,2,2,2,8,435,8,8,2,2,2,2,2,2,782,2,2,2,2,32,2,93,2,2,2,2,8,189,2,2,8,782,782,782,105,105,105,105,105,642,642,642,222,222,222,222,189,189,222,222,222,189,222,222,2,222,222,222,222,222,316,316,316,316,316,316,316,316,316,316,189,140,140,494,494,222,222,222,143,222,189,189,189,249,316,316,316,537,537,537,537,316,316,189,189,189,189,143,143,143,143,143,143,143,143,143,143,143,143,143,143,629,629,143,143,629,629,629,19,629,629,629,316,316,537,316,316,316,537,537,537,537,537,537,387,387,387,387,387,387,387,387,387,387,387,387,387,387,387,387,387,387,387,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,316,316,316,316,316,316,316,316,316,316,316,316,206},
+ {671,275,392,298,612,328,337,215,58,58,124,2,2,490,392,2,2,2,125,457,457,2,2,2,2,2,2,2,2,2,2,457,457,457,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,319,2,2,457,319,319,319,2,457,457,457,169,169,169,169,169,2,2,2,2,2,2,2,457,457,457,457,457,2,2,2,2,2,2,2,2,2,319,319,457,457,457,319,319,2,319,319,2,319,2,2,2,2,2,2,169,2,2,319,319,319,319,319,319,2,2,2,2,319,2,2,2,319,319,319,319,319,319,319,319,319,2,2,2,2,2,2,2,2,2,2,2,2,319,2,319,319,319,319,2,319,319,319,319,319,319,2,319,319,319,319,2,2,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,2,2,2,2,2,2,319,319,319,319,2,319,2,2,2,2,2,2,2,2,319,319,319,2,2,2,2,319,319,319,319,2,2,2,319,2,2,2,2,319,319,319,319,319,2,319,2,2,2,319,319,319,319,319,319,2,319,319,319,319,2,2,2,2,169,169,169,319,319,2,2,2,2,2,2},
+ {448,126,129,168,209,340,40,96,509,509,509,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,68,2,2,2,2,2,2,2},
+ {667,246,160,68,737,203,168,628,46,128,358,2,2,2,121,121,2,2,2,2,2,2,560,121,2,2,2,2,2,2,2,121,121,505,505,505,505,505,505,94,121,94,121,2,2,2,2,94,94,121,121,121,121,121,121,411,411,411,411,411,411,411,2,94,94,94,2,2,2,2,121,411,94,94,343,94,94,94,94,94,94,94,94,94,94,121,94,121,100,100,121,121,2,121,121,121,94,2,94,94,94,94,11,121,121,2,121,121,121,100,560,560,560,560,121,121,121,121,121,560,560,560,560,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,94,2,2,2,2,2,2,505,505,505,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,94,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,505,2,2,2,94,94,94,94,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11,11,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {635,212,284,356,187,591,275,361,194,317,488,2,2,2,2,2,2,97,6,2,6,247,2,2,2,2,2,2,2,2,2,6,6,2,2,2,17,17,17,2,17,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,17,17,17,17,17,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,17,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {612,395,104,86,264,321,521,325,252,53,178,100,100,100,16,343,343,343,343,343,2,2,2,2,2,2,2,2,2,343,343,343,135,135,2,2,135,135,2,135,2,2,32,2,2,2,128,676,128,128,128,32,32,135,135,32,135,2,182,182,343,135,135,135,135,165,135,135,2,135,343,343,509,509,509,135,135,135,135,135,135,165,165,165,165,165,26,165,165,165,7,7,343,52,343,250,343,250,250,250,250,250,250,250,250,165,165,343,343,343,343,343,343,367,100,100,343,367,228,367,367,343,343,343,343,165,165,165,165,100,100,100,100,100,100,25,25,25,216,216,216,216,216,118,674,216,423,100,674,100,165,165,343,555,555,130,130,363,363,363,363,363,363,363,363,363,363,363,363,363,363,363,363,363,363,363,165,165,26,52,363,490,7,7,343,52,343,343,648,648,648,490,367,367,490,490,648,648,648,343,368,490,490,490,490,165,165,244,244,490,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,555,368,555,244,244,244,244,367,367,367,367,367,367,367,367,367,367,363,363,363,202,244,244,363,555,244,555,555,555,363,363},
+ {486,428,287,472,292,141,504,178,585,98,282,2,2,2,2,2,2,2,2,2,2,2,2,284,284,284,78,284,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,284,284,2,2,2,2,2,2,2,2,2,2,131,2,2,131,131,2,284,2,2,2,2,284,284,284,284,2,284,284,284,284,284,284,284,2,2,2,2,284,2,2,2,2,2,2,2,2,2,2,2,284,284,284,131,284,284,131,2,131,131,284,284,284,284,284,284,2,284,284,284,2,2,284,284,284,284,284,2,2,2,2,131,131,131,405,284,284,284,284,284,284,284,284,284,2,2,2,131,131,284,284,131,131,131,131,284,284,284,131,284,284,284,284,284,284,2,284,284,284,284,2,284,284,284,284,284,2,284,2,284,2,2,284,284,2,2,284,284,284,284,2,2,2,284,284,284,284,284,284,284,284,2,2,2,2,2,2,2,2,2,284,2,2,2,2,2,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,131,284,131,131,284,131,131,284,284,284,284,284,284,2,2,2,2,2,284,284,284},
+ {612,327,212,565,450,385,201,649,423,491,106,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,50,50,50,50,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,180,180,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,180,2,180,180,50,50,2,2,2,2,2,2,2,2,2,180,180,180,180,2,2,2,2,2,50,2,180,180,180,180,180,180,180,180,2,2,2,180,180,2,2,180,180,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {462,579,236,447,60,162,427,258,73,742,742,2,742,742,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {495,440,89,439,65,207,459,407,139,131,624,2,380,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,338,2,338,338,338,2,338,338,2,2,2,2,2,2,2,2,338,338,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,774,774,774,774,2,774,774,774,774,2,2,774,774,774,774,774,774,774,774,774,2,2,2,774},
+ {469,507,276,227,66,237,260,386,27,666,31,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,502,2,502,2,502,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,502,502,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,502,2,2,502,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,171,171,171,2,2,171,2,2,2,2,2,2,2,2,2,109,2,2,2,2,2,2,109,109,109,109,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {646,393,273,238,24,13,253,127,368,316,316,316,150,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,290,290,2,290,290,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,542,542,542,542,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,57,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {626,196,111,465,386,431,181,414,614,391,349,318,389,2,389,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,454,454,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,546,546,546,521,525,525,128,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,166,2,2,2,2,2,2,2,2,2,2,2,94,2,94,94,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,27,2,2,2,2,2,2,2,2,2,2,2,209,546,546,521,525,525,525,74,2,544,2,2},
+ {667,257,290,122,109,523,95,26,282,49,374,236,236,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,88,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,88,88,2,2,2,320,320,320,320,2,2,88,88,320,320,320,320,88,320,2,2,320,320,88,88,2,2,2,2,2,2,2,2,2,2,320,2,2,304,304,2,2,2,2,2,2,2,2,2,2,2,2,2,2,320,2,2,2,127,320,320,320,2,320,320,320,2,304,320,320,2,2,2,88,2,320,127,127,304,2,2,320,320,320,320,2,2,2,88,2,2,2,2,2,2,88,2,2,88,320,2,2,2,88,2,88,88,88,2,88,88,88,2,2,88,127,2,2,2,2,127,2,207,2,127,127,127,127,127,2,320,320,320,320,2,127,127,127,127,2,2,2,320,320,320,320,320,2,2,2,127,127,320,320,127,127,127,127,127,127,127,127,127,10,127,2,2,265,265,265,265,34,34,605,88,88,88,88,127,127,2,88,88,88,127,127,127,127,127,127,88,127,127,127,127,127,127,127,127,127,127,127,127,186,45,88,88,45},
+ {653,169,261,533,488,282,213,443,337,480,503,174,534,2,2,2,2,2,534,2,2,2,2,534,2,2,2,2,534,2,2,2,2,2,2,2,2,2,2,2,2,222,2,2,2,2,2,2,2,2,2,2,534,534,534,534,534,534,2,2,534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,339,2,2,534,534,339,534,534,644,644,534,534,534,534,534,534,534,534,534,534,534,534,2,487,2,487,487,487,487,487,487,487,487,2,2,2,534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,487,487,534,534,487,534,534,534,534,534,534,534,534,534,270,270,270,270,487,644,487,487,270,270,270,270,644,644,270,644,644,644,534,534,644,534,115,115,115,2,644,644,534,644,644,644,644,644,644,644,644,644,644,644,644,644,644,644,644,644,644,644,644,644,270,222,644,644,534,534,2,644,644,644,644,644,644,115,115,115,115,644,644,2,644,270,270,270,534,534,534,534,534,644,644,644,644,644,644,644,644,644,644,487,222,222,644,73,73,270,270,270,534,534,534,534,534,534,534,2,2,534,534,2,2,644,2},
+ {670,555,160,90,604,604,50,459,376,545,316,180,526,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,79,2},
+ {639,253,95,380,108,448,223,254,381,30,6,644,6,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,503,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,503,503,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,503,503,2,503,503,503,503,503,503,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {642,160,702,90,157,254,278,521,650,277,74,554,122,2,2,2,2,2,2,517,174,174,174,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,517,2,2,2,2,2,2,2,517,2,2,2,517,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,517,2,517,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,517,517,517,517,2,2,2,2,2,2,517,517,517,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,517,2,2,2,2,2,517,517,517,517,2,517,517,517,2,517,2,2,517,517,2,2,2,2,2,2,2,2,2,2,2,2,2,2,517,517,517,2,2,2,517,517,2,2,2},
+ {678,254,190,197,637,49,130,25,374,357,357,411,643,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,537,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,537,2,2,2,2,2,2,299,2,2,2,2,2,2,2,2,2,537,537,299,577,2,2,2,348,348,467,115,64,64,64,348,33,537,537,537,537,537,33,33,537,537,537,2,291,537,537,537,537,537,218,218,218,537,537,537,537,537,537,537,537,537,537,537,33,33,629,537,537,537,537,537,537,537,537,537,537,537,537,537,537,629,537,537,537,537,537,537,400,198,738,304,537,537,19,19,19,529,19,395,395,169,169,463,537,463,218,33,33,33,218,218,218,218,537,537,218,218,218,537,537,537,537,537,218,218,218,218,218,218,218,218,218,218,218,218,218,537,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,150,246,228,9,9,9,246,83,195,195,195,551,551,551,214,214,214,411,411,214,214,629,537,629,537,537,629,629,629,291,291,291,629,629,291,291,291,335,629,629,629,629,218},
+ {512,347,65,546,434,87,18,123,672,412,316,6,699,6,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,412,2,2,412,412,412,2,2,2,2,2,2,2,2,2,412,2,412,2,412,412,2,412,412,412,412,412,412,412,412,412,412,412,412,412,2,412,412,412,412,412,2,412,412,2,2,412,412,412,412,412,412,412,2,2,2,2,2,2,2,2,412,2,412,412,412,412,412,2,2,2,412,412,412,412,412,2,2,2,2,2,412,412,412,2,412,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,412,412,412,412,2,2,2,2,2,2,2,2,2,2,2,2,2,412,412,412,412,2,2,2,2,2,2,2,2,2,2,2},
+ {657,233,108,38,147,53,136,168,408,477,477,279,268,289,2,2,2,2,2,2,289,2,2,2,2,2,2,2,2,289,289,2,8,8,266,2,2,213,584,584,584,118,584,289,289,289,289,289,289,289,289,289,289,289,2,289,276,276,289,289,276,289,289,2,289,289,289,289,289,186,186,39,39,39,650,650,650,454,454,454,454,78,372,477,477,477,266,266,266,266,276,268,276,276,276,276,276,289,289,289,289,268,289,289,289,673,291,731,53,53,53,673,673,673,673,673,81,81,81,547,258,133,133,289,289,289,268,268,268,268,268,268,268,268,268,289,289,289,289,289,289,689,689,216,98,39,17,17,268,618,618,618,98,98,194,268,268,268,268,46,268,268,268,268,268,268,268,276,276,268,289,268,268,276,276,276,276,289,289,201,201,289,289,201,289,201,201,289,289,289,289,289,289,289,289,289,289,289,289,268,289,240,240,240,268,268,268,268,268,18,18,289,18,790,790,790,790,790,18,9,9,9,347,140,140,18,201,657,657,778,778,221,778,778,778,778,268,268,268,404,240,240,240,404,289,268,404,268,201,201,201,735,735,735,735,735},
+ {498,431,217,101,78,143,111,113,181,825,458,140,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,79,79,79,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {660,624,376,472,165,66,158,308,492,779,305,305,2,576,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,465,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,465,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,465,465,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,465,465,465,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,465,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,205,205,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {521,249,388,155,467,245,134,311,72,312,312,623,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,263,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,530,530,530,530,530,530,55,55,55,263,263,263,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,263,530,55,2,2,2,530,55,2,2,2,530,581,2,581,581,581,581,2,2,2,2,2,2,2,2,2,2,2,530,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,55,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,263,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,55,2,2,2,55,55,55},
+ {408,348,216,299,302,668,347,63,172,141,272,168,678,2,2,2,512,2,2,2,2,4,2,2,2,494,64,64,64,128,16,512,512,512,494,494,494,2,2,512,512,512,2,457,454,30,30,15,15,15,153,153,153,227,227,454,153,153,153,577,577,577,577,108,108,108,108,170,170,108,292,168,21,21,21,292,292,292,148,292,441,441,292,633,299,108,216,216,108,216,561,561,443,561,82,82,110,29,29,29,151,151,151,151,116,116,116,116,116,488,488,155,488,155,155,155,262,262,262,262,262,155,638,526,526,292,209,209,209,638,638,526,526,526,526,726,638,726,209,526,526,526,526,526,526,398,500,125,125,125,623,623,623,623,623,623,623,159,159,245,245,245,245,159,159,159,159,159,318,318,245,318,318,318,318,318,526,526,526,526,252,526,318,318,318,526,318,116,116,116,561,232,232,232,82,82,262,526,29,29,151,151,151,151,488,488,116,448,448,448,448,448,448,448,448,14,448,259,448,18,6,18,3,3,3,530,756,530,162,299,56,56,56,56,56,201,756,756,756,756,756,371,371,638,371,371,371,371,756,48,48,526,756,756,756,756},
+ {669,421,230,70,212,845,237,347,148,76,823,472,2,2,2,132,2,2,2,2,2,2,2,383,132,383,2,2,383,383,383,383,383,383,383,383,383,383,383,383,383,383,383,383,383,383,383,243,243,243,2,243,296,383,383,383,383,383,132,132,132,132,2,2,132,132,132,2,2,132,132,132,2,2,2,2,2,2,383,243,243,243,132,132,132,132,132,2,2,2,2,2,2,2,2,2,2,2,413,413,2,383,383,2,2,2,437,437,2,2,2,2,2,2,2,2,2,2,2,2,2,383,383,2,2,383,383,383,383,383,437,437,2,132,132,2,383,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,28,2,2,2,405,602,602,344,344,344,344,344,590,28,28,512,2,170,170,296,170,2,2,2,2,2,2,81,132,383,2,2,383,383,383,383,383,383,296,296,383,383,383,383,383,383,81,81,81,81,81,81,81,81,81,81,81,81,383,383,383,81,132,132,132,132,2,2,132,132,132,2,2,413,413,413,413,413,413},
+ {693,530,139,82,780,416,270,278,330,484,484,200,2,2,2,2,137,94,2,2,2,2,2,2,2,2,484,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,484,484,2,2,2,2,2,2,2,2,2,439,439,439,2,2,484,484,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,484,484,484,2,484,439,2,439,439,439,439,2,2,2,439,439,2,2,2,2,2,484,2,2,484,484,439,2,2,2,439,2,2,439,2,439,2,439,439,2,2,2,439,439,2,2,439,439,439,439,439,439,439,439,2,2,439,439,439,439,439,439,439,439,439,439,439,439,439,439,439,439,439,439,439,2,439,439,439,439,439,439,439,439,439,439,2,2,439,439,439,439,439,439,439,439,439,439,439,2,2,2,2,2,439,439,2,2,2,2,439,2,2,2,2,2,2,2,2,2,439,439},
+ {672,150,164,622,196,75,302,119,42,314,314,132,60,60,60,298,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,298,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,298,298,298,2,2,2,2,2,2,2,2,2,2,2,298,298,2,2,2,2,2,182,182,182,182,182,2,2,2,2,2,54,54,2,2,2,54,2,298,2,2,2,2,2,2,2,2,2,2,2,191,2,2,2,2,2,2,2,2,2,2,2,2,298,298,2,2,2,298,191,2,2,2,2,2,2,191,191,2,2,2,58,58,2,58,58,2,2,2,2,2,2,2,2,2,2,2,2,2,298,2,2,2,2,2,2,191,191,2,2,2,2,2,2,2,2,2,2,58,182,182,182,182,182,182,2,2,298,2,2,2,2,2,2,2,182,2,2,2,2,2,2,182,298,2,298,54,54,298,298,298,2,298,298,298,298,298,298,298,298,298,298,182,298,54,298,54,54,54,2,298,298,298,298,298,298,54},
+ {705,302,411,705,691,160,809,40,32,867,826,826,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,43,285,285,2,285,2,2,2,2,2,2,2,2,2,2,2,405,405,405,2,2,2,405,405,405,405,2,2,2,2,2,2,2,2,2,2,2,2,2,405,405,405,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,43,2,43,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,405,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,43,43,2,2,2,2,43,2,2,2,2,43,43,43,43,43,43,43,43,2,2,2,2,2,2},
+ {684,229,138,46,407,399,82,254,267,31,31,45,2,209,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {707,323,409,27,31,157,492,463,886,412,251,251,304,190,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,304,304,2,2,304,304,304,304,2,2,2,304,304,304,304,304,304,2,2,304,304,304,304,304,2,304,304,2,2,304,304,304,304,304,304,304,304,2,304,2,304,2,304,304,2,304,304,304,304,2,2,304,304,304,304,304,304,304,304,304,304,304,304,2,2,2,2,304,304,304,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,685,685,2,2,685,2,2,2,2,2,2,304,2,685,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {715,521,636,304,402,459,435,571,611,214,214,43,43,358,2,2,2,2,358,2,2,2,2,2,2,358,358,358,2,2,358,358,358,2,2,2,2,2,2,2,2,2,2,358,202,2,2,202,358,2,2,2,202,2,2,2,2,2,2,202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,358,358,358,2,2,134,134,2,2,134,134,134,134,358,134,134,134,2,134,134,134,134,2,134,2,2,2,2,2,2,2,2,2,2,358,358,358,2,2,134,134,134,134,134,2,2,134,202,2,202,2,134,2,134,134,134,134,134,134,134,2,134,134,134,2,134,134,2,2,2,202,202,202,134,2,2,2,134,2,134,134,202,2,202,134,134,202,134,134,134,134,134,134,134,134,134,134,134,134,134,134,2,508,508,508,508,508,2,2,134,358,358,358,358,134,134,134,134,134,134,134,134,2,134,358,134,2,2,202,202,2,202,2,2,2,2,2,2,2,2,2,2,358,202,202,202,202,202,202,202,202,202,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {768,224,219,425,467,147,151,643,316,263,263,263,263,263,2,2,2,2,2,272,139,2,2,2,2,2,2,2,2,2,272,53,53,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,53,2,2,2,272,53,2,272,272,272,272,2,272,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,53,2,2,2,2,2,2,2,2,2,2,2,2,2,2,53,53,53,53,2,2,272,2,53,53,2,2,2,2,2,53,53,53,53,53,53,2,2,2,53,53,53,53,2,2,2,53,2,2,2,2,53,53,53,53,53,2,2,2,2,272,272,272,2,272,272,272,272,272,272,272,272,2,272,2,2,2,2,2,272,53,53,272,272,272,272,272,272,272,2,2,2,2,2,53,53,53,53,26,26,2,2,2,26,26,2,53,53,53,272,272,2,2,53,2,2,2,2,2,53,272,2,2,2,53,53,53,2},
+ {555,543,434,78,850,174,277,194,4,100,471,69,69,424,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,394,2,2,2,2,2,394,394,394,394,394,2,2,2,2,2,2,2,2,394,394,394,394,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,394,394,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,147,147,147,147,147,147,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,394,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,394,2,2,2,2},
+ {690,206,572,877,600,129,288,52,19,147,222,222,147,147,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,147,147,2,2,2,2,147,147,2,2,147,147,147,2,2,2,2,2,2,2,2,2,147,147,147,147,147,147,147,147,2,147,147,147,147,147,2,147,147,147,147,147,147,147,2,147,147,147,147,147,147,2,2,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,2,147,147,2,147,147,147,147,147,147,2,2,2,2,2,2,2,2,147,147,136,136,147,147,2,147,147,147,147,2,147,147,147,147,147,147,147,147,147,147,147,147,147,136,136,147,147,147,147,2,2,2,147,2,2,2,2,2,2,2,147,147,147,147,2,2,2,147,147,147,147,147,147,147,147,147,147,2,2,2,2,147,147,147,147,147,2,2,2,2,2,2,147,2,2,2,2,136,2,2,2,2,2,147,147,147,2,2,2,2,2,147},
+ {793,279,264,566,252,495,872,492,482,107,294,503,350,350,2,2,2,2,2,2,2,285,285,273,273,273,273,2,2,2,2,2,2,2,115,115,115,115,115,115,2,2,2,2,2,2,2,285,2,2,2,2,2,2,2,2,2,2,2,2,2,285,285,2,2,2,2,2,2,2,2,2,285,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,285,285,285,285,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,285,285,285,285,285,285,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,285,285,2,2,285,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,285,2,2,2,2,285,285,285,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,667,667,5,5,309,326,512,50,50,2,2,2,2,2,2,2,2,2,2,2},
+ {703,427,225,320,136,47,103,547,239,217,73,68,68,204,204,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,827,2,2,2,827,2,827,827,827,827,827,827,827,827,827,2,2,2,2,2,2,2,2,2,827,2,827,827,827,827,827,827,827,827,827,827,827,827,827,2,2,2,2,2,2,2,827,827,827,827,827,827,827,827,827,827,827,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {791,275,60,137,352,839,67,476,356,216,216,563,563,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,131,131,2,2,2,2,2,611,459,459,459,459,2,2,611,611,611,611,611,611,2,611,611,611,611,131,131,131,131,131,131,131,131,611,611,131,2,611,611,611,611,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,2,2,2,131,131,131,131,131,131,131,131,131,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,131,611,611,611,611,2,2,611,611,611,2,2,611,611,611,611,2,611,611,2,611,611,611,611,2,611,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,611,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,131,2,2,2,2},
+ {703,312,472,588,228,512,386,668,477,617,389,389,389,2,296,2,2,2,2,343,343,2,2,343,343,2,2,617,617,617,617,2,617,617,2,343,343,343,343,2,2,2,2,2,343,2,2,343,2,2,2,2,343,2,2,2,2,2,2,2,2,2,2,343,2,2,2,2,2,2,2,343,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,343,343,343,2,2,2,617,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,343,343,343,343,343,343,2,343,343,343,49,343,343,2,2,617,343,2,2,343,343,2,343,343,2,343,343,343,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,343,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,2,2,2,739,39,139,196,196,196,2,2,2,593,2,49,593,593,593,593,593},
+ {709,509,697,145,252,194,304,192,192,623,623,4,423,2,2,2,199,423,2,2,2,222,222,2,2,623,623,623,623,623,2,222,2,2,2,2,2,2,2,2,2,2,2,2,2,623,2,2,2,2,2,2,2,2,2,2,2,2,222,222,222,222,222,222,2,363,2,2,2,2,2,623,2,2,2,222,222,222,222,2,2,2,222,222,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,623,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,222,222,222,222,222,222,2,2,2,222,623,623,623,2,2,2,2,2,222,2,222,222,222,222,222,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,423,423,2,2,623,623,623,2,2,2,2,623,623,623,623,623,623,2,623,623,2,2,2,2,2,2,2,2,2,623,2,2,623,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {587,453,117,107,672,86,248,568,568,294,294,513,78,2,2,164,82,2,2,2,2,22,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,374,374,2,2,2,2,2,2,216,216,216,216,2,2,216,78,294,294,294,2,2,216,216,78,78,78,78,2,78,78,216,216,2,216,216,2,216,216,216,216,216,216,216,216,216,216,216,216,216,216,294,294,216,216,216,216,216,216,216,216,216,216,2,2,2,294,294,2,294,294,2,2,2,78,78,78,2,2,2,2,2,294,294,294,294,294,294,294,294,294,294,294,294,294,294,294,294,294,294,294,294,294,294,294,294,294,294,294,294,294,294,294,294,294,294,294,78,78,78,78,2,78,78,294,294,294,294,294,294,2,2,2,2,2,2,2,2,2,2,294,2,78,78,78,78,2,2,2,294,294,78,78,78,294,2,294,2,2,2,216,2,2,216,216,216,2,2,2,294,2,2,2,2,2,2,78,78,78,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {741,466,378,135,737,131,159,469,59,2,59,59,187,2,204,2,2,2,2,2,2,2,2,2,798,2,2,798,798,798,798,798,798,798,2,2,2,2,2,2,2,798,2,2,2,2,2,2,2,2,2,2,2,2,798,798,798,798,798,798,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,474,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,798,798,798,798,798,798,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {539,310,463,103,553,45,609,326,197,2,62,113,272,2,62,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,517,517,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,517,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,517,2,517,517,285,285,285,285,285,2,2,2,2,2,2,517,517,517,517,517,517,517,2,2,2,2,2,2,2,285,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,285,2,2,2,2,2,2,285,2,285,285,2,285,285,285,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,517,2,2,6,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,285,285,285,285,285,285,285,285,285,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {750,703,182,242,92,335,272,466,594,2,701,569,474,129,140,140,2,507,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,197,197,197,197,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,197,197,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,197,197,197,197,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {547,210,113,361,584,121,65,307,98,2,2,552,514,514,2,514,207,514,514,514,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,698,698,698,698,698,698,698,207,207,207,207,698,2,514,514,514,207,2,2,2,207,698,2,698,207,698,698,207,514,514,514,514,514,698,698,698,698,698,2,2,698,698,2,698,698,698,698,698,698,698,698,698,698,698,698,698,698,698,698,698,698,698,698,698,698,2,2,2,2,514,514,514,514,514,514,2,514,207,2,207,207,207,514,514,514,514,207,698,2,2,698,514,465,465,514,698,392,392,392,392,392,392,2,2,2,2,2,2,2,2,2,2,2,514,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,698,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,465,2,392,392,392,392,392,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,432,2,2,2,698,698,698,2,465,465,465,2,2,575,2,2,2,2,2,2,2,2,2,2,2,2,698},
+ {555,229,328,91,272,815,483,749,468,2,92,92,4,92,2,2,2,258,258,258,2,258,258,2,2,2,2,258,2,2,258,258,258,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,258,258,258,258,2,2,2,2,2,2,2,2,2,2,2,258,2,2,2,2,2,258,2,258,2,2,2,2,2,2,258,258,2,2,2,2,2,258,258,58,58,258,258,258,258,258,258,258,258,258,258,258,92,258,258,258,258,258,258,258,258,258,258,258,258,258,258,258,258,258,258,258,258,258,258,258,258,258,258,258,258,258,258,258,258,258,258,258,258,258,58,58,58,58,58,58,58,58,258,258,258,258,258,2,2,2,258,58,2,92,92,855,855,855,258,258,258,258,258,258,258,258,58,58,58,58,476,2,855,855,2,855,2,2,2,2,2,2,2,2,2,2,2,58,58,58,58,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,92,92,92,2,258,258,2,2,2},
+ {580,145,358,434,630,73,604,366,366,2,2,398,398,207,2,207,487,2,2,487,207,2,2,207,207,207,2,2,2,2,207,207,2,2,207,207,207,207,207,487,207,2,2,2,2,2,2,2,207,207,207,207,207,2,2,2,2,2,2,2,2,2,2,2,2,2,207,207,2,2,2,2,2,2,2,2,2,2,2,207,207,2,2,2,2,207,487,487,487,2,2,2,2,2,2,2,2,2,487,2,2,2,2,2,487,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,207,487,2,207,207,2,2,487,207,2,2,2,207,487,2,487,487,2,2,207,2,2,487,487,487,487,487,2,487,2,2,2,487,2,2,2,487,2,2,207,207,2,2,2,207,207,207,207,207,207,207,207,487,2,207,207,207,207,487,207,487,207,2,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,2,2,207,207,2,2,2,487,2,207,207,207,2,487,2,2,487,487,487,487,2,2,207,207,207,207,207,207,207,207,487,2,2,2,2,2,2,487,487,2,2,2,2,2,2,2,2,2,2},
+ {457,520,93,460,275,525,300,184,354,147,147,147,147,179,82,82,82,82,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {872,630,513,218,719,174,197,104,86,281,281,281,541,642,281,94,2,45,94,2,335,335,2,2,2,2,2,2,2,2,2,84,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,94,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,94,94,94,94,2,2,2,2,2,281,281,2,2,2,2,2,2,2,2,2,281,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,281,84,84,2,2,2,2,2,2,2,2,2,2,2,2,281,281,2,2,2,2,2,281,2,2,2,2,2,281,281,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {765,421,129,298,867,365,222,476,401,142,90,22,22,88,226,657,2,2,477,2,2,2,2,2,226,226,2,226,2,2,2,226,2,2,226,226,226,226,2,226,226,226,226,226,2,226,226,226,226,2,2,2,2,2,226,2,2,2,2,226,226,142,142,142,142,226,226,226,226,226,226,226,226,299,299,226,226,226,226,299,2,299,226,226,226,299,2,2,2,2,226,226,2,2,226,799,799,226,226,477,226,142,142,142,142,799,799,799,2,226,226,226,477,2,226,226,226,226,226,2,2,2,2,2,32,2,2,32,2,2,2,2,2,4,4,4,348,348,226,142,2,2,2,149,231,231,231,231,231,231,174,364,142,142,141,141,46,46,46,67,299,299,2,2,2,299,46,46,799,799,799,799,799,370,142,2,2,936,936,936,936,936,936,226,226,226,226,299,299,299,299,936,936,936,936,299,299,299,299,299,299,299,299,299,142,799,799,799,799,799,799,799,799,799,799,799,799,799,799,799,799,799,799,799,799,799,799,799,799,799,31,31,299,299,299,31,299,31,31,31,31,31,157,157,31,299,299,31,299,299,299,936,31,31,31,31},
+ {833,634,228,520,113,329,279,420,581,2,2,385,385,110,450,2,733,2,2,2,561,561,2,561,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,561,561,2,2,2,2,561,561,2,561,561,2,2,561,561,561,561,561,561,561,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,561,561,2,2,2,2,2,2,2,2,2,2,2,2,561,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,120,189,323,323,286,286,2,388,388,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,385,2,2,2,2,2,2,2,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123},
+ {587,553,360,539,227,800,312,143,536,2,2,2,64,64,64,2,2,2,179,179,493,2,2,184,184,184,58,2,2,2,493,493,179,179,179,179,179,179,179,179,179,179,179,179,179,2,2,184,184,184,179,179,179,493,493,493,55,2,184,2,363,363,363,363,2,363,2,2,2,179,2,2,2,2,480,2,2,480,480,480,2,2,2,2,363,363,363,363,363,363,2,2,2,2,2,2,2,2,2,363,363,363,363,363,363,363,363,55,55,55,2,821,821,184,184,184,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,458,2,2,493,493,493,2,2,343,343,289,219,219,69,69,493,493,2,493,493,493,493,493,493,493,493,493,493,493,493,493,493,493,493,493,493,493,493,179,179,179,493,493,493,410,821,493,55,410,410,179,179,179,493,493,179,179,179,179,179,179,179,179,179,179,493,179,179,179,179,179,179,179,493,493,493,493,493,493,493,493,493,493,493,493,493,493,493,493,493,179,493,493,493,493,493},
+ {744,466,389,280,229,134,363,177,389,2,2,2,536,273,536,536,536,536,168,45,45,45,45,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,45,2,2,2,2,2,2,2,2,2,2,2,2,2,45,2,2,45,2,2,2,2,2,2,2,2,2,45,45,45,45,45,45,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,203,203,203,203,2,2,2,2,2,2,2,2,2,2,2,2,45,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,45,45,45,45,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,45,45,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,45,45},
+ {841,222,158,469,253,91,347,241,766,2,2,2,88,88,88,439,439,439,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,626,2,2,626,2,626,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {462,653,478,67,269,150,474,711,220,669,669,669,669,669,390,352,325,2,229,545,545,545,545,545,545,545,545,2,545,352,309,352,352,352,352,352,2,2,2,352,2,2,545,545,2,2,2,2,2,2,2,2,2,2,2,2,352,97,2,2,2,2,352,352,352,2,2,2,352,352,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,352,352,2,2,669,2,352,2,352},
+ {468,430,849,689,202,427,45,34,105,2,2,2,2,4,4,4,4,4,4,4,2,2,2,4,4,4,4,4,2,2,2,2,2,143,143,2,2,2,143,143,2,237,237,2,2,2,2,2,237,2,237,237,237,143,143,143,143,143,143,143,143,143,143,143,143,143,143,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,143,2,2,143,143,143,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {610,289,503,744,775,512,605,454,484,2,2,2,444,466,145,631,2,631,631,631,631,631,631,631,631,631,2,2,631,631,631,858,631,631,631,631,631,631,631,631,631,631,631,2,2,631,631,631,631,2,2,631,631,2,631,631,631,631,2,2,631,631,631,2,858,631,631,2,2,631,2,631,631,2,2,631,631,631,631,631,631,2,631,631,631,631,631,2,631,631,631,2,2,631,631,631,2,2,631,631,631,631,631,631,631,631,631,631,631,631,631,631,2,2,631,631,2,2,631,631,631,2,2,2,631,631,631,631,2,631,631,631,631,631,631,2,2,631,631,631,631,631,631,631,631,631,631,631,631,631,631,631,631,631,631,631,631,631,2,631,631,631,631,631,631,631,631,631,631,631,631,2,631,631,631,631,631,631,631,631,631,631,446,631,2,631,631,631,631,631,631,631,631,2,2,631,631,631,2,153,631,631,631,631,631,631,631,631,631,2,2,201,201,201,201,201,201,631,201,201,631,631,631,631,631,631,631,858,201,153,201,631,631,631,2,631,631,631,153,153,153,153,153,631,631,153,631,153,153,631,631,631,631,631,631,631},
+ {792,169,306,843,246,123,293,229,483,2,2,2,165,163,163,163,163,440,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,283,2,2,2,2,2,2,2,2,2,2,2,2,2,2,318,318,318,283,283,283,283,283,2,2,283,283,283,283,283,283,2,2,2,283,283,283,318,318,2,318,318,318,318,2,2,2,318,318,318,2,318,318,318,318,318,318,318,318,318,318,318,318,318,318,283,283,318,318,318,318,318,283,283,283,283,283,318,318,318,318,318,318,318,318,318,318,318,2,283,318,318,318,318,318,318,2,318,318,318,318,318,318,2,2,2,2,2,2,2,2,2,408,408,408,408,408,2,2,2,408,2,2,2,408,2,2,2,2,2,2,2,318,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,283,283,283,283,283,283,283,283,283,283,283,318,283,318,318,318,318,318,318,2,2,2,2,2,408,2,318,318,318,408,2,2,2,2,2,318,318,318,2,2,2},
+ {563,325,717,766,440,705,290,123,228,2,2,2,32,64,146,2,2,2,116,79,79,2,146,146,79,79,79,2,2,146,146,79,79,2,435,435,435,435,435,2,2,2,2,435,435,2,2,2,2,146,2,2,2,2,2,79,79,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,146,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,79,2,2,2,2,2,2,2,79,79,79,79,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,133,2,2,133,133,133,133,133,133,133,2,2,2,2,79,133,79,79,79,435,2,146,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,79,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,79,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {795,185,350,211,82,537,106,680,62,2,2,537,423,423,423,2,2,501,501,2,501,2,501,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,268,268,2,2,2,268,2,501,2,2,501,501,2,2,2,501,501,501,2,501,2,501,2,501,501,2,2,2,2,2,2,2,2,2,501,501,2,2,2,2,2,2,2,2,2,2,2,2,501,2,501,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,501,2,2,2,2,501,501,501,501,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,501,2,2,501,501,501,2,501,501,2,2,2,2,2,2,2,2,501,501,501,2,2,2,2,2,2,2,2,2,2,2,2,2,501,2,2,2,501,2,2,2,2,2,2,2,2,2,501,501,2,2,501,501,501,501,501,501,501,501,501,501,501,501,501,501,501,501,501,501,2,2,2,501,501,501,501,501,501,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {633,425,295,548,497,163,381,461,89,2,2,831,583,896,38,2,625,2,2,2,276,276,2,2,276,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,276,276,276,2,276,276,276,276,276,276,276,276,276,276,2,276,276,276,2,2,2,276,276,276,276,276,276,276,276,276,276,276,276,2,276,276,276,276,276,276,276,276,276,276,276,276,276,276,276,276,276,276,276,276,276,276,2,276,276,276,276,276,276,2,276,276,276,276,276,276,276,276,2,276,2,2,276,276,276,276,2,276,2,2,2,276,276,276,276,276,276,276,276,276,2,2,2,276,276,276,276,276,276,276,276,2,276,276,276,276,276,2,2,2,2,2,2,2,2,2,2,2,276,276,2,2,569,569,569,569,569,569,569,569,2,2,2,276,276,2,2,2,276,276,2,2,2,2,2,2,276,276,276,276,2,2,276,276,276,276,276,276,276,276,276,276,276,276,276,276,276,276,276,276,276,2,276,276,276,276,276,276,276,276,2,276,276,276,276,276,276,276,2,2,2,276,276,276,276,276,276,276,276,276,276},
+ {767,318,84,97,208,387,423,196,417,2,396,396,396,396,396,128,128,2,2,2,328,328,4,4,4,4,101,2,2,328,82,16,16,16,16,244,244,221,128,128,221,128,128,128,128,346,221,221,221,221,221,244,244,244,221,221,45,45,180,180,274,325,122,325,244,45,221,221,221,221,221,346,221,221,221,221,221,221,314,705,705,413,413,413,85,85,85,467,221,698,811,958,221,811,811,698,698,221,221,811,811,811,101,101,101,307,307,307,307,307,672,212,212,21,21,21,212,143,148,148,21,53,53,672,296,558,296,296,42,558,42,221,891,221,390,390,390,390,390,390,390,390,390,120,120,120,390,390,120,390,53,53,53,53,53,53,53,53,53,53,53,307,195,250,250,250,250,250,399,399,250,27,27,27,125,125,125,125,125,125,125,195,195,195,195,195,195,195,195,195,195,195,195,387,387,387,387,195,195,27,585,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,144,651,651,144,144,651,651,120,120,21,21,212,143,120,390,390,120,120,120,100,100,100,100,18,18,18,100,100,100,100,100,100,351,520,18},
+ {802,533,869,638,67,192,805,223,219,2,2,191,178,178,77,77,2,2,2,2,431,431,2,2,2,431,431,2,2,431,2,2,77,2,431,2,2,2,2,2,2,2,2,2,116,2,2,2,431,431,2,431,431,77,77,77,77,431,431,431,431,77,431,431,431,431,431,431,431,2,2,2,2,2,431,431,2,431,431,431,431,431,431,431,431,431,431,431,431,431,2,2,2,2,431,431,2,2,2,431,2,2,2,2,2,2,2,2,431,431,431,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,431,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,431,2,2,431,431,2,431,431,431},
+ {781,638,410,399,336,465,856,426,28,2,4,4,6,6,2,2,2,449,372,372,449,449,449,2,2,449,449,449,449,449,449,2,2,372,372,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,372,449,2,2,2,2,449,449,2,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,2,2,2,449,449,449,449,449,449,449,2,2,449,449,449,449,449,449,449,2,449,449,449,449,449,449,449,449,2,2,2,449,449,449,449,449,2,2,449,449,449,2,2,449,2,449,449,449,449,2,2,449,449,449,449,449,449,2,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,2,2,2,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449},
+ {807,377,237,443,388,286,158,349,491,32,32,260,260,260,2,2,260,615,615,615,2,2,260,260,260,260,260,615,615,615,615,615,32,32,260,260,260,639,639,86,86,43,43,43,539,539,539,539,539,539,539,539,539,539,152,152,152,315,315,315,315,315,38,38,38,38,674,38,38,38,608,608,837,608,608,608,219,219,219,219,219,275,275,607,729,85,85,85,729,607,597,275,721,721,35,254,655,254,254,254,254,254,254,254,254,254,254,535,859,535,859,859,859,859,331,331,859,394,394,162,162,162,162,254,254,254,254,254,150,35,35,35,479,197,183,183,183,183,183,183,183,183,183,162,70,70,70,183,183,183,183,183,183,183,279,967,967,967,967,166,166,166,166,333,358,279,349,349,358,358,391,358,166,27,27,27,216,391,236,53,53,717,917,917,535,717,717,717,717,717,781,657,717,717,657,657,38,38,674,674,219,674,608,254,162,162,162,162,162,162,162,769,769,769,769,254,769,254,418,254,254,254,254,254,254,254,254,254,254,254,254,254,201,201,201,201,201,201,201,201,201,201,201,227,466,201,201,201,201,201,227,977,977,227,977,294},
+ {780,359,766,618,41,596,86,636,287,707,707,96,49,373,613,373,2,2,2,2,2,2,2,613,613,613,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,613,613,613,613,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,613,613,613,613,2,613,613,613,613,613,613,613,613,613,2,2,2,2,2,2,2,2,2,613,613,613,613,613,613,613,613,2,2,2,2,613,613,2,2,613,613,613,613,2,2,613,613,613,613,613,613,613,613,613,2,2,2,2,2,2,2,2,2,2,2,613,613,2,2,2,2,2,2,2,613,613,613,613,613,613,613,613,613,613,613,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,215,215,613,613,2,613,613,127,127,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,613,613,2,2,2,2,215,215,2,2,2,2,613,215,215,215,215,2,2,2,2,2,2,2,2,215},
+ {788,497,334,93,319,169,273,540,904,2,903,569,569,569,272,272,2,2,2,2,571,571,571,571,571,571,571,571,571,571,571,571,571,571,571,571,571,571,571,571,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,571,2,2,571,2,2,2,2,2,2,2,2,2,2,2,2,571,571,571,2,2,571,571,571,571,2,2,571,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,571,2,2,2,2,2,2,2,2,2,2,2,2,2,571,571,2,2,571,571,2,571,571,571,2,571,571,571,571,2,571,571,571,571,571,571,571,571,571,571,571,571,571,571,571,571,571,571,571,571,571,2,2,571,2,2,571,2,2,571,571,571,571,2,571,571,2,571,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,571,2,2,2,2,2,2,2,571,571,571,571,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {622,309,913,550,994,90,257,588,29,526,526,526,496,496,576,2,2,2,2,2,182,182,182,2,2,447,447,447,447,447,447,182,182,447,447,447,447,2,447,447,447,2,2,447,447,2,2,2,447,447,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,182,182,2,2,182,447,182,182,447,447,447,447,447,447,447,447,447,447,447,447,447,447,447,447,447,447,447,447,447,2,2,447,447,2,447,447,447,447,2,2,2,2,2,2,2,2,2,2,2,2,447,447,447,447,447,2,2,2,2,2,2,2,2,2,2,2,447,447,447,447,447,447,447,447,447,447,182,447,447,447,447,447,182,447,447,447,447,447,447,447,447,447,447,447,447,447,447,447,447,447,447,447,447,447,447,447,447,447,447,447,447,447,447,447,447,447,447,447,447,447,447,447,447,447,447,447,447,447,447,447,447,447,447,447,447,447,447,447,447,447,447,447,447,447,447,447,2,2,2,2,2,2,2,2,447,2,2,2},
+ {814,652,456,774,624,870,27,739,464,2,108,578,578,561,295,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,650,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,650,650,2,650,650,650,2,2,2,2,2,650,650,650,650,650,650,2,2,650,650,650,650,650,650,650,650,650,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {818,280,99,873,165,426,341,74,479,342,727,684,684,662,662,2,2,2,2,2,2,662,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,203,203,32,203,203,203,95,256,256,2,2,906,700,700,710,88,88,798,2,710,710,710,710,710,710,710,798,2,2,710,283,2,2,2,2,2,2,2,2,2,710,710,710,710,710,2,88,88,88,2,2,203,203,710,710,798,798,798,710,710,88,88,88,88,88,88,88,88,88,88,798,88,88,88,798,798,798,88,88,88,88,88,798,798,88,88,88,88,88,88,88,88,88,88,360,355,88,645,22,11,11,11,106,236,106,106,333,22,412,412,412,412,797,412,412,797,797,11,797,797,797,798,797,798,798,798,798,798,88,798,798,798,798,88,798,798,798,798,798,798,798,798,798,798,798,798,798,798,798,798,798,798,798,710,710,798,323,798,323,323,323,323,798,798,183,323,323,627,323,183,183,323,710,323,710,710,710,710,710,183,183,183,323,283,283,283,183,88,88,627,627,627,627,183,710,710,183,46,798,627,627,88,798,627,88},
+ {593,411,953,203,89,57,785,354,349,424,424,707,707,707,829,2,2,2,2,2,670,670,670,2,2,424,424,424,2,2,670,424,424,424,424,424,424,424,424,424,424,670,670,2,670,2,670,2,670,2,2,670,670,2,2,2,2,2,670,2,2,2,2,2,2,2,2,2,2,670,670,2,670,670,670,670,670,2,2,670,670,670,670,670,2,670,670,670,670,2,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,79,2,2,2,670,670,670,670,670,670,670,670,670,670,670,670,670,2,2,2,2,670,670,670,670,2,2,2,2,2,2,2,2,2,2,2,2,2,2,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,670,2,2,2,2,79,2,670,670,2,2,2,2,670,670,670,2,2,2,79,79,2,2,2,2,2,2,2,2,2,2,2,2,670,670,670,670,670,2,2,2,2,2,2,2,2,670,670,670,670,2,2,2,670,670,670,670,670,670,670,670,670,670,670,2,670,670,2,2,79,2,424,424,424,670,2,2,2,2,2,2},
+ {629,560,621,245,683,633,495,551,472,2,31,74,489,684,555,684,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,123,684,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,684,684,684,684,123,123,123,684,123,123,123,123,123,123,123,2,123,123,684,684,2,684,684,123,123,123,123,123,123,123,123,123,684,123,123,123,123,2,2,123,123,123,123,123,123,684,684,684,123,123,123,123,123,123,123,123,684,684,123,684,684,123,123,684,2,123,123,123,123,123,123,123,123,684,684,123,684,684,123,123,123,123,123,123,123,684,684,684,684,684,684,684,684,684,684,684,684,123,123,123,684,684,123,684,123,2,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,684,123,123,123,123,123,123,123,123,123,684,684,123,123,2,2,2,2,123,684,684,684,684,684,684,684,2,684,2,123,123,684,123,684,2,2,123,2,2,2,2,684,684,123},
+ {901,490,693,410,666,119,703,593,201,61,70,70,774,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,418,418,418,418,418,418,418,2,2,2,418,2,2,2,2,2,2,2,2,2,2,682,682,682,682,464,464,464,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,464,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,464,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,464,2,2,2,2,464,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,418,418,418,2,2,2,2,2,418,418,418,418,418,418,464,418,418,418,418,418,418,2,418,418,2,418,2,2,2,2,2,418,418,418,2,418,418,418,418,2,464,464,464,464,464,418,418,418,418,418,464,464,464,418,418,418,418,418,418,418,418,418,464,418,418,418,418,418,418,464,464,464,418,418,464,418,418,418,2,42,42,418,418,418,418,464,2,418,33,2,2,2,418,418,418,418,2,2,2,418,418,2,2,464,464},
+ {669,321,391,548,189,157,337,42,796,871,276,622,30,2,2,2,2,2,2,2,580,580,107,2,2,2,2,2,434,434,434,434,434,434,2,75,434,434,434,434,2,434,434,434,434,2,2,2,2,2,655,2,2,2,2,2,107,107,107,107,206,206,107,107,107,107,580,655,655,2,107,107,107,107,655,655,655,655,655,434,434,434,434,434,434,434,580,580,580,580,580,434,434,434,434,434,434,434,434,434,434,434,434,434,434,434,434,434,434,434,434,434,434,434,75,434,434,434,434,434,580,434,434,248,248,248,434,434,434,434,434,434,580,580,580,248,166,166,166,655,655,434,434,580,2,580,580,580,580,580,2,2,580,580,580,580,580,655,655,655,655,655,655,655,206,206,206,434,434,434,434,434,434,434,434,434,434,434,434,434,434,434,434,434,434,434,434,434,434,434,434,434,434,434,434,434,434,434,434,434,434,434,434,2,434,434,434,652,655,434,107,107,107,107,107,107,107,107,434,434,434,652,652,434,434,434,434,434,434,2,434,434,107,580,434,75,75,434,434,2,434,434,434,434,2,206,2,2,2,2,655,2,2,2,2,2},
+ {610,236,633,300,681,358,72,281,148,466,466,283,275,2,386,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,374,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,47,47,2,2,2,2,2,2,2,2,2,2,2,2,2,47,2,2,2,47,47,2,47,2,2,47,2,2,2,47,47,47,47,47,47,47,47,47,47,47,2,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,386,386,386,386,386,386,386,386,386,2,2,2,386,386,386,386,47,47,2,47,374,374,374,374,374,374,374,374,374,47,47,47,47,47,47,47,78,47,2,2,47,47,374,47,374,374,374,374,374,374,374,374,374,374,374,374,47,47,47,47,47,374,374,374,2,2,374,374,374,47,47,47,47,374,374,374,386,386,374,374,374,374,374,374,374,374,374,374,374,374,374,374,374,374,120,120,120,120,374,374,386,386,386,386,386,386,374,374,374,120,120,120,120,120,716,374,374,374,374,716,716,716,716,716,120,374,374,120,120,374,374,374,120,120,120,120,47,47,47},
+ {929,360,102,893,329,136,515,33,170,581,268,35,777,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {859,584,475,745,506,900,40,869,143,612,175,275,209,12,12,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,666,2,2,2},
+ {822,581,76,382,72,347,964,324,137,61,61,28,623,351,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,198,198,198,198,198,198,2,2,2,198,198,198,198,198,198,198,198,198,198,198,2,198,198,198,198,198,2,2,2,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,156,156,198,156,156,156,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,156,198,2,2,2,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,156,156,156,198,156,198,156,198,156,156,198,198,198,2,2,198,198,156,156,156,198,198,198,198,198,198,198,198,198,234,156,156,156,156,156,156,156,156,156,156,198,198,198,198,198,198,198,198,198,156,156,234,234,234,234,234,234,198,234,234,234,234,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,2,198,198,198,198,198,198,198,198,198,198,198,198,198,198,234,2,234,234,234,234,234,234,198,198,198,198,198,156,156,198,198,198,234,198,234,234,2,2,2,2,198,198,198},
+ {655,330,324,151,166,431,58,174,142,115,1003,66,724,778,2,2,2,503,503,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,503,503,2,503,503,503,2,2,2,503,2,2,2,2,2,2,2,2,2,503,503,503,503,503,2,503,503,503,503,503,503,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,744,2,744,2,2,2,2,2,2,2,2,2,2,503,2,2,2,2,503,2,2,2,2,2,2,2,2,2,2,2,2,744,744,744,744,744,2,2,2,2,2,2,2,2,2,2,744,744,744,2,2,2,2,2,2,2,2,503,503,503,503,503,2,503,503,503,744,744,744,2,744,744,744,744,744,744,503,503,503,503,503,744,503,503,503,503,503,503,2,2,2,744,503,503,503,503,503,503,503,503,503,2,503,2,503,503,503,503,503,503,2,2,2,503,503,2,503,503,503,503,503,503,503,2},
+ {867,820,301,252,61,331,105,309,562,218,365,326,768,672,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,58,104,2,2,2,35,35,104,35,2,35,2,2,2,58,58,58,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,791,791,2,104,104,104,104,58,58,58,58,297,297,2,2,2,2,2,2,2,2,2,58,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,58,58,58,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,104,104,104,2,58,2,2,2,104,104,104,104,104,104,2,104,104,104,2,2,104,104,104,104,104,104,104,104,104,2,104,104,104,2,2,104,104,2,2,104,104,104,791,791,791,791,104,104,791,2,2,104,104,104,104,2,2,2,2,2,2,2,2,58,104,104,104,104,104,104,58,58,58,58,2,2,2,58,2,2,58,104,104,104,104,104,2,58,58,2,2,2,2,2,58,58,58,104,104,104,58,104,58,58,58},
+ {623,330,182,489,212,223,741,490,40,412,801,681,681,801,2,2,71,2,2,2,2,2,2,427,2,2,2,2,2,2,2,2,2,2,2,427,2,427,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,209,209,209,209,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,99,2,2,2,2,2,2,2,71,2,2,2,2,2,71,2,2,71,2,2,71,71,71,71,71,71,2,71,71,71,71,71,2,2,2,71,71,71,71,71,71,71,71,71,2,71,71,71,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,746,746,2,2,2,2,2,2,2,2,427,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,427,427,427,427,427,2,2,746,746,2,2,71,2,2,2,71,71,71,71,71,71,2,2,529,529,746,746,746,746,2,2,2,746,2,427,2,2,2,2},
+ {859,844,510,859,118,190,550,29,159,622,622,382,258,382,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,654,2,2,2,654,654,2,2,2,2,2,2,2,2,2,2,2,2,2,2,101,101,2,2,2,2,101,2,2,2,2,2,2,2,2,2,2,2,2,2,654,2,654,654,654,2,2,654,654,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,101,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,182,182,182,182,2,2,2,2,2,2,2},
+ {612,237,272,53,534,682,372,935,494,536,536,599,599,599,2,536,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,689,689,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,689,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {843,730,235,233,816,495,598,134,131,604,227,378,378,553,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,139,139,2,139,2,2,604,2,2,2,604,604,2,2,2,139,2,2,2,604,139,139,139,139,139,139,139,2,2,2,604,604,604,604,604,604,139,604,604,2,2,2,2,2,2,2,604,604,604,2,2,2,2,604,2,2,604,604,604,604,2,2,2,2,2,2,2,604,604,604,604,604,604,604,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,139,139,2,139,139,2,2,2,2,2,139,2,2,139,2,2,2,139,139,2,2,2,2,139,2,2,2,2,2,2,2,139,2,2,2,2,2,2,2,2,2,2,139,139,139,2,2,2,2,2,2,2,2,139,2,2,2,2,2},
+ {667,397,121,526,321,660,848,729,357,137,268,711,521,521,2,2,2,2,2,2,2,2,2,2,2,2,2,194,2,2,2,521,2,2,2,194,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,194,2,2,2,2,2,2,2,535,535,2,2,2,2,2,2,2,2,2,2,2,2,2,787,787,461,787,787,437,437,521,521,521,521,521,521,521,521,521,521,521,521,521,2,521,521,521,521,521,521,521,521,521,521,521,521,521,521,521,521,521,521,521,521,521,521,535,535,521,521,535,535,535,521,535,521,521,521,521,521,521,521,521,521,521,521,521,521,521,521,521,521,521,521,521,521,521,521,521,521,521,521,521,521,521,521,521,521,521,521,521,338,338,338,110,33,33,33,238,180,238,377,559,132,584,584,577,180,180,577,521,521,238,137,521,521,521,521,521,240,240,794,794,521,521,521,137,137,521,521,521,521,521,521,521,137,137,137,137,535,137,137,137,535,535,535,137,240,535,535,535,535,240,240,240,535,521,521,521,521,521,535,535,535},
+ {939,783,796,676,259,643,103,289,15,471,80,80,2,239,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,888,888,888,888,888,888,888,888,888,471,471,2,2,2,2,2,2,2,2,2,2,488,2,2,2,2,2,2,471,471,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,78,471,471,2,2,471,471,2,2,471,471,471,471,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,471,2,2,471,2,2,2,2,2,2,2,2,2,2,2,2,2,2,714,2,714,471,471,471,2,2,2,78,78,78,471,471,471,471,471,471,471,471,471,2,2,714,714,2,471,78,78,471,471,471,471,471,471,471,471,714,714,714,714,893,714,893,893,893,2,888,714,714,19,2,2,714,714,2,714,714,714,2,714,714,2,2,714,2,2,2,78,78,471,2,2,714,2,2,2,2,714,2,2,2,2,714,714,714,714,714,714,714,714,714,714,714,714,714,714,714,714,714,714,714,714,714,78,714,714,714,714,714,2,78,78,714,714,2},
+ {670,595,333,257,907,413,548,341,327,350,612,700,700,700,700,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,224,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {678,274,695,790,169,701,707,1084,470,123,846,846,217,121,317,2,2,2,83,83,83,83,83,83,83,83,83,2,2,2,2,2,217,217,217,217,217,217,217,83,217,217,217,217,217,217,217,217,2,2,52,52,52,2,217,83,217,217,217,217,83,180,180,180,180,180,180,180,180,180,180,2,2,2,2,217,217,83,52,52,52,2,217,217,217,242,242,242,242,242,2,217,52,52,52,2,52,217,217,217,217,52,337,337,337,337,337,2,217,217,217,2,2,2,217,217,217,217,217,217,217,217,217,2,317,317,317,2,52,217,52,52,2,2,52,52,2,2,2,2,2,2,2,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,217,217,2,2,217,217,2,2,2,2,2,2,2,217,217,217,217,217,217,217,217,217,217,217,2,2,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,52,52,2,2,217,2,2,217,2,2,2,217,217,2,217,217,2,2,2,217,2,2},
+ {877,181,375,79,199,256,223,295,135,371,395,354,2,307,944,2,813,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,734,734,734,2,2,2,2,2,2,2,2,2,2,2,813,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {882,417,475,424,311,646,346,207,74,157,590,356,2,2,324,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,34,34,34,34,34,34,34,2,2,2,2,2,2,2,2,2,2,2,34,34,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,34,34,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,34,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {708,442,186,698,345,103,687,463,163,416,416,107,2,2,2,375,375,416,6,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {865,675,786,568,112,197,225,348,372,497,215,215,2,2,2,2,159,159,150,224,224,141,2,2,2,2,141,141,141,141,141,141,141,2,2,2,2,2,2,2,264,264,264,264,2,141,141,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,141,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,141,2,2,141,2,2,2,2,2,2,2,2,2,2,2,141,141,141,2,2,2,2,141,141,141,141,141,2,141,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,141,141,141,141,2,2,141,141,2,2,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,2,141,141,141,141,2,141,141,141,2,2,2,141,2,2,141,141,2,141,141,141,141,141,141,141,141,141,141,141,2,141,141,141,141,141,141,141,141,141,2,2,2,2,141,141,141,141,141,141,141,141,141,141,141,141},
+ {844,244,672,489,839,263,14,233,422,392,8,392,2,2,2,2,2,2,815,815,815,815,257,257,105,105,2,2,2,815,815,815,815,815,2,2,257,257,257,815,815,815,815,815,815,815,815,105,815,815,105,105,105,105,105,815,105,815,815,815,815,815,105,105,257,257,105,105,815,815,815,815,815,257,257,257,257,257,257,815,257,257,105,105,105,815,2,105,105,105,105,105,105,105,105,2,17,17,105,105,2,2,815,815,17,257,105,105,105,105,105,105,105,17,2,815,105,105,105,2,2,2,257,257,105,105,257,257,105,2,2,2,2,2,2,2,2,2,105,105,2,2,2,2,105,105,105,2,2,105,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,815,815,815,815,815,815,815,2,2,2,2,2,2,2,2,2,815,2,2,2,2,815,815,815,815,815,815,815,815,815,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {693,726,117,167,535,725,224,78,716,100,460,299,2,2,2,2,921,744,2,2,2,2,2,378,2,2,178,178,178,2,178,178,2,2,2,2,2,2,2,2,2,2,178,178,2,2,2,2,2,2,2,2,2,2,2,178,178,178,178,178,178,2,2,2,175,2,2,2,2,178,178,178,178,178,395,2,378,378,175,175,178,178,2,178,178,178,178,178,178,178,178,178,178,2,2,178,178,178,178,178,178,178,178,178,178,178,178,178,178,2,2,178,2,2,2,2,2,2,395,395,395,395,395,2,2,178,178,395,178,178,395,395,178,178,178,178,178,178,178,178,178,178,178,178,178,2,2,2,2,2,2,2,178,178,178,2,2,178,178,231,178,231,2,2,395,395,178,178,2,2,2,178,178,178,178,2,231,395,395,395,395,178,178,178,395,2,231,178,178,178,231,231,2,231,231,437,395,395,395,437,437,437,178,178,178,178,2,437,2,178,178,178,2,2,2,2,2,2,2,2,178,178,2,2,2,2,2,2,2,178,2,2,2,2,178,2,2,178,178,2,2,2,2,178,2,2,2,2,178,178,2,178,178,2,2,2},
+ {898,559,396,742,51,143,411,221,116,756,756,756,2,2,2,701,701,2,2,2,2,240,225,256,322,322,240,240,240,240,240,322,2,2,322,322,240,240,240,240,240,2,120,8,745,2,2,120,120,303,303,60,60,60,128,128,60,8,60,4,745,745,745,745,2,2,745,745,745,745,745,745,256,256,256,256,256,704,704,704,704,704,745,745,745,745,704,704,704,704,704,704,2,2,704,704,704,754,754,754,745,745,704,745,745,745,745,745,745,745,745,745,745,745,745,745,745,745,745,745,745,745,745,754,754,754,754,754,754,754,754,745,754,754,754,745,745,745,745,745,745,745,745,745,745,704,754,745,745,745,745,745,704,745,745,745,745,745,745,745,754,754,754,754,754,754,754,745,754,745,745,745,745,745,745,745,745,131,131,754,754,754,754,754,754,754,745,745,745,745,704,704,704,704,704,704,704,704,704,34,34,704,704,704,704,704,704,704,704,754,745,745,745,745,745,754,754,754,745,745,754,745,745,578,578,578,578,571,571,548,22,44,11,11,11,262,262,491,228,228,228,624,624,624,624,624,737,737,624,624,624,774,774,134,134,352},
+ {697,540,358,391,932,309,103,73,35,353,353,503,2,2,353,134,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,902,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {982,579,548,413,416,103,71,101,1039,526,684,684,2,2,656,2,2,2,2,2,2,2,2,2,2,2,656,656,656,2,656,656,656,656,656,656,656,656,2,656,2,656,656,656,656,656,656,656,656,656,656,656,656,656,2,656,2,656,2,2,2,2,656,656,2,2,2,656,656,656,656,656,656,2,2,2,2,656,656,656,656,656,656,656,1097,1097,1097,1097,1097,1097,1097,1097,2,656,1097,2,2,1097,1097,656,656,656,656,656,656,656,2,2,2,2,656,656,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,656,656,2,2,2,2,2,656,656,656,656,2,2,656,656,656,2,656,656,656,656,656,656,656,656,656,656,656,656,656,656,656,656,656,656,656,656,656,656,656,656,656,656,656,656,656,656,656,656,656,656,656,656,656,2,656,656,2,656,656,656,656},
+ {695,881,335,126,429,476,772,667,974,98,433,49,129,129,2,2,2,2,2,2,2,2,2,2,544,2,544,2,2,2,2,544,544,2,2,544,544,544,544,544,544,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,544,544,544,544,2,2,2,2,2,298,2,2,544,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,544,2,544,2,2,2,2,544,544,2,2,2,2,544,544,544,544,2,129,544,544,544,2,544,544,544,544,129,544,544,544,544,544,544,544,129,544,129,129,129,544,544,544,2,2,2,544,544,544,544,129,129,544,544,544,544,129,544,544,544,544,544,544,544,544,544,544,544,129,129,544,544,129,129,129,544,544,544,544,544,129,129,544,544,544,544,129,544,544,544,129,129,544,544,544,544,544,2,544,544,544,544,129,544,544,544,544,544,544,544,544,544,544,129,129,129,129,544,544,544,544,544,544,2,2,544,2,2,544,544,544,2,2,2,2,2,2,2,2,544,544,544,544,544,544,2,2,2,2,2,164,544,544,2,2,2,2,2,2,2,2,2,2},
+ {859,361,215,569,255,378,543,436,220,34,105,105,816,816,816,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,585,2,2,2,2,2,2,585,585,585,585,585,585,585,2,2,2,2,2,2,2,2,2,2,2,585,585,585,585,2,2,2,438,438,438,205,585,585,585,2,2,585,585,585,585,585,585,2,2,2,2,2,2,2,2,2,2,585,585,585,585,2,585,585,585,585,585,585,585,585,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,585,2,2,2,2,2,585,438,438,585,585,585,585,585,585,585,585,585,2,816,816,585,585,585,585,585,585,585,585,585,585,585,585,585,585,2,2,2,585,2,2,2,2,2,2,2,2,2,2,585,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,56,8,14,2,2,2,164,164,223,223,223,223,223,223,223,223,32,32,297,297,297,2,297,297},
+ {705,770,134,178,940,944,654,600,46,797,797,591,2,145,616,2,2,2,2,2,2,389,389,2,122,2,2,2,389,389,909,389,389,389,389,389,389,389,389,389,909,909,909,909,909,616,616,909,909,909,909,616,389,389,389,616,909,909,909,909,909,909,909,909,706,2,389,389,389,389,389,909,909,909,909,909,909,909,909,909,122,122,2,909,909,909,192,909,909,909,909,192,192,192,192,616,909,909,909,389,616,909,909,909,909,909,909,909,909,192,2,2,2,133,133,133,133,133,133,389,389,133,133,133,133,133,192,192,192,192,192,192,706,706,706,706,706,706,706,706,202,389,202,909,909,909,202,616,616,616,616,909,909,909,909,909,192,192,192,192,192,192,202,202,202,202,202,909,202,202,202,909,909,909,909,909,909,2,2,616,909,909,909,909,909,909,909,909,2,909,909,909,909,2,2,909,909,909,909,122,122,202,909,202,202,202,909,2,549,549,549,2,549,549,2,2,2,2,2,2,2,2,2,909,2,2,2,2,2,2,2,2,2,2,2,2,616,616,909,2,2,909,909,2,2,909,909,2,2,909,909,909,909,909,909,122},
+ {642,757,247,513,372,54,546,971,271,61,61,1018,2,143,332,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,238,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {988,271,675,163,379,108,48,472,870,485,485,18,2,485,528,528,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,556,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,586,2,2,2,2,2,586,2,2,2,2,2,2,586,2,586,586,2,586,586,586,586,586,2,586,586,528,2,586,586,2,586,586,586,586,528,528,528,586,528,528,528,2,528,528,586,586,586,528,586,203,2,586,586,586,586,2,528,528,528,586,586,586,586,586,586,586,586,528,528,528,528,528,586,586,556,2,2,586,586,2,2,528,556,528,528,556,586,556,586,586,586,2,528,528,556,528,2,556,2,2,586,528,528,528,528,586,586,586,586,2,2,556,528,556,556,528,528,528,528,528,528,528,528,528,528,528,528,528,528},
+ {865,827,614,74,725,685,724,190,178,272,835,722,2,35,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,643,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,49,49,2,2,2,237,237,2,237,237,237,2,2,2,237,237,237,237,237,237,237,2,237,2,237,237,2,2,2,2,237,2,2,2,2,2,237,237,237,237,237,237,237,237,237,2,237,237,2,2,2,2,237,237,237,237,237,237,2,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,2,2,2,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,237,508,508,508,282,282,282,237,237,237,237,237,237,237,237,237,237,237,282,282,282,2,2,237,237,2,2,2,2,2,49,49,49,49,237,2,237,237,2,2,237,237},
+ {923,397,722,186,203,575,24,144,36,526,206,787,12,100,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,624,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,624,2,2,624,2,2,2,2,2,2,2,2,624,2,2,624,2,2,2,2,2,2,2,2,2,624,2,2,2,2,247,247,2,2,2,2,2,2,526,2,2,2,2,2,624,624,624,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,624,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,624,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,624,2,624,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,624,624,2,624,624,624,624,2,624,2,2,2,624,32,2,2,2,334,193,360,193,360,360,118,360,1084,1084,1084,360,1084,1084,1084},
+ {718,359,103,558,684,560,67,35,120,342,680,265,265,265,2,2,265,2,2,2,2,2,2,2,2,2,430,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,430,430,2,2,2,2,2,2,2,2,2,2,2,2,430,2,775,775,2,2,2,775,2,2,2,2,2,2,2,2,2,775,775,775,775,775,775,775,2,2,2,2,2,2,2,2,2,2,2,2,2,2,430,2,775,775,2,2,2,2,2,2,2,2,2,775,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,775,775,775,2,430,430,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,430,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,430,2,2,430,430,430,430,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {927,493,988,194,97,1006,377,578,105,248,707,784,98,784,2,2,2,2,2,2,2,2,2,370,370,2,370,2,2,2,2,2,2,2,2,2,2,370,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,370,370,370,370,370,370,370,370,2,2,2,113,113,370,2,2,2,2,2,2,2,2,2,2,2,2,2,356,2,2,356,2,2,2,2,2,2,2,2,2,2,2,2,356,370,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,370,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,113,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {900,455,485,601,353,69,67,965,25,226,314,314,883,923,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,843,843,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,156,156,2,156,2,2,2,2,2,2,2,2,2,2,2,2,2,2,156,156,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,156,156,2,2,2},
+ {903,259,153,106,289,916,861,41,441,368,131,131,262,671,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,802,802,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,802,802,802,802,802,802,802,160,160,160,2,2,802,2,2,2,802,802,2,802,2,2,2,517,517,2,2,2,802,802,2,2,2,2,2,2,802,802,802,802,2,2,2,802,802,802,2,2,802,2,2,2,2,2,2,2,2,2,2,2,2,2,802,802,2,2,2,2,160,2,160,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,160,160,160,160,160,160,802,802,802,802,802,160,160,160,160,2,160,2,2,2,160,160,160,160,160,160,160,160,160,160,160,160,2,160,160,2,160,160,2,2,2,2,2,2,2,2,2,2,802,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {945,358,160,196,82,403,362,195,376,877,521,336,521,77,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,579,579,579,2,2,2,2,2,2,579,579,2,2,579,2,2,2,2,2,2,2,579,579,2,2,2,2,2,2,2,2,2,579,579,579,579,2,2,579,579,579,579,579,579,579,579,579,579,579,579,579,579,579,579,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,579,2,2,2,2,2,2,2,2,2,579,2,2,2,2,2,579,579,579,579,579,579,579,579,579,2,579,579,579,579,579,579,579,579,579,579,492,2,492,2,2,2,2,2,2,2,579,579,2,2,2,2,2,2,2,2,492,2,579,579,2,2,2,2,2,2,2,2,2,2,492,2,2,2,2,492,492,492,492,492,492,492,492,2,2,579,579,579,2,579,579,579,2,579,579,2,579,579,579,579,492,2,492,579,579,579,579,579,2,2,579,2,2,2,2,2,2,2,2,2,492,492,492,492,579,579,579,579,2,2,2,492,492,492,492,492,2,2,230,492,492,492,230,230,230,230,492,230,579,2,2,2,2,2,230},
+ {912,516,108,555,306,274,55,197,565,174,659,208,441,441,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,214,808,808,808,808,808,808,808,808,382,2,2,2,2,2,2,382,808,2,2,808,808,808,808,2,2,808,808,808,808,808,808,808,808,808,808,808,2,382,2,2,214,214,214,214,2,2,2,2,2,2,808,808,808,808,808,2,2,2,2,2,2,2,2,2,2,2,214,214,214,2,2,2,2,2,2,2,2,214,214,2,2,214,2,214,2,2,2,2,2,189,189,189,2,382,382,382,382,2,2,2,2,214,214,382,382,214,214,2,2,2,2,2,214,214,214,214,214,226,226,226,226,2,2,226,214,2,2,214,214,214,214,214,214,214,214,214,189,189,189,2,189,382,382,382,382,382,382,382,382,382,2,382,214,214,214,214,2,214,2,2,214,2,2,2,2,214,2},
+ {753,242,194,619,345,94,463,485,163,85,412,575,270,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,149,149,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,149,149,149,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {940,226,320,666,269,54,542,174,109,290,754,524,649,2,202,2,2,2,2,2,2,2,776,202,776,776,776,2,2,202,202,202,202,202,202,202,202,202,202,776,202,202,202,776,776,202,170,170,170,170,170,170,170,170,170,170,170,170,202,202,202,113,113,113,57,57,57,113,113,57,113,113,113,113,113,113,113,113,113,703,113,113,703,703,703,703,703,703,703,703,703,703,703,703,703,703,2,2,57,57,202,202,202,202,202,504,2,2,2,2,2,2,703,2,703,703,2,2,2,703,703,703,703,113,2,2,2,2,2,202,2,2,2,105,105,105,105,105,105,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {915,210,456,377,303,237,225,521,621,175,569,20,124,2,601,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {672,652,792,253,796,404,171,90,406,433,43,159,72,2,2,372,2,540,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,540,540,540,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,261,261,261,261,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {733,439,537,37,149,650,916,443,743,621,921,664,664,2,2,2,2,2,682,523,523,523,2,2,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,2,682,682,523,523,523,523,682,682,523,523,682,2,523,682,523,523,2,2,2,523,523,523,523,523,155,155,523,2,2,682,682,2,682,682,682,682,682,682,682,682,682,682,682,523,523,523,2,2,2,2,2,2,2,2,2,2,682,523,2,2,2,523,523,523,523,682,523,523,523,523,523,523,523,682,523,682,523,523,682,682,682,682,682,682,523,523,523,523,523,523,523,523,523,523,523,523,2,2,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,682,523,523,682,682,682,682,682,682,682,682,523,523,523,523,523,523,523,523,523,523,682,682,682,682,682,682,682,682,682,682,682,682,682,682,682,682,682,682,682,682,682,2,2,378,378,378,523,2,2,2,2,378,378,378,378,682,682,682,682,682,682,2,682,682,682,682,682,682,682,682,682,682,682,682,682,682,682,682,682,682,682,682},
+ {982,344,812,567,243,52,246,369,439,205,600,739,730,2,2,2,61,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,289,2,2,2,2,2,2,2,2,2,2,2,2,2,289,289,289,289,2,289,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {982,604,126,65,633,657,22,776,161,45,725,44,4,2,2,2,2,2,2,2,2,2,269,269,2,2,2,2,2,2,2,2,2,2,269,600,600,269,269,269,269,2,2,269,269,269,2,269,269,2,269,269,2,269,2,269,269,269,2,2,269,269,269,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,600,600,2,600,600,600,2,2,2,2,269,269,2,2,600,600,2,2,600,269,2,2,2,2,2,269,269,2,2,269,2,2,269,269,269,269,269,2,2,2,2,2,2,2,269,269,2,2,2,2,1121,1121,1121,1121,1121,1121,1121,269,269,269,269,269,269,269,269,269,269,269,269,269,269,269,269,269,269,269,269,269,269,269,269,269,269,269,269,269,269,269,269,269,269,269,269,269,269,269,269,269,269,2,2,2,600,269,269,2,269,269,269,269,269,269,269,269,269,269,269,269,269,269,2,2,2,2,269,269,269,269,269,269,269,221,221,269,269,269,269,269,269,269,269,269,269,269,269,269,269,269,269,269,269,269,269,269,269,269,269,600,269,269,600,269,269,269,269,269,269,269,269,269,269,269,269,269,269,269,269,269},
+ {745,600,284,1117,459,1135,300,52,845,331,334,334,334,2,334,334,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,353,353,353,353,353,353,353,2,2,2,2,2,448,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1160,2,2,2,2,2,2,2,2,2,353,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {936,409,217,57,574,395,481,245,548,268,447,598,375,2,192,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,735,735,2,2,2,735,735,735,735,2,2,2,2,735,2,2,735,2,2,2,735,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,735,735,735,735,735,735,735,2,2,2,735,735,2,2,735,735,735,735,735,2,2,2,2,2,2,2,2,2,2,735,735,735,735,735,735,735,735,2,2,2,735,735,735,735,735,735,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,735,2,2,2,2,2,2,2,2,2,735,2,2,2,2,2,2,2,2},
+ {986,241,233,45,721,325,350,222,35,1065,1065,1065,1065,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,250,2,250,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,250,2,2,2,2,2,2,250,2,2,2,2,2,2,2,2,2,250,2,2,2,250,250,250,2,2,250,250,2,250,250,2,250,2,2,2,250,250,250,250,250,2,250,2,2,2,2,2,250,250,250,2,2,2,2,2,2,2,2,2,2,2,2,2,2,250,2,2,2,2,2,2,2,2,250,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,250,250,2,2,2,2,2,2,2,2,2,2,2,2,2,2,250,250,250,250,250,250,250,250,250,250,250,250,250,250,2,2,250,2,169,2,250,250,2,250,2,250,2,2,2,2,169,169,2,250,250,250,169,250},
+ {755,796,877,981,259,194,1180,215,90,658,662,662,662,2,36,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {981,626,987,827,466,458,578,346,475,223,223,223,342,1058,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,728,728,728,728,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,223,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,39,2,2,39,39,2,2,2,39,2,2,2,39,728,39,728,728,728,728,2,2,2,2,2,728,2,2,728,216,39,39,39,2,728,223,728,216,216,728,728,728,39,728,728,2,728,728,2,2,2,728,728,728,728,728,728,728,728,728,728,2,728,728,728,728,728,728,216,728,728,728,728,728,728,728,728,728,728,728,728,728,728,728,728,728,728,728,223,728,223,223,728,728,216,216,216,216,728,728,728,728,223,728,728,728,728,39,728,728,728,728,728,39,728,728,223,728,728,223,223,39,39,39,39,39,2,2,39,39,39,2,2,2,2,2,2,2,223,223,223,39,39,39,39,39,39,39,39,39,2,2,2,2,223,2,2,39,39,39,39},
+ {949,422,941,491,66,786,592,429,307,123,40,478,478,478,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,36,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,788,788,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,788,2,2,2,2,2,2,2,2,2,2,788,2,2,2,2,2,2,2,2,2,2,2,2,2,788,788,2,788,2},
+ {992,723,625,251,431,544,309,466,700,644,484,837,904,320,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,316,471,2,2,4,4,2,2,4,16,316,2,2,816,502,57,204,57,248,57,248,638,638,638,82,82,1024,316,316,316,36,36,36,36,36,36,36,36,36,2,36,36,2,2,2,36,36,36,36,36,36,36,36,36,153,2,153,36,36,36,36,36,36,36,36,36,36,36,541,2,2,36,241,241,36,36,2,153,153,153,153,153,36,36,576,576,576,36,36,36,36,153,9,9,520,632,1067,466,520,1067,839,839,839,839,839,1067,281,281,281,281,281,281,281,281,281,281,560,560,281,281,334,281,281,632,632,632,632,541,589,36,471,471,471,471,153,153,153,153,589,36,36,471,153,153,153,153,541,471,653,653,653,653,653,589,589,589,589,589,653,653,653,153,153,653,653,653,153,153,153,153,653,153,153,2,153,153,36,36,153,471,153,153,153,153,153,153,153,153},
+ {1077,496,819,340,974,122,39,1209,819,18,461,648,648,394,2,2,2,2,2,2,61,2,2,2,2,2,394,2,2,2,2,394,394,394,394,394,394,394,394,2,394,394,2,2,394,2,394,2,394,394,394,2,2,394,2,2,2,2,2,2,394,394,394,2,2,2,2,394,2,2,2,2,2,394,394,394,394,394,2,394,394,394,394,394,61,2,394,394,394,394,2,394,2,2,2,2,394,2,2,394,2,2,2,2,2,2,2,2,2,665,665,665,665,665,665,394,394,394,394,394,394,394,2,2,2,2,394,2,2,2,394,394,394,394,394,665,665,394,665,665,665,665,665,665,665,394,394,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,394,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,394,394,2,394,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,394,2,2,2,394,394,394},
+ {999,674,212,673,279,579,462,754,89,866,345,110,110,887,2,2,2,2,2,707,707,2,2,2,2,2,2,2,2,2,2,707,707,707,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,509,509,2,509,2,2,2,509,509,509,509,2,2,2,2,2,2,2,2,509,509,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,509,509,2,2,2,2,2,2,2,2,2,2},
+ {1083,356,367,357,559,213,606,477,71,103,790,103,299,299,2,2,2,2,2,2,406,406,2,2,2,2,2,2,2,2,2,2,2,2,2,818,2,2,818,818,2,818,2,2,2,818,818,2,2,2,2,818,818,2,2,2,2,2,2,818,818,818,818,818,818,818,818,818,818,2,2,818,818,818,818,818,818,818,818,818,818,818,818,818,818,818,818,818,2,818,818,818,818,818,2,818,818,818,818,818,818,818,818,818,818,818,818,818,2,2,2,2,818,818,818,818,818,818,818,2,818,818,818,818,818,818,818,818,818,818,818,818,818,818,818,818,818,818,818,818,818,818,818,818,818,818,818,818,818,818,818,818,818,818,818,818,818,2,818,818,2,2,818,818,818,818,818,818,818,818,818,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,818,818,818,818,818,818,818,818,2,2,2,818,818,2,2,2,2,818,2,2,2,2,2,2,2,2,2,818,456,456,456,456,456,456,456,456,818,456,456,2,818,818,2,2,2,818,818,818,818,818,456,456,2,2,818,818},
+ {1005,260,389,960,501,714,118,73,334,1019,704,204,504,205,822,822,2,2,2,2,2,2,2,2,2,2,684,2,2,2,2,2,2,2,2,2,2,2,2,2,2,671,671,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,671,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {738,749,769,610,306,326,328,578,479,840,840,840,68,192,2,150,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,150,150,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,150,150,2,2,2,2,2,150,2,2,2,2,2,2,2,150,2,2,2,2,2,2,2,2,2,150,150,150,150,150,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,630,630,2,150,150,150,150,335,335,335,335,335,2,335,150,150,150,630,630,2,2,630,2,2,335,2,2,2,2,2,2,2,2,2,2,2,2,2,150,150,150,150,150,150,2,150,150,150,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1010,937,449,474,154,456,766,318,275,444,709,2,778,778,778,806,779,779,2,2,2,2,2,2,2,2,806,2,2,2,287,287,287,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,287,287,2,2,2,287,2,2,2,2,2,2,2,2,2,2,2,2,2,2,8,2,2,2,2,298,298,298,442,442,442,266,266,256,1024,287,4,2,287,287,287,2,2,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,326,46,23,23,23,251,23,682,251,251,670,614,614,98,368,368,368,374,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,669,669,669,669,669,669,669,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,287,669,669,669,287,287,287,287,287,287,287,287,287,2,669,287,287,287,287,669,669,669},
+ {1011,780,134,945,183,42,741,25,252,164,205,222,222,222,147,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,622,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,622,622,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,963,963,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,622,2,2,2,2,2},
+ {1118,427,294,404,268,217,922,515,19,1045,1045,2,833,291,448,2,2,2,2,2,2,2,2,2,175,2,2,2,2,2,2,2,2,2,2,2,175,175,2,175,2,2,175,175,175,175,2,2,2,2,2,2,175,175,175,175,2,2,2,2,2,2,2,2,187,187,187,187,175,175,175,175,175,175,175,175,175,175,175,2,2,187,175,2,2,175,175,2,2,2,2,175,175,175,175,175,175,175,175,175,2,187,187,187,187,187,2,2,187,187,187,187,187,187,187,187,175,175,175,175,175,175,175,175,175,175,175,175,829,187,187,829,829,399,399,399,399,187,187,187,399,175,175,175,175,11,11,11,11,11,11,399,399,399,399,399,399,262,11,2,175,175,175,399,399,2,399,175,175,175,175,175,175,175,11,11,11,11,11,11,11,11,11,11,11,187,175,175,175,175,175,175,175,175,175,175,175,175,399,175,175,399,175,175,175,175,175,175,175,175,175,175,175,399,175,175,175,175,175,175,399,175,175,175,175,175,175,175,175,399,829,11,11,11,175,175,175,175,175,2,399,399,399,399,399,399,399,399,399,399,399,399,399,399,399,399},
+ {1094,640,912,223,67,472,623,623,1244,65,1009,1209,1209,812,387,2,2,2,513,2,2,2,2,2,2,2,2,2,2,2,1209,234,234,234,234,234,2,234,234,2,234,234,234,234,234,234,234,2,234,234,234,234,234,234,234,234,234,234,234,234,234,2,2,2,2,2,1209,1209,1209,2,2,2,2,2,2,1209,1209,234,234,234,234,234,234,234,234,234,234,234,234,832,832,832,832,832,832,832,2,513,513,2,2,832,438,2,438,832,832,832,832,832,2,832,2,2,2,234,234,2,832,2,832,832,234,438,438,2,2,2,2,234,2,541,541,513,513,513,2,2,513,513,2,2,2,2,2,431,431,431,2,2,2,2,2,2,513,513,438,438,438,438,438,438,438,438,438,438,438,513,438,234,513,513,513,513,513,513,513,513,234,832,832,832,832,832,832,513,513,513,234,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,513,513,2,513,2,2,2,2,2,513,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {722,375,264,390,515,498,1161,391,884,551,238,2,2,825,549,2,2,2,551,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,408,408,2,2,2,408,408,2,2,2,408,408,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {792,250,299,210,496,682,94,207,220,227,227,2,2,227,73,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,844,844,844,844,844,2,913,913,2,2,2,2,2,2,2,2,2,2,2,844,844,844,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,844,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,844,2,2,2,2,2,2,2,2,2,2,2,2,844,2,2,2,844,2,2,2,2,2,2,2,844,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,844,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1022,409,93,359,983,345,280,280,104,940,940,2,2,382,1039,2,2,2,2,831,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,831,831,831,2,831,2,2,2,2,2,2,831,831,2,2,2,2,2,831,831,2,2,1039,2,2,2,2,2,2,2,4,4,4,2,2,4,4,8,16,2,2,2,150,556,391,391,391,391,1200,524,16,16,524,256,524,1039,4,4,4,1039,4,1039,2,2,2,831,831,287,831,2,2,2,782,782,2,2,2,2,831,831,831,831,2,831,2,2,2,2,2,831,831,831,2,1039,2,2,2,831,831,2,8,1039,2,8,2,2,8,8,2,4,4,42,2,2,4,4,8,42,2,2,2,150,679,679,679,391,391,524,524,524,256,256,256,256,256,256,256,8,782,8,782,2,782,782,782,831,16,831,2,2,782,782,782,2,2,464,464,464,464,464,262,262,262,2,2,996,996,996,996,996,996,996,996,2,996,996,996,831,2,8,8,8,8,8,262,8,67,67,831,4,42,2,2,4,4,8,42,560,2,2,150,679,679,679,391,391,1140,1140,1140,1140,1140,1140,1140,1140,560,560,560,1140,560},
+ {1027,925,413,335,327,826,250,122,293,773,564,541,420,420,420,774,763,2,2,2,2,2,2,900,110,110,2,763,2,2,2,2,763,763,763,763,763,763,763,110,110,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,110,2,2,2,2,2,2,2,2,2,2,8,2,2,2,2,1083,641,727,727,154,932,500,110,110,110,110,359,359,359,763,763,110,2,110,110,110,763,763,763,110,110,763,110,110,110,763,763,763,110,110,763,763,763,110,110,110,110,110,763,763,763,763,763,763,763,763,763,763,763,763,763,763,763,763,763,763,110,110,110,110,763,110,110,110,763,110,110,110,110,110,110,110,110,110,110,763,110,110,110,110,110,110,110,110,763,763,763,763,763,763,763,763,763,763,763,763,763,763,763,763,763,763,1255,679,27,27,27,1027,1027,1027,774,773,774,1005,1005,567,773,773,773,773,774,774,774,774,431,431,431,431,431,431,431,431,158,158,158,158,158,763,197},
+ {1028,730,807,119,209,146,230,498,164,309,309,2,2,2,693,912,430,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {997,525,680,120,466,728,288,110,1082,544,572,2,2,663,290,290,2,2,754,2,2,2,2,2,582,582,582,582,582,2,2,2,2,2,582,582,582,582,582,582,582,582,582,582,2,582,582,582,290,290,290,441,441,290,2,582,582,582,441,441,582,582,582,582,582,441,441,441,441,441,290,290,290,290,290,2,266,266,266,266,266,266,2,2,441,266,441,441,441,441,582,441,441,441,2,2,2,441,441,441,441,441,441,441,2,2,2,2,2,2,2,2,2,2,2,582,2,2,2,2,441,2,582,582,582,2,582,441,2,2,290,290,2,2,2,2,2,2,2,2,2,2,2,2,582,2,330,2,2,2,2,582,582,290,290,2,2,582,2,582,2,2,2,2,2,2,582,2,2,2,2,2,2,2,2,2,2,2,266,266,582,2,2,582,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,266,582,582,582,2,2,2,2,2,2,290,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,582,582,290,2,2,290,290,582,582,290,290,290,290,290,582,582,582,582,582,582,582,290,582,582,582,582,582,582,441},
+ {1055,395,795,561,222,85,294,433,377,89,89,2,2,2,456,821,2,2,821,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,821,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,821,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,821,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,821,821,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,821,2,2,2,2,2,2,2,821,821,2,2,2,2,2,2,2,2,2,2,821,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {997,614,240,638,755,575,874,321,600,235,665,2,2,2,154,154,767,767,2,767,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,165,2,2,767,767,767,767,767,767,767,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {802,298,672,424,104,623,152,159,476,760,66,2,2,2,215,215,490,490,490,2,2,2,2,2,490,490,490,490,490,490,490,490,490,490,490,490,490,490,490,490,490,490,490,490,490,490,490,490,490,490,490,490,490,490,490,490,490,490,490,490,490,2,2,490,490,490,490,490,490,490,490,490,490,490,490,490,490,490,490,490,490,490,490,490,490,490,490,490,490,490,490,490,490,490,490,490,448,448,448,448,448,448,448,448,448,448,448,448,448,448,448,2,448,448,448,448,448,448,2,2,2,2,2,490,490,490,490,490,490,490,490,490,490,490,2,2,2,2,2,2,2,613,613,613,613,613,613,613,613,613,613,613,613,613,613,613,2,2,2,2,2,2,2,2,2,2,490,2,490,2,2,490,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,945,945,2,2,2,2,2,2,2,2,2,2,2,2,2,2,490,490,490,490,2,2,2,2,2,2,2,2,2,2,550,550,550,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1128,788,124,501,561,1015,419,787,48,620,705,2,2,2,2,88,18,2,215,215,215,2,2,215,215,2,2,2,215,2,2,2,2,2,2,2,2,2,2,2,2,2,2,215,215,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,215,215,215,215,2,2,2,2,215,2,2,215,2,2,215,215,215,215,215,215,215,2,2,215,215,215,2,2,215,215,215,215,2,215,215,215,215,215,215,215,215,215,215,215,215,215,215,2,215,215,215,215,215,215,215,2,215,215,215,215,215,215,215,215,215,2,215,215,215,2,2,2,215,215,215,215,2,215,215,215,2,2,2,2,2,2,2,2,2,215,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,215,2,2,215,215,215,215,215,215,2,2,2,2,2,2,2,215,2,2,215,215,2,2,2,2,2,2,2,2,2,2,2},
+ {807,433,721,434,449,242,170,842,21,4,642,2,2,2,2,2,4,4,4,4,2,856,856,856,885,885,856,856,856,856,856,885,272,272,856,856,856,272,272,272,272,867,867,856,867,867,867,2,867,867,885,885,2,885,885,885,2,2,2,2,2,2,2,2,745,2,2,2,2,885,885,2,2,2,2,2,867,867,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,856,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,885,885,2,885,2,2,2,2,2,2,2,885,885,2,2,885,2,2,2,2,885,2,885,885,2,885,885,885,885,885,885,885,885,885,885,885,885,885,885,2,2,2,885,885,885,2,2,2,2,2,2,885,885,885,885,885,885,2,885,885,2,2,2,2,2,2,2,2,2,2},
+ {755,612,235,265,369,855,414,362,478,518,518,2,2,64,16,8,32,4,16,8,8,1041,501,1041,2,2,64,16,8,8,16,270,526,526,526,943,135,135,135,943,571,571,627,135,892,892,627,223,526,526,2,1070,1070,1070,1070,1070,1070,1070,1070,435,435,439,205,205,205,474,474,367,367,367,367,367,367,295,295,295,135,135,571,270,571,627,763,763,492,132,1008,166,33,33,33,83,83,83,163,75,75,75,111,83,111,111,997,83,1008,1008,1008,1008,1008,1008,321,321,321,321,321,135,135,571,270,571,1070,295,295,435,435,435,439,205,205,205,474,474,367,367,367,367,367,367,367,367,295,295,75,295,295,295,1159,75,75,75,75,838,838,838,135,355,355,355,355,136,136,838,109,492,109,109,461,109,461,461,272,272,109,109,234,234,109,977,977,977,33,33,83,83,83,109,117,117,377,136,957,387,17,17,17,902,902,902,555,555,578,578,555,902,902,902,902,902,902,902,902,902,461,461,461,461,355,461,355,555,461,461,461,461,461,578,578,578,297,461,461,284,284,1022,1022,1022,373,284,373,373,373,373,238,710,284,280,280,941,280,280,941,941,388,284,280,941},
+ {1004,719,1041,460,551,516,135,417,130,698,698,2,2,2,655,655,655,655,655,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,642,642,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,642,642,2,2,2,2,642,642,642,642,2,642,642,642,642,642,642,642,642,642,2,642,642,642,2,2,642,642,642,642,642,642,642,642,2,642,2,642,642,642,642,2,642,642,642,642,642,642,2,2,2,2,2,642,642,642,642,642,642,642,642,642,642,642,642,642,642,642,2,2,642,642,642,2,642,642,2,642,455,2,2,2,2,2,642,642,642,642,642,642,642,642,642,642,2,642,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,642,2,2,642,2,347,347,2,2,2,2,2,2,347,347,347,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1017,568,930,1113,556,1299,114,881,690,475,641,2,2,2,779,779,103,2,528,2,2,2,2,2,2,528,528,2,2,910,910,2,2,2,2,2,2,103,2,2,2,103,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,528,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,103,103,2,2,2,2,2,910,910,910,910,910,910,910,910,910,910,2,2,528,528,528,2,528,528,528,528,528,103,103,103,2,528,528,2,2,2,2,103,103,103,2,103,103,287,287,287,528,528,287,287,287,2,2,2,287,287,528,103,103,103,103,103,103,2,103,103,103,103,910,910,910,2,2,2,2,103,103,103,103,103,528,528,528,287,528,528,528,528,528,528,528,528,528,528,528,528,528,528,2,2,2,528,528,528,528,528,528},
+ {814,473,286,752,476,779,420,569,742,164,490,2,2,2,793,812,812,812,2,812,812,2,2,526,526,812,526,2,2,2,526,526,2,2,2,411,411,411,411,2,2,812,812,812,812,812,812,526,526,526,526,526,526,526,2,2,526,526,526,526,526,526,526,526,526,526,526,526,526,2,2,2,2,2,2,2,2,2,2,2,526,526,526,526,526,2,526,526,526,2,2,2,2,2,2,2,2,2,2,2,2,411,411,411,2,2,2,2,2,526,2,2,2,2,2,526,526,812,2,812,812,487,411,2,411,411,487,2,2,2,2,2,2,2,411,411,2,411,411,526,526,2,526,526,526,2,2,2,2,2,2,2,2,2,2,526,2,2,2,2,2,2,526,2,2,2,2,2,2,2,2,2,526,2,411,151,151,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,526,2,2,2,2,2,2,2},
+ {818,301,273,664,206,971,895,590,912,523,523,2,2,452,384,255,2,130,130,130,130,865,2,2,2,255,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,785,785,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,785,2,2,2,2,2,2,2,2,2,2,2,785,785,785,785,785,785,2,785,785,785,785,2,2,2,2,785,785,255,255,785,785,785,785,785,785,785,785,785,785,785,2,785,785,2,785,785,2,2,2,2,785,785,785,785,785,785,785,785,785,785,785,785,785,785,255,255,255,785,785,785,785,785,2,785,785,785,785,785,785,785,255,2,255,785,785,785,785,785,785,2,785,785,785,785,255,255,255,255,255,255,255,255,2,785},
+ {820,249,292,1017,1017,143,403,37,433,456,515,2,2,69,640,2,2,2,2,2,2,2,2,2,2,2,2,824,824,824,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,681,681,681,2,2,2,681,681,681,681,681,681,681,681,681,681,2,878,878,878,681,681,2,681,681,824,2,2,878,681,824,824,824,824,2,681,681,681,681,681,681,824,824,681,681,824,878,2,2,2,173,173,2,2,173,824,2,2,2,681,2,2,2,2,878,2,2,878,2,2,2,2,824,824,824,2,2,878,878,2,2,2,2,173,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,681,2,2,2,2,2,2,824,2,2,2,2,824,2,2,824,2,2,2,2,2,824,824,824,824,824,824,2,2,824,824,2,2,2,2,824,824,824,824,824,824,824,824,824,824,824,824,824,824,824,824,824,824,824},
+ {1078,527,589,244,170,892,827,606,1165,773,189,2,2,240,22,2,2,2,2,2,2,759,621,621,621,621,621,621,621,621,621,621,2,2,2,759,759,2,2,2,2,2,2,2,2,2,2,2,621,621,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,142,142,415,142,142,142,415,415,415,415,415,415,2,2,2,415,415,142,142,142,2,2,142,142,142,142,2,2,418,418,418,2,2,2,2,2,2,2,2,2,2,415,2,415,418,418,418,415,415,2,2,415,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,418,418,2,2,2,2,2,2,2,2,2,621,2,2,2,2,415,415,415,2,2,2,2,2,2,621,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {865,1132,428,582,254,408,536,376,825,116,116,1266,1266,1266,705,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,474,474,2,2,2,2,2,2,2,2,2,2,2,2,2,2,227,227,227,227,227,227,474,474,227,474,2,775,775,775,775,775,775,775,775,775,227,227,2,474,474,474,474,227,2,2,2,474,227,227,227,474,474,474,474,474,474,474,474,474,474,474,474,474,474,474,474,474,2,2,474,474,775,474,474,474,474,474,474,474,227,227,534,534,227,227,474,474,474,474,590,1266,534,474,474,474,1266,1266,1266,1266,227,227,227,534,534,534,534,534,1266,1266,1266,202,227,1266,474,474,474,474,474,2,2,227,227,474,474,474,474,1266,474,1266,705,1266,1266,1266,1266,1266,1266,1266,1266,534,1266,1266,474,1266,227,227,705,227,227,227,2,2,2,2,2,2,2,1266,2,2,1266,1266,1266,1266,1266,1266,1266,1266,2,534,2,1266,1266,2,2,2,227,2,2,2,2,2,1266,2,2,534,534,2,2,227,474,474,227,227,227,2,2,474,2,534,534,1266,1266,1266,1266,2,1266,1266,474,474,474,2,474,474,474,202,202,202,2,2,2,2},
+ {1062,268,389,1325,598,276,1270,48,572,439,302,2,544,609,544,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,158,2,2,2,2,2,2,2,2,158,158,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,158,158,158,2,2,2,158,158,158,2,2,2,158,158},
+ {1065,517,247,1142,247,674,385,120,592,177,98,2,956,364,275,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,687,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,376,376,376,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,687,2,2,2,2,2,2,275,275,275,275,687,687,687,2,376,376,376,2,687,376,687,687,2,2,376,376,376,2,687,687,687,376,376,376,376,2,376,376,376,376,376,376,376,2,2,2,2,2,2,376,376,376,376,687,376,687,687,687,687,2,376,2,376,687,376,376,376,376,376,687,687,687,687,687,687,687,687,687,687,687,687,687,687,687,687,687,687,687,687,687,687,687,687,687,687},
+ {635,503,594,203,456,1246,221,396,1151,178,66,2,781,587,86,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,938,938,938,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,339,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,190,2,2,2,2,2,2,2,2,339,2,339,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,114,2,2,2,2,2,2,2,2,2,2,2,2,339,339,339,339,2,339,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,339,2,2,2,2,2},
+ {1157,395,446,280,1130,695,668,271,111,882,477,615,615,615,2,2,2,2,2,2,2,2,615,615,615,615,615,615,615,2,305,2,2,305,305,305,305,305,2,2,2,2,2,2,2,248,305,305,493,493,305,305,305,615,2,2,2,2,2,305,248,248,305,305,248,305,2,2,2,305,305,305,2,120,120,120,120,305,305,305,305,305,305,305,305,305,305,2,2,2,2,2,2,305,2,2,2,2,2,2,305,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,305,305,2,2,305,305,2,2,2,305,305,305,305,2,2,2,2,305,2,2,305,305,305,305,2,2,305,305,305,2,2,305,2,305,305,305,2,2,305,305,2,2,305,305,2,305,305,305,305,305,305,2,2,2,2,2,2,2,305,305,2,305,2,2,2,2,2,2,305,305,305,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,305,2,2,2,305,305,305,305,305,305,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,305,305,305,305,2,305},
+ {830,397,932,519,818,113,367,694,88,535,535,414,343,175,2,2,2,2,2,2,2,2,2,2,414,864,2,2,864,864,864,864,864,864,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,2,2,2,1052,1024,95,95,95,307,307,760,760,144,222,414,222,165,165,864,864,2,864,864,864,864,864,864,864,222,222,222,864,864,864,98,864,864,144,144,144,144,864,864,144,864,864,864,864,864,222,864,864,222,864,165,165,165,165,134,222,27,27,725,592,725,476,134,134,725,725,105,864,476,476,476,476,310,222,222,144,144,144,310,144,144,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,72,165,165,165,144,144,144,144,144,144,144,72,630,86,9,9,9,144,222,222,310,310,310,144,81,627,222,222,222,630,630,98,98,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,98,98,165,165,165,165,98,165,165,165,165,165,165,165,660,374,1011,660,434,348,49,49,49,936,639,639,639,409,409,409,409,409,409,660,660,678,660,98,165,165,165,165,392},
+ {793,463,329,730,390,551,968,92,511,470,424,563,672,563,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,652,652,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,548,548,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,652,2,2,2,2,652,652,652,2,652,2,2,2,652,652,2,2,652,652,652,652,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,652,652,2,2},
+ {1050,749,809,479,87,757,288,172,597,722,4,418,418,390,2,2,2,2,2,390,390,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,390,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,390,2,390,390,2,2,390,390,390,390,390,2,2,2,390,390,390,2,390,390,390,390,390,390,390,390,390,390,390,390,390,390,390,390,2,2,390,390,2,2,2,390,390,390,390,2,390,390,390,390,390,390,2,390,390,390,390,390,390,390,390,2,390,390,390,637,637,390,390,390,390,390,390,390,390,390,390,390,390,390,390,887,390,390,390,390,390,390,390,390,390,390,390,390,390,390,390,390,390,390,390,390,390,390,390,390,390,390,390,390,390,390,390,390,390,390,390,390,390,390,390,390,390,390,390,2,2,390,390,390,390,390,390,390,390,390,390,390,390,390,390,390,2,2,2,2,2,390,390,390,390,390,390,390,390,390,390,390,390,390,390,390,390,390,390,390,390,390,390,390,390,390,390,390,390,390},
+ {1084,402,130,1077,276,154,1068,779,511,853,83,757,757,38,2,2,2,2,2,202,2,2,2,2,2,2,2,2,2,2,757,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,757,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,187,187,2,2,2,2,187,187,2,187,2,2,757,2,2,2,2,2,2,2,757,757,2,2,2,2,187,2,2,2,2},
+ {1090,255,271,110,159,235,158,236,271,815,1300,416,416,416,2,2,416,416,2,2,2,399,791,791,2,791,2,2,2,2,791,791,2,2,2,100,100,100,100,100,100,2,4,791,2,4,2,4,2,2,2,256,98,98,98,802,802,802,802,802,175,175,175,175,175,2,2,389,802,2,389,389,389,389,389,389,389,389,10,10,389,389,389,389,389,389,2,389,389,389,389,389,2,4,389,389,389,389,389,389,7,7,791,98,98,98,802,802,4,354,802,98,98,175,175,506,506,506,506,389,2,389,389,399,389,389,306,306,306,265,306,306,306,306,389,389,265,265,265,265,265,140,140,140,140,140,389,389,265,140,140,2,2,791,98,98,265,265,268,268,268,268,268,268,268,268,306,268,265,265,265,265,265,265,389,265,265,389,389,389,389,389,389,1090,1020,265,306,306,306,306,643,862,389,389,389,389,320,10,10,40,70,5,5,5,594,134,268,134,140,591,591,140,389,389,389,713,469,713,245,245,245,265,265,265,265,265,265,245,265,265,265,265,265,1090,1090,1090,1090,1090,265,265,265,265,265,265,140,265,265,94,140,140,140,140,265,265,265,265},
+ {1058,417,271,172,312,363,184,191,28,183,759,214,759,39,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,188,2,2,188,2,2,188,188,2,188,188,2,2,2,2,2,2,188,188,188,188,2,188,188,188,188,188,188,2,2,188,2,2,2,2,188,2,2,2,2,2,2,2,188,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,188,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1057,385,263,395,901,274,727,340,1117,263,813,870,858,429,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,903,2,903,2,2,2,2,903,903,903,2,2,2,903,903,903,903,903,903,903,903,947,903,903,2,2,903,2,903,903,2,903,903,2,2,947,2,2,2,2,2,2,2,2,2,2,2,2,947,947,947,947,947,2,2,2,2,2,2,2,2,903,2,2,2,903,2,947,947,947,947,947,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,903,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,947,2,2,2,2,2,2,2,2,2,2,2,2,947,2,2,2,2,2,979,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,947,2,2,2,2,2,2},
+ {1102,846,985,1085,764,124,764,51,874,612,478,801,478,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,561,561,561,2,2,2,2,38,2,2,2,2,38,38,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,38,38,38,38,38,38,38,2,2,38,38,38,38,2,2,38,38,38,38,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1120,665,311,695,319,1033,511,297,602,1030,1030,714,240,240,2,2,2,2,2,2,2,2,2,2,2,2,2,953,2,2,2,2,2,2,2,369,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,369,2,369,369,369,369,369,2,2,2,2,2,2,369,369,369,953,2,953,369,2,953,953,953,2,2,369,369,369,953,953,369,2,2,2,2,369,369,2,369,369,369,2,2,369,369,369,369,369,953,2,2,953,953,953,953,369,2,953,2,2,953,369,2,369,2,369,369,369,369,369,2,2,2,369,369,2,369,2,2,369,369,2,2,2,2,2,369,369,369,369,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,369,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {814,293,763,661,575,631,524,636,112,691,595,1103,405,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,345,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,630,630,2,2,630,630,2,630,630,630,630,630,630,630,630,2,630,630,630,630,630,630,630,630,2,630,630,630,630,630,630,630,630,2,630,2,630,2,2,2,2,2,2,2,2,630,630,630,630,630,630,2,2,2,2,2,2,2,2,2,2,2,2,2,2,630,2,2,2,2,2,2,2,2,2,2,630,630,630,2,630},
+ {1106,662,258,190,1315,214,530,263,318,904,877,1317,318,2,510,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,40,40,40,2,2,2,2,2,2,2,2,2,2},
+ {1206,469,299,1052,655,114,189,213,321,188,64,475,475,2,2,662,662,662,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,824,2,662,662,662,662,662,2,2,2,2,824,824,824,2,2,824,2,2,2,2,2,2,2,2,824,2,2,2,2,18,2,2,2,2,2,2,2,2,2,2,824,2,2,2,2,2,2,2,2,662,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,824,824,824,2,2,824,824,824,824,824,824,2,824,824,2,2,2,2,2},
+ {1120,1159,358,347,838,207,357,167,476,52,672,38,822,2,2,2,2,2,2,213,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,213,213,213,213,213,2,2,2,2,2,2,2,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,213,2,28,28,213,213,213,213,2,2,28,28,28,28,28,2,213,213,213,213,28,28,28,213,213,213,213,28,28,28,28,28,28,28,28,2,28,28,213,382,382,382,382,382,213,213,382,382,382,382,382,213,213,213,213,213,28,28,213,28,28,28,28,28,28,28,270,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,213,28,270,28,270,270,270,270,270,270,270,270,270,270,28,28,270,28,270,270,220,28,28,2,2,28,28,28,28,28,28,28,270,270,270,270,270,270,270,270,270,270,270,270,270,270,270,270,270,270,270,270,270,270,270,270,270,270,270,2,270,270,270,270,2,270,270,270,270,270,270,270,270,270,2,2,270,270,270,270,270,270,270,270,270,270,270,270,270,270},
+ {1076,596,553,545,79,727,881,121,298,169,639,368,695,115,115,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,115,115,115,115,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,849,2,849,849,849,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,115,115,2,115,115,115,2,2,2,2,2,2,115,115,115,2,2,2,2,2,2,2,2,2,2,2,115,115,115,115,115,2,2,2,2,2,2,2,2,2,2,2,2,2,2,115,115,115,2,2,115,2,2,2,2,2,2,2,2,849,115,115,2,2,2,2,2,2,2,2,2,2,2,2,849,849,849,2,849,849,849,115,115,2,2,2,2,2,849,2,2,2,2,2,115,2,2,2,2,2,2,2,849,2,2,115,115,115,2,115,115,2,2,2,849,849,2,2,849,849,849,2,2,849,849,849,849,849,849,849,849,849,115,2,2,2,849,849,2,849,115,849,2,2,2,2,2,2,2,2,849,2,2,849,2,2,2},
+ {1130,177,84,673,350,543,543,95,128,954,430,884,884,2,884,884,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,779,2,779,577,577,577,577,577,577,779,779,779,779,779,2,884,2,2,2,2,483,2,2,483,2,483,2,2,483,2,2,2,2,2,483,2,2,2,2,2,2,2,2,483,483,779,2,2,2,483,483,2,2,2,2,483,2,2,483,73,779,2,73,73,483,483,483,2,2,2,636,2,2,636,636,636,2,636,2,2,2,2,2,2,2,779,2,2,2,2,2,2,2,636,483,483,779,779,779,779,2,2,779,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,884,2,2,2,2,2,2,2,2,2,2,2,2,2,779,2,2,2,2,2,2,2,2,483,483,2,2,2,636,636,2,779,636,779,779,779,779,2,779,636,2,2,2,2,636,636,636,636,779,483,779,779,2,2,515,515,515,515,636,779,779,779,779,779},
+ {1222,412,430,707,691,746,131,607,311,607,112,217,912,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,412,2,2,2,2,2,2,2,2,2,2,2,2,2,2,412,412,412,412,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,412,2,412,2,2,2,2,2,2,412,2,412,412,2,2,412,412,2,2,412,2,2,412,2,2,2,2,2,2,2,2,2,2,2,2,2,412,412,412,412,412,412,2,412,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,412,412,412,2,2,412,412,412,2,412,412,412,412,412,412,412,412,2,2,2,412,412,412,412,412,412,412,412,412,412,412,412,412,412,412,412,412,412,412,412,412,412,412,412,412,412,412},
+ {820,461,681,382,273,273,358,274,274,91,887,676,386,2,676,676,2,2,2,2,2,2,2,200,2,2,2,2,200,2,2,2,2,2,2,200,200,200,200,200,200,2,2,2,200,2,2,2,253,2,2,2,2,2,612,253,2,2,2,2,2,2,2,2,253,253,2,2,2,2,2,2,200,200,2,2,2,2,2,253,253,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,200,200,200,200,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1096,1166,209,407,1127,400,974,322,428,906,631,134,171,2,2,2,2,664,664,664,2,2,2,2,2,2,2,2,2,2,2,2,2,664,664,664,664,553,553,553,2,553,553,553,553,553,553,2,2,553,553,2,2,2,2,553,553,664,664,664,664,553,664,664,664,664,664,664,664,673,673,2,2,383,383,553,553,664,925,383,925,2,664,925,925,925,383,553,929,929,929,553,553,664,664,664,664,553,553,925,553,2,553,664,664,664,664,664,664,664,664,2,2,2,673,673,673,673,925,925,925,925,383,383,673,2,673,673,673,2,2,553,2,2,2,2,2,2,2,2,2,2,2,2,664,664,2,2,73,73,73,73,73,73,73,73,73,2,925,925,925,664,2,925,664,2,925,925,2,925,2,2,383,383,383,925,2,2,1316,1316,2,925,925,925,383,925,925,925,2,2,2,925,925,925,925,664,2,925,925,925,925,664,925,925,664,2,2,383,383,925,383,383,2,2,2,2,383,664,2,925,925,925,925,925,925,2,925,2,2,2,2,2,2,2,664,664,2,2,664,2,664,664,2,925,925,925,925,664,2,2,2,2,2,2,664,664},
+ {1091,946,437,51,527,802,597,639,587,645,510,586,586,2,2,2,2,2,2,2,2,2,2,2,2,2,2,168,168,168,168,168,2,2,2,2,2,2,168,168,2,2,512,286,4,4,168,168,168,168,168,168,2,2,2,256,239,64,128,128,374,374,21,21,84,875,239,128,2,2,343,343,343,343,343,343,343,2,2,343,343,343,343,168,168,343,343,343,343,2,875,378,378,875,343,343,343,343,343,343,343,168,168,168,168,375,375,375,2,2,256,239,64,566,343,343,343,343,343,343,875,343,343,343,343,343,343,343,343,343,378,343,2,875,875,875,875,875,343,343,343,893,343,875,875,875,875,875,343,893,343,343,343,343,893,966,966,966,966,262,262,1308,23,23,23,636,432,432,311,311,1178,622,1178,1178,1178,622,262,893,893,893,483,262,483,483,511,483,427,427,378,92,92,92,92,92,432,432,432,686,686,547,172,378,378,378,378,378,378,378,378,1066,378,1066,1066,875,7,7,7,7,7,7,7,7,7,7,7,378,378,378,378,378,875,875,378,343,343,343,343,343,343,343,343,547,547,343,547,378,378,378,378,378,378,378,378,172,378,378},
+ {1148,585,868,1282,666,417,733,1231,515,332,1213,337,337,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,393,393,2,2,393,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,862,2,862,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1103,276,174,408,233,170,955,108,530,354,585,38,677,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,476,627,2,2,627,627,2,2,2,627,627,476,627,627,627,2,2,2,627,627,627,627,627,627,627,627,627,627,627,627,627,627,627,627,627,627,627,627,627,627,627,627,2,627,627,627,627,627,627,627,627,627,627,627,627,627,627,627,627,627,627,627,627,627,627,627,627,476,476,476,2,627,627,627,2,2,2,2,627,2,2,2,2,627,627,627,2,2,2,627,627,627,627,2,2,2,627,627,627,2,2,2,627,627,627,2,627,2,2,2,627,627,627,627,2,2,2,2,2,2,2,2,627,627,627,627,627,627,627,2,627,627,627,627,627,2,627,627,627,2,2,476,627,627,627,2,2,2,2,627,2,627,2,2,627,627,627,627,627,627,2,2,627,2,2,2,2,627,627,627,627,627,627,627,627,627,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,627,2,2,2,2,2,2,2,2,2,627,2,2,2,627,627,2,2,2,627,627,627,627,2,476,627,627,627,627,627,627},
+ {1167,478,1169,1053,563,371,108,772,413,497,1338,991,660,2,2,2,2,2,2,2,2,2,2,2,2,27,2,2,2,2,2,2,2,2,729,2,2,2,2,2,2,2,729,2,729,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,81,81,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,729,729,2,729,729,2,729,2,2,729,729,2,729,729,2,2,729},
+ {1108,437,1160,324,868,686,361,399,786,1161,1161,707,731,731,655,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,731,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,731,731,2,2,2,731,731,731,731,731,2,731,731,731,731,2,731,731,731,731,731,731,731,731,731,731,731,731,731,731,731,731,731,731,731,731,731,731,731,731,731,731,731,731,731,731,731,731,2,731,731,731,731,731,731,2,731,731,2,731,731,731,731,731,731,731,731,731,2,2,2,2,2,731,731,731,731,731,2,731,731,731,731,731,731,731,731,731,731,731,731,731,731,731,731,2,2,731,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,731,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,731,2,2,2,2,2,2,731,2,2,731,731,2,2,2,2,2,2,2,2,2,2,2},
+ {1116,331,280,422,1109,341,570,243,849,241,566,61,608,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,55,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,207,2,2,2,2,2,2,2,2,2,2,55,2,2,2,2,2,2,2,2,2,2,2,2,545,545,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {898,782,478,1208,196,983,608,537,196,1141,141,296,715,715,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1099,1187,300,240,268,413,1366,634,184,768,773,365,783,224,783,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,845,845,845,224,2,2,39,39,224,39,39,2,2,2,2,2,224,224,2,224,224,224,2,224,2,224,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,224,224,224,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,224,2,2,2,2,2,2,2,2,2,2,2,2,2,2,224,2,2,2,2,224,224,224,2,2,224,2,224,2,224,2,2,224,224,2,2,2,2,2,2,2,2,2,224,2,2},
+ {1158,945,300,1115,205,495,435,302,187,774,774,843,843,284,284,2,2,2,2,909,933,933,933,2,2,909,909,2,2,2,2,909,909,909,909,933,2,2,933,933,2,2,909,2,2,2,2,2,909,2,2,2,2,2,2,909,909,909,909,909,2,2,2,2,2,933,2,2,2,2,933,933,2,2,2,2,933,2,933,2,2,2,2,2,2,2,2,2,2,2,933,933,933,933,933,2,2,2,933,933,933,933,933,2,2,933,2,2,204,204,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,933,2,2,2,933,933,933,2,933,2,2,933,2,2,2,2,507,507,2,2,2,2,2,2,2,2,2,2,2,2,2,2,933,933,2,2,933,933,933,933,933,933,909,933,909,909,933,933,933,2,933,933,933,933,933,933,933,2,2,2,933,933,933,933,933,933,2,933,933,2,933,933,933,933,933,933,933,933,933,2,2,933,933,933,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,933,2,2,2,2,2,2,2},
+ {904,660,1283,46,33,124,416,218,152,970,1241,305,307,307,307,260,894,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,424,424,2,424,424,894,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,254,894,2,2,2,2,2,2,894,894,894,894,2,2,2,2,2,160,857,857,414,414,414,894,894,894,894,894,894,894,894,894,894,894,424,424,424,894,424,424,424,424,424,424,424,262,262,262,262,262,262,262,262,894,894,894,424,2,2,894,894,894,424,894,894,894,894,894,894,894,424,262,894,894,894,894,262,424,262,262,262,262,262,262,262,262,894,894,894,894,894,424,424,262,262,262,262,262,262,894,894,894,262,262,142,142,894,894,894,894,894,894,894,894,894,894,424,2,2,160,424,424,424,142,142,142,142,142,142,262,262,262,262,894,894,424,894,894,894,894,894,894,254,254,254,142,254,254,142,424,894,894,894,894,894,894,894,894,894,894,894,894,142,424,262,254,262,262,262,262,262},
+ {1127,553,287,58,739,99,514,739,766,42,580,241,598,598,936,936,936,629,629,629,629,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,629,2,2,2,2,629,2,629,2,2,2,2,2,629,2,2,629,629,629,2,2,629,629,2,629,2,2,629,629,2,2,629,629,629,629,629,629,629,2,2,2,629,2,2,629,2,2,2,2,2,2,629,629,2,2,2,2,2,2,2,2,629,2,2,2,2,2,2,2,2,2,629,629,629,629,629,629,629,629,629,629,2,2,629,629,629,629,629,629,629,629,629,629,629,629,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,884,884,884,884,884,884,884,884,884,884,884,884,884,884,884,884,884,884,629,629,629,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,629,629,629,629,2,2,2,629,629,202,202,202,202,202,2,629,629,629,629,629,629,629,629,629,629,629,2,629,629,629,629,629,629,884,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,202,202,202},
+ {1142,370,287,925,307,1232,129,11,1284,1056,33,33,536,521,2,1286,2,2,2,2,2,2,2,2,2,2,2,2,847,847,847,847,2,2,2,847,847,847,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,847,847,2,847,2,2,2,2,2,2,2,2,847,847,2,2,2,2,2,2,2,2,2,2,2,2,2,847,847,2,2,2,2,2,847,2,2,2,847,2,2,2,847,847,2,2,847,847,847,847,847,2,847,847,847,2,847,847,847,847,847,847,847,847,847,847,847,847,847,847,847,847,847,847,847,847,847,847,847,847,2,2,2,2,2,2,847,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1140,814,528,677,84,1192,305,637,335,451,103,325,77,969,2,651,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1106,1106,1106,1106,1106,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,68,2,2,2,2,2,2,2,2,2,2,1106,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,651,68,68,68,2,2,2,2,68,2,68,68,2,2,2,2,2,2,2,2,2,68,68,2,2,2,2,2,2,2,2,68,68,2,2,2,68,68,68,68,68,68,68,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1297,600,419,985,846,493,186,109,147,239,197,762,762,327,327,1004,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,553,553,553,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,995,995,2,553,553,553,553,2,995,995,2,995,2,2,995,995,995,995,2,2,2,2,2,2,995,2,2,2,995,2,995,995,995,995,2,995,2,2,2,995,995,995,995,995,2,2,2,995,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,995,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,995,995,995,995,995,995,995,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,995,2,995,995,2,995,2},
+ {1181,615,482,653,238,130,313,506,98,1314,730,730,730,730,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,897,897,388,521,521,1135,1135,494,494,494,494,494,535,494,535,494,2,2,2,364,2,2,2,2,2,2,2,2,2,2,2,2,308,2},
+ {921,613,628,1288,111,150,191,233,633,83,387,602,105,394,2,2,2,2,2,2,2,351,2,2,351,351,351,2,2,2,351,351,351,351,2,2,2,2,2,2,2,2,2,351,351,2,2,351,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,351,2,2,2,2,351,351,351,351,2,2,2,2,2,2,2,2,2,2,2,2,2,2,351,2,2,2,2,2,2,2,2,2,2,351,351,2,2,2,2,2,2,2,351,2,2,2,2,351,351,351,2,2,2,2,2,2,2,2,388,351,351,2,2,2,2,2,2,2,351,2,2,2,2,2,2,2,2,2,2,2,2,2,2,351,351,351,2,2,2,2,351,351,2,2,351,351,351,351,2,2,2,388,351,351,351,351,351,351,351,351,2,2,351,2,351,351,351,351,351,351,351,2,351,351,351,351,351,2,351,2,2,351,2,351,2,351,2,2,2,2,351,351,351,2,2,2,2,2,2,2,2,351,351,351,351,351,2,351,351,2,2,351,2,351,351,2,351,351,351,2,351,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1192,555,586,516,1288,733,64,653,364,273,421,215,75,75,2,2,2,2,2,2,953,953,953,953,8,383,383,2,161,383,953,953,383,953,383,383,383,2,2,953,383,383,395,395,395,395,2,383,576,953,953,953,953,2,383,383,2,2,383,383,383,235,235,235,235,235,235,161,161,161,40,40,2,953,235,235,2,2,128,32,32,128,205,953,953,953,953,205,205,205,205,205,2,2,953,953,953,953,953,953,235,953,953,953,953,383,383,383,383,953,383,383,383,383,953,953,953,953,383,953,953,953,205,205,205,953,37,37,953,953,953,953,953,953,235,235,953,953,953,953,953,953,953,953,383,383,953,383,383,383,438,438,424,53,53,53,228,228,228,228,228,228,449,449,449,57,57,57,167,1066,1066,576,576,576,235,235,235,953,576,953,576,576,576,576,198,198,953,953,953,953,953,198,235,235,235,576,576,576,576,576,576,576,576,198,576,576,576,576,161,161,161,161,161,161,161,383,576,198,953,953,953,576,576,576,235,235,235,235,235,235,235,198,161,161,161,161,161,161,161,161,161,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235},
+ {1160,617,505,1205,374,906,23,408,194,91,91,91,585,984,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,421,2,421,421,421,2,2,2,421,421,2,2,2,2,2,2,421,2,2,2,2,2,2,2,2,421,421,421,421,421,421,421,2,2,2,2,2,421,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,151,151,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,421,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1203,1101,497,352,254,309,464,123,607,1080,265,1145,1145,1145,284,284,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,376,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,376,2,2,2,2,2,2,2,2,2,2,2,520,2,2,2,2,2,2,2,2,2,2,2,520,520,2,2,2,2,2,2,2,520,520,2,2,2,376,376,2,2,376,376,376,376,376,376,376,520,376,376,376,376,376,376,376,376,376,2,2,2,376,376,376,2,2,2,2,284,2,2,2,520},
+ {1210,656,1026,782,802,442,1319,734,794,165,165,796,93,796,2,829,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,829,2,2,2,2,2,2,2,2,829,829,829,2,2,2,2,829,829,829,829,829,829,370,829,829,2,2,2,829,829,829,829,829,829,829,829,829,829,829,829,2,2,2,829,829,2,2,829,829,2,2,829,829,829,829,2,370,370,370,370,370,2,2,370,370,2,829,829,829,829,2,2,2,2,2,829,829,829,829,641,641,641,370,2,829,370,829,829,829,829,829,829,370,829,829,641,370,370,370,370,65,65,65,65,65,65,370,370,829,829,829,641,641,829,829,2,829,641,2,2,829,829,829,370,370,370,370,370,641,641,641,641,2,2,641,370,370,370,370,2,2,2,370,370,2,370,829,829,829,829,829,829,641,641,370,2,370,641,2,2,2,2,2,2,2,829,829,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,370,641,641,641,641,2,370,370,2,370,370,370,370,2,2,370,641,641,641,641,641,641,641,641,641},
+ {963,646,721,1161,219,667,1088,485,692,692,663,535,553,662,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,686,686,2,686,686,2,2,553,2,2,2,2,2,2,2,2,2,2,553,553,553,553,553,2,2,553,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,553,553,553,2,2,2,2,2,2,2,2,686,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,553,553,2,553,2,2,2,2,2,2,2,2,553,553,553,553,553,2,2,2,2,1158,686,553,553,2,2,2,2,2,2,2,553,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,686,2,2,2,2,2,2,2,2,2,686,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {966,590,140,297,189,844,633,12,847,742,742,244,281,34,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1475,1475,1475,1475,1475,1475,1475,1475,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1208,1208,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,76,76,76,2,2,2,2,2,2,2,2,2,2,1208,2,2,2,2,76,76,76,2,1208,1208,2,1208,1208,2,76},
+ {941,231,1038,309,173,770,413,560,855,660,721,1103,721,721,721,2,2,2,2,2,2,2,2,2,2,2,2,174,2,2,2,2,2,2,2,2,2,2,174,174,174,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,174,174,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,570,570,570,570,2,174,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,174,174,174,174,174,174,2,2,174,174,174,174,174,174,174,174,570,570,2,174,174,174,174,174,174,2,2,2,2,2,2,2,570,570,2,2,2,2,2,2,2,2,174,174,174,2,174,174,174,174,174,570,570,174,174,174,174,174,174,174,174,174,174,174,174,570,570,570,174,570,570,174,174,2,2,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,570,570,570,174,174,174,570,174,174,174,174,174,174,174,174,174,174,174,174,2,2,570,570,174,174},
+ {1213,305,656,983,1399,1196,692,986,9,339,754,308,2,308,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1037,2,2,2,2,2,2,2,2,2,2,2,2,2,1037,1037,1037,1037,1037,2,2,2,2,128,128,512,1430,643,8,8,543,429,2,2,429,429,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1037,2,2,2,2,2,2,2,2,2,2,2,2,2,1037,1037,1057,1057,1057,2,2,2,2,482,482,512,512,1430,8,8,8,2,2,2,429,429,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1037,2,2,2,2,2,2,2,2,2,2,2,2,8,8,8,1057,1057,2,2,2,2,2,482,482,512,512,512,8,8,8,2,2,2,429,429,2,2,2,2,2,2,2,2,2,2,2,2,2,2,755,755,755,755,755,29,29,29,755,755,755,755,2,755,755,65,65,65,65,65,65,65,65,65,65,65,2,2,482,482,512,512,512,512,8,755,755,755,67,67,67,67,67,67,67,67,67,67,755,680,42,755,755,755,755,755,755,755,755,755,755,755,828,755},
+ {972,768,1109,523,642,546,1452,29,1296,13,813,813,2,1496,2,2,2,2,2,2,2,165,165,165,165,165,165,2,2,2,2,544,165,2,2,2,2,2,2,2,2,2,2,2,165,165,2,2,2,2,2,79,79,544,544,544,165,165,165,2,2,2,2,544,544,544,544,544,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,165,165,165,165,165,165,165,2,2,2,2,2,2,165,165,2,561,2,2,2,2,2,2,165,165,544,2,544,2,2,2,544,544,544,2,2,2,2,2,2,2,2,2,2,544,544,884,884,544,544,544,544,544,544,544,2,2,544,544,544,561,165,165,544,544,544,544,544,544,544,544,165,165,561,544,561,561,561,561,165,544,544,544,561,561,165,544,544,544,544,544,544,544,544,544,544,79,79,79,79,79,79,79,79,79,79,79,544,544,544,165,165,165,165,165,544,544,544,544,544,544,544,544,544,561,544,544,544,544,544,544,544,544,165,165,165,544,544,544,544,544,544,544,544,561,561,561,561,561,561,561,561,561,561,544,544,544,544,544,544,544,544},
+ {1330,671,528,831,1426,735,33,425,364,119,363,978,2,761,483,476,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,999,2,2,2,2,2,2,999,2,1043,2,2,1043,2,2,2,2,2,2,999,999,999,2,2,2,2,999,999,999,2,999,999,2,999,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,999,999,2,999,999,999,999,999,999,999,2,999,2,2,999,999,2,2,2,2,999,999,999,999,999,999,999,999,999,999,2,2,2,2,2,2,2,2,2,2,2,2,2,2,999,999,999,999,999,999,999,999,999,999,2,2,2,2,2,2,2,2,999,999,2,2,2,2,999,2,2,2,2,2,2,2,2,999,999,999,999,999,2,2,2,2,2,2,2,2,2,2,2,2,999,2,999,999,999,999,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,999,2,2,999,999,999,999,999,2,999,999,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,999,999,2,2,2,2,2,2,2,2,2,2,2},
+ {1188,217,838,237,379,202,785,949,479,169,348,872,2,872,872,2,2,2,2,2,2,1028,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1028,1028,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,537,2,2,2,2,2,2,2,2,2,2,395,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,395,2,2,2,1028,1028,1028,395,2,2,866,866,866,866,2,395,2,2,2,2,207,207,207,395,395,207,207,2,2,2,207,207,207,207,207,207,2,207,2,2,2,2,2,2,2,2,2,2,2,866,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1190,286,513,881,390,215,387,130,749,554,1110,519,160,160,160,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,401,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1247,353,973,217,1044,1318,1115,319,203,390,1244,225,2,2,508,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,365,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,666,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,666,2,2,2,666,2,2,2,2},
+ {893,560,132,1420,721,191,568,799,412,22,322,93,2,4,4,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,57,57,57,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {987,774,678,175,145,264,588,97,1308,6,828,1129,2,2,2,45,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {955,980,753,96,574,259,1327,556,342,1415,1036,1036,478,478,478,478,507,2,2,2,2,151,2,2,317,2,2,2,2,2,595,595,317,800,800,151,151,151,151,2,2,2,151,151,151,151,151,2,2,2,2,2,2,2,151,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,151,151,2,800,800,800,800,800,2,2,2,674,674,2,2,2,2,800,800,800,800,800,800,800,237,2,2,237,237,151,151,151,151,151,151,151,800,2,317,317,2,800,800,2,800},
+ {882,1038,211,110,942,337,1305,1225,661,183,381,381,2,2,2,2,347,2,2,2,2,2,2,2,600,431,431,431,431,431,431,431,431,2,2,431,431,2,2,2,2,431,431,431,2,2,2,431,600,2,2,2,2,137,137,137,137,137,137,137,137,2,431,431,600,2,431,431,600,431,2,600,431,431,431,431,463,463,600,600,600,431,600,431,431,2,431,431,170,431,431,431,431,431,431,431,431,2,600,431,431,431,431,600,431,431,431,431,431,431,1329,431,431,431,431,431,431,431,431,431,600,600,600,600,600,600,431,431,465,465,465,431,431,600,600,600,600,600,600,600,600,600,600,600,600,600,463,431,431,431,431,431,431,431,431,600,600,2,600,600,600,600,431,431,431,431,2,600,463,600,600,600,431,431,431,431,600,600,600,431,431,2,170,600,431,600,431,600,431,600,431,600,600,600,600,431,431,431,431,431,431,431,431,600,600,600,600,600,600,600,600,463,463,463,463,463,463,2,2,600,600,600,600,600,600,600,600,170,600,600,600,431,431,431,600,2,600,431,431,431,431,600,431,2,2,600,463,463,463,431,431,463,600,600,600,600},
+ {1208,486,343,725,677,1204,135,139,924,170,1111,317,2,2,2,2,202,706,202,107,107,107,2,2,706,706,107,107,2,2,2,706,706,2,706,706,2,2,2,706,706,2,706,706,673,673,2,2,2,2,2,2,2,2,2,2,2,2,107,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,673,2,2,164,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,706,706,107,107,164,164,706,343,2,2,164,2,2,673,673,673,164,107,164,164,2,164,164,164,2,2,2,2,107,107,2,2,2,2,2,2,2,2,2,2,2,2,107,107,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,107,107,107,2,2,2,107,107,2,2,107,107,107,107,107,107,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,107,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1259,1017,456,298,443,838,137,744,551,334,36,951,2,2,2,699,718,2,2,984,2,2,2,2,2,2,984,984,2,2,2,2,2,2,2,2,984,2,984,2,2,2,984,984,2,2,2,984,2,984,2,2,2,984,2,2,2,2,2,2,2,2,2,2,2,984,2,2,984,984,984,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,121,2,984,984,2,2,2,984,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,984,2,2,2,2,2,2,2,121,121,2,984,984,984,236,236,2,2,2,2,2,2,984,2,2,2,2,121,2,2,2,2,121,121,121,121,2,2,2,2,2,2,2,2,121,121,121,121,984,984,984,984,984,2,121,121,121,121,121,121,121,984,984,984,121,121,121,121,121,121,121,121,2,2,121,121,121,121,121,121,121},
+ {1212,1186,641,284,565,636,895,82,690,117,184,184,2,2,2,397,902,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,902,902,902,902,902,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1263,370,132,635,381,47,537,179,1192,301,1282,33,2,2,2,1553,2,2,2,2,2,2,2,2,2,2,2,307,307,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,307,307,307,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,307,307,2,2,2,2,2,2,2,2,2,307,2,2,2,2,307,2,307,307,2,2,2,2,2,2,2,2,307,307,307,2,2,307,307,307,307,307,307,307,307,2,2,2,2,2,2,2,2,307,307,307,307,2,307,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,307,307,307,307,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,307,314},
+ {1223,433,252,572,424,82,221,107,382,430,203,461,2,915,362,964,2,2,964,2,2,2,2,2,964,964,964,964,964,485,485,485,485,485,485,2,2,964,964,485,485,485,485,485,485,2,2,485,2,2,2,2,2,2,485,485,485,485,167,2,434,2,2,2,2,964,964,2,2,2,2,485,485,2,2,167,2,2,2,2,2,2,434,2,938,938,938,2,2,2,2,485,2,2,2,2,2,2,2,2,2,2,2,2,485,485,485,485,485,485,485,2,2,2,2,2,167,167,167,167,167,167,167,167,167,167,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,434,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1015,593,112,1408,51,104,199,221,931,1010,928,928,2,2,878,878,2,2,2,2,731,731,2,731,731,2,731,2,731,731,731,2,2,2,2,2,731,731,731,731,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,731,731,731,2,2,2,731,2,2,2,2,2,2,2,2,2,2,2,2,2,731,731,731,731,731,2,731,731,731,731,731,2,2,2,2,731,731,731,731,731,731,731,731,2,2,731,731,731,731,731,731,2,731,731,731,45,731,2,731,2,731,731,731,731,731,731,731,731,731,731,731,731,731,731,731,731,731,731,2,2,731,731,2,731,2,2,2,2,2,2,2,2,2,731,731,731,731,731,2,2,731,2,2,2,731,731,2,731,2,2,731,731,731,731,731,731,731,731,2,2,2,2,2,2,2,2,2,2,2,2,2,2,731,731,2,731,2,731,731,2,2,2,2,2,2,2,2,2,2,2,2,731,731,2,731,731,731,731,731,731,731,731,731,731,731,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,731,731,731,731,731,731,731},
+ {1220,410,1193,352,260,434,469,41,1090,961,961,728,2,2,330,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,261,261,261,261,2,261,261,2,261,261,2,261,261,261,261,2,261,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,261,261,261,261,2,2,261,261,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,261,261,2,261,2,2,2,2,2,2,2,2,2,261,2,2,2,2,2,2,2,2,261,261,2,261,261,261,2,2,261,2,261,261,2,2,2,261,261,261,261,261,2,261,2,2,261,2,2,2,261,2,2,2,261,2,2,2,261,261,261,261,2,261,261,261,261,261},
+ {898,1043,391,1289,29,830,184,321,1136,85,1133,1082,864,864,2,2,2,2,2,2,2,2,789,789,2,789,789,2,2,789,789,2,381,381,381,2,2,2,709,709,709,709,789,789,2,789,709,709,709,709,2,789,789,789,709,789,789,709,709,709,709,381,381,381,381,709,709,789,789,2,2,2,709,709,709,789,789,2,2,2,2,2,2,2,2,709,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,709,2,2,709,709,2,2,2,2,2,2,2,2,2,2,2,709,2,2,709,709,709,709,709,789,709,709,2,2,2,2,789,2,2,789,789,2,2,2,789,789,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,789,789,789,789,789,789,789,789,789,789,789,789,789,789,789,2,789,789,789,789,789,789,789,789,789,789,789,2,789,789,789,789,2,789,789,789,789,789,789,789,789,789,789,789,789,789,789,789},
+ {1223,434,851,152,140,1495,190,397,925,37,1080,430,2,2,204,2,759,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,982,2,982,2,2,2,2,2,2,2,2,2,2,2,982,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,486,486,486,486,982,486,486,2,2,486,486,486,2,2,2,2,2,2,2,744,2,2,2,128,128,441,441,441,710,710,710,710,364,486,486,2,982,982,982,982,982,278,278,2,486,2,2,2,332,2,2,332,278,2,2,2,2,278,278,2,278,486,486,486,486,332,332,2,2,2,332,332,332,278,278,332,278,278,278,278,278,332,486,332,332,332,332,332,332,332,332,332,332,332,332,332,332,332,332,332,332,332,332,332,332,332,278,486,486,278,332,486,486,486,332,486,332,332,486,486,486,486,486,486,332,332,332,332,332,278,332,278,2,2,128,486,486,486,486,486,278,332,278,278,278,486,278,486,486,486,486,332,332,332,332,332,332,486,486,278,278,278,278,278,486,486,278,486},
+ {989,1043,184,232,64,403,284,745,171,171,995,223,380,380,1400,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,874,874,2,2,2,874,874,2,2,874,874,2,874,2,874,2,874,874,2,2,2,2,2,2,874,874,2,2,2,2,874,874,874,2,2,874,874,874,874,874,874,874,874,874,874,874,874,874,874,2,2,874,2,2,2,874,874,874,874,874,874,874,874,874,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,446,446,2,874,874,874,874,874,2,2,874,874,2,874,874,874,874,874,874,874,874,874,874,874,874,874,874,2,2,2,2,2,874,874,874,874,874,874,2,874,874,2,2,2,91,91,2},
+ {939,1070,1288,254,973,901,321,109,568,713,336,988,2,946,262,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,235,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1226,1226,1226,1226,1226,2,1226,1226,1226,1226,2,2,2,2,2,1226,1226,2,1226,1226,1226,1226,1226,1226,1226,1226,1226,2,2,1226,1226,1226,1226,1226,1226,1226,1226,1226,1226,1226,2,2,2,1226,2,2,2,1226,1226},
+ {1276,636,569,258,325,675,342,85,88,579,833,833,833,833,520,2,2,2,2,520,520,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1203,1203,2,2,2,2,520,2,2,2,2,520,520,2,2,2,2,2,2,2,2,520,2,2,520,2,2,520,520,520,520,520,520,520,520,520,520,520,520,520,520,2,2,520,520,520,2,2,1203,520,520,520,520,2,2,2,1203,1203,2,1203,1203,1203,1203,448,448,448,448,1203,1203,520,1203,520,2,2,520,1203,1203,1203,1203,1203,1203,1203,1203,2,2,2,2,2,2,2,2,2,2,1203,2,2,1203,1203,1203,1203,1203,1203,2,2,2,1203,1203,2,2,2,2,2,520,2,2,1203,1203,2,1203,1203,2,2,2,2,2,2,1203,1203,1203,1203,1203,1203,2,2,2,1203,1203,2,1203,1203,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {982,508,815,214,206,602,448,685,446,572,1549,8,1047,1047,1047,2,2,2,2,2,2,2,363,502,2,2,71,363,2,2,363,363,71,71,71,71,71,71,71,71,71,71,2,832,363,363,363,363,363,2,2,2,2,2,2,2,2,502,363,1433,2,2,2,71,71,832,502,502,832,832,832,832,832,832,502,832,502,2,502,502,502,71,2,2,392,392,392,28,28,28,448,363,363,502,363,363,363,363,363,2,2,363,363,71,502,363,502,502,502,502,502,363,363,363,1342,502,502,502,502,502,502,502,41,71,71,71,1156,502,502,502,502,502,502,502,502,502,502,502,502,502,502,502,502,502,502,502,502,502,502,502,502,502,502,502,502,502,982,982,982,982,982,982,982,502,502,502,41,41,71,568,527,235,235,235,502,502,502,502,502,502,502,502,982,982,982,982,982,982,982,982,1342,982,982,982,982,982,982,1342,1342,982,982,982,982,982,982,982,982,982,982,502,502,502,982,982,982,982,982,982,982,982,982,982,982,982,982,982,913,913,913,913,913,913,502,502,502,982,982,982,913,913,982,982,982,982,982,982,502,502,502,502,982,502,502,502,502,502},
+ {1288,1398,789,514,151,600,1618,1194,1419,441,234,204,1191,438,828,2,857,857,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1110,1110,1110,2,2,2,2,2,2,2,2,1573,2,2,2,2,2,2,1110,2,1110,1110,2,2,2,2,2,2,1110,1110,2,2,2,1110,1110,1110,1110,1110,2,2,2,2,2,2,1110,1110,2,2,2,1110,1110,2,1110,2,2,2,1110,1110,1110,2,2,2,2,2,1110,1110,1110,2,2,1110,1110,1110,2,2,2,2,2,2,1110,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1110,1110,1110,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1110,2,2,2,2,2,2,2,1110,1110,1110,2,1110,1110,1110,1110,1110,1110,1110,2,1110,1110,1110,1110,1110,1110,1110,2,2,2,2,2,2,2,1110,2,2,1110,1110,1110,1110,2,1110,2,2,2,2,2,2,2,1110,1110,1110,1110,1110,1110,2,2},
+ {1002,342,1045,757,1008,979,322,240,1211,171,552,123,2,129,129,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,309,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,15,15,15,15,15,2,2,2,2,2,2,2,2,2,2,2,309,2,2,2,2,2,882,2,2,2,2,2,2,2,2,2,2,2,2,2,309,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,309,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,294,294,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1401,402,525,293,97,223,452,808,61,169,1023,1023,886,886,1023,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,85,85,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1019,2,1019,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,773,2,2,2,1128,235,825,228,825,545,228,1202,1202,1202,1202,436,436,436},
+ {1001,644,263,164,136,939,624,95,489,1023,1107,331,331,10,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,505,2,700,2,2,2,2,2,2,2,2,2,2,700,2,700,700,700,2,700,2,2,2,2,2,2,2,2,2,2,2,2,2,2,700,700,700,700,2,2,700,2,2,2,2,2,2,2,2,2,700,2,2,700,2,2,2,700,700,700,700,700,700,2,2,2,4,32,2,2,2,1107,376,376,94,376,201,201,201,201,418,726,201,726,378,378,378,378,378,378,378,378,378,378,378,378,378,378,378,378,378,378,378,700,2,2,74,74,2,2,2,2,700,353,378,378,378,378,378,378,378,378,378,378,378,378,378,378,378,378,378,378,378,378,378,378,378,378,378,378,378,378,378,378,378,378,378,700,74,223,223,378,378,378,378,378,378,378,378,378,378,378,378,378,378,378,378,378,378,378,378,378,378,378,378,378,378,378,378,378,378,378,2,2,1107,376,376,376,378,378,378,378,378,378,378,378,378,378,378,378,378,378,378,378,378,378,378,378,378,378,378,378,378,378},
+ {1011,475,845,532,567,951,663,295,877,1275,227,39,618,683,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,933,933,2,2,933,933,2,933,933,933,933,933,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,933,933,2,2,933,933,2,2,2,933,933,2,933,933,2,933,933,2,2,933,2,2,2,2,933,2,2,933,2,2,2,2,2,933,1393,1393,1393,933,933,933,933,933,933,933,933,933,933,2,2,933,933,933,2,933,933,933,933,2,933,933,933,933,933,933,933,2,933,933,933,933,933,933,933,933,933,933,933,2,933,2,933,2,2,933,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,933,2,2,2,2,2,2,933,933,933,933,933,933,933,933,933,933,933,933,933,933,933,933,933,933,933,933,933,933},
+ {1401,741,509,797,47,157,1256,482,1513,899,736,780,780,210,2,2,2,2,783,783,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1047,880,369,402,641,446,639,586,277,396,419,275,825,820,2,2,2,238,238,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,238,2,2,2,281,2,2,281,2,2,2,2,281,281,281,281,281,281,221,221,221,221,221,221,281,2,281,281,281,281,281,281,281,238,281,238,281,2,2,281,281,281,281,281,2,281,281,281,281,281,281,2,2,281,281,281,281,281,281,238,238,238,238,238,238,238,238,238,2,2,2,2,281,2,2,2,2,2,2,281,281,238,238,2,2,2,281,281,2,2,2,2,281,281,2,2,2,2,2,2,281,281,281,2,2,2,238,2,2,2,2,2,281,2,2,2,281,281,281,281,281,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,281,281,2,238,2,2,2,2,2,2,2,281,281,2,281,281,281,2,281,281,2,2,2,2,2,2,2,281,281,2,2,2,281,281,281,281,281,281,281,281,2,2,2,2,2,2,2,2,2,281,281,820,281,2,820},
+ {1273,701,831,1294,1580,137,162,415,563,11,92,116,116,116,2,2,2,2,2,2,1029,1029,1029,504,504,877,877,877,877,877,1029,1029,1029,1029,1029,1029,504,504,504,504,504,442,356,356,148,442,442,442,442,442,442,442,442,442,442,442,504,356,442,2,504,504,356,356,356,356,504,356,365,504,504,148,148,2,2,42,2,42,42,42,1346,1346,1346,2,2,2,2,442,442,877,1029,365,119,442,1029,2,1029,1029,365,2,2,2,1029,1029,2,2,504,504,504,1303,890,890,1029,1029,1029,877,877,1029,1029,1029,877,877,877,2,2,877,410,504,2,877,504,504,877,2,877,877,877,877,442,877,877,1029,877,877,877,1029,877,877,1029,877,877,877,877,877,1029,1029,1029,1029,1029,1029,877,1029,2,2,1029,877,877,1029,877,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,877,877,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,2,1029,1029,1029,1029,1029,1029,1029,442,2,2,2,442,1029,1029,2,1029,442,1029,1029,2,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,2,2,1029,1029,1029,365,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029},
+ {1335,400,315,412,172,125,568,1024,58,601,398,985,640,577,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,195,195,195,2,2,195,195,2,2,2,195,195,2,2,195,195,195,195,804,195,195,195,110,110,110,110,195,195,2,195,195,110,2,2,2,2,2,2,110,2,110,2,2,195,195,110,195,195,195,195,2,2,2,2,804,804,804,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1453,947,486,485,453,415,1164,684,504,605,422,998,727,727,2,2,2,1136,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1136,2,2,2,1136,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1136,2,2,2,2,2,2,1136,2,2,1136,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1136,1136,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1057,1198,146,529,284,1286,160,135,75,686,648,1425,821,586,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,587,2,2,2,2,2,2,2,2,587,587,299,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,587,587,2,2,2,2,2,2,587,2,2,2,2,587,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,587,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,587,587,587,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,587,2,2,2,2,299,587,2,2},
+ {1052,442,936,64,132,1378,1323,161,161,161,230,131,12,12,2,2,2,2,2,2,2,2,2,2,2,998,998,998,998,2,2,2,2,2,2,2,2,2,2,2,515,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,515,515,2,2,2,515,515,515,515,515,515,2,515,449,449,515,515,2,611,611,2,2,2,2,515,2,2,515,2,2,2,2,2,2,2,2,2,515,515,2,2,2,2,2,2,2,2,2,2,2,515,515,2,515,2,2,515,515,515,2,2,515,515,515,515,515,2,515,515,515,2,2,2,2,2,2,2,2,515,515,2,2,515,515,515,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,515,2,515,2,2,2,515,515,515,515,611,2,2,2,515,515,611,515,611,515,449,2,2,515,515,2,2,2,515,515,515,515,515,515,515,515,515,515,515,515,515,515,611,611,611,611,611,611,449,515,449,2,611,2,611,611,611,515,515,515,515,449,449,611,611,449,449,449,449,449,449,449,449,449,449,2,449,449,611,449,515,449,449,449,449,449,449,449,2,611,611,611,449,449},
+ {1422,838,234,554,736,243,344,526,1108,33,1303,699,249,305,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1279,681,423,813,806,269,412,420,985,485,761,1013,649,796,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,796,796,2,2,2,2,2,2,796,796,796,796,796,2,796,796,796,796,2,796,796,796,796,2,796,796,796,796,796,796,796,796,2,2,2,796,796,796,796,796,796,796,796,796,796,796,2,2,796,796,796,796,796,1332,2,2,2,796,796,796,796,796,796,796,1332,1332,796,796,796,796,796,796,796,796,796,796,796,796,796,2,2,513,513,513,1332,2,513,796,513,1332,796,513,513,513,513,513,513,796,796,1332,1332,796,513,796,796,796,796,796,796,796,796,796,796,796,796,796,2,796,796,796,796,198,796,796,796,796,796,796,513,513,513,796,796,796,796,796,513,796,1332,2,796,2,1332,1332,1332,1332,796,796,796,796,796,2,796,796,796,796,796,796,796,796,2,796,796,796,796,796,796,796,796,796,796,2,796,796,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1332,2,2,2,2,2,2,2,2,2},
+ {938,614,523,557,898,624,178,461,287,985,371,371,260,613,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,593,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,593,593,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,593,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,593,593,593,593,2,2,2,2,2,2,2,2,2,2,2,2,2,2,593,2,2,2,2,2,2,2,2,2,2,2,2,2,2,593,593,593,593,593,593,593,2,2,593},
+ {1335,834,652,528,536,523,497,60,173,777,238,59,4,59,4,8,2,2,2,559,559,559,559,559,559,559,2,2,559,559,559,2,2,559,559,559,559,559,559,559,2,2,2,2,2,559,559,559,2,2,2,2,559,2,2,2,2,2,2,2,559,559,559,559,2,2,2,2,559,2,2,2,2,2,559,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,559,2,559,2,2,2,2,2,2,2,2,2,2,2,2,2,2,559,559,559,559,559,559,559,559,559,559,559,559,2,559,559,559,559,559,2,559,559,559,559,2,2,2,559,559,559,559,559,2,559,559,2,2,2,559,559,2,559,2,2,559,559,2,559,2,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559},
+ {1040,998,324,93,887,497,1326,443,152,1193,595,80,80,80,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1420,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,221,221,2,2,2,2,2,2,2,2,2,2,1420,1420,1420,2,1420,1420,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1420,1420,1420,2,1420,1420,1420,1420,1420,2,1420,1420,2,1420,1420,1420,1420,1420,1420},
+ {1302,1116,283,1006,891,838,768,373,468,968,1178,1178,1269,1269,876,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,663,663,2,2,2,2,2,2,2,2,2,2,2,2,2,663,663,663,2,2,2,2,2,663,663,663,663,663,663,663,663,663,663,663,663,663,663,42,663,663,663,663,42,663,663,663,663,663,42,42,42,42,663,663,663,42,663,663,663,42,42,42,663,663,663,663,663,663,663,663,663,663,663,663,663,663,663,663,663,663,663,663,663,663,663,663,663,663,663,663,663,663,663,663,663,663,663,663,663,663,42,663,663,2,2,42,663,663,663,2,663,663,663,663,663,663,663,663,663,663,663,2,2,663,663,663,1153,1153,1153,1153,1153,1153,2,2,2,2,2,2,663,663,663,2,2,2,2,2,2,2,2,2,663,2,2,2,2,2,2,663,663,663,663,663,663,663,663,663,663,663,663,663,663,663,663,663,663,2,2,663,663,663,663,42},
+ {1027,1128,114,395,357,417,848,22,389,1257,734,838,838,301,900,2,90,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,821,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,821,821,2,2,2,2,2,2,2,821,2,821,821,2,2,2,2,511,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,821,42,42,2,2,2,2,2,2,2,2,821,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,821,821,600,600,600,600,600,2,2,821,2,821,821,821,2,821,821,2,2,2,233,2,821,821,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,821,821,821,821,821,821,821,821,821,821,233,2,2,821,821,821,821,821,233,2,2,2,2,2,233,2,233,233},
+ {1072,724,717,877,873,369,1031,698,917,1641,1641,1641,53,549,549,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,201,201,201,201,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {987,1243,424,240,53,1150,558,292,1107,574,814,1474,1474,1068,1186,2,2,2,2,2,2,2,2,2,2,2,2,2,2,859,2,2,2,2,2,2,859,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,859,859,859,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,859,859,859,859,2,2,2,859,2,859,2,859,2,2,2,859,859,859,859,2,859,859,2,859,2,859,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,859,2,2,2,2,2,2,2,2,2,2,859,859,859,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,859,859,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1454,1228,375,267,72,301,51,1398,1378,168,838,360,853,853,172,2,2,2,2,2,2,2,2,2,2,2,760,466,466,466,2,2,466,760,760,760,631,631,466,2,2,2,368,368,2,2,2,2,2,2,2,368,638,638,638,368,368,368,368,2,2,2,62,466,2,368,368,368,368,368,368,368,368,368,368,368,2,2,368,368,2,368,368,368,2,62,325,2,2,2,2,2,2,2,368,368,2,2,368,368,368,368,2,2,368,631,2,2,368,2,368,368,368,368,368,368,2,2,374,374,374,374,374,374,368,368,368,368,368,52,52,52,52,2,368,368,368,368,368,368,368,368,851,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,760,368,368,368,368,631,631,631,631,368,368,368,325,368,368,368,325,325,325,325,679,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,325,325,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,760,760,760,760,368,368,368,368,368,368,368,368,368,368,62,62,368,368,368,631,368,368,368,368,368,368,368,368},
+ {1040,420,960,882,64,661,292,146,976,427,689,248,248,248,638,2,2,2,2,2,2,2,2,2,2,2,2,861,861,861,2,861,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,861,861,861,2,861,861,861,861,861,861,861,861,861,861,861,861,2,2,861,861,861,861,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,638,2,2,2,2,2,861,861,861,2,861,861,861,861,861,2,2,861,2,2,2,861,861,2,861,861,861,861,2,861,861,2,2,861,861,2,2,861,861,861,2,861,861,861,861,861,2,861,861,2,861,861,2,2,2,2,2,861,861,2,2,861,861,861,861,861,861,861,2,2,861,2},
+ {1040,522,666,398,78,208,293,818,134,867,147,147,482,2,4,629,629,629,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,792,792,792,792,792,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,122,2,2,2,2,2,2,2,2,2,2,2,2,2,122,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,122,122,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,122,122,122,122,122,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,122,122,122,122},
+ {1041,1090,651,130,72,389,171,237,516,777,937,937,937,168,168,2,336,2,2,2,2,2,2,2,2,2,992,2,992,2,992,2,2,2,2,2,2,992,992,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,992,2,2,2,992,992,992,2,2,992,992,2,992,992,992,992,992,992,992,992,992,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,992,2,2,2,2,2,2,2,2,2,992,992,2,2,2,992,2,992,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,992,992,2,2,2,2,992,992,992,2,2,2,2,2,2,992,992,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,992,992,2,992,2,2,992,992,992,992,2,2,2,2,2,2,992,2,2,2,2,992,2},
+ {987,1280,1245,1300,926,676,56,546,541,690,84,42,1000,1383,1383,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,778,778,2,778,778,2,2,2,2,2,2,778,778,778,778,2,2,2,2,2,2,2,2,2,2,2,2,2,2,778,778,2,2,2,2,2,2,2,2,2,2,2,2,778,2,2,2,2,2,2,778,778,778,778,778,778,778,2,2,778,778,778,2,2,2,2,778,2,2,2,778,778,778,778,2,2,778,778,778,778,778,2,778,778,778,2,2,778,778,778,778,778,778,2,778,778,778,778,778,778,778,778,778,778,778,778,778,778,778,778,778,778,778,778,778,778,778,778,2,778,778,778,778,778,2,2,778,2,2,2,2,2,2,778,778,778,778,778,2,778,778,778,778,2,778,778,2,2,2,2,2,778,778,778,778,2,778,778,778,778,778,778,778,2,2,2,778,778,778,778,778,778,778,778,778,778,778,778,778,778,778,778,778,778,778,778,778},
+ {1324,588,1378,592,1445,1029,759,1296,739,931,363,704,312,704,704,704,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,298,298,298,298,298,298,298,298,298,298,298,298,298,298,298,298,298,298,298,298,298,298,298,298,298,298,298,298,298,298,298,298,298,298,298,298,298,2,2,298,298,2,2,2,298,298,298,2,2,2,2,2,298,298,298,298,2,2,298,298,2,298,2,2,298,298,298,2,2,2,298,298,298,298,298,298,298,2,2,2,298},
+ {1058,454,1557,191,129,297,695,1390,1274,460,923,923,923,2,4,1059,2,2,2,2,2,2,2,2,2,2,2,2,2,1059,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1059,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1059,1059,1059,2,1059,1059,2,2,2,1059,1059,1059,2,2,2,2,1059,1059,2,2,2,1059,1059,2,2,2,1059,1059,1059,1059,1059,1059,1059,1059,1059,1059,1059,1059,1059,947,300,300,300,300,1059,1059,1059,1059,947,1059,2,2,386,386,947,1059,386,386,386,386,386,386,386,386,386,1059,1059,1059,1059,300,1059,1059,947,947,947,2,2,2,2,947,947,947,947,947,1059,1059,1059,1059,947,947,947,1059,1059,1059,947,947,947,947,947,947,947,1059,1059,1059,1059,947,947,947,1059,1059,947,947,947,947,947,947,947,947,947,947,947,947,1059,1059,1059,947,947,947,947,947,947,947,947,947,1059,300,300,386,386,1059,386,300,2,1059,947,947,947,947},
+ {1327,572,282,1022,907,1276,409,643,1050,633,187,187,187,2,228,45,2,2,2,2,2,2,320,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1119,2,2,2,2,2,1119,1119,1119,1119,2,2,320,2,2,320,2,2,2,320,1119,2,2,320,320,320,2,320,320,320,2,2,320,320,320,1119,320,320,320,320,320,2,2,320,320,320,320,2,320,2,320,320,2,2,2,2,2,2,2,2,320,2,2,2,2,2,2,2,2,2,320,2,2,2,2,2,2,2,1119,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1395,958,237,101,559,891,560,47,524,747,197,589,589,917,887,887,887,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,431,431,2,2,2,2,2,2,2,2,2,2,2,2,2,2,174,2,2,174,174,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,174,2,2,1086,2,174,2,2,174,174,2,431,2,2,2,2,2,2,2,2,2,2,174,431,431,431,431,174,174,174,174,2,2,174,174,174,431,431,431,431,431,431,431,431,431,431,431,2,431,431,431,431,431,431,431,431,431,431,174,174,174,174,174,174,431,431,431,431,431,431,431,431,431,431,431,174,431,431,431,431,174,174,174,174,431,174,174,174,174,174,431,431,431,431,431,431,431,431,431,431,431,431,431,431,431,431,431,431,431,431,431,431,431,431,431,174,174,1086,174,1086,1086,431,431,174,174,384,431,431,174},
+ {1395,529,461,402,194,392,122,781,111,162,780,593,593,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1228,1228,1228,1228,2,2,1228,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1485,1041,1225,331,873,260,335,353,588,1254,1201,1245,1245,2,2,824,726,2,2,2,129,2,2,2,2,2,2,2,2,799,799,799,799,2,2,667,667,667,667,2,667,2,667,667,667,2,2,2,2,2,667,2,2,2,2,2,667,667,2,667,2,667,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,667,2,2,2,2,2,2,2,2,667,799,799,799,799,799,667,2,2,2,2,799,799,799,799,799,667,667,799,799,799,799,667,667,799,799,799,667,667,667,799,799,2,2,2,2,2,2,2,799,799,799,2,2,2,799,2,2,667,799,799,799,799,2,2,799,799,799,667,799,2,667,2,2,799,799,799,799,799,799,799,2,799,799,799,2,799,799,799,799,799,799,799,799,799,799,799,799,799,799,799,799,799,799,799,799,799,799,799,799,799,799,799,799,799,799,799,799,799,799,799,799,129,799,799,799,799,799,799,799,799,799,765,799,799,799,799,799,799,799,799,799,799,799,799,667,667,2,667,667,2,667,129,129,799,129,129,129,799,129,667,2,2,667,667,2,799,799,799,129,129,129},
+ {1378,541,848,848,347,856,102,104,183,156,395,130,1377,2,2,2,159,159,159,2,2,2,772,2,2,2,2,2,2,2,2,2,2,2,2,772,772,2,772,772,2,2,772,2,2,772,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,772,772,772,772,772,772,2,2,2,2,2,2,223,223,772,772,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1062,212,784,63,252,873,1302,1108,1380,84,1375,1375,1375,2,2,2,375,374,2,980,2,2,2,980,980,980,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,630,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,980,2,2,2,2,2,2,2,630,630,630,630,2,2,2,2,2,2,2,2,2,2,630,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {830,995,146,112,467,345,1480,730,648,1453,1230,520,520,2,2,2,959,959,959,959,959,959,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1384,549,430,781,946,879,901,924,741,114,14,451,36,2,2,2,2,287,287,287,803,803,803,803,2,2,2,803,803,803,803,803,803,2,2,2,2,803,803,803,803,803,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,803,803,803,2,2,2,803,803,2,2,2,803,2,803,803,803,287,803,2,803,2,2,2,803,803,803,803,803,803,803,803,2,803,803,803,2,2,2,803,803,2,2,2,2,803,803,803,803,803,803,2,2,2,803,2,2,2,2,2,803,803,803,803,2,803,803,803,803,24,803,803,803,803,803,803,2,2,803,803,803,803,803,803,803,803,803,803,803,803,803,803,803,803,803,803,803,803,803,803,803,803,803,803,803,803,803,2,2,803,803,2,2,287,287,287,803,287,803,803,803,803,803,803,803,803,803,287,803,803,803,287,287,287,287,287,2,803,803,803,803,803,803,2,2,803,803,803,803,803,803,803,803,803,803,803,803,803,803,803,803,803,803,803,803,803,803,803,803,803,803,803,803,803,803,803,2,803,803,803,803,803,803,803,803,803,803,803,803,803,803,803,803,803,803,2,803,803,803,803},
+ {1413,627,1329,1092,526,197,31,417,1149,981,964,1003,685,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,717,717,2,2,2,2,2,717,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,717,2,2,2,2,2,2,2,717,2,717,717,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,717,717,2,717,717,717,717,717,717,717,717,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,717,717,2,2,2,717,717,717,2,717,717,717,2,2,2,2,717,717,717,2,717,717,717,717,717,717,717,717,717,2,2,2,717,2,2,2,717,717,717,717,717,717,2,2,717,717,2,717,717},
+ {1084,1174,1601,949,910,960,500,461,1290,23,1042,636,212,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,361,361,361,361,2,2,2,2,2,2,2,2,361,361,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,241,2,2,361,361,361,361,2,361,361,361,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,361,2,241,2,1456,1456,2,2,361,2,2,2,2,241,241,2,241,241,241,241,241,241,241,241,241,2,241,2,2,241,241,2,2,2,2,361,361,241,241,2,361,361,361,361,2,2,2,361,361,2,2,361,361,361,2,2,361,361,361,361,361,361,361,2,241,241,361,361,361,2,361,361,2,361,361,361,361,2,361,361,361,361,361,2,361,361,2,361,361,361,361,361,361,2,361,2,2,241,241,361,361,361,2,361,361,361,361,361,2,2,2,2,2,2,361,2,2,361,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1420,531,626,738,376,537,814,206,990,235,847,812,201,201,201,201,726,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1155,1155,1155,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,141,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,726,726,726,2,2,2,2,2,708,726,726,2,726,726,201,201,201,201,201,201,2,2,2,726,726,726,726,726,2,726,726,2,2,726,726,726,726,201,201,201,726,201,726,726,201,726,726,726,726,726,726,726,201,201,201,201,2,201,201,201,201,201,201,201,201,201,726,2,2,2,2,2,2,2,726,726,2,2,708,708,201,201,201,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,726,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,726,2,2,2,2,2,2,2,2,2,2,2,726,726,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,201,201,201,2,2,2,2,2,2,2,2,2,2,2,2,756},
+ {1420,624,363,537,1436,278,292,377,263,820,376,382,382,2,654,655,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1198,2,1198,2,1198,1198,1198,1198,1198,1198,2,2,1198,2,2,2,2,2,2,2,2,2,1198,2,2,2,1198,1198,1198,1198,2,2,1198,1198,1198,1198,1198,1198,1198,1198,1198,1198,2,1198,1198,1198,1198,1198,1198,1198,2,2,1198,1198,1198,1198,1198,1198,1198,1198,318,318,1198,1198,1198,1198,1198,1198,1198,1198,1198,1198,1198,1198,1198,1198,1198,1198,1198,1198,1198,1198,1198,1198,1198,1198,1198,1198,1198,1198,1198,1198,1198,1198,1198,1198,1198,1198,1198,1198,1198,1198,1198,1198,1198,1198,1198,1198,1198,1198,1198,1198,1198,1198,1198,1198,1198,1198,1198,1198,2,2,1198,2,2,2,2,2,2,1198,1198,1198,1198,1198,1198,1198,1198,2,2,2,2,1198,1198,1198,1198,1198,1198,1198,1198,1198,1198,1198,1198,1198,2,2,2,1198,1198,1198,1198,1198,1198,2,2,2,2},
+ {1091,793,1353,208,506,599,846,503,1011,247,289,61,1050,61,61,61,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,349,349,349,349,2,2,2,2,2,2,2,2,2,2,2,349,2,349,2,2,349,349,349,349,2,2,2,2,2,2,2,2,2,349,2,2,349,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,349,349,349,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,349,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,349,349,349,2,2,2,2,2,365,365,365,2,2,2,2,349,349,349,349,349,349,2,2,349,349,365,365,349,365,365,349,2,2,2,2,2,2,349,349,349,2,349,349,349,349,2,349,349,2,2,349,349,2,2,2,2,349,349,2,2,2,1164,349,349,349,2,2,365,365,365,365,365,365,365,365,365,365,365,365,2,349,2,2,2,2,2,2,2,2,2,2,2,2,349,349,2},
+ {1098,1323,120,1167,76,1111,128,716,739,490,114,338,566,2,178,228,2,2,2,2,2,2,2,2,2,572,2,2,2,2,2,572,572,572,572,572,572,572,2,572,572,572,572,572,572,572,572,572,2,2,2,2,2,2,2,2,2,2,2,572,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,572,2,2,2,572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,2,572,572,572,2,2,2,43,2,2,2,2,2,2,2,2,572,572,572,2,2,2,2,2,2,572,43,43,43,43,572,43,43,43,572,572,572,2,2,572,572,572,572,572,572,572,43,43,572,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,572,572,572,572,2,2,572,572,572,572,2,572,572,572,572,572,572,572,572,572,572,572,572,572,572,43,2,2,2,2,2,2,2,2,2,2,2,2,572,572,572,2,572,2,43,43,2,2,572,572,572,2,572,572,572,2,2,2,572,572,43,572,572,572,572,572,572,572,2,2,572,2,2,572,572,572,572,2,2,572,572,572,2,2,2,572,572},
+ {1533,978,284,156,914,162,685,1184,252,1375,189,256,640,2,640,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,521,521,2,2,1286,1286,1286,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,521,521,521,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,521,521,521,521,521,2,2,2,2,2,521,521,2,2,2,2,2,2,2,2,2,2,521,521,521,521,521,521,521,521,521,521,521,2,2,2,2,2,2,2,2,2,2,2,2,2,1286,1286,1286,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,521,521,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1531,692,414,277,541,1371,1447,682,536,109,432,1240,1240,2,1022,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1128,398,791,1170,76,661,408,259,756,495,79,553,10,10,1532,1532,1532,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1532,1532,2,1532,2,2,2,2,1532,1532,61,61,61,2,2,2,1532,1532,1532,1532,1532,1532,2,2,1532,2,2,1532,1532,1532,1532,1532,1532,1532,1532,1532,1532,1532,1532,61,61,61,61,61,1532,1532,2,61,1532,1532,1532,1532,1532,1532,1532,1532,2,1532,1532,1532,61,61,61,61,61,61,61,61,61,61,1532,1532,1532,1532,1532,1532,1532,1532,1532,1532,1532,1532,1532,1532,1532,1532,61,61,1532,920,1028,1028,1028,1028,1028,2,2,224,224,224,224,2,2,2,61,2,2,2,2,2,2,2,1532,1532,2,1532,2,1532,2,1532,2,2,2,2,224,2,2,2,2,2,1532,1532,1532,1532,1532,1532,2,2,2,2,2,224,224,224,224,2,2,1532,1532,2,2,2,224,224,2,2,2,224,2,2,2,224,224,1028,1028,1028,1028,224,224,1028,1028,1028,1028,224,224,920,920,920,2},
+ {1106,523,1346,818,755,662,1137,234,822,62,459,163,163,577,40,2,2,2,1183,2,2,2,2,2,2,2,2,1183,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1040,704,618,854,374,1470,274,383,941,519,351,351,351,351,351,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1427,988,498,1529,99,678,1323,149,33,426,543,543,335,1507,772,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,613,613,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,613,2,2,2,2,2,2,2,2,2,2,613,613,2,613,613,613,2,2,2,613,613,613,613,613,613,613,613,613,2,2,613,613,613,613,613,613,613,613,613,613,613,613,613,613,2,2,613,613,613,613,613,613,1202,1202,1202,1202,1202,1202,613,613,613,613,613,613,2,2,613,613,613,613,613,2,613,587,613,613,613,587,587,613,613,587,613,613,613,613,613,613,613,613,613,613,613,613,613,971,613,613,971,971,613,613,613,613,2,587,587,613,613,613,613,613,613,613,613,613,613,613,2,613},
+ {1102,349,490,266,144,220,599,437,743,764,647,1128,605,265,324,324,324,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1056,1056,2,2,2,1056,2,2,2,2,2,2,2,1056,2,409,1056,2,2,781,781,409,409,781,409,781,2,2,1027,1056,1056,1027,2,2,2,1027,1027,1056,1077,1077,2,1056,1056,1056,2,2,2,1056,1056,1056,433,1027,1027,1027,1027,257,1027,1056,257,1440,1440,1027,669,669,433,1056,1027,2,1440,1440,433,1056,1056,433,1440,1440,1056,642,642,642,642,433,433,642,642,642,642,433,433,433,433,433,433,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,33,33,1230,1230,611,980,318,1027,1027,1027,1027,642,642,1440,1440,1440,1440,1440,1440,1440,1440,1440,1440,1440,1440,433,1440,1440,1440,1440,1056,385,433,433,433,1440,1440,1440,1440,1440,1440,1440,1440,1440,1440,1440,1440,1440,257,257,1440,1440,1440,1440,1440,1440,642,165,433,1027,433,433,1440,1440,1440,1440,1440,1440,1440,433},
+ {1118,496,645,592,354,1133,935,428,72,532,182,182,1370,660,123,2,294,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,393,2,393,2,2,393,2,393,2,2,393,393,2,393,393,393,2,2,393,2,393,393,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,393,393,393,2,2,393,2,2,2,393,2,2,2,2,2,2,393,2,2,2,393,2,2,393,393,393,393,393,2,2,2,393,393,393,393,2,393,393,393,393,2,393,393,393,2,393,393,2,2,393,393,2,2,393,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,294,294,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,393,393,393,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1102,1042,315,745,1006,771,630,68,587,1187,295,295,295,408,408,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1137,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,319,2,2,2,1137,1137,1137,2,319,319,2,319,319,319,319,319,319,319,2,2,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,2,2,2,2,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,2,2,2,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,2,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319,319},
+ {1118,724,1322,405,199,614,1087,885,1313,317,769,660,660,1158,535,2,2,2,373,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,835,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,835,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,835,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1120,772,743,488,346,126,784,584,943,153,311,133,133,969,605,605,2,2,2,2,2,2,2,605,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1404,284,176,590,1128,1371,322,543,1136,546,1315,174,174,777,777,891,2,2,2,2,2,2,2,579,579,579,579,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,579,2,2,2,2,2,2,2,2,2,2,2,2,2,2,579,579,2,2,2,2,2,2,2,2,2,579,579,2,2,579,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,579,2,579,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,413,413,2,2,2,2,2,2,2,2,2,2,2,2,2,579,579,579},
+ {1441,791,233,141,141,316,89,296,462,1263,758,482,599,599,578,341,2,2,2,2,2,2,2,2,2,2,2,525,525,525,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,185,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,185,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,126,126,2,2,2,2,2,2,2,2,2,2,2,2,126,126,2,2,126,126,126,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,185,185,2,2,647,126,126,126,2,2,2,2,2,2,2,2,2,2,2,126,126,126,2,126,2,2,2,2,2,185,185},
+ {1413,406,700,547,1166,250,518,543,104,331,205,205,691,691,2,2,118,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,447,447,447,447,447,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1120,416,126,843,805,849,368,1396,1473,751,120,120,493,936,936,60,60,60,60,2,2,2,2,2,2,2,2,2,1086,1086,1086,1086,1086,1086,2,1086,1086,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,490,490,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1485,400,1497,168,82,680,1103,554,249,702,493,101,296,236,2,236,236,944,944,2,2,394,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,413,413,394,394,394,394,394,2,2,2,413,413,413,1499,1499,1499,1499,1499,413,413,413,413,413,413,413,413,413,2,413,413,413,394,394,413,413,413,1000,1000,1000,1000,1000,1000,413,413,413,413,165,165,165,2,2,2,2,394,394,394,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1499,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,413,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,413,2,2,2,2,413,413,413,2,2,413,413,413,2,413,2,413,413,413,2,413,413,413,413,413,2,2,413,413,413,413,413,413,413,413,413,413,413,413,413,413,413,2},
+ {1127,869,558,533,1215,194,1762,784,593,777,1153,1079,1079,1079,2,2,2,330,1045,2,1045,1045,2,2,2,2,2,2,2,2,2,787,787,2,2,2,2,2,2,2,2,2,787,787,200,787,787,787,787,2,787,2,787,787,787,787,787,2,787,787,787,787,787,2,787,787,2,787,2,2,787,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1459,1243,467,533,266,1364,1031,890,1402,486,1678,1678,93,978,2,2,2,978,947,947,2,978,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,341,341,341,341,2,2,2,2,2,2,2,2,2,76,76,76,2,2,2,2,76,2,2,2,2,2,2,341,341,2,341,2,341,76,76,76,76,76,76,341,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,76,76,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1139,809,117,522,955,1096,1120,1470,116,184,1565,1565,557,557,2,2,2,2,2,829,1326,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1142,984,1044,590,340,241,662,357,366,1305,2,125,631,474,2,2,2,980,2,2,2,2,2,2,2,2,2,2,2,2,2,1273,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1273,1273,566,1273,2,2,1273,1273,1273,1273,1273,1273,2,1273,1273,1273,1273,1273,1273,2,1273,1273,1273,2,1273,1273,1273,1273,1273,1273,1273,1273,2,1273,1273,1273,1273,1273,1273,1273,1273,2,1273,1273,1273,1273,1273,1273,1273,1273,1273,2,2,1273,1273,1273,1273,2,2,1273,1273,1273,1273,2,2,1273,1273,1273,1273,1273,1273,1273,1273,1273,1273,2,2,2,1273,1273,1273,1273,1273,1273,1273,1273,2,1273,1273,1273,2,2,2,1273,1273,1273,2,1273,1273,1273,1273,1273,1273,1273,1273,1273,2,1273,1273,1273,1273,1273,1273,1273,1273,1273,1273,1273,1273,1273,1273,1273,1273,1273,1273,1273,1273,1273,1273,1273,1273,1273,1273,1273,1273,1273,1273,1273,1273,1273,2,2,1273,1273,1273,1273,1273,1273,2,1273,1273,1273,1273,1273,1273,1273,1273,1273,1273,1273,1273,1273,1273,1273,1273,1273,1273,1273,1273,1273,1273,1273,1273,1273,1273,1273,1273,1273,1273,1273,1273,2,1273,1273,1273,2,2,1273,1273,1273,1273,1273,1273,1273,1273,1273,1273,1273,1273,1273,1273,1273,1273,1273,1273,1273,1273,1273,1273},
+ {1469,1247,1277,616,209,486,106,552,219,217,471,272,272,1201,2,2,503,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1487,1010,320,966,785,847,954,1060,138,856,966,966,966,703,2,703,703,2,2,2,2,2,2,2,2,2,2,2,2,1279,2,1279,1279,2,2,1279,1279,1279,1279,1279,1279,2,2,2,2,302,302,302,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,475,475,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,475,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,302,2,302,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,148,148,128,128,2,128,128,128,128,128,128,148,2,2,128,128,128,128,128,128,128,185,353,297,128,148,148,297,35,128,35,148,148,297,148,148,148,148,148,148,148,148,148,148,1606,148,148,1606,1606,148,1606,148,148,1606,1606,1606,1606,1606,1606,148,148,148,148,148,148,148,148,148,1606,148,148,148,148,148,1606,1606},
+ {1148,542,1478,496,950,464,1011,235,136,180,2,416,758,453,2,909,2,2,2,2,2,2,2,2,2,2,1019,1019,2,2,2,2,165,2,2,2,2,2,2,2,2,2,2,2,165,165,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1329,1019,1019,1019,1019,1019,1019,1329,1019,2,2,1019,2,2,165,2,2,2,1019,1019,1019,1019,1019,1329,1329,1329,1329,1329,1329,1329,1329,1329,2,1329,1329,2,2,2,2,2,2,1019,1019,1019,1019,1019,1019,1019,1019,1019,1019,1019,334,2,2,165,165,165,165,165,165,165,165,165,165,165,165,114,1329,2,2,2,458,458,458,458,2,2,1329,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,165,2,2,2,845,2,2,2,1329,1329,2,845,845,2,2,2,2,2,2,458,458,2,1329,1329,845,845,845,458,458,458,458,458,458,458,2,2,2,2,2,2,2,2,2,2,2,165,165,165,165,2,165,165,165,165,165,165,165,165,165,165,165,165,165,2,165,165,165,165,165,2,165,2,2,2,2,165,458,1019,165,165,165,165,165,2,2,458,458,165,165,165},
+ {1495,1178,874,415,1100,368,1057,1228,562,215,31,31,680,680,680,1208,2,2,2,2,2,2,2,2,1208,2,2,2,2,1208,1208,2,2,1208,2,2,2,2,2,2,1208,2,2,1208,2,1208,1208,1208,1208,1208,2,2,1208,2,2,1208,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1208,1208,2,2,2,2,1208,1208,1208,1208,1208,1208,1208,1208,1208,1208,1208,1208,1208,1208,1208,2,1208,1208,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1208,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1208,2,2,2,1208,1208,2,2,2,2,2,2,1208,1208,2,2,2,2,2,2,2,2},
+ {1497,1166,1613,1403,107,803,993,539,1436,1289,2,240,334,634,532,1147,2,2,2,2,2,2,2,117,2,2,2,2,2,2,2,117,2,2,117,117,117,117,2,2,2,2,2,2,2,117,2,2,2,2,117,117,117,117,117,117,117,117,2,2,2,2,2,2,2,2,117,117,2,2,2,117,117,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,117,117,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,532,532,2,2,2,117,117,117,2,2,2,2,117,117,117,2,2,2,2,532,532,532,532,532,532,532,532,532,532,532},
+ {1617,289,1033,169,355,260,30,45,721,906,88,44,44,418,417,218,2,2,846,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,846,2,846,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1642,766,1253,368,1344,282,1572,199,810,677,1182,1182,273,607,402,559,2,2,2,2,2,2,2,2,2,2,2,2,1182,2,2,2,2,2,2,1182,1182,1182,1182,1182,1182,2,2,1182,1182,1182,1182,1182,1182,1182,1182,1182,1182,1182,1182,1182,1182,1182,1182,1182,1182,2,1182,1182,1182,1182,1182,1182,1182,2,2,2,1182,2,478,478,478,478,478,1182,2,478,2,2,2,2,2,2,2,2,2,2,2,478,478,478,478,478,2,2,2,2,2,2,2,2,478,478,478,399,399,478,399,399,399,399,399,399,399,1182,399,399,1182,2,2,2,1182,1182,1182,1182,478,478,2,478,478,478,478,1182,1182,1182,1182,1182,1182,1182,1182,1182,1182,1182,1182,1182,1182,1182,1182,1182,1182,1182,1182,1182,1182,1182,1182,1182,1182,1182,1182,399,399,1182,1182,399,1182,1182,1182,1182,1182,2,1182,1182,1182,1182,1182,1182,1182,1182,1182,1182,1182,1182,1182,1182,1182,1182,1182,1182,1182,1182,1182,2,2,1182,2,2,2,2,1182,1182,1182,1182,1182,1182,1182,1182,1182,2,1182,2,2,2,2,2,2,1182,478,399,399,399,478,478,478,1182,1182,1182,1182,2,1182,1182,1182,1182,1182,1182,878,1182,878,878,1182,1182,1182,2,1182,1182,1182,1182,1182,2,1182,1182},
+ {1515,1002,1117,1023,561,1334,363,946,1023,982,2,258,260,260,1049,260,2,2,2,2,2,2,1049,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1049,1049,2,2,2,2,2,2,2,2,2,2,2,1049,1049,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1696,1696,1696,2,2,2,2,1696,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1628,721,400,239,728,1336,984,425,65,120,1232,463,463,640,349,616,616,2,2,2,2,2,2,2,2,147,147,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,349,349,2,2,2,349,349,349,349,229,229,349,349,2,349,349,349,349,2,2,2,2,349,349,349,349,349,349,349,349,349,349,349,349,349,349,349,349,349,147,147,147,349,349,349,349,2,2,2,349,349,349,349,349,349,349,349,349,349,147,147,349,349,349,349,349,349,349,349,147,147,147,349,349,349,349,627,627,2,349,349,349,349,349,349,349,349,349,1505,2,2,2,2,349,147,147,349,147,349,349,349,349,349,349,229,229,2,229,229,2,2,2,2,2,2,2,2,2,2,2,2,568,2,2,2,2,568,2,2,2,2,2,568,568,2,568,568,2,2,2,349,349,349,349,349,349,2,2,2,349,147,147,147,147,1505,1505,1505,1505,2,2,2,2,2,2,2,2,2,2,2,2,229,229,229,229,229,229,229,229,229,229,229,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1623,499,308,1058,1184,1230,63,1515,433,110,763,763,422,954,954,954,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,133,133,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,133,133,2,2,2,2,2,133,2,133,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,133,133,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,133,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1628,286,541,530,1610,201,1220,1592,272,181,2,38,263,1586,1157,1157,1157,2,2,2,1157,1157,2,2,2,1157,2,2,2,2,1157,1157,1157,1157,1157,1157,1157,1157,1157,1157,1157,1157,1157,2,1157,1157,1157,2,2,2,2,2,2,509,509,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1157,1157,2,2,1157,1157,1157,1157,1157,1157,2,1157,1157,2,1157,2,2,2,1157,1157,2,2,2,2,1157,2,1157,1157,1157,1157,1157,1157,2,2,1157,584,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,761,761,2,2,2,2,2,2,2,2,761,1157,2,2,2,2,2,2,2,2,2,2,2,2,2,1157,761,761,761,2,584,584,584,2,2,1157,2,218,2,2,2,2,4,262,22,761,2,2,1032,262,306,1162,1048,1048,1319,1162,82,761,761,761,761,218,761,761,761,761,761,761,761,761,761,761,761,761,761,761,761,761,761,761,761,761,761,761,761},
+ {1531,621,210,755,482,82,1308,317,427,168,2,232,116,190,701,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,701,701,701,2,701,701,701,701,701,701,701,701,701,701,701,701,701,2,2,2,701,701,701,701,701,701,701,701,701,2,1420,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1420,1420,1420,1420,1420,1420,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,993,993,993,993,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1420,1420,1420,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1532,575,1245,360,249,630,133,1406,920,1539,63,63,76,82,82,2,2,2,770,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,974,974,974,974,974,974,974,2,2,2,974,974,2,2,974,974,974,2,63,63,2,2,2,2,2,2,2,2,63,2,2,63,63,2,2,2,2,2,2,2,2,2,63,63,63,63,63,63,63,63,63,63,2,2,2,63,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,63,2,2,2,63,63,2,2,2,63,2,2,1356,2,2,974,974,2,1356,1356,974,974,974,2,2,2,2,63,2,2,2,2,2,2,2,63,63,63,2,1356,1356,1356,1356,1356,1356,1356,63,63,63,63,1356,1356,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,63,63,63,63,2,2,2,63,2,2,2,1028,2,2,2,2,974,974,974,974,974,974},
+ {1102,785,118,93,1491,988,275,53,1328,26,2,2,240,647,240,761,761,761,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1478,722,113,1534,1751,115,1728,1234,777,282,508,508,1184,63,1184,855,855,2,2,2,738,738,578,578,2,2,2,2,2,2,2,2,2,2,2,2,2,704,704,578,2,2,2,2,2,2,2,2,2,2,578,2,578,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,578,578,2,2,2,2,2,2,2,578,2,2,578,578,578,578,578,578,578,578,578,578,2,2,578,578,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1268,1268,1268,1268,1268,2,2,2,2,2,2,2,2,2,2,2,2,1268,2,2,2,2,2,2,2,2,2,2,578,2,2,2,2,2,2,2,2,578,578,578,578,2,2,2,578,578,578,578,578,578,578,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1480,536,1421,164,429,84,970,1673,548,497,2,2,530,156,156,128,245,2,2,2,2,260,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,690,690,2,2,2,2,2,2,2,2,2,496,496,496,496,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,690,2,2,1719,257,2,257,257,2,2,2,2,2,2,257,2,2,2,2,2,690,690,690,690,2,690,690,690,690,257,257,257,257,257,257,257,2,2,2,2,1066,257,2,2,2,2,690,690,257,257,257,257,257,257,257,257,52,52,52,52,52,257,2,2,2,2,690,690,690,257,257,257,690,257,1719,1719,1719,1719,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,257,2,2,690,257,257,2,257,2,2,2,257,257,2,2,690,690,690,257,1719,1719,1719,2,2,1719,1719,2,1719,530,1719,1719,1719,2,1719,1719,2,2,2,2,2,2,2,2,2,2,2},
+ {1533,1302,1286,538,619,526,1669,145,1034,125,2,1038,1038,388,388,387,729,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,261,261,261,2,2,2,1420,2,1420,2,261,261,261,261,2,2,2,2,2,1420,2,2,2,2,2,261,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1420,1420,1420,1420,2,2,2,2,2,2,261,1420,2,2,1420,1420,1420,1420,2,2,2,2,2,2,2,2,1420,1420,1420,1420,2,2,2,2,2,2,261,261,2,261,261,2,2,261,261,2,2,2,2,261,261,261,261,2,2,261,261,261,261,261,261,261,261,261,261,261,261,261,261,1420,1420,261,261,261,261,261,1420,261,1420,1420,261,261,261,261,261,1420,1420,1420,1420,261,261,261,261,261,261,261,261,261,261,261,261,1420,1420,1420,1420,261,261,261,261,261,261,261,261,261,261,1420,261,261,261,261,261,261,261,261,261,261},
+ {1482,961,1093,556,1746,628,427,689,510,751,684,37,37,1229,1256,882,1507,1507,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1472,852,533,433,924,57,53,1036,410,675,1212,1212,1212,600,600,1212,1259,1245,1245,1245,1245,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1212,1212,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1259,1259,1259,1259,1259,1259,1259,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1245,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1080,1369,902,155,403,580,98,850,835,608,2,2,694,1028,199,199,2,121,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1228,425,1030,699,407,171,568,925,1104,97,2,2,1286,1286,1286,502,2,1219,1219,1219,1290,2,1219,1219,1219,1219,2,2,2,59,2,2,2,59,59,2,2,2,2,1219,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1219,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1219,1219,1219,1219,1219,2,1219,2,1219,2,2,2,2,2,1219,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1219,2,2,2,2,2,1219,2,1290,1219,1290,1219,1219,1219,1219,1219,1219,1290,1290,1290,1290,1290,1290,1290,1290,2,2,1219,1290,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1290,1219,2,2,2,1219,1219,2,2,1219,1219,1219,1219,1219,1290,1219,1290,1219,1219,1219,1219,1219,1219,1219,1219,1219,1219,1219,1219,1219,1219,1219,1219,1219},
+ {1547,657,777,695,1254,224,933,367,212,385,2,2,2,1422,749,245,885,710,2,2,710,710,710,45,710,710,710,710,2,336,710,2,2,2,2,710,710,2,710,710,2,2,2,2,2,2,2,2,710,2,2,2,2,2,2,710,2,2,710,710,781,2,2,2,710,2,2,710,710,710,2,2,2,710,710,45,45,710,2,2,2,710,710,710,710,710,781,710,710,710,710,710,2,710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,2,2,710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,2,710,710,710,710,710,710,710,710,710,710,2,2,2,1279,2,2,2,2,336,710,710,710,710,710,710,2,2,2,2,336,2,2,2,336,2,2,336,336,336,710,2,2,336,336,336,710,336,710,2,2,710,710,1279,336,245,2,2,2,336,336,710,336,336,336,2,710,336,2,710,2,710,710,710,2,2,2,710,2,2,710,710,2,710,710,710,710,2,2,2,2,2,710,2,710,2,336,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,2,2,2,119,119,119},
+ {1678,466,549,145,351,816,1041,334,192,192,2,2,348,1017,130,4,4,180,180,180,180,512,2,2,2,512,512,512,512,512,128,8,8,1247,1247,2,2,1364,1364,1364,180,180,180,180,194,194,194,194,2,2,512,512,512,512,512,128,1247,1247,1247,1247,1247,1247,1364,682,682,682,682,575,575,575,399,859,297,297,297,549,594,594,594,594,594,859,594,859,859,859,575,575,575,575,575,575,913,549,549,1364,1364,549,2,549,549,549,1364,549,863,863,599,1247,1247,1364,1364,1364,1364,1364,1364,680,1364,194,194,194,194,194,194,1364,1364,1364,1364,1247,1364,1364,874,1247,1247,1247,1247,1364,682,1364,1364,1364,575,575,575,575,575,575,859,297,297,297,549,594,594,594,594,594,859,594,594,859,303,303,1110,1110,1110,1110,1110,1110,1110,1110,1110,154,1110,1110,1110,1110,154,154,154,154,154,154,154,154,154,154,194,1362,1362,194,194,194,194,194,194,194,194,194,194,194,874,590,590,590,194,590,590,590,590,590,590,85,85,1142,298,1375,555,939,939,1505,555,1423,85,85,85,314,628,157,874,1327,1327,1327,1142,1362,151,151,151,151,1050,1050,143,143,939,939,939,939,1086,939,939,1556,194,151,194,194,561,561},
+ {1550,569,481,1041,1680,1114,1265,160,386,194,2,2,2,533,929,531,422,531,1355,1355,1355,1355,531,216,216,2,2,2,2,2,2,2,828,828,36,36,36,2,2,216,216,531,531,531,317,216,216,216,216,936,936,820,531,531,216,216,216,216,216,216,216,216,216,216,531,243,243,243,243,243,243,243,36,36,36,820,216,1764,1764,1764,1764,1764,1764,828,828,828,828,828,828,828,292,67,243,243,820,820,243,243,820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,243,243,243,243,216,340,216,216,340,4,4,1764,1764,1764,1764,1764,1764,1404,1404,2,2,2,1029,1029,1029,1029,1029,334,334,334,334,334,334,334,2,2,162,162,162,162,162,54,54,54,54,334,340,340,340,340,820,820,820,820,1355,531,820,820,531,820,820,2,2,2,820,820,820,820,820,964,67,67,67,67,67,820,820,820,820,820,820,292,292,292,67,820,820,820,820,820,820,820,820,67,531,531,531,820,820,1029,820,419,419,419,419,419,828,419,594,594,594,594,594,594,594,594,594,1029,1029,67,67,67,387},
+ {1559,462,850,289,1570,71,512,858,810,835,2,2,2,2,1028,1205,1205,546,546,546,1205,1205,1205,1205,1205,2,1205,1205,1205,1205,1205,1205,2,2,2,1205,1205,1205,1205,635,546,546,546,546,546,546,1205,1205,1205,1205,1205,1205,635,635,2,546,2,2,2,545,2,2,2,2,546,546,1205,1205,1205,1205,1205,1205,1205,1205,546,546,546,2,2,2,2,2,546,546,2,546,546,546,2,546,2,2,546,546,546,546,546,546,546,546,546,546,546,546,546,546,546,2,2,2,546,546,546,2,2,2,2,2,2,2,2,1205,1205,1205,1205,1205,1205,635,545,2,2,1205,546,1205,1205,1205,1205,1205,1205,1205,1205,1205,546,546,635,635,635,635,546,546,635,2,635,635,546,546,635,635,635,635,635,635,546,546,546,546,546,546,546,546,546,546,546,546,546,546,546,546,546,546,546,546,546,546,546,546,546,546,546,546,546,546,546,546,546,546,546,546,2,2,2,1205,546,546,546,546,546,546,546,546,546,546,546,1205,546,546,546,546,546,546,546,546,546,546,546,546,546,2,546,546,546,546,546,546,546,546,1205,546,546,546,546,546,546,546,546,546,546,546,546,546,546,546,546,546,546,546},
+ {1192,888,701,164,131,613,282,237,525,366,2,2,2,2,1737,845,845,750,2,1062,1062,1062,1062,1062,1062,1062,1062,1062,1062,2,1261,1261,1261,2,1261,1261,1261,1062,1261,1261,2,2,1261,2,2,2,1062,2,2,1062,1062,1062,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1261,1261,1261,1062,1062,1062,1062,2,1062,1062,1062,1062,1062,1062,2,1062,1261,1261,796,796,796,796,1261,1062,1062,1062,1062,1062,1062,1062,1261,1062,2,1062,1062,1062,1062,1062,1062,1062,1062,1062,1062,1062,1062,1062,1062,1062,1062,1062,1062,1062,1062,1062,1062,1062,2,2,1062,1062,1062,1062,1062,1062,1062,1062,1062,2,1062,2,2,2,2,2,2,2,1062,2,2,2,2,2,2,2,2,1062,2,2,1062,1062,1062,2,2,2,2,2,2,2,2,1062,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1062,1062,1062,1062,2,2,2,1062,1062,1062,1062,1062,2,1062,2,2,2,2,1062,1062,1062,1062,1062,1062,1062,2,2,2,2,2,2,2,2,1062,1062,1062,2},
+ {1208,426,412,1072,274,248,1544,627,9,458,2,2,2,2,2,2,270,270,270,150,715,282,150,150,150,150,150,150,150,150,150,150,150,150,39,39,39,39,39,2,39,715,715,715,715,715,715,715,715,715,715,715,715,715,715,715,715,715,715,715,2,2,2,715,715,715,715,715,715,573,573,573,573,573,2,2,573,2,2,2,2,150,173,173,173,173,173,2,173,173,2,335,2,573,335,2,2,2,335,335,2,2,2,715,715,715,715,715,715,715,715,715,2,769,769,2,2,2,2,2,2,150,150,715,715,715,715,2,2,715,715,2,2,2,2,2,335,335,335,335,335,715,595,2,2,715,715,715,715,715,715,715,715,715,715,150,335,335,335,335,335,335,715,715,715,150,173,173,715,715,715,715,150,150,2,150,150,150,150,595,150,150,150,150,595,595,595,595,595,2,595,2,2,2,2,715,2,715,715,715,150,150,715,715,39,39,39,39,39,39,39,39,39,39,335,335,2,769,39,39,2,2,769,150,150,715,2,2,715,715,2,2,2,150,150,2,2,2,2,2,2,715,715,715,715,715,715,2,2,2,2,2,2,2,2,173},
+ {1210,806,162,569,861,1002,1048,55,98,112,2,2,2,2,2,2,844,844,149,529,529,529,2,2,2,2,2,119,119,17,17,714,584,119,2,2,2,119,119,119,119,119,119,119,119,119,2,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,1332,1332,1332,119,119,119,119,1332,1332,1332,1332,1332,1332,1332,1332,1332,1332,1332,1332,1332,1332,1332,1332,1332,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,119,119,119,119,119,119,119,119,119,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,119,119,119,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1128,393,1522,96,160,581,540,120,441,176,2,2,2,2,2,2,1427,551,1102,1102,328,328,592,592,592,592,592,592,592,592,592,592,592,592,2,2,2,924,924,592,451,451,451,924,924,924,924,924,924,924,924,924,924,924,924,924,451,451,451,451,451,451,451,451,451,451,592,924,924,451,592,592,592,592,924,451,451,924,924,2,924,924,264,264,264,264,264,264,264,264,451,451,451,924,702,924,924,924,924,924,451,451,451,451,451,451,451,451,451,451,451,924,924,924,2,2,2,451,93,93,93,2,2,2,2,2,592,592,592,2,2,924,2,924,2,2,2,924,924,924,924,924,924,924,924,924,924,2,2,924,2,592,2,2,2,2,2,592,2,2,2,2,592,592,2,2,2,451,592,592,592,592,592,592,2,2,2,2,592,592,592,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,592,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1202,538,171,1177,1090,690,1566,746,1012,1012,2,2,2,2,313,781,808,313,1125,1117,930,1117,1117,1117,1117,1117,1117,1117,1117,2,2,2,2,1117,1117,1117,1117,1117,1117,1117,1117,1117,1117,1117,1117,1117,1117,1117,1117,1117,2,1117,1117,1117,1117,2,2,1117,1117,1117,1117,1117,1117,1117,1117,1117,1117,1117,1117,1117,1117,1117,2,2,1151,766,766,766,766,766,766,766,766,2,766,766,766,766,766,766,2,2,766,766,766,766,766,766,1117,1117,1117,1117,1117,1117,1117,1117,1117,1117,1117,1117,766,2,1117,1117,1117,2,2,766,766,766,766,766,766,766,766,766,766,766,766,2,1117,1117,2,2,2,1117,1117,1117,2,2,2,2,2,2,2,1117,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1117,1117,2,1117,1117,1117,2,2,1117,1117,2,2,2},
+ {1567,1265,372,1633,613,484,243,1523,21,275,2,2,2,431,431,431,431,2,2,978,489,889,889,889,889,889,889,889,2,2,2,2,2,2,2,2,2,203,889,889,889,889,889,889,889,889,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,889,889,2,889,889,889,2,889,1037,2,1037,1037,1037,1037,1037,2,2,1037,1037,1037,1037,889,1037,1037,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,889,889,2,2,2,2,2,2,2,2,2,889,889,889,889,889,2,2,203,203,578,578,2,578,578,578,578,578,578,578,578,578,578,2,2,2,2,2,2,2,889,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,203,203,203,203,203,203,203,2,2,2,2,2,2,2,2,2,2,2,2,203,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1707,577,414,457,554,146,230,446,629,283,2,2,2,1156,272,1582,1582,2,2,1260,1260,1260,1260,483,1260,1260,1260,1260,1260,1260,1260,2,2,749,749,1260,1260,1260,749,749,2,2,2,749,749,2,2,749,2,749,1260,2,2,2,749,749,749,749,749,749,2,2,2,2,1260,1260,2,2,2,2,2,1260,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,483,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1260,2,2,2,2,2,483,483,483,483,483,483,483,2,2,2,2,1260,2,2,2,2,2,2,2,2,1260,2,2,2,926,1260,483,2,749,2,2,1260,2,2,2,926,2,2,2,749,749,749,749,1260,2,2,1260,1260,1260,1260,1260,1260,2,2,2,1260,1260,1260,1260,1260,1260,1260,1260,2,1260,1260,2,2,1260,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1260,1260,2,1260,1260,2,2,1260,1260,2,2,1260,1260},
+ {1566,982,815,133,891,412,1179,831,651,268,2,2,2,367,366,367,367,63,63,767,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,63,63,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1522,1422,1017,124,499,451,731,1112,1355,1355,2,2,2,854,854,336,854,336,1297,2,2,2,193,193,193,193,193,2,2,2,2,2,2,2,2,2,2,2,900,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,900,900,900,2,900,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1160,1331,917,1696,401,547,122,592,863,863,2,2,703,703,703,703,495,495,495,2,2,495,495,495,495,495,269,2,2,2,269,269,2,2,269,269,269,269,269,2,495,495,495,495,495,703,2,2,2,2,495,495,269,495,2,2,2,2,269,269,703,269,2,92,92,2,2,2,703,2,2,703,703,703,703,2,2,703,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,703,47,495,608,608,608,608,2,2,2,2,2,703,703,2,2,2,2,2,703,703,703,703,703,269,703,703,703,703,703,2,703,703,703,703,703,703,703,2,2,2,703,703,703,703,703,703,703,703,703,703,703,703,2,703,703,703,703,2,703,703,2,703,703,703,2,2,703,703,703,703,703,703,703,2,2,572,1353,1353,1353,1353,1353,1353,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,205,205,703,703,703,703,703,703},
+ {1605,1499,454,1072,686,732,309,295,940,551,2,2,880,264,264,973,2,2,72,314,2,2,2,890,890,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,890,2,2,2,2,2,2,2,2,2,2,2,2,890,890,890,890,2,2,2,2,890,2,890,890,890,890,2,890,890,890,2,2,890,890,890,890,890,890,890,2,890,890,890,890,2,2,2,2,2,2,890,2,2,890,2,2,2,2,890,890,890,890,890,890,890,890,890,890,890,890,2,2,2,2,2,2,2,2,2,2,2,890,890,890,2,2,2,2,2,2,2,2,890,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,890,890,890,890,890,2,2,2,2,2,2,2,2,2,2,2,2,2,2,890,890,890,890,890,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,890,890,2,890,890,890,2,2,2,2,2,2,890,2,890,890},
+ {1538,814,1027,677,524,226,756,202,242,102,2,2,912,564,1289,682,2,1125,1125,1125,1125,2,1289,1289,1289,1125,1125,1125,2,1289,1289,1289,1289,1289,1289,1289,1289,2,2,1289,1289,1289,1289,1289,1289,1289,1289,1289,1289,1289,2,1289,1289,2,2,2,1289,1289,1289,1289,1289,1289,1289,1289,1289,1289,2,2,2,2,2,2,2,2,2,2,1289,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1598,397,1471,1471,1162,866,236,948,1557,737,2,2,153,737,1408,765,765,608,2,2,2,171,608,608,608,608,2,608,608,2,2,2,2,2,2,608,2,2,608,608,2,2,2,2,2,608,608,608,608,608,608,2,2,2,2,2,2,2,2,2,2,2,2,2,2,608,608,608,608,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,2,2,2,551,551,462,324,324,128,324,324,722,722,197,197,608,197,197,197,608,608,608,608,608,1865,867,867,765,765,765,765,765,2,765,608,765,765,765,765,765,1865,765,765,765,765,75,765,765,765,765,765,765,765,765,765,2,608,765,765,765,765,765,765,765,765,765,608,608,608,608,608,75,75,765,765,765,765,608,608,608,608,608,608,608,608,608,36,765,18,18,608,1187,424,424,424,1564,1564,1564,765,765,651,651,1341,876,41,41,765,765,765,765,765,1865,621,621,621,621,41,41,765,41,41,41,41,41,41,41,41,765,765,765,765,765,765,765,765,765,765,75,765,765,765,765,765,765,765,765,75,75,75,765,765,765,765,765,765,765,765,765,765,765,765,765,1637,1637,1637,765,765,765,765,765,765,817},
+ {1598,434,107,270,148,1317,835,123,642,1236,2,2,67,633,771,878,771,878,878,2,2,2,771,2,2,2,2,2,2,2,2,2,217,217,217,217,217,217,2,2,771,771,771,878,2,878,878,878,748,878,2,2,878,878,878,2,771,771,771,2,2,2,2,2,2,2,2,2,2,2,2,2,2,771,2,2,2,2,2,2,2,2,878,771,748,878,771,771,771,2,771,771,2,2,2,748,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,771,771,2,2,2,2,771,771,771,2,771,2,2,2,2,2,2,2,2,2,2,2,771,748,748,771,771,2,748,771,2,771,771,771,771,771,771,771,771,748,2,2,748,771,2,2,2,2,771,2,771,771,771,771,2,2,771,2,2,771,771,771,748,771,771,771,771,771,771,771,771,771,771,771,771,771,771,771,771,748,771,771,771,771,2,2,771,771,2,771,771,771,771,771,771,771,771,771,771,771,2,771,771,771,771,771,771,771,771,771,771,771,771,771,771,2,2,771,771,771,771,771,771,2,2,2},
+ {1628,1502,1042,822,80,403,1335,684,464,426,671,671,336,336,336,2,425,896,2,2,2,2,1337,1337,1337,1337,1337,1337,2,2,2,2,1337,1337,1337,1337,1502,1502,1337,1337,1337,1337,1337,1337,1337,1337,1337,1502,2,881,881,881,881,2,2,1502,1502,1502,1337,1337,1337,1337,881,2,1502,1502,1502,1502,1502,2,1502,1502,2,1502,2,1502,1502,2,2,2,1502,1502,2,2,2,1502,1502,1502,1502,1502,881,1502,2,2,881,881,2,2,45,45,147,1502,147,2,2,2,881,881,2,2,2,2,2,2,2,2,2,2,1337,2,2,2,2,2,2,2,2,2,1337,2,2,2,2,1337,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1337,2,2,2,2,2,2,2,2,2,1337,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1337,1337,1337,1337,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1337,1337,1502,1337},
+ {1630,715,1368,1273,993,293,385,545,1267,896,1038,1038,270,1325,1325,2,2,961,961,961,961,961,961,2,2,961,961,2,2,961,2,961,2,961,2,2,2,2,2,2,961,2,2,2,2,2,2,2,2,961,961,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,961,961,961,2,2,961,2,2,2,961,961,2,2,2,961,961,2,2,203,961,2,2,2,2,2,2,961,961,961,2,2,2,961,961,961,961,961,961,2,732,732,961,961,732,2,2,961,961,961,961,961,2,2,2,961,961,961,2,961,961,961,961,961,2,2,2,2,961,961,2,2,2,2,2,203,2,203,2,2,2,2,2,2,2,2,2,2,961,2,2,2,2,2,2,2,2,117,117,117,2,2,2,961,2,2,2,2,2,961,961,2,2,2,2,2,203,2,2,2,2,2,2,2,2,2,961,2,2,961,2,2,2,2,2,2,2,2,203,2,203,961,2,2,2,2,961,961,961},
+ {1612,723,409,641,796,1087,1228,1398,623,262,740,740,870,870,397,2,2,893,893,2,2,1367,328,2,328,2,2,2,2,2,2,2,328,328,328,328,328,328,2,328,328,328,2,2,2,2,1367,1367,1367,1367,1367,1367,1367,2,2,2,2,2,2,1367,1367,1367,1367,1367,1367,1367,2,1367,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1367,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,328,328,328,2,2,2,1367,1367,1367,2,2,2,2,1367,1367,1367,1367,1367,1367,2,2,2,2,328,2,2,328,2,2,2,2,2,328,2,328,328,328,2,2,328,328,328,2,2,328,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1614,588,652,105,441,844,734,912,532,878,1073,1073,62,1415,693,1431,1431,1431,1431,925,925,925,925,925,925,925,2,2,2,2,2,2,1431,1431,1431,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1607,1503,1072,471,221,277,854,1236,263,752,2,694,1657,934,553,2,2,2,498,498,2,802,2,46,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1568,1453,1203,661,421,977,373,631,336,1483,2,522,81,146,587,1235,1235,1235,2,956,2,2,2,956,956,956,956,956,956,956,956,956,956,2,2,956,956,2,956,2,2,956,1383,1383,1383,1383,1383,1383,956,2,2,2,2,2,2,1383,2,2,956,956,2,2,956,956,956,2,956,956,956,956,956,956,956,956,956,956,956,956,956,1383,1383,1383,1383,1383,1383,2,2,956,956,956,956,956,956,956,956,2,956,956,956,956,956,956,956,956,956,956,956,956,956,2,2,956,956,956,956,2,2,2,2,2,2,956,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1383,1383,2,2,1383,2,2,2,2,2,1383,2,2,2,2,2,2,2,2,2,2,1383,1383,2,1383,2,2,2,1383,1383,1383,1383,1383,1383,1383,1383,2,2,1383,1383,1383,1383,1383,956,956,1383,1383,1383,1383,1383,1383,1383,1383,1383,1383,956,1383,956,1383,1383,2,2,1383,1383,2,2,956,956,956,1383,1383,1383,1383,2,956,1383,1383,2,1383,1383,956,2,1383,956,956,956,956,956,1383,1383,956,1383,1383,1383,1383,1383,1383,1383,1383,956,1383,1383,1383,956,956,1383,2,2,1383,956,1383,1383,956,956,956,956,2,2,2},
+ {1172,987,140,1964,584,600,852,1725,456,1199,718,718,791,981,791,2,2,2,2,2,1260,2,2,2,2,2,718,2,2,718,2,718,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1260,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,718,2,2,2,2,2,718,2,718,2,2,2,718,718,2,718,718,2,2,2,2,2,2,2,2,2,718,718,718,718,718,718,718,718,718,718,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,718,718,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1756,1359,698,1584,446,724,729,419,660,1305,2,244,244,244,540,540,540,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,308,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,308,308,308,308,2,2,2,2,308,308,308,2,308,2,2,2,2,308,2,2,2,2,2,2,2,308,308,308,308,308,2,2,2,2,2,2,2,2,308,308,308},
+ {1746,771,620,415,1057,437,613,1034,1662,837,2,1149,1466,1149,1149,1149,1466,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1093,2,2,1093,2,2,2,2,2,1093,1093,2,1093,1093,2,1093,2,2,2,2,2,2,2,2,1093,1093,2,1093,1093,1093,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1093,1093,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1093,1093,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1647,1092,860,89,1514,1745,69,237,890,86,2,1629,48,482,392,2,1013,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1263,835,1533,789,1259,174,1497,557,644,203,2,289,604,434,434,434,2,844,844,2,2,2,1111,1111,1111,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1111,2,2,2,2,2,1111,1111,2,2,2,2,2,2,2,2,2,2,2,2,2,2,282,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1269,783,1045,429,1829,417,143,72,856,1152,941,1152,1171,175,59,1729,2,2,2,2,2,2,741,2,2,2,2,2,2,2,2,741,741,2,2,741,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,741,2,2,2,2,2,2,2,2,2,741,741,741,416,416,416,416,416,416,416,2,416,416,416,416,416,416,416,416,416,416,416,416,416,416,416,416,416,2,741,416,416,416,416,416,416,741,741,741,741,416,416,416,416,416,416,416,416,416,416,416,416,416,416,741,416,416,416,416,416,416,416,416,416,2,2,2,416,416,416,416,741,416,741,416,416,416,2,2,2,416,416,416,416,416,416,416,416,2,2,416,741,2,416,416,416,416,416,416,416,2,416,416,416,416,416,2,2,2,2,2,2,2,2,416,416,416,2,2,416,416,416,416,2,416,416,416,416,416,416,416,416,416,416,416,416,416,2,416,416,416,2,2,2,2,2,416,416,2,2,2,416,416,2,416,2,2,2,2,2,2,2,2,2,2,2,2,2,416,416,416,416,416,416,416,416,416,416,416,416,416,416,416,416,416,416,416,416,416,416,2,416,416,416},
+ {1272,884,388,1889,956,159,1172,595,219,645,2,629,107,107,1279,75,2,2,2,211,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,589,589,2,2,2,2,2,2,2,2,2,589,2,2,589,2,589,589,589,2,589,2,2,2,2,2,2,1537,1537,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,589,589,589,589,589,589,2,2,2,589,2,2,589,589,2,2,589,589,589,2,589,589,2,589,589,589,589,2,2,2,2,589,589,589,589,589,589,589,589,2,2,589,589,2,2,2,2,589,75,75,75,75,2,2,2,2,2,589,589,589,2,589,589,589},
+ {1797,904,172,659,349,177,692,448,1141,990,640,99,1073,806,640,640,2,640,640,911,911,911,640,640,640,640,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,640,2,640,640,2,2,2,2,2,2,2},
+ {1276,442,1008,1352,243,162,711,301,552,1002,668,668,384,71,384,384,2,2,2,2,2,727,727,727,777,777,777,777,777,777,2,777,777,777,777,777,777,777,777,777,2,777,777,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,777,777,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1147,2,777,777,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,777,777,777,777,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,534,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1600,1130,171,1113,813,722,117,990,37,24,969,94,825,1398,1398,1398,1398,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,969,2,862,969,969,969,969,969,969,969,2,969,969,969,969,969,969,969,969,969,969,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,969,969,969,969,2,969,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,969,969,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1198,496,714,609,644,1159,873,249,186,1539,136,239,379,1994,2,68,68,68,68,68,2,2,192,2,969,2,2,969,2,2,969,969,969,969,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,969,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,969,2,2,969,2,2,2,969,969,2,969,969,2,2,969,2,2,2,2,2,2,969,969,969,2,2,2,2,2,2,2,2,2,969,969,969,2,969,969,969,2,2,2,2,2,2,2,2,2,2,2,2,969,969,2,2,2,2,2,2,2,2},
+ {1678,1316,460,1133,1003,150,1236,1316,1417,218,1763,1763,77,77,2,1491,771,771,771,771,771,2,771,2,2,2,2,2,2,2,2,2,2,2,2,2,2,771,2,2,925,2,2,771,2,2,2,2,2,2,2,2,2,2,2,2,771,771,2,2,771,771,771,771,2,771,771,771,771,2,2,2,2,771,771,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,925,925,2,2,2,2,2,2,2,2,2,2,2,2,2,771,2,2,2,2,2,771,771,2,2,2,2,2,2,2,2,2,2,771,771,2,771,1604,2,771,771,771,771,771,80,771,771,2,2,771,771,2,771,925,2,2,771,771,2,925,771,925,1604,771,771,771,771,2,2,2,2,2,2,2,771,771,771,771,2,1604,1604,771,771,1604,771,771,771,925,771,1604,1604,1604,1604,1604,2,771,771,771,771,771,771,771,771,771,771,771,771,771,771,771,771,771,771,771,771,771,771,771,771,771,771,771,771,771,771,771,771,771,1604,1604,771,771,771,771,771,771,771,771},
+ {1682,449,1067,393,136,854,36,492,637,1053,247,1111,1111,1111,2,247,247,247,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1288,1690,702,760,420,333,1213,1911,805,351,67,67,1568,1568,2,2,604,142,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,215,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,215,215,2,2,2,2,2,2,2,342,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,342,342,342,342,342,2,2,342,342,2,2,342,342,342,2,2,342,342,342,342,342,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,342,2,2,2,2,342,342,342,342,342,2,2,2,342,342,342,342,342,342,342,342,342,342,342,342,2,2,2,342,342,342,342,2,2,2,2,342,342,342,2,342,2,2,2,2,2,2,2,342,2,342,342,342,342,2,2,342,2,2,342,342,342,342,342,342,342,2,342,342,342,342,342,342,342,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1288,1858,152,894,346,104,997,203,249,1006,1278,1489,1489,555,2,2,2,1074,1074,518,2,2,518,2,2,518,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,518,518,2,2,2,2,518,518,518,2,518,518,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1601,697,532,408,697,1140,1568,47,1499,780,1171,318,318,318,2,2,2,2,318,318,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,782,62,2,2,2,2,62,62,62,782,2,782,2,782,782,782,782,782,2,782,782,782,782,2,2,2,782,2,782,782,782,2,2,782,782,782,782,782,782,782,782,782,782,782,782,782,782,2,2,2,2,2,2,2,2,2,2,62,62,62,62,2,2,2,2,2,2,2,782,782,2,2,782,782,2,782,782,782,2,782,2,2,2,2,782,2,782,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,782,782,782,782,782,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,62,62,62,62,62,62,62,62,62,62,782,782,2,2,2,782,2,2,2,782,782,2,2,2,2,2,62,62,62,62,62,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1283,1078,791,873,655,412,389,835,292,958,1245,678,1611,1519,2,2,185,2,2,2,2,2,2,1245,1245,2,2,2,2,2,2,1245,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1245,1245,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,470,470,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,470,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1685,1610,1447,1093,1255,937,703,431,522,1384,988,988,253,988,2,1892,1892,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,382,382,382,2,2,2,382,382,2,2,2,2,2,382,382,2,2,2,382,382,2,2,382,382,2,2,382,382,382,2,2,382,382,2,2,382,382,2,2,2,2,2,382,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,382,382,2,2,382,382,2,2,382,2,382,382,2,382,382,382,2,2,382,382,382,382,2},
+ {1822,589,236,205,797,39,241,1048,181,386,102,102,102,111,1361,1361,1361,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,115,115,2,2,1454,1454,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1454,1454,2,2,2,2,2,2,1454,2,2,1454,1454,2,115,2,566,2,2,1454,2,2,1454,2,2,2,2,2,2,2,2,2,115,115,2,2,2,2,1454,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,115,2,115,115,2,2,1454,1454,1454,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,115,115,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1454,2,115,2,2,115,1454,1454,115,115,115,115,1454,1454,1454,1454,1454,1454,115,115,115,115,115,115,115,115,115,115,115,1454,115,115,2,115,115,115,115,115,2,2,2,2,115,115,2,1454,115,115,115,115,115,115},
+ {1233,843,813,157,396,669,1531,439,640,733,996,996,996,1566,951,608,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,582,582,59,8,8,83,83,8,966,966,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1342,705,302,595,1200,52,83,647,519,139,103,103,103,513,2,513,2,2,2,2,2,513,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,496,496,496,496,496,2,496,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,496,2,2,2,2,496,496,496,496,2,2,2,2,2,2,496,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,513,2,2,2,2,2,2,1525,2,2,2,2,2,2,2,2,2,496,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1525,2,446,2,2,2,2,2,446,513,513,513,513,2,2,2,513,513,2,513,2,2,2,2,2,2,2,2,2,513,513,513,2,2,2,2,2,2,2,2,513,513},
+ {1630,1244,142,767,1299,719,629,1716,419,837,1145,1136,1148,1405,1405,1405,2,2,2,2,2,309,309,309,309,309,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1405,2,2,2,2,2,2,2,2,2,2,2,2,309,1405,1405,1405,309,2,1405,1405,2,2,309,309,1405,1405,1405,1405,2,2,2,309,309,309,309,309,309,309,309,309,309,2,2,2,309,1405,1405,1405,1405,1405,1405,1405,2,1405,1405,1405,2,2,2,1405,1405,1405,1405,1405,1405,1405,1405,1405,1405,1405,1405,1405,1405,1405,1405,1405,1405,1405,1405,1405,1405,1405,1405,1405,2,1405,1405,1405,1405,1405,1405,2,2,2,309,1405,309,1405,2,1405,1405,1405,1405,1405,1405,2,2,2,2,2,1405,1405,2,1405,309,1405,309,309,2,1405,1405,2,1405,1405,1405,2,309,309,309,309,309,2,309,309,309,309,309,2,2,2,309,309,309,2,309,309,309,309,1405,1405,1405,1405,1405,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1684,561,1405,1118,960,686,1490,1490,992,153,1315,1315,1222,1222,804,1222,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,427,2,2,2,2,2,2,2,2,2,2,2,2,2,427,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,427,2,2,2,427,427,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,427,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,427,427,427,427,427,427,427,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1636,974,279,419,893,1608,1491,156,1486,115,730,730,863,509,924,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,271,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,271,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,271,2,2,2,2,2,271,271,271,271,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,271,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,271,271,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,271,271,2,271,271,271,271,271,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1708,237,748,68,1027,153,46,685,1370,1104,1131,1124,838,1289,1289,1288,2,1174,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,291,2,2,2,2,1131,1131,1131,291,291,291,291,291,1174,1174,1174,1174,1174,1174,1174,1174,291,291,1131,1131,1131,1131,1131,1131,1174,291,291,291,291,291,291,291,291,2,2,2,291,2,2,291,291,291,291,291,291,291,291,291,2,2,1174,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1174,1174,2,2,1174,291,291,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1318,1234,213,1089,1567,602,1330,404,467,718,249,215,354,177,59,332,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1446,1446,1446,1446,1446,1446,1446,2,2,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,1446,2,2,2,2,332,332,332,332,332,1446,1446,1446,1446,332,332,332,332,332,332,332,332,332,332,332,332,332,332,332,332,332,332,332,332,332,332,168,168,168,168,168,168,168,2,168,332,332,332,332,332,332,332,332,332,332,332,332,332,332,332,332,332,332,332,1446,332,332,332,332,332,332,332,332,332,332,332,1446,332,1446,1446,168,168,168,599,332,332,332,1446,2,2,168,168,168,168,168,168,168,168,168,168,168,332,332,332,1446,599,599,599,599,599,332,332,332,155,155,155,155,155,155,2,2,2,2,155,1446,168,599,332,332,332,332,332,332,332,599,155,155,155,155,155,155,155,155,2,332,332,332,1446,2,2,155,332,332,332,332,1446,1446,1446,1446,1446,332,2,2,599,599,599,599,599,599,332,332,332,1446,599,599,599,599,599,599,599,599,332,332,332},
+ {1732,1771,584,533,297,1056,669,293,146,311,1176,311,590,590,277,2,2,2,2,2,2,2,2,2,539,539,2,2,2,2,2,2,2,1137,1137,1137,142,142,142,142,142,142,142,142,2,2,2,2,2,2,2,2,2,744,2,744,744,744,142,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1238,1238,2,2,2,2,2,2,1238,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1238,1238,1238,1238,1238,1238,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,142,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1137,1137,2,2,142,1137,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1137,1137,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1137,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,142,142,142,142,142,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1137,2,1137,1137},
+ {1026,512,1196,394,1259,1313,762,549,311,1576,1576,465,465,140,465,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,82,2,2,2,2,2,2,2,82,82,82,82,82,82,82,2,2,2,2,2,2,2,2,2,2,2,2,2,2,82,82,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,82,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1360,383,1470,502,1010,153,1588,619,1246,396,1107,1107,112,423,423,2,2,2,2,2,202,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,202,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,202,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,202,202,2,2,2,2,2,2,2,2,2,2,2,2,847,847,2,2,2,2,2},
+ {1320,1636,858,1210,509,194,1575,154,1424,455,1860,832,1075,581,262,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,740,2,2,740,740,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,740,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,740,740,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1749,326,968,886,610,1588,1083,976,1551,602,558,245,99,711,485,485,485,485,485,2,2,2,2,2,2,2,2,1234,1234,1234,1234,1234,1059,2,1059,1234,2,4,2,4,2,4,4,8,2,2,2,648,324,780,128,128,554,512,554,8,108,108,108,108,108,108,108,108,108,108,108,108,108,1319,2,1869,1869,1869,2,1319,1319,1319,1319,1319,1319,1319,1319,1319,1319,1869,190,190,190,380,576,9,9,9,811,811,18,1591,1591,144,144,144,18,729,729,729,485,485,485,1869,1869,485,485,485,485,485,485,485,1869,1869,1869,108,1869,1869,1869,108,1869,108,99,549,549,407,549,1628,970,968,968,86,43,43,43,1761,1572,1572,1572,1572,1572,1572,1572,1572,1761,1761,840,1761,1761,99,485,485,485,485,633,1869,1869,1869,1869,1869,485,485,47,47,47,47,47,47,47,786,1319,1319,48,1112,48,48,6,24,24,3,3,3,216,108,108,432,432,432,432,432,1234,353,1234,520,353,353,353,353,520,520,520,485,485,485,1869,1206,1869,1869,1869,1234,485,485,485,485,485,485,485,1131,1869,1869,1869,1869,1869,1869,1869,485,485,748,748,748,748,748,748,748,748,748,748,748,1148,1148,1148,1148,1148,1148,1148,1148,1148,1148,296,485},
+ {1670,1350,689,1074,437,956,587,642,1154,439,196,1108,1108,1108,990,2,2,2,2,2,1112,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,634,634,634,634,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,634,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,634,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,48,48,2,2,48,48,2,48},
+ {1747,611,1788,1446,152,1335,710,1040,639,1279,788,788,265,1441,107,2,2,2,2,1441,1441,1441,1441,938,938,938,938,2,2,867,867,1441,1441,938,938,938,938,938,938,1441,2,2,2,2,1441,1463,1441,1441,1441,2,348,867,867,867,1441,867,867,867,1441,1441,2,1441,1441,1441,2,2,2,1441,1441,1441,1441,348,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,2,2,867,1441,1441,1441,2,2,2,2,2,2,1441,2,2,2,2,2,2,867,867,867,867,867,867,867,1441,1441,1441,1441,1441,1441,1441,938,938,867,867,2,867,867,867,867,1441,867,867,1441,1441,867,2,2,867,867,867,867,867,867,867,867,867,867,867,867,1463,867,867,867,2,2,867,867,867,867,867,867,867,867,867,867,867,867,867,867,867,867,867,867,1441,1441,1441,1441,867,867,867,867,867,867,867,867,867,867,867,867,867,867,1441,1441,1441,2,867,867,867,867,867,1441,1441,1441,1441,1441,1441,1441,1441,1441,1441,867,1441,1441,1441,867,867,867,867,867,867,867,867,867,1463,1463,867,867,867,867,867,867,867,867,867,1441,867,867,867,867,867,867,867,867,867,867,867,867,867,1441,867,867,867,867,867,867,867,867,867},
+ {1873,890,920,874,591,651,768,478,331,76,760,760,760,760,67,2,2,2,2,1241,1241,1241,1241,2,2,2,2,2,2,2,1241,1241,2,2,2,2,1241,1241,1241,1241,1241,1241,1241,1241,2,2,2,1241,1241,1241,1241,1241,1241,1241,1241,1241,1241,1241,1241,1241,1241,1241,1241,1241,1241,1241,1241,1241,1241,1241,1241,1241,1241,2,2,2,2,916,916,2,916,2,916,916,916,2,2,916,916,2,1241,1241,1241,2,2,916,916,916,916,916,2,2,916,916,916,1241,2,2,916,916,916,2,2,2,2,1241,1241,1241,2,2,2,2,2,2,2,2,2,1024,32,16,2,2,2,1483,1483,764,764,764,764,764,764,764,764,764,543,543,79,79,79,79,79,379,379,672,672,672,672,1024,1024,2,2,2,316,1241,1241,2,2,8,8,8,8,8,1241,1241,1241,1241,1241,2,2,2,1241,1995,1995,1995,1241,1241,1241,1241,1241,1241,1241,1241,1241,1241,1241,1241,1241,1241,1241,1241,1241,1241,1241,1241,1241,1241,252,2,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,2,2,252,252,252,916,916,2,2,916,916,916,1241,2,916,916,916,916,2,2,2,2,1241,1241,1241,2,2,2,2,298},
+ {1682,867,333,102,628,891,654,506,995,684,961,563,1313,1313,1313,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1073,1073,938,938,938,801,2,2,2,938,2,938,938,938,2,2,2,2,2,2,2,801,801,801,2,2,2,2,2,2,801,801,2,2,801,801,801,2,2,801,801,801,801,2,2,2,801,801,801,801,801,801,2,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,1397,1397,1397,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,1397,1397,1397,2,801,801,801,801,801,2,2,2,801,801,801,2,801,2,2,2,2,801,2,801,2,2,2,2,2,2,2,2,1397,1397,1397,2,2,1397,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1397,1397,1397,1397,1397,1397,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1397,1397,1397,1397},
+ {1672,1248,429,813,262,92,809,1248,560,1365,1392,753,753,1259,1261,2,2,2,2,2,2,2,2,177,177,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,467,2,2,644,644,177,177,2,2,2,2,2,2,2,2,2,2,2,2,2,2,644,644,467,2,2,644,644,467,644,2,2,2,2,2,467,467,467,467,2,2,2,2,2,2,467,467,467,467,2,644,644,644,2,2,2,467,467,467,467,467,467,467,644,2,644,467,467,467,467,644,2,644,644,467,467,467,644,644,644,644,644,644,644,644,467,2,2,2,467,467,467,644,644,644,644,2,2,2,2,2,2,2,2,2,467,2,467,177,2,2,2,2,644,644,644,644,644,644,644,644,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,644,2,2,2,2,2,2,2},
+ {1391,1598,1112,590,797,584,1354,47,1473,1291,1874,48,491,463,990,463,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,749,749,2,2,2,749,749,749,749,749,749,749,749,2,749,749,749,749,749,749,749,749,749,749,749,749,2,2,749,749,749,749,749,749,749,2,749,749,749,749,2,749,749,749,749,749,749,749,749,749,2,749,749,749,2,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749},
+ {1875,1576,924,677,461,134,1525,1619,44,701,299,743,728,791,791,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,791,791,2,359,791,2,791,791,791,2,2,791,2,791,791,791,2,2,2,2,2,2,791,791,791,359,2,2,2,2,2,359,175,175,175,1606,2,791,2,175,2,175,175,175,175,2,175,2,2,2,791,2,2,791,2,2,2,2,2,2,791,2,791,2,2,2,791,791,791,2,791,2,791,791,791,791,2,2,791,2,2,2,2,791,791,791,791,1606,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1606,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1606,1606,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1267,904,1187,1595,765,1451,494,1573,950,909,87,1265,757,1371,1005,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,907,907,907,907,907,907,907,907,907,907,907,907,907,907,907,907,1725,1725,907,907,907,1725,1725,1725,1725,1725,1725,1725,1725,1725,1725,1725,1725,1725,1725,2,1725,1725,1725,1725,568,568,568,1725,1725,1725,1725,1725,568,568,1725,393,568,568,568,568,568,568,568,568,568,568,568,568,568,568,1725,1725,1725,1725,568,568,568,568,568,1725,1725,322,1725,1725,1725,1725,1725,1725,1725,1725,1725,1725,1725,2,1725,1725,1725,1725,1725,322,322,322,1725,1725,1725,1725,1725,1725,1725,322,322,322,322,322,322,322,1725,1520,1725,1725,1725,1725,1725,1725,2,2,322,322,322,1725,322,2,2,568,2,2,2,2,2,2,2,1520,1520,1520,1520,1520,2,568,568,568,1520,2,957,957,957,957,957,957,2,2,2,2,957,957,1520,1520,2,2,568,568,568,2,2,2,2,957,2,2,1520,1520,2,1520,393,1520,2,393,393,393,393,393,393,393,393,393,393,1520,2,1520,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1744,1011,935,492,158,1645,795,1056,74,679,367,675,675,1229,1229,1229,2,2,2,2,2,2,2,2,2,2,2,2,2,1229,2,2,2,2,2,2,2,2,2,2,1229,2,2,2,2,2,2,2,2,2,2,2,2,1229,1229,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1229,1229,1229,1229,1229,1229,1229,1229,1229,1229,1229,1229,2,2,2,2,1229,1229,1229,1229,1229,1229,1229,1229,1229,1229,2,2,1229,1229,1229,1229,1229,1229,1229,2,1229,1229,2,1229,1229,2,1229,1229,2,2,1229,1229,1229,1229,1229,1229,2,1229,1229,1229,1229,1229,1229,1229,1229,1229,1229,1229,1229,1229,1229,1229,1229,1229,1229,1229,1229,1229,1229,1229,1229,1229,1229,1229,1229,1229,1229,1229,1229,1229,1229,2,2,1229,1229,1229,1229,1229,1229,1229,1229,1229,1229,1229,1229,1229,1229,1229,1229,1229,1229,1229,1229,1229,1229,1229,1229,1229,1229,2,2,2,1229,2,2,2,2,2,2,2,1229,2,2,2,2,2,2,2,2,1229,2,2,2,2,2,1229,1229,2,2,2,1229,1229,2,1229,1229,2,2,1229,1229,1229,2,2,1229,1229,1229,1229,2,1229,1229,2,1229,1229,1229,1229,1229,1229,1229,1229,1229,1229},
+ {1360,1091,1478,1237,97,578,1616,494,1422,223,865,1092,359,2,1080,4,2,2,2,688,1965,2,1965,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,201,2,2,2,2,2,2,201,201,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,201,201,201,2,2,2,2,2,2,2,2,2,2,201,201,201,688,688,688,2,2,688,688,2,688,688,2,2,2,2,2,2,688,688,201,2,201,1965,201,1965,1965,2,2,2,2,2,2,2,2,2,2,1965,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1750,386,393,840,723,791,1707,1319,1525,83,1302,571,280,2,280,73,2,2,2,1207,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1207,1207,1207,2,2,2,2,2,2,1207,1207,2,2,2,2,2,2,2,2,1207,2,1207,1207,1207,1207,1207,1207,1207,1207,1207,1207,1207,1207,1207,1207,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1988,1988,1988,1988,1988,1988,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1207,2,2,2,2,2,2,2,1207,2,2,2,2,1207,2},
+ {1763,1018,1859,432,717,723,874,1294,1050,1800,1237,619,1074,2,10,1237,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1376,652,461,225,361,936,1073,1279,149,619,983,511,1994,2,2,1076,1076,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1947,393,495,946,1375,391,2128,582,1143,695,1872,760,760,2,2,1456,974,974,435,974,974,435,974,2,974,974,2,2,2,2,2,2,2,2,2,974,974,974,974,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,974,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,974,974,2,735,735,2,2,2,2,2,974,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,974,974,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,735,735,735,735,735,735,2,2,2,2,2,2,2,2,2,2,2,2,735,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,974,2,2,2,974,974,2,2,2,2,2,2,974,2,2,2,2,2,2,2,2,2,735,735,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1297,943,275,618,180,460,370,1690,1406,1268,1325,356,428,712,712,712,712,2,2,802,802,2,1235,1235,1235,1235,1235,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1235,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1235,2,2,1235,2,2,2,2,2,2,2,2,2,2,2,1235,1235,2,1235,1235,2,2,1235,2,2,2,2,2,2,2,2,2,2,1235,1235,1235,2,2,2,1235,2,2,2,2,1235,1235,2,2,2,1881,2,2,1235,1235,1235,2,1235,1235,1235,2,2,2,2,2,2,2,2,2,2,2,2,2,1235,1235,1235,2,4,2,2,2,4,2,2,2,2057,213,213,1336,563,426,2057,2057,1339,1339,1339,1339,1339,2,1339,2,2,2,2,2,2,2,2,1235,1235,1235,1235,1235,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1235,1235,2},
+ {1766,453,336,145,1519,1013,1243,569,1503,829,1401,1401,812,327,327,327,812,327,327,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,364,2,2,2,2,2,2,2,2,364,364,364,2,2,2,2,2,2,2,2,364,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,364,2,2,2,2,2,327,327,364,364,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,364,2,2,2,2,2,2,2,2,2,2,2,2,2,2,327,2,2,2,2,2,2,2,327,2,2,2,327,327,327,2,2,2,650,327,327,327,327,327,327,327,327,327,327,327,327,327,327,327,327,327,327,327,2,364,327,327,327,327,327,327,2,327,364,364,327,327,327,2,2,327,364,364,327,327},
+ {1768,1463,531,1008,95,1677,362,1105,985,177,1682,1682,244,2,2,1234,1041,1041,1041,2,2,2,1041,1041,2,2,2,2,2,2,1894,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,370,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1041,1041,2,1041,1041,1041,1041,2,2,2,1041,1041,1041,1041,2136,2,2,115,115,115,115,115,115,2,2,2,2136,115,115,1720,1720,1041,2,2,1041,1041,2136,2136,2,2,1720,1041,1041,1041,2136,1041,1041,2136,2136,2,2,1041,2136,2136,1041,2,2136,2136,2136,2136,2136,2136,2136,2136,2136,2136,2136,2136,2136,1041,1041,1041,1041,2136,2136,1041,1041,115,1041,1041,1041,1041,1041,1041,1041,1041,1041,2,2,115,1041,1041,1041,115,115,1041,1041,2,2,2,1041,1041,1041,1041,115,115,115,1041,1041,1041,1041,1041,1041,1041,1041,1041,1041,2,2,1041,1041,1041,1041,1041,1041,1041,1041,1041,1041,2136,2136,2136,1041,1041,1041,1041,1041,115,115,115,1041,1041,1041,1041,1041,1894,1894,1894,1894,1894,2136,2136,2136,2136,1894,1894,1894,1894,1041,2136,1041,1041,1041,1894},
+ {1912,489,572,826,1071,125,1508,49,512,437,20,48,884,1055,1055,1055,1055,1055,1055,1055,2,2,2,2,2,2,2,2,2,2,2,2,2,2,679,2,2,2,2,2,2,679,679,1736,1736,2,2,1736,2,2,2,2,2,2,2,2,2,2,2,2,2,729,2,2067,2067,1055,2,2,2,2,2,2,2,2,2,1055,2,2,2,2,2,2,2,2,2,729,729,2,2,2,2,1842,679,679,2,2,2,2,2,2,2,2,2,1055,729,2,2,729,1055,1055,1055,1055,1055,1055,2,1055,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,729,729,729,2,2,2,1055,2,2,2,1055,1055,1055,1055,2,2,1055,2,2,2,2,2,729,2,2,1055,2,1055,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,252,252,252,252,1238,1238,1238,252,337,337,337,337,337,679,679,2,2,2,337,337,337,2,2,337,337,337,2,2,2,337,1055,1055,630,630,630,630,630,630,630,630,630,630,630,630,337,2,1055,337,337,337,337,1055,337,337,337,1055,580,1055,1055,1055,1055,1055},
+ {1780,1739,1357,1684,1586,736,208,966,1691,339,339,128,128,2,2,128,128,128,2,2,128,2,2,2,2,1929,2,2,338,2,2,338,338,2,2,2,2,2,341,2,2,2,2,2,338,2,338,338,2,2,2,2,2,2,338,2,2,2,2,2,2,2,2,338,338,2,2,338,338,2,2,2,338,2,2,338,338,338,338,338,338,2,2,338,338,338,338,338,338,2,2,2,2,2,2,338,338,2,2,2,338,338,338,2,338,338,338,2,338,338,2,338,338,338,338,2,338,338,338,338,338,2,2,2,2,2,2,2,2,2,2,2,338,338,338,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1387,1459,358,1409,1919,917,777,223,313,1847,1012,1024,1024,2,2,2,2,1420,1420,1428,1420,2,1420,1420,2,2,2,1420,1117,1117,1117,1117,1117,1117,1117,1117,1117,1117,1117,1117,1117,1420,1420,1420,1420,1420,2,1420,1420,1420,1420,1420,1420,1420,1420,1420,1420,2,1420,1420,1420,1420,1420,1420,1420,1420,1420,1420,2,322,322,1420,1420,1420,1420,1420,1420,1420,1420,1420,1420,1420,2,1420,1420,1420,1420,1420,1420,1420,1420,1420,2,1420,1420,1420,1420,1420,1420,322,1420,1420,1420,1420,1420,1420,1420,1420,2,147,147,147,2,828,2,2,2,2,2,2,1420,1420,1420,1420,1420,1420,1420,1420,1420,2,303,303,322,322,322,322,1420,1420,322,303,303,1420,1420,1420,1420,1420,1420,2,2,2,2,2,2,2,2,2,2,2,2,2,2,303,303,2,2,1420,1420,1420,1420,1420,1420,1420,2,1420,2,2,2,2,2,2,2,2,2,2,1428,2,1420,1420,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1420,1420,1420,1420,1420,2,2,2,1428,1428,2,2,2,1420,1420,1428,2,2,1428,2,828,828,2,2,828,828,303,828,828,303,303,303,303,2,2,828,303,303,2,2,303,303,303,303,2,2,303,303},
+ {1362,1383,1137,1633,361,1393,1942,68,42,1224,51,592,1318,2,2,2,2,2,1753,560,410,410,410,410,1215,2,1215,1215,1215,1215,1215,1215,1215,482,2,2,482,482,2,2,2,2,2,482,482,482,482,482,2,482,482,482,482,482,2,2,2,2,2,482,482,482,2,2,2,2,2,1215,2,2,1215,1215,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1215,1215,2,1215,1215,2,2,2,2,2,1215,1215,1215,1215,2,2,2,2,2,482,2,482,482,2,2,2,2,2,2,2,2,2,2,2,1215,2,2,2,2,2,2,2,482,2,2,2,2,2,2,2},
+ {1289,907,228,665,1695,1735,489,214,762,1777,321,1674,932,2,2,2,2,1358,709,2,1959,1959,372,2,2,372,372,2,2,372,372,372,372,372,2,2,1959,1959,1959,1959,372,1959,1959,2,1959,1959,1959,372,372,372,372,1959,1959,1959,1959,372,372,372,372,1959,1959,1959,372,1959,1959,1959,1959,709,709,709,372,2,2,372,372,1959,1959,1959,1959,611,611,2,2,1959,1959,1959,1959,372,372,372,372,372,1959,1959,1959,1959,709,709,372,709,709,372,372,2,709,2,1959,2,2,709,709,709,709,709,709,709,709,2,372,372,372,372,2,2,2,2,372,2,2,2,372,2,1959,1959,2,2,2,372,372,372,372,372,372,372,372,372,372,372,372,372,372,372,2,372,372,372,2,372,372,372,372,372,372,372,372,372,709,709,709,372,372,372,372,372,2,2,1959,1959,2,2,2,2,2,2,372,372,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,709,709,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,372,2,2,2,2,2,2,2,2},
+ {1378,680,1117,1367,759,62,319,563,505,1138,1093,345,693,2,2,2,780,780,2,2,2,729,729,729,2,2,2,2,2,2,729,729,729,729,729,2,2,729,729,729,729,729,729,2,2,2,2,2,2,2,2,2,2,2,2,2,729,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,729,729,2,2,2,2,2,2,2,2,729,2,2,2,2,729,2,2,2,729,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,729,729,729,729,729,729,729,729,2,2,2,729,729,729,729,729,729,729,729,729,729,729,729,729,2,729,729,729,729,729,729,81,729,729,729,729,729,729,729,729,729,729,729,729,729,729,729,729,729,729,729,729,729,729,729,729,729,729,729,729,2,2,2,2,2,2,729,729,729,729,729,729,729,729,729,729,729,729,729,729,729,729,729,2,729,729,729,729,729,729,729,729,729,729,729,729,729,729,729,729,729,729,2,729,729,729,729,729,81,81,81,81,729,729,729,729,729,729,729,729,729,729},
+ {1802,1645,453,1079,604,618,334,855,541,167,37,88,849,2,2,518,518,2,2,530,2,2,2,2,2,2,2,119,119,2,2,2,2,530,2,2,2,2,2,530,530,530,530,530,530,2,2,530,2,2,530,530,530,530,530,530,2,530,530,119,522,530,522,2,530,530,2,2,2,530,530,2,2,119,530,530,530,530,530,530,530,2,2,810,2,810,2,2,2,2,2,2,530,530,530,2,2,2,530,2,530,530,2,2,2,530,530,530,2,2,2,2,2,2,2,530,2,2,2,2,2,2,2,2,2,530,530,530,2,530,530,2,2,2,2,2,2,2,530,530,2,2,2,2,2,2,2,2,2,530,530,530,530,530,530,530,530,530,2,2,2,530,530,530,530,530,2,530,530,2,530,530,2,530,2,2,2,2,530,2,530,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,530,2,530,2,2,2,2,2,2,2,2,2,530,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,530,2,530,530,530,530,530,530,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1275,1612,143,1586,502,987,555,436,2236,1826,494,494,358,2,2,213,2,2,2,2,2,2,1585,1585,1585,1585,1585,1585,1585,1585,1585,1585,2,1151,1151,1151,1151,1151,2,2,2,2,1151,2,2,2,2,2,2,2,2,2,2,2,2,2,2,425,1151,1151,2,2,2,2,2,425,425,425,425,425,2,2,2,2,2,1151,2,2,2,2,1151,2,2,2,2,2,2,425,2,2,2,2,2,1151,2,2,2,2,2,2,2,1151,1151,1151,1151,1151,1151,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1151,2,2,1151,2,2,2,2,2,2,2,2,1151,1151,1151,1151,1151,1151,1151,1151,1151,1151,1151,1151,1151,1151,1151,1151,1151,1151,1151,1151,1151,1151,1151,1151,1151,1151,1151,1151,1151,1151,1151,1151,1151,2,1151,1151,1151,1151,1151,1151},
+ {1277,1672,348,357,66,728,79,1416,300,1527,1885,439,439,2,2,232,1281,2,2,2,2,2,2,2,2,2,2,2,2,157,2,2,2,1281,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1281,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1165,2,1165,1165,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1165,1165,2,2,1165,1165,1165,1165,1165,1165,1165,1165,2,1165,1165,1165,1165,1165,1165,1165,236,1165,1165,1165,1165,1165,1165,1165,1165,1281,1165,1281,1281,1281,1281,1165,1165,1165,1165,1165,1165,1165,1165,1165,1165,1165,1165,1165,1165,1165,1165,1165,1165,1165,1165,1165,1165,1165,1165,1165,1165,1165,1165,1165,1165,1165,1165,1165,1165,1268,1268,1268,1281,1268,1165,1165,1165,1165,1165,1281,1281,1281,1281,1281,1281,1165,1165,1281,1281,1165,1281,1165,1165,1165,1165,1165,1281,1281,1165,1165,1281,1281,1165,1165,1165,1165,1281,1281,1281,1281,1281,1281,1165,1165,1165,1165,1165,1165,1281,1281,1281,1281,1281,1281,1281,1281,1281,1165,1281,1281,1281,1281,1165,1165,1165,1165},
+ {1322,512,560,432,365,87,1835,1137,515,1271,1739,309,309,1229,1229,1229,2,2,2,2,2,2,2,2,416,416,416,416,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,416,416,416,2,416,2,2,2,2,2,2,2,2,2,2,2,416,416,416,416,416,416,416,416,416,416,416,416,14,276,276,14,2,2,2,512,512,1334,1781,1781,137,1781,1781,137,612,612,1781,1781,1781,416,416,416,416,612,2,612,738,2,738,416,416,416,416,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,283,283,283,283,283,2,283,283},
+ {1758,835,287,888,391,875,1834,516,1432,1171,98,408,302,976,976,1963,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1695,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1444,394,1613,796,645,1406,186,158,402,1364,314,588,606,2,577,117,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1845,1845,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,69,2,2,2,2,2,2,2,2,2,2,2,2,2,1845,2,2,2,2,2,872,2,2,2,2,2,2,2,69,2,2,2,69,69,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1845,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1845,1845,2,2,1845,1056,2,981,1845,981,2,2,981,2,2,2,981,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,981,2,2,2,2,2,2,2,2,2,2},
+ {1337,1391,137,371,165,87,1026,20,419,99,572,572,918,854,918,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1150,2,2,1150,1150,1150,1150,1150,2,1150,1150,1150,1150,1150,1150,1150,1150,1150,1150,1150,2,2,1150,1150,1150,1150,2,1150,2,2,2,2,1150,1150,1150,2,1150,1150,2,1150,1150,1150,2,2,2,2,2,1150,1150,2,1150,1150,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1323,589,526,1555,1636,1172,86,42,1545,57,627,1769,1769,2,867,343,2,2,2,2,2,2,2,724,2,2,2,2,724,724,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,724,724,724,724,724,2,2,724,724,2,724,724,2,724,724,724,724,724,724,724,724,2,2,2,2,2,2,2,2,724,2,2,2,2,2,2,398,2,724,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,398,398,398,398,398,724,724,724,724,724,398,398,398,398,398,398,398,398,398,398,724,398,398,2,398,398,398,398,398,398,398,398,398,398,398,398,398,398,398,2,398,398,398,398,398,398,398,398,398,398,398,398,398,398,398,398,398,398,398,398,398,398,398,398,2,2,398,398,398,398,398,398,398,398,398,398,398,398,398,398,398,398,398,398,398,398,398,2,2,398,398,398,398,398,398,398,398,398,398,398,398,398,398,724,398,398,398,398,398,2,398,398,398,398,398,398,398,398,398,398,398,398,398},
+ {1323,1647,384,301,270,549,1098,1144,1066,55,88,1805,683,2,945,120,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1858,1858,1858,1858,1858,1858,1858,1858,1858,1858,1858,1858,2,2,1858,1858,2,2,2,2,1858,1858,1858,1858,1858,1858,1858,1858,1858,2,1858,1858,1858,1858,1858,1858,1858,1858,1858,1858,1858,1858,1858,2,2,1858,1858,1858,1858,1858,1858,1858,1858,1858,2,2,2,2,2,2,1858,1858,2,1858,2,2,2,2,1858,1858,2,2,1858,1858,1858,1858,1858,1858,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1858,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1325,1300,1353,1575,33,730,46,1476,84,84,189,457,352,2,1479,2,2,2,2,2,2,2,2,2,2,2,2,1565,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1181,1181,1181,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1181,1181,2,2,2,2,2,1181,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1419,590,223,345,1505,1226,1788,848,671,731,931,593,723,723,723,2,2,2,2,2,2,2,2,2,2,2,879,879,879,879,879,879,879,879,879,879,879,2,2,879,879,879,879,879,879,879,879,879,879,2,2,2,2,2,2,2,2,2,2,2,2,791,2,2,2,2,2,2,2,2,2,2,2,2,2,879,879,879,879,879,2,2,879,879,879,879,879,879,879,879,2,879,879,879,879,879,879,879,879,879,879,879,879,879,879,879,879,879,879,879,879,879,879,879,879,879,879,879,879,879,879,879,879,879,879,879,879,2,2,2,2,2,2,2,2,2,2,2,2,2,879,879,879,879,879,879,418,418,418,2,418,2,2,2,879,2,2,2,2,2,2,2,2,879,417,417,417,417,417,417,879,2,2,2,2,2,2,2,2,1377,1377,2,2,1377,2,879,879,2,2,2,2,2,2,2,2,2,2,2,2,2,2,879,418,418,2,2,2,879,2,879,879,2,2,791,2,2,2,418,2,2,879,879,879,2,2,2,2,2,2,2,879,2,2,879,2,2,2,2,879,879,879,2,2,2,2,2,2,2,2,2,2,2,2,418,879,418},
+ {1327,1075,539,1017,926,350,1102,236,494,1268,286,286,1293,267,227,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1533,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1533,1533,2,2,1533,1533,2,2,1533,2,2,2,2,2,2,2,2,2,1533,1533,2,1533,1533,1533,1533,2,2,1533,2,2,2,2,2,2,2,2,2,2,2,2,2,1533,2,1533,2,2,2,1533,2,2,2,2,2,2,2,2,2,2,2,2,2,1533,1533,1533,1533,1533,1533,1533,1533,1533,1533,2,1533,1533,1533,1533,1533,1533,1533,2,2,2,2,2,2,2,2,1533,1533,2,2,1533,2,2,2,1533,2,2,2,2,2,2,2,2,2,1533,1533,1533,1533,1533,1533,1533,1533,1533,1533,1533,1533,2,2,1533,1533,1533,2,1533,1533,1533,49,49,1533,1533,1533,1533,1533,1533,1533,1533,1533,1533,1533,1533,1533,1533,1533,2,2,1533,1533,1533,1533,1533,2,1533,1533,1533,1533,1533,1533,1533,1533,1533,1533,1533,1533,1533,1533,1533,2,1533,2,2,2,2,2,2,2,2,2,2,1533,2,2,2,2},
+ {1472,661,1538,487,94,2209,563,138,881,1735,718,203,1382,1473,1473,1473,1473,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1159,1159,2,1159,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1159,2,2,2,1159,1159,1159,2,2,2,2,1159,1159,2,2,2,2,2,1159,1159,2,2,1159,1159,1159,1159,2,2,1159,1159,1159,1159,1159,2,2,388,388,2,2,2,2,2,2,388,388,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,388,388,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1343,365,790,1047,983,1015,918,1469,1416,126,1238,1238,1238,1238,151,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1717,1717,1717,1717,1717,1717,2,2,2,1056,2,1056,2,2,2,2,2,2,1056,1056,1056,1056,1056,1056,1056,1056,1056,1056,1056,1056,2,2,2,2,2,2,2,2,2,827,827,827,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,525,525,525,2,2,2,1422,2,1422,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1422,1422,1422,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1422,1422,1422,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,525,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1422,85,85,85,85,2,1422},
+ {1413,766,349,1471,45,625,733,1082,170,58,1268,207,1081,1081,1081,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1111,1111,1111,1111,2,2,1111,2,2,2,2,2,2,2,1111,2,2,2,2,2,2,255,2,1111,1111,1111,1111,2,2,2,2,2,2,1111,1111,1111,1111,1111,1111,1111,1111,1111,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1111,1111,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1111,1111,1111,1111,2,2,2,2,2,2,2,1111,2,2,1111,2,2,1111,1111,1111,1111,2,2,2,2,2,2,2,2,2,1111,2,2,2,2,2,2,2,2,1111,2,2,1111,1111,2,2,2,1111,1111,1111,1111,1111,1111,1111,1111,1111,1111,1111,1111,1111,1111,1111,1111,1111,1111,1111,1111,1111,1111,2,2,2},
+ {1861,1487,419,97,799,1791,458,1029,370,627,57,414,414,1540,247,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1881,716,268,387,2138,1212,999,408,1363,434,1429,1429,1648,1648,1007,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,316,316,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,316,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,316,316,316,2,316,316,316,316,316,316,316,316,2,2,316,316,316,316,2,316,2,2,2,2,2,2,2,2,2,2,316,2,2,316,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,316,2,2,2,2,2,2,2,2,2,2,2,316,316,316,316,316,2,2,316,316,316,316,316,316,316,316,316,316,316,316,316,316,316,316,316,316,316,2,316,316,316,316,316,316},
+ {1480,1131,1089,1688,340,962,505,1816,139,44,1350,403,1385,1996,173,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2018,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1868,650,1146,1690,948,43,497,692,1628,1302,1302,108,462,731,731,2,2,2,2,2,2,2,185,185,185,2,2,2,2,2,2,2,921,921,2,921,921,2,2,2,921,921,2,2,921,921,921,2,2,462,462,185,185,921,185,185,185,185,185,2,185,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,462,462,462,462,2,462,462,462,2,462,462,462,2,2,2,2,185,185,2,2,2,2,2,2,2,2,2,2,2,2,2,921,921,2,2,2,2,921,921,185,185,185,185,185,2,921,921,2,921,185,921,921,921,2,2,921,921,185,185,921,921,921,2,2,921,921,921,2,921,921,921,185,185,185,921,921,921,921,2,2,2,2,2,2,921,921,921,921,2,2,2,2,921,2,2,2,2,2,2,2,2,2,2,2,921,921,2,921,2,2,2,2,2,921,2,2,2,921,921,2,2,921,921,2,2,2,921,2,2,2,2,2,921,921,921,921,921,921,2,2,2,2,2,2,2,2,2,921,2,2,2,2,2,2,2,2,921,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,921,2,2,2,2},
+ {2023,1204,531,733,1054,618,668,363,783,218,1302,2055,559,2055,2055,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,131,131,131,131,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1745,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1328,601,601,617,554,467,391,1545,162,1361,807,1565,1565,243,1344,2,725,510,510,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,510,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1808,1525,1129,652,1195,329,1410,558,1322,911,161,536,737,94,306,2,2,2,2,2,2,2,2,2,541,541,541,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,234,234,234,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,541,541,541,2,541,541,2,2,541,541,541,541,541,2,541,541,541,541,541,541,541,2,2,2,2,2,541,541,2,2,2,2,541,2,2,541,541,2,541,541,541,541,541,2,2,2,2,2,2,2,2,541,541,541,541,541,541,541,2,2,2,2,2,2,2,2,2,541,541,2,2,2,2,2,2,2,2,2,2,2,2,541,541,2,2,2,2,2,2,2,2,541,541,541,2,2,2,2,2,541,541,541,541,541,2,541,2,2,2,541,541,541,541,2,2,2,2,541,541,541,541,541,541,541,541,541,541,541,541,541,541,541,541,541,541,541,2,2,541,541,541,2,541,541,541,541,541,541,541,541,541,541,541,2,541,541,2,2,2,2,541,541,2,541,541,541,2,541,541,541},
+ {1911,1338,639,1106,854,128,19,1353,847,253,618,517,2054,2054,93,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1554,2,2,2,2,2,2,2,1554,1554,86,86,86,86,2,2,2,2,2,2,2,2,2,2,2,2,2,2,86,2,1554,1554,1554,1554,1554,1554,1554,1554,2,1554,1554,1554,2,2,2,2,2,2,2,2,1554,1554,2,2,2,1554,2,2,1554,1554,1554,2,2,1554,1554,1554,1554,1554,1554,1554,1554,1554,1554,1554,1554,1554,1554,1554,1554,1554,1554,1554,1554,1554,1554,1554,1554,1554,1554,1554,1554,1554,1554,1554,1554,1554,1554,1554,1554,86,86,1554,1554,1554,1554,1554,1554,1554,1554,1554,1554,1554,86,86,1554,1554,2,86,86},
+ {1825,850,180,1483,864,953,50,81,106,432,1372,1372,1212,10,10,10,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2024,488,1184,1484,105,151,788,1657,568,353,577,461,425,425,784,425,461,461,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,879,2,879,2,2,2,2,2,2,2,2,2,2,2,2,2,784,2,2,2,2,2,2,784,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,879,879,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,879,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,879,879,2,2,2,2,2,2,2,2,2,2,2,2,2,2,879,879,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1892,441,977,228,1252,604,735,136,889,878,1319,1319,2127,2127,1963,367,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1289,1289,1289,1289,1289,2,348,348,2,2,2,2,348,2,2,2,2,2,2,348,348,348,348,348,1289,1289,348,348,348,348,348,348,348,348,2,1289,1289,348,348,348,348,348,348,348,348,348,348,348,1289,1289,1289,2,2,2,2,1289,1289,2,2,2,2,348,2,348,348,348,2,920,2,2,2,348,348,920,1289,593,348,348,348,348,348,348,348,348,348,348,920,920,920,920,920,657,920,920,920,920,920,2,2,593,593,593,2,593,2,593,593,593,593,593,593,593,593,920,920,920,348,920,920,920,920,920,920,920,348,348,2,2,920,920,920,2,2,920,920,2,920,1289,1289,1289,920,1289,2,593,593,920,920,920,2,920,920,920,2,2,920,593,593,2,593,593,593,593,593,593,2,920,920,920,920,593,2,2,593,593,593,593,593,593,593,593,2,593,593,920,593,593,348,348,593,348,2,2,348,348,2,593,2,2,593,2,348,2,2,920,920,593,2,593,593,593},
+ {1912,769,703,1758,884,671,932,49,1943,138,480,1416,197,2211,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,693,693,693,693,693,2,693,693,2,2,693,2,2,693,693,2,2,2,2,693,693,2,693,693,693,693,693,693,693,2,2,693,693,693,693,2,2,693,2,2,693,2,693,693,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,693,2,2,2,2,2,2,2,2,2,693,693,693,693,693,693,693,693,693,693,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,693,693,693,693,2,2},
+ {1820,1553,536,1351,425,1268,227,1742,429,348,1397,552,1151,1151,2,180,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1475,485,218,1200,613,489,1861,634,156,2299,950,1221,530,530,530,530,530,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,239,239,2,2,2,2,2,2,2,67,239,239,239,239,239,2,2,239,239,239,239,239,239,239,239,239,2,239,2,239,239,239,239,2,2,2,239,239,239,239,239,2,2,2,2,2,2,2,2,2,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,2,2,2,2,2,292,292,292,239,2,239,239,239,292,292,292,292,239,292,292,403,403,239,239,239,239,239,239,239,239,239,292,292,292,292,292,292,292,292,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,67,239,239,239,239,239,239,239,239,239,239,239,239,500,500,67,239,239,239,239,239,239,239,500,500,500,500,239,239,239,239,292,239,239,239,239,239,239,239,239,239,239,403,239,239,403,403,403,403,403,403,403,403,403,403,403,239,239,239,239,239,239,239},
+ {1453,1044,556,833,305,1493,989,1158,726,1790,532,1229,1229,1229,2,2,2,2,2,2,2,2,2,2,259,2,2,2,2,2,420,2,2,2,2,420,420,2,259,259,2,2,2,420,420,420,2,2,2,2,2,2,420,420,420,420,420,420,420,420,420,259,2,420,420,420,420,420,420,420,420,420,2,420,420,2,420,420,420,2,420,259,259,259,420,420,420,420,2,420,2,2,2,2,2,2,2,420,420,420,420,420,420,420,420,420,420,420,420,420,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,420,420,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,420,420,420,2,2,259,259,2,420,420,420,420,420,420,2,2,2,420,420,420,420,420,420,420,420,420,420,420,259,259,2,420,420,2,2,2,420,420,420,420,420,420,420,420,420,420,259,420,420,420,420,420,420,420,420,420,420,420,420,420,420,420,420,420,420,420,420,420,420,420},
+ {1898,787,769,1166,799,479,1066,390,821,1061,201,201,1339,703,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,659,659,659,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,659,659,2,2,659,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,420,420,659,659,2,2,2,420,420,420,420,420,420,420,420,420,2,659,2,2,2,2,2,2,659,659,659,2,420,2,2,2,420,420,2,420,2,2,2,2,659,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,659,659,659,659,659,659,659,659,659,659,2,2,2,2,2,420,2,420,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2059,592,492,973,137,1331,392,334,635,1480,2254,1796,1796,284,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,377,2,2,2,2,2,2,2,2,2,2,2,377,377,377,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,377,377,377,377,377,377,377,377,377,377,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,377,377,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,377,377,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,287,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1460,986,709,268,755,824,83,893,115,656,2071,1323,1001,144,2,2,2,2,2,2,2,2,1527,1527,1527,1527,1527,1527,1527,2,801,801,2,2,801,1527,1527,1527,801,801,801,801,801,801,2,2,2,2,2,2,2,1527,1527,2,801,1527,2,2,2,2,2,2,2,1527,1292,1292,1527,1527,1527,1527,1527,2,1527,1527,2,2,2,1527,1527,801,2,2,1527,1527,1527,1527,1527,1527,1527,1527,801,801,801,801,1527,801,1527,1527,1527,1527,1527,1527,1527,1527,801,801,1527,1527,1527,1527,1527,1527,1527,1527,1527,801,2,2,2,1527,1527,801,801,2,1527,1527,1527,801,2,2,1292,2,801,2,801,801,2,801,801,2,2,1292,1292,2,2,2,801,2,2,2,2,801,801,2,2,2,801,801,801,2,2,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,1292,801,801,801,801,801,801,2,2,2,2,2,2,2,2,2,801,801,2,2,2,801,2,2,2,2,2,2,2,2,1480,1480,2,2,1480,1480,1480,2,1480,1480,1480,1480,2,2,2,2,2,2,2,2,2,2,731,731,2,2,801,801,1292,1292,1292,2,2,1292,1292,2,1292,1292,2,2,2},
+ {1913,1311,498,499,287,603,677,1662,753,113,762,966,966,966,2,381,762,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,50,2,2,2,2,2,2,2,50,50,50,50,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,50,50,50,50,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,50,50,50,50,50,50,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1850,1476,792,840,2037,229,1578,526,431,1485,1450,1001,1001,1001,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1595,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1595,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,220,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,618,2,2,2,2,618,618,618,618,1595,2,618,2,2,1595,1595,2,2,2,1595,618,2,618,2,2,618,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,618,2},
+ {2078,1296,1018,1176,881,1169,642,1221,948,1462,519,1584,374,374,2,2,181,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1653,1653,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,635,2,2,2,2,2,2,2,2,2,2,2,2,2,1653,2,2,2,2,2,2,2,2,2,2,2,2,635,635,635,635,409,635,635,635,635,2,635,409,409,409,2,2,2,2,2,2,2,2,2,2,635,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1653,1653,2,2,2,2,2,409,2,409,409,409,1653,1653,1653,1653,2,2,2,409,2,1653,1653,1653,1653,1653,1653,2,2,2,2,2,2,2,2,2,2,2,1653,2,1653,1653,1653,2,1653,409,409,409,1653,1653,1653,1653,1653,1653,1653,1653,1653,1653,1653,1653,1653,1653,1653,1653,1653,1653,1653,1653,1653,1653,1653,1653,1653,2,2,2,1653,1653,1653,1653,2,1653},
+ {2103,1065,290,608,2281,338,259,1160,1355,1696,876,1023,1023,489,2,2,1615,2,2,2,2,2,2,2,2,2,2,2,2,2,1615,1615,1615,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1615,1615,1615,1615,2,1615,1615,2,1615,1615,2,2,1615,1615,1615,2,1615,1615,2,2,1615,1615,1615,2,1615,1615,1615,2,2,2,2,1615,1615,2,2,2,2,1615,1615,1615,1615,1615,1615,1615,1615,1615,1615,2,1615,1615,1615,1615,1615,1615,1615,1615,1615,1615,2,2,1615,1615,1615,2,2,2,2,1615,1615,1615,1615,1615,1615,1615,1615,1615,1615,1615,1615,1615,1615,1615,1615,1615,1615,1615,1615,2,2,1615,1615,1615,1615,1615,1615,1615,1615,1615,1615,2,1615,1615,1615,1615,1615,1615,1615,1615,1615,1615,1615,1615,1615,1615,1615,1615,1615,1615,1615,1615,1615,1615,2,2,1615,1615,1615,1615,1615,1615,1615,1615,1615,1615,1615,1615,1615,1615,1615,1615,1615,1615,1615,1615,1615,1615,1615,1615,1615,1615,1615,1615,1615,1615,1615,1615,1615,1615,1615,1615,1615,1615,1615,1615,1615,1615},
+ {1922,1383,813,346,1247,666,1931,1111,2042,79,682,501,1349,1930,2,2,681,681,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1922,542,1739,625,88,1376,259,49,338,318,505,788,1314,657,2,2,2,1314,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,849,2,849,2,2,2,2,2,2,2,2,2,2,2,2,2,849,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,849,849,849,2,2,2,2,2,849,849,2,849,2,2,2,2,2,2,2,2,2,2,2,849,2,849,2,2,2,2,2,2,2,2,2,2,1350,1350,1350,1350,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,849,849,2,2,2,2,2,2,849,2,2,849,2,2,2011,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1948,1530,576,582,1069,119,2131,41,1178,1677,1677,1677,325,346,2,2,2,2,2,2,1401,2,33,2,2,2,2,2,2,71,71,71,71,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,71,71,2,71,71,71,71,71,2,2,2,2,2,2,2,2,2,2,2,2,65,2,71,71,2,2,2,2,2,2,2,2,71,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,71,71,2,2,2,71,71,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,71,71,71,188,188,2,188,188,71,71,71,71,188,71,71,2,188,188,2,2,2},
+ {1928,1111,168,1252,1467,1083,1927,603,1278,714,1027,50,751,1970,2,2,2,2,621,2,100,2,2,10,10,2,2,2,2,793,793,793,793,793,2,2,2,793,793,2,2,793,2,2,2,621,621,2,621,621,2,2,2,2,793,793,2,793,793,793,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,793,2,2,793,2,2,2,621,621,621,621,621,621,793,793,621,621,621,621,621,2,2,793,2,2,2,2,2,793,2,2,793,2,2,793,2,793,793,793,793,793,2,2,2,2,2,2,2,2,2,2,793,2,2,2,2,2,2,2,793,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,793,793,2,2,2,2,2,2,2,2,2,2,2,793,2,2,2,793,793,793,793,793,793,793,2,793,793,793,2,2,2,2,2,2,2,2,793,2,2,2,2,2,793,793,793,793,793,2,2,793,793,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,793,793,793,2,2,2,2,793,793,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,793,2,2,2,2,2,2,2,2,2},
+ {1394,896,674,2350,1375,1599,1858,135,762,722,628,685,705,28,2,2,2,2,2,2,2,2,2,2,2,855,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,855,855,855,855,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,855,2,2,2,2,855,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,855,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1540,791,518,419,1130,1068,299,1386,1378,134,859,859,71,162,2,71,71,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1719,1719,1719,2,1719,1719,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1832,471,500,447,1682,306,1146,545,1090,1787,1887,1039,430,321,1334,2,1395,2,2,2,2,2,2,2,2,2,2,559,2,2,559,2,2,2,2,2,1395,1395,2,1395,1395,2,766,2,2,2,2,1395,1395,1395,1395,2,2,559,2,2,1395,1395,1395,1395,1395,2,2,2,559,559,559,1395,1395,1395,1395,559,1395,2,559,559,559,559,559,559,559,559,559,559,1395,1395,1395,2,559,559,559,559,559,1395,1395,1395,1395,2,2,801,1395,1395,2,2,559,559,559,1395,1395,559,559,559,559,2,801,801,801,1395,801,1395,1395,1395,1395,1395,1395,1395,1395,1395,2,2,1395,559,559,559,2122,2,559,559,559,559,559,559,559,559,2,2,559,559,559,559,559,559,559,631,2122,631,631,1395,1395,559,559,2122,1395,2122,559,559,559,801,801,801,801,801,801,2,559,559,559,559,2122,1395,559,559,559,559,559,559,1395,2122,559,2,2,2,1395,1395,2,2,1395,1395,559,559,559,559,2,559,559,559,1395,1395,559,559,2122,559,559,2122,2122,2122,2122,559,559,559,559,559,559,559,559,559,559,559,1395,1395,559,1524,1524,1524,1524,1524,1524,559,1524,1524,1524,1524,1524,1524,1524,1524,1524,2,559,1395,1395,1395,1395,1395,1395,2},
+ {2107,709,828,154,542,184,1094,1665,307,1549,177,2007,85,773,2,2,2,2,2,2,2,2,2,2,2,697,2,2,2,2,697,2,697,697,697,2,2,2,2,697,697,697,2,697,697,697,697,2,2,697,697,2,2,2,697,697,2,697,697,2,697,697,1163,1163,2,2,1163,1163,1163,697,697,697,697,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,697,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,691,2,697,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,697,2,697,697,697,697,2,2,2,697,2},
+ {1882,1310,382,2087,769,1172,349,961,1479,76,1156,2264,1041,527,2,2,2,2,2,2,2,2,2,2,2,591,2,2,2,2,2,2,2,2,2,2,325,325,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,2,591,591,591,591,591,591,591,2,591,591,591,591,591,2,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,597,597,2,597,597,597,2,597,597,2,591,591,591,2,2,591,2,2,2,2,2,2,2,2,597,597,597,2,2,2,2,2,2,2,591,2,2,2,2,2,2,2,2,2,2,2,597,2,597,2,2,2,2,2,2,2,2,2,2,591,591,591,2,591,591,591,591,591,591,2,591,591,591,591,591,2,591,591,591,591,591,591,591,2,2,591,2,591,2,2,2,2,2,2,2,2,2,2,2,2,383,383,2,2,2,591,591,597,2,2,597,597,2,2,2,2,2,2,2,2,2,2,2,2,591,2,2,2,2,2,2,2,597,597,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1977,1218,244,365,576,666,761,238,629,913,1907,986,1351,986,704,1257,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,163,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,163,163,163,163,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1508,1501,1057,166,882,1562,90,614,165,1870,1370,1158,783,1230,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1336,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,157,2,2,2,2,2,2,2,2,2,1336,1336,1336,2,2,2,2,2,1336,1336,1336,1336,1336,2,1336,2,1336,1336,2,1336,1336,2,1336,1336,2,2,2,1336,1336,2,1336,1336,1336,1336,1336,1336,1336,1336,1336,1336,1336,1336,1336,1336,1336,1336,1336,1336,1336,1336,2,1336,1336,1336,1336,1336,1336,1336,1336,1336,1336,1336,1336},
+ {1889,1210,1246,1326,668,1199,77,565,1277,1607,874,1433,1433,77,2,681,2,2,2,2,2,2,2,679,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,432,432,432,432,432,432,2,2,477,477,477,477,477,432,493,432,432,432,904,904,904,788,788,2,432,432,432,432,432,432,432,432,432,477,477,477,788,788,788,788,788,788,788,379,788,788,788,788,788,788,788,788,788,788,788,52,52,379,379,379,788,52,52,788,788,788,788,788,788,788,788,432,477,432,52,52,52,379,379,379,2,493,493,493,788,788,432,432,432,432,477,477,379,379,379,379,379,379,379,379,146,432,432,432,788,788,788,624,379,624,624,624,624,624,624,624,2,2,788,379,379,379,379,493,493,493,379,379,493,499,499,499,499,499,499,2,493,2,788,2,2,2,2,2,432,2,2,2,2,477,2,2,2,2,2,2,2,385,2,689,689,1713,1713,1713,1713,1713,1713,1713,1713,6,36,1713,2,2,1024,1024,137,2041,2041,2041,226,226,1258,1258,36,36,1642,904,748,379,624,624,624,379,379,379,379,379,379,379,379,379,379,379,379,379,2,2,2,2,624,624,624,624,493,379,379},
+ {1496,1912,1291,1053,510,2322,1048,1530,2223,673,894,594,628,332,2,2,2,2,2,295,295,295,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,295,295,2,2,2,2,295,295,295,295,295,295,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,295,2,2,295,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,375,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1520,1107,1082,687,484,1732,676,1595,467,653,1091,428,2113,332,332,332,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,383,383,383,383,383,383,383,383,383,383,383,383,383,383,383,383,383,383,383,383,383,2,383,383,383,383,2,2,383,383,383,383,383,383,383,2,383,383,383,383,2,2,2,383,383,383,383,383,2,383,383,383,383,383,383,383,383,383,383,383,383,383,383,383,383,383,383,383,383,2,1247,1247,1247,1247,1247,1247,1247,1247,1247,1247,1247,1247,1247,1247,1247,2,1247,1247,1247,1247,1247,1247,1247,1247,1247,2,2,1247,1247,1247,1247,1247,1247,1247,1247,1247,1247,1247,1247,1247,1247,1247,1247,1247,1247,1247,2,2,1247,1247,1247,1247,1247,1247,1247,1247,1247,1247,1247,1247,1247,1247,1247,1247,1247,1247,1247,1247,1247,1247,1247,1247,1247,383,383,383,383,1247,383,383,383,383,383,383,383,383,383,1247,383,383,217,217,217,1247,383,1247,1247,1070,1247,1247,1247,1247,1247,217,217,1247,383,383,383,217,383,383,2,1247,383,383},
+ {1905,612,920,848,562,2032,230,1305,1073,851,731,798,798,357,516,2,2,2,2,2,2,2,2,1465,1465,373,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,454,2,2,8,8,373,2,2,1816,78,454,454,649,312,312,1465,1465,312,373,454,373,1465,1465,1465,373,373,373,1465,1465,1465,1465,373,373,1465,373,373,373,373,1465,1465,373,373,373,1465,1465,1465,1465,1465,1465,1465,1465,373,1465,1465,1465,1465,1465,1465,1465,1006,1492,57,57,57,922,1630,1630,1630,1630,1630,1630,1630,1630,1630,1630,1630,1630,1630,1630,1630,373,373,315,315,315,1465,1465,1465,1465,1465,1465,1465,1465,1465,1465,1465,1465,1465,1465,1465,1465,1465,1465,373,373,373,373,1465,1465,1465,1465,1465,1465,1465,1465,1465,1465,1465,1465,1465,1465,1465,1465,1465,1465,1465,1465,1465,1465,1465,1465,1465,1465,1465,1465,1465,1465,1465,1465,1465,1465,1465,1465,373,1465,1465,1465,1465,1465,1465,1465,1465,1465,1465,1465,1465,1465,1465,1465,1465,1465,1465,1465,1465,1465,1465,1465,1465,1465,1465,1465,1630,1492,57,57,57,922,1006,1630,1630,1630,1630,1630,1630,1630,373,1630,1630,1630,1630,1630,1630,373,1630,315,315,315,1630,1465,1465,1465,1465,1465,1465,1465,1465,315,1465},
+ {1428,1062,1016,75,297,1130,533,768,464,753,48,1510,1510,418,375,1626,2,221,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,280,2,2,2,2,2,2,2,2,2,2,283,283,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,221,280,221,221,2,2,280,2,2,2,2,280,280,2,283,2,283,2,2,2,2,2,2,2,2,2,2,283,2,2,2,2,2,2,2,2,283,283,283,283,280,280,1449,2,2,2,2,2,2,2,283,283,2,283,283,2,283,2,2,2,2,2,2,2,283,283,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,283,2,2,283,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,283,2,2,283,1449,1449,1449,1449,1449,2,2,2,1449,1449,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1449,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1396,729,1710,337,371,489,1341,2117,132,1870,853,853,408,1079,328,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,999,999,2,2,999,999,2,2,999,999,999,999,999,999,999,547,547,999,999,999,999,2,2,2,2,2,2,999,999,999,999,999,999,999,999,999,999,999,999,999,999,2,2,2,2,547,547,547,547,494,999,999,547,547,999,999,999,2,2,999,999,999,999,999,999,999,2,2,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,2,2,2,2,2,494,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,999,2,2,2,2,2,2,2,999,999,999,999,999,999,494,494,2,494,999,999,999,2,999,999,2,2,999,999,2,999,2,2,999,999,999,999,999,999,999,999,2,999,999,2,2,999,999,999,999,999,999,999,999,999,999,2,2,999,999,999,999,999,2,999,999,2,2,2,2,494,2,494,2,494,494,494,999,999,999,999,999,999,999},
+ {1978,1051,977,588,1423,1001,508,409,825,497,659,1063,384,463,463,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,765,2,2,2,2,2,2,765,765,765,765,765,765,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,765,765,2,2,765,2,2,2,2,2,2,2,2,765,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,765,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,765,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,765,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1534,854,2007,1207,947,1773,1571,1505,909,1471,1655,1655,2334,1327,409,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1548,1548,2,2,2,2,2,2,2,2,2,2,1548,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1548,2,2,2,2,1548,1548,1548,1548,1548,1548,2,2,2,2,2,2,2,2,2,2,2,2,1548,1548,1548,2,1548,1548,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1548,1548,1548,1548,1548,2,2,2,1548,2,2,2,2,2,2,2,2,2,2,1548,1548,1548,1548,1548,1548,1548,1548,1548,1548,2,2,2,2,2,2},
+ {1520,1595,1238,1238,131,969,1745,1121,822,865,716,571,571,1679,1679,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,992,992,992,992,992,992,992,992,2,2,992,992,992,2,992,992,992,1605,1605,2,2,2,2,2,992,992,992,992,992,992,992,992,992,992,992,992,2,992,1605,1605,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,2,2,992,992,992,197,2,2,2,197,197,992,992,197,197,197,992,992,70,197,2,992,992,992,992,197,197,197,197,197,197,197,197,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,70,70,992,70,70,70,70,70,70,70,70,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,1620,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,70,992,992,992,992,197,197,197,1263,1263,1263,1263,1263,1263,1263,1263,1263,1263,992,1605,1263,1263,1263,1263,1263,1263,1263,1263,1263,1263,1263,1263,1263,1263,1263,1263,1263,1263,1263,1263,1263,1263,1263,1263,1263,1263,1263,1263,1263,1263},
+ {2157,2106,679,238,378,49,1101,588,811,1313,1556,2301,475,812,812,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,900,2,2,2,2,2,2,2,900,900,2,2,2,2,2,900,369,369,369,369,369,900,900,900,900,900,900,2,1429,1429,1429,900,900,2,2,900,900,900,900,2,900,900,900,900,900,900,900,900,1429,2,2,1429,1429,2,2,2,900,2,2,2,2,2,2,1429,2,1429,1141,1429,900,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,432,900,900,2,2,2,432,900,900,900,900,2,2,900,900,2,2,2,2,2,2,2,900,2,2,2,900,2,2,2,2,900,2,2,2,2,2,2,2,2,2,900,900,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,397,397,397,397,397,397,866,27,27,620,815,815,815,900,900,2,125,462,900,2,2,2,2,125,125,125,2,125,125,125,900,900,462,462,462,2,462,2,2},
+ {2187,1515,549,1416,1073,1613,47,1046,390,252,1214,1404,1404,933,1013,2,2,2,1025,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2145,1069,662,709,737,1141,1737,827,1384,1628,107,107,1032,277,277,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1505,2,2,2,1505,2,1505,2,2,2,2,2,2,2,2,2,1505,1505,2,2,2,2,2,2,2,2,2,1505,2,1505,2,1505,2,1505,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1505,2,1505,1505,2,2,2,2,2,2,2,2,2,2,1505,1505,2,2,2,2,2,2,2,2,2,2,2,2,2,1505,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1505,2,1505,1505,2,2,2,2,2,1505,1505,1505,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1505,1505,489,1505,1505,1505,1505,1505,2,2,2,2,2,1505,1505,1505,1505,1505,1505,1505,1505,1505,1505,1505,1505,1505,1505,1505,2,2,2,2,1505,1505},
+ {1547,928,196,464,373,1696,1395,1546,967,735,1126,878,878,919,358,2,2,2,2,2,2,2,2,2,2,558,2,2,558,2,2,2,1254,2,2,558,1254,1254,1254,2,558,558,2,2,558,558,1254,1254,2,2,2,558,558,558,558,1338,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,558,558,558,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,558,2,2,558,558,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,558,2,558,558,558,2,2,2,2,558},
+ {2173,1379,155,393,1578,610,1911,899,697,58,185,597,597,1249,1369,2,2,2,2,1369,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1016,2,2,2,2,2,2,2,1016,2,2,2,2,2,1016,2,2,1016,1016,1016,2,2,2,1016,2,2,2,2,2,2,2,2,2,2,2,2,2,1016,1016,2,2,2,2,1016,1016,1016,1016,2,2,2,1016,1016,1016,1016,1016,1016,1016,1016,2,2,2,1016,1016,1016,1529,1016,1529,1529,1529,1529,1529,1529,1529,1529,1529,1529,1016,1529,1529,2,1529,1529,1529,1529,1016,1016,1016,35,1016,1016,1016,1016,1016,1016,1016,1016,1016,1016,1016,1016,1016,1016,1016,1016,1016,1016,1016,1016,1016,2,2,1016,1016,1016,1016,1016,1016,1016,2,1016,1016,1016,1016,1016,1016,2,2,2,1016,1016,1016,1016,1016,1016,1016,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1016,2,2,2,2,306,1016,1016,1016,2,1016,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1016,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1016,2,1016,1016,2,2,2,1016,2,2,2,2,2,2,2,2,2,2,2,1016,1016,2,2},
+ {1413,1589,1603,2268,520,333,1416,859,1619,867,1154,512,1291,413,413,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,262,262,262,2,2,1621,2,2,2,2,2,262,2,262,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1621,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1274,1274,2,2,2,262,2,2,2,262,262,262,262,2,2,2,1274,1274,1274,2,2,2,2,2,2,2,2,2,2,2,2,2,262,2,2,2,2,2,2,2,2,2,2,2},
+ {1600,1823,1698,1268,623,583,1932,1674,522,529,1862,1281,246,989,246,2,246,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,601,601,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,601,601,601,601,2,2,801,801,801,2,2,2,2,2,2,2,993,993,993,993,2,2,2,2,993,993,993,993,993,2,2,601,993,993,993,993,993,993,993,993,601,2,601,601,2,601,601,601,601,993,993,993,993,993,601,2,601,993,993,601,601,601,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1017,993,993,993,993,993,601,601,2,2,2,2,601,601,601,601,601,601,601,601,601,601,601,601,601,601,2,2,2,801,801,801,801,801,801,2,801,2,2,2,2,2,2,2,2,993,2,2,993,2,2,2,2,993,993,801,801,801,2,2,801,601,801,801,801,801,801,801,801,801,801,601,601,801,801,801,801,801,801,601,2,801,801,801,801,801,801,801,801,801,801,801,601,801,801,801,801,801,801,801,801,801,801,801,801,801,601,801,801,801,801,801,801,801,801,801,601,601,801,801,801},
+ {2212,842,1249,1202,1030,949,809,639,327,878,1241,1241,98,1542,1542,2,103,103,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1591,1591,2,2,2,1591,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1591,2,1591,1591,2,1591,1591,1591,2,2,2,2,2,1591,1591,1591,2,2,1591,2,2,2,2,1591,1591,1591,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1591,1591,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1591,1591,2,2,2,2,2,2,2,2,2,2,1591,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1559,992,174,1313,612,1487,1487,461,702,37,1660,839,2,95,1628,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1029,1029,1029,2,2,2,2,2,2,2,2,2,2,2,1029,1029,2,2,2,2,2,2,2,2,2,2,2,2,1029,1029,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,89,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,2,1029,1029,1029,2,2,1029,1029,2,2,2,2,2,89,89,2,2,2,1029,2,2,1029,2,2,2,2,2,2,1029,1029,89,89,1029,1029,1029,1029,1029,1029},
+ {2066,1719,710,1294,2041,377,1005,690,132,756,1618,187,187,726,187,615,615,2,2,2,2,851,2,2,2,2,2,2,2,2,2,744,744,2,2,2,744,2,2,2,2,2,2,2,2,2,2,2,2,2,2,744,744,2,2,653,653,653,2,2,744,744,653,653,653,2,2,653,744,2,653,653,653,2,653,744,653,653,653,653,744,653,2,744,2,2,2,2,2,2,2,2,2,744,744,744,744,744,744,653,744,744,2,653,653,653,2,2,744,744,744,2,2,653,653,2,2,1486,744,744,2,2,2,744,653,653,2,2,653,653,2,2,744,744,744,744,744,744,744,744,744,2,2,2,2,2,2,2,653,653,744,653,653,653,653,653,2,2,2,2,2,2,2,2,2,2,2,851,851,2,2,2,2,2,744,2,653,2,653,2,2,2,653,653,744,744,635,2,1486,1486,2,1486,1486,1486,1486,1486,1486,1486,2,653,653,2,2,2,653,653,653,2,1486,653,653,2,2,2,2,1486,1486,1486,1486,1486,635,635,635,635,635,635,635,635,635,2,2,2,2,2,2,2,1486,1486,1486,2,2,635,653,635,635,635,1486,1486,1486,635,635,635,1486,1486,1486,1486},
+ {1432,731,398,557,1903,1360,152,520,20,586,116,70,2,721,721,12,1557,2,2,2,2,2,2,2,2,2,2,2,2,687,2,2,2,2,2,2,687,687,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,687,687,2,2,2,2,687,2,2,2,687,687,2,2,2,2,2,2,2,2,2,831,831,831,2,2,2,687,687,2,687,2,687,2,2,2,2,2,2,2,687,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,687,2,2,2,2},
+ {2192,1029,310,1609,592,1542,265,117,2006,82,162,205,2,2009,2009,1201,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1570,1504,1414,1143,1999,1932,1015,1015,556,514,626,79,2,79,1795,1461,1461,2,2,2,2,2,2,2,1461,1461,1461,1461,1461,2,2,2,2,2,2,2,2,2,2,1461,1461,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1461,1589,1461,2,2,2,1461,1461,1461,1461,1461,1461,1461,1461,1461,1461,1461,1461,1461,2,2,2,2,2,2,2,1510,1510,1510,1461,1510,1510,1461,1461,1461,1510,1510,1589,1589,1589,1461,1461,1461,1461,1461,1461,2,1461,1461,1461,1510,1510,1461,1461,1461,1461,1461,1461,1461,1510,1510,1510,1510,1461,1461,1461,1461,1461,1461,1510,1510,1510,1510,1510,1510,1510,1510,1510,1510,1510,1510,1510,1510,1510,1510,1510,691,691,1461,1461,2,2,1589,1589,1461,1510,1510,1510,1510,1510,1510,1510,1510,1461,1461,1461,2,2,2,1510,1510,1510,1589,1589,1461,1461,1461,1461,1461,1461,1461,1461,1461,1510,1510,1510,1510,1195,1195,1195,1195,1195,1510,1589,1589,1589,2209,2209,2209,1589,1589,1589,1510,1510,1510,1510,2209,2209,2209,691,1589,1589,1589,1510,1510,691,2209,1461,2209,1589,1589,2209,2209,2209,1510,1510,1510,1461,1461,1461,1510,1510,1510,1589,1510,1510,1510,1510,2209,2209,1589,1589,1589},
+ {1562,937,1964,934,1349,378,459,109,1676,1655,1339,1809,2,768,768,188,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1965,949,1057,1043,2256,1571,970,348,69,1324,1174,485,105,105,105,2172,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1625,1625,879,879,2,2,1625,2,2,2,1625,1625,1625,879,879,1625,1625,1625,1625,1625,1625,1625,879,879,879,879,879,879,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1625,1625,1625,2,2,2,2,2,2,2,240,240,2,564,2,2,2,101,564,1024,1024,1024,1024,1217,1217,564,128,1625,1625,1625,1625,1625,1625,1625,1625,1625,1625,1625,1625,105,1625,1625,1625,2,2,2,2,726,726,726,726,726,2172,2172,2172,2172,2,2,726,726,1625,1625,1625,1625,1625,2172,199,1625,1625,726,2172,879,879,1625,1625,1625,1625,2172,2172,2172,726,1625,726,1625,726,726,726,726,726,726,726,726,726,1625,726,726,726,726,726,726,726,2172,2,2172,2172,2172,1625,1625,1625,1625,2172,2172,2172,2172,2,2,101,564,1024,1024,1024,1024,1217,2172,2172,2172,2172,2172,105,105,105,105,105,105,105,105,105,1625,1625,726,1625,1625,726,1625,726,726,726,726,1625,1625,1625,1625,1625,2172,2172,2172,726,726,2172,2172,1625,1625,1625,2172,1625,2172,726,726,726,726,726,1625,1625,1625},
+ {2044,1869,838,1424,1097,155,1142,230,1335,420,235,1510,2,431,425,622,2,2,2,2,2,625,2,2,2,625,625,2,2,2,2,2,2,625,625,2,2,625,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,625,625,625,625,2,625,625,625,2,2,2,2,625,625,2,625,625,2,625,625,625,625,625,2,625,625,625,625,625,625,625,625,625,625,625,625,625,2,2,625,625,2,2,2,2,625,625,625,625,625,625,625,2,625,625,625,2,625,2,625,625,2,2,625,625,2,625,625,2,2,2,625,625,625,625,2,2,2,2,2,2,625,625,625,625,625,625,625,625,625,625,625,625,2,625,625,625,625,2,625,625,625,625,625,625,625,625,625,625,625,625,625,625,625,625,625,625,625,625,625,625,625,625,625,625,625,625,625,625,625,625,2,625,625,625,625,625,625,625,625,625,625,2,2,2,2,2,2,625,2,2,625,625,625,625,625,2,2,2,2,2,2,2,2,625,625,625,2,625,625,625,2,2,2,625,625,625,625,625,625,625,625,625,625,625,625,625,625,625,625,625,625,625,625,625,625,625,625,2,625,625,625,625},
+ {1976,1433,820,504,421,1007,388,1083,635,82,1524,750,2,2,870,106,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1775,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1990,1948,1138,1787,253,115,312,1912,341,1624,260,1783,1315,1315,790,790,790,790,790,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,462,462,462,462,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1315,2,2,2,1315,1315,1315,1315,1315,1315,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1576,1286,934,661,1612,434,234,575,42,1431,333,1059,552,552,552,2043,2043,2,2,2,2,2,2,2,2,2,2,356,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,656,656,656,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,356,356,2,2,2,2,2,2,2,2,2,2,2,356,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1993,585,327,1393,1013,1671,1758,1436,1989,1217,1109,1476,2,2,1042,756,1042,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1765,2,2,2,2,2,2,2,1765,1765,2,2,1765,2,2,1765,2,2,2,1765,1765,2,2,1765,1765,1765,2,1765,1765,1765,2,1765,1765,1765,2,2,2,1765,1765,1765,1765,1765,2,1765,1765,2,1765,1765,1765,1765,1765,1765,1765,1765,1765,1765,1765,1765,2,2,2,2,1765,1765,1765,2,2,2,2,2,1765,1765,1765,1765,1765,1765,1765,1765,1765,1765,1765,2,1765,1765,1765,1765,1765,1765,1765,1765,1765,1765,1765,1765,1765,1765,1765,1765,1765,1765,1765,1765,1765,1765,1765,1765,1765,1765,1765,1765,1765,2,1765,1765,1765,1765,1765,1765,1765,2,1765,1765,1765,610,1765,1765,1765,1765,1765,1765,1765,2,2,1765,1765,1765,1765,1765,1765,2,1765,1765,1765,1765,1765,2,2,1765,1765,2,2,1765,1765,1765,2,2,2,2,1765,1765,1765,1765,1765,1765,2,1765,1765,1765,1765,1765,1765,1765,1765,1765,1765,1765,1765,1765,1765,1765,1765,1765,1765,1765,1765,1765,1765,1765,1765,1765,1765,1765,1765,1765,1765,1765,1765,1765,1765,610,610,610,610,610,2,2,610,610,610,2,2,2,2,610,610},
+ {2090,684,953,174,1349,182,1034,788,829,1296,1073,491,2,2,2,220,220,2,2,2,2,2,2,2,2,2,2,2,2,1776,1776,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,52,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,52,2,2,2,52,52,52,52,52,52,52,52,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,825,825,825,825,825,825,825,825,52,52,2,2,2,2,2,2,825,2,825,825,825,825,825,825,2,2,2,2,52,52,52,52,52,52,792,825,825,2,2,2,2,2,2,2,825,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,52,52,2,52,52,2,2,2,2,2,2,2,2,825,2,825,2,52,52,52,52,52,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1682,1682,1682,1682,1682,1682,2,1776,2,2,2,1776,1776},
+ {2056,1062,1605,1943,680,445,113,857,650,1388,2016,1231,2,2,1292,1292,1292,2,1039,1039,1039,1039,1039,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1039,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2092,592,979,1733,2049,1251,673,1324,319,283,1212,1212,2,2,2,1363,1363,2,2,2,2,2,2,2,2,2,844,844,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,844,844,844,2,844,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1443,2,2,2,1443,1443,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,844,2,2,844,2,2,844,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1443,2,2,2,2,2,2,2,2,2,2,2,2,2,2,844,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,844,844,844,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,844,844,2,844,2,2,2,2,2,597,597},
+ {2002,467,1228,150,1098,367,920,328,1204,276,685,1404,2,32,32,633,633,633,633,2,2,1024,32,32,16,16,32,32,32,2290,2290,2290,2290,32,2290,2290,2290,2290,2290,2290,2,2,1024,32,32,16,362,362,362,2290,2290,2290,2290,2290,2290,2290,2290,2290,700,700,175,175,175,181,362,181,1641,373,373,839,839,1311,1311,1311,1311,1311,1311,2290,2290,2290,2290,2290,2290,2290,2290,2290,2290,2290,2290,2290,2290,2290,2290,2290,2290,2290,2290,2290,2290,2290,2290,2290,2290,2290,2290,2290,2290,2290,2290,362,362,362,2290,2290,2290,2290,2290,2290,2290,2290,2290,700,700,175,175,175,181,362,181,181,362,373,839,839,839,1311,1311,1311,1311,1311,2290,2290,2290,2290,2290,2290,2290,2290,2290,2290,2290,2290,2290,2290,2290,2290,2290,2290,2290,2290,2290,2290,2290,2290,2290,2290,1796,2290,2290,2290,2290,1311,362,362,2290,2290,2290,2290,2290,2290,2290,2290,2290,2290,700,839,175,175,175,181,362,181,181,362,362,839,839,373,839,839,839,839,839,2290,2290,2290,2290,362,2290,2290,2290,2290,2290,2290,362,2290,2290,2290,2290,1796,2290,2290,2290,1796,2290,2290,2290,1796,1796,1796,2290,362,1796,1796,1311,362,362,2290,2290,2290,2290,2290,2290,2290,2290,2290,839,700,839,175,175,175,181,362,181,181},
+ {2008,1773,416,1954,1314,742,1694,505,202,1747,785,375,2,2,2,477,1538,477,2,2,2,2,2,1309,1309,1309,1309,2,2,2,1309,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1309,1309,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1658,1008,258,749,427,1071,2052,263,1047,2152,1602,1602,2,2,2,1311,669,669,2,1897,1897,1897,669,669,669,669,669,669,669,669,669,669,669,669,669,669,669,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1557,1557,1557,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2286,1903,1793,1130,465,1956,651,220,1024,296,549,549,2,2,2,138,138,1034,180,180,2,2,1034,2,2,2,1034,1034,1034,1034,2,2,2,2,2,1034,1034,2,2,2,2,2,2,2,2,1940,1940,1940,1034,2,2,2,2,2,2,2,2,2,1034,138,1034,1034,1034,1034,2,2,1034,1034,2,2,2,2,1034,1034,2,2,2,2,1034,1034,2,1034,1034,1034,1034,1034,1034,2,2,2,1034,1034,1034,1034,1034,1034,1034,1034,2,1034,1034,1034,1034,1034,1034,2,1034,1034,1034,1034,1034,1034,1034,1034,1034,1034,1034,1034,1034,1034,2,2,2,2,1034,1034,1034,2,1034,1034,1034,1034,1034,1034,1034,1034,1034,1034,1034,2,1034,1034,1034,1034,2,2,2,1034,1034,2,2,2,1034,1034,1034,1034,1034,2,1034,2,2,2,2,2,1034,2,138,138,138,138,138,138,138,138,138,1034,1034,2,1034,1034,2,2,2,2,2,2,1034,2,2,2,2,2,138,138,138,2,2,2,1034,1034,1034,1034,1034,1034,1034,1034,1740,1903,1034,1034,1034,1034,1034,1034,1034,2,1034,1034,1034,1034,1034,1034,1034,1034,799,799,799,1903,1034,1034,1903,1903,1903,1113,1113,1113,1034,1034,1034,1113,1113,1113,1034,1034,1034,1034,1034,1034,1034,1034,1034,1034,1034,1034,1034,1034},
+ {2285,396,182,1680,682,983,1634,1034,1304,1987,911,715,2,2,2,2,911,911,681,681,2,2,2,2,2,2,557,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,557,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2258,1887,1875,1021,863,604,543,1115,509,1243,312,213,2,2,2,2,335,770,770,2,1143,567,2,2,567,567,567,411,2,2,2,411,1143,1143,567,567,567,567,2,567,1143,567,567,567,411,1143,2,411,567,567,411,411,411,411,2,567,567,567,411,411,411,411,411,411,567,567,567,567,2,2,2,2,2,567,567,1734,1143,567,567,567,1143,567,567,1143,411,411,567,567,567,567,567,335,411,411,411,411,411,411,567,567,411,411,411,411,411,411,567,2,567,411,2,2,567,567,411,411,411,411,411,411,411,567,411,411,567,567,567,567,1734,567,567,567,567,567,567,567,567,567,411,411,411,411,411,411,567,567,567,567,567,567,567,567,2,2,567,567,567,567,567,1143,1143,567,2,2,2,1143,1143,2,1143,2,1143,567,2,2,2,2,2,2,2,2,2,2,2,2,2,411,567,567,2,2,2,2,1143,567,567,567,1143,1143,1143,1143,1143,1143,1143,1143,567,2,2,1143,1143,1143,1143,1143,1143,1143,1143,1143,1143,1143,1143,567,2,567,567,411,411,567,567,567,2,2,567,567,2,567,567,567,567,567,567,567,567,2,2,2,2,2,2,567,567,567,567,2,567,567,2,567},
+ {2266,1872,991,1468,1168,939,907,833,624,701,386,1713,2,2,2,2,2,931,861,381,1299,2,861,2,2,2,861,861,861,861,861,2,2,861,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1299,1299,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,861,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,861,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,861,861,861,861,861,861,861,861,861,2,861,861,861,861,2,861,861,381,381,381,861,381,381,381,861,861,2,2,2,861,861,861,861,861,861,861,861,861,861,861,861,381,381,381,381,381,2,861,2,2,861,861,2,2,2,2,2,2,2,2,2,2,2,2,861,2,2,861,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2014,810,1106,470,299,1927,475,2123,958,367,1300,139,2,2,2,2,75,75,1443,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,108,108,108,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,108,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,985,2,2,2,985,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2273,1510,803,2278,842,1245,1389,230,822,1564,113,1276,2,2,2,2,1350,273,273,2,2,2,2,2,1281,1281,1281,2,2,1281,1281,1281,2,2,1281,1281,2,2,2,2,2,1281,1281,1281,1281,1281,2,2,2,1281,1281,2,1281,1281,2,1281,1281,1281,1281,1281,1281,1281,1281,1281,2,2,2,2,2,2,2,1863,1863,1863,1281,1281,1281,2,2,620,2,2,2,2,2,2,2,2,2,1863,1863,1863,2,2,2,2,1281,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1281,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1281,1281,1281,1281,1281,1281,1281,1281,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1281,1281,2,2,2,2,2,2,2,2,2,1281,1281,2,1281,1281,1281,1281,1281,1281,1281,1281,1281,1281,2,1281,1281,1281,1281,1281,1281,1281,1281,1281,1281,1281,2,1281,2,2,2,1281,2,2,2,2,2,1281,2,2,2,2,2,1281,1281,2,1281,2,2,2,2,2,2,2,2,2,1281,1281,2,2,2,2,2,1281,1281,2,2,2,2,2,2,2,2,2},
+ {1480,807,1596,520,1139,213,1581,460,923,617,1305,939,2,2,2,2,53,53,1589,284,2,2,1589,1589,1589,1589,1589,1589,1589,1589,1589,1589,1589,1589,2,1589,2,2,2,1589,2,2,1589,1589,1589,1589,1589,2,2,1589,2,1589,2,2,2,2,2,2,2,2,1589,2,2,2,2,1589,2,1589,2,2,2,2,1589,1589,1589,1589,1589,2,2,1589,1589,2,1589,1589,1589,1589,1589,449,449,2,2,2,1589,2,2,2,1589,1589,2,2,1589,1589,1589,1589,1589,1589,1589,2,2,2,2,1589,1589,2,2,2,2,2,2,2,2,2,2,2,2,1589,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1589,2,2,1589,1589,2,2,2,1589,1589,1589,1589,1589,1589,1589,2,449,449,1589,1589,1589,1589,1589,2,1589,1589,1589,1589,1589,1589,1589,1589,2,1589,1589,2,2,2,2,2,2,2,2,2,2,2,1589,2,1589,1589,1589,1589,1589,1589,2,1589,1589,1589,1589,1589,1589,2,2,449,449,449,449,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2278,1028,548,373,190,1443,614,2386,1940,930,557,2069,2,2,2,558,112,103,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,596,596,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1199,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1670,1730,153,1435,611,293,2077,1383,1353,1215,2031,1697,860,860,860,860,1172,1580,1580,2,2,1172,2,2,2,2,475,475,475,449,475,2,2,2,2,2,2,2,2,2,475,475,475,475,2,2,2,2,2,2,2,2,475,2,2,2,2,449,449,449,449,449,525,658,658,658,658,658,475,475,2,658,2,2,475,2,475,2,2,475,2,475,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,475,2,2,2,475,475,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,525,2,2,2,2,2,2,2,2,475,475,475,475,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,475,475,475,2,2,2,2,2,2,525,525,475,475,2,2,2,2,2,475,2,2,2,2,2,475,475,475,2,2,2,2,2,2,2,2,2,2,475,475,2,2,475,475,475,475,2,2},
+ {2108,776,1568,342,2215,1882,681,1292,1601,586,1481,618,1930,1930,1930,1930,2146,89,89,2,2,2,2,2,2,2,1171,2,2,2,2,2,2,1171,1171,2,2,2,2,2,1171,1171,1171,2146,2146,2146,2,1171,1171,2,2,2,1171,1171,1171,1171,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1171,1171,1171,2146,2146,2,2,2,2146,2146,2146,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2146,2,2,2,2,2,1171,1171,1171,1171,1171,1171,2,2,2,2,2,2,2,2,2,2,1171,1171,1171,1171,1171,2,2,2,1171,1171,2,1171,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1171,1171,1171,2,2,2,2,2,2,2,1171,1171,2,2,2,1171,1171,1171,1171,1171,1171,1171,1171,1171,2,2,2,2,2,1171,2,1171,1171,2,2,2,1171,1171,1171,1171,1171,1171,1171,1171,1171,2,1171,2,2,1171,1171,1171,2,2,2,2,2,2,2,2,2,2,2,2,1171,1171,1171,1171,2,1171,1171,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1171,1171,1171,1171,1171,1171,1171,1171,1171,1171},
+ {2139,2177,1652,392,715,605,778,632,472,1619,64,64,2,2,2,1747,859,2,2,2,2,2,216,216,216,216,1747,1747,1747,1747,1747,1747,2,1747,1747,1747,1747,1747,1747,1747,1747,1747,1747,1747,1747,2,2,2,2,2,2,2,2,2,2,216,216,216,2,2,2,2,2,1747,1747,1747,1747,1747,1747,2,2,2,2,1747,1747,1747,1747,1747,1747,1747,1747,1747,1747,1747,1747,2,2085,1747,2,1747,1747,1747,1747,1747,1747,2,1747,1747,1747,1747,1747,1747,1747,1747,2,1747,1747,1747,1747,1747,1747,1747,1747,1747,1747,1747,2085,1747,1747,1747,1747,1747,1747,1747,1747,1747,1747,1747,1747,1747,1747,1747,1747,1747,1747,2,1747,1747,1747,1747,1747,1747,1747,1747,1747,1747,1747,1747,1747,2,216,1747,1747,1747,216,1747,1747,1747,2,2,2,216,2,2,1747,1747,216,2,2,2,2,1747,1747,2,2,2,2,2,1747,2,2,2,2,1747,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1617,836,2067,259,810,1597,565,275,896,1474,415,1678,2,2,415,415,383,2,2,2,2,1205,1205,1205,1205,1205,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1205,2,2,2,2,2,2,2,2,2,91,91,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1205,1205,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,91,91,91,2,2,2,2,2,2,91,91,1205,1205,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1205,1205,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2158,632,1665,480,99,219,1268,31,852,486,1051,2164,2,1190,1190,1190,1179,2,2,2,2,2,2,2,2,2,2,2,2,1179,1179,1179,1179,1179,1179,2,1179,1179,2,1179,1179,1179,2,2,2,2,2,1179,1179,1179,1179,1179,1179,1179,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1492,448,271,135,1288,417,130,83,235,2313,482,746,2,2,746,609,611,611,611,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1881,1637,2,2,2,2,2,2,2,42,42,42,42,2,2,2,2,2,1637,1637,1881,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1881,1881,1881,2,2,2,2,2,2,2,2,1881,1881,1881,1881,1881,1881,1881,1881,1881,1881,2,2,2,2,2,2,2,2,1881,1881,2,1881,2,1881,1881,1881,1881,1881,2,2,1881,1881,1881,1881,2,2,1881,1881,1881,2,1881,1881,1881,1881,1881,1881,1881,1881,1881,1881,1881,2,2,2,2,2,1881,1881,1881,318,318,318,318,318,318,318,318,1637,1637,1637,1637,2,1306,1306,1306,2,2,1401,2,264,264,2,1881,1881,2,2,1881,1637,1881,1881,1881,1881,1881,2,2,1881,1881,1881,1881,1881,486,486,486,486,486,486,486,486,486,486,2,2,486,486,486,318,486,1306,318,486,1637,1637},
+ {1628,846,1504,138,464,401,501,506,967,1027,1540,1035,2,1921,1539,1539,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1630,1677,1624,301,1038,909,887,374,411,143,1021,174,2,1393,19,634,2,2,2,2,2,2,2,873,2,2,873,873,2,2,2,2,2,2,2,2,2,2,2,873,873,873,2,2,2,2,2,2,2,2,2,873,873,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,873,873,2,873,873,873,873,873,873,2,2,873,873,2,2,873,873,873,2,873,2,2,2,2,2,873,2,873},
+ {2117,1275,567,223,419,988,1996,88,1049,695,440,431,922,922,298,402,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,788,2,2,2,2,2,788,2172,1798,1798,2,1798,1798,788,1798,788,788,2,1798,1798,1798,2,2,1798,2,2,1798,1798,2,2,1798,1798,1798,1798,1798,1798,1798,1798,1798,1798,788,788,788,788,2172,2172,2,2,2,2172,760,788,2,2304,2304,788,2,788,788,788,2304,2304,2304,2304,2304,2304,2304,2,2304,2304,2,2,2304,2304,2304,2304,2,2304,2,2304,2304,2304,2,788,788,788,788,788,788,788,788,2304,2304,2304,2304,2304,160,2,2,2,922,922,922,922,922,922,2,2,2,2,2,2,2304,2,2,2,2,2,2,2,2304,2,2304,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,265,265,265,265,265,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,32,2,2,2,512,512,512,512,512,512,512,512,512,512,512,512,512,512,2,2,2,2,2,2,2,2,2,788},
+ {1654,1131,2054,994,2170,548,801,252,87,219,488,2239,2,1232,1839,1822,2,2,2,968,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,291,291,291,291,291,141,141,141,141,141,141,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,141},
+ {1648,669,1340,1345,1074,370,80,173,1160,1670,263,772,754,754,754,1166,2,2,2,2,1304,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1304,2,1304,1304,1738,1738,1738,2,2,2,2,2,2,2,2,1304,1738,2,2,2,8,8,32,128,2,2,2,1460,1460,1460,1460,512,512,512,512,365,1460,1460,1304,1738,1738,1738,1738,1738,1738,1738,1738,1738,1738,1738,1738,1738,1738,1738,1738,233,1738,1738,1738,1738,1738,1738,1738,1738,1738,1738,1738,1738,1738,1738,1738,1738,1738,1738,1738,1738,1738,1738,1738,1738,1738,895,1738,1738,1738,1738,1738,2,2,365,1460,1738,1738,1738,1738,1738,1738,1738,1738,1738,1738,1738,233,1738,1738,1738,1738,1738,1738,1738,1738,1738,1738,1738,1738,1738,1738,1738,1738,1738,1738,1738,1738,1738,1738,233,233,233,1738,1738,1738,1738,1738,1738,1738,663,663,663,663,663,1738,1738,1088,1088,1088,1088,1088,272,17,17,17,1248,1248,1248,1552,97,97,97,97,97,78,78,78,286,286,286,286,286,286,286,286,286,895,895,1391,1391,1391,1391,1391,1391,1391,1738,1738,1016,233,233,233,233,1016,1171,1738,1738,1738,895,1738,1738,1738,2453,2453,2453,2453,2453,2453,1738,2091,2091,2091,2091,1016,2091,2091,2091,1171,2091,2091,1171,1171,1171,1171,1171,1171},
+ {2065,1520,1423,1797,899,1425,1801,776,2365,58,646,695,2,998,998,1342,2,2,2,2,2,2,2,2,2,2,2,2,1150,1150,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,218,2,2,218,2,2,2,2,2,2,2,2,2,1150,1150,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,218,218,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1150,1150,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2304,1948,316,1063,237,607,1143,2575,1388,1022,127,251,2,438,1570,1570,1570,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,75,75,75,75,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,75,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,75,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2177,710,1912,617,809,1078,199,905,673,519,457,52,2,1348,1348,410,2,2,2,2,2,340,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,765,765,765,765,765,765,2,2,1982,1982,1982,1982,1982,1982,1982,1982,1982,1982,1982,1982,1982,1982,1982,1982,1982,1982,1982,2,2,2,2,1982,2,2,340},
+ {2073,1543,1586,1296,2466,753,455,46,119,1694,2035,1592,206,206,206,2,2,2,2,2,2,2,2,1172,2,2,2,2,2,2,2,2,2,589,589,589,589,589,589,589,589,589,589,589,589,2,589,589,589,1172,1172,2,1172,1172,1172,589,1172,589,589,589,2,2,589,589,589,589,589,589,589,589,589,2,2,2,2,2,780,589,589,589,589,2,2,2,2,2,2,2,780,527,527,589,589,589,589,2,2,589,589,589,589,589,2,2,589,589,589,589,2,2,2,2,2,1172,1172,1172,1172,1172,1172,1172,2,2,589,589,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,589,589,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,589,2,2,2,2,2,2,2,589,589,589,589,589,589,2,2,589,589,2,589,589,2,2,589,589,589,589,589,589,589,589,589,589,589,589,589,589,589,589,589,589,589,589,589,589,589,589,589,589,589,589,589,589,589,589,589,589,589},
+ {2075,1056,874,2101,566,1790,1333,386,538,1560,2254,331,717,717,717,454,454,2,2,2,2,2,2,2,2,2,2,2,454,454,2,2,454,454,454,454,454,454,454,454,2,454,454,2,2,2,454,454,454,454,454,454,2,2,2,2,2,2,725,725,725,2,2,2,2,454,254,254,725,725,725,725,725,725,454,454,2,454,454,454,454,454,454,454,454,2,725,454,454,454,454,454,725,725,725,725,454,725,725,725,725,454,454,454,725,454,454,454,454,454,725,454,454,454,454,2,454,454,213,454,454,725,725,454,454,454,454,454,454,454,454,454,454,454,454,454,454,254,2,725,725,725,2,2,454,454,454,2,2,454,454,2,2,2,454,2,2,454,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,454,2,2,2,2,725,454,454,454,2,2,2,2,725,725,725,725,725,725,725,725,725,725,725,725,725,725,725,725,725,725,725,725,725,725,725,725,725,725,725,725,725,725,725,725,725,725,725,725,725,725,725,725,2,725,725,2,2,2,725,2,725,725,725,725,725,725},
+ {2078,815,288,730,994,1968,1721,1248,2330,1394,1042,2126,982,286,1943,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1167,1167,1167,1167,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1167,1167,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1167,2,1167,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2090,720,440,1851,579,2515,173,129,698,1225,695,1283,1897,1330,1330,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,470,470,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1670,977,1540,553,855,1729,239,757,191,62,732,549,1092,1092,199,199,199,199,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1433,1433,1433,2,2,2,2,1433,2,2,2,2,2,199,2,2,2,2,2,2,2,2,2,2,2,2,2,1433,2,2,2,1433,2,2,2,2,2,2,2,2,2,2,2,2,2,1433,1092,1092,1092,2,2,2,1433,2,2,1092,1433,2,2,2,1092,1092,1433,1433,1433,1433,1433,1433,2,2,1433,1433,1092,1433,1433,1433,2,1433,1433,1433,1433,1433,1433,1433,2,2,1433,1433,1433,1433,1433,2,2,2,1433,1433,1433,1433,1433,1433,1433,1433,1433,1433,1433,1433,1433,1433,2,2,2,2,2,2,2,2,2,1433,1433,1433,1433,1433,1433,1433,199,199,199,2,2,2,2,1092,2,2,2,2,1092,2,2,1433,1092,2,2,2,2,2,2,1092,2,1092,1092,2,2,2,2,1433,2,1433,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1433,1433,2,2,2,2,2,1433,1433,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2320,1529,674,1839,1633,244,281,1975,387,978,775,53,507,1527,298,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1630,1630,1630,1630,2,2,2,1630,2,2,2,2,1630,1630,2,2,2,2,2,2,2,2,2,2,2,1630,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1630,2,2,2,2,2,2,1630,1630,2,1630,1630,1630,1630,1630,1630,1630,1630,1630,1630,1630,1630,1630,2,2,2,2,2,2,2,2,2,1630,1630,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1630,1630,1630,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2096,1155,2257,125,1986,245,1208,2146,2287,680,1413,73,467,1410,1410,2,2,2,2,2,133,133,133,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,327,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,8,8,2,2,2,60,1800,2318,2318,532,1334,1334,578,1047,1047,1047,1047,333,333,333,2,2,2,2,2,2,1259,1259,2,2,1259,1259,2,2,2,2,2,2,2,2,2,2,2},
+ {1538,1026,2157,1457,1784,2559,184,29,614,273,697,697,1922,697,697,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,525,525,2,2,2,2,2,2,525,525,525,2,525,525,525,525,525,2,2,525,525,2,2,2,525,525,525,525,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2173,2154,482,393,285,1418,1631,518,1156,32,67,352,352,352,1783,1500,1500,1500,1500,1500,2,2,2,2,2,2,2,2,2,2,2,2,2652,2652,2652,2652,738,2,738,2,2,2,2,160,160,160,160,160,160,160,2,2,2,1500,1500,1500,1500,1500,160,1500,1500,160,160,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,966,738,738,966,966,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1500,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1500,1500,1500,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2156,891,351,1633,81,1329,119,1150,679,673,1117,1785,1785,451,1927,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,737,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,516,516,516,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,66,66,66,66,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,66,66,66,66,66},
+ {2106,856,1025,382,389,272,425,672,1021,216,601,292,510,510,876,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1662,608,2478,266,1330,505,40,2058,964,724,596,1221,1221,310,42,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,529,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,529,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,529,2,529,2,2,529,2,2,529,529,529,529,529,529,529,2,2,2,2,2,2,2,2,2,2,529,529,529,2,2,529,2,2,2,2,2,2,529,529,2,2,2,529,529,2,2,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,2,2,2,2,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529},
+ {2392,1719,1026,1290,844,1553,1421,1082,872,312,208,212,206,206,576,2,2,2,2,2,905,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,403,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,905,905,905,2,2,2,2,905,905,2,905,905,905,905,905,905,905,905,905,905},
+ {1600,1338,196,1510,1371,1138,957,169,545,1176,1131,2460,1708,541,541,2,363,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1708,1708,1708,1708,2,2,2,2,2,2,2,2,2,2,2,1313,2,1313,2,2,2,2,2,2,2,2,2,2,1313,1313,1313,1313,1088,1088,2,2,2,2,2,2,2,2,1313,2,2,2,2,1313,1313,1313,2,2,2,2,1313,1313,1313,1313,980,980,1313,2,1088,1088,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1313,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1313,2,2,2,2,2,1313,1313,1313,2,2,2,2148,55,2,2,2,2,2,1088,2,2,2,2,2,2,2,2,2,1313,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,313,1414,1414,1414,1282,1857,1857,1857,18,506,18,2,2,2,2,2,1478},
+ {2378,1005,1799,733,970,94,936,418,609,666,872,119,105,1051,142,2,284,284,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,398,2,2,2,398,398,398,398,398,398,2,2,2,2,2,2,398,398,398,2,2,398,2,2,2,398,2,2,2,2,2,398,398,398,398,398,398,398,398,398,398,398,398,398,398,398,398,398,398,398,398,398,398,398,398,398,398,398,398,398,398,398,2,398,2,2,2,2,2,2,2,398,398,398,398,398,2,2,398,398,398,398,398,398,398,398,398,398,398,398,398,398,398,2,2,2,2,2,2,2,2,2,398,398,2,2,398,398,398,398,398,398,398,398,398,2,398,398,398,398,2,2,2,2,2,2,2,398,398,398,2,2,2,2,2,398,398,398,2,2,2,398,398,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,398,398,2,2,2,2,2,2,2,398,398,398,398,2,2,2,2,398,398,398},
+ {2132,756,1097,166,202,411,640,717,514,1389,633,633,633,633,633,633,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,566,566,566,566,566,566,566,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,566,566,566,566,566,566,2,566,566,566,566,566,566,566,566,566,566,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,566,566,566,566,566,566,2,2,2,2,2,566,2,2221,566,566,566,2,2,2,2,2,2,2,2,2,566,2,2,2,566,2,2},
+ {2386,748,620,478,647,898,320,53,1115,190,60,1860,1860,802,802,2,2,2,2,1264,1346,1346,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1346,2,2,2,1346,1346,1346,2,2,2,2,2,1346,1346,1346,2,2,2,1346,1346,2,1346,1346,1346,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1346,1346,1346,1346,1346,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1346,2,2,2,2,2,2,2,2,2,2,2,2,2,1346,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2125,996,1081,124,1140,628,1668,1913,151,2495,523,430,260,708,2190,2190,2190,2,2,2,2,2,1660,2,2,497,497,497,497,497,497,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1056,1660,1660,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2433,531,2067,2273,2167,1673,964,130,1429,688,737,737,737,261,261,1586,2,1309,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1539,2,2,2,1539,1539,1539,1539,1539,1539,2,1539,1539,1539,1539,2,2,2,1539,1539,1539,1539,1539,1539,1539,1539,1539,1539,1539,1539,1539,1539,2,2,2,1539,1539,1539,1539,1539,1539,1539,1539,1539,1539,1539,2,2,1539,1539,1539,1539,1539,1539,1539,1539,1539,1539,1539,1539,1539,1539,1539,1539,1539,1539,1539,1539,1539,1539,1539,1539,1539},
+ {1602,1489,895,383,56,698,2081,1728,794,789,16,16,797,302,52,2,2,2,2,2,2,2,2,2,2,797,797,797,797,797,797,1808,1808,1808,1808,1808,1808,1808,1808,1808,1808,1808,1808,1808,1808,1808,1808,1808,1808,1808,1808,1808,1808,1808,1808,1808,1808,1808,1808,2,1808,2,1859,1859,1859,1859,2,1859,1859,2,2,2,2,2,2,2,2,2,1859,1859,1065,1859,2,2,1859,1859,1859,1859,1859,1808,2,2,2,2,2,2,2,2,2,2,2,2,1808,2,2,2,1808,1808,1808,2,2,1808,1808,2,1808,2,2,1859,1808,1808,1808,2,2,2,2,2,1808,1808,1808,1808,1808,1808,1808,1808,1808,1215,1215,2,1215,1808,1808,1808,1859,1859,1859,1859,1859,1859,2,1808,1808,1808,1808,1808,1808,1859,1215,1808,1859,1859,1859,2,1859,2,2,2,797,797,797,797,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,797,2,2,2,2,1859,1859,1859,1859,1859,1859,1859,2,2,1859,1859,2,2,2,2,2,2,2,2,1859,2,1859,1859,2,2,2,2,2,2,1859,2,2,2,2,2,2,2,2,2,2,2,2,2,1859,1859,1859,797,797,797,797,1859,2,1859,1859,1859,1859,1859,1859},
+ {1623,1362,1669,701,747,749,1302,129,296,17,642,1497,723,2101,1004,1004,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1605,1605,1605,1605,2,1605,1605,2,2,1183,1183,1183,1183,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1183,1183,1183,1183,1605,1605,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1183,2,1183,1183,1183,2,2,1605,2,2,2,2,1183,1183,1183,2,1183,1183,2,1183,1183,1183,1183,1183,1183,1183,1183,1183,1183,1183,1183,1183,1183,1183,1183,1605,1605,1183,1183,1183,2,2,1183,1183,1605,1183,2,2,2,2,2,1183,2,2,2,1183,1183,1183,1183,1183,1183,1183,1183,1183,1183,1183,1183,1183,1183,1183,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2210,606,901,547,131,1924,1852,1271,194,766,390,390,520,795,1429,1429,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1429,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2390,1692,1090,533,305,825,28,840,1810,475,869,2800,233,1585,63,1350,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,687,713,713,573,938,209,209,209,209,209,209,2,2125,2363,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2363,167,167,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2363,2125,2,2,2125,2363,2363,2363,2363,2363,2363,2363,2125},
+ {1731,599,817,724,718,1038,1082,2503,1341,936,421,1802,1304,1304,1491,186,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,229,229,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,229,2,2,2,1150,1150,59,2,2,2,2,2,2,2,2,2,2,2,2,2,229,229,2,2,2,2,2,229,229,2,2,2,229,229,2,229,229,229,229,229,2,229,229,229,229,229,2,2,2,2,2,2,2,2,2,2,2,2,1382,2,2,2,2,1150,1150,1150,2,2,1382,1382,229,229,229,229,229,229,2,2,2,2,2,2,1382,1382,2,229,229,2,2,270,2,270,2,2,2,2,2,2,2,2,229,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1150,1150,1150,1150,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2447,1389,2281,1282,374,308,1587,48,1137,1275,1980,713,713,713,2,960,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1225,1225,1225,2,2,2,2,2,2,2,1225,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1727,822,712,1351,240,451,1645,340,296,2524,47,1131,1876,581,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,339,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1876,2,2,2,1876,1876,2,1876,1876,1876,1876,2,1876,1876,2,2,2,1876,1876,1876,2,2,1876,1876,1876,1876,1876,1876,2,1876,2,2,2,2,2,1876,1876,1876,1876,2,1876,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1876,2,1876,2,2,2,1876,1876,2,2,2,1876,1876,1876,1876,1876,2,2,2,1876,1876,1876,1876,1876,1876,1876,1876,1876,1876,1876,1876,1876,1876,1876,2,1876,2,1876,1876,2,2,2,1876,1876,1876,1876,1876,1876,2,2,2,2,2,2,1876,1876,1876,1876,2,1876,1876,1876,1876,1876,1876,1876,1876,1876,1876,1876,1876,2,2,2,1876,1876,1876,2,1876,1876,1876,1876,1876,1876,1876},
+ {2228,1000,544,327,2251,707,2235,598,1389,317,434,809,1560,1560,941,941,941,941,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2168,1532,769,2570,1303,357,1793,1633,1226,1025,205,1218,1984,764,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2335,2335,2335,2335,2335,2335,2335,2,2,2335,2335,2335,2335,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2234,1706,356,581,532,933,1704,387,1345,1345,34,135,350,307,614,614,307,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,87,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,909,909,909,909,909,909,909,909,1688,2,2,2,1688,1688,1688,1688,1688,621,621,2,909,1517,1517,909,909,1688,1517,1517,1517,1688,1688,1688,1688,1688,1688,1688,1688,1688,1688,1688,1688,2,2,1517,1517,909,909,909,621,909,909,909,1688,1688,621,621,909,909,909,909,909,909,909,909,909,909,909,1517,1517,1517,1517,621,621,621,1517,1517,1517,1343,909,909,909,909,909,909,909,2,2,2,2,909,1343,1517,1517,1517,1343,1343,1517,1517,1688,1517,1517,1517,1517,1517,1517,1517,1517,1517,1343,621,621,2,1688,621,2,1343,1343,1343,1343,621,621,621,621,621,621,621,621,621,621,621,621,621,621,621,621,621,621,621,2,2,2,1688,1688,621,1688,1517,1517,1517,1517,621,2,2,2,2,621,621,621,621,621,621,1688,1688,1688,1688,1517,2,621,621,621,621,621,621},
+ {1750,1297,423,1018,963,2368,1854,722,139,221,945,1235,180,2704,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1455,1455,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1455,1455,1455,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1455,1455,1455,1455,2,1455,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1656,2093,354,310,306,1553,106,459,175,55,1482,958,254,254,2,356,356,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,224,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,224,2,2,2,224,224,2,224,224,2,224,224,2,224,224,2,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,813,813,224,224,224,224,2,2,2,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,2,224,224,224,813,813,813,224,224,2,813,813,813,813,813,813,813,813,813,813,813,813,813,224,224,813,813,813,813,813,813,813,813,813,813,813},
+ {1654,1035,330,533,1446,953,499,142,1527,1748,265,1437,265,510,2,2,2,2,2,2,2,1835,1835,1835,1835,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1835,1835,1835,2,2,2,2,2,2,2,2,2,2,2,2,1835,2,2,2,603,603,603,603,603,603,603,603,603,2,2,2,2,2,1835,1835,1835,2,2,2,557,1835,2,1835,1835,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1600,479,1457,246,2025,618,1612,2139,169,1492,1097,1327,2007,2007,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,77,2,2,77,77,77,77,2,2,2,77,2,2,2,2,2,2,77,77,77,2,2,2,2,2,2,2,2,77,77,77,77,77,77,77,77,77,77,2,77,2,2,2,77,77,600,2,2,322,322,322,2,2,322,322,2,2,2,2,2,2,2,2,2,2,322,322,322,322,42,42,322,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,2,77,600,600,675,322,322,322,322,322,322,600,322,322,322,2,2,2,2,2,2,2,2,2,2,322,322,322,322,322,322,322,322,322,322,322,2,2,2,2,493,493,493,493,322,322,322,600,600,42,2,600,600,42,42,600,322,322,42,322,322,322,675,675,675,675,322,600,277,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,600,42,42,42,42,42,42,42,42,42,42,322,322,322,42,42,42,42,42,493},
+ {2461,1123,1791,143,404,62,1381,185,691,115,357,692,357,357,2,2,2,2,2,2,2,2247,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,759,759,2,759,759,759,759,759,759,759,759,759,2,759,759,759,2,759,759,759,759,759,759,759,2,759,759,759,2,2,2,2,2,759,759,759,759,759,759,759,759,2,2,2,759,759,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,759,759,759,759,2,2,759,759,759,2247,2247,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,759,423,2,2,2,759,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2247,2,2247,2,2,2,2,2,2,2,2,2,2,759,2,38,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,759,759,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,490,2,2,2,2247,2247,2247,2,2247,2247,2247,2,2,2,2,2,2},
+ {1744,447,845,2145,748,1555,1193,1312,916,1770,1294,546,794,323,2,2,2,2,2,1733,1733,2,2,1730,2,1733,1733,2,2,1733,551,551,551,551,1733,2,2,1730,1730,1730,2,551,59,1733,2,2,2,2,2,2306,2306,2306,2306,1733,1733,1733,2,2,1733,1733,1733,1733,551,551,551,551,551,551,551,1733,1733,2,1733,1733,1733,1733,1733,1733,1733,1733,1733,1733,1733,1733,1733,1733,1733,1733,1733,1733,1733,1733,1733,1733,1733,1733,1733,1733,1733,1733,2,1733,2306,2306,2306,1733,1733,2,2,1733,1733,1733,1733,1733,1733,1733,1733,1733,1733,1733,1733,1733,1733,1733,1733,1733,1733,1733,1733,1733,1733,1733,1733,1733,1733,1733,1733,2306,2306,1733,1733,1733,1733,1733,1733,1733,1733,1733,1733,1733,1733,1733,1733,1733,1733,1733,2,1733,1733,2306,1733,1733,1733,1733,2,1733,1733,1733,1733,1733,1733,2,2,1733,1733,1733,2,1733,2,1733,2,2,1733,1733,1733,1733,1733,1733,2,2,2,2,2,1733,1733,1733,1733,2,2,2,2,1733,1733,2,2,2,1733,1733,1733,1733,1733,1733,2,2,1733,1733,1733,1733,1733,1733,1733,1733,1733,1733,1733,1733,1733,1733,1733,1733,1733,2,1733,1733,1733,1733,1733,2306,1733,1733,1733,1733,1733,1733,1733,1733,1733,1733,1733,1733,1733,1733,1733,1733,2306,1733},
+ {1766,1558,1901,1393,987,1859,815,1165,50,2065,88,88,1453,1453,2,2,2,995,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1992,1992,161,1778,1813,1813,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1615,1267,1242,1494,399,663,68,1209,1573,528,640,1200,248,640,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1051,2,2,2,2,2,2,2,2,2,2,2,2,2,1051,1051,1051,1051,1051,1051,2,2,2,2,2,1051,1051,1051,1051,1051,1051,1051,1051,1051,178,178,1051,1051,1051,2,2,178,178,178,178,178,178,178,1051,1051,1051,1092,1051,1092,1092,1051,1051,1051,1051,178,178,1051,1051,1051,1051,1051,1051,178,178,1051,178,1051,1051,1051,1051,1051,1051,178,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,178,1051,1051,1051,2,1051,1051,1051,1051,1051,1051,178,178,1051,1051,178,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,178,178,178,1092,178,178,178,178,178,178,1051,178,1051,1051,1051,1051,1051,178,178,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,1051,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178},
+ {1678,592,1351,509,312,721,163,1597,1262,199,2643,1330,1661,992,2,2,719,2,2,2,2,2,2,2,2,2,2,2,2,2,1704,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,758,1704,1704,1704,2,2,2,2,2,758,758,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2207,970,838,2043,1016,561,267,329,584,608,679,303,832,1613,959,959,959,1409,1409,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,959,959,2,959,959,2,959,959,959,959,959,959,959,959,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,959,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,832,2,2,2,2,959,2,959,959,2,959,959,2,959,959,2,2,2,2,2,2,2,2,2,2,832,832,2,1409,2,2,832,832,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2217,352,447,914,1200,561,614,1616,509,2292,1114,1114,1229,52,1053,1053,1053,2,2,2,2,2,2,2,2,2,2,2,2,2,795,795,795,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2313,595,1593,1951,133,282,372,2396,1117,226,2104,267,374,267,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,951,2,2,2,2,2,2,2,1216,2,2,2,2,2,2,2,2,2,2,2,2,2,2,951,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2167,747,211,681,989,503,1630,477,436,2085,419,290,419,1674,837,837,1674,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,415,415,2,2,2,415,415,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,415,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,16,2357,2,2,2,16,16,467,1294,1294,1294,890,890,32,32,2529,2529,2,2,2,2,2,2,2,2,2,2,2,2,2,415,415,2,2,2,2,2,2,2,2,2,415,415,2,415,2,2,2,2,2,2,2,2,2,360,2,2,2,2,415,415,360,415,415,415,415,415,415,415,415,415,2,360,2,360,360,360,360,360,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,415,2,2,2},
+ {1771,1441,594,613,1667,2388,961,1355,545,876,2175,2404,887,887,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,810,2,2,2,2,2,2,810,2,2,810,810,810,2,810,2,2,2,2,2,2,2,2,2,2,810,2,2,2,2,2,2,2,810,810,810,810,2,2,2,810,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,810,810},
+ {2312,1231,1604,997,652,1096,1070,320,481,662,911,1610,342,2527,606,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,728,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,675,675,675,675,675,675,675,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2245,1541,1828,783,615,428,1282,1892,848,1219,2465,314,314,314,2,2,2,2,2,2,2,2,2,2,2,2,1323,2,2,2,2,1323,2,2,1323,1323,2,2,1323,2,2,1323,2,2,2,1323,2,2,2,2,2,1323,1323,1323,2,2,1323,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1323,2,2,2,2,2,2,1323,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1323,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1323,2,2,1323,1323,1323,1323,1323,1323,332,332,332,2,2,2,2,2,332,2,2,2,2,2,2,2,2,2,2,2,2,1323,2,2,2,2,2,2,2,2,2,1323,1323,1323,1323,1616,2,2,2,1616,1616,1616,2},
+ {2354,1550,2394,1868,1418,2506,300,426,726,207,729,120,2152,951,235,927,927,1643,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1643,1643,1643,1643,1643,1643,1643,1643,1643,1643,927,1643,2,1643,1643,1643,1643,1643,1643,2,2,2,1643,1643,1643,1643,1643,1643,927,927,927,1643,1643,927,927,927,2,927,927,927,2,2,927,927,927,927,2,2,2,927,927,927,927,2,2,2,2,2,2,2,2,2,2,2,2,2,2,927,927,927,927,927,2,927,927,927,927,927,927,927,2,927,927,927,927,927,927,927,927,2,1643,927,2,2,2,927,927,927,927,927,927,927,927,927,927,927,2,1643,927,927,927,927,927,927,1643,927,927,927,927,927,927,927,927,927,927,927,927,927,927,927,927,927,927,927,927,1643,1643,1643,1643,1643,1643,927,927,1643,1643,1643,927,927,1643,1643,927,1643,1643,1643,1643,927,927,927,927,927,927,927,1643,1643,1643,1643,1643,1643,1643,927,927,927,1643,1643,1643,1643,1643,1643,1643,1643,1643,1643,1643,1643,1643,1643,1643,1643,1643,1643,1643,1643,1643,1643,1643,1643,927,927,927,927,927,927,927,927,927,927,927,153,153,1342,1342,1342,1342,1342,927,1342,1342,927,927,927,927},
+ {2518,712,215,1937,1636,1101,340,2518,1093,2399,209,1986,1411,860,860,416,2,2,2,2,2,2,2,2,1693,2,2,1693,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1693,2,2,2,2,2,2,2,2,2,2,644,1693,644,2,2,1693,1693,1693,1693,1693,1693,1693,2,2,2249,1693,1693,2,1693,1693,1693,1693,1693,1693,1693,2,1693,1693,2,2,1693,1693,1693,1693,1693,1693,1693,1693,1693,1693,1693,1693,1693,1693,1693,1693,1693,1693,1693,2,2,1693,1693,1693,1693,2,1693,2,2,2,2,2,2,2,479,479,2,2,2,1693,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1374,2,2,2,2,479,479,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1374,1374,1374,1374,1374,644,1374,1374,479,479,479,479,1374,2,479,479,479,479,1693,1693,1693,1374,1374,1374,479,479,479,479,479,479,1374,1374,1374,1374,1374,479,2,479,479,479,479,479,479,479,479,1374,1374,1374,1374,1374,1693,1693,1693,1693,1693,1693,1693,2,2,2,644,644,644,2,644,644,2,2,2,644,644,2249},
+ {2522,1030,324,1264,628,1339,480,234,2351,1085,1979,2333,1339,1356,1356,2286,2,2,2,2,2,2,2,2,2,2,2,2,2530,2,2,2,2,2,2,2,2,2,2,2530,2530,2,2,2,1981,1981,1981,1981,1981,1981,1981,1981,1981,2,2,2530,2,2,2,2,2,2,183,2,2,2,2,2,2,2,2,2,1981,1981,1981,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1981,1981,1981,1981,1180,2,183,2,2,2,2,2,2,2,183,2,1981,1981,1981,2,183,183,183,183,2,2,1981,2,1981,183,183,1981,1981,1981,1981,1981,1981,1981,1981,1981,183,2,2,2,2,1981,1981,1981,1981,1981,1981,1981,1981,2530,1981,1981,2,1981,183,183,2,183,183,2,2,2,183,1981,1981,183,2,2,2,1981,1981,1981,1981,1981,1981,1981,1981,1981,1981,1981,183,1981,1981,1981,1981,183,183,2530,2530,1981,1981,1981,1981,2530,2530,2530,1981,1981,1981,1981,1981,1981,2530,2530,183,1981,1981,1981,1981,183,183,183,183,183,183,183,1981,1981,1981,1981,1981,1981,1981,183,1981},
+ {2518,750,591,854,454,1416,842,547,106,2496,786,878,2237,1024,1024,1024,2,2,2,2,2,2,1896,2,2,2,2,2,2,2,2,2,2,1896,1896,1896,2,2,2,2,2,2488,2488,2488,2,2,2,2,2,2,2,2,2,2,2,463,463,463,2,2,2,2,2,2,2,2,2,1345,1345,1345,2,2,2,2,2,1345,1345,463,1345,463,463,2,2,1345,1345,1345,1345,1345,1345,2,1345,1345,2,1345,1345,2,1345,2488,2488,2,2,1345,1345,1345,1345,2,2,2,2,2,2,2,2,2,2,1345,1345,1345,2,1345,1345,1345,1345,2,1345,1345,1345,1345,1345,1345,2,2,1345,1345,1345,1345,1345,1345,2,2,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,2,1345,2,1345,1345,2,2,2,2,2,2,2,2,2,2,2,1345,1345,2,2,2,2,2,2,2,2,1345,1345,1345,1345,463,2,1345,1345,1345,1345,1345,1345,463,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,2,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,2488,2488,2488,2488,2488,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,92,92,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345},
+ {2519,1136,612,209,994,1179,1060,2621,130,485,661,1444,2122,124,258,1114,2,2,806,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,945,945,945,945,945,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1122,1122,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2524,1894,253,2072,1242,355,888,1362,28,480,452,1216,595,545,354,1145,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,354,354,2,2,2,2,2,2,2,2,354,354,354,354,354,354,354,2,354,354,387,354,354,229,2,229,2,2,2,354,354,387,387,354,354,354,354,354,2,354,229,354,354,354,354,354,2,2,2,387,387,387,387,354,354,354,354,354,354,354,354,354,229,229,229,229,229,354,2,229,229,229,354,354,229,354,354,354,354,354,354,354,354,387,387,229,229,387,387,354,354,229,229,229,354,354,354,354,229,229,229,354,354,354,229,229,354,229,229,229,229,229,229,229,229,229,229,229,229,229,229,229,2,2,2,2,2,2,2,2,2,2,2,229,354,354,354,354,354,354,354,2,2,2,229,229,229,2,2,229,354,354,2,2,2,2,2,2,229,229,229,229,229,229,229,229,229,229,229,229,2,229,229,229,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2583,1475,879,503,672,392,470,1416,657,899,468,169,962,1263,1029,1029,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1077,1077,1077,1077,1077,1077,2,2,2,2,2,2,2,207,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,207,207,207,207,207,207,207,207,207,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,207,207,207,207,2,2,2,2,2,2,2,2,2,207,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,207,207,207,207,207,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,273,2,2,2,2,2,2,2,2,2,2,207,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1244,1244,207,207,207,207,207,207,207,2,2,2,2,2,2,2,2,2,2,2,273,2,2,2,2,2,2,1077,1077,1077,1077},
+ {2569,1356,1053,410,437,58,1508,831,2272,383,1725,615,1191,1191,1191,2493,186,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,669,2,2,2,669,388,2,2,2552,2552,2552,669,669,669,669,2,2,2,669,669,669,2552,2,2,2,2,2,2552,669,669,669,669,669,669,669,2,2,2,2552,2552,2552,2,2,2,2,2,669,2,2,2,2,2,669,669,2,2,2,2,2,2,2,2,2,2,2552,2552,2552,2552,2552,2552,388,388,388,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,388,388,388,2552,2552,522,522,2552,2,2,2,2,388,388,388,388,388,388,388,388,388,388,2,669,2,669,669,2,2,2,2,2,2,2,669,669,669,669,669,669,2,669,669,669,669,669,669,669,669,669,669,669,669,669,669,669,669,669,669,669,669,669,669,669,669,669,669,669,669,2552,2552,2552,2552,2552,2552,2552,2552,2552,669,669,669,669,669,669,669,669,669,669,669,669,669,669,669,669,669,669,669,669,669,669,669,669,669,669,669,669,669,669,669,669,669,669,669,669,669},
+ {2368,2136,1457,268,2326,1306,1258,2108,345,1837,1066,2186,2186,650,222,2,2,432,2,2,686,2,686,2,2,1405,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,686,686,2,2,2,2,2,2,2,2,2,2,2,1405,1405,2,2,2,2,2,2,2,2,2,2,916,916,916,916,916,2,916,916,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,916,916,2,916,686,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,916,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2207,345,989,421,826,682,1888,476,144,912,654,1959,547,4,477,2,2,4,4,954,4,1099,4,1322,1099,1322,1322,1322,1322,1099,1322,1322,1322,1322,1322,1322,1322,1322,1322,1322,1322,1322,1322,1322,1322,1322,1322,1322,1322,1322,1322,1322,1322,1322,1322,2,1099,2,1099,1099,1099,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1099,1099,1099,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1099,1099,1099,1099,1099,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2386,1106,709,251,784,929,1551,2481,304,2148,1546,955,2453,866,866,2,2,2264,2264,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1314,1314,1314,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2317,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,549,2,2,2,2,2,2,2,2,2,2,2,2,2,549,2,2,2,2,2,2,2,2,2,2,2,1314,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1314,2,1314,1314,2,2,1314,1314,2,549,549,549,2,2,2,2,549},
+ {2228,1163,1995,649,1000,680,325,1591,774,767,711,711,1418,524,711,401,976,2,2,2,2,2005,2005,2,2,2,2,2,2,1390,1390,2,2,1390,2,1390,1390,2,1390,2,2,2,2,2,2,2,2,418,418,1390,1390,1390,1390,1390,1390,1390,1390,1390,1390,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,418,1390,1390,1390,1390,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1390,1390,1390,2,2,2,1390,1390,1390,2,1390,1390,2,2,1390,1390,1390,1390,1390,1390,2,2,1390,1390,1390,2,1390,1390,2,1390,2,2,1390,2,2,2,1390,1390,2,2,1390,2,418,418,1390,1390,2,2,1390,1390,1390,2,1390,1390,1390,1390,2,2,2,1390,2,2,2,2,1390,2,2,2,2,1390,1390,1390,1390,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2362,1706,564,1088,1296,1267,70,1015,496,1298,758,154,240,240,154,154,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2079,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1715,2260,357,557,783,1195,2288,1997,1120,144,247,175,1277,203,203,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2385,2385,2,2385,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2385,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,641,641,641,641,641,641,2385,2385,2385,2,2385,2385,2385,2385,2385,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,274,274,2,2,274,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,274,274,274,274,274,274,274,274,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2385,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2290,2505,677,843,527,593,1401,2106,2481,1151,741,741,1557,1872,72,267,2,1344,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,267,2,2,2,267,2,2,267,267,267,2,267,2,2,2,267,267,267,2,2,2,2,267,267,2,267,267,267,267,267,267,2,267,267,2,267,267,2,2,267,267,2,267,267,2,2,2,267,267,267,267,2,2,2,267,2,2,2,2,267,2,2,2,2,2,2,2,2,2,2,2,2,267,2,2,2,2,2,2,2,2,2,2,2,2,267,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,267,2,2,267,267,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,267,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2271,2140,373,403,2489,1262,1166,1867,834,126,1837,1462,1837,1124,1665,1147,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,910,910,910,910,2,2,910,910,910,2,2,2,910,2,1708,1708,2,2,910,910,910,2,2,2,910,910,2,910,910,910,910,910,2,910,910,910,910,1708,910,2,910,910,2,2,2,2,2,910,910,910,910,910,910,910,910,910,910,910,910,910,910,910,910,910,910,910,2,2,910,910,910,910,910,910,2,910,910,2,910,2,2,2,910,910,910,2,910,910,910,2,2,2,2,2,2,910,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,910,910,910,910,910,910,910,910,910,1708,1708,2,910,1708,1708,1708,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1708,1708,1708,910,910,1708,2,2,2,2,1708,1708,1708,1708,1708,1708,1708,2,1708,2,2,1708,1708,2,2,2,2,2,1708,1708,2,1708,1708,1708,1708,1708,1708,1708,2,1708,1708,1708,1708,1708,1708,1708,796,796,796,1708,796},
+ {2300,587,404,483,351,58,197,231,2093,1197,567,1197,2169,1197,1197,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1292,2,2,2,2,1292,1292,2,1292,1292,1292,357,357,357,2,357,357,357,357,2,2,2,2,357,2,2,2,2,2,2,2,2,2,2,2,357,357,357,357,357,2,2,2,2,2,1062,1062,1062,1062,1062,318,2,2,2,2,318,318,318,318,2,2,357,357,357,357,357,357,357,2,1292,1292,1062,2,1062,206,206,206,206,206,1292,206,2,357,357,357,357,2,2,1292,1292,2,2,2,2,1292,357,357,357,357,357,1292,1292,1292,1292,318,318,318,318,318,318,318,318,318,318,318,318,1062,1062,1062,318,318,318,318,1292,1292,318,318,2,1380,1380,1380,1292,2,1292,318,318,1292,1292,318,318,318,318,318,1292,1292,2,2,1292,1292,1292,318,318,357,71,318,1292,318,2,318,318,318,318,318,318,318,318,2,318,318,318,2,318,318,318,318,318,318,318,318,318,318,318,2,318,318,318,318,318,318,318,318,318,318,318,318,318,318,318,2,2,2,2,2,2,2,2,318,2,2,318,2,2,318,318,318,318,318,318,318,2,318,318,2,2,2},
+ {2303,1018,316,280,1616,909,97,1126,1295,736,216,54,2045,726,1673,2,2,2,2,2,779,779,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2390,491,1217,1148,2314,2250,2180,308,613,662,1346,1346,1346,1280,778,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1227,1227,2,2,2,2,2,2,2,2,2,1227,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1227,2,2,2,2,2,1227,1227,1227,2,2,2,2,2,2,2,2,2,2,2,2,2,430,430,1227,2,1227,1227,430,430,2,1227,1227,430,1227,1227,2,2,2,1227,1227,1227,1227,1227,2,1227,1227,2,2,2,2,2,2,2,2,2,1227,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1227,2,2,2,2,2,2,2,2,430,430,2,2,2,2,430,2,430,430,430,430,2,430,430,430,430,430,430,430,430,430,430,2,2,430,2,2,2,2,430,430,430,430,2,2,2,2,1227,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1732,527,1303,664,71,294,404,917,1074,180,2618,2412,441,1987,1750,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1987,2,2,1987,2,2,1987,2,2,2,2,2,2,2,2,2,2,2,2,137,137,137,137,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,137,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,137,2,2,2,2,2,2,2,2,2,2,2,2,137,137,2,2,2,2,2,2,2,2,2,2,2,2,2,2,137,2,2,2,2,2,2,2,2,2,2,2,1987,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,137,137,137,137,2,2,2,2,2,2,2,1987,137,2,1987,1987,1987,1987,1987,2,2,1987,1987,137,1987,137,137,137,137,137,137,1987,1987,1987,1987,1987,1987,1987,2,137,137,2,137,137,137,137,2,2,2,2,2,2,137,137,2,2,137,137,137,137,137,137},
+ {1429,534,1192,299,329,1918,2193,637,1013,123,1196,132,554,1471,767,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1302,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2069,2069,2,2,2,2,2069,2,2,2,2069,2069,2069,2069,2069,2069,2069,2069,2069,2069,2,2,2069,2069,2,2069,2069,2,2069,2069,2,2069,2069,2069,1302,1302,1302,1302,2,1302,2,2069,2069,2069,2069,160,2069,2,2,2,2,2,2,2,2069,2069,2069,2069,547,160,547,2,2069,2069,1302,2069,1302,2,1302,2069,2069,2069,2069,2069,2069,547,2,2,2,2,2069,2069,2069,2069,2069,2069,2069,2069,2,2,160,160,1302,2,2,1302,1302,2069,2069,1302,2,2,2069,2069,1302,1302,1302,1302,1302,2069,2069,2069,547,547,1302,1302,1302,1302,1302,2069,2069,1302,2,1302,160,160,1302,1302,1302,160,1302,1302,1302,1302,2,2,2,547,160,547,1302,1302,160,160,2,1302,1302,1302,1302,1302,1302,2,1302},
+ {2302,1308,843,1865,922,1354,1609,744,880,1994,1556,1789,2769,762,762,2,2,2,2,2,2204,2204,2204,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2204,2204,2204,2204,2204,2204,2,2204,2204,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1695,1287,1346,1181,1412,1653,830,2025,957,1720,1614,887,964,964,964,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,440,440,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1756,2308,1986,101,957,633,1940,1002,390,1237,95,1441,95,95,705,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,596,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,596,2,2,2,2,2,2,596,596,596,596,2,2,2,596,596,596,2,596,596,2,2,596,596,2,2,2,2,2,2,2,2,2,2,2,2,2,2,234,596,596,596,596,596,596,596,596,596,596,596,596,596,596,596,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,596,2,2,2,2,2,2,2883,2,2,596,1150,234,596,596,596,596,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,596,2,2,2,2,2,2,2,2,2,2,2,2,2,2,596,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2327,1317,671,1992,261,1580,1903,72,778,1032,1812,1784,2319,2059,2319,2,1523,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,612,612,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,612,612,612,612,612,2,612,612,612,612,612,612,612,612,612,612,935,612,2,2,612,612,2,612,612,2,935,935,612,2,612},
+ {2461,1412,540,1183,229,300,47,585,518,402,1863,1863,560,1326,1326,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,627,627,627,627,627,627,627,627,2,2,2,2,2,2,2,2,1673,2,1673,2,2,2,2,2,2,2,2,2,1673,2,2,1673,1673,2,2,2,1673,1673,1673,1673,1673,1673,1673,1673,1673,1673,1673,1673,1673,2,1673,1673,1673,1673,1673,1673,1673,1673,2,1673,1673,1673,2,2,2,1673,1673,1673,1673,1673,1673,1673,1673,2,2,2,2,1673,1673,2,2,2,2,2,2,1673,1673,2,2,1673,1673,2,2,2,2,2,1673,1673,1673,1673,1673,1673,1673,1673,1673,1673,1673,1673,2,1673,1673,1673,2,2,2,2,2,1673,2,2,1673,2,2,1673,1673,1673,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1673,2,2,1673,1673,2,1673,2,2,2,1673,1673,2,1673,1673,1673,1673,1673,1673,1673,1673,2,2,1673,1673,1673,1673,1673,1673,1673,1673,1673,1673,1673,1673,1673,1673,1673,1673,1673,1673,1673,1673,1673,1673,1673,1673,1673,1673,1673,1673,1673,1673,1673,1673,1673,1673,1673,1673,1673,1673,1673,1673,1673,1673,1673,1673,2,2,1673,1673,1673,1673,1673,1673,1673,1673},
+ {1707,717,366,287,1883,50,599,1371,474,1551,947,2142,1885,947,2008,1004,1004,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,323,323,323,323,2,323,1173,2,2,1173,1173,2,2,323,2,2,323,323,323,2,2,2,2,2,2,323,323,323,323,323,323,323,323,2,2,2,1173,1173,1173,1173,2,2,1173,323,323,2,1173,323,323,1173,1173,1173,323,323,323,1173,1173,1173,1173,1173,1173,1173,1173,1173,1173,2,245,245,245,245,323,323,323,323,323,323,323,323,323,2,2,323,323,323,323,323,323,2,2,2,1316,1316,323,2,2,2,2,2,2,2,2,2,2,2,323,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,323,323,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,323,2,2,2},
+ {2623,1543,652,1824,634,367,43,1229,233,963,1408,2367,2367,1109,1109,56,1468,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1943,1943,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1943,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1943,2,2,1747,1747,1747,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1747,1747,2,2,1468,1468,1468,2,2,2,1468,176,1468,2,1468,1468,1468,1468,1468,1468,1468,1468,1468,1468,2,1468,1468,1468,1468,1468,2,2,2,1468,2,2,1468,1943,2,2,2,1468,1468,2,2,2,2,2,520,520,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1943,2,2,2,2,2,2,2,2},
+ {2632,567,1149,1227,1156,2052,643,1585,1197,581,63,718,699,149,149,1940,2,2,2,2,2,2,2,2,2,2,2,2146,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,149,149,149,149,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,149,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2146,2146,2146,2146,2146,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2146,2146,2,2},
+ {1774,716,469,1436,190,728,1795,225,685,1187,2691,119,650,1130,1130,1130,1927,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1927,1927,1927,1927,2,2,1927,1927,2,1927,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1927,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1418,2,2,2,2,1418,1418,1418,2,2,2,2,2,2,2,2,2,2,2,1418,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1927,2,2,2,2,1927,2,2,1927,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1462,2,2,2,2,2,2,1927,2,2,2,2,2,2,2,2,1420,1927,1927,2,1420,1420,1418,1418,1418,2,1420,1420,1420,1927,1927,1927,1927,1927,1927,1927,1927,2,1418,1418,1927,1927,1927,1927,1420,1420,1420,1420,2,1927,2,2,2,2,2,2,2,1927,2,1927,2,1927,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2428,1343,459,220,1569,323,2615,1662,116,360,608,405,23,1836,875,2,2,2,2,2,2,2,2,2,2,2,2,825,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,128,512,512,512,2405,2405,611,611,825,825,825,825,825,825,825,825,825,825,825,825,825,825,825,825,825,825,825,825,825,825,825,825,825,825,825,825,825,825,825,825,825,825,825,825,825,825,825,825,825,650,137,137,137,548,137,137,956,956,956,956,956,137,956,956,1782,1782,1782,1782,745,1782,1782,1782,1782,1968,1782,1782,1782,1782,745,745,745,745,935,745,745,935,935,745,935,1782,1782,1782,1782,1782,1782,745,1782,1782,1968,745,745,1486,1490,55,55,55,880,880,880,220,880,880,880,880,263,880,263,880,935,935,935,1656,1968,1968,1968,1968,1968,1968,1968,1968,935,935,935,935,935,935,935,935,935,935,935,935,935,935,935,935,935,935,301,301,1453,847,847,602,1645,1645,57,57,57,1448,1448,1448,1576,1448,847,1885,1885,1885,1885,1116,1116,1116,1116,1116,1116,1116,1116,1116,1116,935,935,935,935,745,960,745,745,2003,2003,1782,935,1782,935,935,2003,2003,2003,2003,2003,935,935,935,1782},
+ {2435,1920,394,1482,266,1637,911,1697,1689,1249,1085,1085,397,2292,1355,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2345,662,270,324,1061,1080,1952,593,1480,2111,2667,2093,2059,2120,955,1447,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,904,904,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1772,879,590,1348,820,891,1533,624,622,345,1054,105,55,55,55,347,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1777,455,1487,1190,455,1542,977,2308,437,1129,410,856,1420,412,412,766,2,2034,2034,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,811,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,811,2,2,2,2,2,2,2,2,2,2,2,312,2,2,2,2,1123,1123,1123,1123,1123,2,811,2,2,2,2,312,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,312,312,312,312,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1123,1123,2,2,1123,1123,1123,1123,1123,2,811,811,2,2},
+ {2662,2224,1142,656,59,598,730,458,226,1151,741,1286,1015,2,688,2017,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2017,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2017,2017,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2017,2017,2017,2,1068,1068,1068,1068,1068,1068,1068,1068,1068,1068,1068,1068,1068,2,2,2,2,2,2,2,2,2,2,2,852,2,2,2,2,2,2,2,2,2,2,2,2,2,2,852,852,852,2,2,2,2,2,1349,2,2,2},
+ {2666,768,529,990,2329,130,1678,2466,318,1083,387,1524,511,2,731,731,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,565,740,740,740,740,565,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,905,2,2,2,2,2,2,2,2,2,2,2,2,2,905,2,905,905,905,2,2,2,2,2,2,2,2,2,905,905,905,905,2,828,828,905,565,565,905,2,2,2,2,2,2,905,905,2,2,2,2,2,2,905,905,2,2,905,905,905,905,2,2,2,2,905,2,2,2,565,565,565,905,565,2,2,2,2,2,565,565,2,2,2,2,565,565,565,2,2,2,2,565,565,565,2,2,2,2,565,2,2,2,2,2,2,2,2,2,2,905,905,2,2,2,2,905,905,565,565,565,565,565,565,565,2,565,565,565,565,565,937,937,565,565,565,565,565,565,565,565,565,937,2,565},
+ {2673,772,867,209,1487,657,1508,1333,1307,242,1588,1672,1329,1672,1672,1998,1672,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,789,2,2,2,2,789,789,2,2,2,789,789,859,859,859,2,2,859,2,859,2,2,2,859,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,859,2,2,2},
+ {2501,1216,246,1278,718,704,2019,88,273,1203,67,1488,1828,2,2,1489,1489,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1808,667,1162,225,597,1410,1390,390,2207,968,1136,26,533,2,1807,1807,1397,1397,1397,1397,1397,1397,1397,1397,1397,2,2,2,2,1397,1306,1397,1306,2,2,1306,1306,1306,1306,1306,1306,2,2,2,2,1306,2,2,1306,2,2,2,1397,1306,53,1535,1535,53,2,2,2,2,2,2,2,2,2,2,2,2,1306,1306,2,2,2,1306,1306,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1306,1306,2,2,2,2,2,2,2,2,1306,2,2,2,2,2,2,2,2,2,2,2,1306,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1306,1306,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1306,2,2,2,2,2,2,2,2,2},
+ {2474,2292,1818,2061,2833,751,2172,1708,1210,1675,370,131,163,2,2,163,163,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,267,2,213,2,213,213,267,2,2,2,2,2,2,2,267,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,213,213,2,267,267,2,2,2,213,267,267,267,213,213,2,2,2,2,2,2,2,2,2,2,2,2,2,267,2,2,2,267,267,2,213,213,213,213,213,213,213,213,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,213,213,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,267,2,2,2},
+ {1751,1575,889,828,82,1956,712,499,1420,1686,339,2326,2035,2,2,558,558,2,1234,2,2,2,2,2,2,2,2,2,2,2,1239,1239,1239,2,2,2,431,1239,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1239,1239,2,2,1239,1239,1239,1239,1239,1239,1239,2,2,1239,1239,1239,1239,1239,1239,1239,1239,1239,1239,1239,1239,1239,1239,1239,1239,1239,1239,1239,1239,1239,1239,1239,1239,1239,1239,1239,1239,1239,1239,1239,1239,1239,1239,1239,1239,1055,1055,1055,1239,1239,1239,1055,1239,2,1055,1239,1239,1239,1239,1239,1239,1239,1055,2,2,2,2,2,2,2,2,1055,1055,1239,2,2,2,2,2,2,2,2,2,2,2,2,2,1055,1055,1055,1055,2,2,2,2,1055,1055,2,2,1055,2,2,2,2,2,2,2,2,2,2,1055,1055,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1239,1239,1239,1239,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1239,1239,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2522,1148,1943,168,218,252,543,1535,2004,130,353,353,42,2,2,2,1173,1173,2,1547,2,2,2,2,2,2,2,1547,1173,1547,1547,2,2,2,2,2,2,1173,2,2,2,1547,1173,2,1547,1547,1547,2,1547,1547,1547,1547,1547,1547,2,1547,2,2,2,2,2,2,2,2,1547,2,1547,2,1547,1547,2,2,2,2,2,2,2,2,1547,2,2,2,2,2,2,2,1547,1547,2,2,1547,1547,1547,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1547,2,2,2,1547,1547,1547,1547,2,1547},
+ {2695,432,1213,579,865,1637,1857,84,447,155,2492,347,1980,2,2,2,1155,1155,1155,2,1933,1933,1933,2,2,2,2,2,2,2,1901,1901,2,2,2,2,2,2,2,2,2,2,2,2,4,4,16,32,2,2,2,2387,1024,1024,2387,2387,2387,51,51,51,51,806,806,51,2,806,806,806,806,806,806,806,806,806,806,806,806,806,806,806,806,806,806,806,806,806,806,806,806,806,806,1907,1907,2,1907,1907,1907,1907,1907,81,81,81,2406,483,648,648,648,606,606,606,606,606,606,606,606,606,606,606,606,606,606,806,2523,2523,2523,2523,806,606,606,806,806,806,806,806,606,606,606,606,806,806,806,806,606,606,606,606,606,806,806,606,606,2,2,606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,806,806,806,1156,1156,806,806,1055,1055,1055,1055,806,806,806,1055,1055,606,1907,36,36,36,36,36,36,9,9,9,918,36,2902,36,36,36,36,289,2947,2947,2947,289,289,289,289,289,289,289,36,36,1001,289,289,289,289,289,1001,606,606,289,2947,2947,2947,2947,2947,2947,606,606,606,606,606,606,606,606,606,1156,606,606,606,606,606,606},
+ {1808,1683,474,1761,106,602,1416,217,1351,1602,366,393,1966,2,2,2,2,2,378,378,606,606,606,2,2,2,2,2,919,919,919,919,2,2,2,2,2,919,2,2,2,2,919,919,2,2,2,919,2,2,2,919,2,1963,919,919,919,919,919,919,919,919,2,2,2,919,2,2,2,2,919,2,2,2,919,919,919,2,919,919,2,2,919,919,919,919,919,2,2,2,919,919,919,2,2,919,919,919,919,919,2,919,919,2,2,919,919,919,919,919,2,2,2,2,2,919,919,919,2,919,2,919,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,919,2,2,919,2,2,2,919,919,2,2,2,2,2,919,919,919,919,2,2,919,919,919,919,919,919,919,919,919,919,919,919,919,919,919,919,919,919,919,919,919,919,919,919,919,919,919,919,919,919,919,2,919,919,919,919,919,2,919,919,2,919,919,919,919,919,919,2,2,919,919,919,919,2,919,919,919,919,919,919,919,919,919,919,919,919,919,919,919,919,919,919,919,919,919,919,919,919,919,919,919,919,919,919,919,919,919,919,919,919,919,919,919,919,919,919,919},
+ {2502,1713,1050,1694,1876,459,2000,674,2097,1461,2408,945,977,2,2,2,2,2,1263,1263,1263,1263,2,2,2,1263,1263,1263,1263,1263,1263,1263,1263,1263,1263,1263,609,1263,1263,1126,1126,1126,1126,1126,1126,1126,1263,1263,1263,1263,1263,1263,2,2,2,2,2,2,609,609,609,609,609,609,2,609,609,609,609,2,2,2,2,2,2,2,609,609,2,2,2,609,609,1263,1263,1263,1263,1263,1263,2,1263,1263,1263,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1263,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1263,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1827,651,1490,2046,484,1508,284,1993,2003,2072,2746,556,616,2,2,2,2,2,4,4,4,4,2027,2027,2027,2027,2027,2027,1618,1618,2027,2027,2027,2027,2027,2027,2027,108,108,2027,2027,2027,374,2,2,1082,36,36,374,374,374,36,708,2027,2027,2027,1082,374,708,708,708,708,708,708,708,708,708,708,708,708,708,4,148,108,108,108,108,108,108,108,4,4,108,4,2635,708,2635,96,2027,2027,2027,2027,2027,2027,768,4,4,2635,2635,2635,2127,688,339,232,232,232,232,232,232,232,232,232,232,232,232,2,2,96,1504,324,1504,1504,1504,232,236,236,236,232,232,236,2,2,2304,236,1504,2304,324,324,232,232,232,232,232,232,2127,1618,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,688,688,2027,2027,2027,2027,509,509,509,1082,1082,232,232,232,232,232,232,2027,2027,2027,2027,2635,2635,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,509,519,2178,2178,2178,1573,2127,2127,2127,339,339,339,339,339,339,339,339,339,339,472,472,310,310,472,472,472,872,59,59,1118,1118,559,559,559,1888,559,559,872,592,872,872,872,872,232,1082,1082,1082,1082,1145,1145,1145},
+ {2428,1576,1692,449,2012,240,1167,418,272,1557,2197,645,645,2,2,2,2,2,2150,2150,2,2,562,715,2,2,2,81,81,2,2,2,2,2,2,2,2,2,2,2,2,2,349,349,349,349,349,846,846,846,846,846,846,846,349,349,846,846,349,2,2,2,2,2,2,2,2,2,2,1845,1845,1845,1845,1845,1845,1845,1845,2,2,2,2,2,1845,2,2,2,2,2,2,2,2,349,2,846,846,9,81,81,81,846,846,846,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,349,349,349,349,349,349,349,349,349,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,81,2,81,2,81,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2756,2,4,4,4,2,4,4,4,128,64,128,192,2,2,2,576,576,96,96,96,96,96,96,96,96,4,4,4,4,820,144,144,144,820,820,24,24,273,562,18,562,562,562,188,188,188,273,273,1431,1431,1431,135,135,135,135,135,135,135,349,349,349,349,846,846,846,846,846,846,846,2102,846,846,321,1100,321,321,1466,1466},
+ {2721,1522,260,2512,2426,377,1659,704,323,1473,2020,395,306,2,2,2,2,886,886,2,805,2,2,2,2,2,2,1622,886,886,886,886,886,886,886,886,886,886,886,886,886,886,886,886,886,886,886,886,886,886,1852,1852,886,886,1852,1852,1852,1852,1852,1852,1852,1852,1852,1852,274,886,886,274,274,274,274,886,886,886,886,886,886,886,2,886,886,886,886,886,886,886,1852,2747,2747,1852,1852,2747,2747,2747,1852,2747,1852,1852,1852,1852,1852,578,2747,578,578,945,886,1852,1852,1852,1852,1852,945,945,945,945,945,945,945,945,945,945,945,1852,1852,1852,1852,1852,945,945,945,2,2,1852,1852,1852,886,869,869,2,869,869,886,886,2747,2747,2747,2747,2747,886,2747,2747,2747,886,886,1852,869,1852,886,886,886,2161,2161,2161,1852,2,1852,1852,2,1852,2,2,2,2,2,2,2,2,2,2,945,1852,1852,2,2,2,2,1852,1852,1852,2,2,2,1852,1852,1852,2,2,1852,2,1852,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1852,1852,1852,1852,1852,2,2,2,2,886,886,1852,1852,945,886,886,2,2,2,886,945,945,2,945,886,2,2,886,2,2,2,2,886,886,886,886,886,886,886,886,886},
+ {1922,2418,759,2174,1560,472,1834,1133,327,183,782,782,1783,2,2,2,2,709,291,709,709,709,709,709,2,2,2,2,2,2,709,709,709,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,709,2,2,2,2,709,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,709,709,709,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2414,720,1022,2176,52,1108,2098,476,114,87,585,169,1201,2,2,2,1292,1292,1292,2,2012,2012,2012,2012,2012,2,2,2,2,2,2012,2012,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2012,2012,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2727,781,1689,1709,997,2563,1032,468,44,992,1214,725,75,2,2,2,2,360,360,380,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1458,1458,2,2,2,2,1458,1458,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,360,360,360,360,360,360,360,1458,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3003,2,2,2,2,2,267,267,267,360,360,360,360,360,267,267,577,577,2,267,577,360,360,360,360},
+ {1948,1085,1344,2090,1435,2389,3193,1007,1003,244,667,1838,2062,2,2,2,1802,299,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,798,2,2,798,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,798,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,798,2,2,2,2,2,2,2,2,2,2,2,2,2,2,739,739,2,2,2,2,2,2,2,798,798,798,2,2,2,798,798,2,2,798,798,798,798,2,2,798,2,2,798,798,2,798,798,798,798,2,2,2,2,798,2,798,2,2,2,798,798,2,2,2,2,2,2,798,798,798,798,798,2,798,2,2,2,2,2,2,2,2,2,2,798,798,798,798,798,798,798,2,2,2,2,598,598,598,598,598,598},
+ {1820,1726,1335,1818,2058,1579,2212,288,761,253,572,572,1836,2,2,2,1836,1196,2,1196,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1196,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2433,932,689,818,2014,1498,749,1645,867,1627,47,1766,2193,2,2,2030,2030,2,430,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1800,1800,1800,1800,2,2,2,1800,2,2,2,1800,1800,2,2,2,1800,1800,1800,1800,1800,1800,1800,2,2,2,1800,1800,2,1800,1800,1800,1800,1800,2,1800,1800,2,2,2,1800,1800,2,2,1800,1800,1800,1800,1800,1800,1800,1800,1800,1800,2,1800,2,2,2,2,2,2,2,2,2,1800,2,2,2,2,1800,1800,2,2,2,2,2,2,2,2,2,2,2,2,1800,2,2,2,2,2,1800,1800,1800,1800,1800,1800,1800,1800,2,2,2,2,2,2,2,2,2,2,2,2,1800,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2463,712,1525,2092,2942,352,761,242,2178,2339,483,1905,1347,2,2,65,529,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,811,2,2,2,811,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,811,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2547,920,386,925,74,579,323,2319,520,2332,1535,751,1591,2,770,770,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1804,1804,1804,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1804,1804,1804,2,1804,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1804,2,2,2,1804,1804,1804,1804,1804,1804,1804,1804,1804,1804,2,2,2,2,2,1804,1804,1804,1804,1804,1804,1804,1804,1804,2,1804,1804,1804,1804,1804,1804,1804,1804,1804,1804,1804,1804,1804,1804,1804,1804,1804,1804,1804,1804,1804,1804,1804,1804,1804,1804,1804,1804,1804,1804,1804,1804,1804,1804,1804,1804,1804,1804,1804,1804,1804,1804,1804,1804,1804,1804,1804,1804,1804,1804,1804,1804,1804,2,1804,1804,2,1804,2341,2341,2341,1804,1804,1804,1804,1804,1804,1804,2341,2341,2341,2341,2,1804,1804,1804,1804,1804,1804,1804,1804},
+ {1947,718,981,2254,598,947,2091,1673,382,484,438,502,2169,2,766,766,766,2,2,2,2,2,2,2,2,2,2,2,2,1891,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1891,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1891,1891,2,1891,2,2,2,1891,1891,1891,2,2,1891,1891,1891,1891,1891,1891,1891,2,2,1891,1891,2,1891,2,1891,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1891,2,1891,1891,1891,1891,1891,2,2,2,2,2,2,2,2,2,2,2,1891,1891,1891,1891,1891,2,2,2,2,2,2,2,2,2,2,2,2,1891,2,2,1891,2,1891,1891,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1891,2,2,1891,1891,2,2,2,2,2,2,2,2,1891,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1891,1891},
+ {2596,897,695,155,863,1307,190,381,356,1003,2596,3024,460,2,611,611,611,611,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1276,1276,1276,1276,1276,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2452,2588,2055,665,818,2622,413,1260,965,211,989,1219,166,2,1251,1251,2,1256,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1607,1607,2,1607,1607,2,1607,1607,396,2,2,396,396,2,2,396,396,396,1607,2,2,1607,396,2,2,2,2,1607,2,2,1607,2,1607,1607,2,2,2,1607,1607,2,2,2,2,2,1607,1607,1607,1607,2,2,1607,1607,1607,1607,1607,1607,1607,1607,1607,1607,2,2,2,1607,1607,1607,1607,1607,1607,1607,1607,1607,1607,1607,1607,2,396,396,1607,1607,1607,1607,1411,1607,396,1607,1607,1607,1607,1607,1607,1607,1607,1607,1607,1607,396,1607,1607,1607,1607,1607,1607,1607,2,1607,1607,396,1607,1607,1607,1607,1607,1607,396,2,396,396,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,396,396,2,396,2,2,2,2,2,1607,1607,2,2,396,396,2,2,2,396,396,396,2,2,2,2,1607,1607,2,2,401,2,2,2,2,1607,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1978,796,582,1580,436,927,2520,2677,1176,1991,1952,2781,2781,1379,1379,880,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,555,2015,2015,2015,2015,2,774,774,413,413,2,2015,2,2,2015,413,413,413,2,2,774,2,2,413,413,413,413,413,2,413,413,413,2,2,2015,2,2,2,2,2,2,2,2,2,2,413,483,2,413,413,413,2,2,2,2,2,2,2,2,413,413,774,774,774,774,774,774,774,2,774,774,413,2,2,2,2,774,774,774,2,774,774,774,2,2,774,2,2,2,2,774,774,774,774,774,774,2,774,774,774,2,774,2,2,2,2,2,2,2,2,2,774,774,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,774,774,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1957,2311,993,276,293,2826,1087,880,927,1811,1122,2974,2974,2,2,590,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1779,1779,1779,2,2,2,2,1779,1779,1779,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1779,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1779,1779,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2552,998,533,827,1619,831,1861,918,750,1955,241,1899,448,2151,2151,449,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2551,2123,2748,2283,1471,2939,1746,244,1212,1055,1602,896,765,765,765,149,2,2,2,2,2,2,2,2,2,2,641,2,2,2,2,2,641,641,2201,2,2,2,2,2,2,2,2,2,2,2,2201,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2201,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,641,2201,2201,2201,2201,2,2201,2201,2201,2201,2201,2,2,2,2,2,2201,2201,2201,2201,2201,2201,2201,2201,2201,2201,2201,2201,2201,2201,2201,2201,2201,2201,2201,2201,2201,2201,2201,2201,2201,2201,2201,2201,2201,2201,2201,2201,2201,2201,2201,2201,2201,2201,2201,2201,2201,2201,2201,2201,2201,2201,2201,2201,2201,2201,2201,2201,2201,2201,2201,2201,2201,2201,2201,2201,2201,2201,2201,2201,2,2201,2201,2201,2201,2201,2201,2201,2201,2201,2201,2201,2201,2,2,2201,641,2201,2201,2201,2,2201,2201,2201,2201,2201,2201,2201,2201,641,2201,2201,2201,2201,2201,2201,2201,2201,2201,2201,2201,2201,641,641,641,641,641,641,641,641,641,641,641,641,641,641,641,641,641,641,641,641,641,641,641,641,641,641,641,641,641,641,641,641,641,641,641,641,641,641,641,641,641,641,641},
+ {1860,579,1000,1575,898,170,185,1032,293,2754,438,459,459,2,1199,1199,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1668,1668,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1668,1668,1668,2,1668,1668,1668,1668,1668,1668,1668,1668,1668,1668,1668,1668,1668,1668,1668,2,1668,1668,1668,2,2,2,1668,1668,1668,2,1668,1668,2,1668,1668,1668,2,1668,1668,1668,1668,1668,1668,1668},
+ {2602,2417,1888,2528,1410,669,1543,233,814,2478,225,1449,1449,224,1671,1671,2,2,931,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,457,2,2,2,2207,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2207,2207,2207,2207,2207,2207,2207,2207,2207,2207,2,2,931,931,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1977,1090,1949,3135,1816,896,2042,2686,780,2002,1823,1823,139,888,888,888,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2118,2118,2118,2118,2118,2,2,2,2,334,2118,2118,2118,2118,2,334,334,334,334,334,2,334,334,334,334,334,334,334,334,334,334,334,334,334,334,334,334,334,334,334,334,334,334,334,2118,2118,2,2118,2118,2118,2118,2118,334,334,334,334,334,334,334,334,334,334,334,334,334,334,334,1726,545,545,545,545,545,545,334,334,334,334,334,334,334,545,334,334,334,334,334,334,2059,2059,2059,545,545,917,1726,2059,1726,1726,1726,545,545,545,2059,545,545,545,2059,2059,2059,2059,2059,2,2059,2059,2059,2059,2059,2059,2059,2059,2059,2059,2059,2059,86,2059,917,1726,1726,1726,1726,1726,1726,1726,1726,1726,917,2059,334,334,2059,2059,2059,545,1726,2059,2059,1726,1726,1726,2059,2059,2059,2059,2059,2059,234,234,234,234,234,234,234,234,234,234,2059,2059,2059,2059,2059,2059,2059,1726,1726,1726,1726,1726,1726,1726,917,1726,2059,2059,2059,2059,2059,2059,2059,2059,2059,2059,917,917,917,1726,2059,2059,2059,2059,2059,2059,2059,1726,1726,1726,1726,2059,1726,1726,1726,1726,1726,1726,1726,1726},
+ {1889,2527,1366,1371,387,925,1751,162,250,1064,292,467,467,546,1244,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1995,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1995,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2943,838,301,1319,859,2508,2032,902,1466,2979,170,503,503,503,176,2,2,2,263,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,263,263,263,263,263,263,2,2,2,263,263,247,247,2,247,263,263,263,263,263,263,263,263,263,247,247,2,247,247,247,247,2,2,2,2,2,263,2,2,2,2,2,2,2,1527,2,247,2,2,2,2,2,2,263,263,2,247,263,2,2,263,263,263,247,247,247,2,2,2,2,2,247,247,247,2,247,2,2,247,247,247,2,263,247,247,247,247,247,247,247,247,247,247,247,247,2,2,2,2,1527,2,1527,263,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,247,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1527,2,1527,1527,2,2,2,2,2,2,2,2,2},
+ {2492,1186,1350,1616,2749,1962,33,708,279,813,1390,489,1203,268,173,2410,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2497,941,2366,712,1217,761,1798,208,1638,20,73,199,199,199,199,355,518,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,440,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,440,440,440,440,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,473,2,2,2,2,2},
+ {2500,1575,423,541,561,380,262,1564,1923,1242,2084,1758,1283,2213,924,924,2,2,2,2,2,2,2,2,2,2,2,1827,1827,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,924,924,2,2,2,2,2,2,924,2,924,924,2,2,2,2,2,2,1827,1827,1827,1827,1827,2,924,924,924,924,2,2,2,2,924,924,924,924,924,924,924,924,924,2,2,2,2,924,924,635,635,924,924,924,924,924,924,924,924,924,924,924,924,924,1827,924,924,635,2,1827,1827,2,2,2,2,2,924,924,924,924,924,924,635,635,635,635,635,635,635,1302,1302,1302,1302,1302,1302,1302,1302,1302,1302,1302,1302,1302,1302,1302,924,1302,1302,1302,1302,1302,1302,1302,1302,1302,1302,1302,1302,1302,1302,1302,1302,1302,2,924,924,635,635,635,635,635,635,635,635,635,635,635,635,635,635,635,1302,2,2,2,1302,1302,1302,1302,1302,1302,1302,1302,1302,1302,1302,635,635,635,635,635,1302,1302,1302,1302,1302,1302,1302,1302,1302,1302,1302,2,2,2,2,924,924,924,924,635,2,2,2,635,924,924,924,924,924,924,924,924,1302,1302,1302,1302,1302,924,924,924,924,924,924,924,924,924,635,2,635,635,635,635,635,635},
+ {1842,1736,489,743,1539,1681,683,1412,1418,312,2778,2778,1975,1975,803,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2025,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2025,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2025,2025,2,2025,2025,2025,2,2,2,2,2025,2,2,2025,2025,2,2,2025,2025,2025,2,2,2,2,2,2025,2025,2,2025,2025,2025,2,2025,2025,2025,2025,2025,2,2,2,2025,2025,2025,2025,2025,2025,2025,2025,2025,2025,2025,2025,2,2,2025,2025,2025,2025,2025,2025,2025,2025,2025,2025,2025,2025,2025,2025,2025,2025,2025,2025,2025,2025,2025,2025,2025,2025,2025,2025,2025,2025,2025,2025,2025,2025,2025,2025,2025,2025,2025,2025,2025,2025,2025,2025,2025,2025,2025,2025,2025,2025,2025,2025,2025,2025,2025,2025,2025,2025,2025,2025,2025,2025,2,2,2,2,2,2,2,2,2,2025,2025,2025,2025,2025},
+ {1843,1934,741,1145,177,650,766,332,832,441,1014,1616,1123,1123,1123,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1671,1671,1671,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1671,1671,1671,2,1671,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1671,2,2,2,1671,1671,2,2,2,2,2,1671,1671,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2824,1183,2201,278,241,2230,1591,1648,1036,818,1321,1312,754,813,813,813,813,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1253,1253,2,2,2,2,2,2,2,2,2,1253,1253,1855,1855,1855,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1253,2,2,2,2,2,2,2,1253,1253,1855,1855,1855,1855,1855,1855,1855,1855,1855,1855,1253,1253,1253,1253,1253,1855,1855,1855,1855,1253,1253,2,2,444,1253,1253,1253,1253,1253,1253,444,444,1253,1855,1855,1855,1253,1253,1253,1253,1253,1253,1253,1253,1253,1855,1855,1253,1253,1855,2700,2700,2,2,2700,1253,1253,1253,1253,1253,1253,1253,1253,1253,1253,1253,1253,1253,1253,1253,1253,1855,1855,1855,1253,1253,1253,1253,1253,1253,1253,1253,1253,1253,1253,1253,1253,1253,1253,1253,1253,1253,1253,1253,1253,1253,1253,1253,1253,1253,444,444,1253,1253,2751,1253,2751,2751,1253,1253,2751,2751,1253,1253,1253,1253,1253,1253,1253,1253,1253,861,861,861,861,1253,1253,1253,1253,1253,1253,1253,1253,1253,1253,1253,1253,1253,1253,1253,1253,1253,1253,1253,1253,1253,1253,1253,1253,1253},
+ {2617,617,259,1016,1473,1772,560,2415,370,207,1159,1349,2503,152,415,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1735,2,2,2,2,1735,2,2,2,2,2,2,2,2,2,2,2,2,2,1735,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,543,543,543,2,2,1735,2,19,19,19,19,2,1735,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1900,2506,952,1059,163,870,681,1235,1271,1188,2071,1705,1183,648,404,2,2,2,2,2,2,2,2,2236,2236,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2236,2236,2236,2,2,2236,2,2,2236,2,2,2,2,2,2,2,2,2,2,2,2,2,2236},
+ {2662,1208,2848,426,2165,402,954,1804,555,41,916,724,674,1082,1783,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2662,1443,2327,132,490,1149,1572,744,429,621,1763,2383,1903,1246,964,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,337,337,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,337,2,2,2,2,2,2,2,2,2,337,2,2,2,2,2,337,2,337,2,2,2,2,337,337,2,337,337,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,337,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,337,337,337,337,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2673,2182,1307,1776,1233,1828,1828,340,249,216,503,160,160,582,926,2129,2129,2129,2129,2129,2129,2129,2129,2129,2129,2129,2129,2,1018,1018,1103,1103,1103,1103,1103,1103,1103,1103,1103,1103,2,2,2,2,2,2,2,899,899,899,899,899,899,1018,1018,899,899,899,899,899,899,2,899,2,2,2,391,391,391,391,391,391,391,391,2,2,2,391,2,2,2,2,1018,592,592,592,592,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1103,1103,2,2,2,594,594,594,594,594,2,1018,1018,2,1018,1018,1018,1018,1018,1018,1018,1018,1018,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1018,2,1018,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1018,1018,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1018,1018,2,2,2,2,2,2,2,2,2,2,1018,1018,1018,1018,1018,2,1018,1018,2,2,2,2,2,2,2,1018,1018,2,2,2,2,2,2,2,2,2,2,2,2,1018,1018,2,2,2,2,2,2,2,1018,1018,1018,1018,1018,1018,1018,2},
+ {1912,1494,301,682,1524,2974,1138,330,1113,114,2687,234,442,442,606,2,2,2,2,2,2,2,2,2,2,2,1165,2,2,2,2,1165,1165,1165,2,2,2,2,2,606,1165,1165,2,2,2,1165,2,2,2,2,2,2,2,2,2,2,2,2,1165,2,2,2,2,2,2,2,2,2,2,2,1165,1165,1165,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1165,1165,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1165,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1165,1165,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1165,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2042,620,1074,2057,2758,859,815,1127,766,1693,252,808,981,416,416,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,452,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,452,452,452,452,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,452,452,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2102,881,2170,1673,705,101,58,1712,1568,214,758,488,1007,269,243,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,243,243,2,2,2,2,2,2,2,2,243,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,243,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,243,2,2,2,2,243,2,243,243,243,243,243,243,243,243,243,243,2,243,243,2,243,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,243,243,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,243},
+ {1913,1232,1826,1053,2045,865,1492,789,1475,1985,2626,2830,1205,206,394,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2876,2190,1370,1614,1651,1936,1346,987,2412,1951,2275,15,1418,611,1876,2,1876,2263,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1291,1291,1291,2,1291,2,2263,2,2263,2,1291,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2692,2665,961,1478,324,429,1311,376,1648,130,2083,1047,409,343,343,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,587,2,2,2,2,2,2,587,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2116,2116,2,2,2,2,2,2,59,59,59,59,59,59,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2280,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,46,46,46,46,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2126,2895,2856,306,1475,1404,924,3236,2277,27,285,340,1560,335,2621,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1229,2,2304,2,2,2,2,2,2,2304,2,2,2,2,2,2,2,2304,2304,2,2,2,2,2,2,2,2304,2304,2304,2304,2304,2304,2,2,2,2,2,2,2,2,2,2304,2,2,2,2,2,2,2304,2304,2304,2304,1229,1229,1229,1229,2,2,2,2,2,2,2,2,2,2304,2304,2304,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2304,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2122,1087,563,1669,647,2996,151,2458,250,310,71,1348,355,965,2815,1333,1333,2,2,2,2,2218,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2218,2,2,2,2,2218,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2218,2218,2,2,2,2,2,2,2,2,2218,2218,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2218,2218,2,2218,2,2,2,2,2218,2218,2218,2218,2218,2218,2218,2218,2,2668,2,2,2,2,2218,2,2668,2668,2668,2,2,2,2,2,2,2,2,2223,2,2,2668,2223,2223,2668,2668,2668,2668,2,2,2,2,2,2,2,2,2,2668,2668,2668,2218,2,2,2,2,2,2,2,2,2,2218,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2223,2223,2223,2,2,2,2,2223,2223,2,2,2},
+ {2582,1029,382,1035,39,962,892,1580,1357,741,1409,1184,2823,1747,775,2,2,2,2,2,2,2,1848,1848,1848,1848,1848,1848,2,2,2,2,1848,1848,2,1848,1848,1848,1848,1848,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1848,1848,2,2,2,1848,2,2,2,1848,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1848,2,2,2,2,1848,2,2,1848,2,2,2,2,2,2,2,2,2,2,2,2,2,1848,1848,2,2,2,2,2,2,2,2,2,2,2,2,1848,1848,1848,2,2,2,2,1848,1848,1848,1848,1848,1848,1848,1848,1848,1848,1848,1848,1848,1848,1848,1848,1848,1848,1848,1848,1848,2,1848,1848,1848,1848,1848,1848,1848,1848,1848,1848,1848,2,2,1848,1848,1848,2,2,2,2,1848,1848,1848,1848,1848,1848,1848,1848,1848,1848,1848,1848,1848,1848,1848,1848,1848,1848,1848,1848,1848,1848,1848,2,1848,1848,1848,1848,1848,1848,1848,1848,1848,1848,1848,1848,1848},
+ {1952,1968,2260,2945,2464,1055,2626,570,1316,1828,1828,970,970,221,220,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1813,1664,1664,1664,1664,1813,1813,2,1813,1664,1664,1664,1664,1664,2,2,2,2,1664,2,2,2,2,2,2,2,2,1664,2,2,2,2,2,2,2,2,1664,1664,1664,1664,1664,1664,1664,2,1664,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1813,1813,1813,2,2,2,1813,1813,1813,2,2,1813,1664,1664,1813,1813,1813,1813,2,1813,1813,1813,1813,1813,1813,1813,1813,1813,1813,1813,1813,1813,1813,2,2,2,1813,1813,1813,1813,2,2,1813,1813,1813,1813,1813,1813,2,1813,1813,1813,1813,1813,1813,1813,2,1813,1813,1813,1813,2,2,2,2,2,2,2,1813,1813,1813,1813,1813,1813,1813,1813,1813,1813,1813,1813,1813,2,1813,1813,1813,1813,1813,1813,1813,1813,1813,1813,1813,1813,1813,1813,1813,1813,1813,1813,1813,1813,1813,2,2,2,2,1813,1813,2,2,1857,225,427,1058,2048,2048},
+ {2600,985,1174,2932,1567,1379,2566,1537,15,850,282,634,634,2267,226,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1194,2,2,2,2,1194,1194,1194,1194,1194,1194,1194,1194,1194,2,2,2,2,2,2,1194,1194,1194,1194,2,2,2,2,1194,2,1194,1194,1194,1194,1194,1194,1194,1194,1194,1194,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1194,2,1194,1194,2,2,1194,2,2,2,2,2,1194,1194,1194,1194,2,2,2,2,2,1194,1194,1194,1194,1194,1194,1194,1194,1194,2,2,1194,1194,1194,1194,1194,1194,1194,1194,1194,1194,1194,1194,1194,1194,2,1194,1194,1194,1194,1194,1194,1194,1194,1194,1194,1194,1194,1194,1194,2,1194,1194,1194,1194,1194,1194,1194,1194,1194,1194,1194,1194,1194,1194},
+ {2583,892,2011,697,2672,329,206,2725,2008,765,590,2233,1400,2591,1272,860,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,308,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,308,308,308,308,308,308,308,308,308,308,308,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,308,308,2,2,2,2,2,2,2,2,2,2,2,2,2,308,2,2,308,2,2,2,308,308,308,308,308,308,308,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,308,308,2,308,308,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2687,629,1634,712,512,363,1855,343,1002,161,1531,191,1515,967,1239,1239,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1345,1345,1345,1345,1345,1345,2,2,2,2,2,2,2,2,1345,1345,2,2,2,2,2,1345,1345,1345,1345,2,2,2,2,2,2,1345,1345,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,2,1345,2,2,2,1345,2,2,1345,2,2,2,2,2,2,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,2,2,1345,1345,1345,1345,1345,1345,1345,1345,1345,2,1345,1345,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1345,2,2,2,1345,2,2,2,2,2,2,2,2,1345,1345,1345,1345,2,2,2,2,2,2,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,2,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345,1345},
+ {1947,1699,1341,486,1765,1960,264,899,1082,1674,987,1878,930,1008,930,930,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1637,2,2,2,2,2,2,2,2,2,1637,2,2,2,2,2,2,2,2,2,1637,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1329,1329,2,1329,1329,2,2,2,1637,1329},
+ {1953,1527,1643,591,1517,2427,1232,1555,2542,495,675,2534,2534,3106,83,3106,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1541,1541,2,2,2,2,2221,2,2,2,2221,2,2,2,2221,2221,2221,2,2221,2221,2,2221,2,2,2,2221,2221,2221,2221,2221,2221,2221,2,2221,2221,2221,2221,2221,2221,2,2,1622,638,922,1575,1575,1135,1783,1783,1783,82,82,2221,2221,2221,2221,2221,2221,1541,2221,2221,1541,769,769,2221,2221,2221,2221,2221,2221,2221,2221,2221,2221,2221,2221,2221,2221,1541,1541,1541,1541,1541,769,1541,1541,769,769,769,769,769,769,1541,1541,1541,1541,1541,1541,2221,769,2221},
+ {2588,2051,794,2299,1480,1795,804,1763,1562,677,465,1404,271,271,1495,1645,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,947,947,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2744,1728,2213,792,761,1667,1908,31,447,442,815,2865,762,762,762,762,2,2,2,2,2,2,2,2,2,2,2,2,649,649,649,2,2,2,649,649,649,649,649,649,649,649,649,649,649,649,649,649,649,649,649,649,649,649,649,649,649,649,649,2,92,92,92,2,649,649,649,92,92,92,92,92,92,92,92,92,92,92,92,481,2,2,484,2,2,649,2,2,2,2,484,484,484,484,484,484,484,484,2,484,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,481,2,2,2,2,2,481,481,481,481,481,481,2,2,2,484,484,484,2,481,481,168,649,92,2,2,2,2,2,2,2,2,2,2,649,2,2,2,2,2,2,2,2,2,2832,2,2,649,649,649,649,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,649,484,484,484,2,2,649,649,649,649,649,2,2,2,2,2,2,2,649,2,2,2,2,2,2,2,2,2,2,649,649,649,649,649,649,649,649,2,2,2,2,2,649,2,2,2,2,2,2,2,2,2,2,649,649,2,649,2,649,649,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2722,1406,1257,807,2191,3017,1330,1023,602,2124,794,530,733,733,1083,2528,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1720,2,2,2,2,2,2,2,2,2,1720,1720,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,952,2,2,2,2,1720,1720,1720,2,2,1720,1720,1720},
+ {2604,2214,2076,2441,2223,1489,424,117,1855,1391,1404,414,414,2048,2048,303,2,2,2,2,2,2,2,2,2,2,2,4,4,4,4,4,4,2,2,1418,2,2,2,2,2,2,2,2,2,2,2,1418,1418,433,2,2,433,433,433,433,2,2,2,2,1418,1418,1418,1418,1418,1418,1418,1418,1418,2,1418,433,433,433,433,433,433,433,433,433,433,433,2,2,433,433,433,433,2024,2024,2024,2024,2024,2024,2024,2024,2024,779,779,433,433,433,433,433,433,433,433,433,433,433,433,779,779,2,2,2,2,779,779,1418,2024,2024,1418,1418,1418,1418,1418,1418,1418,1418,1418,1418,1418,779,2,2,2,779,779,779,779,779,779,779,779,779,779,779,779,779,779,779,779,779,779,779,779,779,779,779,779,779,779,779,779,779,779,779,779,779,779,779,779,779,779,779,779,779,779,779,779,779,406,779,779,433,779,2024,2024,433,779,779,779,779,779,1418,1418,779,779,1418,1418,1418,1418,1418,1418,433,433,433,433,433,433,433,433,433,1418,433,433,433,433,433,433,366,366,366,366,366,366,366,366,366,366,366,366,366,366,2,1418,2,2,2,779,2,2,2,779,779,779,779,779,779,779,779,2,779,779,779},
+ {2720,1547,1527,1995,564,995,845,1152,395,848,483,2371,299,299,1000,1000,2,2,2,2,2,2,2,2,2,1375,1375,1375,1375,1600,2,2,1375,1375,1375,2,1600,1600,1600,1600,1600,1600,1600,1600,1600,1600,1600,1600,2,2,2,2,2,2016,2016,2016,2016,2,2,2016,2016,1600,1600,1600,2,2,2,1375,1375,1375,1600,1600,1600,1600,1600,1600,1600,1600,1600,1600,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1375,1375,1375,2,2,1375,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1375,1375,1375,2,1375,2,2,2,2,2,2,2,2,1375,1375,2,2,2,2,2,2,2,2,2,2,1375,1375,1375,1375,1375,1375,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2728,908,2523,497,1747,524,316,382,1156,274,50,1215,809,134,134,452,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1661,1661,1661,1661,1661,1661,2,2,1661,1661,2,2,2,2,1661,2,2,2,2,2,2,1489,1489,1489,1489,1489,1489,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1661,2,2,2,2,2,2,2,1661,1661,2,2,2,1661,1661,2,2,2,2,2,1661,1661,2,1489,2,2,1661,1661,2,1661,2,2,2,2,2,1661,2,2,2,2,2,2,2,2,2,1489,1661,2,1661,2,2,2,2,2,2,2,2,2,2,2,2,2,1489,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,771,771,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1661,1661,2,2,2,2},
+ {2626,2468,2838,845,2060,218,1080,912,911,1973,1365,920,1316,1316,2,1316,1316,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1013,1013,2,2,2,1013,2,2,2,2,2,2,2,2,2,1013,1013,1013,1013,1013,1013,1013,1013,1013,2,1013,1013,1013,1013,1013,1013,1013,1013,1013,1013,1013,721,721,721,1013,2,1013,1013,1013,1013,1013,1013,1013,1013,721,721,1013,2,1013,1013,1013,1013,721,2,721,721,721,721,1013,2,2,2,1013,1013,2,2,2,2,2,1013,1013,1013,2,2,1013,1013,2,1013,2,2,2,2},
+ {2734,1727,1743,1026,809,1154,779,244,1238,1616,812,784,825,1810,1810,1810,1810,1559,1559,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1559,2,2,1559,1559,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1559,2,2,1559,1559,2,2,2,2,1559,2,1559,2,2,2,2,2,2,2,2,2,1559,1559,1559,1559,2,2,2,2,2,2,2,2,1559,1559,1559,2,2,2,1559,1559,1559,2,1559,1559,1559,1559,1559,1559,1559,1559,1559,1559,1559,1559,2,2,2,2,2,2,2,2,2,2},
+ {2947,875,1603,1364,2297,570,2949,1952,701,84,296,1958,2709,1958,144,144,605,2,2,2,2,2,2310,2,2,2,2,2,2,2,2,2,605,2,2,2,2,2,2,2,2,2,2,2,2,605,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,605,2,2,2,2,605,2310,2310,2,2310,2310,2,2310,2310,2,2310,2310,2310,2310,2310,2310,2,2,2310,2,2,2310,2310,2310,2310,2310,2310,2310,2,2310,2310,2,2,2,2310,2310,2310,2,2310,2,2,2,2310,2310,2310,2310,2310,2,2,2,2,2,2,2,2,2,2310,2310,2310,2,2,2,2,2,2,2,2,2310,2310,2310,2310,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2310,2310,2310,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2180,2262,1651,204,3193,2121,2725,1016,629,1834,603,2848,26,26,728,728,728,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,487,487,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,487,2,2,2,2,2,2,2,2,2,2,2,487,487,2,487,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2669,1418,506,671,2202,343,617,583,21,2496,983,449,1671,1193,2,2502,2502,2,2,2,2,2,2,2,2,2,2,2,2,2,384,384,2,2,2,2,2,1849,1777,384,384,384,384,2,2,2,2,2,2,2,1849,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1849,1849,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1777,1777,1849,1849,1849,1849,1849,1849,1849,1849,1849,1849,1849,1849,1849,2,2,1849,1849,1849,1849,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1515,1515,1515,1515,1515,2,1777,1777,1515,1515,1515,2,1515,1515,1515,2,2,2,2,2,2,2,2,2,2,2},
+ {2131,752,2841,458,201,361,935,3205,2815,904,35,2699,555,1344,2,664,1377,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1187,1187,1187,1187,1187,1187,1187,1187,1187,1187,1187,1187,1187,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,264,264,264,2,264,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2330,2,2,2,2,2,2,2,2,2,2,2,2,2330,2330,1187,1187,1187,2330,2330,2330,2330,2,2330,2330,2330,2330,2330,2330,2330,2330,2,2,2330,2330,2,2330,2,2,2,2,2,2,2,2,2,2330,2330,2,2,2,2,2330,2,2330,2,264,264,264,264,264,2,2,2,2,2330,2330,2330,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2648,1328,2578,133,1377,105,2485,2139,323,1045,145,761,1201,1848,2,814,814,814,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1914,2,2,2,2,2,2,2,1914,1914,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,104,104,2,2,2,2,2,2,2,761,2,761,2,761,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,761,761,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,761,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2741,2814,691,1055,749,2147,821,1246,2190,453,1133,2673,1689,630,2,2,2274,2274,2,2,2,2,2,2,1423,1423,1423,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1423,1423,1423,2,2,2,2,1423,1423,1423,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1423,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1423,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1423,1423,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1423,1423,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1423,1423,1423,1423,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1423,1423,1423,1423,2,2,2,2,1423,2,2,2,2,2,1423,2,2,2,2,1423,1423,1423,1423,2,1423,1423,1423,1423,1423,1423,2,1423,2,2},
+ {2999,358,250,1379,102,2349,1491,2074,42,376,2811,1220,296,296,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1844,1844,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1214,1214,1214,1214,1214,1214,2,1214,2,1214,1214,2,2,2,2,2,2,2,2,2,2,2,1214,2,2,2,2,2,2,1214,2,2,2,2,2,1214,2,1214,1214,1214,2,2,2,2,2,1214,1214,2,2,2,2,2,1214,2,2,2,2,2,2,2,2,1214,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2020,1662,656,1990,2334,1370,452,962,416,1709,1384,685,843,540,1193,1193,1193,1193,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1193,1193,1193,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2810,1274,499,742,1724,425,190,1561,1302,2603,2255,917,661,661,2,2,2,495,2,2,2,2,2,2,2,2,2,2575,2,2,2,2,2,2,2,2,2575,2575,2575,2575,2575,2575,2,2,2,2,2575,2575,2575,2575,2,2,2,2,2,2575,2575,2575,2575,2575,2575,2575,2,2575,2575,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2575,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2575,2,2,2,2,2,2,2,2,2,2575,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2150,589,876,1616,2655,432,902,1028,433,1375,574,1400,1400,1400,2,2,2,2,2,1529,1529,1529,1529,1529,1529,1529,1529,1529,1529,1529,1529,1529,1529,1529,1529,1529,1529,1529,1529,1529,2,2,2,1529,643,643,643,643,643,643,643,643,643,643,643,643,643,643,643,643,643,1529,2,1529,1529,1529,1529,1529,1529,1529,2353,2,2,2,2,1529,1529,1329,1329,1329,1329,2,1529,1529,1529,1529,2,2,2,2,2,2,643,1529,58,58,2,58,58,58,643,643,2,643,643,1529,1529,1529,1529,1529,1529,1529,643,643,643,1529,2353,2353,1529,2353,2353,1529,2353,2353,2353,2353,1529,1529,1529,643,643,1529,1529,1529,1529,1529,1529,1529,1529,2,1529,1529,1529,2,2,2353,2353,1529,1529,1529,1529,1529,1529,1529,643,643,1529,1529,1529,1529,1529,1529,1529,1529,1529,1529,1529,1529,1529,1529,2353,2353,643,1529,1529,1529,1529,1529,1529,1529,1529,1529,1529,1529,1529,1529,1529,643,643,643,643,643,643,643,1529,643,643,643,643,643,643,643,643,2353,2353,2353,1529,1529,1329,643,643,643,643,643,643,1329,643,643,643,2,1329,1329,2353,2353,2353,2353,2353,643,643,643,643,643,643,1529,1529,1529,1529,2353,1529,643,1529,2353,2353,643,643,1529,1529,1529,1529,1529,643,643,643,1529,1529,1529},
+ {1665,1856,201,824,796,249,1217,590,1375,1175,1599,824,824,3319,2,2,2,601,1961,1961,2,2,2,1961,2,2,2,2,2,2,1961,2,2,1961,2,2,2,2,2,2,2,2,2,2,2,2,1961,2,2,2,2,2,2,2,2,2,2,2,2,2,2,601,2,2,601,2,2,2,601,2,2,601,2,2,2,2,2,2,2,2,2,601,2,2,2,2,2,2,2,601,601,2,2,2,2,2,2,2,601,601,2,601,2,2,2,2,2,2,2,2,2,2,2,2,2,2,601,2,601,601,601,601,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1111,2,2,2,2,2,2,2,2,2,2,2,2,2,2,601,2,2,2,2,601,2,2,2,2,2,2,2,2,2,2,2,601,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2685,530,1962,387,1702,243,1766,189,762,448,1907,855,855,2022,2,2,2,2143,2143,2,2,2,199,199,2143,2143,2143,2143,2,2,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2,2143,2143,2143,2143,2143,2143,2143,199,199,2143,2,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2,2143,2143,2143,2143,2143,2143,2,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2,2,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2,2143,2143,2143,2143,2143,2143,2143,2143,2143,2,2143,2143,2143,2143,2143,2143,2143,2,2,2,2143,2143,2143,2143,2143,2143,2143,1782,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2143,2},
+ {2684,2316,1226,578,1475,1871,1387,2840,775,1628,2327,1689,1930,1930,2,2,2,2,742,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1504,1504,1504,2,2,1504,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2704,2239,1260,140,2161,2781,1840,574,2353,343,3218,61,2108,2038,1873,2,1833,1408,2,2,2,2,2,2,2,2,2,2,2,2,2,2,671,671,671,671,671,660,660,2,2,671,2,671,671,660,660,2,2,2,671,671,671,671,671,671,671,671,671,671,671,671,2,2,2,671,671,2,2,2,671,2,398,660,660,2,2,2,2,2,671,671,660,1475,2,1475,1475,671,1475,2,2,671,671,660,660,1475,671,671,671,671,398,398,1475,1475,1475,398,398,671,671,1475,1475,2,671,671,671,671,671,671,671,660,2,398,2,2,1475,1475,2,660,660,660,671,671,2,2,2,671,671,671,671,671,671,671,671,671,671,671,671,671,2,2,2,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,398,671,671,671,671,671,671,671,671,671,671,2,398,671,671,671,398,398,398,398,398,398,398,398,398,671,671,671,671,671,1475,398,398,398,398,398,671,660,398,660,660,660,660,660,671,660,660,660,660,660,660,660,660,660,660,1873,660,660,660,660,660,1475,1475,660,660,660,660,660,1475,1475,671,660,660,671,671,671,660,660,660,660,660,660,660},
+ {2692,1325,2489,1207,1705,1164,2582,2701,3300,703,214,501,1167,853,2,2,2,1642,2,2,2,2,1163,2,2,1163,1163,2,2,1163,1163,1163,2,1163,1163,1163,1163,1163,2,1163,1163,1163,1163,1163,1163,2,2,2,2,1163,1163,1163,1163,1163,1163,1163,1163,1163,1163,1163,1163,1163,1163,1163,1163,1163,1163,1163,1163,1163,1163,1163,1163,1163,1163,1163,1163,1163,1163,1163,1163,1163,2,1163,1163,1163,1163,1163,1163,1163,1163,1163,1163,1163,1163,1163,1163,1163,2,1163,1163,1163,1163,1163,1163,1163,1163,2,2,2,2,2,2,2,2,2425,2425,2425,2425,2425,2425,2425,2,2,318,318,318,2,2425,2425,2,1163,1163,1163,318,2,2425,2425,2425,2425,2425,2425,2425,2,2425,2425,2425,2425,2,2425,2425,2425,1163,1163,1163,2425,2,2,2,2,2,2,2,2,2,1163,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1163,2,2,2,2,2,2,2,2,2,2425,1163,1163,318,2,1163,318,318,2,1163,1163,1163,2,1163,1163,1163,318,318,1163,318,318,2,1163,1163,1163,1163,318,318,318,318,318,318,318,2,1163,2425,2425,2,318,2,1163,1163,2,2,318,318,2,2,2,2,2425,2425,318,2,1163,1163,1163,318,318,1163,318,318,318,318},
+ {3006,482,1886,648,2094,692,1169,810,39,667,1105,1454,724,724,1165,1165,1904,1762,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1614,1614,1614,1614,1614,1614,1614,1614,2,2,1614,1614,1614,1614,1614,1614,374,374,374,374,374,374,374,1165,1165,1165,1165,1165,1165,1165,1165,374,1614,374,1614,1165,1165,374,374,1614,2,374,1710,1710,1710,1710,2,2,2,1614,1614,2,1614,1614,1614,1614,1614,1614,1614,1614,1614,374,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1614,1614,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2173,876,802,2197,3338,176,1783,224,1763,1160,1264,1264,2864,554,2,552,552,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,710,2,710,710,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,710,710,710,710,2,2,710,2,2,2,2,2,2,2,2,2,2,2,2,2,710,710,710,710,710,2,2,710,710,710,2,2,710,710,710,2,2,2,2,710,710,710,2,710,710,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2023,2607,1499,456,670,882,1161,800,2412,398,96,1997,1342,338,121,121,81,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2708,1663,2279,824,836,1598,2101,1620,1202,1606,1368,1079,1167,1999,2848,2848,2848,1101,1101,1101,2,2,2,662,2,2,2,2272,2,2,2,2,2,2,2,2,2,2,2,2272,2,2,2,2,2,2,2,2,2,2272,2,2,2,2,2,2,2272,2272,2,2272,2272,2272,2,2,2272,2272,2272,2272,1101,2272,2272,2272,2272,2272,2272,2272,2272,2272,2272,2272,2272,2272,1101,2272,2272,2272,2272,2272,2272,2272,1101,1101,2272,2272,2272,2272,2272,2272,2272,2272,2272,1101,2272,2272,2272,2272,2272,2272,2272,2272,2272,2272,2272,2272,2272,2272,2272,2272,2272,2272,2,2272,2272,2,2,2,2272,2272,2272,2272,2,2,2272,2272,2,2,2,2,2,2,2272,2272,2272,2272,2272,2,2,2,2,2,2,2,2,2,150,2,150,150,150,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2272,2272,2,2272,2272,2,2,2272,2272,2272,2272,2272,2272,2272,2272,2,2,2,1101,1101,1101,2,2,2,2,2,2,296,296,296,788,2,2,2,150,2,2,296,296,2,2,2,2,2,2,2,2272,2272,788,788,2272,2272,2272,2272,2272,2272,2272,2272,2272,2272,2272,2272,2272,2272,2272,2272,1101,1101,2272,2272,2272,2272,2272,2272,2272,2272,2272},
+ {1987,1463,2328,1890,1443,2086,283,2895,522,1577,1514,1657,2605,891,2,1181,1181,2,2,2121,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2153,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2153,2,2153,2,2,2153,2,2,2,2,2,2,2153,2,2,2,2,2,2,2,32,128,1050,128,905,1050,1050,2417,2153,2153,2153,2153,2153,2153,2153,2153,2,2,2153,2153,2153,2,2153,2153,2153,2936,2153,2153,2153,2153,2153,2153,2153,2153,2153,2153,2153,1703,2153,2153,2153,2153,2121,2153,2153,2153,2153,2153,2153,2153,2153,2153,2153,2153,347,347,347,2153,2153,2153,2153,2153,2153,2153,2153,2153,2121,2121,2153,2153,2121,2121,2153,2153,2153,1703,1703,2121,2153,2153,2153,2153,2153,2153,2153,2121,2121,2153,2121,347,347,347,347,2153,2153,1009,1009,2153,1009,1009,2153,2153,2153,1009,1009,2153,2153,2153,2153,2153,1703,1703,1703,1703,1703,1703,347,1703,1703,1703,1703,2121,1703,2153},
+ {2040,1634,930,2588,760,461,1059,78,1831,1413,1788,1788,1788,1788,663,2696,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,945,2,2,2,945,2,2,2,2,2,945,945,2,2,1159,2,945,2,2,2,2,2,2,2,2,945,945,945,2,2,2,945,945,945,945,945,945,945,945,945,945,945,2,945,2,2,2,2,945,2,2,2,945,945,945,2,2,2,2,2,2,2,2,2,2,945,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,945,945,945,945,2,945,945,945,945,945,2,2,2,2,2,2,2,2,2,2,2,2,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,2,2,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,2,945,945,945,945,945,2,2,945,945,945,945,2,2,945,945,945,945},
+ {2173,1637,1139,905,1802,1378,296,439,1507,1017,1427,209,708,462,1508,1508,1508,2,2,2,2,2,2,2,2,2,2,2240,2240,1459,1459,1459,2240,2240,2,2,2,2240,2240,2240,2,2240,2240,2240,2240,2240,2240,2240,2240,2240,2240,2240,2240,1459,1459,1459,1459,1459,1459,1459,1459,1459,2,2,1459,2240,2,2,2,2240,2240,2240,2240,2240,2240,2240,2240,2,2,2,2,2,2,2240,2,2,2,2,2,2240,2240,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2240,2,2,2,2,2,2,2,2,2240,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2240,2240,2,2,2,2,2240,2240,2,2,2240,2240,2240,2240,2,2240,2240,2240,2240,2240,2240},
+ {2206,1526,628,2877,802,2587,1253,1258,1044,2195,3246,40,2898,2898,1704,598,2,2145,2,2,2,2145,2,2,2,2,2,2,2,2,2,2,2,2,2,2145,2,2,2,2145,2,2,2,2,2,2,2,2,2,2,2,2,2145,2145,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2437,2,2,2,2,2,2,2,2,2,2,2,2,2437,2437,2,2,2,2,2437,2437,2437,2,2437,2,2145,2,2,2145,2145,2145,2145,2145,2145,2437,2437,2437,2,2,2,2,2437,2437,2437,2437,2437,2437,2267,2437,2437,2437,2437,2437,2437,2437,2437,2,2437,2437,2437,2437,2437,2437,2437,2437,2437,2437,2437,2437,2437,2437,2437,2,2437,2437,2437,2437,2437,2437,2437,2437,2437,2437,2,2,2,2,463,2437,2437,2437,2437,2437,2437,2437,2437,2437,2437,2437,2437,2437,463,463,463,2437,2437,2437,2437,2437,2437,2437,2437,2437,2437,2437,2437,2437,2437,2437,2437,2437,2437,2437,2437,2437,2437,2,2,2,2437,2437,2437,2437,2,2437,2437,2437,2437,2437,2437,2437,2,2437,2437,2437,2437,2437,2437,2437,2437,2437,2437,2437,2437,2437,2437,2,2,2,2,2,2,2,2},
+ {2852,943,708,2224,1072,178,618,2577,1039,413,389,897,710,2541,131,2224,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2443,2443,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1099,2,2,2,2,2,2,2,2,2,2,2,2443,2443,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3133,2051,2507,1339,1775,149,1451,1638,1686,1716,555,1660,287,627,1929,1335,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1335,1335,1335,1335,1335,1335,1335,1929,1929,1929,2,2,2,2,2,2,1335,1335,1335,1335,1335,1335,1335,2,2,1335,1335,1335,1335,1335,1335,1335,1335,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1335,1929,1929,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1929,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1929,1929,1929,1929,1335,1929,1929,1929,1929,1929,1929,1929,1929,1929,2,1929,1929,1929,2,2,1929,1929,1929,1929,2,2,2,2,1929,1929,1335,1335,1335,1929,1929,1929,1335,1335,1335,1335,1335,1335,2,2,2,1929,1929,1929,1335,1335,1335,1335,1335,1335,1335,1335,1335,1335,1335,1335},
+ {2182,618,1022,1433,1138,1580,2590,149,796,2090,743,294,294,1117,720,3003,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2765,757,915,2063,679,988,1224,776,3584,919,544,1248,129,2112,2112,1561,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2857,556,2345,1882,1856,558,1708,2532,619,755,2458,722,332,2752,1823,2248,2,2,2,2,2,2055,2055,2,2055,2,2,2,2,2,2,2,2,2,2,1707,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1707,2,2,2,1707,1707,2,2,2,2055,2055,2,2,2,1707,1707,1707,1707,2,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,2,2,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,2,2,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,1707,909},
+ {2284,1034,1105,1724,446,1374,714,54,313,1383,665,2659,2659,904,904,1826,2,2,2,2,2,2499,825,2499,2,2,1210,1210,1210,1210,1210,1210,1210,1210,1210,437,437,437,437,437,1210,437,437,2,2,2,2,2,2,1210,437,1210,1210,1210,2,2,2,1160,1160,1160,2332,2332,2332,2332,2332,437,437,1160,1160,1160,1160,1160,1160,1160,2,2,2332,2,2,2,2,2,2,2,2,437,437,2,2,2,1210,1210,1210,1210,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,588,3226,3226,3226,3226,3226,3226,3226,3226,611,611,2659,1210,1210,1210,1210,2,2,1210,1210,1210,1210},
+ {2773,672,462,2359,2988,1148,41,81,1615,1374,2005,2005,603,1648,660,180,2,2,2,660,540,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1521,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1521,2,2,2,2,2,2,2,2,2,1521,1521,1521,2,2,2,2,2,2,1521,1521,1521,1521,1521,2,1521,1521,1521,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1521,2,2,1521,2,2,2,2,1521,1521,1521,2,2,1521,2,2,2,2,2,2,2,2,2,2,1521,2,2,2,2,2,2,2,1521,1521,1521,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1521,1521,1521,1521,2,2,2,2,2,2,2,2,540,1521,2,540,540,540,540,540,1521,1521,1521,1521,1521,1521,1521,1521,2,1521,2,2,540,540,540,1521,1521,1521,2,540,2,2,2,1521,1521,1521,1521,2,540,2,540,2,2,2,540,2,2,2,2,2,2,540,540,540,540,540,540,540,540,540},
+ {2231,1319,816,2030,1682,1751,1827,2319,1878,2483,2449,499,2122,203,1603,1065,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,127,127,127,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,127,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,127,127,127,127,127,127,127,127,127,127,2,2,2,127,127,127,127,2,2,2,2,2,2,2,2380,2,2,2,2380,2},
+ {2234,1035,1239,696,2653,131,654,1615,3333,629,1687,1907,1907,1551,102,724,2,2,1641,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1665,1665,1665,2,2,2,1665,1665,2,1665,2,2,2,2,1665,1665,1665,1665,1665,2,2,2,1641,1665,1641,1641,1641,1641,1665,1665,1665,1665,1665,1665,2,2,1665,1665,1665,1665,1665,1665,1665,1665,1665,1665,1665,1665,1665,1665,1665,1665,1665,1665,1665,1665,1665,1665,1665,1665,1665,1665,1665,1665,1665,1665,1665,1665,1665,1665,1665,1665,1665,1665,1665,1665,2,1665,2,2,2,2,2,2,2,1665,1665,1665,1665,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1665,1665,2,1665,1665,2,1665,2,2,2,2,2,2,2,2,2,2,2,2,2,1665,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2456,2456,2,2456,2456,2456,2456,2456,2456,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2083,1465,847,1450,502,447,2168,794,1761,1324,162,188,2853,2853,636,973,2,563,2,2,2,2,2,2,2,2089,2089,2089,2089,2089,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2089,2089,2,2089,2089,2,2089,3333,2,2,2,2,2089,2089,2089,2089,2,3333,3333,2089,2089,2089,2089,563,563,563,3333,3333,3333,2089,2089,2089,2089,2089,2089,2089,2089,2089,2089,2089,2089,2089,2089,2089,2089,2089,2089,2089,2089,2089,2089,2,2,3333,3333,3333,3333,2089,2089,2089,3333,2089,2089,2089,2089,2089,2089,2089,2089,2,2,2,2,2,2,3333,3333,563,2,2,2,2,2,3333,2,2,2,2,2,2,2,3333,3333,3333,3333,3333,3333,2,3333,3333,3333,3333,2,2089,2,2,2,2,2,2,2,2,2,2,2,2,3333,2,3333,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3333,3333,3333,3333,3333,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2089,2,2,2,2,2,2,2,2,2,2,2089,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2293,2688,1529,600,3219,80,167,3231,1004,3516,1792,1892,894,894,894,894,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,365,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,989,989,989,989,2,2,365,989,989,365,2,2,2,2,2,2,2,989,989,989,2,365,365,365,365,365,365,365,365,365,2,365,365,2,2,2,365,365,365,365,2,2,2,365,365,365,365,365,2,365,365,365,365,365,365,365,365,365,365,365,365,365,365,2,365,365,365,2,365,365,365,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,365,365,365,365,365,365,365,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2923,2303,203,508,472,648,3169,269,515,3147,2415,1700,1700,1700,1461,1461,1461,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1197,1197,1197,2,2,2,2,2,2,2,2,1197,2,1197,1197,1197,1197,2,2,2,2,2,1912,1912,2,2,2,2,2,2,2,1197,1197,1197,1197,1197,1197,1197,1197,1197,1197,1197,1197,1197,1912,1197,1197,1197,1197,2,1197,2,2,2,2,1197,1197,1912,1197,2,2,2,2,2,2,2,2,1197,1197,2,1197,2,2,2,2,2,2,2,2,2,2,2,1197,1197,2,2,2,1197,1912,1912,1912,1912,1912,1912,1912,1912,1912,1912,1912,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1912,2,1912,1912,1912,2,1912,1912,1912,2,1912,1912,1912,1912,1912,1912,1912,1912,1912,1912,1912,1912,1912,1912,1912,1912,1912,2,1912,1912,1912,1912,1912,1912,1912,1912,1912,1912,1912,1912,1912,2,2,2,1912,1912,1912,1912,2,2,1912,1912,1912,1912,1912,1912,1912,1912,1912,1912,1912,1912,1912,1912,1912,1912,1912,1912,1912,1912,1912,1912,1912,1912,1912,1912,1912,1912,1912,1912,1912,1912,1912,1912,1912,1912,1912,1912,1912,1912,1912,1912,1912,1912,1912,1912,1912},
+ {2218,572,1615,1016,1397,39,1794,1089,1631,737,198,1122,728,832,832,1441,690,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1853,1853,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1853,1853,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2300,1116,1555,2794,1095,998,1999,894,963,753,324,2130,2675,2675,554,2045,2,2,2,2,2,2,2,2130,2130,2130,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2045,2045,2,2045,2045,2045,2,2,2,2045,2,2,2,2,2,2,2,2,2,2045,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2045,2,2,2,2,2,2045,2045,2045,2045,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2045,2,2,2045,2,2,2,2,2,2,2,2,2,2,2,2,2,2045,2,2,2,2,2,2045,2,2,2,2,2,2,2,2045,2,2,2,2,2,2,2045,2,2,2,2,2,2045,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2807,2008,2435,1197,1119,1799,631,281,2955,24,1729,527,1026,1026,1026,163,163,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,163,163,2,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,2,2,2,2,2,2,163,163,2,2,2,2,163,163,163,2,163,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,163,2,2,2,2,2,2,2,2,2,2,163,163,163,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,163,2,2,2,2,2,2,2,2,2,2,2,2,2,2,163,163,163,163,163,163,163,163},
+ {2103,768,702,1548,1486,2228,2846,861,665,1497,1046,1046,2252,394,394,1901,1155,2,2,2,2,2,2,2,2,2,2,2,192,192,192,192,2,2,2,859,694,2,694,694,1025,2,2,2,2,859,859,859,859,859,2,859,859,859,2,2,2,2,2,2,2,2,2,2,2,859,859,859,2,2,859,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,859,859,859,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,859,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,859,859,859,859,859,859,2,2,2,2,859,2,2,2,2,2,2,2,2,2,2,859,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2909,706,323,605,540,2093,2474,255,2108,2456,2726,476,357,2039,357,2,641,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2923,640,661,2179,1207,182,872,171,738,269,1372,222,908,2069,2069,2,1550,516,2,2,2,2,2,2,2,2,2,2,1109,2,2,2,2,2,2,2,2,2,2,2,1109,1109,1109,1109,1109,1109,2,2,2,2,2,2,2,2,2,2137,2137,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2205,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1109,1109,516,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2137,2,2,2,2,1109,2,2,2,2,2,2,1109,1109,1109,1109,1109,2,2,2,2,2,2,2,2,2,2,2,2,2,1109,2,2,2,2,2,2,2,2,2,2,2,1109,2,2,1156,2},
+ {2262,2121,2519,1460,1614,210,405,1605,592,365,1930,1496,220,3463,1700,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,686,2,2,2,2,2,2,686,2,2,2,686,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,686,2,686,2,686,686,686,686,686,686,2379,2379,2,2,686,686,2379,686,367,686,686,686,2379,2379,2379,2379,686,686,686,686,686,686,686,686,686,686,686,686,2379,2379,2379,2379,2379,2379,2,2379,2379,2,367,367,367,2,2379,2379,2,2379,2379,2379,2,2,2379,367,367,367,367,367,2,367,367,367,686,686,686,2379,367,367,367,367,2,367,686,2,2,2,686,367,367,2,2,686},
+ {2957,1025,415,854,1866,364,176,275,1711,663,2645,2246,561,1232,1232,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1108,1108,2,2,2,2,2,2,2246,2246,2,2,2,2,2246,2246,2,2,2,2,2,2,2,2,2,2,2,2246,2246,2246,2246,2246,2,2,2246,2246,2,2,2,2,2,1108,1108,1108,1108,1108,1108,1108,1108,2,1108,2,1187,2,2,2,2,2,2,2,2246,2246,2246,2246,2246,2246,1108,2246,2246,2,2,2246,2246,2246,2246,2246,2246,2246,2246,2246,2246,2246,2,2,2,1108,2246,2246,2246,2246,2246,2246,2246,2246,2,2246,2246,2246,2246,2246,2246,2246,2246,2246,2246,2246,2246,2246,2,2246,2246,2246,2246,2246,2246,2,2,2,2,2,2246,2,2,2,2246,2,2,2246,2246,2246,2246,2246,2246,2,2246,2246,2246,2,2246,2246,2,2246,2,2,2246,2246,2246,2246,2246,2,2246,2246,2246,2,2246,2,2,2,2246,2246,2,2246,2,2,2246,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2246,2246,2,2246,2246,2246,2,2,2246,2246,1108,1108,2,2,2,2,2246,2,2,1187,2,2,2,2,1187,2,2,2,2,2,2,2},
+ {2833,2005,387,733,562,468,317,224,94,478,1606,2522,1606,2001,1087,2,2,1087,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2247,2496,811,776,385,94,119,1880,1383,1250,2421,4,4,4,4,2,2,2406,1569,2,2,2,2,1569,2,2,2,2,1569,1569,1569,1569,1569,1569,1569,1569,1569,1569,1569,1569,356,356,1569,1569,2,1569,2,1569,1569,1569,1569,356,356,356,356,1569,1569,1569,1569,1569,1569,1569,2,1569,2,2,1569,2,1569,2,2,2,1569,1569,2,2,1569,1569,2,2,2,2,2,2,2,2,2,2,2,2,1569,1569,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1569,1569,2,2,2,2,2,2,2,1569,1569,1569,1569,1569,1569,1569,1569,1569,2,2,2,1569,356,2,356,356,356,1569,2,1569,2,1569,1569,1569,1569,1569,1569,1569,1569,1569,1569,1569,1569,1569,1569,1569,1569,1569,1569,2,2,2,2,1569,1569,1569,1569,1569,1569,1569,356,1569,2,356,356,2,2,2,2,356,356,356,356,1569,1569,2,2,2,356,356,356,1569,1569,1569,356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,356},
+ {2920,2732,2654,1237,952,933,709,783,205,481,1763,966,966,3255,3255,2,2,1114,1114,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2281,2281,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3165,1977,628,168,1015,1174,954,1911,1211,2463,1624,563,233,1660,2424,677,677,677,677,677,677,2,2,2,2,677,677,646,646,646,646,646,646,646,646,646,2353,2,2353,2,2353,2,646,2353,677,677,2,2353,2353,2,2,2,2353,2353,2,2,2,2,2353,2,646,2,2,2353,2353,2353,2,2,2353,2353,2353,2,2353,2,2,2,2,2,2,2,2,2,2,2,2353,2,2353,2,2,2,2,2,2,677,677,2,2353,2353,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2353,2,2,2,2,2,2,2353,2353,2353,2353,2353,2353,2,2353,2353,2353,2353,2353,2353,677,677,2,2353,2,2,2,2,2,2,2,2,2,2353,2353,2353,2,2,2,2,2,2353,677,677,677,2,2353,677,677,2,2353,2353,2,2353,2353,2,2,2,2,2,2,2353,2353,2353,2353,2353,2353,2353,2,2,2,2,2353,2353,2353,2353,2,2,677,2,2353,2,2,2,2353,2353,677,677,2353,677,677,2,2353,2353,2353,2353,2353,2353,2353,2353,2353,2,2353,677,677,677,677,2353,2,2,2353,2353,2353,677,2,2353,2,677,2,2353,2,2},
+ {2953,1059,205,3093,138,132,2148,1345,1499,216,151,1296,2446,1610,1632,2,2,2,2,4,4,2,2,2,987,987,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2286,1503,3217,2108,596,3099,729,2171,1337,938,99,869,245,245,33,2,2,2,2,2,2,398,398,398,2,2,2,2,2,2,2,2,398,398,2,2,2,2,2,2,2,2,398,2,2,2,2,2,2,2,398,398,2,398,398,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,398,2,2,2,2,2,2,1116,2,1116,1116,1116,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1116,1116,2,2,398,398,398,2,2,2,2,2,2,2,2,2,2,2,2,2,1116,2,1116,1116,398,398,398,398,398,398,398,398,398,398,398,2,2,398,2,2,2,1116,1116,1116,1116,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,398,2,1116,1116,2,2,2,2,2,2,1116,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1116,1116,615,2,615,398,398,615,615,615,398,398,1116,1116,398,398,615,2,2},
+ {3199,1431,593,2050,2785,507,1540,1103,1740,459,62,1766,1781,1121,1600,2,1600,1600,125,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,208,2,2,2,2,2,2,2,890,2,2,2,2,2,682,682,2,682,682,2,682,682,682,682,682,682,682,2,2,2,2,682,2,2,2,2,2,2,2,890,890,890,890,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,890,682,682,682,682,890,2,2,682,890,890,890,2,2,2,2,2,2,2,2,2,2},
+ {3244,1981,1089,1377,860,1568,2257,1890,1050,1179,1334,1049,957,888,393,2587,2587,2029,2029,2029,2,2,2,2,2,580,161,2,2,1150,2,1605,1331,2,2,2,2,2,2,2,2,1331,1331,1331,1331,1331,1331,1331,1331,2,2,1331,2,2,2,2,2,2,2,1331,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1331,2,2,2,2,2,2,2,2,2,2,2,2,2,1331,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1331,1331,2,2,1331,1331,2,1331,1331,1331,2,2,2,2029,2,2,1331,1331,1331,1331,1331,2,1331,1331,1331,2,1331,1331,2,2,1331,1331,1331,1331,2,1331,1331,1331,1331,2,1331,1331,1331,2,1331,2,2,2,2,2,1331,2,1331,1331,1331,2,2,2,1331,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1331,2,2,2,1331,1331,1331,2,1331,1331,2,2,2,2,2,1331,2,2,1331,2,2,2,2,2,2,2,2,1331,1331,2,2,2,2,2,2,1331,2,2,2,2,2,2,2,2,2,1331,2,2,2,2,2,2,1331,1331,2,1331,2,2,1331,1331,1331},
+ {2258,1714,415,373,1919,2605,693,827,1918,496,1479,1903,86,1083,415,2,2,38,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,436,2780,436,436,2,2,2,2,2,436,436,2,2,2,2,2,2,2,2,2,2,436,436,436,436,436,436,436,436,1879,436,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,436,436,436,2,2,436,2,436,2,2,2,2,2,2,2780,2780,2780,2780,2780,2780,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1879,2,2,2,1879,1879,1879,436,436,436,1879,1879,1879,1879,1879,1879,1879,1879,1879,1879,1879,2,436,436,436,436,436,436,436,436,436,436,436,436,2,2,2,2,2,2,2,2,2,2,2,436,2,2,2,2,1879,1879,1879,1879,1879,2,2,2,436,2,2,436,436,436,436,436,436,436,436,436,436,436,436,2,2,436,2,2,2,2,2,436,436,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,436,2,436,436,436,436},
+ {3216,628,748,1165,930,2158,369,79,2773,1095,1357,2586,2586,2205,2205,2205,2205,2586,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,334,334,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,334,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,334,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3289,2032,329,2169,2323,1599,517,1704,1847,804,632,40,40,40,40,40,40,40,40,2,2,1600,2,2,1600,2,2,2,2,2,2,2,2,2,2,2,2,2,2,963,1600,2,2,1600,1600,2,2,1600,1600,1600,1600,1600,1600,1600,1600,2,2,963,2,2,2,2,2,445,2,2,2004,2004,2004,2004,2004,2004,2004,2004,2004,2004,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,963,2,2,2004,2004,445,445,445,445,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,963,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2180,3153,1530,1799,1734,511,2146,400,802,1568,353,2565,2565,1282,1282,1282,1282,2,2,2,2,2,2,2,2,2,2,2,2,2,2052,2052,2,2,2,2,472,2,2,2,2,2,2,2,2,2,2,2,2,2,472,472,472,472,472,472,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1427,1427,1427,1427,1427,1427,2,2,2,2,1427,1427,2,1427,1427,1427,2,2,472,963,2,2,1427,1427,1427,2,472,472,472,472,472,2,1427,1427,1427,1427,2,1427,1427,1427,2,1427,472,1427,1427,1427,1427,1427,2,1427,1427,1427,472,1427,1427,472,472,2,1427,2,2,2,472,472,472,472,472,472,2,2,1427,2,472,472,2,2,2,1427,1427,1427,1427,1427,1427,1427,472,472,472,472,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1427,472,472,2,2,2,2,1427,1427,1427,1427,1427,1427,2,1427,2052,2052,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1427,1427,1427,2,2,2,2,1040,2,2,2,1427,1040,2,1040,1040,2,2,1040,1040,1427,2,2,2,2,2,2,2,2,472,2,1427,2,1427,2,2},
+ {2165,2725,2293,368,705,3063,494,103,12,1332,175,2331,3144,2165,1709,1709,2090,2,2,2,2,1363,1363,2,566,2,2,2,2,2,2,2,1670,1670,2,1670,1670,1670,2,2,1670,1670,1670,1670,2,1670,1670,2,1670,1670,1670,2,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,2,1670,1670,1670,1670,1670,1670,566,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,566,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,566,566,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,2,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,566,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,566,566,566,1670,2,2,2,1109,1109,1109,1109,1109,445,445,445,445,445,445,445,445,445,445,445,566,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,1670,566,566,566,566,566,2,566,566,566,566,445,445,566,566,566,566,445,566,566,566,566,566,566,2,566,566,566,566,566,566,566},
+ {2290,1042,276,872,642,603,1633,2704,978,2858,930,208,208,1091,1091,3443,245,2,2,2,245,245,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2882,2900,1219,1979,2296,361,1171,2061,1078,2232,2222,1109,1109,1788,2698,1380,2102,2,2102,2102,2,2102,2102,2102,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,623,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2102,2102,2102,2,2,2,2,2,2,2,2,2102,2,2,2,2,623,2,2,2,2102,623,623,623,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2102,2,2,2,2,623,623,2102,623,623,2,623,623,623,623,2,2,2,623,2,623,2,2,2102,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2102,2,2,2,2,2,2,2,2,2,2,2,2102,2102,2,2,2,2,2,2,2,623,623,2,623,623,2,623,623,2,623,623,623,623,623,2,623,623,623,2,2,623,623,623,2102,623,2,623,2102,2102,2102,623,2102,2,2,623,623,2,623,623,2,2,2,623,623,623,623,623,623,623,623,623,623,623,623,623,623,623,623,623,623,623,623,623,2102,1109,623,92,92,92,2102,2102,1109,1109,1109,1109,1109,623,2102,2102,2102,623,623,623,623,2,2,623,623,623},
+ {2300,1070,2169,2540,734,1002,912,1386,2215,224,1285,880,2052,2052,1301,959,563,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,894,2,2,2,2,894,894,894,894,894,894,894,894,2,894,2,2,894,894,894,2,2,2,2,2,894,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1120,1120,2,1120,1120,2,2,2,2,2,2},
+ {3292,1037,1080,993,1162,921,1618,2587,897,3059,2578,932,932,633,789,186,85,2553,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2553,2553,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2553,2553,2,2,2,2,2,2,2,2,2,2553,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2553,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2553,2,2,2,2553,2553,2,2553,2553,2553,2553,2553,2553,2553,2,2553,2553,2553,2553,2553,2,2553,2553,2553,2,2553,2553,2553,2553,2,2,2,2,2553,2553,2553,2553,2553,2553,2553,2553,2553,2553,2553,2553,2553,2553,2553,2,2,2553,2553,2553,2,2,2,2,2,2,2553,2,2,2,2,2,2,2553,2553,2,2553,2553,2,2553,2,2,2,2,2553},
+ {3056,2180,3012,408,768,1019,1699,2418,88,236,1934,178,89,89,89,321,1180,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1812,1812,1812,2,2,1812,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1812,2,2,2,2,2,2,2,2,1812,1812,2,2,2,2,2,2,2,2,2,2,2,2,1812,1812,2,2,2,1812,1812,1812,2,1812,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1812,1812,2,1812,1812,1812,2,2,1812,2,2,2,2,2,2,2,1812,1812,1812,1812,2,2,2,1812,1812,1812,1812,2,1812,1812,2,2,2,2,1812,1812,1812,1812,1812,2,2,2,2,2,1812,1812,1812,1812,1812,1812,1812,1812,1812,1812,1812,1812,2,2,1812,1812,1812,1812,2,1812,1812,1812,1812,1812,1812,1812,1812,1812,1812,1812,1812,1812,1812,1812,1812,1812,1812,1812,1812,1812,1812,1812,2,2,2,2,2,2,2,2,2,2,1812,1812,1812,1812,1812,2,1812,1812,2,2,2,2,2,2,2,2,2,2,2,2,1812,2,2,2},
+ {3267,1852,1037,648,611,1250,432,853,1467,179,715,2,2033,841,2607,2607,2607,2607,2,2,2,2,1874,1874,2,1874,899,2,2,2,2,2,2,899,2,2,2,1874,1874,1874,1874,2,2,2,1874,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1874,1874,1874,1874,2,2,2,2,2,2,2,2,2,2,2,1874,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1874,1874,1874,2,2,2,2,1874,1874,2,1874,2,2,2,2,2,2,1874,899,1874,1874,2,2,2,1874,2,2,1874,1874,1874,1874,2,2,1874,1874,1874,2,2,899,899,899,899,2,899,899,899,899,899,2,1874,1874,1874,1874,1874,1874,983,1874,1874,2,2,899,1874,1874,2,1874,1874,983,1874,1874,1874,983,2,2,2,983,983,1874,1874,983,983,983,983,1874,1874,1874,1874,1874,1874,1874,1874,1874,1874,1874,1874,983,983,983,983,983,983,983,983,983,983,983,983},
+ {2901,2115,2771,1709,1398,1766,286,829,686,3018,89,2,667,1780,399,399,2,399,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1362,2,2,2,2,1362,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3068,1521,514,1664,1844,3890,1170,1091,2739,15,535,2,3345,1651,1651,1595,2,2,2384,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,89,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,89,89,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,89,89,89,89,89,89,89,89,89,2,2,2,2,2,2,2,2,2,2,2020,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2020,2,2,2,2020,2020,89,89,89,2020,2020,2020,2020,2,2,2,2,2,2,2,2,89,2,2,2},
+ {2304,1840,264,171,928,320,231,200,248,1051,817,2,1789,837,837,912,2,2,507,507,2,1875,2760,2,2,1875,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1875,1875,1875,1875,1875,1875,1875,1875,1875,1875,1875,2,1875,1875,1875,1875,1875,2,1875,1875,1875,1875,1875,1875,1875,1603,1603,1603,1875,1875,1875,2,2,507,507,1875,1875,1875,1875,1603,1603,1603,1603,1603,1603,2,1603,1603,1603,1603,1603,1603,1603,1603,1603,1603,1603,1603,1603,1603,1603,1603,1603,1603,1603,1603,2,1603,1603,2,1603,2,2,1603,1603,2,2,1603,1603,1603,1603,1603,1603,1603,1603,1603,1603,1603,1603,2,1603,1603,2,2,2,2,2,2,2,2,2,2,2,1603,1603,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1875,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1603,2,2,2,2,2,2,2,2,2,2,1875,2},
+ {3038,2399,1450,1276,1222,727,552,646,1055,2351,686,63,252,504,3166,1802,2,2,1165,1165,1165,2,2,2,2,1165,1165,1165,2,2,1165,2,2,2,2,2,2,2,2,2,2,2,2,2,1165,1165,1165,1165,1165,1165,1165,2,1165,1165,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1165,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1165,2,2,1165,1165,2,1165,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1165,1165,2,2,2,2,2,2,2,2,1165,2,2,2,2,2,2,1165,1165,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1165,2},
+ {2351,895,559,487,668,1149,3552,761,479,935,1756,2,2530,2530,2092,75,2,2,738,738,738,2,2,2,738,738,738,738,2,738,738,2,2,2,738,738,738,738,2,2,1943,738,2,2,738,2,2,2,2,738,2,2,2,2,2,2,1943,1943,738,1943,1943,1943,1943,1943,1943,1943,738,1943,1943,1943,1943,2,2,1943,2,2,2,2,1943,1943,1943,1943,1943,1943,1943,1943,1943,1943,1943,2,2,2,2,2,1943,1943,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2684,2684,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3038,2519,1494,107,2597,802,535,1669,1695,1928,1940,1580,1580,85,2274,1551,2,2,2431,560,560,560,2,2,1098,2,2,2,2,2,2,2,2,2,2,522,522,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1098,1098,1098,2,2,1098,1098,1098,2,2,2,2,738,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3040,1044,1927,1952,1479,3124,1373,1990,588,2550,1277,2,629,2671,1842,2712,840,1702,2,1669,2,1347,2,2,2,2,1669,1669,1669,1669,2,1669,1669,1669,1347,1669,1669,2,1669,1669,1669,1669,1669,1669,1669,1669,1347,1347,1347,1347,1347,1347,1347,1347,1347,1347,1702,1702,1347,1347,1347,1702,1702,1347,1347,1347,1347,1702,1347,1347,2,2,2,2,2363,2,2,1347,1347,1347,1347,1347,1347,1347,1347,1347,1347,2363,2363,2363,1347,2363,2363,2363,2363,2,175,2,2,2,1572,1572,1572,2,1347,1347,1347,2,2,2,1347,1347,1347,1347,2,2,2,1347,1347,1347,1347,1347,2,2,1347,1347,1347,1669,1669,1347,1347,1347,1347,1347,1347,1347,1347,1347,1347,1347,1347,1347,1347,1347,1347,2,1347,2,1347,1347,1347,1347,1347,1347,1347,2,2,2,2,2,2,2,1347,2,2,2,2,2,2,1347,426,426,175,175,175,175,175,2,2,2,1347,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1347,1347,2,1347,2,2,2,1347,1347,1347,1347,1347,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2430,2849,3235,1857,2527,2042,720,817,250,1416,3197,2,2026,2026,2026,2628,2628,2628,2,2,2,1910,2,2,2,2,2581,2581,2,2,2,2581,2581,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1910,1910,2,2,1910,1910,1910,1910,1910,2,1910,1910,1910,1910,1910,2,1910,1910,1910,2,2,2,1910,1910,2,1910,1910,2,155,155,155,155,155,155,2,2,2,2,2,2,2,2,2,2,2,155,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1910,155,2,2,1910,1910,1910,1910,1910,2,2,2,2581,2581,2581,2581,2581,2,2,2,2,2,2,1910,2,1910,1910,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1910,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3312,1276,1851,912,3548,665,1170,3248,72,748,598,2,2753,2753,1922,2031,185,185,2,2,824,2,2,2,2,2,1964,1964,1964,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2061,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2061,2061,2,2,2,2,2,1964,2,2,2,2,2,2,2,2,1964,1964,1964,2,1964,1964,2061},
+ {3044,1494,980,316,702,1657,225,3021,1936,838,436,1014,1014,907,907,907,907,478,478,2,2,2,2,2,2,478,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,478,478,778,778,778,778,778,2,2,2,2,2,2,2,778,778,778,778,2,778,778,778,778,778,778,778,778,778,778,778,778,778,778,778,778,778,478,778,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,478,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,778,2,2,778,2,2,2,2,2,2,778,778,778,778,2,2,778,778,2,2,2,778,778,778,778,778,778,778,778,778,778,778,778,778,778,778,2,778,778,778,778,778,778,778,778,778,778,778,778,778,778,778,778,778,778,778,778,778,778,778,778,778,778,778,778,778,778,778,778,2,778,778,778,778,2,778,778,778,778,778,778,778,778,778,778,778,778},
+ {3056,1567,691,1243,653,751,248,842,1954,480,458,2,2,2451,934,3172,3556,2259,2312,2,2562,2562,2,2,2562,2562,2562,2562,2562,2,2,2,2,2,2,2562,2562,2562,2,2,2,2,2,2,2,2,2,2562,2562,2562,2562,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2562,2562,2,2,2,2,2,2,2562,2562,2562,2562,2,2,2,2,2,2,2,2,2,2,2562,2562,2,2,2562,2562,2,2,2,2,2,2,2,2,2,2,2562,2562,2,2,2,2,2562,2,2,2,2,2,2,2,2,2,2,2,2,2562,2,2,2,2,2562,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2245,639,1016,262,2452,78,144,833,204,725,2849,2,2,2014,2578,2959,369,2,371,371,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,796,796,796,796,2,2,796,2,2,2,2,2,2,2,2,2,796,2,2,2,2,2,2,2,2,2,2,2,796,796,796,2,2,2,2,2,2,2,2,2,2,2,796,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2959,2553,1333,877,2492,3169,2498,686,2030,2820,3233,1313,1313,1471,1471,1471,1471,2,2,1471,1471,2,2,1481,2,1887,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1471,1471,2,2,2,1471,2,1471,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1788,1788,1788,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1471,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2963,1521,3059,344,62,1511,805,73,1550,2603,1312,2,2,910,1651,1411,2484,2,2,2,2147,2554,2,2554,2,2,2,2,2,2,2,2,2,2,2,2,2,564,564,564,2,564,564,564,564,564,2,564,564,564,2,1584,1584,564,564,564,2,2,2,2,2,2,564,1584,1584,1584,564,564,564,564,564,564,2,564,564,1584,564,1584,1584,1584,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,1584,1584,1584,1584,1584,1584,2,2,1584,1584,1584,1584,1584,1584,1584,1584,1584,1584,1584,1584,799,799,799,799,799,2,2,799,799,799,799,1584,1584,1584,1584,1584,1584,1584,1584,1584,1584,1584,1584,1584,1584,1584,1584,564,564,564,564,564,564,1584,564,564,564,1584,564,564,564,564,564,564,564,564,564,564,564,564,564,564,799,799,799,2,2,564,564,564,564,1605,1605,1605,1605,1605,1605,1605,799,1605,1605,1605,1605,1605,1605,1605,1605,1605,1605,1605,1605,1605,1605,564,2,1605,1605,1605,1605,2,2,2,2,564,564,2,564,564,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,564,564,2,2,2,564,2,2,2},
+ {2967,607,789,2376,2598,1067,327,363,854,1123,112,2,2,1895,2706,1313,2185,676,676,676,2,2,799,799,799,2,2,1765,799,799,799,2,2,2,2,2,2,2,2,2,2,2,799,799,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3396,1321,2380,1528,570,1064,1443,2214,3219,1167,1943,1715,1715,1715,1715,1715,1096,1096,1096,1147,1096,2,2,1096,1096,1096,1096,1096,2,2,2,2,2,2,2,2,2,2551,2551,1096,2551,2551,2551,1096,1096,2551,2551,2551,2551,1096,2,1096,1096,2551,2,2551,2551,1096,2551,2551,2551,1096,2551,2551,1096,1096,1096,2,2,2,2,1096,1096,1096,1096,1096,1096,1096,1096,2551,2551,2551,2,2,2551,2551,2551,2551,2551,2551,2551,2551,2551,1096,1096,1096,1096,1096,2551,2551,2551,2551,1096,1096,1096,2,2551,2551,2551,2,2551,2,35,2551,2,2,2,2,2,2551,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2551,1096,1096,1096,1096,2,1096,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2551,2551,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2977,924,2286,507,1083,660,3500,152,2838,986,2507,2875,2875,2875,1269,2351,1310,1310,655,2,655,2,2,2,2,2,1263,1263,1263,1263,1263,2,2,2,2,2,2,2,2,128,128,128,512,512,8,512,512,2,2,2,1007,1007,512,128,128,128,128,128,1612,1612,1612,1612,1612,1612,1612,1612,1612,1612,1612,1612,1612,1612,1612,1612,1612,1612,1612,1612,1612,1612,1612,1612,1612,1612,1612,1612,1612,1612,2875,1612,1612,1612,1612,1612,1612,1612,1612,1612,2,2,1007,1007,1612,1612,1612,1612,1612,1612,1612,1612,1612,1612,1612,1612,1612,1612,1612,1612,1612,1612,1612,1612,1612,1612,1612,1612,1612,2875,2875,2875,1612,1612,1612,1612,1612,1612,1612,1612,1612,1612,2744,2744,1612,1612,1191,1542,1534,241,241,241,403,2774,2145,2145,403,403,403,403,403,2145,403,2875,2145,2145,2145,2197,403,2197,2197,2197,2197,2197,1612,1612,1612,1612,1612,1612,1612,1612,785,785,785,785,785,785,785,1612,1612,1612,1612,1612,1612,1612,1612,1612,1612,1612,1612,1612,1612,1612,1612,1612,1612,1612,1612,785,785,785,785,785,785,785,785,585,585,585,585,585,585,1612,1612,1612,1612,1612,1612,1612,1612,1612,585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,1612,785,585,585,585},
+ {3362,2797,1263,2886,845,2348,2064,2913,44,1990,2013,2,2,2,991,1024,1024,3074,1988,1988,1988,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2379,3034,166,302,2108,1078,2976,68,158,134,1567,2,2,1514,1514,1514,1883,1883,2,2,1883,1883,1883,1883,1883,1883,1883,1883,1883,2,2,2,2,2,2,2,2,2265,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2265,2,2,2,2,1883,2,1883,1883,2,2,2,2,2265,1883,2,2265,2265,2265,2265,2,2,2,1883,2,2,2,1883,1883,1883,1883,1883,1883,1883,1883,1883,2265,2265,2265,2265,2,1883,1883,1883,1883,1883,2,2,2,1883,1883,2265,2265,2265,2265,2265,2,2,2265,1883,1883,1883,2,2,2,2,1883,1883,1883,1883,1883,1883,1883,2265,1883,1883,1883,1883,1883,1883,1883,1883,1883,1883,2265,2265,2265,2265,2265,2265,2265,2265,1883,1883,1883,1883,1883,2265,1883,2265,2265,2265,2265,2265,1883,2265,2265,1883,1883,1883,1883,1883,1883,1646,1883,1883,2265,2265,2265,2265,2265,2265,2265,2265,2265,2265,2265,2265,2265,2265,2265,2,2265,2265,2265,1646,2,1646,1646,2265,1883,2265,2265,2265,2265,2265,2,2,2265,2265,2265,1883,1883,1883,1883,1883,2,1883,1883,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2471,2471,2,1646,1646,2471,2,2,1883,2,2,2,1646,1646,1646,1646,2265,1646,1646,2265,1646,2265},
+ {2286,1268,1670,879,2377,993,363,1212,212,1282,3002,2,2,2,2,483,1872,483,2154,2154,2774,2154,2154,2154,2154,2154,2,2,2,2,2,1492,1492,1492,2774,2,2,1492,1492,1492,1492,2,2,1492,1492,1492,1492,2154,2,2,2774,1492,2154,2154,2154,2154,2154,2154,2154,2154,2154,2,2154,2,2,2,2,2,2,1492,2,2,2154,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2774,2,2,2,2,2154,2154,1492,2154,2,2,2154,2154,2154,2154,2,2,2,1492,2,2,2,2,2,2,2,2,1492,1492,1492,2,2154,1492,1492,2154,2154,2154,2154,2154,2154,2,2154,2,2154,2154,2,2154,2154,2,2154,2154,2154,2154,2154,2154,2154,2,2,2,2,2,2,2,2,2154,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2154,2154,2154,2154,2154,2154,2154,2154,2154,2154,2154,2,2,2154,2154,2,2154,2154,2,2,2,2,2,2,2,2,2,2154,2154,2154,2154,2,2,2,2,2,2,2,1492,1492,1492,1492,2,2,1492,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2386,1270,1204,1032,1474,224,496,2296,1536,1219,311,2,2,2,2,1238,2108,2108,2108,2108,2108,2108,2108,2108,1444,1444,1444,1444,1444,1444,1444,2,1444,1444,1444,1444,1444,2,2,2,2,2,2,1444,2,2,2,2,2,2,1444,38,38,38,38,485,485,485,485,485,485,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1444,2,2,2,2,2,2,1444,1444,1444,1444,1444,1444,1444,1444,1444,1444,1444,1444,1444,2,1444,1444,1444,2,2,1444,1444,1444,1444,2,1444,1444,2,2,2,2,1444,1444,1444,1444,2,2,2,1444,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1444,1444,1444,1444,1444,1444,2,2,2,2,2,1444,1444,1444,1444,1444,1444,1444,1444,1204,2,2,2,2,2,2,2,2,1444,1444,2,2,2,2,2,2,2,1452,2,2,2108,1444,1444,2,2,473,473,166,473,473,473,492,2080,492,1204,1204,2,1204,166,1204,1204,1204,38,1204,1444,1444,1444,1444,1444,1444,300,300,38,38,38,300,300,300,38,38,38,1204,1204,300,300,300,300,38,485,485,485,485,2108,2108,1204,1204,485},
+ {2393,1288,306,720,1909,212,3187,1652,486,1612,1747,1659,1659,1659,1659,1659,1627,1627,152,289,170,2,289,560,560,560,560,560,560,560,2,560,3550,2,3550,2,3550,3550,289,289,289,289,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,152,152,2,2,152,2,2,2,2,2,2,2,2,2,2,2,2,2,289,2,2,2,2,2,2,2,152,152,152,2,152,152,2,2,1659,152,152,152,152,2,2,152},
+ {3003,2560,1826,781,864,2791,1573,2539,2738,2560,2795,2,2,2,2,2,669,669,1660,1624,2943,2943,1794,1794,1794,1794,1794,1794,1794,1794,1794,1794,1794,1794,1794,1794,1794,1794,1794,2,2,2,2,2,2,2,2,2,2,2,3654,2,2,2,3654,3654,3654,2,2,3654,3654,3654,3654,3654,2,2,2,2,2,2,2,1794,1794,1794,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1794,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2431,739,2488,1386,1632,2107,2602,2139,1751,349,3147,2,2,64,16,8,32,4,4,32,728,728,728,728,2,2,64,16,8,180,180,180,180,180,180,364,45,45,45,728,1533,364,364,364,364,728,728,364,364,364,364,1440,1440,1456,1456,557,476,476,476,826,238,238,119,119,119,238,119,119,119,119,952,1009,119,119,721,721,45,45,1440,1533,728,728,364,214,714,2455,3141,214,107,107,107,3751,3751,1629,2137,2137,1343,1343,1343,1343,1343,1343,1343,1343,1343,2137,357,2137,2613,2613,2613,2613,2613,3453,61,61,61,3453,1285,1285,1285,1285,1285,383,383,3453,3453,3453,119,119,238,119,119,119,119,1009,1009,119,119,3357,721,3357,3357,2423,2423,2423,1952,1952,1532,605,605,605,605,605,605,605,486,486,486,486,486,486,486,486,1146,1146,1146,1146,214,214,214,214,214,214,214,214,2455,3141,214,107,107,107,689,3751,1629,3888,3888,1343,1343,246,332,1875,83,83,83,1718,1718,1718,2203,2203,2203,2203,333,1418,1418,1418,2638,2638,2638,1447,664,2638,664,664,664,2519,1718,166,166,166,166,621,621,937,166,166,2613,2613,166,166,166,166,61,61,3453,1285,1285,1285,1285,1285,383,383,3453,3453,3453,3453,3797,3797,3797,3797,1811,1811,1811,2608,1549,1549},
+ {2287,740,1265,1600,629,2606,1636,3234,1013,285,938,2,2,2,2,2,1799,2747,2747,2563,2398,2398,1353,1353,1353,1353,1353,1353,1353,2398,2398,2398,2,1353,1353,2185,2185,871,871,871,871,871,2398,2398,1353,1353,1353,2398,1353,657,2398,2398,2398,2398,2398,2185,2185,2185,2185,2185,2398,2,2,2,2398,1353,2398,2398,2398,2398,2398,2398,2398,2,2,2,2,2,2,2,2,2,2185,2398,2,2,2398,2398,2398,2398,2,2398,2398,2398,2398,2398,2398,2398,2398,2398,2398,2398,1353,2,2,2398,2398,1353,2,2,2,2,2,1353,1353,1353,1353,1353,1353,2398,2398,2,2398,2398,1353,1353,1353,1353,2,2398,2398,1284,2185,1353,1353,2398,1353,1353,2398,1353,2398,1353,2,1353,2,2,1353,682,1353,1353,682,682,682,682,1353,1353,1353,682,2185,2185,1353,1353,1353,1353,2,2,871,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,2398,2398,1353,1353,1353,2398,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,2,1284,1284,1284,1353,2,2,2,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,1353,657,657,657,657,657,657,657,1353},
+ {3139,519,716,3260,1763,1454,3070,2470,1889,979,645,2745,2745,2745,1798,1798,1798,1798,2718,1609,1579,1420,1420,2094,1420,1420,2094,2094,2094,2,2,2,2,2,2,2,2,975,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2094,2094,2,2,2094,2094,2094,2094,2094,2094,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2094,2094,2,2,2,2,2,2,2094,2094,2094,2094,2094,2094,2,2,2,2,2094,2,2,2,2,2,2,2,2,2,2,2,2,2,2094,2094,2094,2,2,2,2,2,2,2,2,2,2,2,2,2,2094,2,2,2,2,2,2,2,2,2,2094,2094,2094,2094,2094,2094,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2094,2094,2,2,2,2,2,2,2,2,2,2,2},
+ {2428,2233,1420,270,3560,221,1568,213,1946,1404,430,2,2,2,2,3252,631,1642,1345,1270,567,2,2,814,814,814,814,814,2,2,2,2,814,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1159,2,2,2,2,814,2,2,814,814,2,2,2,2,814,814,814,814,2,814,814,2,814,814,814,814,814,2,2,2,814,814,814,814,814,814,814,814,814,814,814,2,814,814,814,814,814,814,814,814,814,814,2,814,814,814,814,814,814,814,814,814,814,814,814,814,814,814,814,814,814,814,814,814,814,814,814,814,814,814,814,814,814,2600,2600,2600,2,2600,814,814,814,814,814,814,2600,2600,2600,814,814,814,814,814,814,814,814,814,814,814,2,814,814,814,814,814,814,2,814,2,2,2,2,814,2,2,2,2,2,2,2,2,2600,2,2600,2600,2600,1159,2,814,1159,1159,1159,1159,2,1159,1159,2,2,1159,1159,1159,2,1159,1159,2,2,2,2600,2600,2600,2600,2600,2600,2600,2600,2,2,2,2,2,2,2,2,2,2600,2600,2600,2,2,2600,814,814,2600,1159,1159,1159,1159,1159,1159,2,2,2,2,2,2,2,2,2,2,2,2,814,814,814},
+ {3452,1687,2969,2249,278,1777,2246,3491,934,1490,969,2,2,2,3251,935,1686,1686,1686,712,712,558,2,2,712,712,712,712,2,2,712,712,2,712,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,712,2,2,578,578,712,2,2,712,712,2,712,712,712,712,2,2,2,712,712,712,712,712,712,712,712,712,712,712,712,712,712,712,712,712,2,712,712,712,712,712,2,2,2,712,712,712,712,712,712,712,712,2,712,712,712,712,712,712,712,712,712,712,712,712,712,2,712,712,712,712,712,712,712,712,2,2,2,712,2,712,712,2,2,2,2,2,712,712,2,2,2,712,2,2,712,712,712,712,712,712,712,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,712,2,2,2,712,712,712,2,2,2,2,2,2,2,712,712,712,712,712,712,712,712,712,712,712,712,712,712,712,712,712,712,712,712,712,712,712,712,712,712,712,2,712,712,712,712,2,2,2,712,712,712,712,712,2,712,712,712,712,712,712,712,712,712,712,712,712,712,712,712,712,712,712,712,712},
+ {3157,1230,685,1513,663,1335,2100,1441,1826,1670,1539,2,2,2,2899,2899,1378,54,2,46,46,2,2,1362,1362,2,2,2,2,2,2,2,2,2,2,1362,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1362,1362,2,1362,2,1362,1362,2,1362,1362,1362,1362,2,1362,1362,1362,1362,1362,1362,1362,1362,1362,1362,1362,1362,2,1362,1362,1362,2,2,2,1362,1362,2,2,1362,1362,1362,2,1362,1362,2,2,2,2,1362,1362,1362,1362,1362,1362,1362,1362,1362,1362,1362,1362,1362,1362,1362,1362,1362,1362,1362,1362,1362,1362,1362,1362,1362,1362,1362,1362,1362,1362,1362,1362,1362,1362,1362,1362,1362,1362,1362,1362,1362,1362,1362,1362,1362,1362,1362,1362,1362,1362,1362,1362,1362,1362,1362},
+ {2407,1424,989,848,1496,710,713,2778,947,2172,295,2,2,2,417,321,1507,1507,1507,3180,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2311,2385,967,2125,611,428,983,418,97,11,1971,2,2,2,136,2524,1341,1341,1341,2,2,1341,1341,2,1341,1341,1341,2349,1341,2,1341,1341,1341,1341,2,2,2,1897,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1341,1341,1341,2,2,2,2,2,2,2,1341,1341,1341,1341,1341,1341,1341,1341,1341,1341,2,1341,1341,1341,1341,1341,1341,1341,1341,2,2,1341,1341,1341,2,2,2,2349,1341,1341,1341,2,1341,1341,1341,2,2,2,2,2,2349,2,2,2,2,2,2,2,1341,2,2,2,2349,2349,2349,2,2,2,2349,2349,2,2,2,2,186,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,186,186,2,2,2,2,2,2,2,2,2,2,2,2,186,2,2,186,186,186,186,2,2,2,186,186,2,2,186,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1341,2,2,2,2,2,2,186,2,2,2,186,2,2,2,1341,1341,1341,1341,1341,1341,2,2,1341,1341,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2432,782,2478,2428,250,1111,1586,45,526,618,1242,2,2,2018,266,1342,265,265,265,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1745,1745,2,1745,2,2,1745,1745,1745,1745,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1745,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2457,2111,1929,2300,1182,612,2969,270,2062,2297,131,2,2,1968,1497,1157,1157,2,2,2234,2234,2234,2234,2234,2234,2234,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3243,1411,909,170,533,1548,181,403,1224,90,1243,3330,3330,1657,1657,1657,1657,2,2,595,1657,1657,1657,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2455,2,2,2455,2455,2455,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,8,2,2,2,317,1443,32,32,32,3031,3031,32,32,1305,32,875,875,875,875,875,875,875,875,875,2,875,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2463,2664,2825,1208,882,629,428,428,356,343,1730,2,769,769,769,1714,769,2,2,955,769,2,2,955,955,955,2,2,2,955,955,955,2,955,955,2,955,955,955,2,955,955,2,2,2,2,2,955,769,2,2,2,2,769,769,955,955,955,955,2,769,955,955,2,2,2,955,955,2,2,2,769,2,2,955,955,955,2,955,955,955,955,955,955,955,955,955,955,769,955,955,2,955,955,955,955,955,955,955,2,955,955,955,955,2,2,955,955,955,2,2,2,2,955,955,955,955,955,955,955,955,955,955,955,955,2,2,955,955,955,955,955,955,955,955,955,955,955,955,955,955,2,955,955,955,955,955,955,955,955,955,2,2,2,2,2,955,955,955,769,769,769,955,955,955,955,2,2,955,955,2,2,2,2,2,2,2,2,2,2,2,2,2,769,955,955,2,2,2,2,955,2,2,2,2,2,955,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,955,2,2,2,2,2,2,2,955,955,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,955,2,2,2,2,2,2,2,955,2,2,2,2,2,2},
+ {3090,2601,190,314,1502,216,1865,1524,130,961,2128,1036,1036,1036,2298,99,2687,2485,2485,2,2,2601,1377,2,2,2,997,2,1377,1377,1377,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,997,997,997,997,2,997,997,997,997,997,997,997,2,2,2485,2485,2485,2485,2,2485,2,2,2,2,2,2485,997,2485,997,2601,2601,997,997,997,997,2485,2485,997,2,2485,2485,2485,2485,2485,2,2485,2485,2485,2485,2485,2485,2485,2601,997,997,997,1377,997,997,2,997,997,997,997,2,2,997,997,997,2,2,2,997,997,997,997,2,2,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,2,2,336,1520,1436,2809,132,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997,997},
+ {2312,980,758,1732,694,158,629,1926,427,477,1576,2,2,3470,3470,3470,3470,3470,1706,2,2141,2,2,2,2,2,2,2,2,2,2,2,2,2,2141,2141,2141,2,2141,2,2,2,2,2,2,2,2,2,2,2,2,2,112,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2141,2,2141,2,2,2,2141,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,112,2,112,2,2,112,112,112,112,112,112,112,2,2,2,112,112,112,2,112,112,2,2,2,2,2,2,2,2141,2141,112,112,112,112,112,112,112,112,112,112,2,2,2,2,2141,2141,2141,2141,2,112,112,112,112,2,112,112,112,2,112,112,112,112,112,112,112,2,112,112,112,112,112,112,112,112,112,112,2,112,112,112,2,112,112,2,112,2,2,112,112,112,112,112,112,112,2,2,112,112,112,112,112,2,112,112,2,2,2,112,112,112},
+ {3094,481,2710,1587,300,857,1509,1670,1227,1935,2620,2,1229,2070,2070,331,2557,2557,2,329,2,2,2,2267,2,2557,2557,2,2267,769,769,2,2,2557,2557,2,2,2,2,2,2,2,2,2,2,2,2,2557,2,2267,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2557,2,2,2557,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1165,1165,1165,1165,1165,1165,1165,1165,1165,2,2,2,2267,2,2,2,2,2,2267,2267,2,2,2,2,2,2,2,2,2,2,2267,2,2,2,2,2,2267,2267,2267,2267,2267,2,2267,2,2267,2267,2267,2,2,2,2,2267,2,2,2,2,2,2,2,2,2,2267,2267,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2267,2,2,2,2,2267,1140,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2453,3173,1281,806,2177,969,722,2107,2294,1458,923,2,2946,481,796,796,796,3043,2,2,2,2,2,2,267,2,2,2,2,2,2,2,2,2,2,2,2,2,2,267,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,267,267,267,267,2,2,267,2,267,2,2,267,267,267,2,267,2,267,267,2,267,267,2,267,2,2,2,2,2,2,267,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,267,267,267,2,2,2,2,2,2,2,2,2,2,2,267,267,267,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2548,872,623,700,804,472,1602,2985,631,2642,1320,2,2,1825,1825,1825,1825,3099,2,2,2,2,418,418,418,2,880,2,2,2,2,418,3370,3370,3370,3370,2,3370,418,418,2,2,2,2,2,2,2,3370,2,2,3370,2,2,2,2,2,2,2,2,2,2,418,102,2,418,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,102,3370,3370,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3094,1638,1514,843,1503,1884,1481,727,723,1319,226,2,676,2401,1699,562,639,639,1176,2,2,2,2,824,2,2,2,2,2,2,2,2,2,584,2,2,2,824,2,240,2,2,2,2,2,2,2,2,639,639,639,639,639,2,2,2,639,639,639,2,2,824,824,639,639,2,639,639,2,639,2,2,2,2,639,639,918,639,639,639,639,639,639,639,2,2,2,944,639,2,2,628,2,944,2,639,944,639,944,2,2,639,639,639,639,2,2,2,639,639,639,639,639,639,639,639,639,639,639,639,639,639,639,639,639,639,639,639,2,2,639,639,639,639,639,639,2,824,639,639,2,639,639,639,639,639,639,639,2,2,2,639,2,639,639,639,639,639,639,2,2,2,2,2,639,639,639,639,639,639,639,639,639,639,639,639,639,639,639,639,639,639,639,639,639,639,639,639,639,639,639,639,628,628,628,628,628,628,628,628,639,639,639,639,639,2,2,639,639,639,639,639,639,639,639,639,639,639,824,824,944,639,2,2,639,639,639,2,2,639,639,2,639,639,639,639,2,944,944,639,639,639,639,639,639,639,944,944,639,639,639,639,639,639,639,639},
+ {3561,2048,3154,2336,581,1221,1351,1419,3362,785,1008,861,1722,1722,2191,2189,2,2189,569,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,569,569,569,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,569,569,569,569,2,569,569,569,569,2,2,2,2,569,569,2,2,569,2,569,2,569,2,2,2,569,569,2,569,569,569,2,2,2,569,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,569,569,569,569,569,569,569,2,2,2,1463,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3461,1029,2298,1057,2177,1518,728,728,452,1270,235,2,1794,765,765,1543,2,2,610,610,2,2,2,610,610,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,464,2,2,2,2,2,2,2,2,2,2,2,2,2,464,464,464,464,2,2,464,464,2,464,464,2,2,2,2,2,2,464,464,464,464,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,464,2,2,2,2,2,2,2,2,2,2,2,2,464,464,2,2,2,2,2,2,464,464,464,2,2,2,2,2,2,2,2,2,2,464,464,2,464,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1589,2,464,464,464,464,464,2,2,2,2,2,2,2,464,464,464,464,2,2,2,2,2,2,2,2,2,2,2,2,2,464,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,883,2,2,2,464,464,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3125,2004,547,2986,2919,471,948,1747,201,1862,802,2,1238,1277,1277,1277,2,2,1245,1245,1245,2,2,2743,1245,1245,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2743,2743,2743,2,1245,1245,1245,2,1245,1245,2,2,2,2,2,2,2,1245,2,2,2,2,2,2,2,2,2743,2,1245,1245,2,1245,1245,1245,1245,2,2,2,2,2,2,2,2,2,2743,1245,2743,2743,2743,2743,2,2,2743,2743,2743,2743,2743,2743,2,2743,2,2743,2743,2743,2743,2743,2743,2743,2743,2743,2,2743,2,2,2,2,2,2,2,2,2743,2743,1245,2,2743,2743,2743,2,2743,2743,2743,2743,2,2743,2743,2743,2743,2743,2743,2743,2743,2743,2743,2743,2,1245,2,2,2,2743,2743,2743,2743,2743,2743,2743,2,2,2,1245,1245,1245,2,2,2,2,2,2743,2743,2743,2743,2743,2743,2743,2743,2743,2,2,2,2,2,2,2,2,2,2,2743,2,2743,2743,2,2,2,2,2,2,2743,2743,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1245,1245,2,2,2,2,2,2,1245,2,2743,2,2743,2743,2743,2743,2743,2743,2743,2743,2743,2743,2,2,2,2,2},
+ {3244,1348,2256,1262,586,1956,147,4014,1382,462,237,2,548,548,548,548,2,2,2,739,2,2,2,739,739,739,739,739,739,739,739,739,739,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,739,739,739,739,739,2,2,2,2,2,739,739,739,2,739,739,739,739,739,2,2,2,2,739,739,739,2,2,2,739,739,739,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2582,2469,533,1726,1575,1505,2448,2031,1257,427,588,1633,202,3553,1938,672,195,195,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,672,672,672,2,672,672,2,2,2,2,2,2,2,672,672,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3526,1264,2113,1020,2267,3486,1406,456,367,101,467,2272,2205,2205,2205,2205,2205,2205,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,269,269,269,2,2,2,2,269,113,113,2,2,2,2,269,269,113,269,269,269,269,269,113,2823,269,269,2,2,2,2,269,269,269,269,269,269,3546,269,269,269,269,113,113,113,113,113,113,2,113,2,2,2,2,113,113,113,2,2,2,113,113,113,2,2,2,2,2,2,2,2,2,2,2,269,2,113,113,113,269,269,2,2,2,2,2,2,269,113,113,113,113,113,2,2,2,2,2,2,2,2,2,113,113,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2823,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3148,954,954,397,2302,1820,762,3225,538,309,678,2575,2575,2575,2647,1938,2605,2605,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1659,2657,2,2,1659,2,1659,1659,1659,1659,1659,2,2,2,2,2657,1659,1659,1659,2,2,2657,2657,2657,2657,2657,2657,1659,1659,1659,1659,1659,1659,2657,2657,2657,2,2,2,2,2657,2657,2657,2657,2657,2,1659,1659,2657,2,2,2657,2657,2657,2,2,2657,2657,1659,1659,1659,1659,1659,1659,2657,2657,2,2,2,1659,2657,2,1659,1659,1659,1659,1659,2657,2657,2657,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2657,2657,2,2657,2657,2657,2,2,2657,2657,2657,1659,1659,1659,2657,1659,1659,1659,2,2657,2657,2657,2657,2657,2657,2657,1659,2657,2,2657,2657,2657,2,2,2,2657,2657,2,2,2,2,2,2657,2657,2,2,2,1659,1659,1659,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1659,1659,1659,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1659,1659,1659,1659,2,2,2,2,2,2,2657,2,1659},
+ {2378,636,1958,1628,1255,2285,2208,1626,719,2944,1086,1436,1436,1719,2111,655,2637,2637,2,2,2,2637,2637,2,2637,2637,2637,2637,2637,2,2637,2637,2,2637,2,2,2,2,2,2637,2637,2637,2637,2637,2637,2,2637,2637,2637,2637,2637,2637,2637,2637,2637,2637,2637,2637,2637,2637,2637,2637,2637,2637,2,2,2,2,2,2,2637,2637,2637,2637,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2637,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2637,2,2,2,2,2,2,2,2,2,2,2,2,2637,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2637,2637,2637,2,2,2,2,2,2,2,1378,2,2,2,2,2,2637,1378,1378,2637,2637,2637,2637,2637,2,2,2637,2637,2637,2637,2,2,2,2,2,2,2637,2637,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2386,1298,3667,1448,442,939,293,1459,2060,512,66,210,210,1378,1378,1378,1734,1734,2,2935,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2039,2039,2,2,2,2,2,2,2,2,2039,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,196,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,196,2,2,2,2,2,2,196,196,196,196,196,196,196,196,2,2,2,2,2,196,196,196,2,2,2,2,2,2,2,2,2,2,2,2,2039,2,2,2,2,2,2,196,196,196,196,2,196,2,2,2,2,2039,196,2,2,2,2,196,196,196,196,2,2,2,2,2,2,2,196,196,196,196,196,196,196,196,196,196,196,196,196,2,2,2,2,2,196,196,196,196,196,196,2,2,2,2,2,2,2,2,2,2,196,2},
+ {3248,1152,677,1852,368,590,1048,1469,578,578,1857,647,842,842,842,842,512,512,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,647,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,647,647,647,647,2,2,2,2,2,2,2,2,2,2,2,2,2,2,647,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,647,647,2,2,2,2,2,647,647,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,647,647,647,2,647,647,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,647,647,2,2,2,2,2,2,647,647,647,2,2,2,2,2,647,647,647,647,647,647,647,647,647,647,647,647,647,647,647,647,647,647,647,647,647,2,2,2,2,647,647,647,2,2,647,2,2,2,2,2,647,647,2,2,2,2,2,2,2,2,2,2,444,647,647,647,2,647,647,2,647,647,647,647,2,647,2,2},
+ {2372,3079,2161,515,368,847,955,1257,1937,315,2666,1938,1723,1252,1252,362,362,2,2205,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,340,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3550,2364,2761,1050,1452,3139,1203,3135,259,1430,2768,1154,1154,1154,1098,1098,1098,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,179,179,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,179,179,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,179,179,179,179,179,179,179,179,179,179,179,179},
+ {3283,1895,3287,884,1227,2089,1428,738,2392,1433,3204,65,65,2010,1412,1152,2693,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3526,2781,2027,3367,2471,2426,2023,287,2027,2500,1677,1982,1982,1982,1982,1067,1067,2,2,2,2,2,2,2,2,2,2,2589,2589,2589,2,2,2,2,2,2589,2589,2,2,2,2589,2589,2,2,2,2,2589,2589,2,2,2,2,2,2589,2,2,2,2589,2589,2589,2,2589,2589,2589,2589,2,2,2589,2,2,2,2589,2,2,2,2,2,2589,2,2,2,2,2589,2,2,2,2,2,2,2,2,2589,2589,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2589,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2589,2589,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2589,2,2,2,2,2,2,2,2,2,2,2,2,2,2589,2589,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2518,2060,1055,362,1455,1899,1105,1560,2237,2451,2080,181,2346,181,1829,1829,1829,2,2,1509,1509,1509,2,1509,2,2,2,2,2,2,2,2,2,1509,1509,1509,1509,2,1509,2,2,2,2,1509,2,2,2,1509,2,2,1509,2,2,2,1509,1509,1509,2,2,1509,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2019,2019,2,2,2,2019,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2405,2951,1024,864,3352,613,509,2752,1998,1315,704,558,2114,2114,2114,2114,2114,2,2,2,2,2,2,1686,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1686,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3092,3092,2,2,1686,2,2,1686,2,2,2,2,2,2,2,2,2,1686,1686,1686,1686,2,2,2,2,2,2,2,2,1686,1686,1686,2,1686,1686,1686,2,1686,1686,1686,2,1686,1686,2,1686,2,2,2,1686,1686,1686,1686,1686,1686,2,2,1686,1686,1686,1686,1686,1686,1686,1686,1686,1686,1686,1686,1686,1686,1686,1686,1686,1686,1686,1686,1686,2,2,3092,3092,3092,3092,3092,3092,3092,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1686,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1686,1686,1686,1686,1686,1686,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3572,3317,1644,1365,912,2200,1134,3115,1402,1456,2070,791,2291,1155,653,2572,1052,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,308,308,2,2,2,308,308,2,2,2,2,2,2,2,2,2,2,2,161,161,161,161,2,2,2,2,2,161,161,2137,2137,2137,2137,2,2,2,2,2,2,2,2,161,2,161,161,161,161,2,2,2,2,2,2,2,2,2,2,2,2,2137,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2137,2137,2137,2137,2,2,2,2,2137,2137,2,2,2,2,2,2,2,2,2,2,161,2,2,161,161,2,2,2,161,161,2,2,2,161,161,161,2,161,2137,2137,2137,2,2,2,161,161,2,2,2,161,2,2137,2,2,2137,2137,2137,2,2,161,161,2137,2137,161,161,161,161,2137,2137,2,2,161,2137,2137,161,161,161,161,2137,161,161,2137,2137,161,2137,2137,161,2137,2137,161,161,161,2137,2137,161,161,161,161,161,161,161,161,2137,2137,2137,2137,161,161,2137,2137,2137,2137,2137,2137,2137,161,2137,161,161,161,2137,2137,2137,2137,2137,2137,2137,2137,2137,2137,2137,2137,2137,161,2137,2137,2137,2137},
+ {2335,881,3740,2147,2388,1267,355,326,1183,688,359,865,86,1341,1699,457,66,132,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3017,3017,3017,3017,2,3017,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3592,2125,3245,1071,1973,453,396,3339,90,2128,349,772,141,2454,777,2,911,911,2,2,2,2,2,2,2,2,2,2,2,2,2,2005,2,2,2,2,2,2,2,2,2,2,2,2005,2,2005,2005,2,2,2,2,2005,2005,2005,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2005,2005,2005,2,2005,2005,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2005,2,2005,2005,2005,2005,2005,2005,2,2,2005,2,2,2,2,2,2,2,2,2},
+ {3186,809,1534,1060,1206,2817,1214,1285,1367,1155,2023,943,2165,405,2850,2,2850,2850,2,2,2,2,2,2,2,2,2,2,2,2,2,1195,1195,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,489,489,128,489,1793,3011,3011,3011,1195,1195,1195,1195,1195,1195,1195,2147,1195,2147,1195,2147,2147,1195,2147,2147,2147,1195,2147,2147,2147,2147,2147,2147,2147,2147,2147,2147,2147,2147,2147,2147,1195,1195,1195,2147,2147,2147,2147,2147,2147,2147,2147,2147,2147,2147,2147,2707,2707,2707,879,93,93,93,1649,1649,1649,2707,1649,1649,259,259,1782,1782,1782,1782,1782,2147,2147,2147,2147,2147,2147,586,2147,586,2147,2147,2147,586,586,2147,2147,586,726,726,726,726,2465,2465,2465,2465,2465,726,726,726,2147,2147,2147,2147,699,2147,364,364,364,364,364,364,364,364,364,829,1195,2147,2147,2147,364,2147,2147,2147,2147,2147,1260,1260,2147,2147,663,663,663,663,663,663,663,2147,829,829,829,829,829,829,829,829,829,829,829,829,663,44,2147,2147,663,663,44,663,663,663,663,44,663,663,663,663,663,663,663,663,663,663,663,663,663,663,1902,1902,1902,1902,93,93,1902,1902,1902,1902,1902,829,829,829},
+ {3362,1718,1285,290,2071,2685,2040,1046,513,1743,2093,3399,488,1536,2181,2,2,334,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3574,1205,2862,1345,667,1230,1023,512,2015,1045,2343,1819,372,675,2577,2,2577,2577,1298,2,2,2,2,2,1298,2,2,1298,1298,2,2,2,2,1298,1298,1298,2,1298,2,2,1298,1298,1298,2,2,1298,2,2,2,1298,1298,1298,1298,2,2,2,2,2,2,2,2,2,772,2,2,2,772,772,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,245,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,245,245,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3617,3106,427,3428,751,1008,1505,2329,1848,1122,1163,1355,2151,187,296,2,2,2,1772,1772,2,2,1465,1465,2,1465,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,385,2,2,2,2,2,385,385,2,2,2,385,385,385,385,2,2,2,2,2,2,2,2,2,385,385,385,385,2,2,2,2,2,385,1772,2,385,385,385,385,2,2,2,385,385,385,385,1465,1465,1465,1465,385,385,385,385,385,385,385,385,385,385,385,385,385,385,2,385,385,2,385,385,385,385,385,385,385,385,2,2,385,2,2,2,2,2,2,385,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,385,385,2,2},
+ {2560,1281,3140,2453,1350,2580,872,1188,3052,3003,745,4,4,2107,2107,2,2,2,2,2,2107,2107,2107,368,2,2,2,2,2107,1721,1721,1721,368,368,368,368,368,1721,1721,1721,368,368,368,368,368,2,2,1721,1721,368,368,368,368,1721,1721,1721,1721,1721,1721,1721,1721,368,368,368,368,2646,368,368,368,368,2,710,2646,2646,2646,2646,2646,368,368,2646,2646,2646,2646,2646,2,2646,2646,1721,1721,368,368,2646,1721,368,368,368,368,2,1721,368,368,1721,368,2646,2,1721,1721,1721,1721,1721,2646,2646,2646,2646,2646,2646,2646,2646,2,2646,2,2,2,2,2,2,2,2646,2646,2646,2646,2646,2646,2646,2646,2646,2646,2,2,2,2,2,880,2646,2646,2646,2646,2646,2646,2646,2646,2646,2646,2646,2,2,880,880,2646,2646,2,2646,2646,1721,1721,1721,1721,710,2646,2646,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,710,2,2,2,710,2,710,1721,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1721,2,1721,2,2,2,2,2,2,2,2,2,2,2},
+ {3215,2004,3333,2271,3283,1660,2135,1696,1413,1362,834,253,253,253,3802,2,2,2,1881,690,690,2,2,2,1881,1881,1881,1881,1881,2,1881,1881,2,2,1881,1881,1881,1881,1881,1881,1881,1881,2,1881,1881,1881,1881,1881,2,2,2,2,1881,1881,1881,1881,1881,2,2,1881,1881,2,2,2,2,2,1881,1881,2,2,2,2,2,2,2,2,2,2,2,2,1881,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3346,2602,959,3774,734,1363,2513,1183,93,196,887,1084,1195,386,386,137,137,137,137,137,137,137,2,2,2,2,2439,2439,2439,2439,2,2439,2439,2,2439,2439,2439,2439,2439,2,2439,2439,2,2,2,2,2439,2439,2439,1261,1261,1261,1261,1261,1261,2439,2439,2439,2439,2439,2,2439,2439,2,2,2,2,2439,2,2,2,1261,2,2,2,2,2439,2439,2439,2439,2439,2439,2439,2,2439,2439,2439,1261,2439,2439,2439,2439,2439,930,930,2439,2439,2439,2439,2439,2439,2439,2439,940,940,2439,2439,2439,2439,2439,2,2439,2,2,2439,2439,2439,1261,2439,1261,1261,2439,2439,2439,2439,2439,2439,2439,2439,2,2,2,1011,2,2,2,2,2439,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2439,2439,2,2,2439,2,2,930,930,2439,2,2,2439,2439,2,2,2,2439,2,2439,2,2439,2,2,2,2,2439,2,2,2,2439,2,2,2,2,2,2,2,2,2,2,2,2439,2439,2439,2439,2439,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3227,1852,987,168,1032,2586,1325,1717,2411,2150,182,3216,3029,3740,454,2,66,66,2,2,2,2,2,2,2,703,703,703,703,703,703,703,703,906,906,906,906,906,906,906,906,906,906,2,906,906,2,906,906,906,906,906,2,906,906,906,906,906,906,906,906,906,2,2,2,2,2,2,2,2,2,2,2,2,906,906,2,2,906,2,906,906,2,2,2,2,2,2,2,2,2,2,906,906,906,2,2,2,2,2,906,906,2,2,2,906,906,906,906,906,2458,2,906,906,906,2,906,906,2,906,906,906,906,906,906,906,906,2,906,906,906,906,906,906,906,906,906,906,2783,2,2,2783,906,906,2,906,2,2,2,2,2,2,906,2,2,906,906,2,2,906,906,2,2,2,2,2,2,2,2,2,2,2,2,2,2,906,2,2,906,906,906,2,906,906,2,906,906,906,906,906,906,2,906,906,906,2,2,906,2458,2458,2458,2458,2458,2458,2458,2458,2458,2458,2458,906,906,906,906,906,906,2,2,906,906,2,906,906,906,2,906,906,906,906,906,2,2458,2458,2458,2458,2458,2458,2458,2458,906,906,906,906,906,906,906,906,314,314,314,314,906,906,2,2,2,2},
+ {3362,1624,1609,972,1056,598,1108,871,3438,473,2253,1396,308,2053,2053,2,2,491,1202,2,2,2,2,2,2,2,2,2,2,1202,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3365,1995,213,1204,2954,858,2100,1428,2033,1185,1904,3415,2297,1656,294,2,1518,1182,2,2,2,311,2,2,2,2,2,842,2,2,2,2,2,842,2,842,2,2,2,2,2,2,2,2,2,2,842,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1182,1182,1182,1182,1182,2,1182,2,2,2,1182,1182,842,842,842,2,2,2,1182,1182,2,842,842,842,2,2,2,2,2,2,1182,842,842,842,2,842,2,2,2,2,2,2,2,2,2,2,2,2,2,1182,1182,2,2,1182,2,2,2,2,2,842,842,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3417,1145,2444,1131,1503,578,1177,2790,1481,479,727,2319,173,1123,229,2,709,709,2,2,2,2,2,2,709,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,709,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,709,709,2,2,2,2,2,2,2,2,1244,709,2,1244,1244,1244,2,1244,1244,1244,1244,2,2,1244,1244,709,709,709,709,1244,1599,1244,1244,1244,1244,1244,1244,1244,1244,1244,1244,1244,1244,1244,1244,1244,1244,1244,1244,1244,1244,1244,1244,1244,2,2,2,2,2,1244,1244,709,709,709,1244,2,1244,1244,709,2,2,1244,1244,1244,709,709,709,709,709,709,709,1244,1244,1244,1599,1244,1244,1244,1244,1244,1244,1244,1244,1244,1244,1244,2,1244,1244,1244,1244,1244,1244,1244},
+ {3620,1734,917,337,1356,2011,1576,1762,2739,3686,486,1461,1461,694,694,2687,1426,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1821,1821,1821,1821,1821,1821,2,1821,1821,2,2,2,2,1821,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,612,612,612,612,612,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3125,3125,3125,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1200,2,2,2,2,2,1200,1200,1200,1200,1200,2,1200,1200,2,2,125,125,2,2,2,2,2,2,2,2,2,2,2,2,2,612,612,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1821,1821,1821,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3125,3125,3125,3125,2,2,2,125,125,125,125},
+ {3249,1309,1232,472,711,2557,1479,1027,145,489,1377,2928,2928,3522,3522,3522,968,415,415,2,2,2,2,1332,1332,1332,2,1332,2891,2,1332,2891,2891,2,2891,1332,1332,1332,1332,1332,1332,1332,1332,1332,2,2,2,1332,1332,1332,2,2,2,1332,1332,2,2,2,2,2,2891,2891,1332,1332,1332,2,2,2,2891,2891,1332,2891,2891,2891,2891,2,2,2,2,1332,2,2,2,2,2891,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1332,1332,1332,1332,2,2,2,2,2891,2891,1332,1332,1332,2,2,2,2,2,2,2,2,2,2891,2891,2,2,2891,2891,2891,2891,2,2,2,2891,2891,2891,2891,2891,2891,2,2,2,2,1332,2891,2891,2891,2,2,2,2,2891,2891,2891,2891,2891,2,1332,2891,2891,2891,2891,2891,2,2,2,2,2,2,2,2,2,2,2,2,1332,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2891,2891,2,2,2,2,2,2,2891,2891,2891,2891,2891,2,2,2,2891,2,2,2891,2,2,2,2,2,2,2,2,2,2,2891,2,2891,2,2,2,2,2,2891,2891,2891,2891,2891,2891},
+ {3427,790,950,2728,1624,2759,1506,2317,2025,640,1156,230,2803,593,3028,44,2156,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1431,1431,1431,1431,1431,1431,1431,1431,1431,1431,1431,2,2,2,2,1431,2,1431,1431,2,2,2,2,2,2,2,1431,1431,2,2,1431,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1431,1431,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1431,1431,1431,1431,1431,2,1431,2,2,2,2,2,2,2,2,2,1431,773,1431,1431,1431,2,2,1431,1431,2,2,1431,2,2,1431,1431,1431,2,2},
+ {3296,2249,454,1782,1084,2273,2336,107,2220,2220,779,589,1578,595,595,396,1171,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1088,1088,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1088,2,2,2,2,1088,1088,1088,2,2,2,2,2,2},
+ {2628,2163,1961,3271,1440,247,3837,1621,1449,1449,1570,1450,2900,2900,1964,1964,1964,2,2,2,2,2,2,2810,2810,2,2810,2810,2810,2810,2810,2,2,2,2,2,2810,2810,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2810,2,2,2,2,2,2,2,2810,2810,2810,2810,2810,2,2,2,2810,2810,2,2,2810,2,2,2,2,2,2,2810,2810,2810,2,2,2,2,2,2,2,2,2,2,2810,2810,2,2,2,2,2,2,3236,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2462,1962,257,2244,1966,1905,204,262,799,319,752,1696,971,971,3781,1426,1426,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1196,1196,1196,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1196,1196,1196,1196,1196,2,1196,1196,2,2,2,2,2,2,2,2,2,2,2,2,2,1196,1196,2,2,2,2,1196,1196,1196,2,2,1196,1196,2632,2,2632,1196,1196,1196,1196,2,2,2,2,1196,2632,2632,1196,1196,1196,1196,1196,1196,1196,1196,1196,1196,1196,1196,1196,1196,1196,1196,2632,1196,1196,1196,1196,1196,1196,2,2632,2632,1196,1196,1196,1196,1196,1196,1196,1196,1196,1196,1196,1196,1196,1196,1196,1196,1196,1196,2,1196,1196,1196,1196,1196,1196,1196,1196,1196,2632,2632,2632,1196,2632,2632,2632,2632,2632,2632,2632,1196,1196,1196,1196,1196,82,82,2632,2632,2632,2632,2632,2632,1196,1196,2632,2632,2632},
+ {2407,2157,3828,1024,570,3052,906,2923,3303,1624,1070,2059,1442,516,516,516,516,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,438,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,438,438,2,2,2,2,2,2,2,2,2,2,438,438,2,2,2,2,2,2,2,2,2,2,438,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,438,438,438,438,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,438,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2475,1006,2721,2591,2253,3513,2591,2297,1110,135,1045,629,533,3647,761,761,2693,2693,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1103,1103,2,2,2,2,2,2,1718,2,1103,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2713,409,2186,1816,1653,744,2899,2899,796,1925,378,3807,1372,1594,1594,207,2,2,1636,1636,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,740,740,740,2,2,2,2,2,2,2376,2376,2376,2,2,2,2,2,2,2,2,1636,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2376,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3434,3131,1399,3413,1533,281,3288,1242,810,135,2506,2506,1742,946,1015,1044,1044,1044,2,2,2,2,1044,1837,1837,1837,1837,1837,2,2,2,2,2,2,2,2,2,2,2,2,2,1837,1837,1044,1044,1044,1044,1837,2,1044,1044,1044,1044,2,2,2,2,2,2,1837,1837,1837,1837,1837,1837,1837,1837,1837,1837,1837,2,2,2,1837,1837,1837,1837,1837,1837,1837,1837,1044,1044,1837,1837,1837,1837,2,2,2,2,2,1837,914,1837,1837,1044,1044,1837,1837,1837,1837,1044,1044,1837,1837,1837,1837,1837,1837,1044,1837,1837,1837,1837,1837,1837,1837,1837,1837,1837,1837,1837,914,914,914,914,1837,1837,1837,1837,2384,1044,2384,2384,2384,1044,1044,1044,1044,1044,1044,1837,1837,1837,1837,1837,1837,1837,508,1837,914,1044,1044,1044,914,914,1044,914,914,914,914,914,914,914,914,914,914,3615,3615,3615,3615,3615,3615,3615,3615,1044,914,914,1837,1837,1837,1837,1837,1837,1837,1837,1044,1044,1044,1044,1044,1044,1044,1044,1044,1136,1136,1136,1136,1136,1136,1136,1044,1136,1136,1136,1136,1136,1136,1136,1044,1044,1044,1044,1837,1044,1044,1837,914,914,914,1837,914,914,914,914,914,914,1136,914,914,914,914,914,914,914,914,914,914,914,1044,1044,508,508,2,2,2,2,2,1044,1044,1044,1044,1044,1044},
+ {2623,549,625,327,1654,329,2282,2056,3059,2037,273,2669,701,162,162,1643,2,1643,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2976,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,116,2,2,2,2,2,2,2,2,2,2,2,2,116,116,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3437,1647,471,1736,2343,847,1051,2890,2223,131,80,629,629,2490,717,717,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2187,2187,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2187,2187,2,2187,2187,2,2187,2187,2187,2,2,2,2,2,2,2,2,2,2,2,2,2,2187,2187,2,2187,2,2,2,2,2,2,2,2187,2,2,2,2187,2187,2,2187,2187,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3798,2207,1470,1527,1851,496,1578,1221,143,2273,684,744,660,555,555,618,2,2,3011,3011,3011,3011,3011,3011,3011,3011,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3335,455,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,455,2,455,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,455,2,2,2,2,2,2,2,2,2,2,455,455,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,455,455,2,2,2114,2114,455,455,455,2114,455,455,455,455,455,2,2,455,455,455,455,455,455,455,455,455,455,455,455,2,2,2,2,2,2,2,2,2,2,2027,2027,2027,2027,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2027,2027,2027,2,2,2,1204,2,2,2,2,2,2027,2027,2,2027,2027,2027,2027,455,455,455,455,2,2027,2027,2027,2027,2,2},
+ {3334,1429,2637,986,2601,774,162,1400,1649,1844,118,1732,1022,1659,1659,1659,2,2,2,1334,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1071,1071,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1358,2,2,1071,163,163,163,163,2,163,163,2,2,2,1071,2,1358,2,2,1358,1358,2,2,2,2,1071,1071,1071,2,2,2,2,2,2,1358,1358,2,2,1358,1358,1071,1071,1071,1071,2,2,2,1071,2,2,1358,2,1071,2,1071,1071,2,2,1358,2,2,1071,1071,1071,1071,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2518,1200,631,596,1946,365,2960,413,592,3878,242,2714,2364,1402,1402,2322,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1591,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1591,1591,1591,2,1591,1591,1591,1591,1591,1591,1591,1591,1591,2,1591,1591,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1591,1591,2,2,2,2,2,2,1591},
+ {2522,1382,2025,1057,2443,1252,339,1116,576,922,2814,2528,2819,225,1642,261,2,2,2,2,2,2,1523,1523,2,2,2,2,2,2,2,2,2,1647,1647,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1523,1523,1523,2,2,2,1523,1523,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3268,1529,1522,1096,2152,3137,1015,1440,3464,313,2250,3108,2250,1339,636,2782,2,2,2,1014,2,2,2,2,2,2,2,2,1856,2,1014,2,2,1014,1014,2,2,1014,1014,435,435,1014,1014,1014,1014,1014,1014,1014,1014,1014,1856,1014,1014,1014,1014,2,2,2,2,1856,1856,1856,1856,1856,1856,1856,2,2,2,1856,2,2,1856,1014,1856,1856,1856,1014,1014,2,2,2,2,2,2,2,1014,1014,1014,1014,1014,2,2,1856,2,2,2,2,2,2,2,2,1856,1856,1856,1856,1856,2,2,3412,3412,3412,3412,3412,2,435,435,2,2,1856,2,2,2,1014,1856,2,1856,1856,1856,1856,1856,1856,1856,1014,1014,1014,1014,1014,1014,1014,1014,1014,1014,1856,1856,2,2,1856,1856,2,2,1014,1014,1856,1856,2,1856,2,2,2,2,2,2,2,2,2,1014,1014,1014,1014,1856,1856,1856,1856,1856,2,1014,1014,1014,1014,1014,1014,1014,1014,2,2,1014,1014,2,2,1014,1014,1014,1014,1014,1014,1014,1014,2,2,2,2,2,1856,1856,1856,1014,1014,3412,3412,1856,1856,1856,1856,1856,1856,1856,1014,1856,1856,2,2,1856,1856,1014,1014,1014,1014,1014,1014,1014,1014,1856,1856,1856,1856,1856,1856,1856,1856,1856,1014,1856,1856,1856,2,3412,3412,3412,1856,1856,1856,1856,1856,3412,3412},
+ {2546,3445,689,3696,1988,1922,62,1371,1353,162,674,278,278,278,278,1425,1786,1786,1786,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,547,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2058,2058,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,547,2,2,2,2,547,547,547,547,547,547,547,2,2,547,547,547,547,547,547,547,547,547,547,547,547,547,547,547,547,547,547,547,2,547,547,547,547,547,547,547,547,547,547,547,547},
+ {3362,2012,1759,2002,1365,150,3120,471,1590,3246,1296,196,196,196,2984,2323,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1920,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1920,2,2,2,2,2,1920,2,2,2,2,1920,2,2,1920,2,1920,1920,2,1920,2,2,2,2,2,2,2,2,2,2,2,2,1920,2,2,1920,1920,2,1920,2,2,1920,2,1920,1920,1920,1920,2,2,2,2,1920,2,2,1920,2,1920,1920,1920,2,2,1920,1920,2,1920,2,2,2,1920,1920,1920,1920,1920,2,2724,2323,2,1920,2,1920,1920,1920,1920,1920,2,1920,2,1920,2,2,2,2,1920,1920,1920,1920,1920,2,1920,1920,1920,1920,1920,1920,1920,1920,1920,1920,1920,1920,1920,1920,1920,1920,1920,1920,2,2,1920,2,2,2,2,2,2,2,1920,1920,2,2,2,2,1920,1920,1920,1920,2,2,2,1920,1920,1920,2,2,2,1920,1920,2,2,2,2,2,2,2,2,1920,1920,1920,1920,1920,1920,1920,1920,1920,1920,1920,1920,1920,1920,1920,1920,1920,1920,1920,1920,1920,1920,1920,1920,1920,1920},
+ {2667,2308,2618,396,844,797,709,1580,1014,201,3198,3529,1002,393,1907,393,2,2,2,2,2,1907,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2618,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1907,1907,1907,1907,1907,2,2,2,1907,1907,1907,1907,2,2,2,2,2,2,2,2,2,2,2,2,2,1907,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3365,1395,2404,569,570,1941,97,1216,225,3465,2116,2455,1323,1974,1974,330,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,379,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1311,2,2,2},
+ {2547,3409,1956,1219,820,1321,2253,1431,378,3135,1484,4056,4056,4056,4056,4056,2,2,2,2,2,2,2,2,2,2,2,2756,2756,2756,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,615,615,2,2,2,2,2,615,615,2,2,2,615,615,2,2,2756,2756,2756,2756,2756,2,2,615,615,615,615,615,615,615,615,615,615,615,2,615,615,615,2756,2756,2,2756,2756,2756,2756,2756,615,615,615,615,615,615,615,2756,615,615,2,2756,2756,2756,2,2,2,2,2,2,2,2,2,2,2756,2,2756,2756,2,2756,2756,2,2,2,2,2756,2756,2756,2756,2,2,2,2,2,2,2,615,615,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,615,615,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,615,2756,2,615,615,615,2756,615,2,615,2756,2756,615,615,2,2,2,2756,2,2,615,615,2,2,615,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2756,2,2,2756,2756,2756,2756,2756,2756,2,2},
+ {2702,1950,1347,2470,1230,334,1565,785,3725,161,1816,389,3102,2874,1866,1866,1866,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1866,1866,2,2,2,2,2,2,2,2,2,2,2,2,1866,1866,1866,1866,1866,1866,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1675,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1866,1866,1866,2,1866,1866,1866,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1866,2,2,2,2,1866,2,2,2,2,1675,1866,2,2,1675,1866,1866,2,2,2,2,1866,1866,1866,1866,1866,1866,1866,1866,1866,1866,1866,1866,1866,1866,1866,1866,1866,1866,1866,1866,1866,1866,1866,2,1866,1866,1866,1866,1866,1866,1866,1866,1866,1675,1675,1866,1866,1866,1866,1866,1866,1866,1866,1866,1866,1866,1866,1866,1866,1866,1866,1866,1866,2,2,2,2,2,2,1866,2,1866,2,1866,2,1866,1866,1866,1866,2,1866,1866,2,2,2,2},
+ {2536,2188,2575,581,2585,987,2538,1244,2800,2617,2491,3490,223,462,1563,4295,1925,2,2,2,2,2,2,2,1925,2,2,2,2,1925,1925,1925,2,2,2,2,2857,2,2,2,2,2,1925,2,2,2,2,2,2,2,2,2,2857,2857,2,2,2,1925,1925,1925,1925,2,1925,1925,1925,1925,1925,1925,1925,1925,1925,2857,2857,2857,2857,932,2857,2857,2857,932,932,1925,932,2857,2857,2857,2,2857,2857,2857,2,2,2857,2,2,2857,2857,2,2857,2857,2,2857,2857,2857,2,2,2857,2,2,2,2857,1925,1925,2,2857,2857,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,932,932,932,932,932,932,932,1925,2,2,2,1925,1925,1925,1925,1925,1925,1925,1925,2,1925,1925,1925,1925,1925,1925,1925,1925,1925,1925,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,932,932,2857,2,2,2,2857,2857,2,2,2,2,2,2,2857,2857,2857,2857,2857,2857,2857,2857,2857,2857,2857,2857,2857,2857,2857,2857,2857,2857,2857,2857,2857,2857,2857},
+ {3554,2059,585,409,1280,620,1669,98,2768,2102,1458,2515,893,893,1111,2556,1229,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1205,1205,2,1205,1205,1205,1205,2,1205,1205,1205,2,2,2,2,1205,1205,2,1205,1205,1205,2,1205,1205,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1205,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1205,1205,1205,2,1205,2,2,2,2,2,2,1205,1205,2,2,1205,1205,2,2,1205,1205,2,2,2,1205,1205,1205,1205,1205,2,2,2,1205,1205,1205,1205,2,1205,2,2,2,2,1205,1205,1205,1205,1205,1205,1205,1205,1205,1205,1205,1205,1205,1205,1205,1205,1205,1205,1205,1205,1205,1205,1205,1205,1205,1205,1205,1205,1205,1205,1205,1205,1205,1205,1205,1205,1205,1205,1205,1205,1205,1205,1205,1205,1205,1205,1205,1205,1205,1205,1205,1205,1205,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1205,2,2,2,2,2,2},
+ {3561,1030,476,1998,2687,490,262,3659,1029,1010,1861,1326,1326,1326,1326,16,16,2,2,2,2031,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2031,2031,2,2,2,2031,2031,2031,2,2960,2960,2,2,2,1107,784,2960,2031,2031,784,2031,784,784,2,784,784,2,2,784,2031,784,784,2,2,2,2,2,2,2,1845,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2031,784,2,2,2,2031,2031,2031,2031,1845,784,784,2031,2031,784,2960,2960,2960,784,2,2031,2031,2031,1845,2,2031,2031,2031,2031,2031,2031,2031,2031,2031,2031,784,2031,2031,2031,2031,2031,2,2031,784,2,2,2031,2031,2031,2031,2031,2031,2031,784,2031,2031,2031,784,2031,2031,2031,2031,2,784,784,784,2,2031,2031,2031,2031,2960,2031,2960,2031,784,784,784,2031,2031,2031,2031,2,2960,1107,1107,784,784,784,2031,2031,2031,2031,2031,2031,2031,2031,2960,2960,784,784,784,784,784,784,784,784,2960,2960,2960,2960,2960,2960,2960,2960,2960,2960,2960,1845,784,784,784,784,784,1845,2031,1845,1845,2960,1845,1845,1845,2960,2960,2031,1845,2960,2960,2960,2960,2960,2960,2960,2960,2960,2960,1845,1845,2960,784,784,2,1845,2960,2960,2960,2960,1949,1949,1949,1845,1845},
+ {2547,3563,2848,1569,632,2183,3303,536,620,1267,2349,1888,878,878,2,349,517,2,2,2,2,2,2,2,2,2,2,2,2,2,618,618,1592,1592,1592,618,618,618,618,618,618,618,2,2,2,2,618,618,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1592,1592,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1592,1592,1592,1592,1592,1592,2,1592,1592,1592,1592,1592,1592,1592,1592,1592,2,1592,1592,1592,1592,1592,1592,1592,2,2,2,2,2,1592,1592,1592,2,2,2,2,2,2,2,2,2,1592,2,2,2,1592,2,2,2,2,2,2,2,2,2,2,2,2,2,1592,1592,1592,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2697,587,2342,1952,1828,2352,1269,2395,1111,1071,169,1840,2612,2612,2,751,3246,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,997,997,997,997,997,997,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,997,997,997,2,997,997,997,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,997,2,997,997,997,2,2,2,2,2,2,2,2},
+ {2728,1334,274,1330,2674,2614,931,2250,883,1506,2193,1345,1089,500,2,219,390,2,2,2,2,2,2,2,390,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3057,3057,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3057,3057,3057,3057,3057,390,2,2,2,2,2,2,2,2,2,2,2,2,3057,3057,2,2,2,2,2,390,390,2,3057,390,390,390,390,390,390,3057,390,390,3057,3057,3057,3057,390,390,390,3057,2,2,2,2,2,390,390,390,390,2,2,2,2,3057,390,390,390,390,390,390,390,390,390,2,2,390,3057,390,2,2,390,3057,3057,3057,3057,390,390,390,390,390,390,390,2,390,390,390,3057,390,390,390,2,2,2,390,390,390,390,390,390,390,390,390,390,390,390,390,3057,390,390,390,390,390,390,390,390,390,390,618,618,618,618,618,618,618,618,618,618,3057,390,390,390,618,618,2,390,618,3057,3057,618,390,390,390,3057,390,390,390,390,2,390,390,390,390,390,3057,3057,3057,3057,3057,3057},
+ {3568,1820,2374,2294,3151,665,1172,3639,3261,2752,48,288,708,3016,2863,2863,2863,2,2,2,2,2,2,2863,2863,2863,2863,1610,2863,1610,2,2,2,2,2,2,2,1610,1610,1610,1610,1610,1610,1610,1610,1610,1610,1610,1610,1610,1610,1610,1610,1610,1610,1610,1610,1610,1610,1610,1610,1610,1610,1610,1610,1610,1610,1610,2863,2863,2863,1610,2,2,2,1610,1610,1610,1610,1610,2402,1610,2402,2402,1610,811,811,811,1610,1610,1610,1610,1610,1610,2,2,1610,1610,1610,1610,1610,1610,1610,1610,1528,1610,1610,1528,1528,1610,1610,1610,1610,1610,811,811,811,1528,1610,1528,1528,1610,1610,1528,1528,811,811,811,811,811,811,811,811,811,811,811,811,811,811,811,811,811,811,811,1610,1610,1610,1610,1610,1610,1610,1610,1610,1610,1528,1528,1528,1528,1528,1610,1610,1610,1610,1528,1528,3332,3332,3332,3332,3332,1610,1610,1610,1610,1610,1610,1528,1528,1528,1528,1528,3930,3930,3930,1610,1610,1610,1610,1610,1610,1610,1610,1610,1610,1610,1610,1610,3930,3930,3930,3930,811,811,811,811,3930,3930,3930,3930,1610,1610,811,1610,1528,1528,3332,1528,1528,3930,3930,3930,3930,3930,3930,3930,3930,3930,3930,3930,3930,3930,495,3930,568,811,811,811,3930,1610,3930,1610,3930,3930,3930,3930,3930,3930,3332,3332,3332,263,263,3332,263,263,263},
+ {3841,1526,728,371,165,240,35,1761,2632,646,1427,554,554,554,554,554,554,4343,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3063,3063,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,180,180,2,2,180,180,180,180,180,2,180,180,2,2,2,2,2,2,2,180,180,2,2,2,2,2,180,180,180,180,180,2,2,2,180,180,2,2,2,180,180,180,180,2,2,180,180,180,180,180,180,180,180,180,180,180,2,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,2,2,180,180,180,180,180,180,180,180,180,180,180,180,180,180,3063,3063,180,180,180,180,180,180,4408,4408,3063,3063,180,180,2,180,180,180,180,2,180,180,180,180,180,180,180,180,3063,3063,180,180,3063,3063,3063,2,2,180,180},
+ {2743,1720,981,308,637,2946,3695,2641,1928,658,343,1763,746,746,2,2,1703,3478,2,2,2,2,2,2,2,2,499,1672,1672,1672,1672,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1672,1672,1672,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1672,1672,2,2,2,1672,1672,1672,1672,2,3534,1672,2,2,2,499,499,2,2,2,2,2,2,2,2,2,2,2,2,2,499,499,499,499,499,499,499,499,499,2,2,2,2,2,2,2,2,1672,2,2,3534,3534,3534,3534,3534,3534,3534,2,2,2,2,2,2,2,2,499,499,499,3534,3534,3534,3534,3534,3534,3534,3534,3534,3534,3534,3534,3534,3534,3534,3534,3534,3534,3534,827,827,1754},
+ {2743,3246,1716,1257,201,1379,265,475,639,2737,466,2517,3336,496,2,2,378,3723,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2318,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2239,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2727,2610,1614,2813,315,2920,1987,1311,550,632,1360,555,2151,1266,2,2,705,1266,1266,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2436,2436,2436,2436,2436,2436,2436,672,2436,2436,2436,2,2436,2436,2436,2,2,2,2,2,2436,2436,2,2436,672,2436,2436,672,2436,2,2,2,2436,2436,672,672,672,672,672,672,672,672,672,672,672,672,672,2,2,2436,2436,2436,2436,2436,2436,2436,2436,2436,2436,2436,2436,2436,2436,2436,2436,2436,2436,2436,2436,2436,2436,2436,2,2436,2436,2436,2436,2436,2436,2,2,2,2,2436,2,672,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,672,2,2,2,2,2,2,2,2,2,672,672,2,672,2,2,2,2,2,2,2,2,2,2,672,672,672,2,2,2,2,2,2,2,672,672,672,672,2,672,672,672,672,2,672,672,672,672,672,672,672,672,672,2,672,672,2,2,672,2,2,2,2,2,2,672,672,672,672,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2436,2436,672,2,2,2,2,2,2,2,2,672},
+ {3855,2471,1322,4343,678,3880,1418,1892,703,2657,886,2938,2464,134,2,2,2,699,3472,2,2,2,2,2,2,2,2,2,2,2,2,2,869,2,2,2,2,2,2,2,2,2,2,2,2,869,2,869,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3428,2242,1311,1602,2823,4010,466,1697,1227,864,2416,94,2416,651,2,2,2,2617,2617,2617,2,2617,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,770,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,770,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2584,1707,1569,1370,2947,836,2055,1055,2862,495,1058,641,1557,44,2,2,2,2,1634,3041,713,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3563,1502,254,2975,1699,1872,1542,3067,1993,485,122,739,2029,2821,2,2,2,2,2217,2217,1835,2217,2217,1835,2,2,2,2,2,2,2217,2217,2217,2217,2217,2,2,2,2,2,2,2,2,2,2,2,1835,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2217,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2217,2217,2217,2,2217,2,2,2,2,2,2,2,2,2,2,2,2,2217,2,2,2,2,2,2217,2217,2,2,2,2217,2217,2,2,2,2,2,2,2217,2217,2217,2217,2217,2,2,2,2,2,2,2,2,2217,2217,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1835,1835,2,2,2,2,2,2217,2217,2217,2,2,2,2,2,2,2217,2,2,2,2,2217,2217,2217,2,2,2217,2217,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1835,1835,2,2,2217,2,2,2,2,2217},
+ {2583,1148,1816,822,4422,130,3844,2715,1288,1245,2737,2162,1609,3467,2,2,2,2976,2976,2976,2976,2976,2,2,2,1160,2,2,2,2,2976,2976,2976,2,2976,1896,1896,2976,2976,2976,2976,2,3980,3980,3980,3980,3980,3980,3980,3980,3980,2,2,2,2976,2976,2976,2,2976,2976,2976,1896,1896,1896,2976,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3980,3980,3980,3980,3980,2,2,2,895,895,1160,2,2,3980,3980,895,895,895,895,2,1620,1490,1490,1490,2976,1160,1160,2,2,1620,1620,1620,2,3980,3980,2,3980,3980,3980,3980,3980,3980,3980,3980,3980,1160,1160,1160,2,2,2,2976,2,1160,2,1620,1620,2,2,1160,1160,2,2,2,1160,1160,2976,1160,3980,3980,3980,3980,2976,2976,2,1160,3980,3980,3980,3980,3980,3980,3980,3980,2976,2,3980,3980,3980,3980,3980,3980,3980,3980,2,3980,2976,2,2,2976,2,2,2,2,2,2976,2,3980,3980,3980,3980,3980,3980,3980,2,2,2,2,2,2,3980,3980,3980,3980,3980,3980,2,3980,3980,3980,3980,3980,2,3980,3980,1620,2976,2976,2976,1160,3980,3980,3980,3980,2976,2976,2976,2976,2,3980,3980,1160,1620,2,2,1620,1620,1620,895,2976,1620,1620,1620,1160,2976,2976,2976,2976,1160,2976,2976,2,2,2,2},
+ {3475,932,501,2551,500,77,1485,388,2432,545,82,1851,2435,2435,1175,1175,1175,1175,1175,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1696,1696,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1696,1696,1696,1696,2,1696,1696,1696,1696,1696,2,1696,1696,1696,1696,1696,1696,2,2,1696,1696,1696,1696,1696,1696,1696,1696,1696,2,1696,1696,1696,1696,1696,1696,1696,2,2,1696,1696,1696,1696,1696,1696,1696,1696,1696,1696,1696,1696,1696,2,1696,2,2,2,1696,1696},
+ {2757,3466,1411,1168,340,2760,1053,524,53,2090,1227,26,260,830,2,2,2,1139,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3154,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3154,3154,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2120,2120,2,2,2,2,2,2,2,2,2},
+ {3872,1852,1020,3421,1850,2159,1511,901,55,384,308,3338,288,456,1211,1211,1211,1211,2,2652,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1211,1211,2,2,2,2,2,2,2,2,2,1211,1211,2,2,2756,2,1211,1211,1211,1211,1211,1211,1211,2,2,2,2,1211,2,2,2,2,2,1211,1211,1211,2,2,2,2,2,2,2,2,2,1211,1211,2,2,2,2,2,2,2,1211,1211,2,1211,1211,2,1211,1211,1211,1211,1211,1211,1211,1211,2,1211,1211,1211,2,2,1211,1211,2,1211,1211,1211,1211,1211,1211,1211,2,362,362,1211,1211,1211,1211,1211,1211,1211,1211,1211,2,2,1211,1211,130,2,1211,1211,1211,1211,2,1211,1211,2,2,2,1211,1211,2,2,2,2,2,2,2,2,1211,2,2,2,2,2,2,2,2,2,2,2,2,3309,2,2,2,2,2,1211,1211,1211,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1211,1211,1211,1211,1211,1211,2,2,2,2},
+ {2804,3002,554,1797,347,1895,76,965,926,2807,283,40,2433,2433,2,2,168,1971,2,2,2,2,2073,2,2,2,2,2,2,2,1483,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1483,2,1483,1483,2,2,1483,1483,2,1483,1483,2,2,2,2,2,2,1483,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1903,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3964,1838,1032,1785,835,2026,1883,801,1408,631,195,3076,3076,3076,2,523,1511,1511,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2557,1972,1743,4367,1391,662,1037,1098,3607,2537,1474,902,1364,1301,2,1917,1646,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1373,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,627,2,2,1373,1373,1373,2,1373,1373,2,2,627,627,1373,1373,1373,2,2,2,1373,627,627,1373,1373,1373,1373,1373,1373,627,627,627,1373,1373,1373,1373,1373,1373,1373,1373,1373,1373,1373,1373,1373,2,2,1373,1373,2,2,1373,2,2,2,2,1373,2,2,2,2,2,2,2,2,2,2,2,2,2,2,627,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1373,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3623,1074,201,1409,3910,2611,2343,1134,1280,2994,2243,1914,15,28,2,741,1612,2,2,2,2,2,2,2,2,764,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3673,537,872,1983,2478,2297,1613,1535,1360,736,2586,623,1819,1819,2,907,907,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2913,2913,2913,2,2,2,2913,2,2913,2,2,2,2913,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1927,1927,1927,2,2,2,2,2,2,2,2,2,2,2,1927,1927,1927,1927,1927,1927,1927,2,2,2,2913,2913,2913,2913,1927,2913,2913,2913,2913,2913,2913,2913,2913,2,2913,2,2,2,2,2913,2913,2,2,2,2,2,2,2,2,1927,2,1927,1927,2913,2,2,2913,2913,1927,1927,1927,2,2,2913,2913,2913,2913,2913,2,2,2,2,2},
+ {3680,637,4064,1504,1531,1271,2659,2881,1792,178,2794,2747,912,2141,2141,1682,2141,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,169,169,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,169,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1319,1319,32,1319,32,32,2514,1501,1501,1501,2,2,169,2,2,2,2,169},
+ {2662,902,2371,1920,1097,1476,1008,1012,3556,468,3374,2560,591,1446,2,298,298,149,149,149,149,149,3135,3135,3135,3135,3135,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2826,3005,1262,3027,2874,816,1460,40,957,492,4067,100,84,84,2,541,1266,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,835,835,835,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,835,2,2,2,2,2,2,2,2,2,835,835,2,2,2,2,2,2,2,835,835,835,2,2,835,835,2,2,835,835,835,2,2,835,2,2,835,835,835,835,835,2,2,835,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,835,835,2,2,2,2,2,2,2,2,835,835,835,835,835,2,835,1129,1129,1129,2,2,2,835,835,835,835,835,2,2,384,384,2,835,2,2,2,2,2,835,2,835,835,835,835,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1129,2,2,2,2,2,2,2,835,1129,1129,2,835,835,835,835,835,835,835,835,835,2,835,2,2,2,2,2,835,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1129},
+ {2673,1823,1673,332,1828,100,1262,1108,863,2148,16,2861,123,2861,2861,2861,2,2,899,2893,2893,2,2,2,2,2,2,2,2,2,2,2,2893,4061,4061,2,2,2893,2,2,2,2,2,2,2893,2893,2893,2893,2893,2,2,2,2893,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4061,2,2,2,4061,4061,2,4061,2,2,2,2,2,2,4061,2893,2,2,2893,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3713,1569,2869,1783,2294,613,2857,2210,1851,2060,710,3457,662,2079,2344,3094,1761,1466,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1761,1761,1761,1761,1761,1761,1761,1761,2,2,2,2,2,2,2,2,2,2,2,2,485,485,2,2,2,1761,1761,485,485,485,485,1761,1761,1761,1761,1761,1761,1761,1761,1761,2,2,2,2,2,2,2,2,2,1761,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,485,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1761,2,2,2,1761,1761,1761,1761,1761},
+ {3554,3047,2524,365,4249,2531,430,3815,301,1103,1159,3122,70,203,2448,2448,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3458,1992,2688,355,1542,1642,1448,371,805,1593,1593,924,924,198,198,3602,390,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3053,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3053,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3053,3053,2,3053,2,2,2,2,2,2,2,2,3053,2,2,3053,3053,3053,3053,2,2,2,2,2,2,3053,3053,3053,3053,3053,3053,2,2,3053,3053,3053,3053,2,1533,1533,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1533,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3735,1183,2701,1627,2274,384,2540,1176,457,2678,4107,27,27,27,3857,3857,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,101,101,101,101,101,101,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,101,101,2,2,2,2,2,2,1632,1632,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1632,2,2,1632,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1632,1632,2,1632,1632,2,2,2,2,2,2,2,2,2},
+ {4034,1737,713,630,1446,1119,1569,311,311,1603,570,297,523,2099,2099,2099,2,2,2,2,2,2,2,2,2,2,2,2,2,1747,1747,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1747,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1747,1747,1747,1747,2,2,2,2,2,1747,1747,1747,1747,1747,2,2,2,2,2,1747,1747,1747,2},
+ {2852,1709,2792,619,1259,436,118,1947,4133,594,875,69,181,840,948,2555,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3703,909,3204,468,3987,486,1684,2060,1723,2755,1255,455,276,1639,1639,307,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2141,2,2,2,2,2,2,2,2,2,2,2,2141,2141,2,2141,2141,2,2,2,2,2,2,2,2,2,2141,2141,2141,2,2,2,2,2,2,2141,2,2,2,2,2,2,2,2141,2141,2,2,2,2,2,2141,2,2141,2141,2,2,2,2,2,2,2141,2,2141,2,2,2,2,2,2,2,2,2,2,2,2141,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2861,1407,1848,245,2186,1209,164,2577,625,132,657,2333,2333,2213,2213,2213,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1823,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,591,2,2,591,1823,2,2,2,926,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,926,1823,1823,1823,1823,1823,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3586,1682,414,683,2259,102,3055,2722,74,1814,1814,3582,110,116,970,779,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2192,2192,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2192,2,2,2192,2,2,2,2,2,2,2,2,2,2,2,2,2192,2192,2,2,2,2192,2192,2192,2192,2192,2192,2192,2192,2192,2,2,2,2192,2192,2192,2192,2192,2,2,2,2192,2192,2192,2192,2192,2192,2192,2192,2192,2192,2192,2192,2192,2192,2192,2192,2192,2192,2192,2192,2192,2192,2192,2192,2192,2192,2192,2192,2192,2192,2192,2192,2192,2192,2192,2192,2192,2192,2192,2192,2192,2192,2192,2192,2192,2192,2192,2192,2192,400,400,400,400,2192,2192,2192,2192,2192,2192,2192,2192,2069,2192,2192,2192,2192,2192,2192,2192,2192,2192,2192,2192,2192,2192,2192,2192,2192,2192,2192,2192,2192,2192,2192,2192,2,2192,2029,2029,2029,2029,2029,2029,2029,2192,2192,2192,2192,2192,2192,2192,2192,2192,2192,2029,2029,2029,2029,2029,2192,2192,2,2192,2192,2029,2192,2192,2192,2192,2192,2069,2069,2069,2069,2069,2069,2069,2069,2069,2069,2069,2069,2069,2029,2069,2069,2192,2192,2192,2192,2,2,2069,2069,2192,2069,2192,2571,2571,2192,2192,2192,2192,2192,2192,2192,2192,2192},
+ {2967,3127,2698,2547,2618,3281,1906,796,2265,3752,44,2657,1535,1535,2657,2657,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,327,327,327,327,2,2,2,2,1027,1027,2,2,2,1027,1027,2,2,2,2,327,327,2,2,2,2,327,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,832,2,832,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,832,2,2,2,2,2019,2379,2379,2379,832,2019,2019,2,832,832,832,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,327,2,2,2,327,327,327,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,832,2,2,2,2,2,832,2,2,1027,2,2,2,2,2,832,2,832,2,2019,2},
+ {4020,3512,326,1782,2738,298,2949,376,1624,1085,329,1161,2014,2014,369,3628,2,2,878,878,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2889,2889,2889,2,2,2,2,2,2,2,2,2,2889,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2889,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2889,3231,3231,3231,3231,3231,2,2,2889,2889,2889,2,2889,2,3231,3231,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,878,878,2,878,878,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {4096,1167,2529,1528,1143,960,1993,15,119,795,1064,1064,2835,2367,3836,3836,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,847,847,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,847,847,847,847,847,847,847,847,847,847,2,2,2,2,847,847,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2703,3042,1879,490,418,3773,3382,1756,2631,1500,4288,1530,2180,2180,652,652,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2191,2,2,2,2191,2,2,2,2191,2,2,2,2191,2191,2191,2191,2191,2,2191,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2966,2966,2,2,2,2,2,2,2966,2,2,2,2,2,2,289,2784,2,289,2,2,2,2,2,2,2784,2,2784,2784,2784,2784,2,2,2,2,2,2966,2966,2966,2966,2966,2,2966},
+ {3715,1366,2348,1698,1521,1521,2348,584,584,2102,3667,1917,592,2363,2363,2363,2363,2363,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3083,1034,2,2,3083,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2137,2,2,2,2,2,2,2,1034,2,2,2,2,2,3083,2137,2137,2,2,2137,2137,2137,2137,2137,2137,3318,2137,2,2,2,2,2,2137,2,2137,392,392,2,2,2,2137,2137,1700,2,2,2,3083,3083,2,2137,2,3083,2,2,2,2,1034,1034,1034,2,2,2,2,2,2,2,2,2,2,2,1700,3083,3083,2,3083,1700,1034,1034,1034,1034,1034,1034,1034,1034,1034,1034,1034,2137,2137,2,2,2,2,2,1199,1199,1199,1199,1199,2,2,2,1199,1199,1199,77,2,2,1034,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3083,3083,1034,1034,1034,1034,1034},
+ {2646,2049,300,479,1950,1168,789,1246,238,860,3202,1238,165,3078,1948,2957,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,99,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1555,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2876,3171,3052,820,344,277,2596,748,2791,3647,102,2053,2053,2464,2464,2356,2,2,2,2,2,2,2,2,2,2,2,1501,1501,1501,2,2,2,1501,1501,2,1501,1501,2,2,2,2,1501,1501,1501,1501,336,336,336,336,336,336,336,2516,1501,2516,2516,336,2516,2516,1501,1501,1501,1501,1501,1501,1501,1501,1501,1501,1501,1501,1501,1501,1501,1501,1501,1501,336,336,336,336,1501,336,336,336,2516,2516,2516,2516,2516,2516,2516,2,2516,2516,2516,2516,2516,2,2516,2516,2,2,2516,2516,2,2,2,2516,2516,2,2,2516,2516,2,2,2,2516,2516,2516,2516,2516,2516,176,2516,2516,2516,2,2,176,176,1501,336,336,336,336,336,2,336,2231,2,2,2,2,1501,1501,2516,2516,2516,2516,2516,2516,2516,2516,2516,2516,2516,336,1501,2516,336,2516,2516,336,336,336,336,336,2,336,336,336,336,336,2,336,336,336,336,336,336,336,336,336,2516,2,336,2,336,336,336,2,2,2,2,2,2,2,2,2,336,2,2,2,2,2,336,336,336,336,336,336,336,336,176,176,176,176,176,176,336,336,336,176,176,176,2,2,336,336,2,2,2,336,336,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2909,2526,2521,897,489,3799,1599,1316,848,1788,2192,1082,735,533,1397,1397,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1533,1533,2,2,2,2483,2,2,2,2,2,2,2,2,2,2,2,1533,1533,1533,2,2,2,2,2,2,2483,2,2,2483,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2483,2483,2,2483,2483,2483,2483,2,2,2,2,2,2,2,2483,2,2,2,2,2483,2483,2483,2483,2483,2,2,2483,2483,2,2483,2483,2,2,2,2,1533,2,2,2,2483,2,2,2,2483,2483,2483,2483,2483,2483,2483,2,2,2,2,2483,2483,2,2,2,2,2483,2483,2483,1533,1533,2483,2483,2483,2483,2,2483,2483,2483,2483,2483,2483,2483,2483,2483,2483,2483,2483,2483,2483,2483,2483,2483,2483,2483,2483,2483,1533,2483,2483,2483,2483,2483,2483,2483,2483,2483,2483,2483,2483,2,2483,2,2,2,2483,2483,2,2483,2,2,2,2,1533,2},
+ {2908,880,2377,2070,175,2199,2074,585,81,2646,3447,565,99,4735,4165,4165,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,995,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,995,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,995,995,995,995,995,995,995,995,995,995,995,2,2,995,995,995,2,995,3460,995,2,2,995,995,2,2,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995,995},
+ {2883,3203,1862,572,2683,4862,130,173,832,825,195,1184,2151,2151,60,1063,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1321,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,311,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1321,1321,2,2,2,1321,1321,1321,1321,1321,1321,1321,1321,1321,1321,1321,1321,1321,1321,2,2,2,2,1321,1321,2,2,2,2,2,2,2,2,2,1321,1321,2,2,2,1321,2,1321,2,2,2,2,1321,1321,1321,2},
+ {2738,2414,2332,135,1239,507,1909,1026,629,1075,297,247,2209,2585,2704,682,2077,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2077,2077,2077,2077,2,2,2,2,2,2,2077,2077,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2077,2077,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2077,2077,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2077,2077,2077,2077,2077,2077,2077,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2077,2077,2077,2077,2077,2077,2,2077,2077,2077,2077,2077,2077,2077,2077,2077,2,2,2077,2077,2077,2,2,2,2,2,2077,2077,2077,2077,2077,2077,2077,2077,2077,2077,2077,2077,2077,2077,2077,2077,2077,2077,2077,2077,2077,133,133,133,2077,2077,2077,2077,2077,2077,2077,2077,2077,2077,2077,2077,2077,2077,2077,2077,2077,2077,133,2077,2077,2077,2077,2077,2077,2077,2077,2077,2077,2077,2077,2077,2077,2077,2077,2077,2077,2077,2077,2077,2077,2077,2077,2077,2077,2077,2077,2077,2077,2077,2077,2077,2077,2077,2077,2077,2077},
+ {2927,1924,419,310,309,1727,394,19,1212,95,3764,2221,2221,642,1452,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2656,1922,1914,585,636,1819,668,479,2085,3809,739,693,2308,529,647,647,2343,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,939,2,2,2,2,939,2,2,939,939,939,939,2,2,939,939,939,939,2,939,939,939,939,939,939,939,939,939,939,939,939,2,2,2,2,939,939,939,939,939,939,939,2,939,939,2,2,2,2,939,939,2,939,939,2,2,2,939,939,939,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,939,939,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,939,2,2,939,2,939,2,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,2,2,2,2,2,939,939,939,939,939,939,939,939,939,939},
+ {2908,887,2514,568,547,2994,465,1913,1522,1029,4149,1585,1585,224,1600,2,2103,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1836,1836,2,1836,1836,1836,2,2,2,2,2,2,2,2,3109,2,2,2,2,3109,3109,2,3109,3109,1836,3109,3109,3109,3109,2,2,2,2,3109,1836,3109,2,1836,2,2,3109,3109,3109,2,2,2,2,1836,2,2,1836,1836,1836,1836,2,1836,3109,2,2,2,2,1836,2,2,2,2,1836,1836,1836,1836,1836,1836,2,2,2,2,3109,1836,1836,1836,3109,3109,3109,3109,3109,3109,3109,1836,3109,3109,3109,3109,3109,3109,3109,3109,3109,1836,2,3109,3109,3109,1836,1836,1836,3109,2,3109,3109,3109,3109,2,2,1517,4418,4418,4418,128,3109,3109,1836,3109,3109,3109,3109,3109,3109,1836,3109,3109,3109,3109,3109,3109,3109,3109,3109,3109,3109,3109,3109,3109,3109,3109,3109,3109,3109,3109,3109,3109,3109,3109,3109,3109,3109,3109,3109,3109,3109,3109,3109,3109,3109,3109,3109,3109,3109,3109,3109,3109,3109,3109,3109,3109,3109,3109,3109,3109,3109,3109,3109,3109,3109,3109,3109,3109,1836,1836,1836,1836,3109,3109,3109,3109,3109,3109,3109,3109,3109,3109,3109,3109,1836,1836,1836,3109,3109,3109,3109,3109,3109,3109,3109,3109,3109,3109,3109,3109,1836,1836,1836,440,3109},
+ {2941,1122,3674,2894,3555,865,1461,1236,1571,4709,103,737,667,1446,3578,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2786,819,1803,1811,1615,2270,1788,311,3586,175,854,733,240,2390,506,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1519,1519,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2757,1597,915,3952,276,2516,3009,1503,2377,795,2023,1374,367,1374,942,2,2797,2797,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,846,2,965,2,2,2,2,2,2,2,2,2,2,2,2,2,1811,1811,1811,1811,1811,2,1811,2,2,846,2,2,2,2,846,846,846,846,846,846,1811,846,846,2,2,1811,1811,1824,2,2,2,2,2,2,2,965,965,2,1811,1811,1811,2,2,1811,1811,1811,1811,965,965,965,965,965,1811,1811,1811,1811,1811,2,846,2,2,2,2,1811,1811,2,2,2,2,2,2,2,2,846,2,846,846,1811,1811,2,2,2,2,2,1824,1811,1811,2,2,846,846,846,1824,846,846,965,2,2,965,2,2,2,2,2,2,1811,1811,2,2,1811,1811,1811,1811,1811,1811,2,846,2,2,846,846,1824,2,2,2,2,1811,1811,1824,1824,1824,1824,1824,1824,1824,1811,1811,2,2,2,2,965,1811,1811,1824,1811,1811,1824,1824,1811,846,846,846,1824,1824,1824,846,846,846,1824,1811,1811,1811,1811,1811,1811,1811,1811,1811,846,846,1811,846,1824,1824,1824,1824},
+ {3822,544,1206,198,2240,2304,436,470,1554,480,1004,684,684,1447,857,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2641,2641,2641,2641,2641,2641,2,2641,2641,2641,2641,2641,2641,2641,2,2641,2641,2,2641,2,2,2641,2641,2,2641,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2641,2641,2641,2,2,2641,2641,2,2641,2641,2,2,2,2,2,2,2,2,2,2,2,2,2641,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2065,2065,2065,2065,2065,2065,2065,2065,2065,2065,2065,2065,2065,2,2,2,337,2641,2641,2641,2,2,2641,2641,2641,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2641,2641,2641,2641,2641,2641,2,1286,2641,2,2,2,2,2,2,2,2641,2641,2641,2641,2641,2641,2641,2641,2641,2641,2641,2641,2641,2641,2641,2641,2641,2641,2641,2641,1286,1286,1286,1286,2641,2641,2641,2641,2641,2641,2641,2641,2641,2641,2641,2641,2641,2641,2641},
+ {3037,2253,481,1560,1445,662,1851,646,1118,483,1026,3500,1610,1020,1569,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2835,2835,2835,2835,2835,2,2,2795,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2795,2835,2795,2795,2,2795,2,2,2,2,2,2,2795,2795,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2795,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2795,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2795,2795,2,2795,2,2,2,2,2,2795,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3713,1290,2595,2244,1373,567,1413,2920,2171,2125,1438,1438,1521,325,195,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1197,1197,2,1197,2,947,2,947,1197,1197,2,1197,1197,1197,2,1197,1197,1197,1197,1197,1197,1197,1197,1197,1197,1197,1197,1197,1197,1197,2,2,1197,1197,1197,1197,1197,1197,2,2,1197,2,1197,2,1197,1197,1197,1197,1197,1197,947,947,947,947,2,2,2,1197,1197,1197,1197,2,2,2,1197,1197,1197,1197,1197,1197,1197,1197,1197,1197,1197,1197,2,1197,1197,1197,1197,1197,1197,1197,1197,1197,1197,1197,1197,1197},
+ {3817,3054,2707,854,1986,902,1940,712,1172,1792,725,1060,1906,1173,1173,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2783,2783,2,2,2,2,2913,2,2,2,2,2783,2913,2783,2,2913,2913,2,2783,2783,2,2,2,2783,2783,2783,2783,2913,2783,2913,2913,2913,2913,2913,2913,2913,2783,2783,2783,2783,2783,2783,2,2,2783,2783,2,2,2783,2913,2783,2783,2783,2783,2783,1648,1648,1648,1648,1648,1648,1648,2913,2783,3834,2783,2783,2783,2783,2783,2783,3834,3834,3834,3834,2783,2783,2783,2783,2783,2783,2783,2783,2783,2783,2913,2913,2783,2,2,1440,1440,1440,2,2,2,2,2,2,3834,2,3834,3834,3834,2913,2913,2913,2,2783,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2783,2783,2,2,2,2,2,2913,2913,2913,2913,2913,2,2,2,2,2783,2783,2,2,2,2783,2783,2783,2783,2783,2,2783,2783,2783,3834,3834,2783,2783,2783,2783,2783,2783,2783,2,2783,2783,2783,2783,2,2,2,2783,2,2783,2783,2783,2,2,2,2783,2783,2783,2783,2783,2,2783,2783,2783,2783,2783,2783,2783,2783,2783,2783,2783,2783,2783,2783,2783,2783,2783,2783,2783,2783,2783,2,2783,2783,2783,2,2},
+ {3850,1354,2055,1817,836,816,1573,1220,2033,1981,675,3143,3056,2729,2603,2,2,2,2,1689,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1210,1210,1210,2,1210,1210,1210,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1210,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1210,2,2,2,1210,2,2,2,2,2,2,2,1210,2,2,2,2,2},
+ {2784,1092,1665,1465,4427,67,1038,1041,215,13,1066,1719,239,183,3253,2,2,2,2,2,2386,2386,2386,2,1190,2386,2,1190,1190,2,2,2,1190,1190,1190,1190,2,2,2,1190,1190,2,2386,1190,2386,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1710,1190,2,2,2,1190,2,1190,1190,2,1190,2,2,2,2,1190,1190,1190,1190,2,2,2,2,2,1190,1190,2,2,2,2,2,1190,1190,2,2,2,2,2,2,2,2,2,2,2,1190,1190,2,2,2,2,2,2,2,2,1190,1190,1190,2,2,2,2,2,2,2,2,2,2,2,2,1190,1190,1190,1190,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1190,1190,1190,1190,1190,1190,1190,2,2,2,1190,2,2,2,789,1190,1190,2,2,2,2,2,1190,1190,2,2,2,1190,1190,1190,2,2,1190,2,2,2,1190,1190,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1190,1190,2386,2386,2,2,2,2,2,2386,2386,2386,2386,2386,2,2,2386,2386,2,1710,2,2,1190,1190,2,2,1190,1190,1190},
+ {2957,2072,1889,972,2900,2193,2533,150,1468,459,459,982,422,2027,2027,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3071,3016,1170,3432,1426,816,1935,110,787,1891,1338,2533,3141,851,3040,2,2,2,2,2,2,2,2,2,2,2,2,3143,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2312,1890,3591,553,532,2974,1292,4516,4456,875,3883,135,1944,1680,1680,2,2,1533,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1771,2,1771,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1771,2,2,2,1771,1771,2,2,2,2,2,2,1771,1771,1771,1771,1771,1771,1771,2,2,2,2,2,1771,1771,1771,2,2,2,2,2,2,2,2,2,2,2,1771,2,2,2},
+ {2827,1081,795,1356,1066,516,2526,25,1481,1481,2438,2438,1230,110,756,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3929,1885,555,1295,141,2892,885,422,4016,43,1671,536,774,1219,1219,2,2,1167,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2367,2367,2,2,2367,2367,2,2367,2,2,2,2,2,2,2367,2,2,2,2367,2367,2,2,2367,2367,2,2,2367,2,2,2,2,2367,2,2367,2925,2925,2,2,2,2,2367,2,2,2,2,2,2,2367,2367,2367,2367,2367,2367,2367,2367,2,2367,2367,2367,2367,2,2,2,2,2,2367,2367,2367,2367,2367,2,2,2,2367,2367,2367,2367,2367,2367,2367,2367,2367,2367,2367,2367,2,2,2,2,2,2,2925,2367,2367,2367,2367,2367,2,2,2,2367,2367,2367,2367,2367,2367,2,2,2,2,2925,2925,2925,2925,2925,2925,2925,2925,2925,2367,2367,2367,2367,2367,2367,2367,2907,2907,2367,2367,2367,2,2367,2367,54,2367,2367,2367,2367,2367,2925,2367,2925,2925,2367,2367,2367,2367,2367,2367,2367,2367,2367,2925,2925,2925,2925,2925,2367,2367,2925,2367,2,2367,2367,2367,2367,2367,2367,2,2367,2367,2367,2367,2367,2367,2367,2367,2367,2,2,2367,2367,2367,2367,2367,2367,2367,2367,2907,2907,2907,2,2,2,2367,2367,2,2367,2367,2925,2925,2925,2,2,2,2,2925,2367,2367,2925,2367,2367},
+ {3740,2476,4480,2009,1139,3887,1813,1090,587,1480,688,1392,925,3285,2521,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,991,2,214,2,991,991,991,2,2,2,2,2,2,2,2,2,2,2,214,214,214,214,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2419,2,2419,2419,2419,2419,2419,2419,2,2,2,1822,1822,1822,1822,2,2,2419,2419,2,2,2,2,2,2,2,2,2419,1822,2,1822,1822,2,1822,2419,2,2419,2419,2419,2419,2419,214,2,1822,2,2,2,1822,214,2419,2419,2419,2419,2419,2419,2419,2419,2419,2419,1822,2,2,1822,214,214,2,2,2,2419,2419,2419,2,2,2,214,214,991,991,991,991,991,991,991,991,214},
+ {3893,2617,1958,2430,111,131,3612,960,2822,1651,3680,1718,3985,3105,3105,2,1407,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,721,721,2,2,2,2,2,2,2,2,2,2,2,721,721,2523,721,721,721,2,2523,721,2,721,721,721,2,721,721,721,721,721,721,721,721,721,721,721,721,721,2523,721,721,2,2,721,2,2,2,721,721,721,721,721,721,721,721,2,2,2,2,2523,2,2,721,721,2,721,721,2,721,721,721,721,721,721,721,721,721,721,721,721,721,721,721,721,721,721,721,721,2523,2,2,721,721,721,2,2,2,2,2,721,721,721,721,721,721,2,2,2,2,2,2,2,2,2,2,2,2,2,721,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2523,2,2,2523,721,721,721,2},
+ {4220,2077,1066,4432,821,1617,1025,2112,3111,842,3421,2571,2571,272,272,2,3721,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3663,3663,3663,3663,3663,2,2,3663,3663,2,2509,2,2509,2509,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2509,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3663,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {4281,1769,1413,381,1071,3091,2349,3044,2706,1888,350,1794,4058,521,2799,2,88,2,2,2,2,2,2,760,760,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,760,760,2,2,760,760,760,760,760,760,760,760,760,760,2,2,760,760,760,2,2,760,2,760,760,760,760,760,2,2,2,2,2,2,2,2,2,760,760,760,760,760,760,760,2,767,767,767,803,803,803,760,760,760,2,2,2,2,2,2,760,760,2,803,767,767,767,767,767,2,2,767,767,760,760,760,760,760,760,760,760,3481,3481,760,760,760,760,760,760,760,760,760,760,760,760,760,760,760,760,760,760,760,760,760,760,760,760,760,3481,3481,3481,3481,760,760,760,418,418,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,767,2,2,2,3481,3481,3481,3481,3481,2,2,3481,685,685,760,2,3481,3481,3481,3481,3481,3481,3481,3481,3481,3481,3481,3481,3481,3481,3481,767,767,760,3481,3481,767,767,767,767,767,767,767,767,767,767,767,767,767,767,3481,3481,767,767,767,767,3481,3481,3481,3481,3481,3481,3481,3481,3481,3481,3481,3481,3481,3481,3481,3481,3481,3481,3481,3481},
+ {3044,903,2580,421,1005,3176,993,1860,1266,764,1719,696,2157,16,537,2,696,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,925,2,2,2,2,2,2,925,925,2,2,2,925,2,2,2,2,925,925,2,2,925,925,925,2,2,2,2274,2274,2274,925,925,925,925,2,925,925,925,2,4465,4465,2,2,2,925,925,2,2,2,925,925,2,2,2,2,2,2,2,2,2,2,2,2,2274,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3793,1510,4182,3018,280,1377,1215,2989,2326,364,1120,2103,2465,1295,1295,3252,3252,2,2,2,2,2027,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2027,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3778,2242,2108,1380,1643,2739,1533,1053,59,2127,778,2679,2679,2679,1324,1330,296,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1729,1729,2,2,2,2,1729,1729,1729,1729,1729,1729,1729,2,1729,1729,1729,2,2,1729,1729,1729,1729,1729,2,2,2,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,2,2,1729,1729,1729,1729,1729,1729,2406,2406,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,2908,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,1729,2,2,2,2,2,2,2,2,2,2,2,1729,1729,1729,2,2,2,1729,2,2,2,2,2,2,1729,1729,1729,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3118,728,620,1332,409,4537,668,2938,443,738,1562,616,642,423,811,811,1590,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2849,3597,1986,3387,3239,1197,4305,2790,639,2883,164,3397,2905,2849,4119,3660,2359,3485,3485,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3311,2,2,2,2,2,2,2,3311,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3311,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3311,2,2,3229,2,2,3229,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3229,2,2,2,3229,3229,3311,3229,2,2,3229,2,2,2,2,3229,2,2,2,3229,3229,2,2,2,2,3229,3229,2,2,3229,3311,2,2,2,3229,3311,3311,3311,3229,3229,3229,3229,3229,3229,3311,3311,3311,3311,3229,3229,3229,3311,3311,3311,3229,2,2,3229,3229,3229,3229,3229,3229,3229,3229,3229,3229,3229,3229,3229,3229,3229,3229,3229,3229,3229,3229,3229,3229,3311,3311,3229,3229,3229,3229,3229,3229,3229,3311,3229,3229,3229,3229,3229,3229,3229,3229,3229,3229,3229,3229,3229,3229,3229},
+ {4279,1202,2743,1390,117,400,1525,1642,1013,3177,445,1524,227,3847,3161,1319,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,889,889,2,2,2,889,631,631,631,889,889,889,889,889,889,889,2,2,2,2,2,2,2,2,2,889,889,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2889,2748,1621,1037,2858,797,3236,4003,1111,562,1801,465,465,930,1644,934,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2083,2083,2,2,3267,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2083,2083,2083,2083,2,2,2,2083,2083,2083,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2083,2,2,2,2,2083,2083,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2083,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2083,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2083,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3967,1825,792,1863,2341,632,214,1720,274,387,2240,382,1508,571,705,776,3045,3045,2,2,2,2,2,2,2,2,2,2,2,2,2,4677,2,4677,2,2,2,2,2,2,2,2,2,3054,3054,3054,2,2,3054,3054,2,2,2,2,2,2,2,2,2,3054,2,2,2,3054,2,2,3054,3054,2,2,2,2,2,2,3054,3054,3054,2,2,2,2,2,2,72,3054,72,2,3054,2,2,2,3054,3054,3054,3054,3054,3054,3054,3054,3054,3054,3054,3054,3054,2,2,2,3054,3054,3054,3054,3054,3054,3054,3964,3964,3964,2,2,2,2,2,3054,2,2,2,2,2,2,2,3054,3054,3054,2,2,2,2,72,72,72,72,72,72,2,3964,3964,2,2,4677,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3964,2,3964,3964,3964,3964,3964,3964,3964,3964,2,3964,3964,3964,2,2,3054,72,4677},
+ {3086,2303,2196,3389,1223,1070,3437,4307,690,919,2013,2640,954,954,816,2209,2,680,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,305,305,305,305,305,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,680,680,680,2,680,680,2,680,680,680,680,680,680,680,680,680,680,680,680,2,680,680,2,680,680,680,680,2,2,2,2,2,680,680,2,2,2,2,680,680,680,680,680,680,680},
+ {3979,2529,771,1317,685,1603,2910,3278,539,2573,728,501,1044,1002,2004,1002,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3185,3185,2,2,2,2,2,2,2,2,2,2,2,2,2,3185,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3185,3185,3185,3185,3185,2,2,3185,3185,3185,3185,2,2,2,2,3185,3185,3185,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3185,3185,2,2,2,2,2,2,3185,2,2,2,2,3185,2,2,2,2,3185,2,2,3185,3185,3185,2,3185,3185,3185,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {4309,2339,547,854,1172,522,1792,473,795,2158,981,1685,1685,1685,1685,1685,1588,1588,1588,2,2,2,2,2,2,2,1808,1808,2,2,2,1808,2,2,2,1808,1808,1808,1808,1808,1808,1808,1808,1808,1808,1808,1808,1808,1808,2,1808,1808,1808,1808,1808,1808,2,1808,2,1808,1808,2,2,2,216,2,2,1808,1808,1808,1808,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1808,1808,2,2,2,502,502,1808,2,2,2,2,216,2,2,216,216,216,216,1808,2,2,2,1808,2,2,1808,2,2,2,1808,1808,2,2,2,1808,1808,1808,216,1808,1808,1808,1808,2,2,1808,1808,1808,216,1808,1808,1808,2,1808,1808,1808,1808,1808,1808,1808,1808,1808,1808,1808,1808,1808,1808,1808,1808,1808,1808,1808,1808,2,1808,2,1808,2,2,2,1808,2,1808,1808,1808,2,1808,2,2,2,2,2,2,2,1808,1808,1808,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,216,2},
+ {2914,2810,976,986,1009,170,337,4358,2455,3232,648,648,1708,161,161,1205,2,2,2,2,2,2,2,2,2,2,2963,2,2,2963,2963,2963,2,2,2,2,2,2,2,2787,2787,2963,2787,2,2787,2787,2,2,2,2,2,2,2787,2787,2787,2,2,2787,2963,2,2,2,2,2,2,2787,2787,2,2,2,2,2,2,2,2787,2787,2,2787,2,2,2,2,2,2,2,2,2,2787,2787,2,2,2787,2,2,2,2,2,2,2,2,2787,2787,2,2,2,2,2,2787,2787,2787,2787,2787,2787,2787,2787,2787,2,2,2787,2787,2787,2787,2787,2787,2787,2787,2787,2787,2787,2787,2,2787,2787,2787,2787,2,2787,2,2787,2,2787,2787,2,2,2,2,2,2,2,2787,2787,2,2787,2787,2787,2787,2787,2,2,2,2,2,2787,2787,2787,2787,2787,2787,1220,1220,1220,2787,2787,2787,2787,2787,2787,2787,2026,2026,1220,2,2,2,2787,2787,1220,2787,1220,1220,1220,1220,1220,1220,2787,2787,2787,2,1220,1220,2787,2787,2787,2787,2787,2787,2787,2787,2787,2787,1220,2787,2026,2026,1220,2026,2026,2026,2026,2787,2963,2963,4161,2787,2787,2787,2787,1220,1220,1220,2787,2787,2787,2787,2787,1220,1220,1220,1220,1220,1220,1220,4161,1220,2512,2512,2787,2787,2787,1220,2787,1220,1220,1220,1220,1220},
+ {2919,2029,2784,1475,3857,413,3489,327,439,1429,119,930,198,222,3409,3392,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3836,1091,2137,3008,2859,1937,2540,2048,2657,1786,60,4519,2935,3585,1117,1117,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2931,1188,4468,518,1131,335,958,2312,4013,1466,1026,824,2024,2024,3130,869,2,2,2,2,2,2,1540,909,909,1277,2,2,909,909,909,909,909,845,1277,909,909,1277,1277,2,1277,1277,1277,2,2,433,2,2,2,2,2,2,909,909,909,909,909,2,2,909,2,909,2,2,909,909,2,2,2,2,2,2,2,433,2,2,2,2,2,433,2,2,2,909,2,2,909,909,2,2,2,1277,1277,2,1277,1277,1277,1277,2,1277,1277,1277,2,1277,1277,2,2,1277,1277,1277,2,2,2,1277,1277,1277,1277,1277,1277,1277,2,2,2,2,909,1277,1277,1277,1277,1277,1277,1277,1277,1277,1277,1277,1277,1277,1277,1277,1277,1277,1277,1277,909,1277,4235,4235,4235,4235,1277,1277,1277,1277,1277,1277,2,1277,1277,2,2,2,2,1277,1277,1277,2,1277,1277,2,2,2,2,2,2,2,2,2,1277,2,2,2,1277,2,2,2,2,2,1277,1277,2,909,909,1277,2,2,2,2,1277,1277,2,1277,1277,2,2,2,2,1277,1277,1277,1277,2,2,2,2,909,909,909,909,909,909,909,909,909,909,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {4061,2448,1182,361,2559,331,117,1934,2666,2443,972,2592,644,1577,1283,1283,2,2,2360,2360,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {4003,2758,3675,2506,2313,547,1993,1923,3153,998,1718,3236,3236,4393,4393,4393,2,2,2,2,2029,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1955,2,2,2,1955,1955,1955,1955,2,1955,1955,2,2,2029,2029,2,2,1534,2,2,2029,2029,1955,2,2,2,2,1955,1955,2029,1955,1955,1955,1955,2,2,2029,2029,2029,2,2,2029,1955,1955,2,1955,1955,2029,2029,2029,2029,2029,1955,2029,2029,2029,2029,2029,1955,2,2,1955,1955,1955,1955,1955,1955,1955,2029,1955,1955,1955,1955,1955,1955,1955,1955,1955,1955,1955,1955,1955,1955,1955,1955,1955,1955,2029,1955,1955,1955,1955,2029,1955,2029,2029,2029,2029,2029,2029,2029,2029,2029,2,2,2029,2029,2029,2029,2029,2029,2029,2029,2029,2029,2029,2029,2029,1955,2029,2,2,2,2,2,2,2,2029,2029,2,2,2,2,2,2,2,2029,2,2,2,2,2,2,2029,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3865,1665,1709,3099,1335,924,2281,2239,244,2497,24,2006,1364,1364,1071,1675,2,2,2,2,2,2,2,2,2,2,2,2,2,722,722,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1264,1264,1264,1264,1264,1264,1264,1264,1264,2790,2790,2,2,2,2,2,2,722,722,722,722,722,722,722,722,2790,2790,2790,722,722,722,722,2,722,722,2,722,2,2,722,722,2,2,2,2,2,2,2,722,722,38,722,722,722,722,722,722,722,722,722,722,2365,722,722,722,2790,2790,722,722,2,722,2,2,2,722,722,2,2,1526,1526,1526,2,2,2,2790,2790,2,722,722,722,722,722,722,722,722,722,2,2,2,2,1264,2,2,2,2,2,1526,1526,2,2,1526,1526,2,2,2,2790,2,2,2,2790,2790,2790,2790,2790,2790,2790,2790,2,2,2,2,2,722,722,2,2790,2,2,2,2790,2790,2790,2,2,2,2,2,2,2,2,722,2,2,2,2790,2790,2,2,2,2,2790,2790,722,2,1526,1526,1526,1526,722,722,2,2,722,722,722,2,2,2,722,722,722,722,722,722,722,722,2,2,2,2,2,2,2,2,2,2,2},
+ {3117,2133,1835,2144,758,3030,2342,609,1867,702,1924,3379,607,2939,1240,473,3178,3178,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3178,3178,3178,2,2,3178,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2606,2606,2606,2606,2606,2606,2606,2,2606,2606,2606,2606,2606,2606,2606,2606,2606,2606,2606,2606,2606,2606,2606,2606,2606,2606,2606,2606,2606,2606,2606,2606,2606,2606,2606,2606,2606,2606,2606,2606,2606,2606,2606,2606,2606,2606,2606,2606,1009,2,2606,2606,2606,2606,3178,2606,2606,2606,2606,2606,2606,2606,2606,2606,1009,1009,1009,1009,2606,2606,1488,2,2,2606,2606,2606,2606,2606,2273,2606,2606,2606,2606,3178,2606,2606,2606,2606,2606,2606,2606,2606,2606,2606,2606,2606,2606,2606,2606,2606,2606,2606,2606,2606,2606,2606,1009,1009,2606,1009,1009,2606,1009,2606,1009,2606,2606,2606,2606,1009,2606,2606,1009,1009,1009,2606,2606,2606,2606,2606,2606,2606,2606,2606,2606,2606,2606,2606,2606,2606,2606,2606,2606,2606,1009,1009,2606,2606,2606,2606,2606,2606,2606},
+ {2960,1023,3429,2869,274,476,2469,2574,694,2021,3344,3052,4080,2918,2176,101,2741,2741,2,2,2,2,1056,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {4029,3266,4148,1744,5028,220,1274,3538,1038,2060,102,803,2841,3030,2346,283,805,805,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2318,2318,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3926,1121,661,2102,238,1768,1074,632,2422,1627,1627,1734,2298,574,2629,4123,2628,2,2,843,843,843,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1988,2,2,2,2,1988,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3927,2090,603,1313,3378,133,915,200,2193,486,2989,4632,2383,2383,2383,944,944,2,2,2341,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2341,2341,2,2,2,2,2,2,2,2,2,2,319,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,319,319,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2341,2341,2,2,2,2,2,2,2,2,2,2,2,319,319,2,2,2,2,2341,2341,2,2,2,2,2,2341,2341,2341,2341,2341,2341,2341,2341,2341,2341,2341,2341,2341,2341,2341,2341,2341,2341,2341,2341,2341,2341,2341,2341,2,2,2341,2341,319,319,319,319,319,319,319,2341,2341,2341,2341,2341,2341,2341,2341,2341,2341,2341,2,2341,2341,2341,2341,2341,2341,2341,2341,2341,2341,2341,2341},
+ {3151,2448,2450,553,500,1174,1063,1150,1782,746,1624,5060,419,2,852,3115,330,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2847,2,2847,2847,2,2,2,2,2,2},
+ {4124,4475,2691,816,164,1400,2574,2093,2607,2418,3275,411,2807,2436,2436,1871,1300,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3507,3507,2,3507,3507,3507,3507,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {4063,771,1807,4122,831,1529,1979,1472,481,581,1011,123,2317,2,300,40,40,1670,1670,1670,1670,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,407,2,2,2,2,2,2,407,407,407,407,2,2,2,2,2,2,2,2,2,2,2,2,2,2,407,407,2,2,2,2,2,407,407,407,407,2,2,407,407,407,407,2,407,407,407,407,407,2,2,2,2,407,407,2,407,2,407,2,407,2,407,407,407,2,407,407,2,2,407,407,407,407,407,407,2,407,407,407,407,407,407,2,2,2,407},
+ {2947,3808,1269,2495,3122,2381,1435,1247,288,953,5041,461,461,2,932,932,579,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1033,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,466,2,2,2,2,2,2,2,2,2,466,2,2,2,2,2,2,2,2,2},
+ {2882,1818,3965,375,1684,2011,2654,4758,1735,4774,1834,912,912,2,167,2879,2879,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3330,3330,3330,3330,3330,3330,3330,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,659,391,2,2,2,2,2,2,2,659,659,659,659,659,2,2,2},
+ {4103,1234,2410,2882,3267,2090,1213,615,1821,1645,1225,1542,3789,2,1578,1990,2840,1209,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,885,1177,1177,1177,1177,2,2,2,2,2,2,2,2,2,2,2,2,2,885,2,885,2,2,2,2,2,1177,1177,885,2,2,2,885,885,2,2,1177,1177,1177,885,2,2,2,2,2,2,2,2,2,1177,1177,2,2,2,1177,2,2,2,2,2,2,2,2,885,885,1177,1177,1177,1177,1177,2,2,2,1177,1177,1177,1177,885,885,885,885,885,885,2,2,885,885,885,885,885,885,885,885,885,1177,1177,1177,1177,2,1177,1177,1177,1177,1177,1177,1177,1177,2,1177,885,885,885,2,1177,1177,1177,2,1177,1177,1177,2,2,2,2,2,2,2,2,2,2,1177,2,2,2,2,2,2,2,2,1177,1177,2,2,2,2,885,885,2,2,885,1177,1177,2,2,1177,1177,1177,1177,1177,2,2,1177,1177,1177,1177,1177,1177,1177,1177,1177,1177,1177,814,814,1177,1177,1177,1177,1177,814,814,814,885,1177,1177,885,885},
+ {2977,2211,1109,1245,4545,508,1234,1697,2354,3065,234,3101,3973,2,2,1301,1301,2405,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2405,2405,2405,2405,2,2,2,2405,2405,2,2,2405,2,2405,1040,2,2,1040,2405,2,2,2,2405,2405,2405,2,2405,2405,2405,2405,2,2,2,2,2405,2405,2405,2405,2405,2,2405,2405,2,2,2405,2405,2405,2405,2405,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2,2405,2405,2,2405,2405,2405,2405,2405,2405,2405,2405,2405,2,2,2,2,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2,2,2405,2405,2405,2,2,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,606,606,606,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2405,2,2,2405},
+ {3957,2654,1394,1232,3151,735,557,2919,4475,134,3155,373,357,2,2369,2369,2369,2369,2369,2369,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3086,3086,2,3086,3086,2,3086,3086,2,2,2,2,2,2,2,3086,3086,2,2,3086,2,2,2,2,2,2,2,3086,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {4525,1142,664,807,2035,1848,4105,1969,972,4246,1353,1405,1405,2,2,3387,2631,2631,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3149,2305,1769,836,2421,2534,3437,4108,1011,1939,2073,2421,3867,2,2,4271,4271,4271,1976,1976,2,1976,2,2,2,2,2,2,2,2,2,2,1976,1976,1976,1976,1976,2,1976,1976,1976,2,2,1976,1976,1976,1976,1976,1976,1976,1976,1976,1976,1883,1883,1883,1883,1883,1883,1883,1883,1883,3215,2,2,1976,1976,1976,1883,1883,2,2,2,2,2,3215,1883,1883,1883,1883,1883,1883,1883,1883,1883,3215,3215,3215,1883,2,1883,1976,1976,1883,1883,1883,1883,1883,1883,1883,1883,1883,1883,1883,1883,1883,1883,1883,1883,3215,3215,3215,1883,3215,3215,3215,3215,3215,2,2,3215,3215,3215,3215,3215,3215,1976,3215,3215,3215,3215,3215,3215,3215,3215,3215,3215,3215,3215,3215,3215,3215,3215,3215,3215,3215,3215,3215,1883,1976,1883,3215,2,3215,3215,3215,3215,3215,3215,3215,3215,3215,3215,3215,3215,3215,3215,3215,3215,3215,3215,3215,3215,3215,3215,3215,1883,1883,2,2,2,2,2,2,1883,1883,2,878,878,878,878,878,878,878,878,878,878,878,2,2,1883,1883,2,1883,2,1883,1976,1976,2,2,2,2,2,2,1976,1976,2,1976,2,2,2,2,2,2,2,2,2,1976,1976,1976,1976,2,2,2,2,2,2,2,2,1883,2,2,1976,1976,1976,1976,1976,1976,2,2,1883,1883,2,1976,1976,1976},
+ {3985,640,1503,3318,1146,365,2600,1834,2010,1058,335,4213,242,2,2,499,499,499,499,499,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {4145,1636,3109,710,2245,2940,3513,2900,2396,1887,2137,3397,1126,2,2,2,3033,3071,3071,2,2,2,2,2,2,2,3071,3071,3071,3071,3071,3071,3071,3071,2,2,2,2,3071,3071,3071,3071,3071,3071,3071,3071,3071,3071,3071,3071,3071,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,542,542,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,542,542},
+ {4000,1861,1086,427,245,1445,4145,1532,2038,2188,326,3180,848,2,2,2,4541,2270,3529,1085,2907,2,2,2,2,2,2,2,2907,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2907,2,2,2907,2907,2907,2907,2907,2,2907,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2907,2907,2907,2,2907,2,2,2907,2,2,2,2,2,2,2,2,2,2907,2907,2907,2,2,2,2,2,2,2,2,2,2,2,2907,2907,2,2,2,2,2,179,179,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2907,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2907,2,2,2,2,2907,2907,2907,2907,2,2907,2907,2907,179,179,179,179,179,179,2,2907,2907,2907,2,2,2,2907,2907,2907,2907,2907,2907,2907,2907,2907,2907,2907,2907,2907,2907,2907,2907,2907,2907,2907,2907,2907,2,2,2907,2907,2907,2,2907,2907,2,2907,2907,2907,2907,2907,2907,2907,2907},
+ {4141,2797,3009,4138,573,2805,2158,1116,3330,1879,332,2489,2489,2,2,2,2,1779,719,3236,2,3236,3236,2,2,2,3236,2,3236,3236,3236,3236,3236,2,2,2,2,2,2,2,2,3236,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3236,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3236,3236,2,2,3236,3236,3236,3236,2,2,3236,3236,3236,3236,2,2,3236,3236,3236,3236,3236,3236,3236,3236,2,3236,2,2,3236,2,3236,2,3236,2,2,3236,2,2,2,2,3236,3236,3236,2,3236,2,3236,3236,3236,3236,3236,3236,3236,3236,3236,3236,3236,3236,3236,3236,3236,3236,3236,3236,3236,3236,3236,3236,3236,3236,3236,3236,3236,3236,3236,3236,3236,3236,3236,3236,3236,3236,3236,3236,3236,3236,3236,3236,3236,3236,3236,3236,3236,3236,3236,3236,3236,3236,3236},
+ {4029,1132,524,2837,802,961,627,892,3173,809,837,1290,4920,2,2,2,2,2,1419,1419,1419,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3249,2480,4274,713,4323,5144,3733,3948,1815,2310,2943,4193,4193,2,2,2,2,2,3263,3263,3263,2,2,2,2,1022,1022,3263,3263,3263,3263,3263,3263,3263,2,3458,2,2,2,2,2,2,2,3458,3263,3263,3263,495,3458,2,2,2,2,2,2,2,2,2788,2788,2788,2788,2881,2881,2,3263,2881,2,3458,3458,3263,3263,3263,3263,3263,2,3263,2,2,3263,3263,495,2,2,3263,3263,3263,3263,2,2,3263,3263,3458,3458,3458,2,2,2,2,2,2,2,2,2,2,3263,3263,3263,3263,3263,3263,3263,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3263,3263,3263,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2096,2096,3263,3263,3263,3263,3263,3263,1022,2,495,495,495,2,1022,1022,1022,1022,3263,3263,3263,3263,3263,3263,2788,2,1022,3263,3263,2788,3263,3263,1022,3263,3263,3263,2,2,2,1022,3263,3263,3263,3263,3263,2881,2881,1022,3263,3263,2788,2788,1022,1022,1022,3263,3263,3263,3263,3458,3263,3263,495,495,495,3263,2,3263,3263,3263,3263,3263},
+ {4048,2412,1756,924,1633,446,934,2031,2387,178,220,1936,1202,2,2,2,1937,2450,2450,2450,2,2,1675,2450,2,2,2,1675,1675,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1173,1173,1173,2,2,2,2,2,2,2,2,2,525,525,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,525,525,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,525,525,1173,1173,1173,1173,2,2,2,2,2,1173,1173,2,525,525,525,525,525,2,2,2,525,525,525,2,2,2,2,2,2,525,2,525,525,525,525,2,2,2,2,2,2,2,2,1173,1173,1173,2,2,2,2,525,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,525,525,2,525,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1173,1173,1173,2,525,525,525,525,525,525,525,525,525,525,525,525},
+ {2963,2817,543,1151,326,2434,890,1958,104,104,3763,88,1444,2,2,2,2711,4019,4019,4019,4019,4019,2,2,2,2298,2298,2,2,2,2,2,2,2,2,2,2,2,2,2298,2,2,2,2,2298,2,2,2298,2298,2,2,2,2,2,2,2,2,2,2298,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2298,2,2,2,2,2,2,2,2,2,2298,2,2,2,2,2,2,2,2,2,2,2,2},
+ {4058,2056,5016,3532,966,3023,3095,1597,161,293,3349,530,2470,2,2,2,1261,775,1061,2,1756,2,2,2,2,2,2,2,2,2,1756,1756,1756,885,2,1756,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1756,1756,1756,1756,1756,1756,1756,1756,1756,2,1756,1756,2,1756,1756,1756,2,2,2,2,1756,1756,1756,1756,1756,1756,1756,1756,2,2,1756,1756,1756,1756,1756,1756,1756,1756,1756,1756,1756,1756,1756,1756,2,1756,1756,1756,2,2,2,2,2,1756,2,2,1756,1756,1756,2,1756,2,2,2,2,2,2,2,2,2,2,1756,2,2,2,2,2,2,2,2,1756,2,1756,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {4253,3758,1702,2698,310,2361,929,642,3072,1046,573,5000,5000,2,2,2,886,760,364,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1179,1179,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,246,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,246,246,246,246,246,246,246,246,2,2,246,246,246,246,2,2,2,2,246,246,2,246,2,2,2,2,2,246,2,246,246,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,246,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3231,3353,4269,4866,3076,2434,761,208,3119,1209,1773,3363,3022,2,2,2597,1903,1495,2,2,689,2,2,560,560,560,560,2,2,2,560,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,105,2,2,2,2,2,2,2,2,2,105,105,105,105,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {4221,724,426,529,1809,4609,1953,191,1416,668,2635,494,494,2,2,3247,3247,1535,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,673,673,2,2,2,2,2,2,2,673,673,673,673,2,2,2,673,2,2,2,2,2,673,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,673,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,673,673,2,673,673,2,2,2,2,2,2,2,2,2,673,673,673,673,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,673,673,673,673,673,673,673,673,2,673,673,673,673,673,673,673,673,673,673,673,2,673,673,673,2,673,673,673,673,673,2,2,2,673,673,2,2,2,2,673,2,2,673,2,673,2,2,2,2,2,673,673,673,2,2,673,673,2},
+ {4093,3585,818,3430,1179,4367,1162,209,3785,2224,3241,1180,3875,2,2,801,2409,801,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,522,522,522,522,2,2,2,2,2,2,2,2,2,2,2,2,2,522,522,2,2,2,2,2,522,522,522,2,522,522,522,522,522,2,2,2,2,2,2,2,2,2,2,2,2,522,522,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {4235,3546,3425,134,1242,949,598,3132,397,1314,2020,2838,1245,2,2,3559,3559,3559,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3630,3630,2,2,3630,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3630,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3630,3630,2,2,2,2,3630,3630,3630,3630,3630,3630,3630,3630,3630,3630,651,3630,3630,3630,3630,3630,3630,3630,3153,3153,3153,3630,3630,651,651,651,651,651,3153,3153,3153,3630,3630,2,3153,3153,3153,2,2,2,2,3630,651,651,651,2,651,2,2,2,651,651,3630,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3630,3630,3630,3630,3630,2,2,2,2,2,2,2,2,2,3630,2,2,2,3153,3153,2,2,2,651,651,651,2,3153,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2587,2176,3080,3000,1886,3313,4523,130,474,232,242,4700,3388,2,75,2220,2481,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3306,3306,3306,3306,3306,3306,3306,2947,2947,2947,2,3306,2,2947,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2947,2947,2947,2947,2947,2947,2947,2947,2947,2947,2947,2947,2947,2947,2947,2947,2947,2947,2947,2947,2947,2947,2947,2947,2947,2947,2947,2947,2947,2947,2039,2947,2947,2,2947,2947,2947,2,2947,2947,2947,2,2947,2,2,2,2,2,2,2,2947,2947,2,2,2039,2039,2039,2039,2039,2947,2947,2,2,2947,2947,2,2,2,3306,2,2,3306,3306,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2947,2947,2947,2947,2947,2947,2,401,401,401,2,401,401,3581,2,209,209,648,648,2,2,2,2,2,2,3581,2,2,3581,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {4303,2053,3511,2890,1223,100,4246,2124,1137,3974,1840,1652,5119,696,435,435,435,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,435,435,435,435,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,435,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3108,2288,1189,1259,985,486,953,4524,3134,3684,883,2589,5237,2,780,780,780,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {4106,703,1448,1245,2892,2305,490,4924,797,1130,140,1298,3585,2,3150,3150,3150,2,2,3383,3383,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3383,3383,3383,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3383,3383,2,2,3383,2,2,2,2,2,2,2,2,2,443,443,3383,3383,3383,3383,3383,3383,3383,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,443,443,443,2,443,443,443,443,2,2,2,2,2,443,2,2,2,2,2,2,2,3383,2,2,2,2,2,2,2,2,2,443,2,443,443,443,2,2,2,443,443,2,2,443,443,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,443,2,2,2,2,2,2,2,2,2,2,2},
+ {4251,1365,1222,1793,1149,2572,5022,95,904,732,94,2017,2845,2845,2845,3613,1105,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {4259,2030,795,440,2164,4790,1308,1880,1768,150,161,3148,1199,2099,972,753,753,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,889,889,2,2,2,2,2,2,2,2,2,2,2,2,889,2,2,2,2,2,2,889,2,2,2,889,889,889,2,2,2,2,2,889,889,889,889,889,889,889,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,889,2,2,2,2,2,2,120,120,889,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,120,2,889,889,889,889,889,2,2,2,120,120,120,889,889,889,2,889,889},
+ {3094,2441,2347,1668,2733,2457,1097,3305,498,3614,1525,3660,1524,994,994,497,497,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,480,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,480,480,2,2,2,2,2,2,480,480,480,480,480,2,2,480,480,2,2,2,2,5227,5227,2,2,2,2,2,480,2,2,2,2,2,2,2,2,480,2,480,480,480,480,2,2,2,2,2,2,2,480,480,480,480,480,480,480,480,480,480,480,832,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,5227,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,480,480,2,2,2,2,2,2,2,2,480,480,2,480,2,2,2,2,2},
+ {4131,3529,3105,2584,2938,232,408,640,1759,3125,1292,3851,3652,1129,1792,1792,3881,3881,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,75,75,1018,2,75,75,75,75,75,75,75,75,75,75,75,75,2,2,2,2,2,2,2,75,75,75,2,2,2,2,2,2,2,2,2,2,2,2,1678,2,2,1678,2,2,2,2,75,75,75,75,75,75,75,75,75,75,75,75,1678,1678,1678,1678,1678,1678,1678,1678,1678,1678,1678,1678,1678,1678,1678,1678,1678,1678,1678,2,2,486,2,2,3889,3889,3889,3889,3889,3889,1678,486,3889,3889,3889,3889,3889,3889,75,75,2,2,2,2,2,2,2,2,2,2,2,1678,1678,1678,1678,1678,1678,1678,1678,1678,1678,1678,1678,2,2,1678,2,2,2,2,1678,2,2,2,2,2,2,1678,1678,1678,1678,1678,1678,2,1678,2,1678,1678,1678,1678,2,2,2,1678,2,2,2,2,2,2,1678,486,486,486,486,486,486,486,486,486,486,1678,2,486,2,2,2,3889,1678,1678,1678,2,2,2,1678,1678,1678,2,2,3889,2,2,2,2,2},
+ {4307,3017,4154,1460,3163,489,751,4514,703,3418,3995,3815,1943,428,428,428,2,2,2,2,2,3410,3410,3410,2,2,2,2,2,2,2,2,3410,3410,2,3410,3410,2,249,249,3410,3410,3410,249,3410,2,2,3410,3410,2,3410,3410,3410,3410,3410,2,3410,3410,2,3410,3410,3410,2,249,2,2,2,3410,3410,3410,3410,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3410,2,2,3410,2,2,3410,3410,3410,3410,3410,3410,2,2,3410,3410,3410,2,3410,3410,3410,3410,3410,3410,3410,2,2,3410,3410,249,249,249,249,249,249,3410,3410,3410,2,2,3410,2,3410,3410,2,3410,3410,3410,3410,3410,3410,3410,3410,3410,3410,3410,2,3410,3410,3410,3410,3410,2,2,2,3410,2,2,3410,3410,3410,3410,2,2,3410,2,2,2,3410,3410,3410,3410,249,2,2,2,2,2,249,249,249,2,2,2,2,2,2,249,249,2,2,2,2,2,249,2},
+ {3110,1665,2544,745,1280,2888,2889,3423,2544,693,1179,355,2346,3437,3640,1635,1635,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {4368,2924,3970,4785,215,1847,715,3260,2119,2101,152,2149,209,2515,1296,2302,2302,2302,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2302,2302,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {4646,2149,329,3876,2159,1008,1579,89,1344,4359,774,2390,5589,2133,2373,1053,2,2849,2849,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1101,1101,2,2,2,2,2,2,2,2,2,2,1471,2,1471,2,2,2,2,2,2,2,821,1101,2,1101,1101,2,1101,1101,1101,1101,1101,1101,1101,1101,1101,2,1101,1101,2,2,2,1101,1101,1101,1101,1101,1101,919,2,2,2,2,1101,1101,1101,1101,914,2,1101,1101,2,2,1101,1101,1101,1101,1101,1101,1101,1101,1101,1101,4465,1101,1101,1101,2,1101,1101,1101,1101,2,1101,1101,1101,914,914,914,2,2,914,2,2,1101,1101,914,914,2,914,914,914,914,914,914,914,914,2,914,914,1101,2,1101,1101,1101,1101,914,2,2,2,2,914,1471,1471,1471,2,2,914,914,914,914,914,914,914,914,914,914,2,914,914,914,1101,1101,1101,1101,1101,914,914,2,914,914,914,2,2,2,821,1101,1101,2,2,2960,524,524,1150,2700,512,512,512,512,914,914,3471,3471,3471,3471,3471,3471,3471,914,1101},
+ {3359,2319,3814,767,2963,2993,2755,949,2863,2723,673,1738,3078,1628,3602,3946,511,511,2,2,2,2,2,2,2,2,2,2,2,2,2,2361,2,2,2,2,2361,2,2,2,2,2,2361,2361,2361,2361,2361,2361,2,2361,2361,2361,2361,2361,2361,2361,2361,2361,2361,2361,2361,2361,2361,2361,2361,2361,2,2,2,2,2,2,2,2,2,2,2,2,2,2361,2361,2361,2361,2361,2361,2361,2361,2,2,2,2,2361,2361,2,2,2361,2,2361,2361,2361,2361,2,2361,2361,2361,2361,2361,2361,2361,2,2361,2,2,2,2,2361,2361,2361,2361,2361,2361,2361,2361,2,2,2,2,2,2,2361,2361,2361,2361,2361,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2361,2361,2361,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {4174,3328,616,4311,300,1370,2404,1307,3341,248,2506,1474,840,5080,1877,426,2,2,2,2,2,2,2,2641,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1773,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1773,1773,1773,2,2,1773,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1773,1773,1773,1773,1773,1773,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1773,1773,2,2,2,2,2,2,2,2,1773,1773,2,2,2,1773,1773,1773,2,1773,1773,1773,1773,1773,1773,1773,1773,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1773,2,2,2,2,2,2},
+ {4327,4495,472,2331,2366,701,357,1676,1766,2775,935,659,622,496,2937,2937,2,2,2,2,2760,1731,1731,2,1731,2,2,2,1731,1731,2,2,2,2,539,539,539,1731,1731,2,1731,1731,1731,1731,1731,1731,1731,1731,1731,1731,1731,1731,1731,1731,1731,1731,1731,539,2,2,1731,1731,1731,1731,1731,1731,1731,373,2,2,373,373,373,373,373,2,2,373,2,2,1731,1731,1731,2,2,2,2,2,1731,1731,1731,1731,373,373,373,373,373,373,373,373,373,539,539,373,373,1805,1805,1805,1805,1805,1731,1731,1731,1731,1731,2,1731,1731,1731,1731,1805,1805,1805,539,539,1731,1731,1731,1731,1731,2,2,2,2,1731,1731,1731,1731,1731,1731,1731,1731,1731,2378,1805,1805,2378,2378,539,2378,2378,2378,1805,1805,2378,2378,2378,1731,1731,1731,1731,1731,1731,1731,1731,1731,1731,1731,1731,1731,1731,1731,1731,1805,1805,1805,1805,1805,1805,1093,1093,1093,1093,1093,1093,1093,1805,1805,1805,1805,1805,1805,1805,1093,1093,1093,1093,2378,2378,2378,2378,2378,2378,2378,2378,3487,2378,1805,1805,1805,1805,1805,2378,2378,1805,1805,1805,1805,1805,1093,3586,3586,546,1093,1093,1731,1093,1093,1093,2378,2378,2378,2378,2378,2378,2378,1093,373,373,1093,1731,2378,2378,2378,2378,2378,2378,373,1731,1731,2378,2378,373,373,373,373},
+ {4321,1288,1049,620,262,2606,1427,2019,566,683,752,447,287,1167,5054,5054,2,2,2,1130,1130,2,2,2,2,2,2,2,2,2,2,2,2,2,2899,2899,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,864,864,864,864,864,864,2,2,2,2,864,864,864,2899,2,2,864,864,864,864,864,864,864,864,2,2899,2899,864,2899,864,864,864,864,864,864,864,864,864,864,864,864,2,864,2,864,864,2899,864,2,2899,2899,2899,864,864,2899,2899,2899,864,864,2899,2899,2,2899,2899,2899,2899,2899,2899,2899,2899,2899,2899,2899,2899,2899,2899,2899,2899,864,864,864,864,864,864,864,864,864,864,864,864,864,864,864,864,2,864,864,864,2,859,859,859,859,859,864,864,864,864,864,864,864,864,2,864,864,864,864,864,864,864,864,864,2,864,864,864,864,864,2899,2899,2899,2899,864,864,864,864,864,2899,2,864,864,864,864,864,2},
+ {4331,680,703,2747,700,4787,818,875,1521,1758,1691,2925,2925,2925,2130,1134,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {4444,2743,3035,2582,2170,2917,289,2906,375,810,3764,2960,79,151,3561,3561,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1929,2,2,2,2,2,1929,1929,1929,2,2,2,2,1929,2,2,2,2,2,1929,1929,1929,1929,1929,1929,1929,1929,1929,1929,1929,1929,1929,1929,1929,4693,4693,4693,2,1929,1929,1929,1929,1929,2,2,1929,1929,1929,2,2,1929,1929,1929,2,2,2,2,2,2,2,2,2,1929,1929,1929,2,2,2,2,2,1929,2,2,2,2,2,2,1929,1929,1929,1929,1929,2,1929,1929,1929,2,1929,1929,1929,2,1929,1929,1929,1929,1929,1929,2,1929,1929,1929,1929,1929,1929,1929,1929,1929,1929,1929,2,1929,1929,2,2,2,2,1929,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1929,2,2,2,2,2,2,2,2,1929,1929,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {4223,2572,1394,1562,4430,2932,888,1376,1437,1082,2056,1082,1301,3364,204,3364,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4276,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {4744,3698,1767,2534,1226,3419,1776,2628,4687,660,711,4962,1340,4962,4962,1104,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,597,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,597,597,597,2,2,2,2,2,2,2,2,2,2,2,2633,597,2,2,597,2,2,2,2,2,2,2,2633,2,2,2,2,2633,2,2,2633,2633,2633,2,2,2633,2,2,2,2,2,2,2633,2,2,2,2,2,2,2,2,2,2633,2633,2633,2633,2633,2633,597,597,2633,2633,2633,2633,2633,2633,2633,2633,2633,2633,597,597,597,597,597,597,2633,2633,597,597,597,597,2633,597,2633,597,2633,2633,2633,2633,2633,2633,2633,2633,2633,2633,2633,2633,2633,2633,2633,2633,2633,597,2633,2633,597,2633,2633,2633,2633,597,2633,2633,2633,2633,2633,2633,2633,2633,2633,597,597,2633,2633,2633,2633,2633,2633,2633,2633,2633,2633,2633,2633,2633,2633,2633,2633,2633,2633,2633,2633,2633,2633,2633,2633,2633,2633,2633,2633,2633,2633,2633,2633,597,597,2633,2633,2633,2633,2633,2633,2633,2633,2633,2633,2633,2633,2633,2633,2633,2633,2633,2633,2633,2633,2633,2633,2633,2633,2633,2633,2633,2633,2633,2633,2633,2633,2633,2633,2633,2},
+ {4771,2156,4334,2205,2377,2852,848,2798,3197,1382,2039,2222,1005,1005,1005,1005,2,3270,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,917,917,2,2,2,2,2,2,2,2,2,2,1588,2,2,2,917,917,2,2,917,2,2,2,917,2,2,2,2,2,917,2,2,2,2,2,2,2,2,2,917,917,917,917,917,917,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,917,2,2,2,2,2,2,2,2,2,2,917,917,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,917,917,2,2,2,2,2,2,917,917,917,2,2,917,2,2,2,2,917,917,2,917,917,2,2,2,917,917,917,917,2,917,2,2,917,917,2,917,2,2,2,2,2,2,2,917,917,917,2,2,917,917,917,917,2,2,2,917,917,917,917,917,917,917,917,917,917,917,917,917,917,917,917,917,917,917,917,917,917,917,2,2,2176,2176,917,917,917,917,917,2176,917,1588,2,2,917,2,2,2,917,1588},
+ {3363,1627,2360,4953,3960,1918,3364,1295,1539,2678,680,591,4068,16,738,738,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1204,1913,2,1913,1913,1913,2,2,2,1913,1913,2,2,2,2,1913,1913,2,2,1913,1913,1913,1913,2,2,1913,1913,1913,2,1913,1913,1913,1913,1913,1913,1913,1913,1913,1913,1913,1913,2,1913,1204,1913,1913,1913,1913,1913,1913,1913,1913,1913,1913,1913,1913,1913,1913,1913,1913,1913,1913,1913,1204,1204,1204,2,1204,1204,1204,1204,2,1204,1204,1272,1272,1272,1913,1913,1913,1913,1913,1913,1913,2,1913,1913,1913,1913,1913,1913,1913,1913,1913,1913,1913,1913,1913,1913,1913,2,2,2,2,2,2,1204,1204,2,2,2,2,2,2,2,1913,1913,1913,1913,1913,1913,1913,1913,1913,1913,1913,1913,2,2,2,2,2,1913,1913,1913,1913,1913,1913,1913,1913,1913,1913,1913,1913,1913,1913,1913,1913,1913,1913,1913,1913,1913,1913,1913,1913,1913,1913,1913,1204,1204,1204,1204,1913,1913,1204,2294,1913,1272,1272,1204,1204,1272,1272,1272,1913,1913,1913,1913,1913,1913,1272,1913,1913,1913,1913,1913,1913,1204,1204,1204,1204},
+ {3191,1484,856,1118,1315,2931,3575,1068,3816,1317,2951,495,1696,255,255,1789,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,76,76,76,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2463,2463,2463,2463,2463,2,2,2,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463,2,2,2,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463,2463},
+ {4258,1372,2035,1344,4398,3198,797,179,1561,544,3992,1745,1221,2452,3124,3124,1562,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2986,2986,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2986,2,2986,2986,2,2,2,2,2,2,2986,2,2,2986,2,1544,2,2,2,2,2986,2986,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2986,2986,2986,2986,2986,2986,2986,2986,2986,2986,1544,2986,2,1544,1544,2,2,1544,2986,2986,2986,2,2,2,2,2,2,2986,2986,2986,1544,2986,2986,2986,2986,2986,2986,2986,2986,2,2986,2986,2986,2986,2,2,2986,2986,2986,2986,2986,2986,2986,2986,2986,2986,2986,2,2,2986,2986,2986,2986,1544,1544,2,2986,2986,2986,2986,2986,2986,2986,2986,2986,2986,2,1544,1544,2986,2986,2986,2986,2986,2986,2986,2986,2986,2986,2986,2986,2,2,1544,2,2986,2986,2986,2986,2986,2986,2,2,2,2,2986,2986,2986,2986,2986,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3451,2156,3807,2475,1923,620,715,1020,1213,84,2809,1641,254,824,824,1212,1212,2,2,2,2,2,2,3393,2,2,2,2,2,3547,3547,3547,3547,3547,3547,3547,2,2,2,2,2,2,2,2,2,2,2,2,3393,3547,2,3393,3393,3393,3393,3393,2,2,2,1352,278,278,278,278,278,2,2,2,2,2,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,2,3393,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2725,2,2,2,2725,2725,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3393,3393,2,2,3393,2,2,2,2,2,2,2,449,449,449,449,2,2,2,449,449,449,449,449,449,2,2,2,2,2,2,2,2,2,2,2,2,2,2,449,2,1352,1352,1352,1352,2,2,3393,3393,2,2,2,2725,2725,3393,3393,3393,3393,3393,2,2,3393,3393,2,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393,3393},
+ {3407,4018,3750,1764,653,3122,1071,4341,3483,361,1921,674,674,58,1638,2121,510,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3097,3097,2,2,3097,3097,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3097,2,3097,2,2,3097,3097,3097,3097,3097,3097,2,2,3097,3097,2,3097,3097,3097,3097,3097,3097,3097,3097,2,3097,3097,3097,3097,3097,3097,3097,3097,3097,2,3097,3097,3097,2,2,3097,3097,3097,3097},
+ {4447,1190,950,4349,3246,755,475,4183,2708,1739,3188,1542,1826,1341,2002,2002,2002,2,2,2,2,3751,3751,3751,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3751,3751,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,187,187,187,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,187,187,2,2,2,187,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3751,2,2,2,2,2,2,3751,3751,2,2,2,2,2,2,1642,2,2,2,2,1642,1642,1642,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {4220,1731,1633,3483,97,1506,4029,3010,813,2764,582,2865,145,1624,787,812,1046,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {4478,1850,4006,2865,2234,994,5022,519,2719,3495,3570,409,1221,5141,2794,5141,5141,3241,3241,2,3241,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1439,2,2,2,2,2,1580,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1439,2,2,1439,1439,1439,2,2,2,2,2,2,1439,1439,1439,1439,1439,2,1439,2,2,2,1580,1580,2,2,2,2,1439,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1439,1439,1439,2,1439,1439,1439,2,2,2,1439,1439,1439,2,2,1439,1439,2,2,1439,1439,2,1439,2,2,2,2,1439,1439,1439,1439,1439,1439,1439,2,2,2,1439,1439,2,2,1439,1439,2,2,2,1439,1439,2,1439,2,2,1439,2,2,1439,1439,2,1439,1439,2,2,2,2,2,2,1439,1439,2,2,2,2,2,2,2,2,2,2,2,1439,2,2,2,2,2,2,2,2,2,2,2,2,2,1439,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3267,3968,350,2514,2909,2516,214,2131,1573,4844,4156,1574,117,87,3020,3020,3020,3020,3020,2,2,2,2,2,2,2,2,2,2,2,2,2,645,645,2,2,2,2,2,2,645,645,2,645,2,2,2,2,2,645,645,645,645,645,645,645,645,645,645,645,645,645,645,645,645,645,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,645,645,645,645,645,645,645,645,2,645,2,645,2,645,645,645,645,2,645,645,645,2,645,645,645,645,645,645,645,645,645,645},
+ {4337,2884,2692,1450,472,2264,5178,443,14,3878,674,3294,3294,153,1286,306,306,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1375,1375,2,2,2,2,2,1375,2,2,1375,1375,2,1375,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3730,2,1375,1375,1375,2,2,2,1375,2,2,2,2,2,2,1375,1375,1375,1375,1375,1375,1375,2,2,1375,1375,1375,2,1375,1375,2,1375,1375,1375,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1375,1375,1375,2,2,1375,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1375,2,2,2,2,1375,2,2,1375,1375,3730,3730,2,2,2,2,2,1375,2,2,1375,1375,2,2,2,2,2,2,2,2,2,2},
+ {3245,4095,3066,1805,3205,307,337,3581,3581,427,440,497,1128,840,3227,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1300,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,775,775,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,775,775,775,775,1300,775,775,775,775,775,2,2,3210,775,775,2,1902,1902,1902,1902,1902,1902,1902,775,775,2,2,2,775,2,2,2,2,545,1300,545,545,545,545,2,2,2,2,2,775,2,2,2,2,1902,1902,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,775,1300,2,2,2,2,2,2,2,2,2,2,2,2,2,775,2,2,2,2,2,2,2,2,2,2,2},
+ {4333,994,618,1741,1163,436,978,2745,1988,1247,3020,3541,2553,452,400,2,1939,3100,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,947,947,947,947,947,947,947,947,947,2,947,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3275,3275,3275,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1316,3275,3275,3275,3275,3275,3275,3275,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3275,2,2,2,3275,947,947,947,3275,2,2,2,2,2,2,2,2,2,2,2,2,947,2,2,2,2,2,2,2,2,2,2,2},
+ {4576,3009,3125,2268,3797,174,503,990,1801,2840,377,333,1703,3179,3179,532,532,532,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3103,2,3103,2,3103,3103,3103,3103,2,2,2,532,2,2,2,2,2,3103,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {4574,1251,1066,787,2570,3266,219,773,2719,2912,2912,620,2524,4568,1068,361,361,361,2,2,2,2,2,2,2,2,2,1194,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1194,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1194,1194,2,2,2,2,2,2,2,2,2,2,2,2,1194,1194,1194,1194,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1194,1194,2,2,2,2,2,2,2,2,1194,2,1194,2,1194,1194,2,2,1194,2,2,1194,1194,1194,1194,1194,1194,1194,2,1194,1194,2,1194,1194,1194,1194,1194,1194,1194,1194,1194,2,2,2,2,1194,1194,1194,1194,1194,1194,1194,1194,1194,1194,1194,1194,1194,2,2,1194,1194,1194,1194,1194,1194,1194,1194,1194,2,2,2,2,1194,1194,1194,2,2,2,2,2,2,2,2,2,2,2,1194,1194,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {4387,4158,960,1305,1353,4386,2402,3590,1150,895,914,914,4708,2843,2843,2,2,2903,2903,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1959,2,2,1959,1959,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1959,1959,2,1959,1959,1959,1959,2,2,2,2,2,2,2,2,2,2,2,2,1959,2,2,2,2,2,2,2,2,1959,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {4365,3433,4140,536,1112,656,3135,73,1538,1231,2169,999,1066,1066,2852,2,2,2,3775,3775,2,2,2,2,3682,3682,3682,2,2,2,2,2,3682,3682,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3682,3682,2,2,2,2,2,2},
+ {4375,2791,1011,516,841,3025,912,2200,3429,1324,2873,605,2136,1268,4710,2,2,2,2,1771,1771,2,4710,4710,4710,4710,4710,4710,1771,1771,1771,1771,1771,1771,1771,2,2,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,2,2,2,2,2,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,2,1771,1771,1771,2,1771,1771,1771,2,2,2,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,2,1771,1771,2,2,2,2,2,2,2,2,2,1771,1771,2,2,2,2,1771,2,2,2,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,2,1771,1771,2,1771,1771,2,2,1771,1771,2,2,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,2,2,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,2,2,2,2,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,1771,2},
+ {3202,2928,3842,4419,1803,933,1743,4021,2695,1659,506,4379,4379,541,541,745,745,745,745,745,745,2678,2678,2678,2,2,2,2,2,2,2,2,63,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,5051,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3339,1529,585,386,2258,2921,1719,2957,1730,2035,1062,932,1508,118,470,2,2,2,3861,987,2,2,3631,2,2,2,2,2,3631,3631,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,987,3631,3631,3631,987,2641,2641,2,987,987,2,987,987,987,3631,3631,2,3631,3631,3631,2,987,2,2,987,987,987,987,2,987,987,2,987,987},
+ {4553,1855,2366,1715,3628,2259,1675,3754,1385,1201,625,1872,97,520,520,2684,2684,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3853,3853,3853,2,3853,3853,3853,2,2,2,2,2,2,134,2,2,2,3297,2,2,2,2,2,2,2,2,2,134,134,2,2,2,2,2,2,2,2,2,3853,2,2,2,3853,3853,2,2,2,2,2,2,2,2,2,2,2,2,2,3853,3853,3853,3853,3853,3853,3853,3853,3853,2,3853,3853,3853,3853,3853,3853,3853,3853,3853,134,134,134,134,134,134,134,134,134,134,3853,3853,3853,3853,3853,3853,3853,3853,3853,134,134,134,3853,3853,3853,2,2,2,3853,3853,2,3853,3853,3853,2,3853,3853,3853,3853,3853,3853,3853,3853,3853,3853,3853,3853,2,2,3853,3853,3853,3853,3853,3853,3853,3853,3853,3853,3853,3853,134,134,134,134,134,134,3853,3853,3853,3853,3853,3853,2,3853,3853,3853,3853,3853,2,2,2,2,2,3853,3853,3853,2,2,2,3853,3853,3853,3853,3853,2,3853,2,3853,2,3853,3853,3853,2,4365,134,4365,4365,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3853,3853,3853,2,2,3853,2,2,2,2,2,2},
+ {4964,1353,4940,1474,2521,519,1956,161,590,2047,5037,1519,3729,5581,5581,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3444,2,2,2,2,3444,3444,3444,3444,2,3444,2,2,2,2,2,3444,3444,2,3444,3444,2,3444,3444,3444,3444,3444,2,2,2,2,3444,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3444,3444,3444,2,3444,3444,3444,3444,2,2,2,2,3444,3444,3444,3444,3444,2,2,2,2,2,2,2,2,2,3444,2,3444,3444,3444,2,2,2,2,2,2,2,2,2,3444,3444,2,3444,3444,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3444,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3444,2,2,2,2,2,2,3444,2,3444,2,2,2,2,3444,3444,2,3444,3444,3444,2,2,2,2,2,2,2,2,2,2,2},
+ {4436,2901,1282,1057,649,1997,3072,927,899,2289,3196,1044,786,2574,2374,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {4469,3924,568,3100,1594,1858,123,929,4647,382,2485,2342,189,1506,3139,2,2,2,2,2,2,2,2,663,663,2,2,2,2,2,2,2,2,2,2,2,2,663,2,663,663,2,2,2,2,2,2,663,663,663,663,2,663,2,2,2,2,2,663,663,663,663,663,663,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1558,1558,2,2,2,2,2,2,2,2,2,2,275,275,275,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,275,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,663,2,2,2,2,2,2,2,2},
+ {4677,1743,1166,2283,3170,3228,4905,850,1162,1149,978,282,1104,2585,2972,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,453,453,453,453,453,453,453,453,453,2713,2,2713,453,453,453,453,453,453,453,2713,2,2713,2713,2713,2713,2,2713,2,2,2,2,2,2,453,2,2,2,453,453,453,453,453,453,453,453,453,453,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,5076,5076,453,453,2713,2713,2713,2713,2713,2713,2,2,453,453,453,2,2,2,453,2,2,453,2,2,453,453,453,453,453,453,453,453,453,453,453,453,453,453,453,453,453,453,453,453,453,453,453,453,453,453,453,453,453,453,453,453,453,453,453,453,453,453,2,2,453,453,453,453,2,453,453,453,453,453,453,453,453,453,453,453,453,453,453,453,453,453,453,453,453,2,453,453,453,453,453,453,453,453,453,453,453,453,453,453,453,453,453,453,453,453,453,453,453,453,453,453,2,453,453,453,453,453,2,2,453,453,453,2,2,2,2,2},
+ {3671,3092,3442,640,3586,227,4981,5389,92,637,1235,2625,2300,380,380,1740,1596,1596,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,291,291,291,2,2,2,339,339,339,339,339,339,339,2,2,2,2,2,2,2,2,2,291,291,291,291,339,339,339,339,291,339,339,339,339,339,339,339,339,2,2,2,2,2,2,2,2,2,2,339,2,2,291,2,2,2,2,291,2,2,2,2,2,2,2,291,291,339,2,2,2,2,339,339,2,339,339,2,2,2,2,2,291,291,291,339,339,339,339,339,339,339,2,2,2,2,2,2,2,2,2,2,2,291,291,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,291,291,291,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {4493,5031,3310,1700,3980,136,1041,3523,2789,328,4698,3898,504,504,637,637,3271,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1709,2,1709,2,2,2,2,2,2,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,2,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,2,1709,1709,1709,1709,1699,1699,1709,1709,2,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,1709,3238,3238,3238,3238,3238,3238,3238,3238,3238,3238,1699,1699,1699,1699,1699,1699,2,2,2,1699,1699,1699,1699,1699,1699,1699,1699,1699,1699,1699,1699,1699,1699,1709,1699,1699,1699,1699,1699,1699,1699,1699},
+ {3357,1862,1879,545,2113,2652,4639,1793,2530,647,3530,3964,123,3760,2746,2746,2746,2,2,2,2,2,2,2,2,2,2,2,2,2,2413,2413,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4276,2,2,2,2,2,2,2,2,2,2,2413,2,2,2,2,2413,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4276,4276,4276,2,4276,2,4276,4276,2,2,2413,2413,2},
+ {3392,3970,2069,874,4556,3459,1396,4343,1022,2204,1382,673,3367,1908,1389,350,350,4197,4197,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1404,2,2,2,2,2,2,2,2,2,2,2,2993,2,2,2993,2,2,2,2,2,2,2993,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1404,1404,1404,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2993,2993,2993,2,2,2,2,2,1404,2,2,2,2,2,2993,1404,2,2,2,2,2,2,2,2,2,2,2,458,458,2,458,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1404,1404,2,2,2,2,2,2,2,2,2,2,2},
+ {4718,4329,359,2450,5093,1145,3855,1909,2524,471,702,2756,1292,5052,3740,5052,5052,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2837,2837,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2837,2837,2,2,2,2837,2837,2,2837,2837,2837,2837,2837,2,2,2,2,2837,2837,2837,2837,2837,2837,2837,2837,2837,2837,2837,2837},
+ {3406,2184,545,2340,1975,1455,1667,801,1811,2903,1189,3378,3858,3858,1690,2361,2361,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2361,2361,2,2,2,2,2,2,2361,2361,2,2,2,2,2,2,2,2,2361,2,2,2361,2361,2,2,2,2,2,2,2,2,2361,2361,2,2,2,2,2,2,2361,2361,2,2,2361,2361,2361,2361,2361},
+ {4521,4410,2184,934,578,735,2914,1319,2497,664,2218,155,4688,3798,1295,739,2243,2243,2,2,2,2,2,3384,2,2,3384,2,2,2,2,2,2,2,2,2,2,3384,3384,3384,3384,2,2243,2243,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3384,3384,3384,3384,3384,2,2,2,2,3384,3384,2243,2243,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3384,2243,2243,2,2243,3384,3384,3384,3384,2,3384,3384,3384,3384,3384,2,2,2243,2243,3384,3384,2,3384,3384,2,2,3384,3384,3384,2,2,3384,3384,3384,3384,3384,3384,955,2243,2243,2243,2243,2,2,3384,3384,3384,2,3384,3384,3384,3384,3384,3384,3384,2,2,2,2,2,2,3384,3384,2,2,2243,2,3384,2,2,2,2,955,955,955,3384,2,3384,3384,2,2,2,3384,3384,2243,2243,2243,2243,2,3384,3384,3384,2,3384,3384,3384,3384,3384,3384,2,955,955,2243,955,955,955,3384,955,955,955,2,2,2,3384,2243,2243,3384,3384,3384,3384,3384,3384,3384,955,955,3384,3384,3384,3384,3384,1219,1219,1219,1219,3384,3384,3384,3384,2,2,3384,3384,3384,3384,2243,2243,2,3384,3384,2,2,3384,2,3384,2243,3384,2243,1018,2,2,2,1710},
+ {3740,754,2658,1308,1461,3975,4453,873,256,1392,521,521,460,3347,3316,3316,1532,3316,3316,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3139,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3139,2,2,2,2,3139,2,2,2,2,3139,2,2,2,2,2,2,2,2,3139,2,2,2,2,3139,2,2,3139,2,3139,2,3139,2,2,3139,3139,3139,2,3139,3139,3139,3139,3139,2,3139,2,2,2,2,2,2,2,2,2,2,3139,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3139,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3139,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3139,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3139,3139,2,2,2,2,3139},
+ {3748,2490,1212,408,4308,1499,722,2994,2082,2694,1061,763,1098,701,3188,739,3534,2,2,2,3534,1767,1767,1767,1767,1767,2,1550,1550,1550,2,2,2,1550,1103,2,2,2,2,1103,1103,2,2,2,2,2,1103,1103,1103,1103,1103,1550,1550,1103,1103,1103,1103,2,1103,1377,1377,1377,1377,1103,1103,1103,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1103,1103,2,1103,2,1103,1103,1103,1103,2,2,1103,1103,2,2,2,2,2,2,2,1377,1377,1377,1377,1377,1377,1377,2,2,1103,1103,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {4552,2806,1749,1749,3634,3866,3039,4403,1120,996,236,2685,72,3962,3084,2891,2891,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,111,111,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {4714,798,822,855,243,1136,2984,2036,1213,1475,3699,1361,570,94,94,975,3989,1181,2,2,2,2,2,2,3592,3592,3592,3592,3592,3592,3592,3592,3592,2,1804,1804,2,1181,1181,1181,1181,1181,1181,2,1181,1181,2,2,2,1181,3840,3840,3840,3840,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2755,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4670,2,4670,1181,2,4670,4670,4670,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1181,2,2,2,2,2,1181,1181,2,1181,1181,1181,1181,2,1181,1181,2,2,2,1181,1181,2,2,1181,1181,1181,1181,1181,1181,1181,1181,2,2,1181,1181,1181,1181,2,1181,1181,2,2,2,1181,1181,1181,1181,2,2,2,2,2,2,2,2,1181,2,2,1181,2,1181,1181,2,2,1181,1181,1181,2,2,1181,2,2,1181,1181,1181,1181,1181,1181,1181,1181,1181,2,2,1181,1181,2,2,2,2,2,2,1181,2,2,2,2,1181,1181,1804,4670,4670,2,1181,1181,1181,2,1181,1181,1181,1181,1181,1181,1181,1804,1804},
+ {3322,879,1863,1460,2369,3954,1029,65,4978,2465,2404,176,176,5178,1622,3682,3682,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3461,2642,1761,4171,1064,900,163,4640,209,209,2363,2363,623,623,623,2659,2,208,208,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,504,504,504,1071,2,2,2,2,2,2341,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1071,1071,1071,1071,2,2341,2,2341,2341,2,2,2,2,2,2,2,2341,2,2,2,2341,2341,2341,2,2341,2341,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2341,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1071,2,2,2,2,2,2,2,2,2,2,2,2,2,1071,1071,1071,2341,2341,2341,2341,2341,2341,2,2,2,1071,1071,1071,1071,2,2395,2395,2395,2,2341,2341,2341,2,2,2341,2341,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2341,2341,2,2,2,2,2,2,320,2,2,2,2,2,2,2,1071,2,2,2,2,1071,2341,2341,2,1071,2341,2341,2341,2,2,2,2,2,2,2,2,2,2},
+ {4606,3202,2286,726,282,250,3044,1348,3081,323,2412,2785,5435,2075,5435,5435,616,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4260,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2251,124,124,124,124,2251,2251,2251,124,2251,2251,2251,2251,2,2,2251,2251,2,2,2251,2251,2251,2,2,2,2,2,2,2,2251,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4260,4260,4260,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3677,1025,1094,947,1906,2329,3995,2019,4080,2362,960,4152,1665,1665,998,1065,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,641,641,641,641,641,641,641,2,2,641,641,641,641,2502,2502,2,2,641,641,641,641,641,641,641,641,2,641,641,641,641,2502,2502,2502,2502,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,229,229,229,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2502,2502,2,2,2,2,2,2,2,2502,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,229,229,229,229,2,2,2,2,2,2502,2502,2,641,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,229,2,2,2,2502,229,2,2,2,229,229,229,229,2502,2502,2502,2502,2502,2,2502,641,2,2,2502,2502,2502,2,2502,2502,641,641,2502,2502,2502,2502,2502,2502,2502,2502},
+ {3452,1199,1617,1009,990,101,2436,3960,3407,2709,2709,578,1568,4341,1167,3392,2,2,2,2,2,4643,4105,2,2,1601,1601,1601,2,1601,1601,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4105,4105,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4105,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3604,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {4753,4427,313,1014,1463,1987,4152,2101,3059,732,1048,912,818,970,3758,282,2,2,2,2,2440,2,2,2,2,2,2,2,2,2849,2849,2849,2849,2849,1003,1003,2849,2849,2849,2849,2849,2849,2849,900,2849,1003,1003,2849,2849,2849,1003,1003,2849,1003,1003,1003,1003,2,1003,2849,2849,1676,1676,2,1676,1676,2,2,2849,2849,2849,2849,2849,900,900,900,900,900,900,900,900,2,900,900,900,900,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,4740,2849,2849,363,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2,2,2,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2,2,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2849,2,2849,2849,2849,2849,2,2,2,2,1676,1676,2849,2849,2849,2849,2849,2,2,2,2849,2849,2849,2849,2849,2849},
+ {3673,4536,2243,2107,1113,893,339,1615,3920,2473,4471,278,1304,1700,414,1499,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3991,3991,2,3991,2,2,2,2,2,2,3991,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3991,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3991,3991,3991,3991,3991,2,2,3991,3991,2,2,2,2,3991,3991,3991,3991,3991,3991,3991,3991,3991,3991,3991,3991,3991,3991,3991,3991,3991,3991,3991,3991,3991,3991,3991,3991,3991,3991,2,2,2,3991,3991,3991,3991,2,2,2,2,2,2,2,2,2,2,2,3991,3991,2,2,2,2,2,2,2,2,2,2,3991,3991,3809,2,2,2,2,3991,2,3991,3991,3991,3991,3991,3991,3991,3991,2,2,2,2,2,2,2,2,3809,3809,2,2,2,2,2,2,2,2,3991,2,2,2,3809,3809,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3991,2,2,3809,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3809,2,3809,3809,2,2,2,2,2},
+ {3474,2211,1349,413,725,4174,1121,3265,301,2283,909,732,3530,2317,2180,2180,2,2180,1437,2,2,2,2,2,2,2,2,1437,2,2,2,2,3436,3436,2,1437,2,2,2,2,2,2,2,2,2,2,2,2,3436,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3436,3436,3436,3436,2,2,2,2,2,2,2,3436,3436,3436,3436,3436,3436,3436,2,2,2,2,2,3436,3436,2,2,2,2,2,2209,2209,2209,2209,2,2,3436,3436,2,2,3436,3436,3436,3436,3436,3436,3436,2,3436,3436,3436,3436,3436,3436,3436,3436,2,2,2,3436,3436,2,2,3436,3436,3436,3436,3436,3436,3436,3436,3436,3436,3436,3436,3436,3436,3436,3436,3436,3436,2,2,2,3436,3436,3436,3436,3436,3436,2,2,3436,3436,3436,3436,3436,3436,3436,3436,3436,3436,2,3436,3436,3436,3436,3436,3436,2,2,3436,3436,3436,3436,3436,3436,3436,3436,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3679,1883,1599,3412,1759,1902,64,798,5786,1874,3821,731,731,1841,2015,3121,2,2,2628,2,2,2,2,2,2,2,2,2,2,2628,2,2628,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,805,2,805,805,2,805,805,805,805,805,2,805,2,2,2,2,2,805,805,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,805,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,805,805,2,805,2,2,805,805,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2786,2,2,2,2,2,2,2,2,2,2,580,2,580,580,580,805,805,805,2,805,805,805,805,805,805,805,805,805,805,805,805,2,2,2,805,805,805,805,805,2243,2243,2243,2,2243,580,580,580,580,580,580,580,580,580,2786,2786,2,2,805,805,805,805,805,2786,2786},
+ {3516,887,520,2062,209,736,2202,175,2778,2857,4609,4609,774,3765,712,712,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3018,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2179,2179,2,2,2179,2179,2179,2179,2179,2179,2179,2179,2179,2,2,2,2179,2,2,2,2,2179},
+ {5295,916,2098,175,1340,684,2313,5211,2472,1855,3676,161,207,2000,3541,6015,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {5347,2686,1873,5422,4072,3384,79,1487,3174,1541,1206,935,1618,1618,812,812,2,1939,1939,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1939,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1939,1939,1939,1939,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {4659,1616,5129,1168,2057,1048,2234,485,2202,3677,3654,589,1276,595,2343,2343,1667,2,2,2,1667,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1667,1667,1667,1667,2,2,2,2,2,2,2,1667,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,382,2,2,2,2,2,2,2,2,2,2,2,2,2,2,382,382,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,382,382,382,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,382,382,382,382,382,382,2,2,382,382,382,382,382,382,382,382,382,2,382,2,382,382,2,382,2,2,382,2,2,382,2,2,2,2,2,2,2,2,2,2,2,382,2,2,2,2,2,2,382,2,2,2,382,382,2,2,2,2,2},
+ {3516,2623,413,5566,1015,457,490,3052,2585,79,88,2559,2954,55,4465,4465,870,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,870,870,870,870,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1532,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {4605,3269,2100,548,3619,627,2450,2218,3850,4055,2488,405,1326,876,2609,846,1462,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3793,2,2,2,2,168,732,732,2,2,2,2,2,2,2,2,2,3793,3793,2,2,2,2,2,2,2,2,3793,2,2,3793,3793,2,2,2,2,2,2,2,2,3793,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3793,3793,3793,2,2,2,2,3793,3793,3793,3793,3793,2,2,2,2,2,2,2,2,2,2,732,732,2,2,732,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,732,2,2,2,2,2,2,732,2,732,2,2,2,2,2,2,1144,1144,1144,732,732,1144,732,1144,732,732,732,732,732,732,732,732,732,732,732,732,732,732,732,732,732,732,3793,3793,732,732,732,2,732,732,732,732,732,732,732,3793,3793},
+ {4985,1954,4596,1454,3611,187,1897,1134,3237,1722,1532,2908,195,195,4045,4045,270,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {4964,4109,2421,1581,4255,1687,1630,99,1178,2380,595,3355,2977,624,1089,965,2651,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1722,1722,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1722,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1722,1722,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1722,2,1722,1722,2,1722,2,2,2,1722,1722,1722,1722,1722,1722,1722,1722,1722,1722,1722,2,2,1722,1722,1722,1722,1722,1722,1722,1722,2,2,2,2,1722,1722,1722,2,2,2,2,2,1722,1722,1722,1722,1722,2,2,1722,1722,1722},
+ {5272,2169,2186,718,289,675,1481,4386,3173,3326,3609,498,1049,1643,3505,4136,4136,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1233,1233,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2595,2,2159,2,2,2,2,2,2,2,2,2,2,2159,390,2,2,2,2,2,2,2,2159,2,2,2,2,2159,2,1233,2,2,2,2159,2159,2159,212,212,1233,2,1233,1233,2,2,2159,2159,2159,2159,2,2,2,2159,2159,2159,212,2,2,2159,2159,2159,2,2,2159,2159,2159,2159,2159,2159,212,2159,2,2,2,2159,390,390,390,2,2,2159,2159,2159,1007,1007,1007,1007,1007,1007,1233,1233,1233,2,2,2,1233,1233,1233,1233,1233,1233,1233,2159,2159,2159,2159,2159,2159,1233,3505,3505,3505,212,212,1717,2159,2159,212,212,212,212,212,212,212,212,1233,1233,1233,1233,1233,1233,1233,1233,2159,2159,2159,2159,1233,2159,2159,2159,2159,2159,2433,3505,3505,878,3505,2433,3505,1233,3505,3505,3505,1233,1233,1233,1233,1233,1233,1233,1233,1233,390,390,390,390,390,390,3505,2,3505,3505,3505,3505,3505,3505,3505,3505,3505,3505,4576,4576,4576,2159,2159},
+ {4924,4842,2789,4577,2328,194,5654,2541,963,3120,983,2348,123,498,3119,3119,3307,2,3119,2,2,1129,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1848,2,2,2,1848,1848,1848,2,1848,1848,2,2,1848,2,2,1848,1848,1848,1848,1848,1848,387,2,2,1848,1848,1848,1848,1848,1848,1848,1848,1848,387,1848,387,387,387,387,387,1848,1848,2,2,2,2,1848,1848,1848,1848,1848,387,1848,1848,1848,1848,1848,1848,1848,1848,1848,1848,1848,1848,1848,1848,1848,1848,1848,1848,1848,2235,387,387,1848,1848,1848,1848,1848,1848,1848,1848,1848,1848,1848,1848,1848,1848,1848,1848,1848,1848,1848,1848,1848,2,2,1848,1848,1848,1848,1848,1848,2,2,2,2,2,2,2,1848,1848,1848,1848,1848,1848,2235,2235,1848,1848,1848,1848,2235,1848,1848,1848,1848,1848,1848,1848,1848,1848,1848,1848,1848,1848,1848},
+ {3776,1505,2635,1017,3761,939,389,4325,4589,1118,3324,2557,2557,1700,1700,1700,1700,1771,2,2,2,2,2,4214,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4214,2,2,2,2,2,2,4214,4214,4214,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4214,912,2,2,2,2,2,2,912,912,912,912,2,912,912,912,2,2,912,912,912,912,912,912,912,2,912,912,912,912,912,912,912,912,912,912,912,912,912,912,912,912,912,912,912,912,912,912,912,2,2,912,912,912,912,2,912,912,912,912,912,912,912,2,2,2,2,4214,2,2,2,2,2,2,2,2,2,2,2,4214,4214,4214,2,2,2,2,2,2,2,2,2,2,4214,4214,4214,4214,4214,4214,2,4214,4214,4214,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4214,4214,2,2,2,2,2,4214,2},
+ {5355,3004,2566,368,2515,932,5320,460,3175,2725,776,738,952,1179,2,1179,416,416,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1227,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1227,1227,2,2,2,2,1227,1227,2,2,2,2,2,1227,1227,1227,1227,1227,1227,1227,1227,1227,1227,1227,1227,1227,1227,1227,1227,1227,1227,1227,1227,1227,1227,1227,1227,1227,1227,1227,1227,2,2,1227,1227,1227,1227,1227,1227,1227,1227,1227,1227,1227,1227,1227,1227,1227,1227,1227,1227,1227,1227,1227,1227,1227,1227,1227,2,2,2,1227,1227,1227,1227,1227,1227,1227,2,2,2,2,1227,1227,1227,1227,1227,1227,1227,1227,1227,1227,1227,1227,1227,1227,1227,1227,1227,1227,2,1227,1227,1227,1227,2,2,1227,1227,1227,1227,1227,1227,1227,2,1227,1227,1227,2,2,1227,1227,2,1227,1227,1227,1227,1227,1227,1227,1227,1227,1227,1227,1227,2,1227,4937,4937,4937,4937,4937,4937,4937,4937,2,2,1227,2,2,1227,1227,2,2,2,2,2,1227,1227,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3950,1886,684,840,89,1886,2007,997,717,1347,2023,2987,4027,44,2,5003,5003,5003,2,2,2,2,2,2,2,2,2,1999,1999,1999,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1999,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1999,1999,1999,2,2,2,2,2,2,2,2,1999,1999,1999,1999,2,2,2,2,1315,1315,1315,2,2,2,1315,1315,1315,1315,2,1315,1315,2,1315,2,1315,1315,2,1315,1315,2,2,2,2,2,1315,1315,1315,1315,1315,1315,2,1315,2,1315,1315,2,2,1315,1315,1315},
+ {3617,3159,5361,2098,2990,659,5373,1727,2989,860,1289,974,4247,2053,2,2,5453,3711,2,2371,2,2,2,2371,2,2,2,2,2,2,2,2371,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3804,3139,1695,3525,2932,632,178,435,951,281,1555,1404,1952,1089,2,2,1408,250,3586,2,2,981,981,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3586,2,2,3586,3586,2,2,2,2,2,2,3586,3586,3586,3586,2,3586,3586,3586,3586,3586,3586,3586,2,2,2,2,2,3586,3586,3586,3586,3586,3586,3586,3586,3586,3586,3586,3586,547,547,547,547,3586,3586,3586,547,547,3586,3586,3586,3586,3586,3586,3586,3586,3586,3586,3586,3586,3586,547,547,547,547,547,547,547,547,3586,3586,3586,3586,3586,3586,3586,3586,547,3586,3586,547,547,547,3586,3586,3586,3586,3586,3586,3586,3586,3586,3586,3586,547,547,547,547,547,3586,3586,3586,3586,3586,3586,3586,3586,3586,3586,3586,3586,3586,3586,3586,3586,3586,1476,1476,3586,3586,3586,3586,3586,3586,3586,3586,3586,3586,3586,3586,3586,3586,2,547,3586,3586,3586,3586,3586,3586,3586,3586,3586,3586,3586,3586,1476,1476,1476,547,3586,3586,547,3586,3586,3586,3586,3586,3586,3586,3586,3586,3586,3586,3586,3586,5955,5955,5955,5955,5955,3586,3586,3586,3586,3586,3586,547,3586,3586,547,3586,3586,547,547,3586,547,3586,3586,3586,3586,3586,3586,547,547,547,547,547,547,547,547,547,547,3586,3586,3586,3586,3586},
+ {4963,3808,1792,2748,2553,685,1168,4592,1146,2631,1868,798,406,406,2,2,2,1688,3380,2517,2517,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2517,2,2,2,2,2517,2517,2,2,2,2517,2517,2517,2517,2517,2517,2,2517,2517,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3380,110,110,110,3380,110,2,2,2517,2517,2517,2517,2517,2517,2517,2,2517,2517,2,2517,2,2517,2517,2517,2517,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3652,3712,3890,3158,2100,4805,4384,2700,2199,1094,173,3014,2117,2117,2,2,2,2,3998,3998,3998,3998,2139,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2139,2139,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3313,3313,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2139,2139,2,2,2,2,2,2,2,2,2,2,3313,2139,2139,3313,2,2139,2139,3313,3313,3313,3313,3313,3313,3313,2,2,2,2,2,2139,2139,2,1597,2,2,2,2,2,2,2,2,2,2,1597,1597,2,2,2139,2139,2139,2,2,2,2,2,2,2,2,2,2,2,1597,1597,1597,2,2,2,2,2,2,2,1597,1597,2,2,2,1597,1597,2,1597,1597,1597,1597,2,2,1597,2,2,1597,1597,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1597,1597,1597,1597,1597,1597,1597,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1597,2,2,2,2,1597,1597},
+ {4979,1811,2448,4842,4884,2488,948,497,2529,1597,3299,2499,2980,2980,2,2,2,2,4199,4199,4199,4199,4199,4199,4199,4199,2,2475,2,2,2,2,2,2,2,4841,4841,4841,4841,4841,4841,4841,4841,4841,4841,4841,4841,4841,4841,4841,4841,4841,4841,4841,4841,4841,2,4841,4841,4841,4841,4841,4841,2,2,2,2,2,2,4841,4841,4841,4841,2,4841,4841,4841,4841,2475,2475,2475,2475,2475,2475,2475,2475,2475,2475,2475,2475,2475,4841,4841,4841,4841,4841,4841,4841,4841,2475,2475,4841,2475,2475,4841,4841,4841,2,4841,4841,1935,1935,1935,1935,1935,1935,1935,2475,1935,2475,2475,2475,2475,2475,4841,2475,4841,4841,2,4841,4841,4841,4841,4841,4841,4841,4841,4841,4841,4841,4841,4841,2524,2524,2524,2524,2524,2524,2524,4841,4841,4841,4841,4841,4841,4841,4841,4841,2,2,2475,2475,4841,4841,4841,4841,4841,4841,4841,4841,4841,4841,4841,4841,4841,4841,4841,4841,4841,4841,4841,4841,4841,2,4841,4841,4841,4841,2,4841,4841,4841,4841,4841,4841,4841,4841,4841,4841,4841,4841,4841,4841,4841,4841,4841,2,4841,4841,4841,2,2,4841,4841,4841,4841,4841,4841,4841,4841,4841,4841,4841,4841,4841,4841,2,2,2,2,2,2,2,2,2,2,2,2,2,4841,4841,4841,4841,4841,4841,2,2,2,2,2,2,2,2,2,2,2},
+ {5023,1540,927,245,2075,2301,5467,4874,3291,3051,3294,760,2306,1312,2,2,2,590,590,590,2,2,2,2371,2371,2,2,2,2,2,2,2,2,2597,2597,2597,2597,2597,2597,2597,2597,2,2597,2597,2597,2597,2597,2597,2597,2371,369,2371,2597,2597,2597,2597,2597,2597,2597,2597,2597,2597,2597,2597,2597,2597,2597,2597,369,369,2597,2,2,2597,2597,2597,2,2371,2371,2,2,2,2,2597,2371,2371,2371,2371,2371,2371,2371,2597,2597,2597,2597,2597,2371,2371,2371,2371,2371,2371,2371,2371,2371,2371,2371,2371,2371,2371,2371,2371,2371,2371,2371,2371,2371,2371,2371,2371,2371,2371,2371,2371,2371,2371,2371,2371,2371,2,2371,2371,2371,242,242,242,242,242,242,242,242,242,242,242,2597,2597,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2597,2597,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2371,2597,2,2597,2597,2371,2,2371,2371,2371,2,2597,2597,2597,2,2597,2,2,2597,2597,2597,2597,2597,2597,2597,2597,2597,2597,2597,2597,2597,2597,2597,2597,2597,2597,2597,2597,2,2,2,2,2,2,2597,2597,2597,2,2,2,2,2,2,2,2,2,2,2,2597,2,2597,2597,2,2,2,2,2,2597,2597,2597,2597,2,2,2,2},
+ {5443,2941,347,1060,5432,5651,301,2162,665,2055,4381,98,2739,3194,2,2,2,4969,227,2,2,2,2,2,2,2,2,2,2,2,1870,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1870,1870,2,2,2,2,2,2,2,2,2,2,2,347,347,347,347,2,2,347,347,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1870,1870,2,1870,1870,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1870,1870,1870,1870,2,1870,1870,1870,1870,1870,1870,1870,1870,1870,1870,1870,1870,2,2,2,2,2,1870,2,2,2,2,2,2,1870,1870,2,2,2,1870,2,156,156,2,2,2,1870,1870,1870,2,2,1870,1870,2,1870,1870,1870,1870,2,2,2,2,2,1870,1870,2,2,2,2,1870,1870},
+ {3658,1253,870,2758,2146,2477,2412,4259,3502,398,868,3053,449,1881,2,2,958,4704,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3985,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,799,799,2,799,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3333,3333,2,2,2,2,2,2,2,2,2,3333,2,2,2,2,2,2,2,2,2,2},
+ {5067,2597,6011,2402,413,3512,2653,4334,390,2692,5283,3178,1799,4788,2,2,1641,2691,2691,3929,2,2,2,2,2,3145,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3145,3145,2,2,2,521,521,2,521,2,521,2,2,2,2,2,2,2,521,2,2,2,521,2,2,2,521,2,2,2,521,2,2,2,2,2,2,2,521,521,521,521,521,521,2,521,521,521,2,2,521,2,521,2,521,521,521,521,521,2,521,521,521,2,2,2,2,2,521,2,2,2,2,2,2,2,2,2,521,521,2,521,521,521,521,521,521,521,521,2,2,521,521,521,521,521,521,521,521,521,2,521,521,521,521,521,521,521,521,521,6065,521,521,521,521,521,521,2,2,521,521,521,521,521,521,521,521,521,6065,6065,6065,6065,521,2,2,521,521,521,521,521,521,521,521,521,521,521,521,2,521,521,2,2,2,2,2,6065,521,6065,521,6065,521,521,521,521,2,2,6065,6065,6065,521,521,6065,2,6065,6065,6065,6065,6065,6065,6065,6065,6065,6065,6065,6065,6065,6065,6065,6065,521,6065,6065,6065,6065,521,521,521,6065,521,521,521,521,521,521,521,521,521},
+ {3885,3052,2835,523,2045,83,2098,4007,3517,1262,981,4508,2609,2609,2,2609,4534,4534,2,2,2,2000,2000,2,2000,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2000,2000,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2000,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {5055,3401,2410,1529,394,1543,1133,1103,3701,3966,2974,3068,677,677,2,677,1879,1822,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,5098,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4001,4001,4001,4001,4001,2,5098,2,2,5098,5098,2,5098,5098,5098,2,2,5098,5098,2,5098,4001,2,4001,4001,5098,5098,5098,5098,5098,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4001,4001,4001,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4001,4001,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,5098,2,5098,2,5098,2,5098,2,2,2,2,2,5098,5098,2,2,2,2,4001,5098,2,2,5098,5098,2,2,2,2,4001,4001,4001,5098,2,2,5098,4001,4001,4001,4001,5098,5098,5098,5098,5098,5098,5098,5098,5098,5098,5098,5098,5098,5098,5098,5098,4001,4001,5098,4001,4001,4001,5098,5098,5098,5098,5098,5098,5098,5098,2,2,2,5098,5098,5098,5098,5098,5098,5098,5098,5098,5098,5098,5098,5098,5098,5098,5098,2,2,5098,5098,2,5098,2,5098,2,2,2,2,5098,2},
+ {4048,3672,616,1520,2274,3021,4421,4072,152,1312,609,2967,716,978,2,659,4216,2,2881,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,245,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,245,2,2,2,2,2,245,245,245,245,245,2,2,245,2,2,245,245,245,245,245,245,245,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,245,245,245,245,245,245,2,2,2,245,245,245,245,245,245,2,2,2,245,245,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3916,1447,3984,2374,3691,4938,5363,1530,245,2887,2776,2026,410,1152,2,1513,1815,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,16,4,4,2,2,2,2048,2048,6034,6034,6034,6034,6034,6034,6034,6034,6034,638,638,638,638,638,16,16,16,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,16,4,4,2,2,2,2048,2048,6034,6034,6034,6034,6034,6034,6034,6034,638,638,638,6034,6034,638,638,638,638,2,638,638,2,2,2,2,2,2,2,2,2,2,2,2,2,6034,4,4,2,2,2,2048,2048,6034,6034,6034,6034,6034,6034,6034,638,638,638,638,6034,6034,6034,638,638,638,2,16,16,638,638,16,2,256,2,2,2,2,2,2,2,2,6034,4,16,2,2,2,2048,2048,6034,6034,6034,6034,6034,6034,6034,638,638,638,638,6034,6034,6034,638,638,638,2,16,16,638,638,638,638,256,2,2,2,2,638,638,2,2,6034,4,16,2,2,2,2048,2048,6034,6034,6034,6034,6034,6034,6034,638,638,638,638,6034,6034,6034,638,2,638,2,2,16,638,638,638,638,256,2,256,2,2,638,638,2,2,2,4,16,2,2,2,2048,2048,6034,6034,6034,6034,6034,6034,6034,638},
+ {3919,1125,5765,2380,668,2948,502,1883,69,60,690,1095,1095,1095,952,32,2203,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1573,2,2,2,2,2,2,2,2,1573,1573,1573,1573,1573,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1573,1573,1573,1573,2,2,2,2,2,2,2,1573,2,1573,2203,2203,2,2,1573,1573,1573,1573,2203,2203,2203,2203,1573,1573,1573,1573,1573,1573,2,1573,2,1573,1573,1573,1573,1573,2,2,1573,1573,1573,1573,1573,1573,1573,2,2,2,2,2,2,2,2,2,1573,2,2,1573,1573,1573,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1573,1573,1573,1573,1573,2,2203,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1573,1573,1573,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1573,1573,1573,1573,2,2,2,2,2,2,2,2,2,2,2,2,2,1573,2,2,2,1573,1573,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1573,2,2},
+ {3715,3458,1970,870,1037,758,115,197,2841,2644,3665,109,109,404,2170,3221,3221,2,2,2,2,2,4255,3021,3021,3021,4255,4255,4255,2,4255,2,2,2,2,2,4255,3021,3021,4255,4255,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4255,4255,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4255,4255,4255,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4255,4255,4255,4255,4255,4255,4255,4255,2,2,4255,4255,3021,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4255,2,2,4255,2,2,2,2,2,2,2,2,2,2,4255,4255,2,2,2,2,2,2,2,2,2,2,2,2,3021,2,2,2,2,2,2,2,2,2,4255,4255,4255,4255,2,541,4255,4255,4255,2,2,4255,4255,4255,4255,4255,4255,4255,4255,4255,4255,4255,4255,4255,4255,4255,4255,4255,4255,4255,2,4255,4255,2,2,4255,4255,4255,4255,4255,3021,4255,4255,4255,4255,4255,4255,4255,4255,4255,4255,2,2,3021,3021,3021,4255,4255,4255,4255,4255,4255,4255,2,2,4255,2,2},
+ {5212,3272,1609,4226,5381,4456,1368,2187,556,556,5895,1306,3255,2069,2069,3294,85,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,875,875,2,875,875,875,875,875,875,875,875,2,2,2,2,2,2,2},
+ {5662,5822,4817,1149,217,3219,2586,286,871,2578,3042,328,328,955,1541,483,483,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3747,3747,3747,2,2,2,3747,3747,3747,2,2,3747,3747,3747,3747,3747,3747,3747,3747,3747,3747,3747,3747,3747,2820,2820,2,3747,3747,3747,3747,3747,3747,2820,2820,2,3747,2,2820,2820,2,2,2820,3747,3747,2820,3747,2,3747,2820,2820,2,2,2,2,3747,2,3747,3747,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2820,2,3747,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {5146,2024,4990,416,543,2059,113,4939,3497,2950,2710,2699,2699,2699,1653,3311,2969,2,3465,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2656,2,4811,2,4811,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,898,2,2,2,2,2,2,2,2,2,2,2,2,898,898,898,898,2,2,2,2,2,898,898,898,2,2,2,2,898,898,898,898,898,898,898,2656,2656,898,2656,2656,898,2656,2656,2656,2656,2656,2656,2656,2656,2656,2656,2656,2656,2656,2,2656,2656,2656,2656,2656,2656,898,2656,2656,2656,2656,2656,2656,898,898,898,898,2,898,898,898,898,898,898,2656,2656,2656,898,898,2656,2656,2656,2656,2656,2,2656,2656,2656,2656,2656,2656,2,2,2,2656,2656,2656,2656,2656,898,2656,2656,2656,2656,2656,2656,898,898,898,2656,2656,2656,898,2656,2656,898,898,2656,2656,2656,2656,2656,898,898,2656,898,2656,898},
+ {3740,1782,2190,876,1140,2757,4149,6037,3133,1963,5011,310,1381,724,724,2583,2583,2583,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2904,2904,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2904,2904,2904,2904,2,489,489,2,1662,2904,2904,2904,2904,2,2,2,2,2904,2904,2904,1662,1662,1662,1662,1662,1662,1662,1662,1662,1662,2,2,1662,1662,2904,2904,2904,1662,2,1662,1662,2904,2904,2904,489,489,489,489,2904,2904,2904,2904,2904,1662,1662,1662,2904,2904,2904,2904,2904,2904,2904,1662,1662,1662,2904,2904,2904,2904,1662,2904,2904,1662,1662,1662,1662,1662,1662,1662,1662,1662,1662,4219,4219,4219,1662,1662,1662,1662,2904,2904,1662,1662,1662,2904,1662,1662,1662,1662,1662,1662,1662,2904,1662,1662,2,2,1662,1662,1662,1662,1662,1662,1662,1662,1662,2,1662,1662,1662,1662,1662,1662,1662,1662,1662,2,2904,2904,2904,2904,1662,1662,1662,2,1662,1662,1662,2,2,2904,3386,3386,3386,1662,2904,3386,3386,3386,3386,2904,2904,2904,2904,1662,1662,407,2,2,2,2,2,1662,3386,2904,2904,2904,2904,1662,3386,3386,1662,1662,1662,1662,3386,3386,3386,2904,2904,3386,2904,3386,3386,3386,3386,3386,2,2904,2904,2904,2904},
+ {5183,2522,5684,3654,1465,5348,1013,4419,2221,1177,1177,682,682,3960,709,3305,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1655,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1655,1655,1655,1655,1655,2,2,2,2,2,2,2,1655,2,1655,2,2,2,2,2,2,2,2,2,2,2,1655,1655,2,2,2,1655,1655,2,2,2,2,2,1655,2,2,1655,1655,1655,1655,1655,1655,1655,1655,1655,1655,1655,2,2,2,2,1655,2,2,2,2,2,2,1655,1655,1655,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1655,2,2,2,2,2,2,2,2,2,2,2,2,1655,2,1655,1655,2,2,2,2,1655,2,2,1655,2,2,2,2,1655,1655,2,2,2,1655,1655,1655,1655},
+ {5069,3278,2817,4849,2324,4827,2210,1085,5076,1706,797,4305,438,665,3603,763,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,32,3340,212,212,2,2,2,4944,53,212,32,32,32,32,32,1616,1616,1616,32,32,32,1616,1616,1616,1616,1616,1616,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1624,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,851,2,3630,32,3340,212,212,2,2,2,4944,53,53,32,32,32,32,32,1616,32,32,32,32,53,53,53,53,53,101,101,2,212,212,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {5233,791,2594,3255,1692,590,2406,2903,3852,282,629,3212,174,215,2867,49,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3053,3053,3053,3053,3053,3053,2,3053,3053,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3395,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {5244,2671,2818,2774,4981,3565,5793,4428,2037,2886,78,5719,1672,1672,261,261,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1985,2,816,2,816,816,816,816,2,2,2,816,816,816,816,2,2,2,1985,1985,1985,1985,2,2,1985,2,2,816,1985,1985,1985,2,1985,1985,1985,1985,1985,1985,1985,1985,1985,816,1985,1985,1985,1985,2,1985,1985,1985,1985,1985,1985,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1985,1985,1985,1985,2,2,2,2,2,2,2,1985,1985,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1985,2,2,1985,1985,1985,1985,1985,1985,2,2,1985,2,2,1985,1985,1985,1985,2,1985,1985,2,2,2,2,1985,1985,1985,1985,1985,1985,2,1985,1985,2,2,2,2,2,2,2,2,2,2,2,1985,1985,1985,2,2,2,1985,2,1985,2,2,2,2,2,2,2,2,2,2},
+ {5322,922,1084,4184,161,5283,383,3534,714,4515,726,662,3712,2079,2079,2079,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,5378,5378,5378,5378,5378,2,2,2,2,2,2,2,2,2,2,2,2,2,4573,4573,4573,4573,2,2,2,2,2,2,3076,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3076,3076,2,2,2,2,2,2,2,403,2,2,2,2,2,2,2,2,2,2,2,403,403,2,2,2,2,2,2,2,2,2,2,2,2,2,168,168,2,2,2,403,403,403,403,403,403,403,2,2,2,2,2,4573,2,4573,2,2,2,2,2,2,2,2,2,2,3076,2,2,2,2,403,1198,1198,1198,403,2,2,1198,2,2,2,2,2,2,2,2},
+ {5804,2537,4928,1129,781,91,219,1950,829,1381,1328,445,445,445,425,4204,2,2,2,815,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,5673,5673,5673,5673,2,2,2,5673,5673,5673,5673,5673,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {4059,2714,3895,3105,2189,3346,4891,5469,2186,3378,5236,4294,4802,4286,4286,1519,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3089,3089,3089,2,2,2,2,2,2,2,2,2,3089,3089,3089,2,2,3089,2,2,2,2,3089,3089,3089,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3089,2,2,2,2,3089,3089,3089,3089,3089,3089,2,2,2,2,2,2,2,2,3089,2,2,2,2,2,2,2,2,2,3089,2,2,2,2,2,2,2,2,2,2,2,3089,2,2,2,2,2,2,2,2,2,3089,3089,3089,3089,2,2,2,3089,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3089,3089,2,2,2,2,2,2,2,2,2,2,2},
+ {5708,2052,1810,2084,3267,5414,2599,1730,480,3401,3327,4647,1748,2161,2161,1874,2,1874,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1216,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1216,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1216,1216,2,2,2,2,2,1216,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1216,1216,2,2,2,2,2,2,2,2,2,1216,2,1216,1216,1216,1216,1216,1216,2,2,1216,1216,1216,1216,1216,1216,1216,1216,1216,1216,1216,1216,1216,1216,1216,1216,1216,2,1216,1216,1216,1216,2,2,1216,1216,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1216,1216,1216,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {5167,3267,4478,526,238,4744,2894,1249,1449,2608,3908,2956,2302,942,3139,4,2,2468,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,6319,6319,6319,6319,6319,6319,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {5779,4265,1332,3103,3199,2704,4797,1444,134,2110,1077,1505,1268,3258,3258,3258,2,2,2,2,3023,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,5206,5206,2,2,2,2,2,2,2,2,2,2,5206,5206,5206,5206,2,5206,5206,2,2,5206,5206,5206,2,2,2,2,2,2,2,5206,2,5206,5206,5206,5206,5206,5206,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {4109,5508,3813,1006,3515,4723,737,724,6208,83,1987,6265,6265,6265,3440,3440,3440,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1994,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1298,1298,2,277,277,1298,2,2,2,2,2,2,2,2,2,2,1298,1298,1298,2,2,2,2,2,2,2,2,2,2,2,1298,1994,1994,1994,1298,1994,2,2,2,1994,1994,1994,1994,1994,1994,1994,1994,1298,1994,1994,1994,1994,1994,2,2,2,1994,1994,1994,1994,1994,1994,1994,1994,1994,1994,1994,1994,1994,1994,1994,1994,1994,1994,1994,1994,1994,1994,1994,1994,1298,1298,1994,1994,1994,1994,1994,1994,1994,1994,1994,1628,1994,1994,1994,1994,1994,1994,1994,1994,1994,1994,1994,1994,1994,1994,1994,1994,1994,1994,1994,1994,1994,1994,1994,1994,1994,1994},
+ {5166,4507,3355,2589,6243,1427,1072,3932,2199,628,1694,1694,4032,673,3476,158,78,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,915,915,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {4133,4348,5825,2390,3111,376,828,347,5825,1701,634,409,676,676,676,676,2376,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1349,2,2,2,2,2,2,2,1349,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1349,1349,2,2,2,2,1349,1349,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {5417,1192,700,4364,4180,1484,1398,3796,5333,1357,1579,3291,1467,2831,2831,1278,1278,2,2,2,901,901,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,119,119,119,119,119,119,119,119,2,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,2,119,2,2,119,119,2,119,119,119,119,119,2,119,119,119,119,119,119,119,119,119,2,119,119,119,119,119,2,2,119,119,2,2,119,2,2,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,2,2,2,542,119,2,2,119,901,119,119,119,119,119,119,119,2,2,119,119,2,2,901,901,901,901,901,901,901,901,2,2,119,2,2,2,2,119,2,2,2,2,2,2,119,2,119,2,2,2,2,2,2,2,2,2,2,2,2,2,2,119,2,119,2,2,2},
+ {5248,4840,1313,1073,1888,6180,3435,2029,1949,2602,1512,2808,3344,3344,3344,638,4127,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4587,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4587,4587,4587,4587,2,4587,2,2,2,2,2,2,2,2,4587,4587,2,2,2,2,2,2,4587,4587},
+ {4207,2203,472,676,2009,831,2009,1629,2964,4153,1536,640,6305,6305,4269,3614,219,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1269,2,1269,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1269,1269,2,2,2,2,1269,2,2,1269,2,2,2,1269,1269,2,2,2,2,2,1269,1269,1269,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1269,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {4365,1463,1740,795,1858,472,1283,2657,2929,4034,1601,1530,1399,161,2928,2928,2928,2,2,2,2,2,2,2,2,2,2,5097,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1655,2,2,2,1655,1655,1655,2,2,1655,1655,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1655,1655,2,1655,2,1655,1655,2,2,2,1655,1655,2,2,1655,2,2,2,2,2,2,2,2,2,1655,2,2,2,2,2,2,2,2,2,2,2,1655,1655,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1655,2,2,2,2,1655,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1655,2,2,2,2,2,2,2,2,1932,1932,1932,2,2,2,2,2,2,1932,1932,1932,2838,2838,2838,2838,1655,1655,1655,1655,2,2,2,2,2,2,2,2,2,1655,1655,1655,2,2,2,1655,2,2,1655,2,2,1655,1655,2,2,2,2,1655,2,2,1655,1655},
+ {4375,1446,4054,5039,941,5576,1387,6392,1969,1750,3465,385,4423,385,5112,2,3035,2450,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3277,3277,3277,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1170,2,1170,1170,1170,2,3277,3277,3277,3277,3277,3277,3277,2,2,2,2,2,2,2,2,2,2,2,2,3277,2,2,2,2,2,3277,2,2,3277,2,3277,2,2,2,2,3891,2,2,2,2,3891,2,3891,3891,3891,3891,2,2,2,2,3277,3277,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {5562,5133,6411,1617,136,945,2433,4497,6453,4605,6868,1372,2356,771,2623,5924,1674,1674,2,2,2,2,2,1523,1523,1523,1523,1523,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1523,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {4269,1508,301,1058,3289,941,365,3960,2588,115,1486,3279,2288,2288,2288,2,2,5672,5672,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {4287,3435,804,5943,5354,4271,3731,1455,5412,3316,4206,6714,4849,3944,1572,2363,2363,2,3315,3315,2,3315,3315,2,2,2,1775,1775,1775,1775,2,2,2,2,2,1775,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2363,2363,2363,2363,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {5353,3815,5121,3481,349,2426,3182,1046,858,2925,840,1169,5011,5720,248,2,2,2,2,2,2,2,4,4,4,4,1238,1238,1238,3693,3693,3693,3693,3693,3693,3693,3693,3693,3693,3693,3693,3693,3693,1715,2,1514,1514,1514,1514,1715,1514,1514,1238,1238,1238,1238,1238,1238,1238,1238,3306,3306,3306,3306,3306,3306,3306,3306,3306,3306,3306,3306,3306,3306,2,3306,3306,3306,1715,1715,2479,2479,2479,2479,2479,2479,1238,1238,1238,1238,2479,2479,2479,1238,1238,1238,1238,1238,1980,1514,692,692,848,1238,1980,848,1514,692,1238,692,1238,848,1238,848,848,848,1011,1011,1011,1011,2,1011,1011,1011,2,2,2,2,2,3306,2,2,2,3306,3306,3306,3306,3306,3306,3306,3306,3306,3306,3306,1980,166,166,3693,3693,166,1514,166,166,166,166,166,166,166,166,166,166,2,2,2,166,166,166,2479,2,2,2,2,2,2,2,2,2,2479,2,2,2479,2,2,2479,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,848,2,848,848,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {4048,2321,5128,4127,4697,2138,3200,290,4303,2102,2958,182,1302,1628,1302,2,2,1302,1302,2,2,4409,2,2,2,2,2,2,4409,4409,2,2,4409,4409,2,4409,2,2,4409,4409,4409,4409,2,4409,2,2,4409,4409,4409,4409,4409,4409,2,2,2,2,2,2,2,2,2,2,2,2,4409,2,2,2,2,2,4409,4409,4409,4409,4409,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {5620,3125,3521,474,611,2430,3045,1331,2955,2809,3981,3110,1317,2479,1399,2171,2171,3402,2171,2,2171,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2171,2,2,2,2,3011,2,2,2,2,2,2171,2,2,2,2837,2,2,2,2,2,2,2837,2,2,3011,2,2171,2,2,2171,2,2,1720,1720,1720,1720,1720,2,1720,1720,2,6192,2,2,2,2,2,2,2,2,2,2,2,2,2837,2,2,2,2,2,2,2,2,2,2,2,2837,2,3011,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,6192,2,6192,6192,2,2,2,6192,2,6192,6192,2,6192,6192,2,6192,6192,6192,6192,2,2171,2171,2171,2171,2171,6192,2,2171,2171,2,2171,6192,2,6192,6192,6192,6192,6192,2,2,2,2,2171,2171,2171,3011,2171,6192,6192,2171,2,2171,2171,6192,2171,6192,2171,2171,2171,2171,2171,2171,2171,2171,2,2,2,2,2,2,2171,2,2,2,2,2,2,2171,2171,2,2,2171,2171,2171},
+ {5453,3563,942,1798,3278,2524,3087,957,470,1155,2694,3329,367,1071,2554,4399,4399,2845,2,2,2,2,2,2,2,2,2,2,2,3529,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3529,3529,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3529,3529,2,2,3529,3529,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3137,3137,3137,2,3137,3137,2,3137,3137,2,2,2,3529,3529,2},
+ {5626,2346,3777,3493,5149,2692,2414,886,343,144,327,3637,330,594,3873,1244,1244,2837,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4485,4485,4485,4485,4485,2,2,4485,4485,4485,2,4485,4485,4485,2,4485,2,2,2,2,4485,2,4485,2,2,2,2,2,2,2,2,2,2,4485,4485,2,2,2,2,2,2,4485,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4485,2,4485,4485,4485,2,4485,2,2,4485,4485,4485,4485,2,4485,2,4485,4485,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4485,2,4485,4485,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4485,4485},
+ {5444,1794,999,2466,641,2137,3171,4129,715,223,2107,1050,3889,3889,4830,2641,4794,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {5775,982,901,1782,1640,1974,1669,99,1251,1688,2053,2274,708,1622,3556,894,1119,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,894,2,2,6406,6406,2,2,2,2,2,894,894,894,894,2,839,894,894,894,2,894,2,894,894,2,894,894,894,839,2,2,2,894,894,2,2,2,894,894,894,894,894,2,2,2,2,894,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {5803,2854,4083,2039,1441,232,3329,2148,597,280,2938,3496,487,487,696,843,1591,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3476,3476,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3476,3476,2,2,3476,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3476,2,2,2,2,2,3476,3476,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {5849,2753,4125,3526,4149,5602,1925,2971,2117,684,551,283,5748,5537,1920,1920,1920,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {6280,2350,1452,3594,3198,1796,2975,968,1155,5005,5005,821,2410,2410,2410,4406,2530,1229,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3104,2,3104,3104,3104,2,2,2,2,2,2,2,2,2,2,2,2,3104,3104,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3104,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3104,2,3104,3104,717,2,2,2,2,2,2,2,2,3104,3104,3104,3104,3104,3104,3104,3104,3104,3104,3104,3104,3104,3104,3104,3104,3104,3821,3821,3104,3104,3104,3104,3104,3821,3104,3104,2,3104,3104,3104,2,3104,3104,2,2,2,2,2,2,3104,3104,3104,2,2,2,2,2,3104,3821,3104,3104,2,2,2,2,2,3821,2,2,3104,3104,3104,3104,3104,3104,3104,3104,3104,3104,3104,2,3104,3104,3104,3104,3104,3821,3104,3821,3821,3104,3104,3104,3821,3821,3821,3821,3821,2,2,2,2,3104,3104,2,3104,717,717,717,717,2,3104,3104,3104,3104,2,2,2,2,3104,3104,3104,3104,3104,3104,3104,3104,3104,3104,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {6305,1257,3705,2637,1366,526,2307,2419,1906,857,2757,4855,1251,1251,4469,4469,4469,1995,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1403,1403,1403,2,2,2,2,1403,2,2,2,2,2,2,2,1403,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1403,2,2,2,2,2,2,2,2,2,2,1403,2,1403,2,2,2,2,2,2,2,2,2,2,2,2,1403,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1403,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1403,2,2,2,2,2,2,2},
+ {5838,1426,920,320,2216,1897,1111,1071,685,931,3243,2425,3730,568,3730,862,2,2,345,345,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {4517,2905,4274,148,3162,1789,5744,1424,3641,3321,172,100,4400,2530,2583,2794,2,2,2,2,1206,2,2794,2,2,2,2,2,2,2794,2794,2,2794,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2794,2,2,2,2794,2794,2794,2794,2794,2,2794,2794,2794,2794,2794,2794,2794,2794,2794,2794,2,2,2794,2794,2794,2794,2794,2794,2,2,2,2794,2794,2794,2794,2794,2794,2794,2794,2794,2794,2794,2794,2794,2794,2794,2794,2794,2794,2,2794,2794,2794,2794,2794,2794,2794,2794,2794,2794,2794,2794,2794,2794,2794,2794,2,2794,2794,2794,2794,2794,2794,2794,2794,2794,2794,2794,2794,2794,2794,2794,2794,2794,2794,2,2794,2794,2,2,2,2,2,2,2794,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2794,2794,2,2794,2794,2794,2,2794,2794,2794,2794,2794,2140,2140,2794,2794,2794,2794,2794,2794,2794,2,2,2794,2794,2,2,2,2,2,2,2},
+ {6444,2317,739,1363,5943,3777,636,3242,2307,2065,5947,6223,110,110,110,110,2,1020,2893,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1837,1837,1837,2,2,1837,1837,2,2,2,1837,1837,1837,1837,1837,1837,1837,1837,1837,1837,2,2,1837,1837,1837,1837,1837,1837,1837,1837,2,2,2,2,2,1837,2,2,2,2,1837,2,2,2,2,2,1837,2,2,2,1837,1837,1837,1837,1837,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1837,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1837,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {6082,1791,764,4581,2353,3979,760,3061,1937,965,4982,3689,2099,1809,552,552,3316,6819,2,2,3491,3491,3491,3491,3491,3491,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,899,2,2,2,2,2,899,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2099,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2099,2099,2,2099,2,2,2,2,2,2,2,2099,2,2,2,2099,2099,2,2,2,2,2,2099,2,2,2,2,2,2,2,2,2,2,2,2,2099,2,2,2,2,2099,2099,2,2,2,2099,2099,2099,2099,2,2,2,2099,2099,2099,2099,2099,2,2,2099,2099,2099,2099,2099,2099,2099,2099,2099,2099,2099,2099,2099,2099,2099,2099,2099,2099,2099,2099,2099,2099,2099,2099,2099,2099,2099,2099,2099,2099,2099,2099,2099,2099,2099,2099,2099,2099,2099,2099,2099,2099,2099,2099},
+ {5851,2331,5843,3055,3415,2664,1767,4171,3970,1104,6287,2997,2621,2621,3518,4538,790,2,902,2946,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2946,2,2,2,2,2946,2946,2,2946,2,2,2,2,2,2946,2,2,2,2946,2946,2946,2,2,2946,2946,2946,2946,2946,2946,2946,2946,2946,2946,2946,2946,2,2946,2946,2946,2946,2946,2946,2946,2946,2,2,2,2946,2946,2946,2946,2946,2946,2,2,2,2,2,2,2946,2946,2946,2,2,2946,2946,2,2,2,2946,2946,2946,2,2946,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {5893,6318,2368,4197,776,1648,1404,5994,530,2306,2339,902,2,352,564,463,564,3672,3672,2,705,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2}
+};
Index: trunk/cuba/src/divonne/KorobovCoeff.c-5879
===================================================================
--- trunk/cuba/src/divonne/KorobovCoeff.c-5879 (revision 0)
+++ trunk/cuba/src/divonne/KorobovCoeff.c-5879 (revision 159)
@@ -0,0 +1,571 @@
+#define KOROBOV_MINDIM 2
+#define KOROBOV_MAXDIM 33
+#define MAXPRIME 5879
+
+#define Hash(x) ((12013 - x)*(-47 + x))/68400
+
+static int prime[] = {
+ FIRST,47,53,59,67,71,73,83,89,97,101,103,109,113,127,131,137,139,149,
+ 151,157,163,167,173,179,181,191,197,199,211,223,227,229,233,239,241,251,
+ 257,263,269,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,
+ 373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,
+ 479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,593,599,
+ 601,607,613,617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,
+ 719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,
+ 839,853,857,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,
+ 971,977,983,991,997,1009,1013,1019,1021,1031,1033,1039,1049,1051,1061,
+ 1063,1069,1087,1091,1093,1097,1103,1109,1117,1123,1129,1151,1153,1163,
+ 1171,1181,1187,1193,1201,1213,1217,1223,1229,1231,1237,1249,1259,1277,
+ 1279,1283,1289,1291,1297,1301,1303,1307,1319,1321,1327,1361,1367,1373,
+ 1381,1399,1409,1423,1427,1429,1433,1439,1447,1451,1453,1459,1471,1481,
+ 1483,1487,1489,1493,1499,1511,1523,1531,1543,1549,1553,1559,1567,1571,
+ 1579,1583,1597,1601,1607,1609,1613,1619,1621,1627,1637,1657,1663,1667,
+ 1669,1693,1697,1699,1709,1721,1723,1733,1741,1747,1753,1759,1777,1783,
+ 1787,1789,1801,1811,1823,1831,1847,1861,1867,1871,1873,1877,1879,1889,
+ 1901,1907,1913,1931,1933,1949,1951,1973,1979,1987,1993,1997,1999,2003,
+ 2011,2017,2027,2029,2039,2053,2063,2069,2081,2083,2087,2089,2099,2111,
+ 2113,2129,2131,2141,2143,2153,2161,2179,2203,2207,2213,2221,2237,2239,
+ 2243,2251,2267,2269,2273,2281,2293,2297,2309,2311,2333,2339,2347,2357,
+ 2371,2377,2383,2393,2399,2411,2423,2437,2441,2447,2459,2467,2477,2503,
+ 2521,2531,2539,2543,2549,2551,2557,2579,2591,2593,2609,2617,2621,2633,
+ 2647,2657,2659,2671,2677,2687,2699,2707,2719,2729,2741,2749,2753,2767,
+ 2777,2791,2803,2819,2833,2837,2843,2857,2861,2879,2887,2897,2909,2917,
+ 2927,2939,2953,2963,2971,2999,3001,3011,3023,3037,3041,3061,3067,3079,
+ 3089,3109,3119,3121,3137,3163,3167,3169,3187,3191,3209,3221,3229,3251,
+ 3259,3271,3299,3301,3307,3319,3331,3347,3359,3371,3389,3391,3413,3433,
+ 3449,3457,3463,3469,3491,3499,3517,3529,3547,3559,3571,3583,3593,3613,
+ 3631,3643,3659,3671,3691,3701,3719,3733,3739,3761,3779,3793,3803,3821,
+ 3833,3853,3863,3881,3907,3917,3931,3947,3967,3989,4001,4013,4027,4049,
+ 4073,4079,4099,4127,4139,4157,4177,4201,4211,4231,4253,4271,4289,4297,
+ 4327,4349,4373,4391,4409,4423,4451,4481,4493,4519,4547,4567,4591,4621,
+ 4637,4663,4691,4721,4733,4759,4793,4817,4861,4877,4909,4943,4973,5003,
+ 5039,5077,5113,5147,5189,5231,5273,5323,5381,5431,5483,5557,5623,5737,
+ MarkLast(5879)
+};
+
+static short coeff[][32] = {
+ {13,11,10,3,9,2,2,2,2,9,2,2,7,2,2,2,2,2,2,6,2,2,2,13,11,10,3,9,2,2,2,2},
+ {23,17,12,11,14,14,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,12,12,12,14,14,14},
+ {18,14,5,14,2,2,19,19,25,25,18,18,18,2,2,2,2,2,2,2,2,2,2,2,25,6,2,2,2,18,14,5},
+ {18,13,23,5,2,12,6,12,12,12,10,10,16,2,16,16,2,2,2,2,2,2,2,10,2,2,2,2,10,2,2,2},
+ {21,22,7,21,2,20,20,2,2,2,2,22,2,2,2,2,2,2,2,6,6,21,2,2,2,2,2,2,2,2,6,6},
+ {27,14,10,14,2,4,13,2,2,16,4,4,4,6,6,6,6,6,6,25,25,31,31,15,31,2,2,31,15,14,14,6},
+ {30,19,24,16,22,8,2,2,22,5,9,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {34,28,13,28,27,27,2,4,2,2,2,16,16,4,20,20,36,20,36,5,5,5,36,36,5,5,5,7,5,7,7,2},
+ {35,19,33,8,21,30,8,2,4,2,4,4,2,2,2,2,2,2,2,2,2,17,2,2,11,25,11,17,17,17,17,17},
+ {39,40,15,21,11,26,13,2,2,13,2,2,2,2,2,2,2,2,2,2,26,26,2,2,2,2,2,2,2,2,2,2},
+ {37,21,35,29,27,19,19,2,2,2,5,15,2,2,15,15,19,19,19,19,19,2,2,2,2,2,19,2,2,2,2,2},
+ {45,44,13,25,17,47,30,2,30,2,2,2,2,2,2,2,2,2,19,19,19,17,17,2,2,2,2,2,2,2,2,2},
+ {35,22,37,9,35,12,35,8,2,2,50,50,2,2,32,32,32,31,13,8,8,8,2,22,50,9,9,9,22,22,22,10},
+ {29,24,43,36,49,2,2,8,4,25,49,25,2,2,8,10,10,10,5,5,5,40,10,33,40,40,2,27,10,25,25,25},
+ {50,18,32,39,21,2,2,2,4,4,36,36,14,14,14,14,2,2,2,17,17,17,16,16,2,14,14,14,14,2,2,2},
+ {31,28,45,20,18,43,43,13,28,2,2,2,31,31,31,31,31,2,2,2,43,43,2,2,2,2,2,2,2,2,30,2},
+ {39,15,41,7,24,2,2,30,40,2,2,25,25,25,25,2,2,2,2,2,2,6,6,2,25,2,5,2,2,25,2,2},
+ {44,20,29,39,7,21,21,21,2,2,45,2,2,2,49,49,49,49,49,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {56,20,22,13,18,35,35,6,2,4,2,4,2,2,2,23,16,16,4,23,2,34,52,2,34,2,4,2,2,2,23,16},
+ {46,32,17,18,29,27,31,31,31,2,2,4,15,2,2,2,2,2,2,2,2,2,2,2,2,2,23,32,32,32,15,15},
+ {62,42,43,17,23,13,13,2,2,13,2,2,2,2,2,2,2,10,2,2,2,2,9,10,2,2,2,19,9,9,9,9},
+ {46,49,49,52,27,7,20,2,2,6,6,13,13,13,2,13,13,2,2,2,2,2,2,34,34,2,2,2,2,2,2,2},
+ {64,34,16,28,16,51,47,2,2,2,6,18,39,39,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,12,12,2},
+ {74,26,44,25,50,24,54,39,58,42,2,42,42,2,2,2,2,2,2,2,2,33,33,2,2,39,11,2,2,58,39,58},
+ {70,22,50,22,16,9,25,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {74,21,17,25,35,33,10,2,10,20,20,57,57,57,2,2,57,2,2,2,2,2,2,2,13,2,2,2,2,2,2,2},
+ {71,68,68,27,71,39,81,44,2,2,2,12,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {55,30,85,42,16,36,45,67,2,2,68,2,2,2,2,2,2,2,68,10,2,2,2,2,2,2,2,2,2,2,2,2},
+ {64,17,24,26,49,12,10,39,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,59,2,2},
+ {68,57,23,38,61,38,13,13,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2,68,15,2,44,44,44,2,2,2},
+ {94,28,58,29,13,5,15,8,66,2,2,2,39,39,15,66,2,2,6,6,2,2,66,66,66,66,2,2,2,2,2,66},
+ {94,85,9,41,41,37,29,29,17,2,2,2,7,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,8,8},
+ {89,32,75,77,77,13,2,30,30,2,2,2,2,2,2,2,2,2,2,67,67,2,2,2,2,2,2,2,2,8,19,32},
+ {70,45,58,63,67,10,72,72,70,6,2,36,2,70,70,6,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {101,33,76,13,45,63,2,2,6,19,2,2,32,32,32,32,32,65,2,63,63,11,11,11,19,19,19,19,9,63,63,63},
+ {70,89,44,37,19,45,2,2,2,8,10,8,54,54,80,80,80,80,80,2,116,2,116,2,2,80,40,51,100,100,8,2},
+ {71,54,83,51,42,98,2,2,8,8,14,30,93,22,15,15,30,30,30,44,44,44,2,2,22,22,22,117,44,11,11,11},
+ {109,37,51,113,17,10,2,2,17,17,55,2,55,55,55,55,55,55,2,2,2,57,48,48,55,55,2,2,55,2,2,55},
+ {75,38,68,89,11,52,2,2,81,39,2,38,2,2,2,2,2,2,2,2,2,2,2,19,2,2,2,2,2,2,2,2},
+ {81,84,35,34,20,93,2,12,12,12,2,96,2,96,96,2,96,2,2,2,2,2,2,2,2,2,2,2,2,56,56,56},
+ {109,72,60,96,67,32,85,84,27,91,91,2,10,29,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {104,32,56,46,77,11,35,35,24,56,19,2,2,2,78,2,2,75,2,2,2,2,78,2,2,2,2,2,2,2,2,2},
+ {81,103,25,35,28,15,20,20,20,2,2,2,2,20,20,20,107,107,2,2,2,2,2,2,2,2,2,2,2,2,13,13},
+ {119,75,42,29,74,23,54,36,39,2,2,4,4,19,19,2,2,2,2,2,2,2,2,54,2,2,2,2,2,2,2,54},
+ {115,73,22,102,75,138,16,73,50,16,2,50,2,2,2,133,2,2,2,2,2,2,2,2,2,2,2,2,2,33,33,33},
+ {119,48,66,51,14,22,20,20,2,2,2,2,2,60,2,2,2,2,2,2,2,2,60,2,2,2,2,2,2,60,2,65},
+ {121,94,80,29,51,69,42,36,14,14,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,17,2,2},
+ {129,123,41,79,43,34,24,11,2,2,4,2,2,2,2,75,16,16,16,75,75,75,16,16,16,25,2,99,2,2,75,16},
+ {128,33,35,68,22,8,62,94,2,2,2,62,62,2,98,2,2,4,98,2,2,32,81,32,32,32,98,98,98,98,98,98},
+ {101,109,154,15,57,6,27,36,2,2,37,37,2,2,2,2,2,2,2,107,2,2,2,107,107,2,2,2,2,2,2,2},
+ {106,40,24,38,61,118,106,106,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {149,111,58,79,127,13,41,33,27,16,30,2,61,2,72,2,2,2,2,2,2,2,2,2,2,2,2,75,75,2,2,2},
+ {105,92,43,156,25,53,57,115,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {99,40,62,67,66,29,99,99,99,78,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,79},
+ {109,42,96,95,66,41,103,84,13,103,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {111,72,16,89,25,86,117,29,14,14,2,2,2,2,2,60,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {106,72,49,94,140,44,97,157,75,2,2,4,123,123,2,2,123,123,123,123,2,2,2,2,2,2,2,2,2,2,2,2},
+ {115,67,74,32,43,50,21,36,135,36,85,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {151,71,157,42,41,37,80,27,18,2,2,2,2,2,2,2,2,2,2,2,2,2,115,128,128,128,128,128,32,2,128,80},
+ {119,91,38,30,92,44,32,76,22,2,34,2,2,2,2,2,2,2,2,2,2,2,2,2,2,129,2,2,129,2,2,2},
+ {121,126,31,52,120,37,57,10,171,2,2,2,2,35,35,35,2,2,97,97,97,97,97,97,97,35,35,35,97,97,97,2},
+ {155,86,49,104,87,94,64,45,61,91,91,91,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {164,121,44,166,47,33,7,15,13,2,2,122,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {128,120,133,17,71,52,25,107,42,21,21,2,2,2,2,4,4,96,2,9,9,2,9,94,94,94,94,94,94,94,94,96},
+ {179,82,157,76,61,35,13,90,197,2,69,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,39,39},
+ {136,136,148,63,66,10,169,95,95,163,30,28,28,2,41,130,2,2,2,21,2,2,2,2,2,2,2,2,2,2,2,36},
+ {131,40,112,63,55,30,53,79,79,79,2,79,2,2,2,2,2,79,2,2,2,2,14,36,2,21,21,21,21,2,2,91},
+ {165,81,92,48,9,110,12,40,40,34,2,2,2,107,107,107,2,107,2,2,2,2,2,2,2,2,2,2,2,15,41,41},
+ {169,66,170,97,35,56,55,86,32,32,2,2,2,2,14,2,40,2,37,2,2,37,40,40,40,2,2,2,37,37,37,37},
+ {135,63,126,156,70,18,49,143,6,117,2,109,109,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {179,104,117,56,132,56,190,130,130,15,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {193,59,51,68,68,15,170,170,170,143,143,12,2,2,2,63,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {145,101,56,65,23,76,110,2,4,4,4,146,146,146,2,146,2,2,2,2,2,2,2,2,2,2,2,2,2,2,146,146},
+ {144,129,26,98,36,46,47,52,52,52,82,2,2,2,2,2,17,2,2,2,2,2,2,2,2,2,2,2,2,91,2,2},
+ {145,78,166,171,56,20,63,2,2,33,33,33,33,2,78,47,47,47,47,47,2,2,2,2,2,78,78,78,2,2,2,2},
+ {191,69,176,54,47,75,167,2,2,2,188,188,188,30,30,2,67,67,117,2,117,117,117,2,2,36,2,2,2,2,2,2},
+ {186,96,29,122,47,96,170,157,157,157,157,108,159,2,195,195,26,26,26,26,26,2,2,2,2,132,132,132,2,2,2,2},
+ {151,118,226,91,54,49,33,2,2,2,2,4,4,4,143,143,2,2,143,25,25,25,2,143,143,143,143,143,143,143,143,143},
+ {144,91,237,82,81,75,138,163,163,163,117,117,44,2,44,136,136,136,136,2,2,2,2,2,122,122,122,122,2,2,2,136},
+ {189,78,178,64,118,27,189,2,2,67,67,110,110,110,110,2,28,28,2,2,2,2,2,2,2,102,2,2,2,2,2,2},
+ {165,202,83,76,125,65,42,2,44,44,23,2,23,23,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {209,204,92,75,85,146,104,2,7,18,8,2,2,2,204,95,95,95,2,2,2,95,95,95,95,95,95,95,2,2,2,95},
+ {169,68,89,16,193,82,33,262,262,175,148,148,148,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {171,162,78,43,61,17,112,10,171,182,118,33,2,2,2,2,118,2,2,2,2,2,2,151,2,2,2,2,2,2,2,2},
+ {211,121,119,55,90,211,96,89,225,25,178,36,36,36,2,2,108,2,2,2,2,2,2,2,2,2,2,2,2,184,2,2},
+ {154,101,83,17,16,210,41,79,70,158,2,27,27,2,2,2,2,2,2,2,2,2,2,2,2,153,2,2,2,2,2,2},
+ {169,179,130,79,148,180,136,17,47,119,2,119,119,169,169,2,169,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {241,171,148,31,172,34,66,60,156,140,2,2,2,75,75,2,2,2,2,2,2,2,190,190,2,2,2,30,2,2,2,2},
+ {229,189,183,106,118,138,82,149,265,39,2,2,265,2,2,2,2,2,2,130,2,2,2,71,71,2,2,2,71,2,2,71},
+ {165,157,127,21,64,15,80,130,130,130,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,74,2},
+ {221,130,203,84,83,83,29,121,54,54,2,141,2,2,94,94,94,4,4,4,2,4,2,2,2,54,54,108,16,16,94,52},
+ {230,166,20,160,121,102,153,94,16,67,2,2,2,2,2,2,97,97,97,2,2,97,97,2,97,97,97,97,97,97,97,97},
+ {181,79,137,119,139,24,77,17,50,25,25,25,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {239,242,192,40,41,62,124,193,193,31,193,2,2,2,2,2,2,2,2,2,2,2,2,148,2,2,2,2,2,2,2,2},
+ {239,178,73,122,239,51,95,48,78,88,78,2,2,2,2,2,2,2,2,2,2,2,144,144,2,2,144,144,144,2,144,144},
+ {234,117,198,34,143,21,74,6,252,252,98,2,2,2,2,197,38,2,2,2,2,2,47,2,47,47,47,47,2,2,2,47},
+ {179,110,38,28,58,39,16,29,42,125,202,8,8,129,4,4,2,2,2,67,67,2,2,2,2,2,2,8,67,67,2,2},
+ {246,53,189,50,18,59,179,179,7,137,137,2,2,103,103,103,103,40,40,40,2,2,2,2,73,73,73,2,103,103,103,103},
+ {239,133,87,92,193,12,206,238,238,238,31,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {191,244,60,193,18,32,193,104,74,125,125,66,2,2,2,2,2,2,2,2,2,2,125,125,2,125,125,125,2,2,2,2},
+ {177,74,90,91,172,219,63,84,32,2,2,196,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {253,143,54,39,122,32,75,107,234,2,6,6,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {282,89,71,88,30,23,81,105,105,2,2,105,105,131,107,2,2,2,2,2,195,195,2,2,29,29,21,21,128,195,195,195},
+ {259,115,171,40,156,71,67,24,24,2,2,2,24,4,4,4,2,234,2,2,2,2,2,2,2,2,2,74,74,2,2,2},
+ {264,237,49,203,247,108,75,75,75,2,2,32,16,8,16,16,16,164,14,164,2,2,32,16,8,16,16,32,42,42,42,2},
+ {264,106,89,51,29,226,23,286,286,151,151,151,151,151,2,2,2,2,2,2,31,31,31,2,2,2,2,2,2,2,2,284},
+ {194,215,82,23,213,23,108,127,74,2,201,32,178,2,285,2,2,2,2,285,2,2,2,2,2,2,2,2,2,2,2,2},
+ {196,267,251,111,231,14,30,52,95,2,154,53,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {266,67,22,101,102,157,53,95,130,2,42,76,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {281,205,107,178,236,122,122,316,76,215,215,2,60,2,2,2,2,2,2,227,2,2,2,2,2,2,2,2,27,2,2,2},
+ {271,89,65,195,132,162,102,45,56,174,104,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {200,169,170,121,155,68,131,167,78,113,113,2,2,64,2,2,2,2,2,2,2,2,2,2,2,2,2,173,2,2,2,2},
+ {288,143,265,264,71,19,231,169,27,27,27,2,2,2,2,2,2,2,2,2,2,2,2,2,51,2,2,2,2,2,2,2},
+ {311,141,96,173,90,119,134,151,35,252,39,2,39,39,2,2,2,2,2,2,2,2,2,113,113,2,2,2,2,2,2,113},
+ {311,230,52,138,225,346,162,216,216,91,160,182,91,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {275,167,128,244,184,184,44,210,237,139,139,139,139,2,2,2,2,2,2,2,2,2,2,73,2,2,2,2,2,2,2,2},
+ {176,156,83,135,46,197,108,63,33,33,33,2,133,2,213,213,213,213,133,133,2,133,2,2,133,133,2,2,2,2,2,2},
+ {283,125,141,192,89,181,106,208,124,124,2,112,112,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {289,191,171,152,191,173,54,13,21,56,56,56,2,2,2,2,2,2,2,2,2,220,2,2,2,2,2,2,2,2,2,2},
+ {334,305,132,132,99,126,54,116,164,105,2,105,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,287,2,2,2,2},
+ {240,166,44,193,153,333,15,99,246,99,2,2,99,99,2,2,2,2,195,195,195,2,195,195,2,263,263,2,195,195,195,263},
+ {246,194,265,79,225,65,24,62,46,181,2,2,2,314,2,2,2,2,2,2,2,215,2,2,2,2,2,2,2,2,2,2},
+ {229,334,285,302,21,26,24,97,64,40,2,2,2,231,231,231,231,65,2,148,2,2,2,2,2,2,2,2,2,2,2,2},
+ {251,295,55,249,135,173,164,78,261,261,2,2,2,2,114,2,2,2,2,2,256,142,142,2,2,2,2,2,2,2,2,185},
+ {232,153,55,60,181,79,107,70,29,35,2,2,58,58,2,58,2,2,2,2,61,61,2,61,61,2,2,61,61,90,2,90},
+ {246,116,45,146,109,90,32,103,133,119,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {246,113,146,232,162,262,204,47,45,331,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {360,150,84,275,13,26,368,49,244,244,63,63,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {239,295,174,87,30,87,85,36,103,36,2,278,2,2,2,2,2,2,163,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {356,300,75,310,123,301,200,107,183,37,218,37,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {358,207,168,150,150,21,156,50,195,275,275,275,2,2,2,2,2,251,2,2,2,251,251,251,251,251,251,251,251,251,2,2},
+ {322,194,234,62,236,147,239,400,255,255,80,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {326,276,134,100,143,113,115,221,13,339,194,194,194,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {337,132,27,45,14,81,110,84,238,224,211,2,29,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {192,213,113,174,403,117,342,342,311,35,35,2,2,2,2,2,2,2,2,101,2,2,2,2,2,2,2,2,2,101,101,101},
+ {264,273,316,53,40,330,51,285,115,219,147,2,2,2,335,2,2,2,2,2,173,2,173,2,2,173,173,173,173,173,173,83},
+ {254,293,407,118,54,296,160,231,4,4,93,2,2,2,2,2,60,61,2,2,120,127,127,127,88,88,88,88,88,88,88,88},
+ {341,78,336,263,281,164,99,334,296,114,109,2,163,163,163,163,2,2,2,2,2,2,2,125,125,292,292,292,292,125,125,125},
+ {355,87,212,100,89,210,133,344,120,45,45,138,138,138,138,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {274,141,46,219,158,284,38,79,73,185,35,6,81,2,2,2,2,53,2,2,81,81,2,81,2,2,2,53,53,53,53,53},
+ {349,303,439,19,95,240,174,191,2,162,162,2,2,2,76,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {360,91,201,205,67,181,59,77,2,44,103,103,103,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,125},
+ {283,154,261,91,77,147,227,105,116,311,256,256,2,116,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,32,2},
+ {287,288,111,89,249,370,55,16,248,67,67,115,2,2,134,134,2,2,2,2,2,2,2,2,2,2,2,2,2,22,22,22},
+ {284,270,282,37,29,181,160,49,285,285,374,250,2,374,374,2,2,2,179,179,35,2,179,179,2,179,179,2,2,285,285,285},
+ {359,305,52,36,243,231,7,92,2,68,68,307,62,45,2,2,112,311,311,311,2,2,2,2,2,2,2,2,2,2,2,2},
+ {288,119,218,137,364,38,27,380,2,2,211,23,33,2,2,2,2,2,225,225,225,2,2,225,225,225,2,2,2,2,2,2},
+ {277,155,232,309,370,365,348,75,214,214,214,4,4,2,2,2,210,210,210,210,210,210,210,2,2,2,2,2,2,2,2,2},
+ {292,204,91,41,124,190,107,322,125,125,125,125,125,25,25,62,2,2,146,146,2,2,62,146,2,146,114,146,114,2,2,2},
+ {282,195,192,409,68,99,253,106,2,2,2,231,55,55,2,323,323,55,55,285,285,285,285,2,2,2,2,2,2,285,285,323},
+ {299,122,174,403,113,77,63,275,2,2,2,138,276,227,38,227,2,237,2,2,2,2,2,2,2,2,2,2,352,352,352,2},
+ {282,222,268,86,21,109,353,408,2,2,2,2,135,12,12,216,241,241,241,241,241,241,241,241,241,303,303,303,135,135,135,2},
+ {374,94,89,257,137,246,186,196,2,2,2,2,2,454,122,122,122,122,2,2,2,28,28,94,94,94,94,94,122,122,122,122},
+ {288,92,62,428,122,153,481,66,2,2,2,250,250,177,177,177,177,279,279,279,279,279,279,279,2,2,279,177,177,177,177,177},
+ {288,370,141,284,207,192,450,67,2,2,2,183,217,217,217,183,183,167,202,202,202,202,167,167,2,2,2,164,164,80,167,167},
+ {286,293,199,39,158,332,242,103,2,2,2,408,266,315,2,2,365,253,315,315,315,315,315,2,2,315,2,2,2,2,2,2},
+ {407,83,435,187,40,16,52,65,2,2,244,39,77,119,119,2,2,2,119,342,342,2,2,2,2,2,342,2,2,58,58,119},
+ {398,88,78,57,260,203,203,43,131,131,131,204,204,322,204,2,102,2,325,325,325,325,2,2,2,2,2,2,2,2,2,2},
+ {390,174,70,155,163,67,225,49,2,34,34,151,151,2,2,111,2,2,111,111,2,2,2,2,2,2,2,2,2,2,2,2},
+ {393,129,393,169,23,192,168,47,2,2,312,150,71,2,150,2,2,2,61,2,2,61,2,2,2,2,2,2,2,2,2,2},
+ {408,136,71,63,63,159,222,68,181,181,124,227,14,14,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {294,169,79,242,160,123,178,290,186,186,56,399,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {415,228,69,68,193,122,21,362,33,22,362,57,2,2,2,2,46,46,196,196,196,2,196,196,196,2,196,2,2,2,2,2},
+ {415,130,241,185,312,175,309,199,94,281,47,47,2,2,2,2,206,307,221,2,2,2,2,2,239,239,239,239,239,206,206,206},
+ {417,238,147,165,346,19,92,164,266,291,291,43,2,2,2,345,2,2,2,345,345,2,2,2,2,2,345,2,2,2,2,2},
+ {456,192,86,182,35,174,342,102,210,210,210,393,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,256,256,158},
+ {307,255,92,38,325,61,103,246,176,319,80,89,2,241,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {432,168,63,154,166,46,479,145,144,288,288,288,288,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {341,256,113,85,188,233,161,29,110,167,91,91,253,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {311,360,312,158,73,16,106,209,472,48,24,203,203,2,2,2,2,234,234,234,2,234,234,203,2,2,2,234,234,234,234,234},
+ {437,196,161,100,132,246,395,187,35,35,35,2,2,35,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {438,174,338,145,155,276,422,374,4,463,463,99,224,70,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {426,225,211,130,325,283,353,96,282,23,299,2,2,2,63,63,2,276,276,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {430,101,288,38,200,332,325,193,123,123,88,2,2,2,2,2,231,231,139,139,139,139,139,139,139,139,139,139,139,139,139,139},
+ {434,143,308,389,365,363,174,63,121,125,260,2,2,260,260,2,2,2,2,2,2,2,2,2,2,258,2,2,2,258,2,2},
+ {453,123,201,141,229,223,234,494,102,102,102,2,2,102,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,252},
+ {438,168,65,264,304,74,168,88,114,132,187,2,127,127,2,2,2,2,2,81,81,56,2,2,2,307,2,2,2,2,81,81},
+ {324,181,141,129,33,171,173,291,227,373,52,301,301,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {448,119,431,111,135,50,242,95,148,49,49,49,68,2,2,2,2,2,2,2,2,49,2,2,2,2,2,2,2,2,2,2},
+ {335,114,55,47,33,173,287,345,198,198,136,238,238,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {468,377,243,237,332,512,27,167,22,169,14,14,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {456,162,188,223,408,209,28,164,299,299,258,186,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {445,391,115,226,96,456,239,214,556,158,158,282,2,2,2,2,2,2,2,2,2,2,2,2,2,331,2,2,2,2,2,2},
+ {360,397,130,172,407,479,295,13,38,199,199,346,2,2,2,2,2,2,145,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {512,136,129,361,180,61,274,128,422,27,292,165,2,2,2,2,2,2,363,117,117,117,117,2,2,2,2,363,2,2,2,2},
+ {478,433,483,302,200,227,273,27,171,171,371,102,2,2,2,2,2,20,2,2,2,2,2,2,2,2,403,403,2,2,2,2},
+ {485,158,454,86,212,60,93,40,209,188,188,106,2,231,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {390,448,111,145,47,555,367,317,315,52,429,435,429,429,2,2,2,2,2,2,2,2,229,2,2,229,2,2,2,229,2,2},
+ {490,331,187,398,407,373,497,219,423,423,378,378,2,419,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {378,406,112,198,539,550,516,59,240,240,23,316,2,122,2,2,2,2,2,2,2,2,2,2,111,111,2,2,2,95,2,2},
+ {474,373,248,330,40,113,105,273,103,407,2,165,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {495,406,306,239,172,323,236,50,37,435,2,310,56,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {498,447,112,241,552,119,227,189,140,140,140,140,140,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {505,132,169,418,342,28,319,301,172,530,317,317,335,2,2,2,2,2,2,376,2,2,2,2,2,2,2,2,2,2,2,2},
+ {397,393,191,269,462,151,264,134,307,307,2,163,163,2,2,2,2,2,2,2,2,2,2,2,2,2,159,2,2,2,2,2},
+ {485,491,325,149,122,145,228,100,311,64,2,62,137,2,137,2,2,2,2,2,2,2,392,2,2,2,2,2,2,2,2,2},
+ {364,462,360,383,182,187,123,69,129,146,2,156,149,2,149,2,2,2,2,2,2,2,303,303,303,2,2,2,2,2,149,266},
+ {507,195,130,401,363,171,483,20,86,464,2,89,89,2,26,2,2,2,2,2,425,425,2,2,2,2,2,2,2,2,2,2},
+ {380,220,87,122,242,78,207,371,95,305,2,2,2,2,440,440,445,358,358,331,331,358,445,445,445,445,445,445,445,445,445,445},
+ {507,221,247,137,182,90,28,207,325,438,2,2,2,2,2,187,232,438,2,2,68,37,37,37,37,37,37,37,37,37,161,2},
+ {509,265,101,126,203,86,152,416,352,85,2,2,2,284,391,368,2,2,152,2,2,2,325,2,2,2,2,2,2,2,2,2},
+ {572,359,332,480,68,535,59,504,365,21,2,2,246,54,246,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {415,178,178,372,415,400,73,82,348,99,2,23,325,44,2,2,2,2,2,2,2,2,325,2,2,2,2,2,2,2,2,2},
+ {430,275,236,361,42,552,368,236,653,74,65,458,288,307,307,2,2,2,2,2,2,2,65,65,2,2,2,2,2,2,2,2},
+ {434,139,58,437,130,441,188,15,63,145,145,145,300,2,2,2,2,300,2,2,2,2,2,2,2,2,401,401,401,401,401,401},
+ {542,138,266,514,552,202,103,197,574,48,2,96,96,2,2,96,96,217,2,2,2,2,2,2,2,2,2,2,2,2,2,217},
+ {546,494,72,272,550,219,213,209,169,404,69,464,86,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {602,466,332,458,99,244,255,183,446,670,2,186,323,2,2,2,2,2,2,2,2,2,2,2,2,2,2,292,165,165,165,165},
+ {422,413,561,110,242,62,436,478,18,150,606,88,643,2,249,2,2,2,2,456,2,2,2,2,2,2,2,2,2,2,2,456},
+ {522,141,154,253,264,53,120,93,274,52,44,203,556,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {600,249,375,555,421,322,317,84,517,517,268,106,353,2,2,2,2,2,2,2,2,2,268,2,2,2,2,2,2,302,2,2},
+ {555,516,310,438,290,559,52,265,248,193,285,441,285,285,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {555,300,232,386,470,300,355,177,57,407,450,279,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {544,177,79,306,256,402,205,496,398,115,115,43,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {534,274,194,220,575,81,206,544,341,85,137,429,429,429,429,344,2,2,2,2,2,315,315,315,315,315,315,72,72,72,2,2},
+ {400,136,112,136,273,277,205,578,122,122,230,230,2,2,2,2,2,2,2,2,2,2,2,2,2,2,302,2,2,2,2,2},
+ {576,421,115,52,253,373,17,657,43,178,178,58,485,485,485,485,485,485,2,2,2,159,159,159,159,2,619,2,2,2,2,2},
+ {576,301,142,329,96,41,302,528,126,112,206,206,2,2,2,2,2,2,206,206,2,206,206,2,191,206,206,191,191,191,191,206},
+ {548,538,508,250,539,102,73,285,119,433,480,480,2,2,2,480,480,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {622,526,294,56,498,176,237,351,25,26,474,55,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {446,163,469,481,240,278,51,373,491,13,22,419,2,2,2,2,2,2,2,2,2,176,176,2,2,2,2,2,2,2,2,2},
+ {445,223,102,108,120,166,68,214,737,504,96,96,206,377,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,39,39,528},
+ {453,121,489,84,434,505,78,575,468,372,468,468,83,468,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {425,355,128,58,194,82,438,117,10,34,34,35,112,107,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {432,479,328,443,253,634,271,429,406,543,406,543,543,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {433,294,192,205,152,70,99,68,392,169,309,390,390,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,199,2,2,2},
+ {456,383,487,311,57,579,673,264,582,187,184,43,43,2,2,2,2,501,501,501,2,2,2,2,2,2,2,2,2,2,2,2},
+ {437,561,384,619,363,420,614,117,217,247,405,142,142,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {434,372,239,508,478,26,375,255,151,151,650,112,251,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {437,133,516,423,305,90,135,25,266,487,6,286,286,2,2,2,2,2,2,2,2,2,2,2,2,510,510,2,2,2,2,2},
+ {463,341,170,401,178,79,305,98,162,166,32,392,335,335,335,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {610,477,478,516,318,184,267,423,190,494,494,2,336,336,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {611,211,491,224,47,54,124,268,271,271,223,2,2,2,2,2,2,2,2,2,2,2,2,359,2,2,2,2,2,2,2,2},
+ {590,463,461,162,162,622,167,254,29,377,377,75,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {478,388,612,404,491,561,180,80,262,58,94,2,2,275,2,2,2,2,2,151,2,2,2,2,2,312,312,312,2,2,2,275},
+ {629,225,67,623,298,588,354,49,41,185,176,63,63,63,2,2,2,2,2,2,2,2,2,2,2,2,8,435,32,32,435,435},
+ {671,275,392,298,612,328,337,215,58,58,124,2,2,490,392,2,2,2,125,457,457,2,2,2,2,2,2,2,2,2,2,457},
+ {448,126,129,168,209,340,40,96,509,509,509,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {667,246,160,68,737,203,168,628,46,128,358,2,2,2,121,121,2,2,2,2,2,2,560,121,2,2,2,2,2,2,2,121},
+ {635,212,284,356,187,591,275,361,194,317,488,2,2,2,2,2,2,97,6,2,6,247,2,2,2,2,2,2,2,2,2,6},
+ {612,395,104,86,264,321,521,325,252,53,178,100,100,100,16,343,343,343,343,343,2,2,2,2,2,2,2,2,2,343,343,343},
+ {486,428,287,472,292,141,504,178,585,98,282,2,2,2,2,2,2,2,2,2,2,2,2,284,284,284,78,284,2,2,2,2},
+ {612,327,212,565,450,385,201,649,423,491,106,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {462,579,236,447,60,162,427,258,73,742,742,2,742,742,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {495,440,89,439,65,207,459,407,139,131,624,2,380,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {469,507,276,227,66,237,260,386,27,666,31,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {646,393,273,238,24,13,253,127,368,316,316,316,150,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {626,196,111,465,386,431,181,414,614,391,349,318,389,2,389,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {667,257,290,122,109,523,95,26,282,49,374,236,236,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,88,2,2},
+ {653,169,261,533,488,282,213,443,337,480,503,174,534,2,2,2,2,2,534,2,2,2,2,534,2,2,2,2,534,2,2,2},
+ {670,555,160,90,604,604,50,459,376,545,316,180,526,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {639,253,95,380,108,448,223,254,381,30,6,644,6,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {642,160,702,90,157,254,278,521,650,277,74,554,122,2,2,2,2,2,2,517,174,174,174,2,2,2,2,2,2,2,2,2},
+ {678,254,190,197,637,49,130,25,374,357,357,411,643,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,537,2,2},
+ {512,347,65,546,434,87,18,123,672,412,316,6,699,6,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {657,233,108,38,147,53,136,168,408,477,477,279,268,289,2,2,2,2,2,2,289,2,2,2,2,2,2,2,2,289,289,2},
+ {498,431,217,101,78,143,111,113,181,825,458,140,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {660,624,376,472,165,66,158,308,492,779,305,305,2,576,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {521,249,388,155,467,245,134,311,72,312,312,623,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {408,348,216,299,302,668,347,63,172,141,272,168,678,2,2,2,512,2,2,2,2,4,2,2,2,494,64,64,64,128,16,512},
+ {669,421,230,70,212,845,237,347,148,76,823,472,2,2,2,132,2,2,2,2,2,2,2,383,132,383,2,2,383,383,383,383},
+ {693,530,139,82,780,416,270,278,330,484,484,200,2,2,2,2,137,94,2,2,2,2,2,2,2,2,484,2,2,2,2,2},
+ {672,150,164,622,196,75,302,119,42,314,314,132,60,60,60,298,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {705,302,411,705,691,160,809,40,32,867,826,826,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {684,229,138,46,407,399,82,254,267,31,31,45,2,209,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {707,323,409,27,31,157,492,463,886,412,251,251,304,190,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {715,521,636,304,402,459,435,571,611,214,214,43,43,358,2,2,2,2,358,2,2,2,2,2,2,358,358,358,2,2,358,358},
+ {768,224,219,425,467,147,151,643,316,263,263,263,263,263,2,2,2,2,2,272,139,2,2,2,2,2,2,2,2,2,272,53},
+ {555,543,434,78,850,174,277,194,4,100,471,69,69,424,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {690,206,572,877,600,129,288,52,19,147,222,222,147,147,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {793,279,264,566,252,495,872,492,482,107,294,503,350,350,2,2,2,2,2,2,2,285,285,273,273,273,273,2,2,2,2,2},
+ {703,427,225,320,136,47,103,547,239,217,73,68,68,204,204,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {791,275,60,137,352,839,67,476,356,216,216,563,563,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {703,312,472,588,228,512,386,668,477,617,389,389,389,2,296,2,2,2,2,343,343,2,2,343,343,2,2,617,617,617,617,2},
+ {709,509,697,145,252,194,304,192,192,623,623,4,423,2,2,2,199,423,2,2,2,222,222,2,2,623,623,623,623,623,2,222},
+ {587,453,117,107,672,86,248,568,568,294,294,513,78,2,2,164,82,2,2,2,2,22,2,2,2,2,2,2,2,2,2,2},
+ {741,466,378,135,737,131,159,469,59,2,59,59,187,2,204,2,2,2,2,2,2,2,2,2,798,2,2,798,798,798,798,798},
+ {539,310,463,103,553,45,609,326,197,2,62,113,272,2,62,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {750,703,182,242,92,335,272,466,594,2,701,569,474,129,140,140,2,507,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {547,210,113,361,584,121,65,307,98,2,2,552,514,514,2,514,207,514,514,514,2,2,2,2,2,2,2,2,2,2,2,2},
+ {555,229,328,91,272,815,483,749,468,2,92,92,4,92,2,2,2,258,258,258,2,258,258,2,2,2,2,258,2,2,258,258},
+ {580,145,358,434,630,73,604,366,366,2,2,398,398,207,2,207,487,2,2,487,207,2,2,207,207,207,2,2,2,2,207,207},
+ {457,520,93,460,275,525,300,184,354,147,147,147,147,179,82,82,82,82,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {872,630,513,218,719,174,197,104,86,281,281,281,541,642,281,94,2,45,94,2,335,335,2,2,2,2,2,2,2,2,2,84},
+ {765,421,129,298,867,365,222,476,401,142,90,22,22,88,226,657,2,2,477,2,2,2,2,2,226,226,2,226,2,2,2,226},
+ {833,634,228,520,113,329,279,420,581,2,2,385,385,110,450,2,733,2,2,2,561,561,2,561,2,2,2,2,2,2,2,2},
+ {587,553,360,539,227,800,312,143,536,2,2,2,64,64,64,2,2,2,179,179,493,2,2,184,184,184,58,2,2,2,493,493},
+ {744,466,389,280,229,134,363,177,389,2,2,2,536,273,536,536,536,536,168,45,45,45,45,2,2,2,2,2,2,2,2,2},
+ {841,222,158,469,253,91,347,241,766,2,2,2,88,88,88,439,439,439,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {462,653,478,67,269,150,474,711,220,669,669,669,669,669,390,352,325,2,229,545,545,545,545,545,545,545,545,2,545,352,309,352},
+ {468,430,849,689,202,427,45,34,105,2,2,2,2,4,4,4,4,4,4,4,2,2,2,4,4,4,4,4,2,2,2,2},
+ {610,289,503,744,775,512,605,454,484,2,2,2,444,466,145,631,2,631,631,631,631,631,631,631,631,631,2,2,631,631,631,858},
+ {792,169,306,843,246,123,293,229,483,2,2,2,165,163,163,163,163,440,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {563,325,717,766,440,705,290,123,228,2,2,2,32,64,146,2,2,2,116,79,79,2,146,146,79,79,79,2,2,146,146,79},
+ {795,185,350,211,82,537,106,680,62,2,2,537,423,423,423,2,2,501,501,2,501,2,501,2,2,2,2,2,2,2,2,2},
+ {633,425,295,548,497,163,381,461,89,2,2,831,583,896,38,2,625,2,2,2,276,276,2,2,276,2,2,2,2,2,2,2},
+ {767,318,84,97,208,387,423,196,417,2,396,396,396,396,396,128,128,2,2,2,328,328,4,4,4,4,101,2,2,328,82,16},
+ {802,533,869,638,67,192,805,223,219,2,2,191,178,178,77,77,2,2,2,2,431,431,2,2,2,431,431,2,2,431,2,2},
+ {781,638,410,399,336,465,856,426,28,2,4,4,6,6,2,2,2,449,372,372,449,449,449,2,2,449,449,449,449,449,449,2},
+ {807,377,237,443,388,286,158,349,491,32,32,260,260,260,2,2,260,615,615,615,2,2,260,260,260,260,260,615,615,615,615,615},
+ {780,359,766,618,41,596,86,636,287,707,707,96,49,373,613,373,2,2,2,2,2,2,2,613,613,613,2,2,2,2,2,2},
+ {788,497,334,93,319,169,273,540,904,2,903,569,569,569,272,272,2,2,2,2,571,571,571,571,571,571,571,571,571,571,571,571},
+ {814,652,456,774,624,870,27,739,464,2,108,578,578,561,295,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {818,280,99,873,165,426,341,74,479,342,727,684,684,662,662,2,2,2,2,2,2,662,2,2,2,2,2,2,2,2,2,2},
+ {593,411,953,203,89,57,785,354,349,424,424,707,707,707,829,2,2,2,2,2,670,670,670,2,2,424,424,424,2,2,670,424},
+ {629,560,621,245,683,633,495,551,472,2,31,74,489,684,555,684,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {901,490,693,410,666,119,703,593,201,61,70,70,774,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,418,418},
+ {669,321,391,548,189,157,337,42,796,871,276,622,30,2,2,2,2,2,2,2,580,580,107,2,2,2,2,2,434,434,434,434},
+ {610,236,633,300,681,358,72,281,148,466,466,283,275,2,386,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {929,360,102,893,329,136,515,33,170,581,268,35,777,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {859,584,475,745,506,900,40,869,143,612,175,275,209,12,12,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {822,581,76,382,72,347,964,324,137,61,61,28,623,351,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {655,330,324,151,166,431,58,174,142,115,1003,66,724,778,2,2,2,503,503,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {867,820,301,252,61,331,105,309,562,218,365,326,768,672,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {623,330,182,489,212,223,741,490,40,412,801,681,681,801,2,2,71,2,2,2,2,2,2,427,2,2,2,2,2,2,2,2},
+ {859,844,510,859,118,190,550,29,159,622,622,382,258,382,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {612,237,272,53,534,682,372,935,494,536,536,599,599,599,2,536,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {843,730,235,233,816,495,598,134,131,604,227,378,378,553,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {667,397,121,526,321,660,848,729,357,137,268,711,521,521,2,2,2,2,2,2,2,2,2,2,2,2,2,194,2,2,2,521},
+ {670,595,333,257,907,413,548,341,327,350,612,700,700,700,700,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {678,274,695,790,169,701,707,1084,470,123,846,846,217,121,317,2,2,2,83,83,83,83,83,83,83,83,83,2,2,2,2,2},
+ {877,181,375,79,199,256,223,295,135,371,395,354,2,307,944,2,813,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {882,417,475,424,311,646,346,207,74,157,590,356,2,2,324,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {708,442,186,698,345,103,687,463,163,416,416,107,2,2,2,375,375,416,6,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {865,675,786,568,112,197,225,348,372,497,215,215,2,2,2,2,159,159,150,224,224,141,2,2,2,2,141,141,141,141,141,141},
+ {693,726,117,167,535,725,224,78,716,100,460,299,2,2,2,2,921,744,2,2,2,2,2,378,2,2,178,178,178,2,178,178},
+ {697,540,358,391,932,309,103,73,35,353,353,503,2,2,353,134,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {982,579,548,413,416,103,71,101,1039,526,684,684,2,2,656,2,2,2,2,2,2,2,2,2,2,2,656,656,656,2,656,656},
+ {695,881,335,126,429,476,772,667,974,98,433,49,129,129,2,2,2,2,2,2,2,2,2,2,544,2,544,2,2,2,2,544},
+ {705,770,134,178,940,944,654,600,46,797,797,591,2,145,616,2,2,2,2,2,2,389,389,2,122,2,2,2,389,389,909,389},
+ {988,271,675,163,379,108,48,472,870,485,485,18,2,485,528,528,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {865,827,614,74,725,685,724,190,178,272,835,722,2,35,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {923,397,722,186,203,575,24,144,36,526,206,787,12,100,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {927,493,988,194,97,1006,377,578,105,248,707,784,98,784,2,2,2,2,2,2,2,2,2,370,370,2,370,2,2,2,2,2},
+ {900,455,485,601,353,69,67,965,25,226,314,314,883,923,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {903,259,153,106,289,916,861,41,441,368,131,131,262,671,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {945,358,160,196,82,403,362,195,376,877,521,336,521,77,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {912,516,108,555,306,274,55,197,565,174,659,208,441,441,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {753,242,194,619,345,94,463,485,163,85,412,575,270,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {915,210,456,377,303,237,225,521,621,175,569,20,124,2,601,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {672,652,792,253,796,404,171,90,406,433,43,159,72,2,2,372,2,540,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {733,439,537,37,149,650,916,443,743,621,921,664,664,2,2,2,2,2,682,523,523,523,2,2,523,523,523,523,523,523,523,523},
+ {982,344,812,567,243,52,246,369,439,205,600,739,730,2,2,2,61,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {982,604,126,65,633,657,22,776,161,45,725,44,4,2,2,2,2,2,2,2,2,2,269,269,2,2,2,2,2,2,2,2},
+ {745,600,284,1117,459,1135,300,52,845,331,334,334,334,2,334,334,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {936,409,217,57,574,395,481,245,548,268,447,598,375,2,192,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {986,241,233,45,721,325,350,222,35,1065,1065,1065,1065,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {755,796,877,981,259,194,1180,215,90,658,662,662,662,2,36,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {981,626,987,827,466,458,578,346,475,223,223,223,342,1058,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,728},
+ {949,422,941,491,66,786,592,429,307,123,40,478,478,478,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {992,723,625,251,431,544,309,466,700,644,484,837,904,320,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1077,496,819,340,974,122,39,1209,819,18,461,648,648,394,2,2,2,2,2,2,61,2,2,2,2,2,394,2,2,2,2,394},
+ {999,674,212,673,279,579,462,754,89,866,345,110,110,887,2,2,2,2,2,707,707,2,2,2,2,2,2,2,2,2,2,707},
+ {1083,356,367,357,559,213,606,477,71,103,790,103,299,299,2,2,2,2,2,2,406,406,2,2,2,2,2,2,2,2,2,2},
+ {1005,260,389,960,501,714,118,73,334,1019,704,204,504,205,822,822,2,2,2,2,2,2,2,2,2,2,684,2,2,2,2,2},
+ {738,749,769,610,306,326,328,578,479,840,840,840,68,192,2,150,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1010,937,449,474,154,456,766,318,275,444,709,2,778,778,778,806,779,779,2,2,2,2,2,2,2,2,806,2,2,2,287,287},
+ {1011,780,134,945,183,42,741,25,252,164,205,222,222,222,147,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1094,640,912,223,67,472,623,623,1244,65,1009,1209,1209,812,387,2,2,2,513,2,2,2,2,2,2,2,2,2,2,2,1209,234},
+ {722,375,264,390,515,498,1161,391,884,551,238,2,2,825,549,2,2,2,551,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1022,409,93,359,983,345,280,280,104,940,940,2,2,382,1039,2,2,2,2,831,2,2,2,2,2,2,2,2,2,2,2,2},
+ {997,525,680,120,466,728,288,110,1082,544,572,2,2,663,290,290,2,2,754,2,2,2,2,2,582,582,582,582,582,2,2,2},
+ {1055,395,795,561,222,85,294,433,377,89,89,2,2,2,456,821,2,2,821,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1128,788,124,501,561,1015,419,787,48,620,705,2,2,2,2,88,18,2,215,215,215,2,2,215,215,2,2,2,215,2,2,2},
+ {807,433,721,434,449,242,170,842,21,4,642,2,2,2,2,2,4,4,4,4,2,856,856,856,885,885,856,856,856,856,856,885},
+ {1004,719,1041,460,551,516,135,417,130,698,698,2,2,2,655,655,655,655,655,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1017,568,930,1113,556,1299,114,881,690,475,641,2,2,2,779,779,103,2,528,2,2,2,2,2,2,528,528,2,2,910,910,2},
+ {814,473,286,752,476,779,420,569,742,164,490,2,2,2,793,812,812,812,2,812,812,2,2,526,526,812,526,2,2,2,526,526},
+ {818,301,273,664,206,971,895,590,912,523,523,2,2,452,384,255,2,130,130,130,130,865,2,2,2,255,2,2,2,2,2,2},
+ {820,249,292,1017,1017,143,403,37,433,456,515,2,2,69,640,2,2,2,2,2,2,2,2,2,2,2,2,824,824,824,2,2},
+ {865,1132,428,582,254,408,536,376,825,116,116,1266,1266,1266,705,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {635,503,594,203,456,1246,221,396,1151,178,66,2,781,587,86,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1157,395,446,280,1130,695,668,271,111,882,477,615,615,615,2,2,2,2,2,2,2,2,615,615,615,615,615,615,615,2,305,2},
+ {830,397,932,519,818,113,367,694,88,535,535,414,343,175,2,2,2,2,2,2,2,2,2,2,414,864,2,2,864,864,864,864},
+ {793,463,329,730,390,551,968,92,511,470,424,563,672,563,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1050,749,809,479,87,757,288,172,597,722,4,418,418,390,2,2,2,2,2,390,390,2,2,2,2,2,2,2,2,2,2,2},
+ {1090,255,271,110,159,235,158,236,271,815,1300,416,416,416,2,2,416,416,2,2,2,399,791,791,2,791,2,2,2,2,791,791},
+ {1058,417,271,172,312,363,184,191,28,183,759,214,759,39,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1057,385,263,395,901,274,727,340,1117,263,813,870,858,429,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1102,846,985,1085,764,124,764,51,874,612,478,801,478,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1120,665,311,695,319,1033,511,297,602,1030,1030,714,240,240,2,2,2,2,2,2,2,2,2,2,2,2,2,953,2,2,2,2},
+ {1106,662,258,190,1315,214,530,263,318,904,877,1317,318,2,510,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1206,469,299,1052,655,114,189,213,321,188,64,475,475,2,2,662,662,662,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1120,1159,358,347,838,207,357,167,476,52,672,38,822,2,2,2,2,2,2,213,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1076,596,553,545,79,727,881,121,298,169,639,368,695,115,115,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1130,177,84,673,350,543,543,95,128,954,430,884,884,2,884,884,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {820,461,681,382,273,273,358,274,274,91,887,676,386,2,676,676,2,2,2,2,2,2,2,200,2,2,2,2,200,2,2,2},
+ {1091,946,437,51,527,802,597,639,587,645,510,586,586,2,2,2,2,2,2,2,2,2,2,2,2,2,2,168,168,168,168,168},
+ {1148,585,868,1282,666,417,733,1231,515,332,1213,337,337,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1103,276,174,408,233,170,955,108,530,354,585,38,677,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,476},
+ {1167,478,1169,1053,563,371,108,772,413,497,1338,991,660,2,2,2,2,2,2,2,2,2,2,2,2,27,2,2,2,2,2,2},
+ {1116,331,280,422,1109,341,570,243,849,241,566,61,608,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {898,782,478,1208,196,983,608,537,196,1141,141,296,715,715,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1099,1187,300,240,268,413,1366,634,184,768,773,365,783,224,783,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {904,660,1283,46,33,124,416,218,152,970,1241,305,307,307,307,260,894,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1127,553,287,58,739,99,514,739,766,42,580,241,598,598,936,936,936,629,629,629,629,2,2,2,2,2,2,2,2,2,2,2},
+ {1142,370,287,925,307,1232,129,11,1284,1056,33,33,536,521,2,1286,2,2,2,2,2,2,2,2,2,2,2,2,847,847,847,847},
+ {1297,600,419,985,846,493,186,109,147,239,197,762,762,327,327,1004,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1181,615,482,653,238,130,313,506,98,1314,730,730,730,730,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {921,613,628,1288,111,150,191,233,633,83,387,602,105,394,2,2,2,2,2,2,2,351,2,2,351,351,351,2,2,2,351,351},
+ {1192,555,586,516,1288,733,64,653,364,273,421,215,75,75,2,2,2,2,2,2,953,953,953,953,8,383,383,2,161,383,953,953},
+ {1160,617,505,1205,374,906,23,408,194,91,91,91,585,984,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1203,1101,497,352,254,309,464,123,607,1080,265,1145,1145,1145,284,284,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1210,656,1026,782,802,442,1319,734,794,165,165,796,93,796,2,829,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {963,646,721,1161,219,667,1088,485,692,692,663,535,553,662,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,686,686,2},
+ {941,231,1038,309,173,770,413,560,855,660,721,1103,721,721,721,2,2,2,2,2,2,2,2,2,2,2,2,174,2,2,2,2},
+ {1213,305,656,983,1399,1196,692,986,9,339,754,308,2,308,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1330,671,528,831,1426,735,33,425,364,119,363,978,2,761,483,476,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1190,286,513,881,390,215,387,130,749,554,1110,519,160,160,160,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1247,353,973,217,1044,1318,1115,319,203,390,1244,225,2,2,508,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {893,560,132,1420,721,191,568,799,412,22,322,93,2,4,4,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {882,1038,211,110,942,337,1305,1225,661,183,381,381,2,2,2,2,347,2,2,2,2,2,2,2,600,431,431,431,431,431,431,431},
+ {1208,486,343,725,677,1204,135,139,924,170,1111,317,2,2,2,2,202,706,202,107,107,107,2,2,706,706,107,107,2,2,2,706},
+ {1259,1017,456,298,443,838,137,744,551,334,36,951,2,2,2,699,718,2,2,984,2,2,2,2,2,2,984,984,2,2,2,2},
+ {1212,1186,641,284,565,636,895,82,690,117,184,184,2,2,2,397,902,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1263,370,132,635,381,47,537,179,1192,301,1282,33,2,2,2,1553,2,2,2,2,2,2,2,2,2,2,2,307,307,2,2,2},
+ {1015,593,112,1408,51,104,199,221,931,1010,928,928,2,2,878,878,2,2,2,2,731,731,2,731,731,2,731,2,731,731,731,2},
+ {1223,434,851,152,140,1495,190,397,925,37,1080,430,2,2,204,2,759,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {939,1070,1288,254,973,901,321,109,568,713,336,988,2,946,262,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1276,636,569,258,325,675,342,85,88,579,833,833,833,833,520,2,2,2,2,520,520,2,2,2,2,2,2,2,2,2,2,2},
+ {1288,1398,789,514,151,600,1618,1194,1419,441,234,204,1191,438,828,2,857,857,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1401,402,525,293,97,223,452,808,61,169,1023,1023,886,886,1023,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1001,644,263,164,136,939,624,95,489,1023,1107,331,331,10,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1401,741,509,797,47,157,1256,482,1513,899,736,780,780,210,2,2,2,2,783,783,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1047,880,369,402,641,446,639,586,277,396,419,275,825,820,2,2,2,238,238,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1273,701,831,1294,1580,137,162,415,563,11,92,116,116,116,2,2,2,2,2,2,1029,1029,1029,504,504,877,877,877,877,877,1029,1029},
+ {1335,400,315,412,172,125,568,1024,58,601,398,985,640,577,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1057,1198,146,529,284,1286,160,135,75,686,648,1425,821,586,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1422,838,234,554,736,243,344,526,1108,33,1303,699,249,305,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1279,681,423,813,806,269,412,420,985,485,761,1013,649,796,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {938,614,523,557,898,624,178,461,287,985,371,371,260,613,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1040,998,324,93,887,497,1326,443,152,1193,595,80,80,80,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1027,1128,114,395,357,417,848,22,389,1257,734,838,838,301,900,2,90,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1040,420,960,882,64,661,292,146,976,427,689,248,248,248,638,2,2,2,2,2,2,2,2,2,2,2,2,861,861,861,2,861},
+ {1041,1090,651,130,72,389,171,237,516,777,937,937,937,168,168,2,336,2,2,2,2,2,2,2,2,2,992,2,992,2,992,2},
+ {987,1280,1245,1300,926,676,56,546,541,690,84,42,1000,1383,1383,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1058,454,1557,191,129,297,695,1390,1274,460,923,923,923,2,4,1059,2,2,2,2,2,2,2,2,2,2,2,2,2,1059,2,2},
+ {1327,572,282,1022,907,1276,409,643,1050,633,187,187,187,2,228,45,2,2,2,2,2,2,320,2,2,2,2,2,2,2,2,2},
+ {1395,529,461,402,194,392,122,781,111,162,780,593,593,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1062,212,784,63,252,873,1302,1108,1380,84,1375,1375,1375,2,2,2,375,374,2,980,2,2,2,980,980,980,2,2,2,2,2,2},
+ {1384,549,430,781,946,879,901,924,741,114,14,451,36,2,2,2,2,287,287,287,803,803,803,803,2,2,2,803,803,803,803,803},
+ {1413,627,1329,1092,526,197,31,417,1149,981,964,1003,685,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,717,717,2,2},
+ {1084,1174,1601,949,910,960,500,461,1290,23,1042,636,212,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1091,793,1353,208,506,599,846,503,1011,247,289,61,1050,61,61,61,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1533,978,284,156,914,162,685,1184,252,1375,189,256,640,2,640,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1128,398,791,1170,76,661,408,259,756,495,79,553,10,10,1532,1532,1532,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1040,704,618,854,374,1470,274,383,941,519,351,351,351,351,351,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1427,988,498,1529,99,678,1323,149,33,426,543,543,335,1507,772,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1102,349,490,266,144,220,599,437,743,764,647,1128,605,265,324,324,324,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1118,724,1322,405,199,614,1087,885,1313,317,769,660,660,1158,535,2,2,2,373,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1120,772,743,488,346,126,784,584,943,153,311,133,133,969,605,605,2,2,2,2,2,2,2,605,2,2,2,2,2,2,2,2},
+ {1441,791,233,141,141,316,89,296,462,1263,758,482,599,599,578,341,2,2,2,2,2,2,2,2,2,2,2,525,525,525,2,2},
+ {1413,406,700,547,1166,250,518,543,104,331,205,205,691,691,2,2,118,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1485,400,1497,168,82,680,1103,554,249,702,493,101,296,236,2,236,236,944,944,2,2,394,2,2,2,2,2,2,2,2,2,2},
+ {1139,809,117,522,955,1096,1120,1470,116,184,1565,1565,557,557,2,2,2,2,2,829,1326,2,2,2,2,2,2,2,2,2,2,2},
+ {1142,984,1044,590,340,241,662,357,366,1305,2,125,631,474,2,2,2,980,2,2,2,2,2,2,2,2,2,2,2,2,2,1273},
+ {1487,1010,320,966,785,847,954,1060,138,856,966,966,966,703,2,703,703,2,2,2,2,2,2,2,2,2,2,2,2,1279,2,1279},
+ {1495,1178,874,415,1100,368,1057,1228,562,215,31,31,680,680,680,1208,2,2,2,2,2,2,2,2,1208,2,2,2,2,1208,1208,2},
+ {1617,289,1033,169,355,260,30,45,721,906,88,44,44,418,417,218,2,2,846,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1623,499,308,1058,1184,1230,63,1515,433,110,763,763,422,954,954,954,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1531,621,210,755,482,82,1308,317,427,168,2,232,116,190,701,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,701},
+ {1532,575,1245,360,249,630,133,1406,920,1539,63,63,76,82,82,2,2,2,770,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1102,785,118,93,1491,988,275,53,1328,26,2,2,240,647,240,761,761,761,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1478,722,113,1534,1751,115,1728,1234,777,282,508,508,1184,63,1184,855,855,2,2,2,738,738,578,578,2,2,2,2,2,2,2,2},
+ {1482,961,1093,556,1746,628,427,689,510,751,684,37,37,1229,1256,882,1507,1507,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1228,425,1030,699,407,171,568,925,1104,97,2,2,1286,1286,1286,502,2,1219,1219,1219,1290,2,1219,1219,1219,1219,2,2,2,59,2,2},
+ {1547,657,777,695,1254,224,933,367,212,385,2,2,2,1422,749,245,885,710,2,2,710,710,710,45,710,710,710,710,2,336,710,2},
+ {1559,462,850,289,1570,71,512,858,810,835,2,2,2,2,1028,1205,1205,546,546,546,1205,1205,1205,1205,1205,2,1205,1205,1205,1205,1205,1205},
+ {1192,888,701,164,131,613,282,237,525,366,2,2,2,2,1737,845,845,750,2,1062,1062,1062,1062,1062,1062,1062,1062,1062,1062,2,1261,1261},
+ {1128,393,1522,96,160,581,540,120,441,176,2,2,2,2,2,2,1427,551,1102,1102,328,328,592,592,592,592,592,592,592,592,592,592},
+ {1567,1265,372,1633,613,484,243,1523,21,275,2,2,2,431,431,431,431,2,2,978,489,889,889,889,889,889,889,889,2,2,2,2},
+ {1522,1422,1017,124,499,451,731,1112,1355,1355,2,2,2,854,854,336,854,336,1297,2,2,2,193,193,193,193,193,2,2,2,2,2},
+ {1605,1499,454,1072,686,732,309,295,940,551,2,2,880,264,264,973,2,2,72,314,2,2,2,890,890,2,2,2,2,2,2,2},
+ {1598,397,1471,1471,1162,866,236,948,1557,737,2,2,153,737,1408,765,765,608,2,2,2,171,608,608,608,608,2,608,608,2,2,2},
+ {1598,434,107,270,148,1317,835,123,642,1236,2,2,67,633,771,878,771,878,878,2,2,2,771,2,2,2,2,2,2,2,2,2},
+ {1628,1502,1042,822,80,403,1335,684,464,426,671,671,336,336,336,2,425,896,2,2,2,2,1337,1337,1337,1337,1337,1337,2,2,2,2},
+ {1607,1503,1072,471,221,277,854,1236,263,752,2,694,1657,934,553,2,2,2,498,498,2,802,2,46,2,2,2,2,2,2,2,2},
+ {1756,1359,698,1584,446,724,729,419,660,1305,2,244,244,244,540,540,540,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1263,835,1533,789,1259,174,1497,557,644,203,2,289,604,434,434,434,2,844,844,2,2,2,1111,1111,1111,2,2,2,2,2,2,2},
+ {1797,904,172,659,349,177,692,448,1141,990,640,99,1073,806,640,640,2,640,640,911,911,911,640,640,640,640,2,2,2,2,2,2},
+ {1276,442,1008,1352,243,162,711,301,552,1002,668,668,384,71,384,384,2,2,2,2,2,727,727,727,777,777,777,777,777,777,2,777},
+ {1600,1130,171,1113,813,722,117,990,37,24,969,94,825,1398,1398,1398,1398,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1682,449,1067,393,136,854,36,492,637,1053,247,1111,1111,1111,2,247,247,247,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1601,697,532,408,697,1140,1568,47,1499,780,1171,318,318,318,2,2,2,2,318,318,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1283,1078,791,873,655,412,389,835,292,958,1245,678,1611,1519,2,2,185,2,2,2,2,2,2,1245,1245,2,2,2,2,2,2,1245},
+ {1822,589,236,205,797,39,241,1048,181,386,102,102,102,111,1361,1361,1361,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1342,705,302,595,1200,52,83,647,519,139,103,103,103,513,2,513,2,2,2,2,2,513,2,2,2,2,2,2,2,2,2,2},
+ {1636,974,279,419,893,1608,1491,156,1486,115,730,730,863,509,924,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1732,1771,584,533,297,1056,669,293,146,311,1176,311,590,590,277,2,2,2,2,2,2,2,2,2,539,539,2,2,2,2,2,2},
+ {1360,383,1470,502,1010,153,1588,619,1246,396,1107,1107,112,423,423,2,2,2,2,2,202,2,2,2,2,2,2,2,2,2,2,2},
+ {1747,611,1788,1446,152,1335,710,1040,639,1279,788,788,265,1441,107,2,2,2,2,1441,1441,1441,1441,938,938,938,938,2,2,867,867,1441},
+ {1682,867,333,102,628,891,654,506,995,684,961,563,1313,1313,1313,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1875,1576,924,677,461,134,1525,1619,44,701,299,743,728,791,791,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,791,791},
+ {1744,1011,935,492,158,1645,795,1056,74,679,367,675,675,1229,1229,1229,2,2,2,2,2,2,2,2,2,2,2,2,2,1229,2,2},
+ {1763,1018,1859,432,717,723,874,1294,1050,1800,1237,619,1074,2,10,1237,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1376,652,461,225,361,936,1073,1279,149,619,983,511,1994,2,2,1076,1076,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1780,1739,1357,1684,1586,736,208,966,1691,339,339,128,128,2,2,128,128,128,2,2,128,2,2,2,2,1929,2,2,338,2,2,338},
+ {1289,907,228,665,1695,1735,489,214,762,1777,321,1674,932,2,2,2,2,1358,709,2,1959,1959,372,2,2,372,372,2,2,372,372,372},
+ {1802,1645,453,1079,604,618,334,855,541,167,37,88,849,2,2,518,518,2,2,530,2,2,2,2,2,2,2,119,119,2,2,2},
+ {1322,512,560,432,365,87,1835,1137,515,1271,1739,309,309,1229,1229,1229,2,2,2,2,2,2,2,2,416,416,416,416,2,2,2,2},
+ {1444,394,1613,796,645,1406,186,158,402,1364,314,588,606,2,577,117,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1325,1300,1353,1575,33,730,46,1476,84,84,189,457,352,2,1479,2,2,2,2,2,2,2,2,2,2,2,2,1565,2,2,2,2},
+ {1343,365,790,1047,983,1015,918,1469,1416,126,1238,1238,1238,1238,151,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1861,1487,419,97,799,1791,458,1029,370,627,57,414,414,1540,247,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1480,1131,1089,1688,340,962,505,1816,139,44,1350,403,1385,1996,173,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1328,601,601,617,554,467,391,1545,162,1361,807,1565,1565,243,1344,2,725,510,510,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1892,441,977,228,1252,604,735,136,889,878,1319,1319,2127,2127,1963,367,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1898,787,769,1166,799,479,1066,390,821,1061,201,201,1339,703,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1850,1476,792,840,2037,229,1578,526,431,1485,1450,1001,1001,1001,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1948,1530,576,582,1069,119,2131,41,1178,1677,1677,1677,325,346,2,2,2,2,2,2,1401,2,33,2,2,2,2,2,2,71,71,71},
+ {1540,791,518,419,1130,1068,299,1386,1378,134,859,859,71,162,2,71,71,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1889,1210,1246,1326,668,1199,77,565,1277,1607,874,1433,1433,77,2,681,2,2,2,2,2,2,2,679,2,2,2,2,2,2,2,2},
+ {1520,1107,1082,687,484,1732,676,1595,467,653,1091,428,2113,332,332,332,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1534,854,2007,1207,947,1773,1571,1505,909,1471,1655,1655,2334,1327,409,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2145,1069,662,709,737,1141,1737,827,1384,1628,107,107,1032,277,277,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1600,1823,1698,1268,623,583,1932,1674,522,529,1862,1281,246,989,246,2,246,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1570,1504,1414,1143,1999,1932,1015,1015,556,514,626,79,2,79,1795,1461,1461,2,2,2,2,2,2,2,1461,1461,1461,1461,1461,2,2,2},
+ {1976,1433,820,504,421,1007,388,1083,635,82,1524,750,2,2,870,106,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2008,1773,416,1954,1314,742,1694,505,202,1747,785,375,2,2,2,477,1538,477,2,2,2,2,2,1309,1309,1309,1309,2,2,2,1309,2},
+ {1480,807,1596,520,1139,213,1581,460,923,617,1305,939,2,2,2,2,53,53,1589,284,2,2,1589,1589,1589,1589,1589,1589,1589,1589,1589,1589},
+ {1628,846,1504,138,464,401,501,506,967,1027,1540,1035,2,1921,1539,1539,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2304,1948,316,1063,237,607,1143,2575,1388,1022,127,251,2,438,1570,1570,1570,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1600,1338,196,1510,1371,1138,957,169,545,1176,1131,2460,1708,541,541,2,363,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1736,2186,725,1844,1638,825,592,648,193,1241,462,462,45,264,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2}
+};
Index: trunk/cuba/src/divonne/Divonne.tm
===================================================================
--- trunk/cuba/src/divonne/Divonne.tm (revision 158)
+++ trunk/cuba/src/divonne/Divonne.tm (revision 159)
@@ -1,437 +1,346 @@
:Evaluate: BeginPackage["Cuba`"]
:Evaluate: Divonne::usage =
"Divonne[f, {x, xmin, xmax}..] computes a numerical approximation to the integral of the real scalar or vector function f.
The output is a list with entries of the form {integral, error, chi-square probability} for each component of the integrand."
+:Evaluate: MinPoints::usage = "MinPoints is an option of Divonne.
+ It specifies the minimum number of points to sample."
+
:Evaluate: Key1::usage = "Key1 is an option of Divonne.
It determines sampling in the partitioning phase.\n
Special cases:\n
Key1 = 7: use a degree-7 cubature rule,\n
Key1 = 9: use a degree-9 cubature rule,\n
Key1 = 11: use a degree-11 cubature rule (available only in 3 dimensions),\n
Key1 = 13: use a degree-13 cubature rule (available only in 2 dimensions),\n
otherwise a random sample of n1 = Abs[Key1] points is used, where the sign of Key1 determines the type of sample:\n
Key1 > 0: use a Korobov quasi-random sample,\n
Key1 < 0: use a \"standard\" sample."
:Evaluate: Key2::usage = "Key2 is an option of Divonne.
It determines sampling in the main integration phase.\n
Special cases:\n
Key2 = 7: use a degree-7 cubature rule,\n
Key2 = 9: use a degree-9 cubature rule,\n
Key2 = 11: use a degree-11 cubature rule (available only in 3 dimensions),\n
Key2 = 13: use a degree-13 cubature rule (available only in 2 dimensions),\n
otherwise a random sample is used, where the sign of Key2 determines the type of sample:\n
Key2 > 0: use a Korobov quasi-random sample,\n
Key2 < 0: use a \"standard\" sample,\n
and n2 = Abs[Key2] determines the number of points:\n
n2 >= 40: sample n2 points,\n
n2 < 40: sample n2*nneed points, where nneed is the number of points needed to reach the prescribed accuracy, as estimated by Divonne from the results of the partitioning phase."
:Evaluate: Key3::usage = "Key3 is an option of Divonne.
It sets the strategy for the refinement phase:\n
Key3 = 0: do not further treat the subregion,\n
Key3 = 1: split the subregion up once more,\n
for other values the region is sampled a third time:\n
Key3 = 7: use a degree-7 cubature rule,\n
Key3 = 9: use a degree-9 cubature rule,\n
Key3 = 11: use a degree-11 cubature rule (available only in 3 dimensions),\n
Key3 = 13: use a degree-13 cubature rule (available only in 2 dimensions),\n
otherwise a random sample is used, where the sign of Key3 determines the type of sample:\n
Key3 > 0: use a Korobov quasi-random sample,\n
Key3 < 0: use a \"standard\" sample,\n
and n3 = Abs[Key3] determines the number of points:\n
n3 >= 40: sample n3 points,\n
n3 < 40: sample n3*nneed points, where nneed is the number of points needed to reach the prescribed accuracy, as estimated by Divonne from the results of the partitioning phase."
:Evaluate: MaxPass::usage = "MaxPass is an option of Divonne.
It controls the partitioning termination.
The partitioning phase is terminated when the estimated total number of integrand evaluations (partitioning plus main integration) does not decrease for MaxPass successive iterations."
:Evaluate: Border::usage = "Border is an option of Divonne.
It specifies the width of the border of the integration region.
Points falling into this border region are not sampled directly, but are extrapolated from two samples from the interior.
The border width always refers to the unit hypercube, i.e. it is not rescaled if the integration region is not the unit hypercube."
:Evaluate: MaxChisq::usage = "MaxChisq is an option of Divonne.
It specifies the maximum chi-square value a single subregion is allowed to have in the main integration phase.
Regions which fail this chi-square test and whose sample averages differ by more than MinDeviation move on to the refinement phase."
:Evaluate: MinDeviation::usage = "MinDeviation is an option of Divonne.
Regions which fail the chi-square test are not treated further if their sample averages differ by less than MinDeviation.
MinDeviation is specified as the fraction of the requested error of the entire integral."
:Evaluate: Given::usage = "Given is an option of Divonne.
It provides a list of points where the integrand might have peaks.
Divonne will consider these points when partitioning the integration region."
:Evaluate: NExtra::usage = "NExtra is an option of Divonne.
It specifies the maximum number of points that will be considered in the output of the PeakFinder function."
:Evaluate: PeakFinder::usage = "PeakFinder is an option of Divonne.
It specifies the peak-finder function.
This function is called whenever a region is up for subdivision and is supposed to point out possible peaks lying in the region, thus acting as the dynamic counterpart of the static list of points supplied with Given.
It is invoked with two arguments, the multidimensional equivalents of the lower left and upper right corners of the region being investigated, and must return a (possibly empty) list of points."
-:Evaluate: MinPoints::usage = "MinPoints is an option of Divonne.
- It specifies the minimum number of points to sample."
+:Evaluate: StateFile::usage = "StateFile is an option of Divonne.
+ It specifies a file in which the internal state is stored after each iteration and from which it can be restored on a subsequent run.
+ The state file is removed once the prescribed accuracy has been reached."
:Evaluate: Final::usage = "Final is an option of Divonne.
It can take the values Last or All which determine whether only the last (largest) or all sets of samples collected on a subregion over the integration phases contribute to the final result."
:Evaluate: PseudoRandom::usage = "PseudoRandom is an option of Divonne.
It can take the following values:
False for Sobol quasi-random numbers (default),
True or 0 for Mersenne Twister pseudo-random numbers,
any other integer value n for Ranlux pseudo-random numbers of luxury level n."
:Evaluate: PseudoRandomSeed::usage = "PseudoRandomSeed is an option of Divonne.
It specifies the seed for the pseudo-random number generator."
+:Evaluate: RetainStateFile::usage = "RetainStateFile is an option of Divonne.
+ It determines whether a chosen state file is kept even if the integration terminates normally."
+
:Evaluate: Regions::usage = "Regions is an option of Divonne.
It specifies whether the regions into which the integration region has been cut are returned together with the integration results."
:Evaluate: Region::usage = "Region[ll, ur, res, df] describes a subregion:
ll and ur are multidimensional equivalents of the region's lower left and upper right corner.
res gives the integration results for the region in a list with entries of the form {integral, error, chi-square} for each component of the integrand.
df is the number of degrees of freedom corresponding to the chi-square values in res."
:Evaluate: $Phase::usage = "$Phase is a global variable set by Divonne during the evaluation of the integrand to the integration phase:\n
0 = sampling of the points in xgiven,\n
1 = partitioning phase,\n
2 = main integration phase,\n
3 = refinement phase."
:Evaluate: MapSample::usage = "MapSample is a function used to map the integrand over the points to be sampled."
:Evaluate: Begin["`Divonne`"]
:Begin:
:Function: Divonne
:Pattern: MLDivonne[ndim_, ncomp_,
epsrel_, epsabs_, flags_, seed_,
mineval_, maxeval_,
key1_, key2_, key3_, maxpass_,
border_, maxchisq_, mindeviation_,
- xgiven_, fgiven_, nextra_]
+ xgiven_, fgiven_, nextra_, statefile_]
:Arguments: {ndim, ncomp,
epsrel, epsabs, flags, seed,
mineval, maxeval,
key1, key2, key3, maxpass,
border, maxchisq, mindeviation,
- xgiven, fgiven, nextra}
+ xgiven, fgiven, nextra, statefile}
:ArgumentTypes: {Integer, Integer,
- Real, Real, Integer, Integer,
+ Real64, Real64, Integer, Integer,
Integer, Integer,
Integer, Integer, Integer, Integer,
- Real, Real, Real,
- RealList, RealList, Integer}
+ Real64, Real64, Real64,
+ Real64List, Real64List, Integer, String}
:ReturnType: Manual
:End:
:Evaluate: Attributes[Divonne] = {HoldFirst}
:Evaluate: Options[Divonne] = {PrecisionGoal -> 3, AccuracyGoal -> 12,
MinPoints -> 0, MaxPoints -> 50000,
Key1 -> 47, Key2 -> 1, Key3 -> 1, MaxPass -> 5,
Border -> 0, MaxChisq -> 10, MinDeviation -> .25,
Given -> {}, NExtra -> 0, PeakFinder -> ({}&),
- Verbose -> 1, Final -> All,
+ StateFile -> "", Verbose -> 1, Final -> All,
PseudoRandom -> False, PseudoRandomSeed -> 5489,
- Regions -> False, Compiled -> True}
+ RetainStateFile -> False, Regions -> False, Compiled -> True}
:Evaluate: Divonne[f_, v:{_, _, _}.., opt___Rule] :=
Block[ {ff = HoldForm[f], ndim = Length[{v}], ncomp,
tags, vars, lower, range, jac, tmp, defs, intT, intX,
rel, abs, mineval, maxeval, key1, key2, key3, maxpass, border,
- maxchisq, mindeviation, given, nextra, peakfinder,
- final, verbose, level, seed, regions, compiled,
+ maxchisq, mindeviation, given, nextra, peakfinder, state,
+ final, verbose, level, seed, retain, regions, compiled,
$Phase},
Message[Divonne::optx, #, Divonne]&/@
Complement[First/@ {opt}, tags = First/@ Options[Divonne]];
{rel, abs, mineval, maxeval, key1, key2, key3, maxpass, border,
- maxchisq, mindeviation, given, nextra, peakfinder,
- verbose, final, level, seed, regions, compiled} =
+ maxchisq, mindeviation, given, nextra, peakfinder, state,
+ verbose, final, level, seed, retain, regions, compiled} =
tags /. {opt} /. Options[Divonne];
{vars, lower, range} = Transpose[{v}];
jac = Simplify[Times@@ (range -= lower)];
tmp = Array[tmpvar, ndim];
defs = Simplify[lower + range tmp];
Block[{Set}, define[compiled, tmp, vars, Thread[vars = defs], jac]];
intT = integrandT[f];
intX = integrandX[f];
+ given = Flatten[given];
Block[#,
ncomp = Length[intT@@ RandomReal[1, ndim]];
MLDivonne[ndim, ncomp, 10.^-rel, 10.^-abs,
Min[Max[verbose, 0], 3] +
If[final === Last, 4, 0] +
+ If[TrueQ[retain], 16, 0] +
If[TrueQ[regions], 128, 0] +
If[IntegerQ[level], 256 level, 0],
If[level =!= False && IntegerQ[seed], seed, 0],
mineval, maxeval,
key1, key2, key3, maxpass,
N[border], N[maxchisq], N[mindeviation],
- given, sample[given, 0, intX], nextra]
+ given, sample[given, 0, intX], nextra, state]
]& @ vars
]
:Evaluate: tmpvar[n_] := ToExpression["Cuba`Divonne`t" <> ToString[n]]
:Evaluate: Attributes[foo] = {HoldAll}
:Evaluate: define[True, tmp_, vars_, defs_, jac_] := (
TtoX := TtoX = Compile[tmp, defs];
- integrandT[f_] := Compile[tmp, eval[defs, Chop[f jac]//N],
+ integrandT[f_] := Compile[tmp, eval[defs, N[f jac]],
{{_eval, _Real, 1}}];
- integrandX[f_] := Compile[vars, eval[vars, Chop[f jac]//N],
+ integrandX[f_] := Compile[vars, eval[vars, N[f jac]],
{{_eval, _Real, 1}}] )
:Evaluate: define[_, tmp_, vars_, defs_, jac_] := (
TtoX := TtoX = Function[tmp, defs];
- integrandT[f_] := Function[tmp, eval[defs, Chop[f jac]//N]];
- integrandX[f_] := Function[vars, eval[vars, Chop[f jac]//N]] )
+ integrandT[f_] := Function[tmp, eval[defs, N[f jac]]];
+ integrandX[f_] := Function[vars, eval[vars, N[f jac]]] )
:Evaluate: eval[_, f_Real] := {f}
:Evaluate: eval[_, f:{__Real}] := f
:Evaluate: eval[x_, _] := (Message[Divonne::badsample, ff, x]; {})
:Evaluate: sample[x_, p_, i_:intT] := (
$Phase = p;
Check[Flatten @ MapSample[i@@ # &, Partition[x, ndim]], {}] )
-:Evaluate: MapSample = Map
+:Evaluate: ValueQ[MapSample] || (MapSample = Map)
:Evaluate: findpeak[b_, p_] := Check[Join[#, sample[#, p, intX]]& @
N[Flatten[peakfinder@@ MapThread[TtoX, Partition[b, 2]]]], {}]
-:Evaluate: region[ll_, ur_, r___] := Region[TtoX@@ ll, TtoX@@ ur, r]
+:Evaluate: region[bounds_, r___] := Region[##, r]&@@
+ MapThread[TtoX, Partition[bounds, 2]]
:Evaluate: Divonne::badsample = "`` is not a real-valued function at ``."
:Evaluate: Divonne::baddim = "Cannot integrate in `` dimensions."
:Evaluate: Divonne::badcomp = "Cannot integrate `` components."
:Evaluate: Divonne::accuracy =
"Desired accuracy was not reached within `` integrand evaluations on `` subregions.
Estimate that MaxPoints needs to be increased by `` for this accuracy."
:Evaluate: Divonne::success = "Needed `` integrand evaluations on `` subregions."
:Evaluate: End[]
:Evaluate: EndPackage[]
/*
Divonne.tm
Multidimensional integration by partitioning
originally by J.H. Friedman and M.H. Wright
(CERNLIB subroutine D151)
this version by Thomas Hahn
- last modified 20 Jun 11 th
+ last modified 13 Mar 15 th
*/
+#define DIVONNE
+#define ROUTINE "Divonne"
+
#include "mathlink.h"
#include "decl.h"
+#include "MSample.c"
/*********************************************************************/
static void Status(MLCONST char *msg, cint n1, cint n2, cint n3)
{
MLPutFunction(stdlink, "CompoundExpression", 2);
MLPutFunction(stdlink, "Message", 4);
MLPutFunction(stdlink, "MessageName", 2);
MLPutSymbol(stdlink, "Divonne");
MLPutString(stdlink, msg);
MLPutInteger(stdlink, n1);
MLPutInteger(stdlink, n2);
MLPutInteger(stdlink, n3);
}
/*********************************************************************/
-static void Print(MLCONST char *s)
-{
- int pkt;
-
- MLPutFunction(stdlink, "EvaluatePacket", 1);
- MLPutFunction(stdlink, "Print", 1);
- MLPutString(stdlink, s);
- MLEndPacket(stdlink);
-
- do {
- pkt = MLNextPacket(stdlink);
- MLNewPacket(stdlink);
- } while( pkt != RETURNPKT );
-}
-
-/*********************************************************************/
-
-static void DoSample(This *t, cnumber n, ccount ldx, real *x, real *f)
-{
- int pkt;
- real *mma_f;
- long mma_n;
-
- if( MLAbort ) longjmp(t->abort, -99);
-
- MLPutFunction(stdlink, "EvaluatePacket", 1);
- MLPutFunction(stdlink, "Cuba`Divonne`sample", 2);
- MLPutRealList(stdlink, x, n*t->ndim);
- MLPutInteger(stdlink, t->phase);
- MLEndPacket(stdlink);
-
- while( (pkt = MLNextPacket(stdlink)) && (pkt != RETURNPKT) )
- MLNewPacket(stdlink);
-
- if( !MLGetRealList(stdlink, &mma_f, &mma_n) ) {
- MLClearError(stdlink);
- MLNewPacket(stdlink);
- longjmp(t->abort, -99);
- }
-
- if( mma_n != n*t->ncomp ) {
- MLDisownRealList(stdlink, mma_f, mma_n);
- longjmp(t->abort, -3);
- }
-
- t->neval += n;
-
- Copy(f, mma_f, n*t->ncomp);
- MLDisownRealList(stdlink, mma_f, mma_n);
-}
-
-/*********************************************************************/
-
-static count SampleExtra(This *t, cBounds *b)
-{
- int pkt;
- count n, nget;
- real *mma_f;
- long mma_n;
-
- MLPutFunction(stdlink, "EvaluatePacket", 1);
- MLPutFunction(stdlink, "Cuba`Divonne`findpeak", 2);
- MLPutRealList(stdlink, (real *)b, 2*t->ndim);
- MLPutInteger(stdlink, t->phase);
- MLEndPacket(stdlink);
-
- while( (pkt = MLNextPacket(stdlink)) && (pkt != RETURNPKT) )
- MLNewPacket(stdlink);
-
- if( !MLGetRealList(stdlink, &mma_f, &mma_n) ) {
- MLClearError(stdlink);
- MLNewPacket(stdlink);
- longjmp(t->abort, -99);
- }
-
- t->neval += nget = mma_n/(t->ndim + t->ncomp);
-
- n = IMin(nget, t->nextra);
- if( n ) {
- Copy(t->xextra, mma_f, n*t->ndim);
- Copy(t->fextra, mma_f + nget*t->ndim, n*t->ncomp);
- }
-
- MLDisownRealList(stdlink, mma_f, mma_n);
-
- return n;
-}
-
-/*********************************************************************/
-
-#include "common.c"
-
static inline void DoIntegrate(This *t)
{
real integral[NCOMP], error[NCOMP], prob[NCOMP];
cint fail = Integrate(t, integral, error, prob);
if( fail < 0 ) {
switch( fail ) {
case -99:
MLPutFunction(stdlink, "Abort", 0);
return;
case -1:
Status("baddim", t->ndim, 0, 0);
break;
case -2:
Status("badcomp", t->ncomp, 0, 0);
break;
}
MLPutSymbol(stdlink, "$Failed");
}
else {
Status(fail ? "accuracy" : "success", t->neval, t->nregions, fail);
MLPutFunction(stdlink, "Thread", 1);
MLPutFunction(stdlink, "List", 3);
- MLPutRealList(stdlink, integral, t->ncomp);
- MLPutRealList(stdlink, error, t->ncomp);
- MLPutRealList(stdlink, prob, t->ncomp);
+ MLPutRealxList(stdlink, integral, t->ncomp);
+ MLPutRealxList(stdlink, error, t->ncomp);
+ MLPutRealxList(stdlink, prob, t->ncomp);
}
}
/*********************************************************************/
void Divonne(cint ndim, cint ncomp,
creal epsrel, creal epsabs,
cint flags, cint seed,
cnumber mineval, cnumber maxeval,
cint key1, cint key2, cint key3, cint maxpass,
creal border, creal maxchisq, creal mindeviation,
- real *xgiven, clong nxgiven, real *fgiven, clong nfgiven,
- cnumber nextra)
+ real *xgiven, cint nxgiven, real *fgiven, cint nfgiven,
+ cnumber nextra, cchar *statefile)
{
This t;
t.ldxgiven = t.ndim = ndim;
t.ncomp = ncomp;
t.epsrel = epsrel;
t.epsabs = epsabs;
t.flags = flags;
t.seed = seed;
t.mineval = mineval;
t.maxeval = maxeval;
t.key1 = key1;
t.key2 = key2;
t.key3 = key3;
t.maxpass = maxpass;
t.border.upper = 1 - (t.border.lower = border);
t.maxchisq = maxchisq;
t.mindeviation = mindeviation;
- t.xgiven = NULL;
+ t.ngiven = nxgiven/ndim;
+ t.xgiven = xgiven;
+ t.fgiven = fgiven;
t.nextra = nextra;
- t.nregions = 0;
- t.neval = t.ngiven = nxgiven/ndim;
-
- if( t.ngiven | t.nextra ) {
- cnumber nx = nxgiven + nextra*t.ndim;
- cnumber nf = nfgiven + nextra*t.ncomp;
-
- Alloc(t.xgiven, nx + nf);
- t.xextra = t.xgiven + nxgiven;
- t.fgiven = t.xgiven + nx;
- t.fextra = t.fgiven + nfgiven;
-
- Copy(t.xgiven, xgiven, nxgiven);
- Copy(t.fgiven, fgiven, nfgiven);
- }
+ t.statefile = statefile;
DoIntegrate(&t);
- free(t.xgiven);
MLEndPacket(stdlink);
}
/*********************************************************************/
int main(int argc, char **argv)
{
return MLMain(argc, argv);
}
Index: trunk/cuba/src/divonne/KorobovCoeff.c-9689
===================================================================
--- trunk/cuba/src/divonne/KorobovCoeff.c-9689 (revision 0)
+++ trunk/cuba/src/divonne/KorobovCoeff.c-9689 (revision 159)
@@ -0,0 +1,881 @@
+#define KOROBOV_MINDIM 2
+#define KOROBOV_MAXDIM 33
+#define MAXPRIME 9689
+
+#define Hash(x) ((19945 - x)*(-47 + x))/121634
+
+static int prime[] = {
+ FIRST,47,53,59,67,71,79,83,89,97,103,109,113,127,131,137,139,149,151,
+ 157,163,173,179,181,191,193,199,211,223,227,229,233,239,241,251,257,263,
+ 269,277,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,
+ 389,397,401,409,419,421,431,433,439,443,449,457,461,467,479,487,491,499,
+ 503,509,521,523,541,547,557,563,569,571,577,587,593,599,601,607,613,617,
+ 619,631,641,643,647,653,659,661,673,677,683,691,701,709,719,727,733,739,
+ 743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,857,859,
+ 863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,
+ 997,1009,1013,1019,1021,1031,1033,1039,1049,1051,1061,1063,1069,1087,
+ 1091,1093,1097,1103,1109,1117,1123,1129,1151,1153,1163,1171,1181,1187,
+ 1193,1201,1213,1217,1223,1229,1231,1237,1249,1259,1277,1279,1283,1289,
+ 1291,1297,1301,1303,1307,1319,1321,1327,1361,1367,1373,1381,1399,1409,
+ 1423,1427,1429,1433,1439,1447,1451,1453,1459,1471,1481,1483,1487,1489,
+ 1493,1499,1511,1523,1531,1543,1549,1553,1559,1567,1571,1579,1583,1597,
+ 1601,1607,1609,1613,1619,1621,1627,1637,1657,1663,1667,1669,1693,1697,
+ 1699,1709,1721,1723,1733,1741,1747,1753,1759,1777,1783,1787,1789,1801,
+ 1811,1823,1831,1847,1861,1867,1871,1873,1877,1879,1889,1901,1907,1913,
+ 1931,1933,1949,1951,1973,1979,1987,1993,1997,1999,2003,2011,2017,2027,
+ 2029,2039,2053,2063,2069,2081,2083,2087,2089,2099,2111,2113,2129,2131,
+ 2137,2141,2143,2153,2161,2179,2203,2207,2213,2221,2237,2239,2243,2251,
+ 2267,2269,2273,2281,2287,2293,2297,2309,2311,2333,2339,2341,2347,2351,
+ 2357,2371,2377,2381,2383,2389,2393,2399,2411,2417,2423,2437,2441,2447,
+ 2459,2467,2473,2477,2503,2521,2531,2539,2543,2549,2551,2557,2579,2591,
+ 2593,2609,2617,2621,2633,2647,2657,2659,2663,2671,2677,2683,2687,2689,
+ 2693,2699,2707,2711,2713,2719,2729,2731,2741,2749,2753,2767,2777,2789,
+ 2791,2797,2801,2803,2819,2833,2837,2843,2851,2857,2861,2879,2887,2897,
+ 2903,2909,2917,2927,2939,2953,2957,2963,2969,2971,2999,3001,3011,3019,
+ 3023,3037,3041,3049,3061,3067,3079,3083,3089,3109,3119,3121,3137,3163,
+ 3167,3169,3181,3187,3191,3203,3209,3217,3221,3229,3251,3253,3257,3259,
+ 3271,3299,3301,3307,3313,3319,3323,3329,3331,3343,3347,3359,3361,3371,
+ 3373,3389,3391,3407,3413,3433,3449,3457,3461,3463,3467,3469,3491,3499,
+ 3511,3517,3527,3529,3533,3539,3547,3557,3571,3581,3583,3593,3607,3613,
+ 3623,3631,3643,3659,3671,3673,3677,3691,3701,3709,3719,3733,3739,3761,
+ 3767,3769,3779,3793,3797,3803,3821,3833,3847,3851,3853,3863,3877,3889,
+ 3907,3911,3917,3929,3943,3947,3967,3989,4001,4003,4007,4013,4019,4027,
+ 4049,4051,4057,4073,4079,4091,4099,4111,4127,4133,4139,4153,4159,4177,
+ 4201,4211,4217,4219,4229,4231,4243,4259,4271,4283,4289,4297,4327,4337,
+ 4339,4349,4357,4363,4373,4391,4397,4409,4421,4423,4441,4451,4463,4481,
+ 4483,4493,4507,4517,4523,4547,4549,4561,4567,4583,4597,4603,4621,4637,
+ 4639,4651,4663,4673,4691,4703,4721,4723,4733,4751,4759,4783,4787,4789,
+ 4801,4813,4831,4861,4871,4877,4889,4903,4909,4919,4931,4933,4943,4957,
+ 4969,4987,4993,5003,5021,5023,5039,5051,5059,5077,5087,5101,5119,5147,
+ 5153,5167,5171,5179,5189,5209,5227,5231,5237,5261,5273,5281,5297,5309,
+ 5323,5333,5347,5351,5381,5387,5399,5413,5431,5437,5449,5471,5479,5501,
+ 5507,5519,5531,5557,5563,5573,5591,5623,5639,5641,5647,5657,5669,5683,
+ 5701,5711,5737,5743,5749,5779,5783,5801,5813,5827,5843,5857,5869,5881,
+ 5903,5923,5927,5953,5981,5987,6007,6011,6029,6037,6053,6067,6089,6101,
+ 6113,6131,6151,6163,6173,6197,6211,6229,6247,6257,6277,6287,6311,6323,
+ 6343,6359,6373,6389,6421,6427,6449,6469,6481,6491,6521,6529,6547,6563,
+ 6581,6599,6619,6637,6653,6673,6691,6709,6733,6737,6763,6781,6803,6823,
+ 6841,6863,6883,6899,6917,6947,6961,6983,7001,7019,7043,7057,7079,7103,
+ 7127,7151,7159,7187,7211,7229,7253,7283,7297,7321,7349,7369,7393,7417,
+ 7433,7459,7487,7507,7537,7561,7583,7607,7639,7669,7687,7717,7741,7759,
+ 7793,7823,7853,7883,7907,7937,7963,7993,8039,8059,8093,8123,8161,8191,
+ 8221,8263,8297,8329,8369,8419,8447,8501,8527,8563,8609,8663,8699,8747,
+ 8803,8849,8893,8963,9029,9091,9157,9239,9319,9413,9533,MarkLast(9689)
+};
+
+static short coeff[][32] = {
+ {13,11,10,3,9,2,2,2,2,9,2,2,7,2,2,2,2,2,2,6,2,2,2,13,11,10,3,9,2,2,2,2},
+ {23,17,12,11,14,14,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,12,12,12,14,14,14},
+ {18,14,5,14,2,2,19,19,25,25,18,18,18,2,2,2,2,2,2,2,2,2,2,2,25,6,2,2,2,18,14,5},
+ {18,13,23,5,2,12,6,12,12,12,10,10,16,2,16,16,2,2,2,2,2,2,2,10,2,2,2,2,10,2,2,2},
+ {21,22,7,21,2,20,20,2,2,2,2,22,2,2,2,2,2,2,2,6,6,21,2,2,2,2,2,2,2,2,6,6},
+ {29,19,27,32,6,8,2,2,2,2,2,8,8,2,2,2,2,9,9,9,9,2,2,2,2,2,2,2,9,9,2,2},
+ {30,19,24,16,22,8,2,2,22,5,9,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {34,28,13,28,27,27,2,4,2,2,2,16,16,4,20,20,36,20,36,5,5,5,36,36,5,5,5,7,5,7,7,2},
+ {35,19,33,8,21,30,8,2,4,2,4,4,2,2,2,2,2,2,2,2,2,17,2,2,11,25,11,17,17,17,17,17},
+ {37,21,35,29,27,19,19,2,2,2,5,15,2,2,15,15,19,19,19,19,19,2,2,2,2,2,19,2,2,2,2,2},
+ {45,44,13,25,17,47,30,2,30,2,2,2,2,2,2,2,2,2,19,19,19,17,17,2,2,2,2,2,2,2,2,2},
+ {35,22,37,9,35,12,35,8,2,2,50,50,2,2,32,32,32,31,13,8,8,8,2,22,50,9,9,9,22,22,22,10},
+ {29,24,43,36,49,2,2,8,4,25,49,25,2,2,8,10,10,10,5,5,5,40,10,33,40,40,2,27,10,25,25,25},
+ {50,18,32,39,21,2,2,2,4,4,36,36,14,14,14,14,2,2,2,17,17,17,16,16,2,14,14,14,14,2,2,2},
+ {31,28,45,20,18,43,43,13,28,2,2,2,31,31,31,31,31,2,2,2,43,43,2,2,2,2,2,2,2,2,30,2},
+ {39,15,41,7,24,2,2,30,40,2,2,25,25,25,25,2,2,2,2,2,2,6,6,2,25,2,5,2,2,25,2,2},
+ {44,20,29,39,7,21,21,21,2,2,45,2,2,2,49,49,49,49,49,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {56,20,22,13,18,35,35,6,2,4,2,4,2,2,2,23,16,16,4,23,2,34,52,2,34,2,4,2,2,2,23,16},
+ {46,32,17,18,29,27,31,31,31,2,2,4,15,2,2,2,2,2,2,2,2,2,2,2,2,2,23,32,32,32,15,15},
+ {62,42,43,17,23,13,13,2,2,13,2,2,2,2,2,2,2,10,2,2,2,2,9,10,2,2,2,19,9,9,9,9},
+ {64,34,16,28,16,51,47,2,2,2,6,18,39,39,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,12,12,2},
+ {74,26,44,25,50,24,54,39,58,42,2,42,42,2,2,2,2,2,2,2,2,33,33,2,2,39,11,2,2,58,39,58},
+ {70,22,50,22,16,9,25,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {74,21,17,25,35,33,10,2,10,20,20,57,57,57,2,2,57,2,2,2,2,2,2,2,13,2,2,2,2,2,2,2},
+ {81,18,10,11,47,38,71,37,2,37,2,2,2,2,2,26,26,26,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {55,30,85,42,16,36,45,67,2,2,68,2,2,2,2,2,2,2,68,10,2,2,2,2,2,2,2,2,2,2,2,2},
+ {64,17,24,26,49,12,10,39,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,59,2,2},
+ {68,57,23,38,61,38,13,13,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2,68,15,2,44,44,44,2,2,2},
+ {94,28,58,29,13,5,15,8,66,2,2,2,39,39,15,66,2,2,6,6,2,2,66,66,66,66,2,2,2,2,2,66},
+ {94,85,9,41,41,37,29,29,17,2,2,2,7,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,8,8},
+ {89,32,75,77,77,13,2,30,30,2,2,2,2,2,2,2,2,2,2,67,67,2,2,2,2,2,2,2,2,8,19,32},
+ {70,45,58,63,67,10,72,72,70,6,2,36,2,70,70,6,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {101,33,76,13,45,63,2,2,6,19,2,2,32,32,32,32,32,65,2,63,63,11,11,11,19,19,19,19,9,63,63,63},
+ {70,89,44,37,19,45,2,2,2,8,10,8,54,54,80,80,80,80,80,2,116,2,116,2,2,80,40,51,100,100,8,2},
+ {71,54,83,51,42,98,2,2,8,8,14,30,93,22,15,15,30,30,30,44,44,44,2,2,22,22,22,117,44,11,11,11},
+ {109,37,51,113,17,10,2,2,17,17,55,2,55,55,55,55,55,55,2,2,2,57,48,48,55,55,2,2,55,2,2,55},
+ {75,38,68,89,11,52,2,2,81,39,2,38,2,2,2,2,2,2,2,2,2,2,2,19,2,2,2,2,2,2,2,2},
+ {81,84,35,34,20,93,2,12,12,12,2,96,2,96,96,2,96,2,2,2,2,2,2,2,2,2,2,2,2,56,56,56},
+ {104,32,56,46,77,11,35,35,24,56,19,2,2,2,78,2,2,75,2,2,2,2,78,2,2,2,2,2,2,2,2,2},
+ {81,103,25,35,28,15,20,20,20,2,2,2,2,20,20,20,107,107,2,2,2,2,2,2,2,2,2,2,2,2,13,13},
+ {119,75,42,29,74,23,54,36,39,2,2,4,4,19,19,2,2,2,2,2,2,2,2,54,2,2,2,2,2,2,2,54},
+ {115,73,22,102,75,138,16,73,50,16,2,50,2,2,2,133,2,2,2,2,2,2,2,2,2,2,2,2,2,33,33,33},
+ {119,48,66,51,14,22,20,20,2,2,2,2,2,60,2,2,2,2,2,2,2,2,60,2,2,2,2,2,2,60,2,65},
+ {121,94,80,29,51,69,42,36,14,14,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,17,2,2},
+ {129,123,41,79,43,34,24,11,2,2,4,2,2,2,2,75,16,16,16,75,75,75,16,16,16,25,2,99,2,2,75,16},
+ {128,33,35,68,22,8,62,94,2,2,2,62,62,2,98,2,2,4,98,2,2,32,81,32,32,32,98,98,98,98,98,98},
+ {101,109,154,15,57,6,27,36,2,2,37,37,2,2,2,2,2,2,2,107,2,2,2,107,107,2,2,2,2,2,2,2},
+ {106,40,24,38,61,118,106,106,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {149,111,58,79,127,13,41,33,27,16,30,2,61,2,72,2,2,2,2,2,2,2,2,2,2,2,2,75,75,2,2,2},
+ {105,92,43,156,25,53,57,115,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {99,40,62,67,66,29,99,99,99,78,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,79},
+ {109,42,96,95,66,41,103,84,13,103,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {111,72,16,89,25,86,117,29,14,14,2,2,2,2,2,60,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {106,72,49,94,140,44,97,157,75,2,2,4,123,123,2,2,123,123,123,123,2,2,2,2,2,2,2,2,2,2,2,2},
+ {115,67,74,32,43,50,21,36,135,36,85,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {151,71,157,42,41,37,80,27,18,2,2,2,2,2,2,2,2,2,2,2,2,2,115,128,128,128,128,128,32,2,128,80},
+ {119,91,38,30,92,44,32,76,22,2,34,2,2,2,2,2,2,2,2,2,2,2,2,2,2,129,2,2,129,2,2,2},
+ {121,126,31,52,120,37,57,10,171,2,2,2,2,35,35,35,2,2,97,97,97,97,97,97,97,35,35,35,97,97,97,2},
+ {155,86,49,104,87,94,64,45,61,91,91,91,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {164,121,44,166,47,33,7,15,13,2,2,122,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {128,120,133,17,71,52,25,107,42,21,21,2,2,2,2,4,4,96,2,9,9,2,9,94,94,94,94,94,94,94,94,96},
+ {179,82,157,76,61,35,13,90,197,2,69,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,39,39},
+ {136,136,148,63,66,10,169,95,95,163,30,28,28,2,41,130,2,2,2,21,2,2,2,2,2,2,2,2,2,2,2,36},
+ {131,40,112,63,55,30,53,79,79,79,2,79,2,2,2,2,2,79,2,2,2,2,14,36,2,21,21,21,21,2,2,91},
+ {165,81,92,48,9,110,12,40,40,34,2,2,2,107,107,107,2,107,2,2,2,2,2,2,2,2,2,2,2,15,41,41},
+ {169,66,170,97,35,56,55,86,32,32,2,2,2,2,14,2,40,2,37,2,2,37,40,40,40,2,2,2,37,37,37,37},
+ {135,63,126,156,70,18,49,143,6,117,2,109,109,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {193,59,51,68,68,15,170,170,170,143,143,12,2,2,2,63,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {145,101,56,65,23,76,110,2,4,4,4,146,146,146,2,146,2,2,2,2,2,2,2,2,2,2,2,2,2,2,146,146},
+ {144,129,26,98,36,46,47,52,52,52,82,2,2,2,2,2,17,2,2,2,2,2,2,2,2,2,2,2,2,91,2,2},
+ {145,78,166,171,56,20,63,2,2,33,33,33,33,2,78,47,47,47,47,47,2,2,2,2,2,78,78,78,2,2,2,2},
+ {191,69,176,54,47,75,167,2,2,2,188,188,188,30,30,2,67,67,117,2,117,117,117,2,2,36,2,2,2,2,2,2},
+ {186,96,29,122,47,96,170,157,157,157,157,108,159,2,195,195,26,26,26,26,26,2,2,2,2,132,132,132,2,2,2,2},
+ {151,118,226,91,54,49,33,2,2,2,2,4,4,4,143,143,2,2,143,25,25,25,2,143,143,143,143,143,143,143,143,143},
+ {144,91,237,82,81,75,138,163,163,163,117,117,44,2,44,136,136,136,136,2,2,2,2,2,122,122,122,122,2,2,2,136},
+ {189,78,178,64,118,27,189,2,2,67,67,110,110,110,110,2,28,28,2,2,2,2,2,2,2,102,2,2,2,2,2,2},
+ {165,202,83,76,125,65,42,2,44,44,23,2,23,23,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {209,204,92,75,85,146,104,2,7,18,8,2,2,2,204,95,95,95,2,2,2,95,95,95,95,95,95,95,2,2,2,95},
+ {169,68,89,16,193,82,33,262,262,175,148,148,148,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {171,162,78,43,61,17,112,10,171,182,118,33,2,2,2,2,118,2,2,2,2,2,2,151,2,2,2,2,2,2,2,2},
+ {211,121,119,55,90,211,96,89,225,25,178,36,36,36,2,2,108,2,2,2,2,2,2,2,2,2,2,2,2,184,2,2},
+ {154,101,83,17,16,210,41,79,70,158,2,27,27,2,2,2,2,2,2,2,2,2,2,2,2,153,2,2,2,2,2,2},
+ {169,179,130,79,148,180,136,17,47,119,2,119,119,169,169,2,169,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {241,171,148,31,172,34,66,60,156,140,2,2,2,75,75,2,2,2,2,2,2,2,190,190,2,2,2,30,2,2,2,2},
+ {229,189,183,106,118,138,82,149,265,39,2,2,265,2,2,2,2,2,2,130,2,2,2,71,71,2,2,2,71,2,2,71},
+ {165,157,127,21,64,15,80,130,130,130,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,74,2},
+ {221,130,203,84,83,83,29,121,54,54,2,141,2,2,94,94,94,4,4,4,2,4,2,2,2,54,54,108,16,16,94,52},
+ {230,166,20,160,121,102,153,94,16,67,2,2,2,2,2,2,97,97,97,2,2,97,97,2,97,97,97,97,97,97,97,97},
+ {181,79,137,119,139,24,77,17,50,25,25,25,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {239,242,192,40,41,62,124,193,193,31,193,2,2,2,2,2,2,2,2,2,2,2,2,148,2,2,2,2,2,2,2,2},
+ {239,178,73,122,239,51,95,48,78,88,78,2,2,2,2,2,2,2,2,2,2,2,144,144,2,2,144,144,144,2,144,144},
+ {234,117,198,34,143,21,74,6,252,252,98,2,2,2,2,197,38,2,2,2,2,2,47,2,47,47,47,47,2,2,2,47},
+ {179,110,38,28,58,39,16,29,42,125,202,8,8,129,4,4,2,2,2,67,67,2,2,2,2,2,2,8,67,67,2,2},
+ {246,53,189,50,18,59,179,179,7,137,137,2,2,103,103,103,103,40,40,40,2,2,2,2,73,73,73,2,103,103,103,103},
+ {239,133,87,92,193,12,206,238,238,238,31,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {191,244,60,193,18,32,193,104,74,125,125,66,2,2,2,2,2,2,2,2,2,2,125,125,2,125,125,125,2,2,2,2},
+ {177,74,90,91,172,219,63,84,32,2,2,196,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {253,143,54,39,122,32,75,107,234,2,6,6,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {282,89,71,88,30,23,81,105,105,2,2,105,105,131,107,2,2,2,2,2,195,195,2,2,29,29,21,21,128,195,195,195},
+ {259,115,171,40,156,71,67,24,24,2,2,2,24,4,4,4,2,234,2,2,2,2,2,2,2,2,2,74,74,2,2,2},
+ {264,237,49,203,247,108,75,75,75,2,2,32,16,8,16,16,16,164,14,164,2,2,32,16,8,16,16,32,42,42,42,2},
+ {264,106,89,51,29,226,23,286,286,151,151,151,151,151,2,2,2,2,2,2,31,31,31,2,2,2,2,2,2,2,2,284},
+ {194,215,82,23,213,23,108,127,74,2,201,32,178,2,285,2,2,2,2,285,2,2,2,2,2,2,2,2,2,2,2,2},
+ {196,267,251,111,231,14,30,52,95,2,154,53,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {266,67,22,101,102,157,53,95,130,2,42,76,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {281,205,107,178,236,122,122,316,76,215,215,2,60,2,2,2,2,2,2,227,2,2,2,2,2,2,2,2,27,2,2,2},
+ {271,89,65,195,132,162,102,45,56,174,104,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {200,169,170,121,155,68,131,167,78,113,113,2,2,64,2,2,2,2,2,2,2,2,2,2,2,2,2,173,2,2,2,2},
+ {288,143,265,264,71,19,231,169,27,27,27,2,2,2,2,2,2,2,2,2,2,2,2,2,51,2,2,2,2,2,2,2},
+ {311,141,96,173,90,119,134,151,35,252,39,2,39,39,2,2,2,2,2,2,2,2,2,113,113,2,2,2,2,2,2,113},
+ {311,230,52,138,225,346,162,216,216,91,160,182,91,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {275,167,128,244,184,184,44,210,237,139,139,139,139,2,2,2,2,2,2,2,2,2,2,73,2,2,2,2,2,2,2,2},
+ {176,156,83,135,46,197,108,63,33,33,33,2,133,2,213,213,213,213,133,133,2,133,2,2,133,133,2,2,2,2,2,2},
+ {283,125,141,192,89,181,106,208,124,124,2,112,112,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {289,191,171,152,191,173,54,13,21,56,56,56,2,2,2,2,2,2,2,2,2,220,2,2,2,2,2,2,2,2,2,2},
+ {334,305,132,132,99,126,54,116,164,105,2,105,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,287,2,2,2,2},
+ {240,166,44,193,153,333,15,99,246,99,2,2,99,99,2,2,2,2,195,195,195,2,195,195,2,263,263,2,195,195,195,263},
+ {246,194,265,79,225,65,24,62,46,181,2,2,2,314,2,2,2,2,2,2,2,215,2,2,2,2,2,2,2,2,2,2},
+ {229,334,285,302,21,26,24,97,64,40,2,2,2,231,231,231,231,65,2,148,2,2,2,2,2,2,2,2,2,2,2,2},
+ {251,295,55,249,135,173,164,78,261,261,2,2,2,2,114,2,2,2,2,2,256,142,142,2,2,2,2,2,2,2,2,185},
+ {232,153,55,60,181,79,107,70,29,35,2,2,58,58,2,58,2,2,2,2,61,61,2,61,61,2,2,61,61,90,2,90},
+ {246,116,45,146,109,90,32,103,133,119,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {246,113,146,232,162,262,204,47,45,331,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {360,150,84,275,13,26,368,49,244,244,63,63,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {239,295,174,87,30,87,85,36,103,36,2,278,2,2,2,2,2,2,163,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {356,300,75,310,123,301,200,107,183,37,218,37,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {358,207,168,150,150,21,156,50,195,275,275,275,2,2,2,2,2,251,2,2,2,251,251,251,251,251,251,251,251,251,2,2},
+ {322,194,234,62,236,147,239,400,255,255,80,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {326,276,134,100,143,113,115,221,13,339,194,194,194,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {337,132,27,45,14,81,110,84,238,224,211,2,29,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {192,213,113,174,403,117,342,342,311,35,35,2,2,2,2,2,2,2,2,101,2,2,2,2,2,2,2,2,2,101,101,101},
+ {264,273,316,53,40,330,51,285,115,219,147,2,2,2,335,2,2,2,2,2,173,2,173,2,2,173,173,173,173,173,173,83},
+ {254,293,407,118,54,296,160,231,4,4,93,2,2,2,2,2,60,61,2,2,120,127,127,127,88,88,88,88,88,88,88,88},
+ {341,78,336,263,281,164,99,334,296,114,109,2,163,163,163,163,2,2,2,2,2,2,2,125,125,292,292,292,292,125,125,125},
+ {355,87,212,100,89,210,133,344,120,45,45,138,138,138,138,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {274,141,46,219,158,284,38,79,73,185,35,6,81,2,2,2,2,53,2,2,81,81,2,81,2,2,2,53,53,53,53,53},
+ {349,303,439,19,95,240,174,191,2,162,162,2,2,2,76,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {360,91,201,205,67,181,59,77,2,44,103,103,103,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,125},
+ {283,154,261,91,77,147,227,105,116,311,256,256,2,116,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,32,2},
+ {287,288,111,89,249,370,55,16,248,67,67,115,2,2,134,134,2,2,2,2,2,2,2,2,2,2,2,2,2,22,22,22},
+ {284,270,282,37,29,181,160,49,285,285,374,250,2,374,374,2,2,2,179,179,35,2,179,179,2,179,179,2,2,285,285,285},
+ {359,305,52,36,243,231,7,92,2,68,68,307,62,45,2,2,112,311,311,311,2,2,2,2,2,2,2,2,2,2,2,2},
+ {288,119,218,137,364,38,27,380,2,2,211,23,33,2,2,2,2,2,225,225,225,2,2,225,225,225,2,2,2,2,2,2},
+ {277,155,232,309,370,365,348,75,214,214,214,4,4,2,2,2,210,210,210,210,210,210,210,2,2,2,2,2,2,2,2,2},
+ {292,204,91,41,124,190,107,322,125,125,125,125,125,25,25,62,2,2,146,146,2,2,62,146,2,146,114,146,114,2,2,2},
+ {282,195,192,409,68,99,253,106,2,2,2,231,55,55,2,323,323,55,55,285,285,285,285,2,2,2,2,2,2,285,285,323},
+ {299,122,174,403,113,77,63,275,2,2,2,138,276,227,38,227,2,237,2,2,2,2,2,2,2,2,2,2,352,352,352,2},
+ {282,222,268,86,21,109,353,408,2,2,2,2,135,12,12,216,241,241,241,241,241,241,241,241,241,303,303,303,135,135,135,2},
+ {374,94,89,257,137,246,186,196,2,2,2,2,2,454,122,122,122,122,2,2,2,28,28,94,94,94,94,94,122,122,122,122},
+ {288,92,62,428,122,153,481,66,2,2,2,250,250,177,177,177,177,279,279,279,279,279,279,279,2,2,279,177,177,177,177,177},
+ {288,370,141,284,207,192,450,67,2,2,2,183,217,217,217,183,183,167,202,202,202,202,167,167,2,2,2,164,164,80,167,167},
+ {286,293,199,39,158,332,242,103,2,2,2,408,266,315,2,2,365,253,315,315,315,315,315,2,2,315,2,2,2,2,2,2},
+ {407,83,435,187,40,16,52,65,2,2,244,39,77,119,119,2,2,2,119,342,342,2,2,2,2,2,342,2,2,58,58,119},
+ {398,88,78,57,260,203,203,43,131,131,131,204,204,322,204,2,102,2,325,325,325,325,2,2,2,2,2,2,2,2,2,2},
+ {390,174,70,155,163,67,225,49,2,34,34,151,151,2,2,111,2,2,111,111,2,2,2,2,2,2,2,2,2,2,2,2},
+ {393,129,393,169,23,192,168,47,2,2,312,150,71,2,150,2,2,2,61,2,2,61,2,2,2,2,2,2,2,2,2,2},
+ {408,136,71,63,63,159,222,68,181,181,124,227,14,14,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {294,169,79,242,160,123,178,290,186,186,56,399,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {415,228,69,68,193,122,21,362,33,22,362,57,2,2,2,2,46,46,196,196,196,2,196,196,196,2,196,2,2,2,2,2},
+ {415,130,241,185,312,175,309,199,94,281,47,47,2,2,2,2,206,307,221,2,2,2,2,2,239,239,239,239,239,206,206,206},
+ {417,238,147,165,346,19,92,164,266,291,291,43,2,2,2,345,2,2,2,345,345,2,2,2,2,2,345,2,2,2,2,2},
+ {456,192,86,182,35,174,342,102,210,210,210,393,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,256,256,158},
+ {307,255,92,38,325,61,103,246,176,319,80,89,2,241,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {432,168,63,154,166,46,479,145,144,288,288,288,288,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {341,256,113,85,188,233,161,29,110,167,91,91,253,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {311,360,312,158,73,16,106,209,472,48,24,203,203,2,2,2,2,234,234,234,2,234,234,203,2,2,2,234,234,234,234,234},
+ {437,196,161,100,132,246,395,187,35,35,35,2,2,35,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {438,174,338,145,155,276,422,374,4,463,463,99,224,70,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {426,225,211,130,325,283,353,96,282,23,299,2,2,2,63,63,2,276,276,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {430,101,288,38,200,332,325,193,123,123,88,2,2,2,2,2,231,231,139,139,139,139,139,139,139,139,139,139,139,139,139,139},
+ {434,143,308,389,365,363,174,63,121,125,260,2,2,260,260,2,2,2,2,2,2,2,2,2,2,258,2,2,2,258,2,2},
+ {453,123,201,141,229,223,234,494,102,102,102,2,2,102,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,252},
+ {438,168,65,264,304,74,168,88,114,132,187,2,127,127,2,2,2,2,2,81,81,56,2,2,2,307,2,2,2,2,81,81},
+ {324,181,141,129,33,171,173,291,227,373,52,301,301,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {448,119,431,111,135,50,242,95,148,49,49,49,68,2,2,2,2,2,2,2,2,49,2,2,2,2,2,2,2,2,2,2},
+ {335,114,55,47,33,173,287,345,198,198,136,238,238,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {468,377,243,237,332,512,27,167,22,169,14,14,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {456,162,188,223,408,209,28,164,299,299,258,186,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {445,391,115,226,96,456,239,214,556,158,158,282,2,2,2,2,2,2,2,2,2,2,2,2,2,331,2,2,2,2,2,2},
+ {360,397,130,172,407,479,295,13,38,199,199,346,2,2,2,2,2,2,145,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {512,136,129,361,180,61,274,128,422,27,292,165,2,2,2,2,2,2,363,117,117,117,117,2,2,2,2,363,2,2,2,2},
+ {478,433,483,302,200,227,273,27,171,171,371,102,2,2,2,2,2,20,2,2,2,2,2,2,2,2,403,403,2,2,2,2},
+ {485,158,454,86,212,60,93,40,209,188,188,106,2,231,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {390,448,111,145,47,555,367,317,315,52,429,435,429,429,2,2,2,2,2,2,2,2,229,2,2,229,2,2,2,229,2,2},
+ {490,331,187,398,407,373,497,219,423,423,378,378,2,419,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {378,406,112,198,539,550,516,59,240,240,23,316,2,122,2,2,2,2,2,2,2,2,2,2,111,111,2,2,2,95,2,2},
+ {474,373,248,330,40,113,105,273,103,407,2,165,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {495,406,306,239,172,323,236,50,37,435,2,310,56,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {498,447,112,241,552,119,227,189,140,140,140,140,140,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {505,132,169,418,342,28,319,301,172,530,317,317,335,2,2,2,2,2,2,376,2,2,2,2,2,2,2,2,2,2,2,2},
+ {397,393,191,269,462,151,264,134,307,307,2,163,163,2,2,2,2,2,2,2,2,2,2,2,2,2,159,2,2,2,2,2},
+ {485,491,325,149,122,145,228,100,311,64,2,62,137,2,137,2,2,2,2,2,2,2,392,2,2,2,2,2,2,2,2,2},
+ {364,462,360,383,182,187,123,69,129,146,2,156,149,2,149,2,2,2,2,2,2,2,303,303,303,2,2,2,2,2,149,266},
+ {507,195,130,401,363,171,483,20,86,464,2,89,89,2,26,2,2,2,2,2,425,425,2,2,2,2,2,2,2,2,2,2},
+ {380,220,87,122,242,78,207,371,95,305,2,2,2,2,440,440,445,358,358,331,331,358,445,445,445,445,445,445,445,445,445,445},
+ {507,221,247,137,182,90,28,207,325,438,2,2,2,2,2,187,232,438,2,2,68,37,37,37,37,37,37,37,37,37,161,2},
+ {509,265,101,126,203,86,152,416,352,85,2,2,2,284,391,368,2,2,152,2,2,2,325,2,2,2,2,2,2,2,2,2},
+ {572,359,332,480,68,535,59,504,365,21,2,2,246,54,246,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {415,178,178,372,415,400,73,82,348,99,2,23,325,44,2,2,2,2,2,2,2,2,325,2,2,2,2,2,2,2,2,2},
+ {430,275,236,361,42,552,368,236,653,74,65,458,288,307,307,2,2,2,2,2,2,2,65,65,2,2,2,2,2,2,2,2},
+ {434,139,58,437,130,441,188,15,63,145,145,145,300,2,2,2,2,300,2,2,2,2,2,2,2,2,401,401,401,401,401,401},
+ {542,138,266,514,552,202,103,197,574,48,2,96,96,2,2,96,96,217,2,2,2,2,2,2,2,2,2,2,2,2,2,217},
+ {546,494,72,272,550,219,213,209,169,404,69,464,86,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {602,466,332,458,99,244,255,183,446,670,2,186,323,2,2,2,2,2,2,2,2,2,2,2,2,2,2,292,165,165,165,165},
+ {422,413,561,110,242,62,436,478,18,150,606,88,643,2,249,2,2,2,2,456,2,2,2,2,2,2,2,2,2,2,2,456},
+ {522,141,154,253,264,53,120,93,274,52,44,203,556,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {600,249,375,555,421,322,317,84,517,517,268,106,353,2,2,2,2,2,2,2,2,2,268,2,2,2,2,2,2,302,2,2},
+ {555,516,310,438,290,559,52,265,248,193,285,441,285,285,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {555,300,232,386,470,300,355,177,57,407,450,279,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {544,177,79,306,256,402,205,496,398,115,115,43,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {534,274,194,220,575,81,206,544,341,85,137,429,429,429,429,344,2,2,2,2,2,315,315,315,315,315,315,72,72,72,2,2},
+ {400,136,112,136,273,277,205,578,122,122,230,230,2,2,2,2,2,2,2,2,2,2,2,2,2,2,302,2,2,2,2,2},
+ {576,421,115,52,253,373,17,657,43,178,178,58,485,485,485,485,485,485,2,2,2,159,159,159,159,2,619,2,2,2,2,2},
+ {576,301,142,329,96,41,302,528,126,112,206,206,2,2,2,2,2,2,206,206,2,206,206,2,191,206,206,191,191,191,191,206},
+ {548,538,508,250,539,102,73,285,119,433,480,480,2,2,2,480,480,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {622,526,294,56,498,176,237,351,25,26,474,55,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {446,163,469,481,240,278,51,373,491,13,22,419,2,2,2,2,2,2,2,2,2,176,176,2,2,2,2,2,2,2,2,2},
+ {445,223,102,108,120,166,68,214,737,504,96,96,206,377,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,39,39,528},
+ {453,121,489,84,434,505,78,575,468,372,468,468,83,468,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {425,355,128,58,194,82,438,117,10,34,34,35,112,107,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {432,479,328,443,253,634,271,429,406,543,406,543,543,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {433,294,192,205,152,70,99,68,392,169,309,390,390,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,199,2,2,2},
+ {456,383,487,311,57,579,673,264,582,187,184,43,43,2,2,2,2,501,501,501,2,2,2,2,2,2,2,2,2,2,2,2},
+ {437,561,384,619,363,420,614,117,217,247,405,142,142,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {434,372,239,508,478,26,375,255,151,151,650,112,251,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {437,133,516,423,305,90,135,25,266,487,6,286,286,2,2,2,2,2,2,2,2,2,2,2,2,510,510,2,2,2,2,2},
+ {463,341,170,401,178,79,305,98,162,166,32,392,335,335,335,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {610,477,478,516,318,184,267,423,190,494,494,2,336,336,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {611,211,491,224,47,54,124,268,271,271,223,2,2,2,2,2,2,2,2,2,2,2,2,359,2,2,2,2,2,2,2,2},
+ {590,463,461,162,162,622,167,254,29,377,377,75,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {478,388,612,404,491,561,180,80,262,58,94,2,2,275,2,2,2,2,2,151,2,2,2,2,2,312,312,312,2,2,2,275},
+ {629,225,67,623,298,588,354,49,41,185,176,63,63,63,2,2,2,2,2,2,2,2,2,2,2,2,8,435,32,32,435,435},
+ {671,275,392,298,612,328,337,215,58,58,124,2,2,490,392,2,2,2,125,457,457,2,2,2,2,2,2,2,2,2,2,457},
+ {448,126,129,168,209,340,40,96,509,509,509,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {667,246,160,68,737,203,168,628,46,128,358,2,2,2,121,121,2,2,2,2,2,2,560,121,2,2,2,2,2,2,2,121},
+ {635,212,284,356,187,591,275,361,194,317,488,2,2,2,2,2,2,97,6,2,6,247,2,2,2,2,2,2,2,2,2,6},
+ {612,395,104,86,264,321,521,325,252,53,178,100,100,100,16,343,343,343,343,343,2,2,2,2,2,2,2,2,2,343,343,343},
+ {486,428,287,472,292,141,504,178,585,98,282,2,2,2,2,2,2,2,2,2,2,2,2,284,284,284,78,284,2,2,2,2},
+ {612,327,212,565,450,385,201,649,423,491,106,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {462,579,236,447,60,162,427,258,73,742,742,2,742,742,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {495,440,89,439,65,207,459,407,139,131,624,2,380,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {469,507,276,227,66,237,260,386,27,666,31,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {646,393,273,238,24,13,253,127,368,316,316,316,150,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {626,196,111,465,386,431,181,414,614,391,349,318,389,2,389,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {667,257,290,122,109,523,95,26,282,49,374,236,236,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,88,2,2},
+ {653,169,261,533,488,282,213,443,337,480,503,174,534,2,2,2,2,2,534,2,2,2,2,534,2,2,2,2,534,2,2,2},
+ {670,555,160,90,604,604,50,459,376,545,316,180,526,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {639,253,95,380,108,448,223,254,381,30,6,644,6,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {642,160,702,90,157,254,278,521,650,277,74,554,122,2,2,2,2,2,2,517,174,174,174,2,2,2,2,2,2,2,2,2},
+ {678,254,190,197,637,49,130,25,374,357,357,411,643,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,537,2,2},
+ {512,347,65,546,434,87,18,123,672,412,316,6,699,6,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {657,233,108,38,147,53,136,168,408,477,477,279,268,289,2,2,2,2,2,2,289,2,2,2,2,2,2,2,2,289,289,2},
+ {498,431,217,101,78,143,111,113,181,825,458,140,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {660,624,376,472,165,66,158,308,492,779,305,305,2,576,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {521,249,388,155,467,245,134,311,72,312,312,623,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {408,348,216,299,302,668,347,63,172,141,272,168,678,2,2,2,512,2,2,2,2,4,2,2,2,494,64,64,64,128,16,512},
+ {669,421,230,70,212,845,237,347,148,76,823,472,2,2,2,132,2,2,2,2,2,2,2,383,132,383,2,2,383,383,383,383},
+ {693,530,139,82,780,416,270,278,330,484,484,200,2,2,2,2,137,94,2,2,2,2,2,2,2,2,484,2,2,2,2,2},
+ {672,150,164,622,196,75,302,119,42,314,314,132,60,60,60,298,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {705,302,411,705,691,160,809,40,32,867,826,826,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {684,229,138,46,407,399,82,254,267,31,31,45,2,209,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {707,323,409,27,31,157,492,463,886,412,251,251,304,190,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {715,521,636,304,402,459,435,571,611,214,214,43,43,358,2,2,2,2,358,2,2,2,2,2,2,358,358,358,2,2,358,358},
+ {768,224,219,425,467,147,151,643,316,263,263,263,263,263,2,2,2,2,2,272,139,2,2,2,2,2,2,2,2,2,272,53},
+ {555,543,434,78,850,174,277,194,4,100,471,69,69,424,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {690,206,572,877,600,129,288,52,19,147,222,222,147,147,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {793,279,264,566,252,495,872,492,482,107,294,503,350,350,2,2,2,2,2,2,2,285,285,273,273,273,273,2,2,2,2,2},
+ {703,427,225,320,136,47,103,547,239,217,73,68,68,204,204,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {791,275,60,137,352,839,67,476,356,216,216,563,563,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {703,312,472,588,228,512,386,668,477,617,389,389,389,2,296,2,2,2,2,343,343,2,2,343,343,2,2,617,617,617,617,2},
+ {709,509,697,145,252,194,304,192,192,623,623,4,423,2,2,2,199,423,2,2,2,222,222,2,2,623,623,623,623,623,2,222},
+ {587,453,117,107,672,86,248,568,568,294,294,513,78,2,2,164,82,2,2,2,2,22,2,2,2,2,2,2,2,2,2,2},
+ {741,466,378,135,737,131,159,469,59,2,59,59,187,2,204,2,2,2,2,2,2,2,2,2,798,2,2,798,798,798,798,798},
+ {539,310,463,103,553,45,609,326,197,2,62,113,272,2,62,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {750,703,182,242,92,335,272,466,594,2,701,569,474,129,140,140,2,507,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {547,210,113,361,584,121,65,307,98,2,2,552,514,514,2,514,207,514,514,514,2,2,2,2,2,2,2,2,2,2,2,2},
+ {555,229,328,91,272,815,483,749,468,2,92,92,4,92,2,2,2,258,258,258,2,258,258,2,2,2,2,258,2,2,258,258},
+ {580,145,358,434,630,73,604,366,366,2,2,398,398,207,2,207,487,2,2,487,207,2,2,207,207,207,2,2,2,2,207,207},
+ {457,520,93,460,275,525,300,184,354,147,147,147,147,179,82,82,82,82,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {872,630,513,218,719,174,197,104,86,281,281,281,541,642,281,94,2,45,94,2,335,335,2,2,2,2,2,2,2,2,2,84},
+ {765,421,129,298,867,365,222,476,401,142,90,22,22,88,226,657,2,2,477,2,2,2,2,2,226,226,2,226,2,2,2,226},
+ {833,634,228,520,113,329,279,420,581,2,2,385,385,110,450,2,733,2,2,2,561,561,2,561,2,2,2,2,2,2,2,2},
+ {587,553,360,539,227,800,312,143,536,2,2,2,64,64,64,2,2,2,179,179,493,2,2,184,184,184,58,2,2,2,493,493},
+ {744,466,389,280,229,134,363,177,389,2,2,2,536,273,536,536,536,536,168,45,45,45,45,2,2,2,2,2,2,2,2,2},
+ {841,222,158,469,253,91,347,241,766,2,2,2,88,88,88,439,439,439,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {462,653,478,67,269,150,474,711,220,669,669,669,669,669,390,352,325,2,229,545,545,545,545,545,545,545,545,2,545,352,309,352},
+ {468,430,849,689,202,427,45,34,105,2,2,2,2,4,4,4,4,4,4,4,2,2,2,4,4,4,4,4,2,2,2,2},
+ {610,289,503,744,775,512,605,454,484,2,2,2,444,466,145,631,2,631,631,631,631,631,631,631,631,631,2,2,631,631,631,858},
+ {792,169,306,843,246,123,293,229,483,2,2,2,165,163,163,163,163,440,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {563,325,717,766,440,705,290,123,228,2,2,2,32,64,146,2,2,2,116,79,79,2,146,146,79,79,79,2,2,146,146,79},
+ {795,185,350,211,82,537,106,680,62,2,2,537,423,423,423,2,2,501,501,2,501,2,501,2,2,2,2,2,2,2,2,2},
+ {633,425,295,548,497,163,381,461,89,2,2,831,583,896,38,2,625,2,2,2,276,276,2,2,276,2,2,2,2,2,2,2},
+ {767,318,84,97,208,387,423,196,417,2,396,396,396,396,396,128,128,2,2,2,328,328,4,4,4,4,101,2,2,328,82,16},
+ {802,533,869,638,67,192,805,223,219,2,2,191,178,178,77,77,2,2,2,2,431,431,2,2,2,431,431,2,2,431,2,2},
+ {781,638,410,399,336,465,856,426,28,2,4,4,6,6,2,2,2,449,372,372,449,449,449,2,2,449,449,449,449,449,449,2},
+ {807,377,237,443,388,286,158,349,491,32,32,260,260,260,2,2,260,615,615,615,2,2,260,260,260,260,260,615,615,615,615,615},
+ {780,359,766,618,41,596,86,636,287,707,707,96,49,373,613,373,2,2,2,2,2,2,2,613,613,613,2,2,2,2,2,2},
+ {788,497,334,93,319,169,273,540,904,2,903,569,569,569,272,272,2,2,2,2,571,571,571,571,571,571,571,571,571,571,571,571},
+ {622,309,913,550,994,90,257,588,29,526,526,526,496,496,576,2,2,2,2,2,182,182,182,2,2,447,447,447,447,447,447,182},
+ {814,652,456,774,624,870,27,739,464,2,108,578,578,561,295,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {818,280,99,873,165,426,341,74,479,342,727,684,684,662,662,2,2,2,2,2,2,662,2,2,2,2,2,2,2,2,2,2},
+ {593,411,953,203,89,57,785,354,349,424,424,707,707,707,829,2,2,2,2,2,670,670,670,2,2,424,424,424,2,2,670,424},
+ {629,560,621,245,683,633,495,551,472,2,31,74,489,684,555,684,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {901,490,693,410,666,119,703,593,201,61,70,70,774,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,418,418},
+ {669,321,391,548,189,157,337,42,796,871,276,622,30,2,2,2,2,2,2,2,580,580,107,2,2,2,2,2,434,434,434,434},
+ {610,236,633,300,681,358,72,281,148,466,466,283,275,2,386,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {929,360,102,893,329,136,515,33,170,581,268,35,777,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {859,584,475,745,506,900,40,869,143,612,175,275,209,12,12,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {822,581,76,382,72,347,964,324,137,61,61,28,623,351,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {655,330,324,151,166,431,58,174,142,115,1003,66,724,778,2,2,2,503,503,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {867,820,301,252,61,331,105,309,562,218,365,326,768,672,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {623,330,182,489,212,223,741,490,40,412,801,681,681,801,2,2,71,2,2,2,2,2,2,427,2,2,2,2,2,2,2,2},
+ {859,844,510,859,118,190,550,29,159,622,622,382,258,382,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {612,237,272,53,534,682,372,935,494,536,536,599,599,599,2,536,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {843,730,235,233,816,495,598,134,131,604,227,378,378,553,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {667,397,121,526,321,660,848,729,357,137,268,711,521,521,2,2,2,2,2,2,2,2,2,2,2,2,2,194,2,2,2,521},
+ {939,783,796,676,259,643,103,289,15,471,80,80,2,239,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,888},
+ {670,595,333,257,907,413,548,341,327,350,612,700,700,700,700,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {678,274,695,790,169,701,707,1084,470,123,846,846,217,121,317,2,2,2,83,83,83,83,83,83,83,83,83,2,2,2,2,2},
+ {877,181,375,79,199,256,223,295,135,371,395,354,2,307,944,2,813,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {882,417,475,424,311,646,346,207,74,157,590,356,2,2,324,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {708,442,186,698,345,103,687,463,163,416,416,107,2,2,2,375,375,416,6,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {865,675,786,568,112,197,225,348,372,497,215,215,2,2,2,2,159,159,150,224,224,141,2,2,2,2,141,141,141,141,141,141},
+ {844,244,672,489,839,263,14,233,422,392,8,392,2,2,2,2,2,2,815,815,815,815,257,257,105,105,2,2,2,815,815,815},
+ {693,726,117,167,535,725,224,78,716,100,460,299,2,2,2,2,921,744,2,2,2,2,2,378,2,2,178,178,178,2,178,178},
+ {898,559,396,742,51,143,411,221,116,756,756,756,2,2,2,701,701,2,2,2,2,240,225,256,322,322,240,240,240,240,240,322},
+ {697,540,358,391,932,309,103,73,35,353,353,503,2,2,353,134,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {982,579,548,413,416,103,71,101,1039,526,684,684,2,2,656,2,2,2,2,2,2,2,2,2,2,2,656,656,656,2,656,656},
+ {695,881,335,126,429,476,772,667,974,98,433,49,129,129,2,2,2,2,2,2,2,2,2,2,544,2,544,2,2,2,2,544},
+ {859,361,215,569,255,378,543,436,220,34,105,105,816,816,816,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {705,770,134,178,940,944,654,600,46,797,797,591,2,145,616,2,2,2,2,2,2,389,389,2,122,2,2,2,389,389,909,389},
+ {642,757,247,513,372,54,546,971,271,61,61,1018,2,143,332,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {988,271,675,163,379,108,48,472,870,485,485,18,2,485,528,528,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {865,827,614,74,725,685,724,190,178,272,835,722,2,35,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {923,397,722,186,203,575,24,144,36,526,206,787,12,100,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {718,359,103,558,684,560,67,35,120,342,680,265,265,265,2,2,265,2,2,2,2,2,2,2,2,2,430,2,2,2,2,2},
+ {927,493,988,194,97,1006,377,578,105,248,707,784,98,784,2,2,2,2,2,2,2,2,2,370,370,2,370,2,2,2,2,2},
+ {900,455,485,601,353,69,67,965,25,226,314,314,883,923,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {903,259,153,106,289,916,861,41,441,368,131,131,262,671,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {945,358,160,196,82,403,362,195,376,877,521,336,521,77,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {912,516,108,555,306,274,55,197,565,174,659,208,441,441,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {753,242,194,619,345,94,463,485,163,85,412,575,270,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {940,226,320,666,269,54,542,174,109,290,754,524,649,2,202,2,2,2,2,2,2,2,776,202,776,776,776,2,2,202,202,202},
+ {915,210,456,377,303,237,225,521,621,175,569,20,124,2,601,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {672,652,792,253,796,404,171,90,406,433,43,159,72,2,2,372,2,540,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {733,439,537,37,149,650,916,443,743,621,921,664,664,2,2,2,2,2,682,523,523,523,2,2,523,523,523,523,523,523,523,523},
+ {982,344,812,567,243,52,246,369,439,205,600,739,730,2,2,2,61,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {982,604,126,65,633,657,22,776,161,45,725,44,4,2,2,2,2,2,2,2,2,2,269,269,2,2,2,2,2,2,2,2},
+ {745,600,284,1117,459,1135,300,52,845,331,334,334,334,2,334,334,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {936,409,217,57,574,395,481,245,548,268,447,598,375,2,192,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {986,241,233,45,721,325,350,222,35,1065,1065,1065,1065,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {755,796,877,981,259,194,1180,215,90,658,662,662,662,2,36,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {981,626,987,827,466,458,578,346,475,223,223,223,342,1058,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,728},
+ {949,422,941,491,66,786,592,429,307,123,40,478,478,478,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {992,723,625,251,431,544,309,466,700,644,484,837,904,320,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1077,496,819,340,974,122,39,1209,819,18,461,648,648,394,2,2,2,2,2,2,61,2,2,2,2,2,394,2,2,2,2,394},
+ {999,674,212,673,279,579,462,754,89,866,345,110,110,887,2,2,2,2,2,707,707,2,2,2,2,2,2,2,2,2,2,707},
+ {1083,356,367,357,559,213,606,477,71,103,790,103,299,299,2,2,2,2,2,2,406,406,2,2,2,2,2,2,2,2,2,2},
+ {1005,260,389,960,501,714,118,73,334,1019,704,204,504,205,822,822,2,2,2,2,2,2,2,2,2,2,684,2,2,2,2,2},
+ {738,749,769,610,306,326,328,578,479,840,840,840,68,192,2,150,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1010,937,449,474,154,456,766,318,275,444,709,2,778,778,778,806,779,779,2,2,2,2,2,2,2,2,806,2,2,2,287,287},
+ {1011,780,134,945,183,42,741,25,252,164,205,222,222,222,147,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1118,427,294,404,268,217,922,515,19,1045,1045,2,833,291,448,2,2,2,2,2,2,2,2,2,175,2,2,2,2,2,2,2},
+ {1094,640,912,223,67,472,623,623,1244,65,1009,1209,1209,812,387,2,2,2,513,2,2,2,2,2,2,2,2,2,2,2,1209,234},
+ {722,375,264,390,515,498,1161,391,884,551,238,2,2,825,549,2,2,2,551,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {792,250,299,210,496,682,94,207,220,227,227,2,2,227,73,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1022,409,93,359,983,345,280,280,104,940,940,2,2,382,1039,2,2,2,2,831,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1027,925,413,335,327,826,250,122,293,773,564,541,420,420,420,774,763,2,2,2,2,2,2,900,110,110,2,763,2,2,2,2},
+ {1028,730,807,119,209,146,230,498,164,309,309,2,2,2,693,912,430,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {997,525,680,120,466,728,288,110,1082,544,572,2,2,663,290,290,2,2,754,2,2,2,2,2,582,582,582,582,582,2,2,2},
+ {1055,395,795,561,222,85,294,433,377,89,89,2,2,2,456,821,2,2,821,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {997,614,240,638,755,575,874,321,600,235,665,2,2,2,154,154,767,767,2,767,2,2,2,2,2,2,2,2,2,2,2,2},
+ {802,298,672,424,104,623,152,159,476,760,66,2,2,2,215,215,490,490,490,2,2,2,2,2,490,490,490,490,490,490,490,490},
+ {1128,788,124,501,561,1015,419,787,48,620,705,2,2,2,2,88,18,2,215,215,215,2,2,215,215,2,2,2,215,2,2,2},
+ {807,433,721,434,449,242,170,842,21,4,642,2,2,2,2,2,4,4,4,4,2,856,856,856,885,885,856,856,856,856,856,885},
+ {755,612,235,265,369,855,414,362,478,518,518,2,2,64,16,8,32,4,16,8,8,1041,501,1041,2,2,64,16,8,8,16,270},
+ {1004,719,1041,460,551,516,135,417,130,698,698,2,2,2,655,655,655,655,655,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1017,568,930,1113,556,1299,114,881,690,475,641,2,2,2,779,779,103,2,528,2,2,2,2,2,2,528,528,2,2,910,910,2},
+ {814,473,286,752,476,779,420,569,742,164,490,2,2,2,793,812,812,812,2,812,812,2,2,526,526,812,526,2,2,2,526,526},
+ {818,301,273,664,206,971,895,590,912,523,523,2,2,452,384,255,2,130,130,130,130,865,2,2,2,255,2,2,2,2,2,2},
+ {820,249,292,1017,1017,143,403,37,433,456,515,2,2,69,640,2,2,2,2,2,2,2,2,2,2,2,2,824,824,824,2,2},
+ {1078,527,589,244,170,892,827,606,1165,773,189,2,2,240,22,2,2,2,2,2,2,759,621,621,621,621,621,621,621,621,621,621},
+ {865,1132,428,582,254,408,536,376,825,116,116,1266,1266,1266,705,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1062,268,389,1325,598,276,1270,48,572,439,302,2,544,609,544,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1065,517,247,1142,247,674,385,120,592,177,98,2,956,364,275,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {635,503,594,203,456,1246,221,396,1151,178,66,2,781,587,86,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1157,395,446,280,1130,695,668,271,111,882,477,615,615,615,2,2,2,2,2,2,2,2,615,615,615,615,615,615,615,2,305,2},
+ {830,397,932,519,818,113,367,694,88,535,535,414,343,175,2,2,2,2,2,2,2,2,2,2,414,864,2,2,864,864,864,864},
+ {793,463,329,730,390,551,968,92,511,470,424,563,672,563,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1050,749,809,479,87,757,288,172,597,722,4,418,418,390,2,2,2,2,2,390,390,2,2,2,2,2,2,2,2,2,2,2},
+ {1084,402,130,1077,276,154,1068,779,511,853,83,757,757,38,2,2,2,2,2,202,2,2,2,2,2,2,2,2,2,2,757,2},
+ {1090,255,271,110,159,235,158,236,271,815,1300,416,416,416,2,2,416,416,2,2,2,399,791,791,2,791,2,2,2,2,791,791},
+ {1058,417,271,172,312,363,184,191,28,183,759,214,759,39,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1057,385,263,395,901,274,727,340,1117,263,813,870,858,429,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1102,846,985,1085,764,124,764,51,874,612,478,801,478,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1120,665,311,695,319,1033,511,297,602,1030,1030,714,240,240,2,2,2,2,2,2,2,2,2,2,2,2,2,953,2,2,2,2},
+ {814,293,763,661,575,631,524,636,112,691,595,1103,405,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1106,662,258,190,1315,214,530,263,318,904,877,1317,318,2,510,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1206,469,299,1052,655,114,189,213,321,188,64,475,475,2,2,662,662,662,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1120,1159,358,347,838,207,357,167,476,52,672,38,822,2,2,2,2,2,2,213,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1076,596,553,545,79,727,881,121,298,169,639,368,695,115,115,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1130,177,84,673,350,543,543,95,128,954,430,884,884,2,884,884,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1222,412,430,707,691,746,131,607,311,607,112,217,912,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {820,461,681,382,273,273,358,274,274,91,887,676,386,2,676,676,2,2,2,2,2,2,2,200,2,2,2,2,200,2,2,2},
+ {1096,1166,209,407,1127,400,974,322,428,906,631,134,171,2,2,2,2,664,664,664,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1091,946,437,51,527,802,597,639,587,645,510,586,586,2,2,2,2,2,2,2,2,2,2,2,2,2,2,168,168,168,168,168},
+ {1148,585,868,1282,666,417,733,1231,515,332,1213,337,337,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1103,276,174,408,233,170,955,108,530,354,585,38,677,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,476},
+ {1167,478,1169,1053,563,371,108,772,413,497,1338,991,660,2,2,2,2,2,2,2,2,2,2,2,2,27,2,2,2,2,2,2},
+ {1108,437,1160,324,868,686,361,399,786,1161,1161,707,731,731,655,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1116,331,280,422,1109,341,570,243,849,241,566,61,608,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {898,782,478,1208,196,983,608,537,196,1141,141,296,715,715,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1099,1187,300,240,268,413,1366,634,184,768,773,365,783,224,783,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1158,945,300,1115,205,495,435,302,187,774,774,843,843,284,284,2,2,2,2,909,933,933,933,2,2,909,909,2,2,2,2,909},
+ {904,660,1283,46,33,124,416,218,152,970,1241,305,307,307,307,260,894,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1127,553,287,58,739,99,514,739,766,42,580,241,598,598,936,936,936,629,629,629,629,2,2,2,2,2,2,2,2,2,2,2},
+ {1142,370,287,925,307,1232,129,11,1284,1056,33,33,536,521,2,1286,2,2,2,2,2,2,2,2,2,2,2,2,847,847,847,847},
+ {1140,814,528,677,84,1192,305,637,335,451,103,325,77,969,2,651,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1297,600,419,985,846,493,186,109,147,239,197,762,762,327,327,1004,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1181,615,482,653,238,130,313,506,98,1314,730,730,730,730,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {921,613,628,1288,111,150,191,233,633,83,387,602,105,394,2,2,2,2,2,2,2,351,2,2,351,351,351,2,2,2,351,351},
+ {1192,555,586,516,1288,733,64,653,364,273,421,215,75,75,2,2,2,2,2,2,953,953,953,953,8,383,383,2,161,383,953,953},
+ {1160,617,505,1205,374,906,23,408,194,91,91,91,585,984,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1203,1101,497,352,254,309,464,123,607,1080,265,1145,1145,1145,284,284,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1210,656,1026,782,802,442,1319,734,794,165,165,796,93,796,2,829,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {963,646,721,1161,219,667,1088,485,692,692,663,535,553,662,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,686,686,2},
+ {966,590,140,297,189,844,633,12,847,742,742,244,281,34,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {941,231,1038,309,173,770,413,560,855,660,721,1103,721,721,721,2,2,2,2,2,2,2,2,2,2,2,2,174,2,2,2,2},
+ {1213,305,656,983,1399,1196,692,986,9,339,754,308,2,308,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {972,768,1109,523,642,546,1452,29,1296,13,813,813,2,1496,2,2,2,2,2,2,2,165,165,165,165,165,165,2,2,2,2,544},
+ {1330,671,528,831,1426,735,33,425,364,119,363,978,2,761,483,476,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1188,217,838,237,379,202,785,949,479,169,348,872,2,872,872,2,2,2,2,2,2,1028,2,2,2,2,2,2,2,2,2,2},
+ {1190,286,513,881,390,215,387,130,749,554,1110,519,160,160,160,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1247,353,973,217,1044,1318,1115,319,203,390,1244,225,2,2,508,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {893,560,132,1420,721,191,568,799,412,22,322,93,2,4,4,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {987,774,678,175,145,264,588,97,1308,6,828,1129,2,2,2,45,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {955,980,753,96,574,259,1327,556,342,1415,1036,1036,478,478,478,478,507,2,2,2,2,151,2,2,317,2,2,2,2,2,595,595},
+ {882,1038,211,110,942,337,1305,1225,661,183,381,381,2,2,2,2,347,2,2,2,2,2,2,2,600,431,431,431,431,431,431,431},
+ {1208,486,343,725,677,1204,135,139,924,170,1111,317,2,2,2,2,202,706,202,107,107,107,2,2,706,706,107,107,2,2,2,706},
+ {1259,1017,456,298,443,838,137,744,551,334,36,951,2,2,2,699,718,2,2,984,2,2,2,2,2,2,984,984,2,2,2,2},
+ {1212,1186,641,284,565,636,895,82,690,117,184,184,2,2,2,397,902,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1263,370,132,635,381,47,537,179,1192,301,1282,33,2,2,2,1553,2,2,2,2,2,2,2,2,2,2,2,307,307,2,2,2},
+ {1223,433,252,572,424,82,221,107,382,430,203,461,2,915,362,964,2,2,964,2,2,2,2,2,964,964,964,964,964,485,485,485},
+ {1015,593,112,1408,51,104,199,221,931,1010,928,928,2,2,878,878,2,2,2,2,731,731,2,731,731,2,731,2,731,731,731,2},
+ {1220,410,1193,352,260,434,469,41,1090,961,961,728,2,2,330,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {898,1043,391,1289,29,830,184,321,1136,85,1133,1082,864,864,2,2,2,2,2,2,2,2,789,789,2,789,789,2,2,789,789,2},
+ {1223,434,851,152,140,1495,190,397,925,37,1080,430,2,2,204,2,759,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {989,1043,184,232,64,403,284,745,171,171,995,223,380,380,1400,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {939,1070,1288,254,973,901,321,109,568,713,336,988,2,946,262,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1276,636,569,258,325,675,342,85,88,579,833,833,833,833,520,2,2,2,2,520,520,2,2,2,2,2,2,2,2,2,2,2},
+ {982,508,815,214,206,602,448,685,446,572,1549,8,1047,1047,1047,2,2,2,2,2,2,2,363,502,2,2,71,363,2,2,363,363},
+ {1288,1398,789,514,151,600,1618,1194,1419,441,234,204,1191,438,828,2,857,857,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1002,342,1045,757,1008,979,322,240,1211,171,552,123,2,129,129,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1401,402,525,293,97,223,452,808,61,169,1023,1023,886,886,1023,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1001,644,263,164,136,939,624,95,489,1023,1107,331,331,10,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1011,475,845,532,567,951,663,295,877,1275,227,39,618,683,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1401,741,509,797,47,157,1256,482,1513,899,736,780,780,210,2,2,2,2,783,783,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1047,880,369,402,641,446,639,586,277,396,419,275,825,820,2,2,2,238,238,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1273,701,831,1294,1580,137,162,415,563,11,92,116,116,116,2,2,2,2,2,2,1029,1029,1029,504,504,877,877,877,877,877,1029,1029},
+ {1335,400,315,412,172,125,568,1024,58,601,398,985,640,577,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1453,947,486,485,453,415,1164,684,504,605,422,998,727,727,2,2,2,1136,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1057,1198,146,529,284,1286,160,135,75,686,648,1425,821,586,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1052,442,936,64,132,1378,1323,161,161,161,230,131,12,12,2,2,2,2,2,2,2,2,2,2,2,998,998,998,998,2,2,2},
+ {1422,838,234,554,736,243,344,526,1108,33,1303,699,249,305,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1279,681,423,813,806,269,412,420,985,485,761,1013,649,796,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {938,614,523,557,898,624,178,461,287,985,371,371,260,613,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1335,834,652,528,536,523,497,60,173,777,238,59,4,59,4,8,2,2,2,559,559,559,559,559,559,559,2,2,559,559,559,2},
+ {1040,998,324,93,887,497,1326,443,152,1193,595,80,80,80,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1302,1116,283,1006,891,838,768,373,468,968,1178,1178,1269,1269,876,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1027,1128,114,395,357,417,848,22,389,1257,734,838,838,301,900,2,90,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1072,724,717,877,873,369,1031,698,917,1641,1641,1641,53,549,549,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {987,1243,424,240,53,1150,558,292,1107,574,814,1474,1474,1068,1186,2,2,2,2,2,2,2,2,2,2,2,2,2,2,859,2,2},
+ {1040,420,960,882,64,661,292,146,976,427,689,248,248,248,638,2,2,2,2,2,2,2,2,2,2,2,2,861,861,861,2,861},
+ {1040,522,666,398,78,208,293,818,134,867,147,147,482,2,4,629,629,629,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {987,1280,1245,1300,926,676,56,546,541,690,84,42,1000,1383,1383,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1324,588,1378,592,1445,1029,759,1296,739,931,363,704,312,704,704,704,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1058,454,1557,191,129,297,695,1390,1274,460,923,923,923,2,4,1059,2,2,2,2,2,2,2,2,2,2,2,2,2,1059,2,2},
+ {1327,572,282,1022,907,1276,409,643,1050,633,187,187,187,2,228,45,2,2,2,2,2,2,320,2,2,2,2,2,2,2,2,2},
+ {1395,958,237,101,559,891,560,47,524,747,197,589,589,917,887,887,887,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1395,529,461,402,194,392,122,781,111,162,780,593,593,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1378,541,848,848,347,856,102,104,183,156,395,130,1377,2,2,2,159,159,159,2,2,2,772,2,2,2,2,2,2,2,2,2},
+ {1062,212,784,63,252,873,1302,1108,1380,84,1375,1375,1375,2,2,2,375,374,2,980,2,2,2,980,980,980,2,2,2,2,2,2},
+ {1384,549,430,781,946,879,901,924,741,114,14,451,36,2,2,2,2,287,287,287,803,803,803,803,2,2,2,803,803,803,803,803},
+ {1413,627,1329,1092,526,197,31,417,1149,981,964,1003,685,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,717,717,2,2},
+ {1084,1174,1601,949,910,960,500,461,1290,23,1042,636,212,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1420,531,626,738,376,537,814,206,990,235,847,812,201,201,201,201,726,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1420,624,363,537,1436,278,292,377,263,820,376,382,382,2,654,655,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1091,793,1353,208,506,599,846,503,1011,247,289,61,1050,61,61,61,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1533,978,284,156,914,162,685,1184,252,1375,189,256,640,2,640,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1531,692,414,277,541,1371,1447,682,536,109,432,1240,1240,2,1022,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1128,398,791,1170,76,661,408,259,756,495,79,553,10,10,1532,1532,1532,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1040,704,618,854,374,1470,274,383,941,519,351,351,351,351,351,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1427,988,498,1529,99,678,1323,149,33,426,543,543,335,1507,772,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1102,349,490,266,144,220,599,437,743,764,647,1128,605,265,324,324,324,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1118,496,645,592,354,1133,935,428,72,532,182,182,1370,660,123,2,294,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1102,1042,315,745,1006,771,630,68,587,1187,295,295,295,408,408,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1118,724,1322,405,199,614,1087,885,1313,317,769,660,660,1158,535,2,2,2,373,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1120,772,743,488,346,126,784,584,943,153,311,133,133,969,605,605,2,2,2,2,2,2,2,605,2,2,2,2,2,2,2,2},
+ {1404,284,176,590,1128,1371,322,543,1136,546,1315,174,174,777,777,891,2,2,2,2,2,2,2,579,579,579,579,2,2,2,2,2},
+ {1441,791,233,141,141,316,89,296,462,1263,758,482,599,599,578,341,2,2,2,2,2,2,2,2,2,2,2,525,525,525,2,2},
+ {1413,406,700,547,1166,250,518,543,104,331,205,205,691,691,2,2,118,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1485,400,1497,168,82,680,1103,554,249,702,493,101,296,236,2,236,236,944,944,2,2,394,2,2,2,2,2,2,2,2,2,2},
+ {1127,869,558,533,1215,194,1762,784,593,777,1153,1079,1079,1079,2,2,2,330,1045,2,1045,1045,2,2,2,2,2,2,2,2,2,787},
+ {1459,1243,467,533,266,1364,1031,890,1402,486,1678,1678,93,978,2,2,2,978,947,947,2,978,2,2,2,2,2,2,2,2,2,2},
+ {1139,809,117,522,955,1096,1120,1470,116,184,1565,1565,557,557,2,2,2,2,2,829,1326,2,2,2,2,2,2,2,2,2,2,2},
+ {1142,984,1044,590,340,241,662,357,366,1305,2,125,631,474,2,2,2,980,2,2,2,2,2,2,2,2,2,2,2,2,2,1273},
+ {1469,1247,1277,616,209,486,106,552,219,217,471,272,272,1201,2,2,503,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1148,542,1478,496,950,464,1011,235,136,180,2,416,758,453,2,909,2,2,2,2,2,2,2,2,2,2,1019,1019,2,2,2,2},
+ {1495,1178,874,415,1100,368,1057,1228,562,215,31,31,680,680,680,1208,2,2,2,2,2,2,2,2,1208,2,2,2,2,1208,1208,2},
+ {1497,1166,1613,1403,107,803,993,539,1436,1289,2,240,334,634,532,1147,2,2,2,2,2,2,2,117,2,2,2,2,2,2,2,117},
+ {1617,289,1033,169,355,260,30,45,721,906,88,44,44,418,417,218,2,2,846,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1628,721,400,239,728,1336,984,425,65,120,1232,463,463,640,349,616,616,2,2,2,2,2,2,2,2,147,147,2,2,2,2,2},
+ {1628,286,541,530,1610,201,1220,1592,272,181,2,38,263,1586,1157,1157,1157,2,2,2,1157,1157,2,2,2,1157,2,2,2,2,1157,1157},
+ {1531,621,210,755,482,82,1308,317,427,168,2,232,116,190,701,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,701},
+ {1532,575,1245,360,249,630,133,1406,920,1539,63,63,76,82,82,2,2,2,770,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1102,785,118,93,1491,988,275,53,1328,26,2,2,240,647,240,761,761,761,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1478,722,113,1534,1751,115,1728,1234,777,282,508,508,1184,63,1184,855,855,2,2,2,738,738,578,578,2,2,2,2,2,2,2,2},
+ {1480,536,1421,164,429,84,970,1673,548,497,2,2,530,156,156,128,245,2,2,2,2,260,2,2,2,2,2,2,2,2,2,2},
+ {1533,1302,1286,538,619,526,1669,145,1034,125,2,1038,1038,388,388,387,729,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1482,961,1093,556,1746,628,427,689,510,751,684,37,37,1229,1256,882,1507,1507,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1472,852,533,433,924,57,53,1036,410,675,1212,1212,1212,600,600,1212,1259,1245,1245,1245,1245,2,2,2,2,2,2,2,2,2,2,2},
+ {1228,425,1030,699,407,171,568,925,1104,97,2,2,1286,1286,1286,502,2,1219,1219,1219,1290,2,1219,1219,1219,1219,2,2,2,59,2,2},
+ {1547,657,777,695,1254,224,933,367,212,385,2,2,2,1422,749,245,885,710,2,2,710,710,710,45,710,710,710,710,2,336,710,2},
+ {1678,466,549,145,351,816,1041,334,192,192,2,2,348,1017,130,4,4,180,180,180,180,512,2,2,2,512,512,512,512,512,128,8},
+ {1550,569,481,1041,1680,1114,1265,160,386,194,2,2,2,533,929,531,422,531,1355,1355,1355,1355,531,216,216,2,2,2,2,2,2,2},
+ {1559,462,850,289,1570,71,512,858,810,835,2,2,2,2,1028,1205,1205,546,546,546,1205,1205,1205,1205,1205,2,1205,1205,1205,1205,1205,1205},
+ {1192,888,701,164,131,613,282,237,525,366,2,2,2,2,1737,845,845,750,2,1062,1062,1062,1062,1062,1062,1062,1062,1062,1062,2,1261,1261},
+ {1208,426,412,1072,274,248,1544,627,9,458,2,2,2,2,2,2,270,270,270,150,715,282,150,150,150,150,150,150,150,150,150,150},
+ {1128,393,1522,96,160,581,540,120,441,176,2,2,2,2,2,2,1427,551,1102,1102,328,328,592,592,592,592,592,592,592,592,592,592},
+ {1202,538,171,1177,1090,690,1566,746,1012,1012,2,2,2,2,313,781,808,313,1125,1117,930,1117,1117,1117,1117,1117,1117,1117,1117,2,2,2},
+ {1567,1265,372,1633,613,484,243,1523,21,275,2,2,2,431,431,431,431,2,2,978,489,889,889,889,889,889,889,889,2,2,2,2},
+ {1566,982,815,133,891,412,1179,831,651,268,2,2,2,367,366,367,367,63,63,767,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1522,1422,1017,124,499,451,731,1112,1355,1355,2,2,2,854,854,336,854,336,1297,2,2,2,193,193,193,193,193,2,2,2,2,2},
+ {1160,1331,917,1696,401,547,122,592,863,863,2,2,703,703,703,703,495,495,495,2,2,495,495,495,495,495,269,2,2,2,269,269},
+ {1538,814,1027,677,524,226,756,202,242,102,2,2,912,564,1289,682,2,1125,1125,1125,1125,2,1289,1289,1289,1125,1125,1125,2,1289,1289,1289},
+ {1598,397,1471,1471,1162,866,236,948,1557,737,2,2,153,737,1408,765,765,608,2,2,2,171,608,608,608,608,2,608,608,2,2,2},
+ {1598,434,107,270,148,1317,835,123,642,1236,2,2,67,633,771,878,771,878,878,2,2,2,771,2,2,2,2,2,2,2,2,2},
+ {1628,1502,1042,822,80,403,1335,684,464,426,671,671,336,336,336,2,425,896,2,2,2,2,1337,1337,1337,1337,1337,1337,2,2,2,2},
+ {1630,715,1368,1273,993,293,385,545,1267,896,1038,1038,270,1325,1325,2,2,961,961,961,961,961,961,2,2,961,961,2,2,961,2,961},
+ {1612,723,409,641,796,1087,1228,1398,623,262,740,740,870,870,397,2,2,893,893,2,2,1367,328,2,328,2,2,2,2,2,2,2},
+ {1614,588,652,105,441,844,734,912,532,878,1073,1073,62,1415,693,1431,1431,1431,1431,925,925,925,925,925,925,925,2,2,2,2,2,2},
+ {1607,1503,1072,471,221,277,854,1236,263,752,2,694,1657,934,553,2,2,2,498,498,2,802,2,46,2,2,2,2,2,2,2,2},
+ {1172,987,140,1964,584,600,852,1725,456,1199,718,718,791,981,791,2,2,2,2,2,1260,2,2,2,2,2,718,2,2,718,2,718},
+ {1746,771,620,415,1057,437,613,1034,1662,837,2,1149,1466,1149,1149,1149,1466,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1263,835,1533,789,1259,174,1497,557,644,203,2,289,604,434,434,434,2,844,844,2,2,2,1111,1111,1111,2,2,2,2,2,2,2},
+ {1272,884,388,1889,956,159,1172,595,219,645,2,629,107,107,1279,75,2,2,2,211,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1797,904,172,659,349,177,692,448,1141,990,640,99,1073,806,640,640,2,640,640,911,911,911,640,640,640,640,2,2,2,2,2,2},
+ {1276,442,1008,1352,243,162,711,301,552,1002,668,668,384,71,384,384,2,2,2,2,2,727,727,727,777,777,777,777,777,777,2,777},
+ {1600,1130,171,1113,813,722,117,990,37,24,969,94,825,1398,1398,1398,1398,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1198,496,714,609,644,1159,873,249,186,1539,136,239,379,1994,2,68,68,68,68,68,2,2,192,2,969,2,2,969,2,2,969,969},
+ {1678,1316,460,1133,1003,150,1236,1316,1417,218,1763,1763,77,77,2,1491,771,771,771,771,771,2,771,2,2,2,2,2,2,2,2,2},
+ {1682,449,1067,393,136,854,36,492,637,1053,247,1111,1111,1111,2,247,247,247,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1288,1690,702,760,420,333,1213,1911,805,351,67,67,1568,1568,2,2,604,142,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1288,1858,152,894,346,104,997,203,249,1006,1278,1489,1489,555,2,2,2,1074,1074,518,2,2,518,2,2,518,2,2,2,2,2,2},
+ {1601,697,532,408,697,1140,1568,47,1499,780,1171,318,318,318,2,2,2,2,318,318,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1283,1078,791,873,655,412,389,835,292,958,1245,678,1611,1519,2,2,185,2,2,2,2,2,2,1245,1245,2,2,2,2,2,2,1245},
+ {1685,1610,1447,1093,1255,937,703,431,522,1384,988,988,253,988,2,1892,1892,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1822,589,236,205,797,39,241,1048,181,386,102,102,102,111,1361,1361,1361,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1233,843,813,157,396,669,1531,439,640,733,996,996,996,1566,951,608,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1342,705,302,595,1200,52,83,647,519,139,103,103,103,513,2,513,2,2,2,2,2,513,2,2,2,2,2,2,2,2,2,2},
+ {1630,1244,142,767,1299,719,629,1716,419,837,1145,1136,1148,1405,1405,1405,2,2,2,2,2,309,309,309,309,309,2,2,2,2,2,2},
+ {1636,974,279,419,893,1608,1491,156,1486,115,730,730,863,509,924,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1318,1234,213,1089,1567,602,1330,404,467,718,249,215,354,177,59,332,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1732,1771,584,533,297,1056,669,293,146,311,1176,311,590,590,277,2,2,2,2,2,2,2,2,2,539,539,2,2,2,2,2,2},
+ {1026,512,1196,394,1259,1313,762,549,311,1576,1576,465,465,140,465,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1360,383,1470,502,1010,153,1588,619,1246,396,1107,1107,112,423,423,2,2,2,2,2,202,2,2,2,2,2,2,2,2,2,2,2},
+ {1320,1636,858,1210,509,194,1575,154,1424,455,1860,832,1075,581,262,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1670,1350,689,1074,437,956,587,642,1154,439,196,1108,1108,1108,990,2,2,2,2,2,1112,2,2,2,2,2,2,2,2,2,2,2},
+ {1873,890,920,874,591,651,768,478,331,76,760,760,760,760,67,2,2,2,2,1241,1241,1241,1241,2,2,2,2,2,2,2,1241,1241},
+ {1682,867,333,102,628,891,654,506,995,684,961,563,1313,1313,1313,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1672,1248,429,813,262,92,809,1248,560,1365,1392,753,753,1259,1261,2,2,2,2,2,2,2,2,177,177,2,2,2,2,2,2,2},
+ {1391,1598,1112,590,797,584,1354,47,1473,1291,1874,48,491,463,990,463,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1875,1576,924,677,461,134,1525,1619,44,701,299,743,728,791,791,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,791,791},
+ {1267,904,1187,1595,765,1451,494,1573,950,909,87,1265,757,1371,1005,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1360,1091,1478,1237,97,578,1616,494,1422,223,865,1092,359,2,1080,4,2,2,2,688,1965,2,1965,2,2,2,2,2,2,2,2,2},
+ {1750,386,393,840,723,791,1707,1319,1525,83,1302,571,280,2,280,73,2,2,2,1207,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1763,1018,1859,432,717,723,874,1294,1050,1800,1237,619,1074,2,10,1237,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1376,652,461,225,361,936,1073,1279,149,619,983,511,1994,2,2,1076,1076,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1947,393,495,946,1375,391,2128,582,1143,695,1872,760,760,2,2,1456,974,974,435,974,974,435,974,2,974,974,2,2,2,2,2,2},
+ {1768,1463,531,1008,95,1677,362,1105,985,177,1682,1682,244,2,2,1234,1041,1041,1041,2,2,2,1041,1041,2,2,2,2,2,2,1894,2},
+ {1780,1739,1357,1684,1586,736,208,966,1691,339,339,128,128,2,2,128,128,128,2,2,128,2,2,2,2,1929,2,2,338,2,2,338},
+ {1387,1459,358,1409,1919,917,777,223,313,1847,1012,1024,1024,2,2,2,2,1420,1420,1428,1420,2,1420,1420,2,2,2,1420,1117,1117,1117,1117},
+ {1289,907,228,665,1695,1735,489,214,762,1777,321,1674,932,2,2,2,2,1358,709,2,1959,1959,372,2,2,372,372,2,2,372,372,372},
+ {1378,680,1117,1367,759,62,319,563,505,1138,1093,345,693,2,2,2,780,780,2,2,2,729,729,729,2,2,2,2,2,2,729,729},
+ {1802,1645,453,1079,604,618,334,855,541,167,37,88,849,2,2,518,518,2,2,530,2,2,2,2,2,2,2,119,119,2,2,2},
+ {1275,1612,143,1586,502,987,555,436,2236,1826,494,494,358,2,2,213,2,2,2,2,2,2,1585,1585,1585,1585,1585,1585,1585,1585,1585,1585},
+ {1322,512,560,432,365,87,1835,1137,515,1271,1739,309,309,1229,1229,1229,2,2,2,2,2,2,2,2,416,416,416,416,2,2,2,2},
+ {1758,835,287,888,391,875,1834,516,1432,1171,98,408,302,976,976,1963,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1444,394,1613,796,645,1406,186,158,402,1364,314,588,606,2,577,117,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1337,1391,137,371,165,87,1026,20,419,99,572,572,918,854,918,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1323,589,526,1555,1636,1172,86,42,1545,57,627,1769,1769,2,867,343,2,2,2,2,2,2,2,724,2,2,2,2,724,724,2,2},
+ {1323,1647,384,301,270,549,1098,1144,1066,55,88,1805,683,2,945,120,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1327,1075,539,1017,926,350,1102,236,494,1268,286,286,1293,267,227,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1472,661,1538,487,94,2209,563,138,881,1735,718,203,1382,1473,1473,1473,1473,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1413,766,349,1471,45,625,733,1082,170,58,1268,207,1081,1081,1081,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1861,1487,419,97,799,1791,458,1029,370,627,57,414,414,1540,247,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1881,716,268,387,2138,1212,999,408,1363,434,1429,1429,1648,1648,1007,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1480,1131,1089,1688,340,962,505,1816,139,44,1350,403,1385,1996,173,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1868,650,1146,1690,948,43,497,692,1628,1302,1302,108,462,731,731,2,2,2,2,2,2,2,185,185,185,2,2,2,2,2,2,2},
+ {2023,1204,531,733,1054,618,668,363,783,218,1302,2055,559,2055,2055,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1328,601,601,617,554,467,391,1545,162,1361,807,1565,1565,243,1344,2,725,510,510,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1808,1525,1129,652,1195,329,1410,558,1322,911,161,536,737,94,306,2,2,2,2,2,2,2,2,2,541,541,541,2,2,2,2,2},
+ {1911,1338,639,1106,854,128,19,1353,847,253,618,517,2054,2054,93,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1825,850,180,1483,864,953,50,81,106,432,1372,1372,1212,10,10,10,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1892,441,977,228,1252,604,735,136,889,878,1319,1319,2127,2127,1963,367,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1820,1553,536,1351,425,1268,227,1742,429,348,1397,552,1151,1151,2,180,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1453,1044,556,833,305,1493,989,1158,726,1790,532,1229,1229,1229,2,2,2,2,2,2,2,2,2,2,259,2,2,2,2,2,420,2},
+ {2059,592,492,973,137,1331,392,334,635,1480,2254,1796,1796,284,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1460,986,709,268,755,824,83,893,115,656,2071,1323,1001,144,2,2,2,2,2,2,2,2,1527,1527,1527,1527,1527,1527,1527,2,801,801},
+ {1850,1476,792,840,2037,229,1578,526,431,1485,1450,1001,1001,1001,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1922,1383,813,346,1247,666,1931,1111,2042,79,682,501,1349,1930,2,2,681,681,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1922,542,1739,625,88,1376,259,49,338,318,505,788,1314,657,2,2,2,1314,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1948,1530,576,582,1069,119,2131,41,1178,1677,1677,1677,325,346,2,2,2,2,2,2,1401,2,33,2,2,2,2,2,2,71,71,71},
+ {1928,1111,168,1252,1467,1083,1927,603,1278,714,1027,50,751,1970,2,2,2,2,621,2,100,2,2,10,10,2,2,2,2,793,793,793},
+ {1394,896,674,2350,1375,1599,1858,135,762,722,628,685,705,28,2,2,2,2,2,2,2,2,2,2,2,855,2,2,2,2,2,2},
+ {1540,791,518,419,1130,1068,299,1386,1378,134,859,859,71,162,2,71,71,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2107,709,828,154,542,184,1094,1665,307,1549,177,2007,85,773,2,2,2,2,2,2,2,2,2,2,2,697,2,2,2,2,697,2},
+ {1977,1218,244,365,576,666,761,238,629,913,1907,986,1351,986,704,1257,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1496,1912,1291,1053,510,2322,1048,1530,2223,673,894,594,628,332,2,2,2,2,2,295,295,295,2,2,2,2,2,2,2,2,2,2},
+ {1520,1107,1082,687,484,1732,676,1595,467,653,1091,428,2113,332,332,332,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1905,612,920,848,562,2032,230,1305,1073,851,731,798,798,357,516,2,2,2,2,2,2,2,2,1465,1465,373,2,2,2,2,2,2},
+ {1428,1062,1016,75,297,1130,533,768,464,753,48,1510,1510,418,375,1626,2,221,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1396,729,1710,337,371,489,1341,2117,132,1870,853,853,408,1079,328,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1978,1051,977,588,1423,1001,508,409,825,497,659,1063,384,463,463,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1534,854,2007,1207,947,1773,1571,1505,909,1471,1655,1655,2334,1327,409,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2157,2106,679,238,378,49,1101,588,811,1313,1556,2301,475,812,812,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2187,1515,549,1416,1073,1613,47,1046,390,252,1214,1404,1404,933,1013,2,2,2,1025,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2145,1069,662,709,737,1141,1737,827,1384,1628,107,107,1032,277,277,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2173,1379,155,393,1578,610,1911,899,697,58,185,597,597,1249,1369,2,2,2,2,1369,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1413,1589,1603,2268,520,333,1416,859,1619,867,1154,512,1291,413,413,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1600,1823,1698,1268,623,583,1932,1674,522,529,1862,1281,246,989,246,2,246,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1559,992,174,1313,612,1487,1487,461,702,37,1660,839,2,95,1628,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2066,1719,710,1294,2041,377,1005,690,132,756,1618,187,187,726,187,615,615,2,2,2,2,851,2,2,2,2,2,2,2,2,2,744},
+ {2192,1029,310,1609,592,1542,265,117,2006,82,162,205,2,2009,2009,1201,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1570,1504,1414,1143,1999,1932,1015,1015,556,514,626,79,2,79,1795,1461,1461,2,2,2,2,2,2,2,1461,1461,1461,1461,1461,2,2,2},
+ {1562,937,1964,934,1349,378,459,109,1676,1655,1339,1809,2,768,768,188,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1965,949,1057,1043,2256,1571,970,348,69,1324,1174,485,105,105,105,2172,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2044,1869,838,1424,1097,155,1142,230,1335,420,235,1510,2,431,425,622,2,2,2,2,2,625,2,2,2,625,625,2,2,2,2,2},
+ {1976,1433,820,504,421,1007,388,1083,635,82,1524,750,2,2,870,106,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1990,1948,1138,1787,253,115,312,1912,341,1624,260,1783,1315,1315,790,790,790,790,790,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1993,585,327,1393,1013,1671,1758,1436,1989,1217,1109,1476,2,2,1042,756,1042,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2056,1062,1605,1943,680,445,113,857,650,1388,2016,1231,2,2,1292,1292,1292,2,1039,1039,1039,1039,1039,2,2,2,2,2,2,2,2,2},
+ {2008,1773,416,1954,1314,742,1694,505,202,1747,785,375,2,2,2,477,1538,477,2,2,2,2,2,1309,1309,1309,1309,2,2,2,1309,2},
+ {1658,1008,258,749,427,1071,2052,263,1047,2152,1602,1602,2,2,2,1311,669,669,2,1897,1897,1897,669,669,669,669,669,669,669,669,669,669},
+ {2258,1887,1875,1021,863,604,543,1115,509,1243,312,213,2,2,2,2,335,770,770,2,1143,567,2,2,567,567,567,411,2,2,2,411},
+ {2266,1872,991,1468,1168,939,907,833,624,701,386,1713,2,2,2,2,2,931,861,381,1299,2,861,2,2,2,861,861,861,861,861,2},
+ {2273,1510,803,2278,842,1245,1389,230,822,1564,113,1276,2,2,2,2,1350,273,273,2,2,2,2,2,1281,1281,1281,2,2,1281,1281,1281},
+ {2278,1028,548,373,190,1443,614,2386,1940,930,557,2069,2,2,2,558,112,103,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2108,776,1568,342,2215,1882,681,1292,1601,586,1481,618,1930,1930,1930,1930,2146,89,89,2,2,2,2,2,2,2,1171,2,2,2,2,2},
+ {2139,2177,1652,392,715,605,778,632,472,1619,64,64,2,2,2,1747,859,2,2,2,2,2,216,216,216,216,1747,1747,1747,1747,1747,1747},
+ {1492,448,271,135,1288,417,130,83,235,2313,482,746,2,2,746,609,611,611,611,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1628,846,1504,138,464,401,501,506,967,1027,1540,1035,2,1921,1539,1539,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1630,1677,1624,301,1038,909,887,374,411,143,1021,174,2,1393,19,634,2,2,2,2,2,2,2,873,2,2,873,873,2,2,2,2},
+ {1654,1131,2054,994,2170,548,801,252,87,219,488,2239,2,1232,1839,1822,2,2,2,968,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2065,1520,1423,1797,899,1425,1801,776,2365,58,646,695,2,998,998,1342,2,2,2,2,2,2,2,2,2,2,2,2,1150,1150,2,2},
+ {2304,1948,316,1063,237,607,1143,2575,1388,1022,127,251,2,438,1570,1570,1570,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2177,710,1912,617,809,1078,199,905,673,519,457,52,2,1348,1348,410,2,2,2,2,2,340,2,2,2,2,2,2,2,2,2,2},
+ {2073,1543,1586,1296,2466,753,455,46,119,1694,2035,1592,206,206,206,2,2,2,2,2,2,2,2,1172,2,2,2,2,2,2,2,2},
+ {2075,1056,874,2101,566,1790,1333,386,538,1560,2254,331,717,717,717,454,454,2,2,2,2,2,2,2,2,2,2,2,454,454,2,2},
+ {1670,977,1540,553,855,1729,239,757,191,62,732,549,1092,1092,199,199,199,199,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2096,1155,2257,125,1986,245,1208,2146,2287,680,1413,73,467,1410,1410,2,2,2,2,2,133,133,133,2,2,2,2,2,2,2,2,2},
+ {1538,1026,2157,1457,1784,2559,184,29,614,273,697,697,1922,697,697,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2106,856,1025,382,389,272,425,672,1021,216,601,292,510,510,876,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1662,608,2478,266,1330,505,40,2058,964,724,596,1221,1221,310,42,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1600,1338,196,1510,1371,1138,957,169,545,1176,1131,2460,1708,541,541,2,363,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1682,1008,737,444,822,999,2066,283,646,1860,1008,778,1178,1178,458,1743,2,2,2,2,2,2,2,2,2,2,2,2,2,1743,1743,1743},
+ {2132,756,1097,166,202,411,640,717,514,1389,633,633,633,633,633,633,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2386,748,620,478,647,898,320,53,1115,190,60,1860,1860,802,802,2,2,2,2,1264,1346,1346,2,2,2,2,2,2,2,2,2,2},
+ {2125,996,1081,124,1140,628,1668,1913,151,2495,523,430,260,708,2190,2190,2190,2,2,2,2,2,1660,2,2,497,497,497,497,497,497,2},
+ {1602,1489,895,383,56,698,2081,1728,794,789,16,16,797,302,52,2,2,2,2,2,2,2,2,2,2,797,797,797,797,797,797,1808},
+ {2210,606,901,547,131,1924,1852,1271,194,766,390,390,520,795,1429,1429,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1731,599,817,724,718,1038,1082,2503,1341,936,421,1802,1304,1304,1491,186,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1614,1058,847,689,749,1028,1047,1474,117,1369,1442,1442,1540,700,104,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1733,679,2041,2420,326,934,1172,1431,193,370,1073,1073,1073,260,2,2,2,2,2,2,2,2,2,2,2,2,1193,2,2,2,2,2},
+ {2168,1532,769,2570,1303,357,1793,1633,1226,1025,205,1218,1984,764,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2234,1706,356,581,532,933,1704,387,1345,1345,34,135,350,307,614,614,307,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1656,2093,354,310,306,1553,106,459,175,55,1482,958,254,254,2,356,356,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1654,1035,330,533,1446,953,499,142,1527,1748,265,1437,265,510,2,2,2,2,2,2,2,1835,1835,1835,1835,2,2,2,2,2,2,2},
+ {1600,479,1457,246,2025,618,1612,2139,169,1492,1097,1327,2007,2007,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1744,447,845,2145,748,1555,1193,1312,916,1770,1294,546,794,323,2,2,2,2,2,1733,1733,2,2,1730,2,1733,1733,2,2,1733,551,551},
+ {1766,1558,1901,1393,987,1859,815,1165,50,2065,88,88,1453,1453,2,2,2,995,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1615,1267,1242,1494,399,663,68,1209,1573,528,640,1200,248,640,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1678,592,1351,509,312,721,163,1597,1262,199,2643,1330,1661,992,2,2,719,2,2,2,2,2,2,2,2,2,2,2,2,2,1704,2},
+ {2207,970,838,2043,1016,561,267,329,584,608,679,303,832,1613,959,959,959,1409,1409,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2217,352,447,914,1200,561,614,1616,509,2292,1114,1114,1229,52,1053,1053,1053,2,2,2,2,2,2,2,2,2,2,2,2,2,795,795},
+ {2313,595,1593,1951,133,282,372,2396,1117,226,2104,267,374,267,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2312,1231,1604,997,652,1096,1070,320,481,662,911,1610,342,2527,606,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2245,1541,1828,783,615,428,1282,1892,848,1219,2465,314,314,314,2,2,2,2,2,2,2,2,2,2,2,2,1323,2,2,2,2,1323},
+ {2522,1030,324,1264,628,1339,480,234,2351,1085,1979,2333,1339,1356,1356,2286,2,2,2,2,2,2,2,2,2,2,2,2,2530,2,2,2},
+ {2519,1136,612,209,994,1179,1060,2621,130,485,661,1444,2122,124,258,1114,2,2,806,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2524,1894,253,2072,1242,355,888,1362,28,480,452,1216,595,545,354,1145,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2569,1356,1053,410,437,58,1508,831,2272,383,1725,615,1191,1191,1191,2493,186,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2386,1106,709,251,784,929,1551,2481,304,2148,1546,955,2453,866,866,2,2,2264,2264,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2228,1163,1995,649,1000,680,325,1591,774,767,711,711,1418,524,711,401,976,2,2,2,2,2005,2005,2,2,2,2,2,2,1390,1390,2},
+ {2362,1706,564,1088,1296,1267,70,1015,496,1298,758,154,240,240,154,154,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1715,2260,357,557,783,1195,2288,1997,1120,144,247,175,1277,203,203,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2294,2360,1353,748,1439,226,940,2316,1112,1527,214,1406,1429,712,1124,2,595,595,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2303,1018,316,280,1616,909,97,1126,1295,736,216,54,2045,726,1673,2,2,2,2,2,779,779,2,2,2,2,2,2,2,2,2,2},
+ {2390,491,1217,1148,2314,2250,2180,308,613,662,1346,1346,1346,1280,778,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1732,527,1303,664,71,294,404,917,1074,180,2618,2412,441,1987,1750,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1695,1287,1346,1181,1412,1653,830,2025,957,1720,1614,887,964,964,964,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1756,2308,1986,101,957,633,1940,1002,390,1237,95,1441,95,95,705,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2461,1412,540,1183,229,300,47,585,518,402,1863,1863,560,1326,1326,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1707,717,366,287,1883,50,599,1371,474,1551,947,2142,1885,947,2008,1004,1004,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2632,567,1149,1227,1156,2052,643,1585,1197,581,63,718,699,149,149,1940,2,2,2,2,2,2,2,2,2,2,2,2146,2,2,2,2},
+ {1773,2024,377,340,1938,103,1180,600,199,848,2449,2449,506,506,762,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2435,1920,394,1482,266,1637,911,1697,1689,1249,1085,1085,397,2292,1355,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2345,662,270,324,1061,1080,1952,593,1480,2111,2667,2093,2059,2120,955,1447,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1777,455,1487,1190,455,1542,977,2308,437,1129,410,856,1420,412,412,766,2,2034,2034,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2662,2224,1142,656,59,598,730,458,226,1151,741,1286,1015,2,688,2017,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2666,768,529,990,2329,130,1678,2466,318,1083,387,1524,511,2,731,731,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2501,1216,246,1278,718,704,2019,88,273,1203,67,1488,1828,2,2,1489,1489,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2474,2292,1818,2061,2833,751,2172,1708,1210,1675,370,131,163,2,2,163,163,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1751,1575,889,828,82,1956,712,499,1420,1686,339,2326,2035,2,2,558,558,2,1234,2,2,2,2,2,2,2,2,2,2,2,1239,1239},
+ {2522,1148,1943,168,218,252,543,1535,2004,130,353,353,42,2,2,2,1173,1173,2,1547,2,2,2,2,2,2,2,1547,1173,1547,1547,2},
+ {2695,432,1213,579,865,1637,1857,84,447,155,2492,347,1980,2,2,2,1155,1155,1155,2,1933,1933,1933,2,2,2,2,2,2,2,1901,1901},
+ {1808,1683,474,1761,106,602,1416,217,1351,1602,366,393,1966,2,2,2,2,2,378,378,606,606,606,2,2,2,2,2,919,919,919,919},
+ {2428,1576,1692,449,2012,240,1167,418,272,1557,2197,645,645,2,2,2,2,2,2150,2150,2,2,562,715,2,2,2,81,81,2,2,2},
+ {2727,781,1689,1709,997,2563,1032,468,44,992,1214,725,75,2,2,2,2,360,360,380,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1948,1085,1344,2090,1435,2389,3193,1007,1003,244,667,1838,2062,2,2,2,1802,299,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2433,932,689,818,2014,1498,749,1645,867,1627,47,1766,2193,2,2,2030,2030,2,430,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2463,712,1525,2092,2942,352,761,242,2178,2339,483,1905,1347,2,2,65,529,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2547,920,386,925,74,579,323,2319,520,2332,1535,751,1591,2,770,770,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2452,2588,2055,665,818,2622,413,1260,965,211,989,1219,166,2,1251,1251,2,1256,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1957,2311,993,276,293,2826,1087,880,927,1811,1122,2974,2974,2,2,590,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2552,998,533,827,1619,831,1861,918,750,1955,241,1899,448,2151,2151,449,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1860,579,1000,1575,898,170,185,1032,293,2754,438,459,459,2,1199,1199,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2602,2417,1888,2528,1410,669,1543,233,814,2478,225,1449,1449,224,1671,1671,2,2,931,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1889,2527,1366,1371,387,925,1751,162,250,1064,292,467,467,546,1244,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2492,1186,1350,1616,2749,1962,33,708,279,813,1390,489,1203,268,173,2410,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2500,1575,423,541,561,380,262,1564,1923,1242,2084,1758,1283,2213,924,924,2,2,2,2,2,2,2,2,2,2,2,1827,1827,2,2,2},
+ {1842,1736,489,743,1539,1681,683,1412,1418,312,2778,2778,1975,1975,803,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2824,1183,2201,278,241,2230,1591,1648,1036,818,1321,1312,754,813,813,813,813,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1900,2506,952,1059,163,870,681,1235,1271,1188,2071,1705,1183,648,404,2,2,2,2,2,2,2,2,2236,2236,2,2,2,2,2,2,2},
+ {2662,1443,2327,132,490,1149,1572,744,429,621,1763,2383,1903,1246,964,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2673,2182,1307,1776,1233,1828,1828,340,249,216,503,160,160,582,926,2129,2129,2129,2129,2129,2129,2129,2129,2129,2129,2129,2129,2,1018,1018,1103,1103},
+ {2042,620,1074,2057,2758,859,815,1127,766,1693,252,808,981,416,416,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2102,881,2170,1673,705,101,58,1712,1568,214,758,488,1007,269,243,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2692,2665,961,1478,324,429,1311,376,1648,130,2083,1047,409,343,343,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2122,1087,563,1669,647,2996,151,2458,250,310,71,1348,355,965,2815,1333,1333,2,2,2,2,2218,2,2,2,2,2,2,2,2,2,2},
+ {1952,1968,2260,2945,2464,1055,2626,570,1316,1828,1828,970,970,221,220,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2072,1947,1779,254,2822,1552,855,804,3452,202,695,82,684,208,1270,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1947,1699,1341,486,1765,1960,264,899,1082,1674,987,1878,930,1008,930,930,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1953,1527,1643,591,1517,2427,1232,1555,2542,495,675,2534,2534,3106,83,3106,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2744,1728,2213,792,761,1667,1908,31,447,442,815,2865,762,762,762,762,2,2,2,2,2,2,2,2,2,2,2,2,649,649,649,2},
+ {2722,1406,1257,807,2191,3017,1330,1023,602,2124,794,530,733,733,1083,2528,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1963,1525,437,398,609,393,2420,3059,435,1251,1977,1672,450,1960,1954,1960,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2626,2468,2838,845,2060,218,1080,912,911,1973,1365,920,1316,1316,2,1316,1316,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2734,1727,1743,1026,809,1154,779,244,1238,1616,812,784,825,1810,1810,1810,1810,1559,1559,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2180,2262,1651,204,3193,2121,2725,1016,629,1834,603,2848,26,26,728,728,728,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2648,1328,2578,133,1377,105,2485,2139,323,1045,145,761,1201,1848,2,814,814,814,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2999,358,250,1379,102,2349,1491,2074,42,376,2811,1220,296,296,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2810,1274,499,742,1724,425,190,1561,1302,2603,2255,917,661,661,2,2,2,495,2,2,2,2,2,2,2,2,2,2575,2,2,2,2},
+ {2150,589,876,1616,2655,432,902,1028,433,1375,574,1400,1400,1400,2,2,2,2,2,1529,1529,1529,1529,1529,1529,1529,1529,1529,1529,1529,1529,1529},
+ {1665,1856,201,824,796,249,1217,590,1375,1175,1599,824,824,3319,2,2,2,601,1961,1961,2,2,2,1961,2,2,2,2,2,2,1961,2},
+ {2704,2239,1260,140,2161,2781,1840,574,2353,343,3218,61,2108,2038,1873,2,1833,1408,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2173,876,802,2197,3338,176,1783,224,1763,1160,1264,1264,2864,554,2,552,552,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2708,1663,2279,824,836,1598,2101,1620,1202,1606,1368,1079,1167,1999,2848,2848,2848,1101,1101,1101,2,2,2,662,2,2,2,2272,2,2,2,2},
+ {1987,1463,2328,1890,1443,2086,283,2895,522,1577,1514,1657,2605,891,2,1181,1181,2,2,2121,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2173,1637,1139,905,1802,1378,296,439,1507,1017,1427,209,708,462,1508,1508,1508,2,2,2,2,2,2,2,2,2,2,2240,2240,1459,1459,1459},
+ {2206,1526,628,2877,802,2587,1253,1258,1044,2195,3246,40,2898,2898,1704,598,2,2145,2,2,2,2145,2,2,2,2,2,2,2,2,2,2},
+ {2182,618,1022,1433,1138,1580,2590,149,796,2090,743,294,294,1117,720,3003,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2025,1805,1466,1213,2006,1903,568,1700,1355,865,1783,1006,1006,1070,1070,268,2,2,2,2,2388,2388,845,845,845,2,2,2,2,2,2,2},
+ {2185,1038,3050,1461,2270,2159,958,1637,233,2483,525,987,437,437,437,3065,2,2,2160,2160,2,2,2,2,2,2,2,2,2,2,2160,2160},
+ {2083,1465,847,1450,502,447,2168,794,1761,1324,162,188,2853,2853,636,973,2,563,2,2,2,2,2,2,2,2089,2089,2089,2089,2089,2,2},
+ {2923,2303,203,508,472,648,3169,269,515,3147,2415,1700,1700,1700,1461,1461,1461,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2300,1116,1555,2794,1095,998,1999,894,963,753,324,2130,2675,2675,554,2045,2,2,2,2,2,2,2,2130,2130,2130,2,2,2,2,2,2},
+ {2103,768,702,1548,1486,2228,2846,861,665,1497,1046,1046,2252,394,394,1901,1155,2,2,2,2,2,2,2,2,2,2,2,192,192,192,192},
+ {2923,640,661,2179,1207,182,872,171,738,269,1372,222,908,2069,2069,2,1550,516,2,2,2,2,2,2,2,2,2,2,1109,2,2,2},
+ {2833,2005,387,733,562,468,317,224,94,478,1606,2522,1606,2001,1087,2,2,1087,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2125,2479,1749,1226,1169,1681,459,652,1087,2211,1613,686,2213,1689,2446,2,2,2925,2925,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2953,1059,205,3093,138,132,2148,1345,1499,216,151,1296,2446,1610,1632,2,2,2,2,4,4,2,2,2,987,987,2,2,2,2,2,2},
+ {3199,1431,593,2050,2785,507,1540,1103,1740,459,62,1766,1781,1121,1600,2,1600,1600,125,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2258,1714,415,373,1919,2605,693,827,1918,496,1479,1903,86,1083,415,2,2,38,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3289,2032,329,2169,2323,1599,517,1704,1847,804,632,40,40,40,40,40,40,40,40,2,2,1600,2,2,1600,2,2,2,2,2,2,2},
+ {2165,2725,2293,368,705,3063,494,103,12,1332,175,2331,3144,2165,1709,1709,2090,2,2,2,2,1363,1363,2,566,2,2,2,2,2,2,2},
+ {2300,1070,2169,2540,734,1002,912,1386,2215,224,1285,880,2052,2052,1301,959,563,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3267,1852,1037,648,611,1250,432,853,1467,179,715,2,2033,841,2607,2607,2607,2607,2,2,2,2,1874,1874,2,1874,899,2,2,2,2,2},
+ {2348,2565,794,859,1740,1596,532,462,457,1014,1227,2,2761,954,249,249,2,458,458,2,2,2,2,2,909,909,2,2,2,2,2,2},
+ {3038,2399,1450,1276,1222,727,552,646,1055,2351,686,63,252,504,3166,1802,2,2,1165,1165,1165,2,2,2,2,1165,1165,1165,2,2,1165,2},
+ {3038,2519,1494,107,2597,802,535,1669,1695,1928,1940,1580,1580,85,2274,1551,2,2,2431,560,560,560,2,2,1098,2,2,2,2,2,2,2},
+ {3040,1044,1927,1952,1479,3124,1373,1990,588,2550,1277,2,629,2671,1842,2712,840,1702,2,1669,2,1347,2,2,2,2,1669,1669,1669,1669,2,1669},
+ {3056,1567,691,1243,653,751,248,842,1954,480,458,2,2,2451,934,3172,3556,2259,2312,2,2562,2562,2,2,2562,2562,2562,2562,2562,2,2,2},
+ {2959,2553,1333,877,2492,3169,2498,686,2030,2820,3233,1313,1313,1471,1471,1471,1471,2,2,1471,1471,2,2,1481,2,1887,2,2,2,2,2,2},
+ {3398,964,862,301,1705,2002,310,644,144,1091,1507,2,2,2460,496,496,2517,2517,1842,2,2,1964,2,2,2,2,2,1676,2,2,2,2},
+ {2379,3034,166,302,2108,1078,2976,68,158,134,1567,2,2,1514,1514,1514,1883,1883,2,2,1883,1883,1883,1883,1883,1883,1883,1883,1883,2,2,2},
+ {2386,1270,1204,1032,1474,224,496,2296,1536,1219,311,2,2,2,2,1238,2108,2108,2108,2108,2108,2108,2108,2108,1444,1444,1444,1444,1444,1444,1444,2},
+ {2431,739,2488,1386,1632,2107,2602,2139,1751,349,3147,2,2,64,16,8,32,4,4,32,728,728,728,728,2,2,64,16,8,180,180,180},
+ {3405,2142,1621,110,2112,2097,807,740,747,282,372,2,2,2,2,2493,2493,2493,1299,2,132,1872,2,1843,2,2,2,2,2,2,2,2},
+ {3157,1230,685,1513,663,1335,2100,1441,1826,1670,1539,2,2,2,2899,2899,1378,54,2,46,46,2,2,1362,1362,2,2,2,2,2,2,2},
+ {2415,822,3658,449,1980,891,129,823,1787,621,514,2668,2668,2668,2668,2668,666,269,2830,2,2,2,2,241,370,370,370,370,2,2,2,2},
+ {2463,2664,2825,1208,882,629,428,428,356,343,1730,2,769,769,769,1714,769,2,2,955,769,2,2,955,955,955,2,2,2,955,955,955},
+ {2447,1588,1077,831,1413,2362,1499,1812,1112,815,129,1034,1034,1867,194,518,1454,723,723,1251,2,160,2,2,1251,1251,2,2,2,2,2,2},
+ {3094,1638,1514,843,1503,1884,1481,727,723,1319,226,2,676,2401,1699,562,639,639,1176,2,2,2,2,824,2,2,2,2,2,2,2,2},
+ {3125,2004,547,2986,2919,471,948,1747,201,1862,802,2,1238,1277,1277,1277,2,2,1245,1245,1245,2,2,2743,1245,1245,2,2,2,2,2,2},
+ {2582,2469,533,1726,1575,1505,2448,2031,1257,427,588,1633,202,3553,1938,672,195,195,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2378,636,1958,1628,1255,2285,2208,1626,719,2944,1086,1436,1436,1719,2111,655,2637,2637,2,2,2,2637,2637,2,2637,2637,2637,2637,2637,2,2637,2637},
+ {2372,3079,2161,515,368,847,955,1257,1937,315,2666,1938,1723,1252,1252,362,362,2,2205,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2518,2060,1055,362,1455,1899,1105,1560,2237,2451,2080,181,2346,181,1829,1829,1829,2,2,1509,1509,1509,2,1509,2,2,2,2,2,2,2,2},
+ {3580,1671,674,1838,814,1409,323,3021,1047,2579,2579,2968,2968,102,2656,2638,2638,4006,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3194,1576,1084,859,2879,1600,953,1429,471,867,1105,1490,293,293,293,2,2,198,2619,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3215,2004,3333,2271,3283,1660,2135,1696,1413,1362,834,253,253,253,3802,2,2,2,1881,690,690,2,2,2,1881,1881,1881,1881,1881,2,1881,1881},
+ {3719,2441,2094,1665,1707,1827,1310,230,1635,143,386,1029,1070,1062,1062,2,1062,1062,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3249,1309,1232,472,711,2557,1479,1027,145,489,1377,2928,2928,3522,3522,3522,968,415,415,2,2,2,2,1332,1332,1332,2,1332,2891,2,1332,2891},
+ {2462,1962,257,2244,1966,1905,204,262,799,319,752,1696,971,971,3781,1426,1426,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3434,3131,1399,3413,1533,281,3288,1242,810,135,2506,2506,1742,946,1015,1044,1044,1044,2,2,2,2,1044,1837,1837,1837,1837,1837,2,2,2,2},
+ {2518,1200,631,596,1946,365,2960,413,592,3878,242,2714,2364,1402,1402,2322,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3362,2012,1759,2002,1365,150,3120,471,1590,3246,1296,196,196,196,2984,2323,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {3382,899,3140,2860,1155,1840,2822,355,1753,1856,1018,822,52,52,52,1102,1102,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2728,1334,274,1330,2674,2614,931,2250,883,1506,2193,1345,1089,500,2,219,390,2,2,2,2,2,2,2,390,2,2,2,2,2,2,2},
+ {3911,3343,202,675,1733,71,166,176,1323,2864,899,2155,1108,2172,2,2,1829,2172,1107,2,2,2,2,1107,1107,1107,2,2,2,1107,2,2},
+ {2757,3466,1411,1168,340,2760,1053,524,53,2090,1227,26,260,830,2,2,2,1139,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {2662,902,2371,1920,1097,1476,1008,1012,3556,468,3374,2560,591,1446,2,298,298,149,149,149,149,149,3135,3135,3135,3135,3135,2,2,2,2,2},
+ {2861,1407,1848,245,2186,1209,164,2577,625,132,657,2333,2333,2213,2213,2213,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2}
+};
Index: trunk/cuba/src/divonne/Divonne.c
===================================================================
--- trunk/cuba/src/divonne/Divonne.c (revision 158)
+++ trunk/cuba/src/divonne/Divonne.c (revision 159)
@@ -1,159 +1,119 @@
/*
Divonne.c
Multidimensional integration by partitioning
originally by J.H. Friedman and M.H. Wright
(CERNLIB subroutine D151)
this version by Thomas Hahn
- last modified 15 Feb 11 th
+ last modified 22 Jul 14 th
*/
-#include "decl.h"
-
-#define Print(s) puts(s); fflush(stdout)
-
-/*********************************************************************/
-
-static inline void DoSample(This *t, number n, ccount ldx, creal *x, real *f)
-{
- t->neval += n;
- while( n-- ) {
- if( t->integrand(&t->ndim, x, &t->ncomp, f, t->userdata, &t->phase) == ABORT )
- longjmp(t->abort, -99);
- x += ldx;
- f += t->ncomp;
- }
-}
+#define DIVONNE
+#define ROUTINE "Divonne"
-/*********************************************************************/
-
-static inline count SampleExtra(This *t, cBounds *b)
-{
- number n = t->nextra;
- t->peakfinder(&t->ndim, b, &n, t->xextra);
- DoSample(t, n, t->ldxgiven, t->xextra, t->fextra);
- return n;
-}
-
-/*********************************************************************/
-
-static inline void AllocGiven(This *t, creal *xgiven)
-{
- if( t->ngiven | t->nextra ) {
- cnumber nxgiven = t->ngiven*(t->ldxgiven = IMax(t->ldxgiven, t->ndim));
- cnumber nxextra = t->nextra*t->ldxgiven;
- cnumber nfgiven = t->ngiven*t->ncomp;
- cnumber nfextra = t->nextra*t->ncomp;
-
- Alloc(t->xgiven, nxgiven + nxextra + nfgiven + nfextra);
- t->xextra = t->xgiven + nxgiven;
- t->fgiven = t->xextra + nxextra;
- t->fextra = t->fgiven + nfgiven;
-
- if( nxgiven ) {
- t->phase = 0;
- Copy(t->xgiven, xgiven, nxgiven);
- DoSample(t, t->ngiven, t->ldxgiven, t->xgiven, t->fgiven);
- }
- }
-}
+#include "decl.h"
+#include "CSample.c"
/*********************************************************************/
-#include "common.c"
-
Extern void EXPORT(Divonne)(ccount ndim, ccount ncomp,
- Integrand integrand, void *userdata,
+ Integrand integrand, void *userdata, cnumber nvec,
creal epsrel, creal epsabs,
cint flags, cint seed,
cnumber mineval, cnumber maxeval,
cint key1, cint key2, cint key3, ccount maxpass,
creal border, creal maxchisq, creal mindeviation,
- cnumber ngiven, ccount ldxgiven, creal *xgiven,
+ cnumber ngiven, ccount ldxgiven, real *xgiven,
cnumber nextra, PeakFinder peakfinder,
+ cchar *statefile, Spin **pspin,
int *pnregions, number *pneval, int *pfail,
real *integral, real *error, real *prob)
{
This t;
+
+ VerboseInit();
+
t.ndim = ndim;
t.ncomp = ncomp;
t.integrand = integrand;
t.userdata = userdata;
+ t.nvec = nvec;
t.epsrel = epsrel;
t.epsabs = epsabs;
- t.flags = flags;
+ t.flags = MaxVerbose(flags);
t.seed = seed;
t.mineval = mineval;
t.maxeval = maxeval;
t.key1 = key1;
t.key2 = key2;
t.key3 = key3;
t.maxpass = maxpass;
t.border.upper = 1 - (t.border.lower = border);
t.maxchisq = maxchisq;
t.mindeviation = mindeviation;
t.ngiven = ngiven;
- t.xgiven = NULL;
+ t.xgiven = xgiven;
t.ldxgiven = ldxgiven;
t.nextra = nextra;
t.peakfinder = peakfinder;
- t.nregions = 0;
- t.neval = 0;
-
- AllocGiven(&t, xgiven);
+ t.statefile = statefile;
+ FORK_ONLY(t.spin = Invalid(pspin) ? NULL : *pspin;)
*pfail = Integrate(&t, integral, error, prob);
*pnregions = t.nregions;
*pneval = t.neval;
- free(t.xgiven);
+ WaitCores(&t, pspin);
}
/*********************************************************************/
Extern void EXPORT(divonne)(ccount *pndim, ccount *pncomp,
- Integrand integrand, void *userdata,
+ Integrand integrand, void *userdata, cnumber *pnvec,
creal *pepsrel, creal *pepsabs,
cint *pflags, cint *pseed,
cnumber *pmineval, cnumber *pmaxeval,
cint *pkey1, cint *pkey2, cint *pkey3, ccount *pmaxpass,
creal *pborder, creal *pmaxchisq, creal *pmindeviation,
- cnumber *pngiven, ccount *pldxgiven, creal *xgiven,
+ cnumber *pngiven, ccount *pldxgiven, real *xgiven,
cnumber *pnextra, PeakFinder peakfinder,
+ cchar *statefile, Spin **pspin,
int *pnregions, number *pneval, int *pfail,
- real *integral, real *error, real *prob)
+ real *integral, real *error, real *prob, cint statefilelen)
{
This t;
+
+ VerboseInit();
+
t.ndim = *pndim;
t.ncomp = *pncomp;
t.integrand = integrand;
t.userdata = userdata;
+ t.nvec = *pnvec;
t.epsrel = *pepsrel;
t.epsabs = *pepsabs;
- t.flags = *pflags;
+ t.flags = MaxVerbose(*pflags);
t.seed = *pseed;
t.mineval = *pmineval;
t.maxeval = *pmaxeval;
t.key1 = *pkey1;
t.key2 = *pkey2;
t.key3 = *pkey3;
t.maxpass = *pmaxpass;
t.border.upper = 1 - (t.border.lower = *pborder);
t.maxchisq = *pmaxchisq;
t.mindeviation = *pmindeviation;
t.ngiven = *pngiven;
- t.xgiven = NULL;
+ t.xgiven = xgiven;
t.ldxgiven = *pldxgiven;
t.nextra = *pnextra;
t.peakfinder = peakfinder;
- t.nregions = 0;
- t.neval = 0;
-
- AllocGiven(&t, xgiven);
+ CString(t.statefile, statefile, statefilelen);
+ FORK_ONLY(t.spin = Invalid(pspin) ? NULL : *pspin;)
*pfail = Integrate(&t, integral, error, prob);
*pnregions = t.nregions;
*pneval = t.neval;
- free(t.xgiven);
+ WaitCores(&t, pspin);
}
Index: trunk/cuba/src/divonne/Rule.c
===================================================================
--- trunk/cuba/src/divonne/Rule.c (revision 158)
+++ trunk/cuba/src/divonne/Rule.c (revision 159)
@@ -1,689 +1,711 @@
/*
Rule.c
integration with cubature rules
code lifted with minor modifications from DCUHRE
by J. Berntsen, T. Espelid, and A. Genz
this file is part of Divonne
- last modified 16 Jun 10 th
+ last modified 7 May 15 th
*/
-enum { nrules = 5 };
-
-#define TYPEDEFSET \
- typedef struct { \
- count n; \
- real weight[1000], scale[1000], norm[1000]; \
- real gen[1000]; \
- } Set
- //#TT Used to be:
- // real weight[nrules], scale[nrules], norm[nrules]; \
- // real gen[NDIM]; \
-
-/*********************************************************************/
-
static void Rule13Alloc(This *t)
{
static creal w[][nrules] = {
{ .00844923090033615, .3213775489050763, .3372900883288987,
-.8264123822525677, .6539094339575232 },
{ .023771474018994404, -.1767341636743844, -.1644903060344491,
.306583861409436, -.2041614154424632},
{ .02940016170142405, .07347600537466073, .07707849911634623,
.002389292538329435, -.174698151579499 },
{ .006644436465817374, -.03638022004364754, -.03804478358506311,
-.1343024157997222, .03937939671417803 },
{ .0042536044255016, .021252979220987123, .02223559940380806,
.08833366840533902, .006974520545933992 },
{ 0, .1460984204026913, .1480693879765931,
0, 0 },
{ .0040664827465935255, .017476132861520992, 4.467143702185815e-6,
.0009786283074168292, .0066677021717782585 },
{ .03362231646315497, .1444954045641582, .150894476707413,
-.1319227889147519, .05512960621544304 },
{ .033200804136503725, .0001307687976001325, 3.6472001075162155e-5,
.00799001220015063, .05443846381278608 },
{ .014093686924979677, .0005380992313941161, .000577719899901388,
.0033917470797606257, .02310903863953934 },
{ .000977069770327625, .0001042259576889814, .0001041757313688177,
.0022949157182832643, .01506937747477189 },
{ .007531996943580376, -.001401152865045733, -.001452822267047819,
-.01358584986119197, -.060570216489018905 },
{ .02577183086722915, .008041788181514763, .008338339968783704,
.04025866859057809, .04225737654686337},
{ .015625, -.1420416552759383, -.147279632923196,
.003760268580063992, .02561989142123099 }
};
static creal g[] = {
.12585646717265545, .3506966822267133,
.4795480315809981, .4978005239276064,
.25, .07972723291487795,
.1904495567970094, .3291384627633596,
.43807365825146577, .499121592026599,
.4895111329084231, .32461421628226944,
.43637106005656195, .1791307322940614,
.2833333333333333, .1038888888888889 };
enum { nsets = 14, ndim = 2 };
- TYPEDEFSET;
-
count n, r;
Set *first, *last, *s, *x;
+ csize_t setsize = SetSize;
- Alloc(first, nsets);
- Clear(first, nsets);
+ Die(first = calloc(nsets, setsize));
last = first;
n = last->n = 1;
Copy(last->weight, w[0], nrules);
- ++last;
+ NextSet(last);
n += last->n = 2*ndim;
Copy(last->weight, w[1], nrules);
last->gen[0] = g[0];
- ++last;
+ NextSet(last);
n += last->n = 2*ndim;
Copy(last->weight, w[2], nrules);
last->gen[0] = g[1];
- ++last;
+ NextSet(last);
n += last->n = 2*ndim;
Copy(last->weight, w[3], nrules);
last->gen[0] = g[2];
- ++last;
+ NextSet(last);
n += last->n = 2*ndim;
Copy(last->weight, w[4], nrules);
last->gen[0] = g[3];
- ++last;
+ NextSet(last);
n += last->n = 2*ndim;
Copy(last->weight, w[5], nrules);
last->gen[0] = g[4];
- ++last;
+ NextSet(last);
n += last->n = 2*ndim*(ndim - 1);
Copy(last->weight, w[6], nrules);
last->gen[0] = g[5];
last->gen[1] = g[5];
- ++last;
+ NextSet(last);
n += last->n = 2*ndim*(ndim - 1);
Copy(last->weight, w[7], nrules);
last->gen[0] = g[6];
last->gen[1] = g[6];
- ++last;
+ NextSet(last);
n += last->n = 2*ndim*(ndim - 1);
Copy(last->weight, w[8], nrules);
last->gen[0] = g[7];
last->gen[1] = g[7];
- ++last;
+ NextSet(last);
n += last->n = 2*ndim*(ndim - 1);
Copy(last->weight, w[9], nrules);
last->gen[0] = g[8];
last->gen[1] = g[8];
- ++last;
+ NextSet(last);
n += last->n = 2*ndim*(ndim - 1);
Copy(last->weight, w[10], nrules);
last->gen[0] = g[9];
last->gen[1] = g[9];
- ++last;
+ NextSet(last);
n += last->n = 4*ndim*(ndim - 1);
Copy(last->weight, w[11], nrules);
last->gen[0] = g[10];
last->gen[1] = g[11];
- ++last;
+ NextSet(last);
n += last->n = 4*ndim*(ndim - 1);
Copy(last->weight, w[12], nrules);
last->gen[0] = g[12];
last->gen[1] = g[13];
- ++last;
+ NextSet(last);
n += last->n = 4*ndim*(ndim - 1);
Copy(last->weight, w[13], nrules);
last->gen[0] = g[14];
last->gen[1] = g[15];
t->rule13.first = first;
t->rule13.last = last;
t->rule13.errcoeff[0] = 10;
t->rule13.errcoeff[1] = 1;
t->rule13.errcoeff[2] = 5;
t->rule13.n = n;
- for( s = first; s <= last; ++s )
+ for( s = first; s <= last; NextSet(s) )
for( r = 1; r < nrules - 1; ++r ) {
creal scale = (s->weight[r] == 0) ? 100 :
-s->weight[r + 1]/s->weight[r];
real sum = 0;
- for( x = first; x <= last; ++x )
- sum += x->n*fabs(x->weight[r + 1] + scale*x->weight[r]);
+ for( x = first; x <= last; NextSet(x) )
+ sum += x->n*fabsx(x->weight[r + 1] + scale*x->weight[r]);
s->scale[r] = scale;
s->norm[r] = 1/sum;
}
}
/*********************************************************************/
static void Rule11Alloc(This *t)
{
static creal w[][nrules] = {
{ .0009903847688882167, 1.715006248224684, 1.936014978949526,
.517082819560576, 2.05440450381852 },
{ .0084964717409851, -.3755893815889209, -.3673449403754268,
.01445269144914044, .013777599884901202 },
{ .00013587331735072814, .1488632145140549, .02929778657898176,
-.3601489663995932, -.576806291790441 },
{ .022982920777660364, -.2497046640620823, -.1151883520260315,
.3628307003418485, .03726835047700328 },
{ .004202649722286289, .1792501419135204, .05086658220872218,
.007148802650872729, .0068148789397772195 },
{ .0012671889041675774, .0034461267589738897, .04453911087786469,
-.09222852896022966, .057231697338518496 },
{ .0002109560854981544, -.005140483185555825, -.022878282571259,
.01719339732471725, -.044930187438112855 },
{ .016830857056410086, .006536017839876424, .02908926216345833,
-.102141653746035, .027292365738663484 },
{ .00021876823557504823, -.00065134549392297, -.002898884350669207,
-.007504397861080493, .000354747395055699 },
{ .009690420479796819, -.006304672433547204, -.028059634133074954,
.01648362537726711, .01571366799739551 },
{ .030773311284628138, .01266959399788263, .05638741361145884,
.05234610158469334, .049900992192785674 },
{ .0084974310856038, -.005454241018647931, -.02427469611942451,
.014454323316130661, .0137791555266677 },
{ .0017749535291258914, .004826995274768427, .021483070341828822,
.003019236275367777, .0028782064230998723 }
};
static creal g[] = {
.095, .25,
.375, .4,
.4975, .49936724991757,
.38968518428362114, .49998494965443835,
.3951318612385894, .22016983438253684,
.4774686911397297, .2189239229503431,
.4830546566815374, .2288552938881567 };
enum { nsets = 13, ndim = 3 };
- TYPEDEFSET;
-
count n, r;
Set *first, *last, *s, *x;
+ csize_t setsize = SetSize;
- Alloc(first, nsets);
- Clear(first, nsets);
+ Die(first = calloc(nsets, setsize));
last = first;
n = last->n = 1;
Copy(last->weight, w[0], nrules);
- ++last;
+ NextSet(last);
n += last->n = 2*ndim;
Copy(last->weight, w[1], nrules);
last->gen[0] = g[0];
- ++last;
+ NextSet(last);
n += last->n = 2*ndim;
Copy(last->weight, w[2], nrules);
last->gen[0] = g[1];
- ++last;
+ NextSet(last);
n += last->n = 2*ndim;
Copy(last->weight, w[3], nrules);
last->gen[0] = g[2];
- ++last;
+ NextSet(last);
n += last->n = 2*ndim;
Copy(last->weight, w[4], nrules);
last->gen[0] = g[3];
- ++last;
+ NextSet(last);
n += last->n = 2*ndim;
Copy(last->weight, w[5], nrules);
last->gen[0] = g[4];
- ++last;
+ NextSet(last);
n += last->n = 2*ndim*(ndim - 1);
Copy(last->weight, w[6], nrules);
last->gen[0] = g[5];
last->gen[1] = g[5];
- ++last;
+ NextSet(last);
n += last->n = 2*ndim*(ndim - 1);
Copy(last->weight, w[7], nrules);
last->gen[0] = g[6];
last->gen[1] = g[6];
- ++last;
+ NextSet(last);
n += last->n = 4*ndim*(ndim - 1)*(ndim - 2)/3;
Copy(last->weight, w[8], nrules);
last->gen[0] = g[7];
last->gen[1] = g[7];
last->gen[2] = g[7];
- ++last;
+ NextSet(last);
n += last->n = 4*ndim*(ndim - 1)*(ndim - 2)/3;
Copy(last->weight, w[9], nrules);
last->gen[0] = g[8];
last->gen[1] = g[8];
last->gen[2] = g[8];
- ++last;
+ NextSet(last);
n += last->n = 4*ndim*(ndim - 1)*(ndim - 2)/3;
Copy(last->weight, w[10], nrules);
last->gen[0] = g[9];
last->gen[1] = g[9];
last->gen[2] = g[9];
- ++last;
+ NextSet(last);
n += last->n = 4*ndim*(ndim - 1)*(ndim - 2);
Copy(last->weight, w[11], nrules);
last->gen[0] = g[10];
last->gen[1] = g[11];
last->gen[2] = g[11];
- ++last;
+ NextSet(last);
n += last->n = 4*ndim*(ndim - 1)*(ndim - 2);
Copy(last->weight, w[12], nrules);
last->gen[0] = g[12];
last->gen[1] = g[12];
last->gen[2] = g[13];
t->rule11.first = first;
t->rule11.last = last;
t->rule11.errcoeff[0] = 4;
t->rule11.errcoeff[1] = .5;
t->rule11.errcoeff[2] = 3;
t->rule11.n = n;
- for( s = first; s <= last; ++s )
+ for( s = first; s <= last; NextSet(s) )
for( r = 1; r < nrules - 1; ++r ) {
creal scale = (s->weight[r] == 0) ? 100 :
-s->weight[r + 1]/s->weight[r];
real sum = 0;
- for( x = first; x <= last; ++x )
- sum += x->n*fabs(x->weight[r + 1] + scale*x->weight[r]);
+ for( x = first; x <= last; NextSet(x) )
+ sum += x->n*fabsx(x->weight[r + 1] + scale*x->weight[r]);
s->scale[r] = scale;
s->norm[r] = 1/sum;
}
}
/*********************************************************************/
static void Rule9Alloc(This *t)
{
static creal w[] = {
- -.0023611709677855117884, .11415390023857325268,
- -.63833920076702389094, .74849988504685208004,
- -.0014324017033399125142, .057471507864489725949,
- -.14225104571434243234, -.062875028738286979989,
- .254591133248959089, -1.207328566678236261,
- .89567365764160676508, -.36479356986049146661,
- .0035417564516782676826, -.072609367395893679605,
- .10557491625218991012, .0021486025550098687713,
- -.032268563892953949998, .010636783990231217481,
- .014689102496143490175, .51134708346467591431,
- .45976448120806344646, .18239678493024573331,
- -.04508628929435784076, .21415883524352793401,
- -.027351546526545644722, .054941067048711234101,
- .11937596202570775297, .65089519391920250593,
- .14744939829434460168, .057693384490973483573,
- .034999626602143583822, -1.3868627719278281436,
- -.2386668732575008879, .015532417276607053264,
- .0035328099607090870236, .09231719987444221619,
- .02254314464717892038, .013675773263272822361,
- -.32544759695960125297, .0017708782258391338413,
- .0010743012775049343856, .25150011495314791996 };
+ RC(-.002361170967785511788400941242259231309691),
+ RC(.1141539002385732526821323741697655347686),
+ RC(-.6383392007670238909386026193674701393074),
+ RC(.7484998850468520800423030047583803945205),
+ RC(-.001432401703339912514196154599769007103671),
+ RC(.05747150786448972594860897296200006759892),
+ RC(-.1422510457143424323449521620935950679394),
+ RC(-.06287502873828697998942424881040490136987),
+ RC(.2545911332489590890011611142429070613156),
+ RC(-1.207328566678236261002219995185143356737),
+ RC(.8956736576416067650809467826488567200939),
+ RC(-.3647935698604914666100134551377381205297),
+ RC(.003541756451678267682601411863388846964536),
+ RC(-.07260936739589367960492815865074633743652),
+ RC(.1055749162521899101218622863269817454540),
+ RC(.002148602555009868771294231899653510655506),
+ RC(-.03226856389295394999786630399875134318006),
+ RC(.01063678399023121748083624225818915724455),
+ RC(.01468910249614349017540783437728097691502),
+ RC(.5113470834646759143109387357149329909126),
+ RC(.4597644812080634464633352781605214342691),
+ RC(.1823967849302457333050067275688690602649),
+ RC(-.04508628929435784075980562738240804429658),
+ RC(.2141588352435279340097929526588394300172),
+ RC(-.02735154652654564472203690086290223507436),
+ RC(.05494106704871123410060080562462135546101),
+ RC(.1193759620257077529708962121565290178730),
+ RC(.6508951939192025059314756320878023215278),
+ RC(.1474493982943446016775696826942585013243),
+ RC(.05769338449097348357291272840392627722165),
+ RC(.03499962660214358382244159694487155861542),
+ RC(-1.386862771927828143599782668709014266770),
+ RC(-.2386668732575008878964134721962088068396),
+ RC(.01553241727660705326386197156586357005224),
+ RC(.003532809960709087023561817517751309380604),
+ RC(.09231719987444221619017126187763868745587),
+ RC(.02254314464717892037990281369120402214829),
+ RC(.01367577326327282236101845043145111753718),
+ RC(-.3254475969596012529657378160439011607639),
+ RC(.001770878225839133841300705931694423482268),
+ RC(.001074301277504934385647115949826755327753),
+ RC(.2515001149531479199576969952416196054795) };
static creal g[] = {
- .47795365790226950619, .20302858736911986780,
- .44762735462617812882, .125,
- .34303789878087814570 };
+ RC(.4779536579022695061928604197171830064732),
+ RC(.2030285873691198677998034402373279133258),
+ RC(.4476273546261781288207704806530998539285),
+ RC(.125),
+ RC(.3430378987808781457001426145164678603407) };
enum { nsets = 9 };
- TYPEDEFSET;
-
ccount ndim = t->ndim;
ccount twondim = 1 << ndim;
count dim, n, r;
Set *first, *last, *s, *x;
+ csize_t setsize = SetSize;
- Alloc(first, nsets);
- Clear(first, nsets);
+ Die(first = calloc(nsets, setsize));
last = first;
n = last->n = 1;
last->weight[0] = ndim*(ndim*(ndim*w[0] + w[1]) + w[2]) + w[3];
last->weight[1] = ndim*(ndim*(ndim*w[4] + w[5]) + w[6]) - w[7];
last->weight[2] = ndim*w[8] - last->weight[1];
last->weight[3] = ndim*(ndim*w[9] + w[10]) - 1 + last->weight[0];
last->weight[4] = ndim*w[11] + 1 - last->weight[0];
- ++last;
+ NextSet(last);
n += last->n = 2*ndim;
last->weight[0] = ndim*(ndim*w[12] + w[13]) + w[14];
last->weight[1] = ndim*(ndim*w[15] + w[16]) + w[17];
last->weight[2] = w[18] - last->weight[1];
last->weight[3] = ndim*w[19] + w[20] + last->weight[0];
last->weight[4] = w[21] - last->weight[0];
last->gen[0] = g[0];
- ++last;
+ NextSet(last);
n += last->n = 2*ndim;
last->weight[0] = ndim*w[22] + w[23];
last->weight[1] = ndim*w[24] + w[25];
last->weight[2] = w[26] - last->weight[1];
last->weight[3] = ndim*w[27] + w[28];
last->weight[4] = -last->weight[0];
last->gen[0] = g[1];
- ++last;
+ NextSet(last);
n += last->n = 2*ndim;
last->weight[0] = w[29];
last->weight[1] = w[30];
last->weight[2] = -w[29];
last->weight[3] = w[31];
last->weight[4] = -w[29];
last->gen[0] = g[2];
- ++last;
+ NextSet(last);
n += last->n = 2*ndim;
last->weight[2] = w[32];
last->gen[0] = g[3];
- ++last;
+ NextSet(last);
n += last->n = 2*ndim*(ndim - 1);
last->weight[0] = w[33] - ndim*w[12];
last->weight[1] = w[34] - ndim*w[15];
last->weight[2] = -last->weight[1];
last->weight[3] = w[35] + last->weight[0];
last->weight[4] = -last->weight[0];
last->gen[0] = g[0];
last->gen[1] = g[0];
- ++last;
+ NextSet(last);
n += last->n = 4*ndim*(ndim - 1);
last->weight[0] = w[36];
last->weight[1] = w[37];
last->weight[2] = -w[37];
last->weight[3] = w[38];
last->weight[4] = -w[36];
last->gen[0] = g[0];
last->gen[1] = g[1];
- ++last;
+ NextSet(last);
n += last->n = 4*ndim*(ndim - 1)*(ndim - 2)/3;
last->weight[0] = w[39];
last->weight[1] = w[40];
last->weight[2] = -w[40];
last->weight[3] = w[39];
last->weight[4] = -w[39];
last->gen[0] = g[0];
last->gen[1] = g[0];
last->gen[2] = g[0];
- ++last;
+ NextSet(last);
n += last->n = twondim;
last->weight[0] = w[41]/twondim;
last->weight[1] = w[7]/twondim;
last->weight[2] = -last->weight[1];
last->weight[3] = last->weight[0];
last->weight[4] = -last->weight[0];
for( dim = 0; dim < ndim; ++dim )
last->gen[dim] = g[4];
t->rule9.first = first;
t->rule9.last = last;
t->rule9.errcoeff[0] = 5;
t->rule9.errcoeff[1] = 1;
t->rule9.errcoeff[2] = 5;
t->rule9.n = n;
- for( s = first; s <= last; ++s )
+ for( s = first; s <= last; NextSet(s) )
for( r = 1; r < nrules - 1; ++r ) {
creal scale = (s->weight[r] == 0) ? 100 :
-s->weight[r + 1]/s->weight[r];
real sum = 0;
- for( x = first; x <= last; ++x )
- sum += x->n*fabs(x->weight[r + 1] + scale*x->weight[r]);
+ for( x = first; x <= last; NextSet(x) )
+ sum += x->n*fabsx(x->weight[r + 1] + scale*x->weight[r]);
s->scale[r] = scale;
s->norm[r] = 1/sum;
}
}
/*********************************************************************/
static void Rule7Alloc(This *t)
{
static creal w[] = {
- .019417866674748388428, -.40385257701150182546,
- .64485668767465982223, .01177982690775806141,
- -.18041318740733609012, -.088785828081335044443,
- .056328645808285941374, -.0097089333373741942142,
- -.99129176779582358138, -.17757165616267008889,
- .12359398032043233572, .074978148702033690681,
- .55489147051423559776, .088041241522692771226,
- .021118358455513385083, -.0099302203239653333087,
- -.064100053285010904179, .030381729038221007659,
- .0058899134538790307051, -.0048544666686870971071,
- .35514331232534017777 };
+ RC(.01941786667474838842844534313920462333850),
+ RC(-.4038525770115018254611834753723880293161),
+ RC(.6448566876746598222277360730193089551024),
+ RC(.01177982690775806141012214458820955067854),
+ RC(-.1804131874073360901182293138710989490609),
+ RC(-.08878582808133504444306598174517276122439),
+ RC(.05632864580828594137378124255408286479947),
+ RC(-.009708933337374194214222671569602311669249),
+ RC(-.9912917677958235813775106862002319060386),
+ RC(-.1775716561626700888861319634903455224488),
+ RC(.1235939803204323357183625846672135876752),
+ RC(.07497814870203369068087999555157339703666),
+ RC(.5548914705142355977605994477355651401434),
+ RC(.08804124152269277122645182458858273865209),
+ RC(.02111835845551338508329573367808085283304),
+ RC(-.009930220323965333308685820460105538586058),
+ RC(-.06410005328501090417895544042025034295870),
+ RC(.03038172903822100765927778829870429682489),
+ RC(.005889913453879030705061072294104775339268),
+ RC(-.004854466668687097107111335784801155834624),
+ RC(.3551433123253401777722639269806910448976) };
static creal g[] = {
- .47795365790226950619, .20302858736911986780,
- .375, .34303789878087814570 };
+ RC(.4779536579022695061928604197171830064732),
+ RC(.2030285873691198677998034402373279133258),
+ RC(.375),
+ RC(.3430378987808781457001426145164678603407) };
enum { nsets = 6 };
- TYPEDEFSET;
-
ccount ndim = t->ndim;
ccount twondim = 1 << ndim;
count dim, n, r;
Set *first, *last, *s, *x;
+ csize_t setsize = SetSize;
- Alloc(first, nsets);
- Clear(first, nsets);
+ Die(first = calloc(nsets, setsize));
last = first;
n = last->n = 1;
last->weight[0] = ndim*(ndim*w[0] + w[1]) + w[2];
last->weight[1] = ndim*(ndim*w[3] + w[4]) - w[5];
last->weight[2] = ndim*w[6] - last->weight[1];
last->weight[3] = ndim*(ndim*w[7] + w[8]) - w[9];
last->weight[4] = 1 - last->weight[0];
- ++last;
+ NextSet(last);
n += last->n = 2*ndim;
last->weight[0] = w[10];
last->weight[1] = w[11];
last->weight[2] = -w[10];
last->weight[3] = w[12];
last->weight[4] = -w[10];
last->gen[0] = g[1];
- ++last;
+ NextSet(last);
n += last->n = 2*ndim;
last->weight[0] = w[13] - ndim*w[0];
last->weight[1] = w[14] - ndim*w[3];
last->weight[2] = w[15] - last->weight[1];
last->weight[3] = w[16] - ndim*w[7];
last->weight[4] = -last->weight[0];
last->gen[0] = g[0];
- ++last;
+ NextSet(last);
n += last->n = 2*ndim;
last->weight[2] = w[17];
last->gen[0] = g[2];
- ++last;
+ NextSet(last);
n += last->n = 2*ndim*(ndim - 1);
last->weight[0] = -w[7];
last->weight[1] = w[18];
last->weight[2] = -w[18];
last->weight[3] = w[19];
last->weight[4] = w[7];
last->gen[0] = g[0];
last->gen[1] = g[0];
- ++last;
+ NextSet(last);
n += last->n = twondim;
last->weight[0] = w[20]/twondim;
last->weight[1] = w[5]/twondim;
last->weight[2] = -last->weight[1];
last->weight[3] = w[9]/twondim;
last->weight[4] = -last->weight[0];
for( dim = 0; dim < ndim; ++dim )
last->gen[dim] = g[3];
t->rule7.first = first;
t->rule7.last = last;
t->rule7.errcoeff[0] = 5;
t->rule7.errcoeff[1] = 1;
t->rule7.errcoeff[2] = 5;
t->rule7.n = n;
- for( s = first; s <= last; ++s )
+ for( s = first; s <= last; NextSet(s) )
for( r = 1; r < nrules - 1; ++r ) {
creal scale = (s->weight[r] == 0) ? 100 :
-s->weight[r + 1]/s->weight[r];
real sum = 0;
- for( x = first; x <= last; ++x )
- sum += x->n*fabs(x->weight[r + 1] + scale*x->weight[r]);
+ for( x = first; x <= last; NextSet(x) )
+ sum += x->n*fabsx(x->weight[r + 1] + scale*x->weight[r]);
s->scale[r] = scale;
s->norm[r] = 1/sum;
}
}
/*********************************************************************/
-static inline void RuleIni(Rule *rule)
+static inline void RuleAlloc(This *t)
{
- rule->first = NULL;
+ if( (t->ndim - 2) | (t->key1 - 13)*(t->key2 - 13)*(t->key3 - 13) )
+ t->rule13.first = NULL;
+ else Rule13Alloc(t);
+
+ if( (t->ndim - 3) | (t->key1 - 11)*(t->key2 - 11)*(t->key3 - 11) )
+ t->rule11.first = NULL;
+ else Rule11Alloc(t);
+
+ if( (t->key1 - 9)*(t->key2 - 9)*(t->key3 - 9) )
+ t->rule9.first = NULL;
+ else Rule9Alloc(t);
+
+ if( (t->key1 - 7)*(t->key2 - 7)*(t->key3 - 7) )
+ t->rule7.first = NULL;
+ else Rule7Alloc(t);
}
/*********************************************************************/
-static inline bool RuleIniQ(Rule *rule)
+static inline void RuleFree(cThis *t)
{
- return rule->first == NULL;
-}
-
-/*********************************************************************/
-
-static inline void RuleFree(Rule *rule)
-{
- free(rule->first);
+ free(t->rule7.first);
+ free(t->rule9.first);
+ free(t->rule11.first);
+ free(t->rule13.first);
}
/*********************************************************************/
static real *ExpandFS(cThis *t, cBounds *b, real *g, real *x)
{
count dim, ndim = t->ndim;
next:
/* Compute centrally symmetric sum for permutation of G */
for( dim = 0; dim < ndim; ++dim )
*x++ = (.5 + g[dim])*b[dim].lower + (.5 - g[dim])*b[dim].upper;
for( dim = 0; dim < ndim; ) {
g[dim] = -g[dim];
if( g[dim++] < 0 ) goto next;
}
/* Find next distinct permutation of G and loop back for next sum.
Permutations are generated in reverse lexicographic order. */
for( dim = 1; dim < ndim; ++dim ) {
creal gd = g[dim];
if( g[dim - 1] > gd ) {
count i, j = dim, ix = dim, dx = dim - 1;
for( i = 0; i < --j; ++i ) {
creal tmp = g[i];
g[i] = g[j];
g[j] = tmp;
if( tmp <= gd ) --dx;
if( g[i] > gd ) ix = i;
}
if( g[dx] <= gd ) dx = ix;
g[dim] = g[dx];
g[dx] = gd;
goto next;
}
}
/* Restore original order to generators */
for( dim = 0; dim < --ndim; ++dim ) {
creal tmp = g[dim];
g[dim] = g[ndim];
g[ndim] = tmp;
}
return x;
}
/*********************************************************************/
-static void SampleRule(This *t, cSamples *samples, cBounds *b, creal vol)
+static void SampleRule(This *t, ccount iregion)
{
- TYPEDEFSET;
-
- real *x = samples->x, *f = samples->f;
- Set *first = (Set *)samples->rule->first;
- Set *last = (Set *)samples->rule->last;
+ SAMPLERDEFS;
+ Set *first = samples->rule->first;
+ Set *last = samples->rule->last;
Set *s;
creal *errcoeff = samples->rule->errcoeff;
- count comp, rul, n;
+ count comp, rul, sn;
+ csize_t setsize = SetSize;
- for( s = first; s <= last; ++s )
+ for( s = first; s <= last; NextSet(s) )
if( s->n ) x = ExpandFS(t, b, s->gen, x);
- DoSample(t, samples->n, t->ndim, samples->x, f);
+ DoSample(t, n, samples->x, f);
for( comp = 0; comp < t->ncomp; ++comp ) {
real sum[nrules];
creal *f1 = f++;
Zap(sum);
- for( s = first; s <= last; ++s )
- for( n = s->n; n; --n ) {
+ for( s = first; s <= last; NextSet(s) )
+ for( sn = s->n; sn; --sn ) {
creal fun = *f1;
f1 += t->ncomp;
for( rul = 0; rul < nrules; ++rul )
sum[rul] += fun*s->weight[rul];
}
/* Search for the null rule, in the linear space spanned by two
successive null rules in our sequence, which gives the greatest
error estimate among all normalized (1-norm) null rules in this
space. */
for( rul = 1; rul < nrules - 1; ++rul ) {
real maxerr = 0;
- for( s = first; s <= last; ++s )
+ for( s = first; s <= last; NextSet(s) )
maxerr = Max(maxerr,
- fabs(sum[rul + 1] + s->scale[rul]*sum[rul])*s->norm[rul]);
+ fabsx(sum[rul + 1] + s->scale[rul]*sum[rul])*s->norm[rul]);
sum[rul] = maxerr;
}
- samples->avg[comp] = vol*sum[0];
- samples->err[comp] = vol*(
+ res[comp].avg = region->vol*sum[0];
+ res[comp].err = region->vol*(
(errcoeff[0]*sum[1] <= sum[2] && errcoeff[0]*sum[2] <= sum[3]) ?
errcoeff[1]*sum[1] :
- errcoeff[2]*Max(Max(sum[1], sum[2]), sum[3]));
+ errcoeff[2]*Max(Max(sum[1], sum[2]), sum[3]) );
}
}
Index: trunk/cuba/src/divonne/decl.h
===================================================================
--- trunk/cuba/src/divonne/decl.h (revision 158)
+++ trunk/cuba/src/divonne/decl.h (revision 159)
@@ -1,98 +1,161 @@
/*
decl.h
Type declarations
this file is part of Divonne
- last modified 8 Jun 10 th
+ last modified 9 Oct 14 th
*/
#include "stddecl.h"
+#define INIDEPTH 3
+#define DEPTH 5
+#define POSTDEPTH 15
+
#define Tag(x) ((x) | INT_MIN)
#define Untag(x) ((x) & INT_MAX)
typedef struct {
real lower, upper;
} Bounds;
typedef const Bounds cBounds;
typedef struct {
+ real avg, err;
+} PhaseResult;
+
+typedef struct {
real avg, spreadsq;
real spread, secondspread;
real nneed, maxerrsq, mindevsq;
+ real integral, sigsq, chisq;
+ PhaseResult phase[2];
int iregion;
} Totals;
+enum { nrules = 5 };
+
typedef struct {
- void *first, *last;
+ count n;
+ real weight[nrules], scale[nrules], norm[nrules];
+ real gen[];
+} Set;
+
+#define SetSize (sizeof(Set) + t->ndim*sizeof(real))
+
+#define NextSet(p) p = (Set *)((char *)p + setsize)
+
+typedef struct {
+ Set *first, *last;
real errcoeff[3];
count n;
} Rule;
typedef const Rule cRule;
typedef struct samples {
- real weight;
- real *x, *f, *avg, *err;
- void (*sampler)(struct _this *t, const struct samples *, cBounds *, creal);
+ real *x, *f;
+ void (*sampler)(struct _this *t, ccount);
cRule *rule;
- count coeff;
number n, neff;
+ count coeff;
} Samples;
typedef const Samples cSamples;
-typedef int (*Integrand)(ccount *, creal *, ccount *, real *, void *, cint *);
+typedef struct {
+ real diff, err, spread;
+} Errors;
+
+typedef const Errors cErrors;
+
+typedef struct {
+ real avg, err, spread, chisq;
+ real fmin, fmax;
+} Result;
+
+typedef const Result cResult;
+
+#define MinMaxSize (t->ncomp*t->ndim*2*sizeof(real))
+
+typedef struct region {
+ int depth, next;
+ count isamples, cutcomp, xmajor;
+ real fmajor, fminor, vol;
+ Bounds bounds[];
+} Region;
+
+#define RegionSize (sizeof(Region) + t->ndim*sizeof(Bounds) + t->ncomp*sizeof(Result) + MinMaxSize)
+
+#define RegionResult(r) ((Result *)(r->bounds + t->ndim))
+
+#define RegionMinMax(r) ((real *)(RegionResult(r) + t->ncomp))
-typedef void (*PeakFinder)(ccount *, cBounds *, number *, real *);
+#define RegionPtr(n) ((Region *)((char *)t->region + (n)*regionsize))
+
+
+typedef int (*Integrand)(ccount *, creal *, ccount *, real *,
+ void *, cnumber *, cint *, cint *);
+
+typedef void (*PeakFinder)(ccount *, cBounds *, number *, real *, void *);
typedef struct _this {
count ndim, ncomp;
#ifndef MLVERSION
Integrand integrand;
void *userdata;
+ number nvec;
+#ifdef HAVE_FORK
+ SHM_ONLY(int shmid;)
+ Spin *spin;
+ real *frame;
+ number nframe;
+ int running;
+#endif
PeakFinder peakfinder;
#endif
real epsrel, epsabs;
int flags, seed;
number mineval, maxeval;
int key1, key2, key3;
count maxpass;
Bounds border;
real maxchisq, mindeviation;
number ngiven, nextra;
- real *xgiven, *xextra, *fgiven, *fextra;
+ real *xgiven, *fgiven;
+ real *xextra, *fextra;
count ldxgiven;
count nregions;
- number neval, neval_opt, neval_cut;
- int phase;
+ cchar *statefile;
+ number neval, neval_opt, neval_cut, nrand;
+ count phase;
count selectedcomp, size;
Samples samples[3];
Totals *totals;
Rule rule7, rule9, rule11, rule13;
RNGState rng;
- void *voidregion;
+ Region *region;
jmp_buf abort;
} This;
typedef const This cThis;
+
#define CHUNKSIZE 4096
-#define TYPEDEFREGION \
- typedef struct { \
- real avg, err, spread, chisq; \
- real fmin, fmax; \
- real xmin[1000], xmax[1000]; \
- } Result; \
- typedef const Result cResult; \
- typedef struct region { \
- count cutcomp, depth, xmajor; \
- real fmajor, fminor, vol; \
- Bounds bounds[1000]; \
- Result result[1000]; \
- } Region
+#define AllocRegions(t) \
+ MemAlloc((t)->region, (t)->size*regionsize)
+
+#define EnlargeRegions(t, n) if( (t)->nregions + n > (t)->size ) \
+ ReAlloc((t)->region, ((t)->size += CHUNKSIZE)*regionsize)
-#define RegionPtr(n) (&((Region *)t->voidregion)[n])
+#define SAMPLERDEFS \
+ csize_t regionsize = RegionSize; \
+ Region *region = RegionPtr(iregion); \
+ cBounds *b = region->bounds; \
+ Result *res = RegionResult(region); \
+ cSamples *samples = &t->samples[region->isamples]; \
+ real *x = samples->x, *f = samples->f; \
+ cnumber n = samples->n
Index: trunk/cuba/src/divonne/FindMinimum.c
===================================================================
--- trunk/cuba/src/divonne/FindMinimum.c (revision 158)
+++ trunk/cuba/src/divonne/FindMinimum.c (revision 159)
@@ -1,689 +1,694 @@
/*
FindMinimum.c
find minimum (maximum) of hyperrectangular region
this file is part of Divonne
- last modified 8 Jun 10 th
+ last modified 12 Mar 15 th
*/
-#define EPS 0x1p-52
-#define RTEPS 0x1p-26
-#define QEPS 0x1p-13
-
-#define DELTA 0x1p-16
-#define RTDELTA 0x1p-8
-#define QDELTA 0x1p-4
+#define EPS POW2(52)
+#define RTEPS POW2(26)
+#define QEPS POW2(13)
+
+#define DELTA POW2(16)
+#define RTDELTA POW2(8)
+#define QDELTA POW2(4)
/*
#define DELTA 1e-5
#define RTDELTA 3.1622776601683791e-3
#define QDELTA 5.6234132519034912e-2
*/
#define SUFTOL 8*QEPS*QDELTA
#define FTOL 5e-2
#define GTOL 1e-2
#define Hessian(i, j) hessian[(i)*t->ndim + j]
typedef struct { real dx, f; } Point;
/*********************************************************************/
static inline real Dot(ccount n, creal *a, creal *b)
{
real sum = 0;
count i;
for( i = 0; i < n; ++i ) sum += a[i]*b[i];
return sum;
}
/*********************************************************************/
static inline real Length(ccount n, creal *vec)
{
- return sqrt(Dot(n, vec, vec));
+ return sqrtx(Dot(n, vec, vec));
}
/*********************************************************************/
static inline void LinearSolve(cThis *t, ccount n, creal *hessian,
creal *grad, real *p)
{
int i, j;
real dir;
for( i = 0; i < n; ++i ) {
dir = -grad[i];
for( j = 0; j < i; ++j )
dir -= Hessian(i, j)*p[j];
p[i] = dir;
}
while( --i >= 0 ) {
if( Hessian(i, i) <= 0 ) return;
dir = p[i]/Hessian(i, i);
for( j = i + 1; j < n; ++j )
dir -= Hessian(j, i)*p[j];
p[i] = dir;
}
}
/*********************************************************************/
static void RenormalizeCholesky(cThis *t, ccount n, real *hessian,
real *z, real alpha)
{
count i, j;
for( i = 0; i < n; ++i ) {
creal dir = z[i];
real beta = alpha*dir;
real gamma = Hessian(i, i);
real gammanew = Hessian(i, i) += beta*dir;
if( i + 1 >= n || gammanew < 0 ||
(gammanew < 1 && gamma > DBL_MAX*gammanew) ) return;
gamma /= gammanew;
beta /= gammanew;
alpha *= gamma;
if( gamma < .25 ) {
for( j = i + 1; j < n; ++j ) {
real delta = beta*z[j];
z[j] -= dir*Hessian(j, i);
Hessian(j, i) = Hessian(j, i)*gamma + delta;
}
}
else {
for( j = i + 1; j < n; ++j ) {
z[j] -= dir*Hessian(j, i);
Hessian(j, i) += beta*z[j];
}
}
}
}
/*********************************************************************/
static void UpdateCholesky(cThis *t, ccount n, real *hessian,
real *z, real *p)
{
int i, j;
real gamma = 0;
for( i = 0; i < n; ++i ) {
real dir = z[i];
for( j = 0; j < i; ++j )
dir -= Hessian(i, j)*p[j];
p[i] = dir;
gamma += Sq(dir)/Hessian(i, i);
}
- gamma = Max(fabs(1 - gamma), EPS);
+ gamma = Max(fabsx(1 - gamma), EPS);
while( --i >= 0 ) {
creal dir = z[i] = p[i];
real beta = dir/Hessian(i, i);
creal gammanew = gamma + dir*beta;
Hessian(i, i) *= gamma/gammanew;
beta /= gamma;
gamma = gammanew;
for( j = i + 1; j < n; ++j ) {
creal delta = beta*z[j];
z[j] += dir*Hessian(j, i);
Hessian(j, i) -= delta;
}
}
}
/*********************************************************************/
static inline void BFGS(cThis *t, ccount n, real *hessian,
creal *gnew, creal *g, real *p, creal dx)
{
- real y[NDIM], c;
+ Vector(real, y, NDIM);
+ real c;
count i, j;
for( i = 0; i < n; ++i )
y[i] = gnew[i] - g[i];
c = dx*Dot(n, y, p);
if( c < 1e-10 ) return;
RenormalizeCholesky(t, n, hessian, y, 1/c);
c = Dot(n, g, p);
if( c >= 0 ) return;
- c = 1/sqrt(-c);
+ c = 1/sqrtx(-c);
for( i = 0; i < n; ++i )
y[i] = c*g[i];
UpdateCholesky(t, n, hessian, y, p);
for( i = 0; i < n - 1; ++i )
for( j = i + 1; j < n; ++j )
Hessian(i, j) = Hessian(j, i);
}
/*********************************************************************/
static void Gradient(This *t, ccount nfree, ccount *ifree,
cBounds *b, real *x, creal y, real *grad)
{
count i;
for( i = 0; i < nfree; ++i ) {
ccount dim = Untag(ifree[i]);
creal xd = x[dim];
creal delta = (b[dim].upper - xd < DELTA) ? -DELTA : DELTA;
x[dim] += delta;
grad[i] = (Sample(t, x) - y)/delta;
x[dim] = xd;
}
}
/*********************************************************************/
static Point LineSearch(This *t, ccount nfree, ccount *ifree,
creal *p, creal *xini, real fini, real *x,
real step, creal range, creal grad,
creal ftol, creal xtol, creal gtol)
{
real tol = ftol, tol2 = tol + tol;
Point cur = {0, fini};
- VecCopy(x, xini);
+ XCopy(x, xini);
/* don't even try if
a) we'd walk backwards,
b) the range to explore is too small,
c) the gradient is positive, i.e. we'd move uphill */
if( step > 0 && range > tol2 && grad <= 0 ) {
- creal eps = RTEPS*fabs(range) + ftol;
+ creal eps = RTEPS*fabsx(range) + ftol;
creal mingrad = -1e-4*grad, maxgrad = -gtol*grad;
real end = range + eps;
real maxstep = range - eps/(1 + RTEPS);
Point min = cur, v = cur, w = cur;
Point a = cur, b = {end, 0};
real a1, b1 = end;
/* distmin: distance along p from xini to the minimum,
u: second-lowest point,
v: third-lowest point,
a, b: interval in which the minimum is sought. */
real distmin = 0, dist, mid, q, r, s;
count i;
int shift;
bool first;
for( first = true; ; first = false ) {
if( step >= maxstep ) {
step = maxstep;
maxstep = maxstep*(1 + .75*RTEPS) + .75*tol;
}
- cur.dx = (fabs(step) >= tol) ? step : (step > 0) ? tol : -tol;
+ cur.dx = (fabsx(step) >= tol) ? step : (step > 0) ? tol : -tol;
dist = distmin + cur.dx;
for( i = 0; i < nfree; ++i ) {
ccount dim = ifree[i];
x[dim] = xini[dim] + dist*p[i];
}
cur.f = Sample(t, x);
if( cur.f <= min.f ) {
v = w;
w = min;
min.f = cur.f;
distmin = dist;
/* shift everything to the new minimum position */
maxstep -= cur.dx;
v.dx -= cur.dx;
w.dx -= cur.dx;
a.dx -= cur.dx;
b.dx -= cur.dx;
if( cur.dx < 0 ) b = w;
else a = w;
- tol = RTEPS*fabs(distmin) + ftol;
+ tol = RTEPS*fabsx(distmin) + ftol;
tol2 = tol + tol;
}
else {
if( cur.dx < 0 ) a = cur;
else b = cur;
if( cur.f <= w.f || w.dx == 0 ) v = w, w = cur;
else if( cur.f <= v.f || v.dx == 0 || v.dx == w.dx ) v = cur;
}
if( distmin + b.dx <= xtol ) break;
if( min.f < fini &&
- a.f - min.f <= fabs(a.dx)*maxgrad &&
- (fabs(distmin - range) > tol || maxstep < b.dx) ) break;
+ a.f - min.f <= fabsx(a.dx)*maxgrad &&
+ (fabsx(distmin - range) > tol || maxstep < b.dx) ) break;
mid = .5*(a.dx + b.dx);
- if( fabs(mid) <= tol2 - .5*(b.dx - a.dx) ) break;
+ if( fabsx(mid) <= tol2 - .5*(b.dx - a.dx) ) break;
r = q = s = 0;
- if( fabs(end) > tol ) {
+ if( fabsx(end) > tol ) {
if( first ) {
creal s1 = w.dx*grad;
creal s2 = w.f - min.f;
s = (s1 - ((distmin == 0) ? 0 : 2*s2))*w.dx;
q = 2*(s2 - s1);
}
else {
creal s1 = w.dx*(v.f - min.f);
creal s2 = v.dx*(w.f - min.f);
s = s1*w.dx - s2*v.dx;
q = 2*(s2 - s1);
}
if( q > 0 ) s = -s;
- q = fabs(q);
+ q = fabsx(q);
r = end;
if( step != b1 || b.dx <= maxstep ) end = step;
}
if( distmin == a.dx ) step = mid;
else if( b.dx > maxstep ) step = (step < b.dx) ? -4*a.dx : maxstep;
else {
real num = a.dx, den = b.dx;
- if( fabs(b.dx) <= tol || (w.dx > 0 && fabs(a.dx) > tol) )
+ if( fabsx(b.dx) <= tol || (w.dx > 0 && fabsx(a.dx) > tol) )
num = b.dx, den = a.dx;
num /= -den;
- step = (num < 1) ? .5*den*sqrt(num) : 5/11.*den*(.1 + 1/num);
+ step = (num < 1) ? .5*den*sqrtx(num) : 5/11.*den*(.1 + 1/num);
}
if( step > 0 ) a1 = a.dx, b1 = step;
else a1 = step, b1 = b.dx;
- if( fabs(s) < fabs(.5*q*r) && s > q*a1 && s < q*b1 ) {
+ if( fabsx(s) < fabsx(.5*q*r) && s > q*a1 && s < q*b1 ) {
step = s/q;
if( step - a.dx < tol2 || b.dx - step < tol2 )
step = (mid > 0) ? tol : -tol;
}
else end = (mid > 0) ? b.dx : a.dx;
}
first = true;
- if( fabs(distmin - range) < tol ) {
+ if( fabsx(distmin - range) < tol ) {
distmin = range;
if( maxstep > b.dx ) first = false;
}
for( cur.dx = distmin, cur.f = min.f, shift = -1; ;
cur.dx = Max(ldexp(distmin, shift), ftol), shift <<= 1 ) {
for( i = 0; i < nfree; ++i ) {
ccount dim = ifree[i];
x[dim] = xini[dim] + cur.dx*p[i];
}
if( !first ) cur.f = Sample(t, x);
if( cur.dx + b.dx <= xtol ) {
cur.dx = 0;
break;
}
if( fini - cur.f > cur.dx*mingrad ) break;
if( cur.dx <= ftol ) {
cur.dx = 0;
break;
}
first = false;
}
}
return cur;
}
/*********************************************************************/
static real LocalSearch(This *t, ccount nfree, ccount *ifree,
cBounds *b, creal *x, creal fx, real *z)
{
+ Vector(real, y, NDIM);
+ Vector(real, p, NDIM);
real delta, smax, sopp, spmax, snmax;
- real y[NDIM], fy, fz, ftest;
- real p[NDIM];
+ real fy, fz, ftest;
int sign;
count i;
/* Choose a direction p along which to move away from the
present x. We choose the direction which leads farthest
away from all borders. */
smax = INFTY;
for( i = 0; i < nfree; ++i ) {
ccount dim = ifree[i];
creal sp = b[dim].upper - x[dim];
creal sn = x[dim] - b[dim].lower;
if( sp < sn ) {
smax = Min(smax, sn);
p[i] = -1;
}
else {
smax = Min(smax, sp);
p[i] = 1;
}
}
smax *= .9;
/* Move along p until the integrand changes appreciably
or we come close to a border. */
- VecCopy(y, x);
- ftest = SUFTOL*(1 + fabs(fx));
+ XCopy(y, x);
+ ftest = SUFTOL*(1 + fabsx(fx));
delta = RTDELTA/5;
do {
delta = Min(5*delta, smax);
for( i = 0; i < nfree; ++i ) {
ccount dim = ifree[i];
y[dim] = x[dim] + delta*p[i];
}
fy = Sample(t, y);
- if( fabs(fy - fx) > ftest ) break;
+ if( fabsx(fy - fx) > ftest ) break;
} while( delta != smax );
/* Construct a second direction p' orthogonal to p, i.e. p.p' = 0.
We let pairs of coordinates cancel in the dot product,
i.e. we choose p'[0] = p[0], p'[1] = -p[1], etc.
(It should really be 1/p and -1/p, but p consists of 1's and -1's.)
For odd nfree, we let the last three components cancel by
choosing p'[nfree - 3] = p[nfree - 3],
p'[nfree - 2] = -1/2 p[nfree - 2], and
p'[nfree - 1] = -1/2 p[nfree - 1]. */
sign = (nfree <= 1 && fy > fx) ? 1 : -1;
spmax = snmax = INFTY;
for( i = 0; i < nfree; ++i ) {
ccount dim = ifree[i];
real sp, sn;
p[i] *= (nfree & 1 && nfree - i <= 2) ? -.5*sign : (sign = -sign);
sp = (b[dim].upper - y[dim])/p[i];
sn = (y[dim] - b[dim].lower)/p[i];
if( p[i] > 0 ) {
spmax = Min(spmax, sp);
snmax = Min(snmax, sn);
}
else {
spmax = Min(spmax, -sn);
snmax = Min(snmax, -sp);
}
}
smax = .9*spmax;
sopp = .9*snmax;
if( nfree > 1 && smax < snmax ) {
real tmp = smax;
smax = sopp;
sopp = tmp;
for( i = 0; i < nfree; ++i )
p[i] = -p[i];
}
/* Move along p' until the integrand changes appreciably
or we come close to a border. */
- VecCopy(z, y);
- ftest = SUFTOL*(1 + fabs(fy));
+ XCopy(z, y);
+ ftest = SUFTOL*(1 + fabsx(fy));
delta = RTDELTA/5;
do {
delta = Min(5*delta, smax);
for( i = 0; i < nfree; ++i ) {
ccount dim = ifree[i];
z[dim] = y[dim] + delta*p[i];
}
fz = Sample(t, z);
- if( fabs(fz - fy) > ftest ) break;
+ if( fabsx(fz - fy) > ftest ) break;
} while( delta != smax );
if( fy != fz ) {
real pleneps, grad, range, step;
Point low;
if( fy > fz ) {
grad = (fz - fy)/delta;
range = smax/.9;
step = Min(delta + delta, smax);
}
else {
grad = (fy - fz)/delta;
range = sopp/.9 + delta;
step = Min(delta + delta, sopp);
- VecCopy(y, z);
+ XCopy(y, z);
fy = fz;
for( i = 0; i < nfree; ++i )
p[i] = -p[i];
}
pleneps = Length(nfree, p) + RTEPS;
low = LineSearch(t, nfree, ifree, p, y, fy, z, step, range, grad,
RTEPS/pleneps, 0., RTEPS);
fz = low.f;
}
if( fz != fx ) {
real pleneps, grad, range, step;
Point low;
spmax = snmax = INFTY;
for( i = 0; i < nfree; ++i ) {
ccount dim = ifree[i];
p[i] = z[dim] - x[dim];
if( p[i] != 0 ) {
creal sp = (b[dim].upper - x[dim])/p[i];
creal sn = (x[dim] - b[dim].lower)/p[i];
if( p[i] > 0 ) {
spmax = Min(spmax, sp);
snmax = Min(snmax, sn);
}
else {
spmax = Min(spmax, -sn);
snmax = Min(snmax, -sp);
}
}
}
grad = fz - fx;
range = spmax;
step = Min(.9*spmax, 2.);
pleneps = Length(nfree, p) + RTEPS;
if( fz > fx ) {
delta = Min(.9*snmax, RTDELTA/pleneps);
for( i = 0; i < nfree; ++i ) {
ccount dim = ifree[i];
z[dim] = x[dim] - delta*p[i];
}
fz = Sample(t, z);
if( fz < fx ) {
grad = (fz - fx)/delta;
range = snmax;
step = Min(.9*snmax, delta + delta);
for( i = 0; i < nfree; ++i )
p[i] = -p[i];
}
else if( delta < 1 ) grad = (fx - fz)/delta;
}
low = LineSearch(t, nfree, ifree, p, x, fx, z, step, range, grad,
RTEPS/pleneps, 0., RTEPS);
fz = low.f;
}
return fz;
}
/*********************************************************************/
static real FindMinimum(This *t, cBounds *b, real *xmin, real fmin)
{
- real hessian[NDIM*NDIM];
- real gfree[NDIM], p[NDIM];
- real tmp[NDIM], ftmp, fini = fmin;
+ Vector(real, hessian, NDIM*NDIM);
+ Vector(real, gfree, NDIM);
+ Vector(real, p, NDIM);
+ Vector(real, tmp, NDIM);
+ Vector(count, ifree, NDIM);
+ Vector(count, ifix, NDIM);
+ real ftmp, fini = fmin;
ccount maxeval = t->neval + 50*t->ndim;
count nfree, nfix;
- count ifree[NDIM], ifix[NDIM];
count dim, local;
- Zap(hessian);
+ Clear(hessian, t->ndim*t->ndim);
for( dim = 0; dim < t->ndim; ++dim )
Hessian(dim, dim) = 1;
/* Step 1: - classify the variables as "fixed" (sufficiently close
to a border) and "free",
- if the integrand is flat in the direction of the gradient
w.r.t. the free dimensions, perform a local search. */
for( local = 0; local < 2; ++local ) {
bool resample = false;
nfree = nfix = 0;
for( dim = 0; dim < t->ndim; ++dim ) {
- if( xmin[dim] < b[dim].lower + (1 + fabs(b[dim].lower))*QEPS ) {
+ if( xmin[dim] < b[dim].lower + (1 + fabsx(b[dim].lower))*QEPS ) {
xmin[dim] = b[dim].lower;
ifix[nfix++] = dim;
resample = true;
}
- else if( xmin[dim] > b[dim].upper - (1 + fabs(b[dim].upper))*QEPS ) {
+ else if( xmin[dim] > b[dim].upper - (1 + fabsx(b[dim].upper))*QEPS ) {
xmin[dim] = b[dim].upper;
ifix[nfix++] = Tag(dim);
resample = true;
}
else ifree[nfree++] = dim;
}
if( resample ) fini = fmin = Sample(t, xmin);
if( nfree == 0 ) goto releasebounds;
Gradient(t, nfree, ifree, b, xmin, fmin, gfree);
if( local || Length(nfree, gfree) > GTOL ) break;
ftmp = LocalSearch(t, nfree, ifree, b, xmin, fmin, tmp);
- if( ftmp > fmin - (1 + fabs(fmin))*RTEPS )
+ if( ftmp > fmin - (1 + fabsx(fmin))*RTEPS )
goto releasebounds;
fmin = ftmp;
- VecCopy(xmin, tmp);
+ XCopy(xmin, tmp);
}
while( t->neval <= maxeval ) {
/* Step 2a: perform a quasi-Newton iteration on the free
variables only. */
if( nfree > 0 ) {
real plen, pleneps;
real minstep;
count i, mini = 0, minfix = 0;
Point low;
LinearSolve(t, nfree, hessian, gfree, p);
plen = Length(nfree, p);
pleneps = plen + RTEPS;
minstep = INFTY;
for( i = 0; i < nfree; ++i ) {
count dim = Untag(ifree[i]);
- if( fabs(p[i]) > EPS ) {
+ if( fabsx(p[i]) > EPS ) {
real step;
count fix;
if( p[i] < 0 ) {
step = (b[dim].lower - xmin[dim])/p[i];
fix = dim;
}
else {
step = (b[dim].upper - xmin[dim])/p[i];
fix = Tag(dim);
}
if( step < minstep ) {
minstep = step;
mini = i;
minfix = fix;
}
}
}
if( minstep*pleneps <= DELTA ) {
fixbound:
ifix[nfix++] = minfix;
if( mini < --nfree ) {
creal diag = Hessian(mini, mini);
Clear(tmp, mini);
for( i = mini; i < nfree; ++i )
tmp[i] = Hessian(i + 1, mini);
for( i = mini; i < nfree; ++i ) {
- Copy(&Hessian(i, 0), &Hessian(i + 1, 0), i);
+ Move(&Hessian(i, 0), &Hessian(i + 1, 0), i);
Hessian(i, i) = Hessian(i + 1, i + 1);
}
RenormalizeCholesky(t, nfree, hessian, tmp, diag);
- Copy(&ifree[mini], &ifree[mini + 1], nfree - mini);
- Copy(&gfree[mini], &gfree[mini + 1], nfree - mini);
+ Move(&ifree[mini], &ifree[mini + 1], nfree - mini);
+ Move(&gfree[mini], &gfree[mini + 1], nfree - mini);
}
continue;
}
low = LineSearch(t, nfree, ifree, p, xmin, fmin, tmp,
Min(minstep, 1.), Min(minstep, 100.), Dot(nfree, gfree, p),
RTEPS/pleneps, DELTA/pleneps, .2);
if( low.dx > 0 ) {
real fdiff;
fmin = low.f;
- VecCopy(xmin, tmp);
+ XCopy(xmin, tmp);
Gradient(t, nfree, ifree, b, xmin, fmin, tmp);
BFGS(t, nfree, hessian, tmp, gfree, p, low.dx);
- VecCopy(gfree, tmp);
+ XCopy(gfree, tmp);
- if( fabs(low.dx - minstep) < QEPS*minstep ) goto fixbound;
+ if( fabsx(low.dx - minstep) < QEPS*minstep ) goto fixbound;
fdiff = fini - fmin;
fini = fmin;
- if( fdiff > (1 + fabs(fmin))*FTOL ||
+ if( fdiff > (1 + fabsx(fmin))*FTOL ||
low.dx*plen > (1 + Length(t->ndim, xmin))*FTOL ) continue;
}
}
/* Step 2b: check whether freeing any fixed variable will lead
to a reduction in f. */
releasebounds:
if( nfix > 0 ) {
real mingrad = INFTY;
count i, mini = 0;
bool repeat = false;
Gradient(t, nfix, ifix, b, xmin, fmin, tmp);
for( i = 0; i < nfix; ++i ) {
creal grad = Sign(ifix[i])*tmp[i];
if( grad < -RTEPS ) {
repeat = true;
if( grad < mingrad ) {
mingrad = grad;
mini = i;
}
}
}
if( repeat ) {
gfree[nfree] = tmp[mini];
ifree[nfree] = Untag(ifix[mini]);
Clear(&Hessian(nfree, 0), nfree);
Hessian(nfree, nfree) = 1;
++nfree;
--nfix;
- Copy(&ifix[mini], &ifix[mini + 1], nfix - mini);
+ Move(&ifix[mini], &ifix[mini + 1], nfix - mini);
continue;
}
}
break;
}
return fmin;
}
Index: trunk/cuba/src/divonne/KorobovCoeff.c-2423
===================================================================
--- trunk/cuba/src/divonne/KorobovCoeff.c-2423 (revision 0)
+++ trunk/cuba/src/divonne/KorobovCoeff.c-2423 (revision 159)
@@ -0,0 +1,267 @@
+#define KOROBOV_MINDIM 2
+#define KOROBOV_MAXDIM 33
+#define MAXPRIME 2423
+
+#define Hash(x) ((4973 - x)*(-47 + x))/25245
+
+static int prime[] = {
+ FIRST,47,53,59,61,67,73,79,83,89,97,101,103,109,113,127,131,137,139,149,
+ 151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,
+ 251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,
+ 359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,
+ 463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,
+ 593,599,601,607,613,617,619,631,641,643,647,653,659,661,673,677,683,691,
+ 701,709,719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,
+ 827,829,839,853,857,859,863,877,881,887,907,911,919,929,937,941,947,953,
+ 967,971,977,983,991,997,1009,1019,1021,1033,1039,1051,1061,1069,1087,
+ 1091,1097,1103,1117,1123,1129,1151,1153,1163,1171,1181,1187,1193,1201,
+ 1217,1229,1237,1249,1259,1277,1279,1289,1297,1307,1319,1327,1361,1367,
+ 1373,1381,1399,1409,1423,1427,1429,1439,1453,1459,1481,1489,1499,1511,
+ 1523,1543,1553,1567,1579,1597,1607,1621,1637,1657,1663,1669,1697,1709,
+ 1723,1741,1759,1777,1789,1811,1831,1847,1867,1889,1907,1931,1951,1973,
+ 1999,2027,2053,2081,2111,2143,2179,2221,2269,2333,MarkLast(2423)
+};
+
+static short coeff[][32] = {
+ {13,11,10,3,9,2,2,2,2,9,2,2,7,2,2,2,2,2,2,6,2,2,2,13,11,10,3,9,2,2,2,2},
+ {23,17,12,11,14,14,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,12,12,12,14,14,14},
+ {18,14,5,14,2,2,19,19,25,25,18,18,18,2,2,2,2,2,2,2,2,2,2,2,25,6,2,2,2,18,14,5},
+ {17,21,7,6,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,6,2,2,2,6,2,2,2,17,7},
+ {18,13,23,5,2,12,6,12,12,12,10,10,16,2,16,16,2,2,2,2,2,2,2,10,2,2,2,2,10,2,2,2},
+ {27,14,10,14,2,4,13,2,2,16,4,4,4,6,6,6,6,6,6,25,25,31,31,15,31,2,2,31,15,14,14,6},
+ {29,19,27,32,6,8,2,2,2,2,2,8,8,2,2,2,2,9,9,9,9,2,2,2,2,2,2,2,9,9,2,2},
+ {30,19,24,16,22,8,2,2,22,5,9,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {34,28,13,28,27,27,2,4,2,2,2,16,16,4,20,20,36,20,36,5,5,5,36,36,5,5,5,7,5,7,7,2},
+ {35,19,33,8,21,30,8,2,4,2,4,4,2,2,2,2,2,2,2,2,2,17,2,2,11,25,11,17,17,17,17,17},
+ {39,40,15,21,11,26,13,2,2,13,2,2,2,2,2,2,2,2,2,2,26,26,2,2,2,2,2,2,2,2,2,2},
+ {37,21,35,29,27,19,19,2,2,2,5,15,2,2,15,15,19,19,19,19,19,2,2,2,2,2,19,2,2,2,2,2},
+ {45,44,13,25,17,47,30,2,30,2,2,2,2,2,2,2,2,2,19,19,19,17,17,2,2,2,2,2,2,2,2,2},
+ {35,22,37,9,35,12,35,8,2,2,50,50,2,2,32,32,32,31,13,8,8,8,2,22,50,9,9,9,22,22,22,10},
+ {29,24,43,36,49,2,2,8,4,25,49,25,2,2,8,10,10,10,5,5,5,40,10,33,40,40,2,27,10,25,25,25},
+ {50,18,32,39,21,2,2,2,4,4,36,36,14,14,14,14,2,2,2,17,17,17,16,16,2,14,14,14,14,2,2,2},
+ {31,28,45,20,18,43,43,13,28,2,2,2,31,31,31,31,31,2,2,2,43,43,2,2,2,2,2,2,2,2,30,2},
+ {39,15,41,7,24,2,2,30,40,2,2,25,25,25,25,2,2,2,2,2,2,6,6,2,25,2,5,2,2,25,2,2},
+ {44,20,29,39,7,21,21,21,2,2,45,2,2,2,49,49,49,49,49,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {56,20,22,13,18,35,35,6,2,4,2,4,2,2,2,23,16,16,4,23,2,34,52,2,34,2,4,2,2,2,23,16},
+ {46,32,17,18,29,27,31,31,31,2,2,4,15,2,2,2,2,2,2,2,2,2,2,2,2,2,23,32,32,32,15,15},
+ {62,42,43,17,23,13,13,2,2,13,2,2,2,2,2,2,2,10,2,2,2,2,9,10,2,2,2,19,9,9,9,9},
+ {46,49,49,52,27,7,20,2,2,6,6,13,13,13,2,13,13,2,2,2,2,2,2,34,34,2,2,2,2,2,2,2},
+ {64,34,16,28,16,51,47,2,2,2,6,18,39,39,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,12,12,2},
+ {74,26,44,25,50,24,54,39,58,42,2,42,42,2,2,2,2,2,2,2,2,33,33,2,2,39,11,2,2,58,39,58},
+ {70,22,50,22,16,9,25,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {74,21,17,25,35,33,10,2,10,20,20,57,57,57,2,2,57,2,2,2,2,2,2,2,13,2,2,2,2,2,2,2},
+ {81,18,10,11,47,38,71,37,2,37,2,2,2,2,2,26,26,26,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {71,68,68,27,71,39,81,44,2,2,2,12,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {55,30,85,42,16,36,45,67,2,2,68,2,2,2,2,2,2,2,68,10,2,2,2,2,2,2,2,2,2,2,2,2},
+ {64,17,24,26,49,12,10,39,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,59,2,2},
+ {68,57,23,38,61,38,13,13,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2,68,15,2,44,44,44,2,2,2},
+ {94,28,58,29,13,5,15,8,66,2,2,2,39,39,15,66,2,2,6,6,2,2,66,66,66,66,2,2,2,2,2,66},
+ {94,85,9,41,41,37,29,29,17,2,2,2,7,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,8,8},
+ {89,32,75,77,77,13,2,30,30,2,2,2,2,2,2,2,2,2,2,67,67,2,2,2,2,2,2,2,2,8,19,32},
+ {70,45,58,63,67,10,72,72,70,6,2,36,2,70,70,6,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {101,33,76,13,45,63,2,2,6,19,2,2,32,32,32,32,32,65,2,63,63,11,11,11,19,19,19,19,9,63,63,63},
+ {70,89,44,37,19,45,2,2,2,8,10,8,54,54,80,80,80,80,80,2,116,2,116,2,2,80,40,51,100,100,8,2},
+ {71,54,83,51,42,98,2,2,8,8,14,30,93,22,15,15,30,30,30,44,44,44,2,2,22,22,22,117,44,11,11,11},
+ {109,37,51,113,17,10,2,2,17,17,55,2,55,55,55,55,55,55,2,2,2,57,48,48,55,55,2,2,55,2,2,55},
+ {75,38,68,89,11,52,2,2,81,39,2,38,2,2,2,2,2,2,2,2,2,2,2,19,2,2,2,2,2,2,2,2},
+ {80,38,62,66,39,59,2,36,48,33,2,2,41,2,48,48,2,2,2,2,2,2,48,2,2,2,2,2,2,2,2,2},
+ {81,84,35,34,20,93,2,12,12,12,2,96,2,96,96,2,96,2,2,2,2,2,2,2,2,2,2,2,2,56,56,56},
+ {109,72,60,96,67,32,85,84,27,91,91,2,10,29,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {104,32,56,46,77,11,35,35,24,56,19,2,2,2,78,2,2,75,2,2,2,2,78,2,2,2,2,2,2,2,2,2},
+ {81,103,25,35,28,15,20,20,20,2,2,2,2,20,20,20,107,107,2,2,2,2,2,2,2,2,2,2,2,2,13,13},
+ {119,75,42,29,74,23,54,36,39,2,2,4,4,19,19,2,2,2,2,2,2,2,2,54,2,2,2,2,2,2,2,54},
+ {115,73,22,102,75,138,16,73,50,16,2,50,2,2,2,133,2,2,2,2,2,2,2,2,2,2,2,2,2,33,33,33},
+ {119,48,66,51,14,22,20,20,2,2,2,2,2,60,2,2,2,2,2,2,2,2,60,2,2,2,2,2,2,60,2,65},
+ {121,94,80,29,51,69,42,36,14,14,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,17,2,2},
+ {129,123,41,79,43,34,24,11,2,2,4,2,2,2,2,75,16,16,16,75,75,75,16,16,16,25,2,99,2,2,75,16},
+ {128,33,35,68,22,8,62,94,2,2,2,62,62,2,98,2,2,4,98,2,2,32,81,32,32,32,98,98,98,98,98,98},
+ {101,109,154,15,57,6,27,36,2,2,37,37,2,2,2,2,2,2,2,107,2,2,2,107,107,2,2,2,2,2,2,2},
+ {106,40,24,38,61,118,106,106,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {149,111,58,79,127,13,41,33,27,16,30,2,61,2,72,2,2,2,2,2,2,2,2,2,2,2,2,75,75,2,2,2},
+ {105,92,43,156,25,53,57,115,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {99,40,62,67,66,29,99,99,99,78,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,79},
+ {109,42,96,95,66,41,103,84,13,103,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {111,72,16,89,25,86,117,29,14,14,2,2,2,2,2,60,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {106,72,49,94,140,44,97,157,75,2,2,4,123,123,2,2,123,123,123,123,2,2,2,2,2,2,2,2,2,2,2,2},
+ {115,67,74,32,43,50,21,36,135,36,85,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {151,71,157,42,41,37,80,27,18,2,2,2,2,2,2,2,2,2,2,2,2,2,115,128,128,128,128,128,32,2,128,80},
+ {119,91,38,30,92,44,32,76,22,2,34,2,2,2,2,2,2,2,2,2,2,2,2,2,2,129,2,2,129,2,2,2},
+ {121,126,31,52,120,37,57,10,171,2,2,2,2,35,35,35,2,2,97,97,97,97,97,97,97,35,35,35,97,97,97,2},
+ {155,86,49,104,87,94,64,45,61,91,91,91,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {164,121,44,166,47,33,7,15,13,2,2,122,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {128,120,133,17,71,52,25,107,42,21,21,2,2,2,2,4,4,96,2,9,9,2,9,94,94,94,94,94,94,94,94,96},
+ {179,82,157,76,61,35,13,90,197,2,69,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,39,39},
+ {136,136,148,63,66,10,169,95,95,163,30,28,28,2,41,130,2,2,2,21,2,2,2,2,2,2,2,2,2,2,2,36},
+ {131,40,112,63,55,30,53,79,79,79,2,79,2,2,2,2,2,79,2,2,2,2,14,36,2,21,21,21,21,2,2,91},
+ {165,81,92,48,9,110,12,40,40,34,2,2,2,107,107,107,2,107,2,2,2,2,2,2,2,2,2,2,2,15,41,41},
+ {169,66,170,97,35,56,55,86,32,32,2,2,2,2,14,2,40,2,37,2,2,37,40,40,40,2,2,2,37,37,37,37},
+ {135,63,126,156,70,18,49,143,6,117,2,109,109,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {179,104,117,56,132,56,190,130,130,15,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {193,59,51,68,68,15,170,170,170,143,143,12,2,2,2,63,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {145,101,56,65,23,76,110,2,4,4,4,146,146,146,2,146,2,2,2,2,2,2,2,2,2,2,2,2,2,2,146,146},
+ {144,129,26,98,36,46,47,52,52,52,82,2,2,2,2,2,17,2,2,2,2,2,2,2,2,2,2,2,2,91,2,2},
+ {145,78,166,171,56,20,63,2,2,33,33,33,33,2,78,47,47,47,47,47,2,2,2,2,2,78,78,78,2,2,2,2},
+ {191,69,176,54,47,75,167,2,2,2,188,188,188,30,30,2,67,67,117,2,117,117,117,2,2,36,2,2,2,2,2,2},
+ {186,96,29,122,47,96,170,157,157,157,157,108,159,2,195,195,26,26,26,26,26,2,2,2,2,132,132,132,2,2,2,2},
+ {151,118,226,91,54,49,33,2,2,2,2,4,4,4,143,143,2,2,143,25,25,25,2,143,143,143,143,143,143,143,143,143},
+ {144,91,237,82,81,75,138,163,163,163,117,117,44,2,44,136,136,136,136,2,2,2,2,2,122,122,122,122,2,2,2,136},
+ {189,78,178,64,118,27,189,2,2,67,67,110,110,110,110,2,28,28,2,2,2,2,2,2,2,102,2,2,2,2,2,2},
+ {165,202,83,76,125,65,42,2,44,44,23,2,23,23,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {209,204,92,75,85,146,104,2,7,18,8,2,2,2,204,95,95,95,2,2,2,95,95,95,95,95,95,95,2,2,2,95},
+ {169,68,89,16,193,82,33,262,262,175,148,148,148,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {171,162,78,43,61,17,112,10,171,182,118,33,2,2,2,2,118,2,2,2,2,2,2,151,2,2,2,2,2,2,2,2},
+ {211,121,119,55,90,211,96,89,225,25,178,36,36,36,2,2,108,2,2,2,2,2,2,2,2,2,2,2,2,184,2,2},
+ {154,101,83,17,16,210,41,79,70,158,2,27,27,2,2,2,2,2,2,2,2,2,2,2,2,153,2,2,2,2,2,2},
+ {169,179,130,79,148,180,136,17,47,119,2,119,119,169,169,2,169,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {241,171,148,31,172,34,66,60,156,140,2,2,2,75,75,2,2,2,2,2,2,2,190,190,2,2,2,30,2,2,2,2},
+ {229,189,183,106,118,138,82,149,265,39,2,2,265,2,2,2,2,2,2,130,2,2,2,71,71,2,2,2,71,2,2,71},
+ {165,157,127,21,64,15,80,130,130,130,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,74,2},
+ {221,130,203,84,83,83,29,121,54,54,2,141,2,2,94,94,94,4,4,4,2,4,2,2,2,54,54,108,16,16,94,52},
+ {230,166,20,160,121,102,153,94,16,67,2,2,2,2,2,2,97,97,97,2,2,97,97,2,97,97,97,97,97,97,97,97},
+ {181,79,137,119,139,24,77,17,50,25,25,25,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {239,242,192,40,41,62,124,193,193,31,193,2,2,2,2,2,2,2,2,2,2,2,2,148,2,2,2,2,2,2,2,2},
+ {239,178,73,122,239,51,95,48,78,88,78,2,2,2,2,2,2,2,2,2,2,2,144,144,2,2,144,144,144,2,144,144},
+ {234,117,198,34,143,21,74,6,252,252,98,2,2,2,2,197,38,2,2,2,2,2,47,2,47,47,47,47,2,2,2,47},
+ {179,110,38,28,58,39,16,29,42,125,202,8,8,129,4,4,2,2,2,67,67,2,2,2,2,2,2,8,67,67,2,2},
+ {246,53,189,50,18,59,179,179,7,137,137,2,2,103,103,103,103,40,40,40,2,2,2,2,73,73,73,2,103,103,103,103},
+ {239,133,87,92,193,12,206,238,238,238,31,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {191,244,60,193,18,32,193,104,74,125,125,66,2,2,2,2,2,2,2,2,2,2,125,125,2,125,125,125,2,2,2,2},
+ {177,74,90,91,172,219,63,84,32,2,2,196,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {253,143,54,39,122,32,75,107,234,2,6,6,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {282,89,71,88,30,23,81,105,105,2,2,105,105,131,107,2,2,2,2,2,195,195,2,2,29,29,21,21,128,195,195,195},
+ {259,115,171,40,156,71,67,24,24,2,2,2,24,4,4,4,2,234,2,2,2,2,2,2,2,2,2,74,74,2,2,2},
+ {264,237,49,203,247,108,75,75,75,2,2,32,16,8,16,16,16,164,14,164,2,2,32,16,8,16,16,32,42,42,42,2},
+ {264,106,89,51,29,226,23,286,286,151,151,151,151,151,2,2,2,2,2,2,31,31,31,2,2,2,2,2,2,2,2,284},
+ {194,215,82,23,213,23,108,127,74,2,201,32,178,2,285,2,2,2,2,285,2,2,2,2,2,2,2,2,2,2,2,2},
+ {196,267,251,111,231,14,30,52,95,2,154,53,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {266,67,22,101,102,157,53,95,130,2,42,76,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {281,205,107,178,236,122,122,316,76,215,215,2,60,2,2,2,2,2,2,227,2,2,2,2,2,2,2,2,27,2,2,2},
+ {271,89,65,195,132,162,102,45,56,174,104,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {200,169,170,121,155,68,131,167,78,113,113,2,2,64,2,2,2,2,2,2,2,2,2,2,2,2,2,173,2,2,2,2},
+ {288,143,265,264,71,19,231,169,27,27,27,2,2,2,2,2,2,2,2,2,2,2,2,2,51,2,2,2,2,2,2,2},
+ {311,141,96,173,90,119,134,151,35,252,39,2,39,39,2,2,2,2,2,2,2,2,2,113,113,2,2,2,2,2,2,113},
+ {311,230,52,138,225,346,162,216,216,91,160,182,91,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {275,167,128,244,184,184,44,210,237,139,139,139,139,2,2,2,2,2,2,2,2,2,2,73,2,2,2,2,2,2,2,2},
+ {176,156,83,135,46,197,108,63,33,33,33,2,133,2,213,213,213,213,133,133,2,133,2,2,133,133,2,2,2,2,2,2},
+ {283,125,141,192,89,181,106,208,124,124,2,112,112,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {289,191,171,152,191,173,54,13,21,56,56,56,2,2,2,2,2,2,2,2,2,220,2,2,2,2,2,2,2,2,2,2},
+ {334,305,132,132,99,126,54,116,164,105,2,105,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,287,2,2,2,2},
+ {240,166,44,193,153,333,15,99,246,99,2,2,99,99,2,2,2,2,195,195,195,2,195,195,2,263,263,2,195,195,195,263},
+ {246,194,265,79,225,65,24,62,46,181,2,2,2,314,2,2,2,2,2,2,2,215,2,2,2,2,2,2,2,2,2,2},
+ {229,334,285,302,21,26,24,97,64,40,2,2,2,231,231,231,231,65,2,148,2,2,2,2,2,2,2,2,2,2,2,2},
+ {251,295,55,249,135,173,164,78,261,261,2,2,2,2,114,2,2,2,2,2,256,142,142,2,2,2,2,2,2,2,2,185},
+ {232,153,55,60,181,79,107,70,29,35,2,2,58,58,2,58,2,2,2,2,61,61,2,61,61,2,2,61,61,90,2,90},
+ {246,116,45,146,109,90,32,103,133,119,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {246,113,146,232,162,262,204,47,45,331,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {360,150,84,275,13,26,368,49,244,244,63,63,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {239,295,174,87,30,87,85,36,103,36,2,278,2,2,2,2,2,2,163,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {356,300,75,310,123,301,200,107,183,37,218,37,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {358,207,168,150,150,21,156,50,195,275,275,275,2,2,2,2,2,251,2,2,2,251,251,251,251,251,251,251,251,251,2,2},
+ {322,194,234,62,236,147,239,400,255,255,80,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {326,276,134,100,143,113,115,221,13,339,194,194,194,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {192,213,113,174,403,117,342,342,311,35,35,2,2,2,2,2,2,2,2,101,2,2,2,2,2,2,2,2,2,101,101,101},
+ {264,273,316,53,40,330,51,285,115,219,147,2,2,2,335,2,2,2,2,2,173,2,173,2,2,173,173,173,173,173,173,83},
+ {254,293,407,118,54,296,160,231,4,4,93,2,2,2,2,2,60,61,2,2,120,127,127,127,88,88,88,88,88,88,88,88},
+ {341,78,336,263,281,164,99,334,296,114,109,2,163,163,163,163,2,2,2,2,2,2,2,125,125,292,292,292,292,125,125,125},
+ {355,87,212,100,89,210,133,344,120,45,45,138,138,138,138,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {274,141,46,219,158,284,38,79,73,185,35,6,81,2,2,2,2,53,2,2,81,81,2,81,2,2,2,53,53,53,53,53},
+ {349,303,439,19,95,240,174,191,2,162,162,2,2,2,76,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {360,91,201,205,67,181,59,77,2,44,103,103,103,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,125},
+ {283,154,261,91,77,147,227,105,116,311,256,256,2,116,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,32,2},
+ {287,288,111,89,249,370,55,16,248,67,67,115,2,2,134,134,2,2,2,2,2,2,2,2,2,2,2,2,2,22,22,22},
+ {284,270,282,37,29,181,160,49,285,285,374,250,2,374,374,2,2,2,179,179,35,2,179,179,2,179,179,2,2,285,285,285},
+ {359,305,52,36,243,231,7,92,2,68,68,307,62,45,2,2,112,311,311,311,2,2,2,2,2,2,2,2,2,2,2,2},
+ {288,119,218,137,364,38,27,380,2,2,211,23,33,2,2,2,2,2,225,225,225,2,2,225,225,225,2,2,2,2,2,2},
+ {277,155,232,309,370,365,348,75,214,214,214,4,4,2,2,2,210,210,210,210,210,210,210,2,2,2,2,2,2,2,2,2},
+ {292,204,91,41,124,190,107,322,125,125,125,125,125,25,25,62,2,2,146,146,2,2,62,146,2,146,114,146,114,2,2,2},
+ {282,195,192,409,68,99,253,106,2,2,2,231,55,55,2,323,323,55,55,285,285,285,285,2,2,2,2,2,2,285,285,323},
+ {282,222,268,86,21,109,353,408,2,2,2,2,135,12,12,216,241,241,241,241,241,241,241,241,241,303,303,303,135,135,135,2},
+ {374,94,89,257,137,246,186,196,2,2,2,2,2,454,122,122,122,122,2,2,2,28,28,94,94,94,94,94,122,122,122,122},
+ {288,370,141,284,207,192,450,67,2,2,2,183,217,217,217,183,183,167,202,202,202,202,167,167,2,2,2,164,164,80,167,167},
+ {286,293,199,39,158,332,242,103,2,2,2,408,266,315,2,2,365,253,315,315,315,315,315,2,2,315,2,2,2,2,2,2},
+ {398,88,78,57,260,203,203,43,131,131,131,204,204,322,204,2,102,2,325,325,325,325,2,2,2,2,2,2,2,2,2,2},
+ {390,174,70,155,163,67,225,49,2,34,34,151,151,2,2,111,2,2,111,111,2,2,2,2,2,2,2,2,2,2,2,2},
+ {408,136,71,63,63,159,222,68,181,181,124,227,14,14,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {294,169,79,242,160,123,178,290,186,186,56,399,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {415,228,69,68,193,122,21,362,33,22,362,57,2,2,2,2,46,46,196,196,196,2,196,196,196,2,196,2,2,2,2,2},
+ {417,238,147,165,346,19,92,164,266,291,291,43,2,2,2,345,2,2,2,345,345,2,2,2,2,2,345,2,2,2,2,2},
+ {456,192,86,182,35,174,342,102,210,210,210,393,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,256,256,158},
+ {432,168,63,154,166,46,479,145,144,288,288,288,288,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {341,256,113,85,188,233,161,29,110,167,91,91,253,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {311,360,312,158,73,16,106,209,472,48,24,203,203,2,2,2,2,234,234,234,2,234,234,203,2,2,2,234,234,234,234,234},
+ {437,196,161,100,132,246,395,187,35,35,35,2,2,35,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {438,174,338,145,155,276,422,374,4,463,463,99,224,70,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {426,225,211,130,325,283,353,96,282,23,299,2,2,2,63,63,2,276,276,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {430,101,288,38,200,332,325,193,123,123,88,2,2,2,2,2,231,231,139,139,139,139,139,139,139,139,139,139,139,139,139,139},
+ {434,143,308,389,365,363,174,63,121,125,260,2,2,260,260,2,2,2,2,2,2,2,2,2,2,258,2,2,2,258,2,2},
+ {453,123,201,141,229,223,234,494,102,102,102,2,2,102,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,252},
+ {438,168,65,264,304,74,168,88,114,132,187,2,127,127,2,2,2,2,2,81,81,56,2,2,2,307,2,2,2,2,81,81},
+ {324,181,141,129,33,171,173,291,227,373,52,301,301,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {335,114,55,47,33,173,287,345,198,198,136,238,238,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {456,162,188,223,408,209,28,164,299,299,258,186,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {360,397,130,172,407,479,295,13,38,199,199,346,2,2,2,2,2,2,145,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {512,136,129,361,180,61,274,128,422,27,292,165,2,2,2,2,2,2,363,117,117,117,117,2,2,2,2,363,2,2,2,2},
+ {478,433,483,302,200,227,273,27,171,171,371,102,2,2,2,2,2,20,2,2,2,2,2,2,2,2,403,403,2,2,2,2},
+ {485,158,454,86,212,60,93,40,209,188,188,106,2,231,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {390,448,111,145,47,555,367,317,315,52,429,435,429,429,2,2,2,2,2,2,2,2,229,2,2,229,2,2,2,229,2,2},
+ {378,406,112,198,539,550,516,59,240,240,23,316,2,122,2,2,2,2,2,2,2,2,2,2,111,111,2,2,2,95,2,2},
+ {495,406,306,239,172,323,236,50,37,435,2,310,56,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {397,393,191,269,462,151,264,134,307,307,2,163,163,2,2,2,2,2,2,2,2,2,2,2,2,2,159,2,2,2,2,2},
+ {485,491,325,149,122,145,228,100,311,64,2,62,137,2,137,2,2,2,2,2,2,2,392,2,2,2,2,2,2,2,2,2},
+ {507,195,130,401,363,171,483,20,86,464,2,89,89,2,26,2,2,2,2,2,425,425,2,2,2,2,2,2,2,2,2,2},
+ {380,220,87,122,242,78,207,371,95,305,2,2,2,2,440,440,445,358,358,331,331,358,445,445,445,445,445,445,445,445,445,445},
+ {507,221,247,137,182,90,28,207,325,438,2,2,2,2,2,187,232,438,2,2,68,37,37,37,37,37,37,37,37,37,161,2},
+ {509,265,101,126,203,86,152,416,352,85,2,2,2,284,391,368,2,2,152,2,2,2,325,2,2,2,2,2,2,2,2,2},
+ {572,359,332,480,68,535,59,504,365,21,2,2,246,54,246,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {415,178,178,372,415,400,73,82,348,99,2,23,325,44,2,2,2,2,2,2,2,2,325,2,2,2,2,2,2,2,2,2},
+ {430,275,236,361,42,552,368,236,653,74,65,458,288,307,307,2,2,2,2,2,2,2,65,65,2,2,2,2,2,2,2,2},
+ {434,139,58,437,130,441,188,15,63,145,145,145,300,2,2,2,2,300,2,2,2,2,2,2,2,2,401,401,401,401,401,401},
+ {542,138,266,514,552,202,103,197,574,48,2,96,96,2,2,96,96,217,2,2,2,2,2,2,2,2,2,2,2,2,2,217},
+ {546,494,72,272,550,219,213,209,169,404,69,464,86,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {422,413,561,110,242,62,436,478,18,150,606,88,643,2,249,2,2,2,2,456,2,2,2,2,2,2,2,2,2,2,2,456},
+ {555,516,310,438,290,559,52,265,248,193,285,441,285,285,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {555,300,232,386,470,300,355,177,57,407,450,279,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {534,274,194,220,575,81,206,544,341,85,137,429,429,429,429,344,2,2,2,2,2,315,315,315,315,315,315,72,72,72,2,2},
+ {576,301,142,329,96,41,302,528,126,112,206,206,2,2,2,2,2,2,206,206,2,206,206,2,191,206,206,191,191,191,191,206},
+ {622,526,294,56,498,176,237,351,25,26,474,55,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {446,163,469,481,240,278,51,373,491,13,22,419,2,2,2,2,2,2,2,2,2,176,176,2,2,2,2,2,2,2,2,2},
+ {445,223,102,108,120,166,68,214,737,504,96,96,206,377,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,39,39,528},
+ {425,355,128,58,194,82,438,117,10,34,34,35,112,107,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {433,294,192,205,152,70,99,68,392,169,309,390,390,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,199,2,2,2},
+ {437,561,384,619,363,420,614,117,217,247,405,142,142,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {437,133,516,423,305,90,135,25,266,487,6,286,286,2,2,2,2,2,2,2,2,2,2,2,2,510,510,2,2,2,2,2},
+ {610,477,478,516,318,184,267,423,190,494,494,2,336,336,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {590,463,461,162,162,622,167,254,29,377,377,75,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {448,126,129,168,209,340,40,96,509,509,509,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {635,212,284,356,187,591,275,361,194,317,488,2,2,2,2,2,2,97,6,2,6,247,2,2,2,2,2,2,2,2,2,6},
+ {612,395,104,86,264,321,521,325,252,53,178,100,100,100,16,343,343,343,343,343,2,2,2,2,2,2,2,2,2,343,343,343},
+ {486,428,287,472,292,141,504,178,585,98,282,2,2,2,2,2,2,2,2,2,2,2,2,284,284,284,78,284,2,2,2,2},
+ {462,579,236,447,60,162,427,258,73,742,742,2,742,742,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {469,507,276,227,66,237,260,386,27,666,31,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {626,196,111,465,386,431,181,414,614,391,349,318,389,2,389,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {653,169,261,533,488,282,213,443,337,480,503,174,534,2,2,2,2,2,534,2,2,2,2,534,2,2,2,2,534,2,2,2},
+ {639,253,95,380,108,448,223,254,381,30,6,644,6,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {512,347,65,546,434,87,18,123,672,412,316,6,699,6,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {657,233,108,38,147,53,136,168,408,477,477,279,268,289,2,2,2,2,2,2,289,2,2,2,2,2,2,2,2,289,289,2},
+ {521,249,388,155,467,245,134,311,72,312,312,623,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {669,421,230,70,212,845,237,347,148,76,823,472,2,2,2,132,2,2,2,2,2,2,2,383,132,383,2,2,383,383,383,383},
+ {672,150,164,622,196,75,302,119,42,314,314,132,60,60,60,298,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {705,302,411,705,691,160,809,40,32,867,826,826,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {707,323,409,27,31,157,492,463,886,412,251,251,304,190,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {793,279,264,566,252,495,872,492,482,107,294,503,350,350,2,2,2,2,2,2,2,285,285,273,273,273,273,2,2,2,2,2},
+ {791,275,60,137,352,839,67,476,356,216,216,563,563,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {709,509,697,145,252,194,304,192,192,623,623,4,423,2,2,2,199,423,2,2,2,222,222,2,2,623,623,623,623,623,2,222},
+ {539,310,463,103,553,45,609,326,197,2,62,113,272,2,62,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {750,703,182,242,92,335,272,466,594,2,701,569,474,129,140,140,2,507,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {872,630,513,218,719,174,197,104,86,281,281,281,541,642,281,94,2,45,94,2,335,335,2,2,2,2,2,2,2,2,2,84},
+ {744,466,389,280,229,134,363,177,389,2,2,2,536,273,536,536,536,536,168,45,45,45,45,2,2,2,2,2,2,2,2,2},
+ {468,430,849,689,202,427,45,34,105,2,2,2,2,4,4,4,4,4,4,4,2,2,2,4,4,4,4,4,2,2,2,2},
+ {563,325,717,766,440,705,290,123,228,2,2,2,32,64,146,2,2,2,116,79,79,2,146,146,79,79,79,2,2,146,146,79},
+ {781,638,410,399,336,465,856,426,28,2,4,4,6,6,2,2,2,449,372,372,449,449,449,2,2,449,449,449,449,449,449,2},
+ {818,280,99,873,165,426,341,74,479,342,727,684,684,662,662,2,2,2,2,2,2,662,2,2,2,2,2,2,2,2,2,2},
+ {901,490,693,410,666,119,703,593,201,61,70,70,774,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,418,418},
+ {859,584,475,745,506,900,40,869,143,612,175,275,209,12,12,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {612,237,272,53,534,682,372,935,494,536,536,599,599,599,2,536,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {708,442,186,698,345,103,687,463,163,416,416,107,2,2,2,375,375,416,6,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {927,493,988,194,97,1006,377,578,105,248,707,784,98,784,2,2,2,2,2,2,2,2,2,370,370,2,370,2,2,2,2,2}
+};
Index: trunk/cuba/src/divonne/Explore.c
===================================================================
--- trunk/cuba/src/divonne/Explore.c (revision 158)
+++ trunk/cuba/src/divonne/Explore.c (revision 159)
@@ -1,179 +1,160 @@
/*
Explore.c
sample region, determine min and max, split if necessary
this file is part of Divonne
- last modified 8 Jun 10 th
+ last modified 12 Mar 15 th
*/
typedef struct {
real fmin, fmax;
creal *xmin, *xmax;
} Extrema;
/*********************************************************************/
-static bool Explore(This *t, count iregion, cSamples *samples,
- cint depth, cint flags)
+static int ExploreSerial(This *t, ccount iregion)
{
-#define SPLICE (flags & 1)
-#define HAVESAMPLES (flags & 2)
+ csize_t regionsize = RegionSize;
+ Region *region = RegionPtr(iregion);
+ cBounds *bounds = region->bounds;
+ Result *result = RegionResult(region);
+ real *minmax = RegionMinMax(region);
- TYPEDEFREGION;
-
- count n, dim, comp, maxcomp;
- Extrema extrema[100];//#TT used to be: Extrema extrema[NCOMP];
+ Vector(Extrema, extrema, NCOMP);
+ Vector(real, xtmp, NDIM);
Result *r;
creal *x;
real *f;
real halfvol, maxerr;
- Region *region;
- Bounds *bounds;
- Result *result;
-
- /* needed as of gcc 3.3 to make gcc correctly address region #@$&! */
- // sizeof(*region);
-
- if( SPLICE ) {
- if( t->nregions == t->size ) {
- t->size += CHUNKSIZE;
- ReAlloc(t->voidregion, t->size*sizeof(Region));
- }
- VecCopy(RegionPtr(t->nregions)->bounds, RegionPtr(iregion)->bounds);
- iregion = t->nregions++;
- }
- region = RegionPtr(iregion);
- bounds = region->bounds;
- result = region->result;
+ count n, dim, comp, maxcomp;
+ cSamples *samples = &t->samples[region->isamples];
for( comp = 0; comp < t->ncomp; ++comp ) {
Extrema *e = &extrema[comp];
e->fmin = INFTY;
e->fmax = -INFTY;
e->xmin = e->xmax = NULL;
}
- if( !HAVESAMPLES ) {
+ if( region->isamples == 0 ) { /* others already sampled */
real vol = 1;
for( dim = 0; dim < t->ndim; ++dim ) {
cBounds *b = &bounds[dim];
vol *= b->upper - b->lower;
}
region->vol = vol;
for( comp = 0; comp < t->ncomp; ++comp ) {
Result *r = &result[comp];
r->fmin = INFTY;
r->fmax = -INFTY;
}
x = t->xgiven;
f = t->fgiven;
n = t->ngiven;
if( t->nextra ) n += SampleExtra(t, bounds);
for( ; n; --n ) {
for( dim = 0; dim < t->ndim; ++dim ) {
cBounds *b = &bounds[dim];
if( x[dim] < b->lower || x[dim] > b->upper ) goto skip;
}
for( comp = 0; comp < t->ncomp; ++comp ) {
Extrema *e = &extrema[comp];
creal y = f[comp];
if( y < e->fmin ) e->fmin = y, e->xmin = x;
if( y > e->fmax ) e->fmax = y, e->xmax = x;
}
skip:
x += t->ldxgiven;
f += t->ncomp;
}
- samples->sampler(t, samples, bounds, vol);
+ samples->sampler(t, iregion);
}
x = samples->x;
f = samples->f;
for( n = samples->n; n; --n ) {
for( comp = 0; comp < t->ncomp; ++comp ) {
Extrema *e = &extrema[comp];
creal y = *f++;
if( y < e->fmin ) e->fmin = y, e->xmin = x;
if( y > e->fmax ) e->fmax = y, e->xmax = x;
}
x += t->ndim;
}
t->neval_opt -= t->neval;
halfvol = .5*region->vol;
maxerr = -INFTY;
maxcomp = -1;
for( comp = 0; comp < t->ncomp; ++comp ) {
Extrema *e = &extrema[comp];
Result *r = &result[comp];
- real xtmp[NDIM], ftmp, err;
+ real ftmp, err;
if( e->xmin ) { /* not all NaNs */
t->selectedcomp = comp;
- VecCopy(xtmp, e->xmin);
+ XCopy(xtmp, e->xmin);
ftmp = FindMinimum(t, bounds, xtmp, e->fmin);
if( ftmp < r->fmin ) {
r->fmin = ftmp;
- VecCopy(r->xmin, xtmp);
+ XCopy(&minmax[2*comp*t->ndim], xtmp);
}
t->selectedcomp = Tag(comp);
- VecCopy(xtmp, e->xmax);
+ XCopy(xtmp, e->xmax);
ftmp = -FindMinimum(t, bounds, xtmp, -e->fmax);
if( ftmp > r->fmax ) {
r->fmax = ftmp;
- VecCopy(r->xmax, xtmp);
+ XCopy(&minmax[(2*comp + 1)*t->ndim], xtmp);
}
}
- r->avg = samples->avg[comp];
- r->err = samples->err[comp];
r->spread = halfvol*(r->fmax - r->fmin);
-
- err = r->spread/Max(fabs(r->avg), NOTZERO);
+ err = r->spread/Max(fabsx(r->avg), NOTZERO);
if( err > maxerr ) {
maxerr = err;
maxcomp = comp;
}
}
t->neval_opt += t->neval;
if( maxcomp == -1 ) { /* all NaNs */
region->depth = 0;
- return false;
+ return -1;
}
region->cutcomp = maxcomp;
- r = &region->result[maxcomp];
+ r = RegionResult(region) + maxcomp;
if( halfvol*(r->fmin + r->fmax) > r->avg ) {
region->fminor = r->fmin;
region->fmajor = r->fmax;
- region->xmajor = r->xmax - (real *)region->result;
+ region->xmajor = (2*maxcomp + 1)*t->ndim;
}
else {
region->fminor = r->fmax;
region->fmajor = r->fmin;
- region->xmajor = r->xmin - (real *)region->result;
+ region->xmajor = 2*maxcomp*t->ndim;
}
- region->depth = IDim(depth);
-
- if( !HAVESAMPLES ) {
- if( samples->weight*r->spread < r->err ||
- r->spread < t->totals[maxcomp].secondspread ) region->depth = 0;
+ if( region->isamples == 0 ) {
+ if( (region->depth < INIDEPTH && r->spread < samples->neff*r->err) ||
+ r->spread < t->totals[maxcomp].secondspread )
+ region->depth = 0;
if( region->depth == 0 )
for( comp = 0; comp < t->ncomp; ++comp )
t->totals[comp].secondspread =
Max(t->totals[comp].secondspread, result[comp].spread);
}
- if( region->depth ) Split(t, iregion, region->depth);
- return true;
+ if( region->depth ) Split(t, iregion);
+
+ return iregion;
}
Index: trunk/cuba/src/divonne/KorobovCoeff.c-3319
===================================================================
--- trunk/cuba/src/divonne/KorobovCoeff.c-3319 (revision 0)
+++ trunk/cuba/src/divonne/KorobovCoeff.c-3319 (revision 159)
@@ -0,0 +1,356 @@
+#define KOROBOV_MINDIM 2
+#define KOROBOV_MAXDIM 33
+#define MAXPRIME 3319
+
+#define Hash(x) ((6967 - x)*(-47 + x))/36952
+
+static int prime[] = {
+ FIRST,47,53,59,61,67,73,79,83,89,97,101,107,113,127,131,137,139,149,
+ 151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,
+ 251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,
+ 359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,
+ 463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,
+ 593,599,601,607,613,617,619,631,641,643,647,653,659,661,673,677,683,691,
+ 701,709,719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,
+ 827,829,839,853,857,859,863,877,881,883,887,907,911,919,929,937,941,947,
+ 953,967,971,977,983,991,997,1009,1013,1019,1021,1031,1033,1039,1049,
+ 1051,1061,1063,1069,1087,1091,1093,1097,1103,1109,1117,1123,1129,1151,
+ 1153,1163,1171,1181,1187,1193,1201,1213,1217,1223,1229,1231,1237,1249,
+ 1259,1277,1279,1283,1291,1297,1307,1319,1321,1327,1361,1367,1373,1381,
+ 1399,1409,1423,1427,1429,1433,1439,1447,1451,1453,1459,1471,1481,1493,
+ 1499,1511,1523,1531,1543,1549,1559,1567,1579,1583,1597,1607,1613,1621,
+ 1637,1657,1663,1667,1669,1693,1697,1699,1709,1723,1733,1747,1753,1759,
+ 1777,1787,1801,1811,1823,1831,1847,1861,1867,1877,1889,1901,1913,1931,
+ 1933,1949,1951,1973,1979,1993,2003,2017,2029,2039,2053,2069,2081,2099,
+ 2111,2129,2137,2153,2161,2179,2203,2207,2221,2237,2243,2267,2273,2293,
+ 2309,2333,2339,2351,2371,2389,2399,2417,2437,2459,2473,2503,2521,2531,
+ 2549,2557,2591,2609,2621,2647,2671,2693,2713,2741,2767,2789,2819,2843,
+ 2879,2897,2927,2963,2999,3037,3079,3121,3181,3229,MarkLast(3319)
+};
+
+static short coeff[][32] = {
+ {13,11,10,3,9,2,2,2,2,9,2,2,7,2,2,2,2,2,2,6,2,2,2,13,11,10,3,9,2,2,2,2},
+ {23,17,12,11,14,14,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,12,12,12,14,14,14},
+ {18,14,5,14,2,2,19,19,25,25,18,18,18,2,2,2,2,2,2,2,2,2,2,2,25,6,2,2,2,18,14,5},
+ {17,21,7,6,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,6,2,2,2,6,2,2,2,17,7},
+ {18,13,23,5,2,12,6,12,12,12,10,10,16,2,16,16,2,2,2,2,2,2,2,10,2,2,2,2,10,2,2,2},
+ {27,14,10,14,2,4,13,2,2,16,4,4,4,6,6,6,6,6,6,25,25,31,31,15,31,2,2,31,15,14,14,6},
+ {29,19,27,32,6,8,2,2,2,2,2,8,8,2,2,2,2,9,9,9,9,2,2,2,2,2,2,2,9,9,2,2},
+ {30,19,24,16,22,8,2,2,22,5,9,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {34,28,13,28,27,27,2,4,2,2,2,16,16,4,20,20,36,20,36,5,5,5,36,36,5,5,5,7,5,7,7,2},
+ {35,19,33,8,21,30,8,2,4,2,4,4,2,2,2,2,2,2,2,2,2,17,2,2,11,25,11,17,17,17,17,17},
+ {39,40,15,21,11,26,13,2,2,13,2,2,2,2,2,2,2,2,2,2,26,26,2,2,2,2,2,2,2,2,2,2},
+ {41,22,15,7,26,29,29,2,2,2,2,2,2,41,41,2,2,2,31,31,2,31,31,2,31,2,2,2,2,2,2,2},
+ {35,22,37,9,35,12,35,8,2,2,50,50,2,2,32,32,32,31,13,8,8,8,2,22,50,9,9,9,22,22,22,10},
+ {29,24,43,36,49,2,2,8,4,25,49,25,2,2,8,10,10,10,5,5,5,40,10,33,40,40,2,27,10,25,25,25},
+ {50,18,32,39,21,2,2,2,4,4,36,36,14,14,14,14,2,2,2,17,17,17,16,16,2,14,14,14,14,2,2,2},
+ {31,28,45,20,18,43,43,13,28,2,2,2,31,31,31,31,31,2,2,2,43,43,2,2,2,2,2,2,2,2,30,2},
+ {39,15,41,7,24,2,2,30,40,2,2,25,25,25,25,2,2,2,2,2,2,6,6,2,25,2,5,2,2,25,2,2},
+ {44,20,29,39,7,21,21,21,2,2,45,2,2,2,49,49,49,49,49,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {56,20,22,13,18,35,35,6,2,4,2,4,2,2,2,23,16,16,4,23,2,34,52,2,34,2,4,2,2,2,23,16},
+ {46,32,17,18,29,27,31,31,31,2,2,4,15,2,2,2,2,2,2,2,2,2,2,2,2,2,23,32,32,32,15,15},
+ {62,42,43,17,23,13,13,2,2,13,2,2,2,2,2,2,2,10,2,2,2,2,9,10,2,2,2,19,9,9,9,9},
+ {46,49,49,52,27,7,20,2,2,6,6,13,13,13,2,13,13,2,2,2,2,2,2,34,34,2,2,2,2,2,2,2},
+ {64,34,16,28,16,51,47,2,2,2,6,18,39,39,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,12,12,2},
+ {74,26,44,25,50,24,54,39,58,42,2,42,42,2,2,2,2,2,2,2,2,33,33,2,2,39,11,2,2,58,39,58},
+ {70,22,50,22,16,9,25,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {74,21,17,25,35,33,10,2,10,20,20,57,57,57,2,2,57,2,2,2,2,2,2,2,13,2,2,2,2,2,2,2},
+ {81,18,10,11,47,38,71,37,2,37,2,2,2,2,2,26,26,26,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {71,68,68,27,71,39,81,44,2,2,2,12,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {55,30,85,42,16,36,45,67,2,2,68,2,2,2,2,2,2,2,68,10,2,2,2,2,2,2,2,2,2,2,2,2},
+ {64,17,24,26,49,12,10,39,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,59,2,2},
+ {68,57,23,38,61,38,13,13,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2,68,15,2,44,44,44,2,2,2},
+ {94,28,58,29,13,5,15,8,66,2,2,2,39,39,15,66,2,2,6,6,2,2,66,66,66,66,2,2,2,2,2,66},
+ {94,85,9,41,41,37,29,29,17,2,2,2,7,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,8,8},
+ {89,32,75,77,77,13,2,30,30,2,2,2,2,2,2,2,2,2,2,67,67,2,2,2,2,2,2,2,2,8,19,32},
+ {70,45,58,63,67,10,72,72,70,6,2,36,2,70,70,6,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {101,33,76,13,45,63,2,2,6,19,2,2,32,32,32,32,32,65,2,63,63,11,11,11,19,19,19,19,9,63,63,63},
+ {70,89,44,37,19,45,2,2,2,8,10,8,54,54,80,80,80,80,80,2,116,2,116,2,2,80,40,51,100,100,8,2},
+ {71,54,83,51,42,98,2,2,8,8,14,30,93,22,15,15,30,30,30,44,44,44,2,2,22,22,22,117,44,11,11,11},
+ {109,37,51,113,17,10,2,2,17,17,55,2,55,55,55,55,55,55,2,2,2,57,48,48,55,55,2,2,55,2,2,55},
+ {75,38,68,89,11,52,2,2,81,39,2,38,2,2,2,2,2,2,2,2,2,2,2,19,2,2,2,2,2,2,2,2},
+ {80,38,62,66,39,59,2,36,48,33,2,2,41,2,48,48,2,2,2,2,2,2,48,2,2,2,2,2,2,2,2,2},
+ {81,84,35,34,20,93,2,12,12,12,2,96,2,96,96,2,96,2,2,2,2,2,2,2,2,2,2,2,2,56,56,56},
+ {109,72,60,96,67,32,85,84,27,91,91,2,10,29,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {104,32,56,46,77,11,35,35,24,56,19,2,2,2,78,2,2,75,2,2,2,2,78,2,2,2,2,2,2,2,2,2},
+ {81,103,25,35,28,15,20,20,20,2,2,2,2,20,20,20,107,107,2,2,2,2,2,2,2,2,2,2,2,2,13,13},
+ {119,75,42,29,74,23,54,36,39,2,2,4,4,19,19,2,2,2,2,2,2,2,2,54,2,2,2,2,2,2,2,54},
+ {115,73,22,102,75,138,16,73,50,16,2,50,2,2,2,133,2,2,2,2,2,2,2,2,2,2,2,2,2,33,33,33},
+ {119,48,66,51,14,22,20,20,2,2,2,2,2,60,2,2,2,2,2,2,2,2,60,2,2,2,2,2,2,60,2,65},
+ {121,94,80,29,51,69,42,36,14,14,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,17,2,2},
+ {129,123,41,79,43,34,24,11,2,2,4,2,2,2,2,75,16,16,16,75,75,75,16,16,16,25,2,99,2,2,75,16},
+ {128,33,35,68,22,8,62,94,2,2,2,62,62,2,98,2,2,4,98,2,2,32,81,32,32,32,98,98,98,98,98,98},
+ {101,109,154,15,57,6,27,36,2,2,37,37,2,2,2,2,2,2,2,107,2,2,2,107,107,2,2,2,2,2,2,2},
+ {106,40,24,38,61,118,106,106,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {149,111,58,79,127,13,41,33,27,16,30,2,61,2,72,2,2,2,2,2,2,2,2,2,2,2,2,75,75,2,2,2},
+ {105,92,43,156,25,53,57,115,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {99,40,62,67,66,29,99,99,99,78,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,79},
+ {109,42,96,95,66,41,103,84,13,103,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {111,72,16,89,25,86,117,29,14,14,2,2,2,2,2,60,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {106,72,49,94,140,44,97,157,75,2,2,4,123,123,2,2,123,123,123,123,2,2,2,2,2,2,2,2,2,2,2,2},
+ {115,67,74,32,43,50,21,36,135,36,85,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {151,71,157,42,41,37,80,27,18,2,2,2,2,2,2,2,2,2,2,2,2,2,115,128,128,128,128,128,32,2,128,80},
+ {119,91,38,30,92,44,32,76,22,2,34,2,2,2,2,2,2,2,2,2,2,2,2,2,2,129,2,2,129,2,2,2},
+ {121,126,31,52,120,37,57,10,171,2,2,2,2,35,35,35,2,2,97,97,97,97,97,97,97,35,35,35,97,97,97,2},
+ {155,86,49,104,87,94,64,45,61,91,91,91,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {164,121,44,166,47,33,7,15,13,2,2,122,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {128,120,133,17,71,52,25,107,42,21,21,2,2,2,2,4,4,96,2,9,9,2,9,94,94,94,94,94,94,94,94,96},
+ {179,82,157,76,61,35,13,90,197,2,69,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,39,39},
+ {136,136,148,63,66,10,169,95,95,163,30,28,28,2,41,130,2,2,2,21,2,2,2,2,2,2,2,2,2,2,2,36},
+ {131,40,112,63,55,30,53,79,79,79,2,79,2,2,2,2,2,79,2,2,2,2,14,36,2,21,21,21,21,2,2,91},
+ {165,81,92,48,9,110,12,40,40,34,2,2,2,107,107,107,2,107,2,2,2,2,2,2,2,2,2,2,2,15,41,41},
+ {169,66,170,97,35,56,55,86,32,32,2,2,2,2,14,2,40,2,37,2,2,37,40,40,40,2,2,2,37,37,37,37},
+ {135,63,126,156,70,18,49,143,6,117,2,109,109,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {179,104,117,56,132,56,190,130,130,15,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {193,59,51,68,68,15,170,170,170,143,143,12,2,2,2,63,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {145,101,56,65,23,76,110,2,4,4,4,146,146,146,2,146,2,2,2,2,2,2,2,2,2,2,2,2,2,2,146,146},
+ {144,129,26,98,36,46,47,52,52,52,82,2,2,2,2,2,17,2,2,2,2,2,2,2,2,2,2,2,2,91,2,2},
+ {145,78,166,171,56,20,63,2,2,33,33,33,33,2,78,47,47,47,47,47,2,2,2,2,2,78,78,78,2,2,2,2},
+ {191,69,176,54,47,75,167,2,2,2,188,188,188,30,30,2,67,67,117,2,117,117,117,2,2,36,2,2,2,2,2,2},
+ {186,96,29,122,47,96,170,157,157,157,157,108,159,2,195,195,26,26,26,26,26,2,2,2,2,132,132,132,2,2,2,2},
+ {151,118,226,91,54,49,33,2,2,2,2,4,4,4,143,143,2,2,143,25,25,25,2,143,143,143,143,143,143,143,143,143},
+ {144,91,237,82,81,75,138,163,163,163,117,117,44,2,44,136,136,136,136,2,2,2,2,2,122,122,122,122,2,2,2,136},
+ {189,78,178,64,118,27,189,2,2,67,67,110,110,110,110,2,28,28,2,2,2,2,2,2,2,102,2,2,2,2,2,2},
+ {165,202,83,76,125,65,42,2,44,44,23,2,23,23,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {209,204,92,75,85,146,104,2,7,18,8,2,2,2,204,95,95,95,2,2,2,95,95,95,95,95,95,95,2,2,2,95},
+ {169,68,89,16,193,82,33,262,262,175,148,148,148,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {171,162,78,43,61,17,112,10,171,182,118,33,2,2,2,2,118,2,2,2,2,2,2,151,2,2,2,2,2,2,2,2},
+ {211,121,119,55,90,211,96,89,225,25,178,36,36,36,2,2,108,2,2,2,2,2,2,2,2,2,2,2,2,184,2,2},
+ {154,101,83,17,16,210,41,79,70,158,2,27,27,2,2,2,2,2,2,2,2,2,2,2,2,153,2,2,2,2,2,2},
+ {169,179,130,79,148,180,136,17,47,119,2,119,119,169,169,2,169,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {241,171,148,31,172,34,66,60,156,140,2,2,2,75,75,2,2,2,2,2,2,2,190,190,2,2,2,30,2,2,2,2},
+ {229,189,183,106,118,138,82,149,265,39,2,2,265,2,2,2,2,2,2,130,2,2,2,71,71,2,2,2,71,2,2,71},
+ {165,157,127,21,64,15,80,130,130,130,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,74,2},
+ {221,130,203,84,83,83,29,121,54,54,2,141,2,2,94,94,94,4,4,4,2,4,2,2,2,54,54,108,16,16,94,52},
+ {230,166,20,160,121,102,153,94,16,67,2,2,2,2,2,2,97,97,97,2,2,97,97,2,97,97,97,97,97,97,97,97},
+ {181,79,137,119,139,24,77,17,50,25,25,25,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {239,242,192,40,41,62,124,193,193,31,193,2,2,2,2,2,2,2,2,2,2,2,2,148,2,2,2,2,2,2,2,2},
+ {239,178,73,122,239,51,95,48,78,88,78,2,2,2,2,2,2,2,2,2,2,2,144,144,2,2,144,144,144,2,144,144},
+ {234,117,198,34,143,21,74,6,252,252,98,2,2,2,2,197,38,2,2,2,2,2,47,2,47,47,47,47,2,2,2,47},
+ {179,110,38,28,58,39,16,29,42,125,202,8,8,129,4,4,2,2,2,67,67,2,2,2,2,2,2,8,67,67,2,2},
+ {246,53,189,50,18,59,179,179,7,137,137,2,2,103,103,103,103,40,40,40,2,2,2,2,73,73,73,2,103,103,103,103},
+ {239,133,87,92,193,12,206,238,238,238,31,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {191,244,60,193,18,32,193,104,74,125,125,66,2,2,2,2,2,2,2,2,2,2,125,125,2,125,125,125,2,2,2,2},
+ {177,74,90,91,172,219,63,84,32,2,2,196,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {253,143,54,39,122,32,75,107,234,2,6,6,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {282,89,71,88,30,23,81,105,105,2,2,105,105,131,107,2,2,2,2,2,195,195,2,2,29,29,21,21,128,195,195,195},
+ {259,115,171,40,156,71,67,24,24,2,2,2,24,4,4,4,2,234,2,2,2,2,2,2,2,2,2,74,74,2,2,2},
+ {264,237,49,203,247,108,75,75,75,2,2,32,16,8,16,16,16,164,14,164,2,2,32,16,8,16,16,32,42,42,42,2},
+ {264,106,89,51,29,226,23,286,286,151,151,151,151,151,2,2,2,2,2,2,31,31,31,2,2,2,2,2,2,2,2,284},
+ {194,215,82,23,213,23,108,127,74,2,201,32,178,2,285,2,2,2,2,285,2,2,2,2,2,2,2,2,2,2,2,2},
+ {196,267,251,111,231,14,30,52,95,2,154,53,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {266,67,22,101,102,157,53,95,130,2,42,76,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {281,205,107,178,236,122,122,316,76,215,215,2,60,2,2,2,2,2,2,227,2,2,2,2,2,2,2,2,27,2,2,2},
+ {271,89,65,195,132,162,102,45,56,174,104,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {200,169,170,121,155,68,131,167,78,113,113,2,2,64,2,2,2,2,2,2,2,2,2,2,2,2,2,173,2,2,2,2},
+ {288,143,265,264,71,19,231,169,27,27,27,2,2,2,2,2,2,2,2,2,2,2,2,2,51,2,2,2,2,2,2,2},
+ {311,141,96,173,90,119,134,151,35,252,39,2,39,39,2,2,2,2,2,2,2,2,2,113,113,2,2,2,2,2,2,113},
+ {311,230,52,138,225,346,162,216,216,91,160,182,91,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {275,167,128,244,184,184,44,210,237,139,139,139,139,2,2,2,2,2,2,2,2,2,2,73,2,2,2,2,2,2,2,2},
+ {176,156,83,135,46,197,108,63,33,33,33,2,133,2,213,213,213,213,133,133,2,133,2,2,133,133,2,2,2,2,2,2},
+ {283,125,141,192,89,181,106,208,124,124,2,112,112,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {289,191,171,152,191,173,54,13,21,56,56,56,2,2,2,2,2,2,2,2,2,220,2,2,2,2,2,2,2,2,2,2},
+ {334,305,132,132,99,126,54,116,164,105,2,105,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,287,2,2,2,2},
+ {240,166,44,193,153,333,15,99,246,99,2,2,99,99,2,2,2,2,195,195,195,2,195,195,2,263,263,2,195,195,195,263},
+ {246,194,265,79,225,65,24,62,46,181,2,2,2,314,2,2,2,2,2,2,2,215,2,2,2,2,2,2,2,2,2,2},
+ {229,334,285,302,21,26,24,97,64,40,2,2,2,231,231,231,231,65,2,148,2,2,2,2,2,2,2,2,2,2,2,2},
+ {251,295,55,249,135,173,164,78,261,261,2,2,2,2,114,2,2,2,2,2,256,142,142,2,2,2,2,2,2,2,2,185},
+ {232,153,55,60,181,79,107,70,29,35,2,2,58,58,2,58,2,2,2,2,61,61,2,61,61,2,2,61,61,90,2,90},
+ {246,116,45,146,109,90,32,103,133,119,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {246,113,146,232,162,262,204,47,45,331,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {360,150,84,275,13,26,368,49,244,244,63,63,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {239,295,174,87,30,87,85,36,103,36,2,278,2,2,2,2,2,2,163,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {356,300,75,310,123,301,200,107,183,37,218,37,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {358,207,168,150,150,21,156,50,195,275,275,275,2,2,2,2,2,251,2,2,2,251,251,251,251,251,251,251,251,251,2,2},
+ {322,194,234,62,236,147,239,400,255,255,80,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {326,276,134,100,143,113,115,221,13,339,194,194,194,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {337,132,27,45,14,81,110,84,238,224,211,2,29,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {192,213,113,174,403,117,342,342,311,35,35,2,2,2,2,2,2,2,2,101,2,2,2,2,2,2,2,2,2,101,101,101},
+ {264,273,316,53,40,330,51,285,115,219,147,2,2,2,335,2,2,2,2,2,173,2,173,2,2,173,173,173,173,173,173,83},
+ {254,293,407,118,54,296,160,231,4,4,93,2,2,2,2,2,60,61,2,2,120,127,127,127,88,88,88,88,88,88,88,88},
+ {341,78,336,263,281,164,99,334,296,114,109,2,163,163,163,163,2,2,2,2,2,2,2,125,125,292,292,292,292,125,125,125},
+ {355,87,212,100,89,210,133,344,120,45,45,138,138,138,138,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {274,141,46,219,158,284,38,79,73,185,35,6,81,2,2,2,2,53,2,2,81,81,2,81,2,2,2,53,53,53,53,53},
+ {349,303,439,19,95,240,174,191,2,162,162,2,2,2,76,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {360,91,201,205,67,181,59,77,2,44,103,103,103,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,125},
+ {283,154,261,91,77,147,227,105,116,311,256,256,2,116,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,32,2},
+ {287,288,111,89,249,370,55,16,248,67,67,115,2,2,134,134,2,2,2,2,2,2,2,2,2,2,2,2,2,22,22,22},
+ {284,270,282,37,29,181,160,49,285,285,374,250,2,374,374,2,2,2,179,179,35,2,179,179,2,179,179,2,2,285,285,285},
+ {359,305,52,36,243,231,7,92,2,68,68,307,62,45,2,2,112,311,311,311,2,2,2,2,2,2,2,2,2,2,2,2},
+ {288,119,218,137,364,38,27,380,2,2,211,23,33,2,2,2,2,2,225,225,225,2,2,225,225,225,2,2,2,2,2,2},
+ {277,155,232,309,370,365,348,75,214,214,214,4,4,2,2,2,210,210,210,210,210,210,210,2,2,2,2,2,2,2,2,2},
+ {292,204,91,41,124,190,107,322,125,125,125,125,125,25,25,62,2,2,146,146,2,2,62,146,2,146,114,146,114,2,2,2},
+ {282,195,192,409,68,99,253,106,2,2,2,231,55,55,2,323,323,55,55,285,285,285,285,2,2,2,2,2,2,285,285,323},
+ {299,122,174,403,113,77,63,275,2,2,2,138,276,227,38,227,2,237,2,2,2,2,2,2,2,2,2,2,352,352,352,2},
+ {282,222,268,86,21,109,353,408,2,2,2,2,135,12,12,216,241,241,241,241,241,241,241,241,241,303,303,303,135,135,135,2},
+ {374,94,89,257,137,246,186,196,2,2,2,2,2,454,122,122,122,122,2,2,2,28,28,94,94,94,94,94,122,122,122,122},
+ {288,92,62,428,122,153,481,66,2,2,2,250,250,177,177,177,177,279,279,279,279,279,279,279,2,2,279,177,177,177,177,177},
+ {288,370,141,284,207,192,450,67,2,2,2,183,217,217,217,183,183,167,202,202,202,202,167,167,2,2,2,164,164,80,167,167},
+ {286,293,199,39,158,332,242,103,2,2,2,408,266,315,2,2,365,253,315,315,315,315,315,2,2,315,2,2,2,2,2,2},
+ {407,83,435,187,40,16,52,65,2,2,244,39,77,119,119,2,2,2,119,342,342,2,2,2,2,2,342,2,2,58,58,119},
+ {398,88,78,57,260,203,203,43,131,131,131,204,204,322,204,2,102,2,325,325,325,325,2,2,2,2,2,2,2,2,2,2},
+ {390,174,70,155,163,67,225,49,2,34,34,151,151,2,2,111,2,2,111,111,2,2,2,2,2,2,2,2,2,2,2,2},
+ {393,129,393,169,23,192,168,47,2,2,312,150,71,2,150,2,2,2,61,2,2,61,2,2,2,2,2,2,2,2,2,2},
+ {408,136,71,63,63,159,222,68,181,181,124,227,14,14,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {294,169,79,242,160,123,178,290,186,186,56,399,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {415,228,69,68,193,122,21,362,33,22,362,57,2,2,2,2,46,46,196,196,196,2,196,196,196,2,196,2,2,2,2,2},
+ {415,130,241,185,312,175,309,199,94,281,47,47,2,2,2,2,206,307,221,2,2,2,2,2,239,239,239,239,239,206,206,206},
+ {417,238,147,165,346,19,92,164,266,291,291,43,2,2,2,345,2,2,2,345,345,2,2,2,2,2,345,2,2,2,2,2},
+ {456,192,86,182,35,174,342,102,210,210,210,393,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,256,256,158},
+ {307,255,92,38,325,61,103,246,176,319,80,89,2,241,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {432,168,63,154,166,46,479,145,144,288,288,288,288,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {341,256,113,85,188,233,161,29,110,167,91,91,253,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {311,360,312,158,73,16,106,209,472,48,24,203,203,2,2,2,2,234,234,234,2,234,234,203,2,2,2,234,234,234,234,234},
+ {437,196,161,100,132,246,395,187,35,35,35,2,2,35,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {438,174,338,145,155,276,422,374,4,463,463,99,224,70,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {426,225,211,130,325,283,353,96,282,23,299,2,2,2,63,63,2,276,276,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {430,101,288,38,200,332,325,193,123,123,88,2,2,2,2,2,231,231,139,139,139,139,139,139,139,139,139,139,139,139,139,139},
+ {434,143,308,389,365,363,174,63,121,125,260,2,2,260,260,2,2,2,2,2,2,2,2,2,2,258,2,2,2,258,2,2},
+ {453,123,201,141,229,223,234,494,102,102,102,2,2,102,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,252},
+ {438,168,65,264,304,74,168,88,114,132,187,2,127,127,2,2,2,2,2,81,81,56,2,2,2,307,2,2,2,2,81,81},
+ {324,181,141,129,33,171,173,291,227,373,52,301,301,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {448,119,431,111,135,50,242,95,148,49,49,49,68,2,2,2,2,2,2,2,2,49,2,2,2,2,2,2,2,2,2,2},
+ {335,114,55,47,33,173,287,345,198,198,136,238,238,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {468,377,243,237,332,512,27,167,22,169,14,14,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {456,162,188,223,408,209,28,164,299,299,258,186,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {445,391,115,226,96,456,239,214,556,158,158,282,2,2,2,2,2,2,2,2,2,2,2,2,2,331,2,2,2,2,2,2},
+ {360,397,130,172,407,479,295,13,38,199,199,346,2,2,2,2,2,2,145,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {512,136,129,361,180,61,274,128,422,27,292,165,2,2,2,2,2,2,363,117,117,117,117,2,2,2,2,363,2,2,2,2},
+ {478,433,483,302,200,227,273,27,171,171,371,102,2,2,2,2,2,20,2,2,2,2,2,2,2,2,403,403,2,2,2,2},
+ {485,158,454,86,212,60,93,40,209,188,188,106,2,231,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {390,448,111,145,47,555,367,317,315,52,429,435,429,429,2,2,2,2,2,2,2,2,229,2,2,229,2,2,2,229,2,2},
+ {490,331,187,398,407,373,497,219,423,423,378,378,2,419,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {474,373,248,330,40,113,105,273,103,407,2,165,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {495,406,306,239,172,323,236,50,37,435,2,310,56,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {397,393,191,269,462,151,264,134,307,307,2,163,163,2,2,2,2,2,2,2,2,2,2,2,2,2,159,2,2,2,2,2},
+ {485,491,325,149,122,145,228,100,311,64,2,62,137,2,137,2,2,2,2,2,2,2,392,2,2,2,2,2,2,2,2,2},
+ {364,462,360,383,182,187,123,69,129,146,2,156,149,2,149,2,2,2,2,2,2,2,303,303,303,2,2,2,2,2,149,266},
+ {507,195,130,401,363,171,483,20,86,464,2,89,89,2,26,2,2,2,2,2,425,425,2,2,2,2,2,2,2,2,2,2},
+ {380,220,87,122,242,78,207,371,95,305,2,2,2,2,440,440,445,358,358,331,331,358,445,445,445,445,445,445,445,445,445,445},
+ {507,221,247,137,182,90,28,207,325,438,2,2,2,2,2,187,232,438,2,2,68,37,37,37,37,37,37,37,37,37,161,2},
+ {509,265,101,126,203,86,152,416,352,85,2,2,2,284,391,368,2,2,152,2,2,2,325,2,2,2,2,2,2,2,2,2},
+ {572,359,332,480,68,535,59,504,365,21,2,2,246,54,246,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {415,178,178,372,415,400,73,82,348,99,2,23,325,44,2,2,2,2,2,2,2,2,325,2,2,2,2,2,2,2,2,2},
+ {430,275,236,361,42,552,368,236,653,74,65,458,288,307,307,2,2,2,2,2,2,2,65,65,2,2,2,2,2,2,2,2},
+ {434,139,58,437,130,441,188,15,63,145,145,145,300,2,2,2,2,300,2,2,2,2,2,2,2,2,401,401,401,401,401,401},
+ {542,138,266,514,552,202,103,197,574,48,2,96,96,2,2,96,96,217,2,2,2,2,2,2,2,2,2,2,2,2,2,217},
+ {546,494,72,272,550,219,213,209,169,404,69,464,86,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {602,466,332,458,99,244,255,183,446,670,2,186,323,2,2,2,2,2,2,2,2,2,2,2,2,2,2,292,165,165,165,165},
+ {422,413,561,110,242,62,436,478,18,150,606,88,643,2,249,2,2,2,2,456,2,2,2,2,2,2,2,2,2,2,2,456},
+ {522,141,154,253,264,53,120,93,274,52,44,203,556,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {600,249,375,555,421,322,317,84,517,517,268,106,353,2,2,2,2,2,2,2,2,2,268,2,2,2,2,2,2,302,2,2},
+ {555,516,310,438,290,559,52,265,248,193,285,441,285,285,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {555,300,232,386,470,300,355,177,57,407,450,279,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {544,177,79,306,256,402,205,496,398,115,115,43,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {534,274,194,220,575,81,206,544,341,85,137,429,429,429,429,344,2,2,2,2,2,315,315,315,315,315,315,72,72,72,2,2},
+ {548,538,508,250,539,102,73,285,119,433,480,480,2,2,2,480,480,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {622,526,294,56,498,176,237,351,25,26,474,55,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {446,163,469,481,240,278,51,373,491,13,22,419,2,2,2,2,2,2,2,2,2,176,176,2,2,2,2,2,2,2,2,2},
+ {445,223,102,108,120,166,68,214,737,504,96,96,206,377,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,39,39,528},
+ {453,121,489,84,434,505,78,575,468,372,468,468,83,468,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {425,355,128,58,194,82,438,117,10,34,34,35,112,107,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {432,479,328,443,253,634,271,429,406,543,406,543,543,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {456,383,487,311,57,579,673,264,582,187,184,43,43,2,2,2,2,501,501,501,2,2,2,2,2,2,2,2,2,2,2,2},
+ {437,561,384,619,363,420,614,117,217,247,405,142,142,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {437,133,516,423,305,90,135,25,266,487,6,286,286,2,2,2,2,2,2,2,2,2,2,2,2,510,510,2,2,2,2,2},
+ {463,341,170,401,178,79,305,98,162,166,32,392,335,335,335,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {610,477,478,516,318,184,267,423,190,494,494,2,336,336,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {590,463,461,162,162,622,167,254,29,377,377,75,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {629,225,67,623,298,588,354,49,41,185,176,63,63,63,2,2,2,2,2,2,2,2,2,2,2,2,8,435,32,32,435,435},
+ {448,126,129,168,209,340,40,96,509,509,509,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {635,212,284,356,187,591,275,361,194,317,488,2,2,2,2,2,2,97,6,2,6,247,2,2,2,2,2,2,2,2,2,6},
+ {612,395,104,86,264,321,521,325,252,53,178,100,100,100,16,343,343,343,343,343,2,2,2,2,2,2,2,2,2,343,343,343},
+ {486,428,287,472,292,141,504,178,585,98,282,2,2,2,2,2,2,2,2,2,2,2,2,284,284,284,78,284,2,2,2,2},
+ {612,327,212,565,450,385,201,649,423,491,106,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {462,579,236,447,60,162,427,258,73,742,742,2,742,742,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {495,440,89,439,65,207,459,407,139,131,624,2,380,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {469,507,276,227,66,237,260,386,27,666,31,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {646,393,273,238,24,13,253,127,368,316,316,316,150,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {626,196,111,465,386,431,181,414,614,391,349,318,389,2,389,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {653,169,261,533,488,282,213,443,337,480,503,174,534,2,2,2,2,2,534,2,2,2,2,534,2,2,2,2,534,2,2,2},
+ {670,555,160,90,604,604,50,459,376,545,316,180,526,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {642,160,702,90,157,254,278,521,650,277,74,554,122,2,2,2,2,2,2,517,174,174,174,2,2,2,2,2,2,2,2,2},
+ {678,254,190,197,637,49,130,25,374,357,357,411,643,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,537,2,2},
+ {512,347,65,546,434,87,18,123,672,412,316,6,699,6,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {657,233,108,38,147,53,136,168,408,477,477,279,268,289,2,2,2,2,2,2,289,2,2,2,2,2,2,2,2,289,289,2},
+ {660,624,376,472,165,66,158,308,492,779,305,305,2,576,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {408,348,216,299,302,668,347,63,172,141,272,168,678,2,2,2,512,2,2,2,2,4,2,2,2,494,64,64,64,128,16,512},
+ {669,421,230,70,212,845,237,347,148,76,823,472,2,2,2,132,2,2,2,2,2,2,2,383,132,383,2,2,383,383,383,383},
+ {693,530,139,82,780,416,270,278,330,484,484,200,2,2,2,2,137,94,2,2,2,2,2,2,2,2,484,2,2,2,2,2},
+ {672,150,164,622,196,75,302,119,42,314,314,132,60,60,60,298,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {705,302,411,705,691,160,809,40,32,867,826,826,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {684,229,138,46,407,399,82,254,267,31,31,45,2,209,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {707,323,409,27,31,157,492,463,886,412,251,251,304,190,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {555,543,434,78,850,174,277,194,4,100,471,69,69,424,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {793,279,264,566,252,495,872,492,482,107,294,503,350,350,2,2,2,2,2,2,2,285,285,273,273,273,273,2,2,2,2,2},
+ {703,427,225,320,136,47,103,547,239,217,73,68,68,204,204,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {703,312,472,588,228,512,386,668,477,617,389,389,389,2,296,2,2,2,2,343,343,2,2,343,343,2,2,617,617,617,617,2},
+ {709,509,697,145,252,194,304,192,192,623,623,4,423,2,2,2,199,423,2,2,2,222,222,2,2,623,623,623,623,623,2,222},
+ {587,453,117,107,672,86,248,568,568,294,294,513,78,2,2,164,82,2,2,2,2,22,2,2,2,2,2,2,2,2,2,2},
+ {741,466,378,135,737,131,159,469,59,2,59,59,187,2,204,2,2,2,2,2,2,2,2,2,798,2,2,798,798,798,798,798},
+ {539,310,463,103,553,45,609,326,197,2,62,113,272,2,62,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {750,703,182,242,92,335,272,466,594,2,701,569,474,129,140,140,2,507,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {547,210,113,361,584,121,65,307,98,2,2,552,514,514,2,514,207,514,514,514,2,2,2,2,2,2,2,2,2,2,2,2},
+ {580,145,358,434,630,73,604,366,366,2,2,398,398,207,2,207,487,2,2,487,207,2,2,207,207,207,2,2,2,2,207,207},
+ {765,421,129,298,867,365,222,476,401,142,90,22,22,88,226,657,2,2,477,2,2,2,2,2,226,226,2,226,2,2,2,226},
+ {587,553,360,539,227,800,312,143,536,2,2,2,64,64,64,2,2,2,179,179,493,2,2,184,184,184,58,2,2,2,493,493},
+ {841,222,158,469,253,91,347,241,766,2,2,2,88,88,88,439,439,439,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {462,653,478,67,269,150,474,711,220,669,669,669,669,669,390,352,325,2,229,545,545,545,545,545,545,545,545,2,545,352,309,352},
+ {468,430,849,689,202,427,45,34,105,2,2,2,2,4,4,4,4,4,4,4,2,2,2,4,4,4,4,4,2,2,2,2},
+ {792,169,306,843,246,123,293,229,483,2,2,2,165,163,163,163,163,440,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {563,325,717,766,440,705,290,123,228,2,2,2,32,64,146,2,2,2,116,79,79,2,146,146,79,79,79,2,2,146,146,79},
+ {802,533,869,638,67,192,805,223,219,2,2,191,178,178,77,77,2,2,2,2,431,431,2,2,2,431,431,2,2,431,2,2},
+ {781,638,410,399,336,465,856,426,28,2,4,4,6,6,2,2,2,449,372,372,449,449,449,2,2,449,449,449,449,449,449,2},
+ {780,359,766,618,41,596,86,636,287,707,707,96,49,373,613,373,2,2,2,2,2,2,2,613,613,613,2,2,2,2,2,2},
+ {622,309,913,550,994,90,257,588,29,526,526,526,496,496,576,2,2,2,2,2,182,182,182,2,2,447,447,447,447,447,447,182},
+ {593,411,953,203,89,57,785,354,349,424,424,707,707,707,829,2,2,2,2,2,670,670,670,2,2,424,424,424,2,2,670,424},
+ {629,560,621,245,683,633,495,551,472,2,31,74,489,684,555,684,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {901,490,693,410,666,119,703,593,201,61,70,70,774,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,418,418},
+ {669,321,391,548,189,157,337,42,796,871,276,622,30,2,2,2,2,2,2,2,580,580,107,2,2,2,2,2,434,434,434,434},
+ {610,236,633,300,681,358,72,281,148,466,466,283,275,2,386,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {859,584,475,745,506,900,40,869,143,612,175,275,209,12,12,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {822,581,76,382,72,347,964,324,137,61,61,28,623,351,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {867,820,301,252,61,331,105,309,562,218,365,326,768,672,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {859,844,510,859,118,190,550,29,159,622,622,382,258,382,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {843,730,235,233,816,495,598,134,131,604,227,378,378,553,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {670,595,333,257,907,413,548,341,327,350,612,700,700,700,700,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {877,181,375,79,199,256,223,295,135,371,395,354,2,307,944,2,813,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {708,442,186,698,345,103,687,463,163,416,416,107,2,2,2,375,375,416,6,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {865,675,786,568,112,197,225,348,372,497,215,215,2,2,2,2,159,159,150,224,224,141,2,2,2,2,141,141,141,141,141,141},
+ {898,559,396,742,51,143,411,221,116,756,756,756,2,2,2,701,701,2,2,2,2,240,225,256,322,322,240,240,240,240,240,322},
+ {982,579,548,413,416,103,71,101,1039,526,684,684,2,2,656,2,2,2,2,2,2,2,2,2,2,2,656,656,656,2,656,656},
+ {642,757,247,513,372,54,546,971,271,61,61,1018,2,143,332,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {865,827,614,74,725,685,724,190,178,272,835,722,2,35,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {718,359,103,558,684,560,67,35,120,342,680,265,265,265,2,2,265,2,2,2,2,2,2,2,2,2,430,2,2,2,2,2},
+ {900,455,485,601,353,69,67,965,25,226,314,314,883,923,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {912,516,108,555,306,274,55,197,565,174,659,208,441,441,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {940,226,320,666,269,54,542,174,109,290,754,524,649,2,202,2,2,2,2,2,2,2,776,202,776,776,776,2,2,202,202,202},
+ {672,652,792,253,796,404,171,90,406,433,43,159,72,2,2,372,2,540,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {733,439,537,37,149,650,916,443,743,621,921,664,664,2,2,2,2,2,682,523,523,523,2,2,523,523,523,523,523,523,523,523},
+ {982,344,812,567,243,52,246,369,439,205,600,739,730,2,2,2,61,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {936,409,217,57,574,395,481,245,548,268,447,598,375,2,192,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {755,796,877,981,259,194,1180,215,90,658,662,662,662,2,36,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {949,422,941,491,66,786,592,429,307,123,40,478,478,478,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1077,496,819,340,974,122,39,1209,819,18,461,648,648,394,2,2,2,2,2,2,61,2,2,2,2,2,394,2,2,2,2,394},
+ {1083,356,367,357,559,213,606,477,71,103,790,103,299,299,2,2,2,2,2,2,406,406,2,2,2,2,2,2,2,2,2,2},
+ {738,749,769,610,306,326,328,578,479,840,840,840,68,192,2,150,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1094,640,912,223,67,472,623,623,1244,65,1009,1209,1209,812,387,2,2,2,513,2,2,2,2,2,2,2,2,2,2,2,1209,234},
+ {1028,730,807,119,209,146,230,498,164,309,309,2,2,2,693,912,430,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {802,298,672,424,104,623,152,159,476,760,66,2,2,2,215,215,490,490,490,2,2,2,2,2,490,490,490,490,490,490,490,490},
+ {1004,719,1041,460,551,516,135,417,130,698,698,2,2,2,655,655,655,655,655,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {818,301,273,664,206,971,895,590,912,523,523,2,2,452,384,255,2,130,130,130,130,865,2,2,2,255,2,2,2,2,2,2},
+ {1078,527,589,244,170,892,827,606,1165,773,189,2,2,240,22,2,2,2,2,2,2,759,621,621,621,621,621,621,621,621,621,621},
+ {1157,395,446,280,1130,695,668,271,111,882,477,615,615,615,2,2,2,2,2,2,2,2,615,615,615,615,615,615,615,2,305,2},
+ {1050,749,809,479,87,757,288,172,597,722,4,418,418,390,2,2,2,2,2,390,390,2,2,2,2,2,2,2,2,2,2,2},
+ {1057,385,263,395,901,274,727,340,1117,263,813,870,858,429,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1120,665,311,695,319,1033,511,297,602,1030,1030,714,240,240,2,2,2,2,2,2,2,2,2,2,2,2,2,953,2,2,2,2},
+ {1120,1159,358,347,838,207,357,167,476,52,672,38,822,2,2,2,2,2,2,213,2,2,2,2,2,2,2,2,2,2,2,2},
+ {820,461,681,382,273,273,358,274,274,91,887,676,386,2,676,676,2,2,2,2,2,2,2,200,2,2,2,2,200,2,2,2},
+ {1148,585,868,1282,666,417,733,1231,515,332,1213,337,337,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {898,782,478,1208,196,983,608,537,196,1141,141,296,715,715,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1142,370,287,925,307,1232,129,11,1284,1056,33,33,536,521,2,1286,2,2,2,2,2,2,2,2,2,2,2,2,847,847,847,847},
+ {1192,555,586,516,1288,733,64,653,364,273,421,215,75,75,2,2,2,2,2,2,953,953,953,953,8,383,383,2,161,383,953,953},
+ {966,590,140,297,189,844,633,12,847,742,742,244,281,34,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1247,353,973,217,1044,1318,1115,319,203,390,1244,225,2,2,508,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
+ {1015,593,112,1408,51,104,199,221,931,1010,928,928,2,2,878,878,2,2,2,2,731,731,2,731,731,2,731,2,731,731,731,2}
+};
Index: trunk/cuba/src/divonne/Sample.c
===================================================================
--- trunk/cuba/src/divonne/Sample.c (revision 158)
+++ trunk/cuba/src/divonne/Sample.c (revision 159)
@@ -1,262 +1,269 @@
/*
Sample.c
most of what is related to sampling
this file is part of Divonne
- last modified 16 Jun 10 th
+ last modified 12 Mar 15 th
*/
-#define MARKMASK 0xfffffff
+#define MARKMASK NUMBER_MAX
#define Marked(x) ((x) & ~MARKMASK)
#define Unmark(x) ((x) & MARKMASK)
+#define NWANTMAX NUMBER_MAX
+
#define EXTRAPOLATE_EPS (.25*t->border.lower)
/*#define EXTRAPOLATE_EPS 0x1p-26*/
/*********************************************************************/
static inline void SamplesIni(Samples *samples)
{
samples->x = NULL;
+ samples->n = 0;
}
/*********************************************************************/
static inline bool SamplesIniQ(cSamples *samples)
{
return samples->x == NULL;
}
/*********************************************************************/
static inline void SamplesFree(cSamples *samples)
{
free(samples->x);
}
/*********************************************************************/
-static void SampleSobol(This *t, cSamples *samples, cBounds *b, creal vol)
+static void SampleSobol(This *t, ccount iregion)
{
- creal norm = vol*samples->weight;
- real *x = samples->x, *f = samples->f, *avg = samples->avg;
- cnumber n = samples->n;
+ SAMPLERDEFS;
+ Vector(real, avg, NCOMP);
+ real norm;
number i;
count dim, comp;
for( i = 0; i < n; ++i ) {
t->rng.getrandom(t, x);
for( dim = 0; dim < t->ndim; ++x, ++dim )
*x = b[dim].lower + *x*(b[dim].upper - b[dim].lower);
}
- DoSample(t, n, t->ndim, samples->x, f);
+ t->nrand += n;
+
+ DoSample(t, n, samples->x, f);
- ResCopy(avg, f);
+ FCopy(avg, f);
f += t->ncomp;
- for( i = 1; i < n; ++i )
+ for( i = 2; i < n; ++i )
for( comp = 0; comp < t->ncomp; ++comp )
avg[comp] += *f++;
- for( comp = 0; comp < t->ncomp; ++comp )
- avg[comp] *= norm;
+ norm = region->vol/samples->neff;
+ for( comp = 0; comp < t->ncomp; ++comp ) {
+ res[comp].avg = norm*avg[comp];
+ res[comp].err = 0;
+ }
}
/*********************************************************************/
-static void SampleKorobov(This *t, cSamples *samples, cBounds *b, creal vol)
+static void SampleKorobov(This *t, ccount iregion)
{
- creal norm = vol*samples->weight;
- real *x = samples->x, *xlast = x + t->ndim;
- real *f = samples->f, *flast = f + t->ncomp;
- real *avg = samples->avg;
- cnumber n = samples->n, neff = samples->neff;
- number nextra = n, i;
+ SAMPLERDEFS;
+ real *xlast = x + t->ndim, *flast = f + t->ncomp;
+ Vector(real, avg, NCOMP);
+ real norm;
+ cnumber neff = samples->neff;
+ number nextra = 0, i;
real dist = 0;
count dim, comp;
for( i = 1; i < n; ++i ) {
number c = i;
for( dim = 0; dim < t->ndim; ++dim ) {
- creal dx = abs(2*c - neff)*samples->weight;
+ creal dx = abs(2*c - neff)/(real)neff;
*xlast++ = b[dim].lower + dx*(b[dim].upper - b[dim].lower);
c = c*samples->coeff % neff;
}
}
for( dim = 0; dim < t->ndim; ++dim ) {
creal dx = (x[dim] = b[dim].upper) - t->border.upper;
if( dx > 0 ) dist += Sq(dx);
}
if( dist > 0 ) {
- dist = sqrt(dist)/EXTRAPOLATE_EPS;
+ dist = sqrtx(dist)/EXTRAPOLATE_EPS;
for( dim = 0; dim < t->ndim; ++dim ) {
real x2 = x[dim], dx = x2 - t->border.upper;
if( dx > 0 ) {
x[dim] = t->border.upper;
x2 = t->border.upper - dx/dist;
}
xlast[dim] = x2;
}
- ++nextra;
+ nextra = 1;
}
- DoSample(t, nextra, t->ndim, x, f);
+ DoSample(t, n + nextra, x, f);
- ResCopy(avg, flast);
+ FCopy(avg, flast);
flast += t->ncomp;
for( i = 2; i < n; ++i )
for( comp = 0; comp < t->ncomp; ++comp )
avg[comp] += *flast++;
- if( nextra > n ) {
+ if( nextra ) {
for( comp = 0; comp < t->ncomp; ++comp )
f[comp] += dist*(f[comp] - flast[comp]);
for( dim = 0; dim < t->ndim; ++dim )
x[dim] = b[dim].upper;
}
- for( comp = 0; comp < t->ncomp; ++comp )
- avg[comp] = (avg[comp] + avg[comp] + f[comp])*norm;
+ norm = region->vol/samples->neff;
+ for( comp = 0; comp < t->ncomp; ++comp ) {
+ res[comp].avg = norm*(avg[comp] + avg[comp] + f[comp]);
+ res[comp].err = 0;
+ }
}
/*********************************************************************/
#define IsSobol(k) NegQ(k)
#define IsRule(k, d) (k == 9 || k == 7 || (k == 11 && d == 3) || (k == 13 && d == 2))
/* The following coding is used for key1, key2, key3:
0 = for key1, key2: use default,
for key3: do nothing,
1 = for key3: split region again,
7 = degree-7 cubature rule,
9 = degree-9 cubature rule,
11 = degree-11 cubature rule (only in 3 dims),
13 = degree-13 cubature rule (only in 2 dims),
-inf..-40 = absolute # of points, Sobol numbers,
-39..-1 = multiplicator, Sobol numbers,
1..39 = multiplicator, Korobov numbers,
40..inf = absolute # of points, Korobov numbers. */
-static count SamplesLookup(This *t, Samples *samples, cint key,
+static number SamplesLookup(This *t, Samples *samples, cint key,
cnumber nwant, cnumber nmax, number nmin)
{
number n;
if( key == 13 && t->ndim == 2 ) {
- if( RuleIniQ(&t->rule13) ) Rule13Alloc(t);
samples->rule = &t->rule13;
samples->n = n = nmin = t->rule13.n;
samples->sampler = SampleRule;
}
else if( key == 11 && t->ndim == 3 ) {
- if( RuleIniQ(&t->rule11) ) Rule11Alloc(t);
samples->rule = &t->rule11;
samples->n = n = nmin = t->rule11.n;
samples->sampler = SampleRule;
}
else if( key == 9 ) {
- if( RuleIniQ(&t->rule9) ) Rule9Alloc(t);
samples->rule = &t->rule9;
samples->n = n = nmin = t->rule9.n;
samples->sampler = SampleRule;
}
else if( key == 7 ) {
- if( RuleIniQ(&t->rule7) ) Rule7Alloc(t);
samples->rule = &t->rule7;
samples->n = n = nmin = t->rule7.n;
samples->sampler = SampleRule;
}
else {
n = Abs1(key);
if( n < 40 ) n *= nwant;
samples->sampler = (key < 0) ? SampleSobol :
(n = n/2 + 1, SampleKorobov);
samples->n = IMin(n, nmax);
}
samples->neff = samples->n;
return IDim(n - nmax) | Marked(nmax - nmin);
}
/*********************************************************************/
static void SamplesAlloc(cThis *t, Samples *samples)
{
#define FIRST -INT_MAX
-#define MarkLast(x) (x | Marked(INT_MAX))
+#define MarkLast(x) ((x) | 0x40000000)
+#define UnmarkLast(x) ((x) & 0x3fffffff)
#include "KorobovCoeff.c"
number nx, nf;
if( samples->sampler == SampleKorobov ) {
enum { max = Elements(prime) - 2 };
cint n = IMin(2*samples->n - 1, MAXPRIME);
int i = Hash(n), p;
count shift = 2 + NegQ(n - 1000);
while( i = IMin(IDim(i), max),
n > (p = prime[i + 1]) || n <= prime[i] ) {
- cint d = (n - Unmark(p)) >> ++shift;
+ cint d = (n - UnmarkLast(p)) >> ++shift;
i += Min1(d);
}
samples->coeff = coeff[i][t->ndim - KOROBOV_MINDIM];
- samples->neff = p = Unmark(p);
+ samples->neff = p = UnmarkLast(p);
samples->n = p/2 + 1;
}
nx = t->ndim*(samples->n + 1); /* need 1 for extrapolation */
nf = t->ncomp*(samples->n + 1);
Alloc(samples->x, nx + nf + t->ncomp + t->ncomp);
samples->f = samples->x + nx;
- samples->avg = samples->f + nf;
- samples->err = samples->avg + t->ncomp;
- ResClear(samples->err);
-
- samples->weight = 1./samples->neff;
}
/*********************************************************************/
static real Sample(This *t, creal *x0)
{
- real xtmp[2*NDIM], ftmp[2*NCOMP], *xlast = xtmp, f;
+ Vector(real, xtmp, 2*NDIM);
+ Vector(real, ftmp, 2*NCOMP);
+ real *xlast = xtmp, f;
real dist = 0;
count dim, comp;
- number nextra = 1;
+ number n = 1;
for( dim = 0; dim < t->ndim; ++dim ) {
creal x1 = *xlast++ = Min(Max(*x0++, 0.), 1.);
real dx;
if( (dx = x1 - t->border.lower) < 0 ||
(dx = x1 - t->border.upper) > 0 ) dist += Sq(dx);
}
if( dist > 0 ) {
- dist = sqrt(dist)/EXTRAPOLATE_EPS;
+ dist = sqrtx(dist)/EXTRAPOLATE_EPS;
for( dim = 0; dim < t->ndim; ++dim ) {
real x2 = xtmp[dim], dx, b;
if( (dx = x2 - (b = t->border.lower)) < 0 ||
(dx = x2 - (b = t->border.upper)) > 0 ) {
xtmp[dim] = b;
x2 = b - dx/dist;
}
*xlast++ = x2;
}
- nextra = 2;
+ n = 2;
}
- DoSample(t, nextra, t->ndim, xtmp, ftmp);
+ DoSample(t, n, xtmp, ftmp);
+
+#define fin(x) Min(Max(x, -.5*INFTY), .5*INFTY)
comp = Untag(t->selectedcomp);
- f = ftmp[comp];
- if( nextra > 1 ) f += dist*(f - ftmp[comp + t->ncomp]);
+ f = fin(ftmp[comp]);
+ if( n > 1 ) f += dist*(f - fin(ftmp[comp + t->ncomp]));
return Sign(t->selectedcomp)*f;
}
Index: trunk/cuba/src/divonne/Integrate.c
===================================================================
--- trunk/cuba/src/divonne/Integrate.c (revision 158)
+++ trunk/cuba/src/divonne/Integrate.c (revision 159)
@@ -1,458 +1,501 @@
/*
Integrate.c
partition the integration region until each region
has approximately equal spread = 1/2 vol (max - min),
then do a main integration over all regions
this file is part of Divonne
- last modified 15 Feb 11 th
+ checkpointing by B. Chokoufe
+ last modified 13 Mar 15 th
*/
-#define INIDEPTH 3
-#define DEPTH 5
-#define POSTDEPTH 15
-
-/*********************************************************************/
+typedef struct {
+ signature_t signature;
+ number neval, neval_opt, neval_cut;
+ number nmin, nrand;
+ count iregion, nregions;
+ count phase, iter, pass, size;
+ Totals totals[];
+} State;
static int Integrate(This *t, real *integral, real *error, real *prob)
{
- TYPEDEFREGION;
-
- Totals totals[NCOMP];
- real nneed, weight;
- count dim, comp, iter, pass = 0, err, iregion;
- number nwant, nmin = INT_MAX;
+ StateDecl;
+ csize_t statesize = sizeof(State) + NCOMP*sizeof(Totals);
+ Sized(State, state, statesize);
+ csize_t regionsize = RegionSize;
+ Vector(char, out, 64*NDIM + 256*NCOMP);
+
+ Totals *tot, *Tot = state->totals + t->ncomp;
+ Bounds *b, *B;
+ Result *res;
+ count comp, iregion;
+ number nwant, err;
+ real nneed;
+ ML_ONLY(number neff;)
int fail;
if( VERBOSE > 1 ) {
- char s[512];
- sprintf(s, "Divonne input parameters:\n"
+ sprintf(out, "Divonne input parameters:\n"
" ndim " COUNT "\n ncomp " COUNT "\n"
+ ML_NOT(" nvec " NUMBER "\n")
" epsrel " REAL "\n epsabs " REAL "\n"
" flags %d\n seed %d\n"
" mineval " NUMBER "\n maxeval " NUMBER "\n"
" key1 %d\n key2 %d\n key3 %d\n maxpass " COUNT "\n"
" border " REAL "\n maxchisq " REAL "\n mindeviation " REAL "\n"
- " ngiven " NUMBER "\n nextra " NUMBER,
+ " ngiven " NUMBER "\n nextra " NUMBER "\n"
+ " statefile \"%s\"",
t->ndim, t->ncomp,
- t->epsrel, t->epsabs,
+ ML_NOT(t->nvec,)
+ SHOW(t->epsrel), SHOW(t->epsabs),
t->flags, t->seed,
t->mineval, t->maxeval,
t->key1, t->key2, t->key3, t->maxpass,
- t->border.lower, t->maxchisq, t->mindeviation,
- t->ngiven, t->nextra);
- Print(s);
+ SHOW(t->border.lower), SHOW(t->maxchisq), SHOW(t->mindeviation),
+ t->ngiven, t->nextra,
+ t->statefile);
+ Print(out);
}
if( BadComponent(t) ) return -2;
if( BadDimension(t, t->key1) ||
- BadDimension(t, t->key2) ||
+ BadDimension(t, t->key2) ||
((t->key3 & -2) && BadDimension(t, t->key3)) ) return -1;
- t->neval_opt = t->neval_cut = 0;
+ FORK_ONLY(t->nframe = 0;)
- t->size = CHUNKSIZE;
- MemAlloc(t->voidregion, t->size*sizeof(Region));
- for( dim = 0; dim < t->ndim; ++dim ) {
- Bounds *b = &RegionPtr(0)->bounds[dim];
- b->lower = 0;
- b->upper = 1;
- }
-
- RuleIni(&t->rule7);
- RuleIni(&t->rule9);
- RuleIni(&t->rule11);
- RuleIni(&t->rule13);
+ AllocGiven(t);
SamplesIni(&t->samples[0]);
SamplesIni(&t->samples[1]);
SamplesIni(&t->samples[2]);
-
- if( (fail = setjmp(t->abort)) ) goto abort;
-
+ RuleAlloc(t);
+ if( IsSobol(t->key1) | IsSobol(t->key2) | IsSobol(t->key3) )
+ IniRandom(t);
t->epsabs = Max(t->epsabs, NOTZERO);
+ t->totals = state->totals;
- /* Step 1: partition the integration region */
-
- if( VERBOSE ) Print("Partitioning phase:");
+ ForkCores(t);
- if( IsSobol(t->key1) || IsSobol(t->key2) || IsSobol(t->key3) )
- IniRandom(t);
+ if( (fail = setjmp(t->abort)) ) goto abort;
SamplesLookup(t, &t->samples[0], t->key1,
(number)47, (number)INT_MAX, (number)0);
SamplesAlloc(t, &t->samples[0]);
- t->totals = totals;
- Zap(totals);
- t->phase = 1;
-
- Explore(t, 0, &t->samples[0], INIDEPTH, 1);
-
- for( iter = 1; ; ++iter ) {
- Totals *maxtot;
- count valid;
-
- for( comp = 0; comp < t->ncomp; ++comp ) {
- Totals *tot = &totals[comp];
- tot->avg = tot->spreadsq = 0;
- tot->spread = tot->secondspread = -INFTY;
+ StateSetup(t);
+
+ if( StateReadTest(t) ) {
+ StateReadOpen(t, fd) {
+ if( read(fd, state, statesize) != statesize ||
+ state->signature != StateSignature(t, 3) ) break;
+ t->nregions = state->nregions;
+ if( st.st_size != statesize + t->nregions*regionsize ) break;
+ t->neval = state->neval;
+ t->neval_opt = state->neval_opt;
+ t->neval_cut = state->neval_cut;
+ t->nrand = state->nrand;
+ t->phase = state->phase;
+ t->size = state->size;
+ AllocRegions(t);
+ StateRead(fd, t->region, t->nregions*regionsize);
+ } StateReadClose(t, fd);
+
+ if( IsSobol(t->key1) | IsSobol(t->key2) | IsSobol(t->key3) )
+ t->rng.skiprandom(t, t->nrand);
+ }
+
+ if( ini ) {
+#if MLVERSION
+ t->neval = t->ngiven;
+#else
+ t->neval = 0;
+#endif
+ t->neval_opt = 0;
+ t->neval_cut = 0;
+ t->nrand = 0;
+
+ t->size = CHUNKSIZE;
+ AllocRegions(t);
+ for( B = (b = t->region->bounds) + t->ndim; b < B; ++b ) {
+ b->lower = 0;
+ b->upper = 1;
}
+ t->nregions = 1;
- for( iregion = 0; iregion < t->nregions; ++iregion ) {
- Region *region = RegionPtr(iregion);
- for( comp = 0; comp < t->ncomp; ++comp ) {
- cResult *r = &region->result[comp];
- Totals *tot = &totals[comp];
- tot->avg += r->avg;
- tot->spreadsq += Sq(r->spread);
- if( r->spread > tot->spread ) {
- tot->secondspread = tot->spread;
- tot->spread = r->spread;
- tot->iregion = iregion;
- }
- else if( r->spread > tot->secondspread )
- tot->secondspread = r->spread;
+ t->phase = 1;
+ state->iter = 1;
+ state->pass = 0;
+ state->nmin = INT_MAX;
+ state->iregion = 0;
+ FClear(state->totals);
+ }
+
+ /* Step 1: partition the integration region */
+
+ if( t->phase == 1 ) {
+ if( VERBOSE ) Print("\nPartitioning phase:");
+
+ if( ini ) Iterate(t, 0, INIDEPTH, 0, NULL);
+
+ for( ; ; ++state->iter ) {
+ Totals *maxtot;
+ count valid;
+
+ for( tot = state->totals; tot < Tot; ++tot ) {
+ tot->avg = tot->spreadsq = 0;
+ tot->spread = tot->secondspread = -INFTY;
}
- }
- maxtot = totals;
- valid = 0;
- for( comp = 0; comp < t->ncomp; ++comp ) {
- Totals *tot = &totals[comp];
- integral[comp] = tot->avg;
- valid += tot->avg == tot->avg;
- if( tot->spreadsq > maxtot->spreadsq ) maxtot = tot;
- tot->spread = sqrt(tot->spreadsq);
- error[comp] = tot->spread*t->samples[0].weight;
- }
+ for( iregion = 0; iregion < t->nregions; ++iregion )
+ for( res = RegionResult(RegionPtr(iregion)), tot = state->totals;
+ tot < Tot; ++res, ++tot ) {
+ tot->avg += res->avg;
+ tot->spreadsq += Sq(res->spread);
+ if( res->spread > tot->spread ) {
+ tot->secondspread = tot->spread;
+ tot->spread = res->spread;
+ tot->iregion = iregion;
+ }
+ else if( res->spread > tot->secondspread )
+ tot->secondspread = res->spread;
+ }
- if( VERBOSE ) {
- char s[128 + 64*NCOMP], *p = s;
+ valid = 0;
+ for( maxtot = tot = state->totals, comp = 0; tot < Tot; ++tot, ++comp ) {
+ integral[comp] = tot->avg;
+ valid += tot->avg == tot->avg;
+ if( tot->spreadsq > maxtot->spreadsq ) maxtot = tot;
+ tot->spread = sqrtx(tot->spreadsq);
+ error[comp] = tot->spread/t->samples[0].neff;
+ }
- p += sprintf(p, "\n"
- "Iteration " COUNT " (pass " COUNT "): " COUNT " regions\n"
- NUMBER7 " integrand evaluations so far,\n"
- NUMBER7 " in optimizing regions,\n"
- NUMBER7 " in finding cuts",
- iter, pass, t->nregions, t->neval, t->neval_opt, t->neval_cut);
-
- for( comp = 0; comp < t->ncomp; ++comp )
- p += sprintf(p, "\n[" COUNT "] "
- REAL " +- " REAL,
- comp + 1, integral[comp], error[comp]);
+#define WriteState(t) \
+if( StateWriteTest(t) ) { \
+ StateWriteOpen(t, fd) { \
+ state->signature = StateSignature(t, 3); \
+ state->neval = t->neval; \
+ state->neval_opt = t->neval_opt; \
+ state->neval_cut = t->neval_cut; \
+ state->nrand = t->nrand; \
+ state->nregions = t->nregions; \
+ state->phase = t->phase; \
+ state->size = t->size; \
+ StateWrite(fd, state, statesize); \
+ StateWrite(fd, t->region, t->nregions*regionsize); \
+ } StateWriteClose(t, fd); \
+}
- Print(s);
- }
+ WriteState(t);
- if( valid == 0 ) goto abort; /* all NaNs */
+ if( VERBOSE ) {
+ char *oe = out + sprintf(out, "\n"
+ "Iteration " COUNT " (pass " COUNT "): " COUNT " regions\n"
+ NUMBER7 " integrand evaluations so far,\n"
+ NUMBER7 " in optimizing regions,\n"
+ NUMBER7 " in finding cuts",
+ state->iter, state->pass, t->nregions,
+ t->neval, t->neval_opt, t->neval_cut);
+ for( comp = 0; comp < t->ncomp; ++comp )
+ oe += sprintf(oe, "\n[" COUNT "] "
+ REAL " +- " REAL,
+ comp + 1, SHOW(integral[comp]), SHOW(error[comp]));
+ Print(out);
+ }
- if( t->neval > t->maxeval ) break;
+ if( valid == 0 ) goto abort; /* all NaNs */
- nneed = maxtot->spread/MaxErr(maxtot->avg);
- if( nneed < MAXPRIME ) {
- cnumber n = t->neval + t->nregions*(number)ceil(nneed);
- if( n < nmin ) {
- nmin = n;
- pass = 0;
+ if( t->neval > t->maxeval ) break;
+
+ nneed = maxtot->spread/MaxErr(maxtot->avg);
+ if( nneed < MAXPRIME ) {
+ cnumber n = t->neval + t->nregions*(number)ceil(nneed);
+ if( n < state->nmin ) {
+ state->nmin = n;
+ state->pass = 0;
+ }
+ else if( ++state->pass > t->maxpass && n >= t->mineval ) break;
}
- else if( ++pass > t->maxpass && n >= t->mineval ) break;
- }
- Split(t, maxtot->iregion, DEPTH);
+ Iterate(t, maxtot->iregion, DEPTH, -1, NULL);
+ }
}
/* Step 2: do a "full" integration on each region */
/* nneed = t->samples[0].neff + 1; */
nneed = 2*t->samples[0].neff;
- for( comp = 0; comp < t->ncomp; ++comp ) {
- Totals *tot = &totals[comp];
+ for( tot = state->totals; tot < Tot; ++tot ) {
creal maxerr = MaxErr(tot->avg);
tot->nneed = tot->spread/maxerr;
nneed = Max(nneed, tot->nneed);
tot->maxerrsq = Sq(maxerr);
tot->mindevsq = tot->maxerrsq*Sq(t->mindeviation);
}
- nwant = (number)Min(ceil(nneed), MARKMASK/40.);
+ nwant = (number)Min(ceil(nneed), NWANTMAX/40.);
err = SamplesLookup(t, &t->samples[1], t->key2, nwant,
(t->maxeval - t->neval)/t->nregions + 1, t->samples[0].n + 1);
/* the number of points needed to reach the desired accuracy */
fail = Unmark(err)*t->nregions;
if( Marked(err) ) {
if( VERBOSE ) Print("\nNot enough samples left for main integration.");
for( comp = 0; comp < t->ncomp; ++comp )
prob[comp] = -999;
- weight = t->samples[0].weight;
+ ML_ONLY(neff = t->samples[0].neff;)
}
else {
- bool can_adjust = (t->key3 == 1 && t->samples[1].sampler != SampleRule &&
+ bool can_adjust = (t->key3 == 1 &&
+ t->samples[1].sampler != SampleRule &&
(t->key2 < 0 || t->samples[1].neff < MAXPRIME));
count df, nlimit;
SamplesAlloc(t, &t->samples[1]);
if( VERBOSE ) {
- char s[128];
- sprintf(s, "\nMain integration on " COUNT
+ sprintf(out, "\nMain integration on " COUNT
" regions with " NUMBER " samples per region.",
t->nregions, t->samples[1].neff);
- Print(s);
+ Print(out);
}
- ResClear(integral);
- ResClear(error);
- ResClear(prob);
-
nlimit = t->maxeval - t->nregions*t->samples[1].n;
df = 0;
- for( iregion = 0; iregion < t->nregions; ++iregion ) {
- Region *region = RegionPtr(iregion);
- char s[64*NDIM + 256*NCOMP], *p = s;
+#define CopyPhaseResults(f) \
+ for( res = RegionResult(region), tot = state->totals; tot < Tot; ++res, ++tot ) { \
+ PhaseResult *p = &tot->phase[f]; \
+ p->avg = res->avg; \
+ p->err = res->err; \
+ }
+
+#define Var2(f, r) Sq((r)->err ? (r)->err : res->spread/t->samples[f].neff)
+#define Var(f) Var2(f, &tot->phase[f])
+
+ while( state->iregion < t->nregions ) {
+ Region *region;
+ char *oe = out;
int todo;
refine:
+ region = RegionPtr(state->iregion);
+ CopyPhaseResults(0);
t->phase = 2;
- t->samples[1].sampler(t, &t->samples[1], region->bounds, region->vol);
+ region->isamples = 1;
+ t->samples[1].sampler(t, state->iregion);
+ CopyPhaseResults(1);
if( can_adjust )
- for( comp = 0; comp < t->ncomp; ++comp )
- totals[comp].spreadsq -= Sq(region->result[comp].spread);
+ for( res = RegionResult(region), tot = state->totals;
+ tot < Tot; ++res, ++tot )
+ tot->spreadsq -= Sq(res->spread);
nlimit += t->samples[1].n;
todo = 0;
- for( comp = 0; comp < t->ncomp; ++comp ) {
- cResult *r = &region->result[comp];
- Totals *tot = &totals[comp];
-
- t->samples[0].avg[comp] = r->avg;
- t->samples[0].err[comp] = r->err;
-
+ for( res = RegionResult(region), tot = state->totals;
+ tot < Tot; ++tot ) {
if( t->neval < nlimit ) {
- creal avg2 = t->samples[1].avg[comp];
- creal err2 = t->samples[1].err[comp];
- creal diffsq = Sq(avg2 - r->avg);
-
-#define Var(s) Sq((s.err[comp] == 0) ? r->spread*s.weight : s.err[comp])
-
- if( err2*tot->nneed > r->spread ||
- diffsq > Max(t->maxchisq*(Var(t->samples[0]) + Var(t->samples[1])),
- EPS*Sq(avg2)) ) {
+ creal avg2 = tot->phase[1].avg;
+ creal diffsq = Sq(avg2 - tot->phase[0].avg);
+
+ if( res->err*tot->nneed > res->spread ||
+ diffsq > Max(t->maxchisq*(Var(0) + Var(1)), EPS*Sq(avg2)) ) {
if( t->key3 && diffsq > tot->mindevsq ) {
if( t->key3 == 1 ) {
- ccount xregion = t->nregions;
-
if( VERBOSE > 2 ) Print("\nSplit");
-
t->phase = 1;
- Explore(t, iregion, &t->samples[1], POSTDEPTH, 2);
+ Iterate(t, state->iregion, POSTDEPTH, 1, state->totals);
if( can_adjust ) {
- number nnew;
- count ireg, xreg;
-
- for( ireg = iregion, xreg = xregion;
- ireg < t->nregions; ireg = xreg++ ) {
- cResult *result = RegionPtr(ireg)->result;
- count c;
- for( c = 0; c < t->ncomp; ++c )
- totals[c].spreadsq += Sq(result[c].spread);
- }
-
- nnew = (tot->spreadsq/Sq(MARKMASK) > tot->maxerrsq) ?
- MARKMASK :
- (number)ceil(sqrt(tot->spreadsq/tot->maxerrsq));
+ cnumber nnew = (tot->spreadsq/Sq(NWANTMAX) > tot->maxerrsq) ?
+ NWANTMAX :
+ (number)ceil(sqrtx(tot->spreadsq/tot->maxerrsq));
if( nnew > nwant + nwant/64 ) {
- ccount err = SamplesLookup(t, &t->samples[1], t->key2, nnew,
+ cnumber err = SamplesLookup(t, &t->samples[1], t->key2, nnew,
(t->maxeval - t->neval)/t->nregions + 1, t->samples[1].n);
fail += Unmark(err)*t->nregions;
nwant = nnew;
SamplesFree(&t->samples[1]);
SamplesAlloc(t, &t->samples[1]);
if( t->key2 > 0 && t->samples[1].neff >= MAXPRIME )
can_adjust = false;
if( VERBOSE > 2 ) {
- char s[128];
- sprintf(s, "Sampling remaining " COUNT
+ sprintf(out, "Sampling remaining " COUNT
" regions with " NUMBER " points per region.",
t->nregions, t->samples[1].neff);
- Print(s);
+ Print(out);
}
}
}
-
goto refine;
}
todo |= 3;
}
todo |= 1;
}
}
}
- if( can_adjust ) {
- for( comp = 0; comp < t->ncomp; ++comp )
- totals[comp].maxerrsq -=
- Sq(region->result[comp].spread*t->samples[1].weight);
- }
+ if( can_adjust )
+ for( res = RegionResult(region), tot = state->totals;
+ tot < Tot; ++res, ++tot )
+ tot->maxerrsq -= Sq(res->spread/t->samples[1].neff);
switch( todo ) {
case 1: /* get spread right */
- Explore(t, iregion, &t->samples[1], 0, 2);
+ region->isamples = 1;
+ ExploreSerial(t, state->iregion);
break;
case 3: /* sample region again with more points */
if( SamplesIniQ(&t->samples[2]) ) {
SamplesLookup(t, &t->samples[2], t->key3,
nwant, (number)INT_MAX, (number)0);
SamplesAlloc(t, &t->samples[2]);
}
t->phase = 3;
- t->samples[2].sampler(t, &t->samples[2], region->bounds, region->vol);
- Explore(t, iregion, &t->samples[2], 0, 2);
+ region->isamples = 2;
+ t->samples[2].sampler(t, state->iregion);
+ ExploreSerial(t, state->iregion);
++region->depth; /* misused for df here */
++df;
}
- ++region->depth; /* misused for df here */
-
if( VERBOSE > 2 ) {
- for( dim = 0; dim < t->ndim; ++dim ) {
- cBounds *b = &region->bounds[dim];
- p += sprintf(p,
- (dim == 0) ? "\nRegion (" REALF ") - (" REALF ")" :
- "\n (" REALF ") - (" REALF ")",
- b->lower, b->upper);
+ cchar *msg = "\nRegion (" REALF ") - (" REALF ")";
+ for( B = (b = region->bounds) + t->ndim; b < B; ++b ) {
+ oe += sprintf(oe, msg, b->lower, b->upper);
+ msg = "\n (" REALF ") - (" REALF ")";
}
}
- for( comp = 0; comp < t->ncomp; ++comp ) {
- Result *r = &region->result[comp];
-
- creal x1 = t->samples[0].avg[comp];
- creal s1 = Var(t->samples[0]);
- creal x2 = t->samples[1].avg[comp];
- creal s2 = Var(t->samples[1]);
- creal r2 = (s1 == 0) ? Sq(t->samples[1].neff*t->samples[0].weight) : s2/s1;
+ for( tot = state->totals, res = RegionResult(region), comp = 0;
+ tot < Tot; ++tot, ++res ) {
+ creal x1 = tot->phase[0].avg;
+ creal v1 = Var(0);
+ creal x2 = tot->phase[1].avg;
+ creal v2 = Var(1);
+ creal r2 = v1 ? v2/v1 :
+ Sq(t->samples[1].neff/(real)t->samples[0].neff);
real norm = 1 + r2;
real avg = x2 + r2*x1;
- real sigsq = s2;
+ real sigsq = v2;
real chisq = Sq(x2 - x1);
- real chiden = s1 + s2;
+ real chiden = v1 + v2;
if( todo == 3 ) {
- creal x3 = t->samples[2].avg[comp];
- creal s3 = Var(t->samples[2]);
- creal r3 = (s2 == 0) ? Sq(t->samples[2].neff*t->samples[1].weight) : s3/s2;
+ creal x3 = res->avg;
+ creal v3 = Var2(2, res);
+ creal r3 = v2 ? v3/v2 :
+ Sq(t->samples[2].neff/(real)t->samples[1].neff);
norm = 1 + r3*norm;
avg = x3 + r3*avg;
- sigsq = s3;
- chisq = s1*Sq(x3 - x2) + s2*Sq(x3 - x1) + s3*chisq;
- chiden = s1*s2 + s3*chiden;
+ sigsq = v3;
+ chisq = v1*Sq(x3 - x2) + v2*Sq(x3 - x1) + v3*chisq;
+ chiden = v1*v2 + v3*chiden;
}
- avg = LAST ? r->avg : (sigsq *= norm = 1/norm, avg*norm);
+ avg = LAST ? res->avg : (sigsq *= norm = 1/norm, avg*norm);
if( chisq > EPS ) chisq /= Max(chiden, NOTZERO);
-#define Out(s) s.avg[comp], r->spread*s.weight, s.err[comp]
-
if( VERBOSE > 2 ) {
- p += sprintf(p, "\n[" COUNT "] "
+#define Out2(f, r) SHOW((r)->avg), SHOW(res->spread/t->samples[f].neff), SHOW((r)->err)
+#define Out(f) Out2(f, &tot->phase[f])
+ oe += sprintf(oe, "\n[" COUNT "] "
REAL " +- " REAL "(" REAL ")\n "
- REAL " +- " REAL "(" REAL ")",
- comp + 1, Out(t->samples[0]), Out(t->samples[1]));
- if( todo == 3 ) p += sprintf(p, "\n "
- REAL " +- " REAL "(" REAL ")",
- Out(t->samples[2]));
- p += sprintf(p, " \tchisq " REAL, chisq);
+ REAL " +- " REAL "(" REAL ")", ++comp, Out(0), Out(1));
+ if( todo == 3 ) oe += sprintf(oe, "\n "
+ REAL " +- " REAL "(" REAL ")", Out2(2, res));
+ oe += sprintf(oe, " \tchisq " REAL, SHOW(chisq));
}
- integral[comp] += avg;
- error[comp] += sigsq;
- prob[comp] += chisq;
-
- r->avg = avg;
- r->spread = sqrt(sigsq);
- r->chisq = chisq;
+ tot->integral += avg;
+ tot->sigsq += sigsq;
+ tot->chisq += chisq;
+
+ res->avg = avg;
+ res->spread = sqrtx(sigsq);
+ res->chisq = chisq;
}
- if( VERBOSE > 2 ) Print(s);
- }
+ if( VERBOSE > 2 ) Print(out);
+ ++state->iregion;
- for( comp = 0; comp < t->ncomp; ++comp )
- error[comp] = sqrt(error[comp]);
+ WriteState(t);
+ }
df += t->nregions;
- if( VERBOSE > 2 ) {
- char s[16 + 128*NCOMP], *p = s;
-
- p += sprintf(p, "\nTotals:");
+ for( tot = state->totals, comp = 0; tot < Tot; ++tot, ++comp ) {
+ integral[comp] = tot->integral;
+ error[comp] = sqrtx(tot->sigsq);
+ prob[comp] = ChiSquare(tot->chisq, df);
+ }
- for( comp = 0; comp < t->ncomp; ++comp )
- p += sprintf(p, "\n[" COUNT "] "
+ if( VERBOSE > 2 ) {
+ char *oe = out + sprintf(out, "\nTotals:");
+ for( tot = state->totals, comp = 0; tot < Tot; ++tot, ++comp )
+ oe += sprintf(oe, "\n[" COUNT "] "
REAL " +- " REAL " \tchisq " REAL " (" COUNT " df)",
- comp + 1, integral[comp], error[comp], prob[comp], df);
-
- Print(s);
+ comp + 1, SHOW(integral[comp]), SHOW(error[comp]),
+ SHOW(tot->chisq), df);
+ Print(out);
}
- for( comp = 0; comp < t->ncomp; ++comp )
- prob[comp] = ChiSquare(prob[comp], df);
-
- weight = 1;
+ ML_ONLY(neff = 1;)
}
#ifdef MLVERSION
if( REGIONS ) {
+ Vector(real, bounds, t->ndim*2);
+
MLPutFunction(stdlink, "List", 2);
+
MLPutFunction(stdlink, "List", t->nregions);
for( iregion = 0; iregion < t->nregions; ++iregion ) {
Region *region = RegionPtr(iregion);
- cBounds *b = region->bounds;
- real lower[NDIM], upper[NDIM];
+ cResult *Res;
+ real *d = bounds;
- for( dim = 0; dim < t->ndim; ++dim ) {
- lower[dim] = b[dim].lower;
- upper[dim] = b[dim].upper;
+ for( B = (b = region->bounds) + t->ndim; b < B; ++b ) {
+ *d++ = b->lower;
+ *d++ = b->upper;
}
MLPutFunction(stdlink, "Cuba`Divonne`region", 4);
- MLPutRealList(stdlink, lower, t->ndim);
- MLPutRealList(stdlink, upper, t->ndim);
+ MLPutRealxList(stdlink, bounds, 2*t->ndim);
MLPutFunction(stdlink, "List", t->ncomp);
- for( comp = 0; comp < t->ncomp; ++comp ) {
- cResult *r = &region->result[comp];
- real res[] = {r->avg, r->spread*weight, r->chisq};
- MLPutRealList(stdlink, res, Elements(res));
+ for( Res = (res = RegionResult(region)) + t->ncomp; res < Res; ++res ) {
+ real r[] = {res->avg, res->spread/neff, res->chisq};
+ MLPutRealxList(stdlink, r, Elements(r));
}
- MLPutInteger(stdlink, region->depth); /* misused for df */
+ MLPutInteger(stdlink, region->depth + 1); /* misused for df */
}
}
#endif
abort:
+ FORK_ONLY(FrameFree(t, Master);)
+
+ RuleFree(t);
SamplesFree(&t->samples[2]);
SamplesFree(&t->samples[1]);
SamplesFree(&t->samples[0]);
- RuleFree(&t->rule13);
- RuleFree(&t->rule11);
- RuleFree(&t->rule9);
- RuleFree(&t->rule7);
+ free(t->region);
+ free(t->xgiven);
- free(t->voidregion);
+ StateRemove(t);
return fail;
}
Index: trunk/cuba/src/divonne/common.c
===================================================================
--- trunk/cuba/src/divonne/common.c (revision 158)
+++ trunk/cuba/src/divonne/common.c (revision 159)
@@ -1,39 +1,73 @@
/*
common.c
includes most of the modules
this file is part of Divonne
- last modified 8 Jun 10 th
+ last modified 29 Jul 13 th
*/
#include "Random.c"
#include "ChiSquare.c"
#include "Rule.c"
#include "Sample.c"
#include "FindMinimum.c"
-
-static bool Explore(This *t, count iregion, cSamples *samples,
- cint depth, cint flags);
-
-static void Split(This *t, count iregion, int depth);
-
-#include "Explore.c"
#include "Split.c"
+#include "Explore.c"
+#include "Iterate.c"
static inline bool BadDimension(cThis *t, ccount key)
{
- if( t->ndim > NDIM ) return true;
+ if( t->ndim > MAXDIM ) return true;
if( IsSobol(key) ) return
t->ndim < SOBOL_MINDIM || (t->seed == 0 && t->ndim > SOBOL_MAXDIM);
if( IsRule(key, t->ndim) ) return t->ndim < 1;
return t->ndim < KOROBOV_MINDIM || t->ndim > KOROBOV_MAXDIM;
}
static inline bool BadComponent(cThis *t)
{
- if( t->ncomp > NCOMP ) return true;
+ if( t->ncomp > MAXCOMP ) return true;
return t->ncomp < 1;
}
-#include "Integrate.c"
+static inline void AllocGiven(This *t)
+{
+ real *xgiven = NULL, *fgiven = NULL;
+
+ if( t->ngiven | t->nextra ) {
+ cnumber nxgiven = t->ngiven*t->ndim;
+ cnumber nxextra = t->nextra*t->ndim;
+ cnumber nfgiven = t->ngiven*t->ncomp;
+ cnumber nfextra = t->nextra*t->ncomp;
+
+ Alloc(xgiven, nxgiven + nxextra + nfgiven + nfextra);
+ t->xextra = xgiven + nxgiven;
+ fgiven = t->xextra + nxextra;
+ t->fextra = fgiven + nfgiven;
+
+ if( nxgiven ) {
+#ifdef MLVERSION
+ Copy(xgiven, t->xgiven, nxgiven);
+ Copy(fgiven, t->fgiven, nfgiven);
+#else
+ if( t->ldxgiven == t->ndim )
+ Copy(xgiven, t->xgiven, nxgiven);
+ else {
+ number i;
+ real *sgiven = t->xgiven, *dgiven = xgiven;
+ for( i = 0; i < t->ngiven; ++i ) {
+ Copy(dgiven, sgiven, t->ndim);
+ sgiven += t->ldxgiven;
+ dgiven += t->ndim;
+ }
+ }
+ t->phase = 0;
+ DoSample(t, t->ngiven, xgiven, fgiven);
+#endif
+ }
+ }
+
+ t->xgiven = xgiven;
+ t->fgiven = fgiven;
+}
Index: trunk/cuba/src/suave/decl.h
===================================================================
--- trunk/cuba/src/suave/decl.h (revision 158)
+++ trunk/cuba/src/suave/decl.h (revision 159)
@@ -1,69 +1,78 @@
/*
decl.h
Type declarations
this file is part of Suave
- last modified 13 Sep 10 th
+ last modified 25 Nov 14 th
*/
#include "stddecl.h"
#define MINSAMPLES 10
#define NBINS 64
typedef unsigned char bin_t;
/* Note: bin_t must be wide enough to hold the numbers 0..NBINS */
typedef const bin_t cbin_t;
typedef real Grid[NBINS];
typedef const Grid cGrid;
typedef struct {
real avg, err, sigsq, chisq;
} Result;
typedef const Result cResult;
typedef struct {
- real lower, upper, mid;
+ real lower, upper;
Grid grid;
} Bounds;
typedef const Bounds cBounds;
typedef int (*Integrand)(ccount *, creal *, ccount *, real *,
- void *, creal *, cint *);
+ void *, cnumber *, cint *, creal *, cint *);
typedef struct _this {
count ndim, ncomp;
#ifndef MLVERSION
Integrand integrand;
void *userdata;
+ number nvec;
+#ifdef HAVE_FORK
+ SHM_ONLY(int shmid;)
+ Spin *spin;
+ real *frame;
+#endif
#endif
real epsrel, epsabs;
int flags, seed;
number mineval, maxeval;
- number nnew;
+ number nnew, nmin;
real flatness;
+ cchar *statefile;
count nregions;
number neval;
RNGState rng;
jmp_buf abort;
} This;
+#define nframe nnew
+
typedef const This cThis;
-#define TYPEDEFREGION \
- typedef struct region { \
- struct region *next; \
- count div, df; \
- number n; \
- Result result[1000]; \
- Bounds bounds[1000]; \
- real fluct[1000][1000][2]; \
- real w[]; \
- } Region
+typedef struct region {
+ struct region *next;
+ size_t size;
+ count div, df;
+ number n;
+ Result result[];
+} Region;
+
+#define RegionBounds(r) ((Bounds *)(r->result + t->ncomp))
+#define RegionW(r) ((real *)(RegionBounds(r) + t->ndim))
Index: trunk/cuba/src/suave/Fluct.c
===================================================================
--- trunk/cuba/src/suave/Fluct.c (revision 158)
+++ trunk/cuba/src/suave/Fluct.c (revision 159)
@@ -1,64 +1,76 @@
/*
Fluct.c
compute the fluctuation in the left and right half
this file is part of Suave
- last modified 9 Feb 05 th
+ last modified 14 Mar 15 th
*/
-#if defined(HAVE_LONG_DOUBLE) && defined(HAVE_POWL)
+#if defined(HAVE_LONG_DOUBLE) && defined(HAVE_POWL) && REALSIZE <= 10
-typedef long double xdouble;
-#define XDBL_MAX_EXP LDBL_MAX_EXP
-#define XDBL_MAX LDBL_MAX
-#define powx powl
+typedef long double realL;
+#define REALL_MAX_EXP LDBL_MAX_EXP
+#define REALL_MAX LDBL_MAX
+#define powL powl
+#define ldexpL ldexpl
#else
-typedef double xdouble;
-#define XDBL_MAX_EXP DBL_MAX_EXP
-#define XDBL_MAX DBL_MAX
-#define powx pow
+typedef real realL;
+#define REALL_MAX_EXP REAL_MAX_EXP
+#define REALL_MAX REAL_MAX
+#define powL powx
+#define ldexpL ldexpx
#endif
+typedef const realL crealL;
+
typedef struct {
- xdouble fluct;
+ realL fluct;
number n;
} Var;
+static inline realL MinL(crealL a, crealL b) {
+ return (a < b) ? a : b;
+}
+
+static inline realL MaxL(crealL a, crealL b) {
+ return (a > b) ? a : b;
+}
+
/*********************************************************************/
static void Fluct(cThis *t, Var *var,
cBounds *b, creal *w, number n, ccount comp, creal avg, creal err)
{
creal *x = w + n;
creal *f = x + n*t->ndim + comp;
- creal flat = 2/3./t->flatness;
- creal max = ldexp(1., (int)((XDBL_MAX_EXP - 2)/t->flatness));
- creal norm = 1/(err*Max(fabs(avg), err));
count nvar = 2*t->ndim;
+ creal norm = 1/(err*Max(fabs(avg), err));
+ creal flat = 2/3./t->flatness;
+ crealL max = ldexpL(1., (int)((REALL_MAX_EXP - 2)/t->flatness));
Clear(var, nvar);
while( n-- ) {
count dim;
- const xdouble ft =
- powx(Min(1 + fabs(*w++)*Sq(*f - avg)*norm, max), t->flatness);
+ crealL arg = 1 + fabs(*w++)*Sq(*f - avg)*norm;
+ crealL ft = powL(MinL(arg, max), t->flatness);
f += t->ncomp;
for( dim = 0; dim < t->ndim; ++dim ) {
- Var *v = &var[2*dim + (*x++ >= b[dim].mid)];
- const xdouble f = v->fluct + ft;
- v->fluct = (f > XDBL_MAX/2) ? XDBL_MAX/2 : f;
+ Var *v = &var[2*dim + (*x++ >= .5*(b[dim].lower + b[dim].upper))];
+ crealL f = v->fluct + ft;
+ v->fluct = MaxL(f, REALL_MAX/2);
++v->n;
}
}
while( nvar-- ) {
- var->fluct = powx(var->fluct, flat);
+ var->fluct = powL(var->fluct, flat);
++var;
}
}
Index: trunk/cuba/src/suave/Sample.c
===================================================================
--- trunk/cuba/src/suave/Sample.c (revision 158)
+++ trunk/cuba/src/suave/Sample.c (revision 159)
@@ -1,171 +1,164 @@
/*
Sample.c
the sampling step of Suave
this file is part of Suave
- last modified 13 Sep 10 th
+ last modified 13 Mar 15 th
*/
typedef struct {
real sum, sqsum;
real weight, weightsum, avg, avgsum;
real guess, chisum, chisqsum;
} Cumulants;
/*********************************************************************/
-static void Sample(This *t, cnumber nnew, void *voidregion,
+static void Sample(This *t, cnumber nnew, Region *region,
real *lastw, real *lastx, real *lastf)
{
- TYPEDEFREGION;
-
- Region *const region = (Region *)voidregion;
- count comp, dim, df;
+ count comp, df;
number n;
- Cumulants cumul[100];//#TT used to be Cumulants cumul[NCOMP];
- char **ss, *s;
+ Vector(Cumulants, cumul, NCOMP);
+ Cumulants *C = cumul + t->ncomp, *c;
+ Bounds *bounds = RegionBounds(region), *B = bounds + t->ndim, *b;
+ Result *res;
+ char **ss = NULL, *s = NULL;
ccount chars = 128*(region->div + 1);
creal jacobian = 1/ldexp((real)nnew, region->div);
real *w = lastw, *f = lastx;
bin_t *bin = (bin_t *)(lastf + nnew*t->ncomp);
for( n = nnew; n; --n ) {
real weight = jacobian;
t->rng.getrandom(t, f);
- for( dim = 0; dim < t->ndim; ++dim ) {
- cBounds *b = &region->bounds[dim];
+ for( b = bounds; b < B; ++b ) {
creal pos = *f*NBINS;
ccount ipos = (count)pos;
creal prev = (ipos == 0) ? 0 : b->grid[ipos - 1];
creal diff = b->grid[ipos] - prev;
*f++ = b->lower + (prev + (pos - ipos)*diff)*(b->upper - b->lower);
*bin++ = ipos;
weight *= diff*NBINS;
}
*w++ = weight;
}
- DoSample(t, nnew, lastw, lastx, lastf, region->div + 1);
+ DoSample(t, nnew, lastx, lastf, lastw, region->div + 1);
w[-1] = -w[-1];
lastw = w;
- w = region->w;
+ w = RegionW(region);
region->n = lastw - w;
if( VERBOSE > 2 ) {
char *p0;
MemAlloc(ss, t->ndim*64 + t->ncomp*(sizeof(char *) + chars));
s = (char *)(ss + t->ncomp);
p0 = s + t->ndim*64;
for( comp = 0; comp < t->ncomp; ++comp ) {
ss[comp] = p0;
p0 += chars;
}
}
- Zap(cumul);
+ FClear(cumul);
df = n = 0;
while( w < lastw ) {
cbool final = (*w < 0);
- creal weight = fabs(*w++);
+ creal weight = fabsx(*w++);
++n;
- for( comp = 0; comp < t->ncomp; ++comp ) {
- Cumulants *c = &cumul[comp];
-
+ for( c = cumul, comp = 0; c < C; ++c ) {
creal wfun = weight*(*f++);
c->sum += wfun;
c->sqsum += Sq(wfun);
if( final ) {
- if( n > 1 ) {
+ if( n >= t->nmin ) {
real w = Weight(c->sum, c->sqsum, n);
c->weightsum += c->weight = w;
c->avgsum += c->avg = w*c->sum;
if( VERBOSE > 2 ) {
- creal sig = sqrt(1/w);
+ creal sig = sqrtx(1/w);
ss[comp] += (df == 0) ?
sprintf(ss[comp], "\n[" COUNT "] "
REAL " +- " REAL " (" NUMBER ")", comp + 1,
- c->sum, sig, n) :
+ SHOW(c->sum), SHOW(sig), n) :
sprintf(ss[comp], "\n "
REAL " +- " REAL " (" NUMBER ")",
- c->sum, sig, n);
+ SHOW(c->sum), SHOW(sig), n);
}
if( df == 0 ) c->guess = c->sum;
else {
c->chisum += w *= c->sum - c->guess;
c->chisqsum += w*c->sum;
}
}
c->sum = c->sqsum = 0;
}
}
- if( final ) ++df, n = 0;
+ if( final ) df -= NegQ(t->nmin - n - 1), n = 0;
}
region->df = --df;
- for( comp = 0; comp < t->ncomp; ++comp ) {
- Result *r = &region->result[comp];
- Cumulants *c = &cumul[comp];
+ for( c = cumul, res = region->result; c < C; ++c, ++res ) {
creal sigsq = 1/c->weightsum;
creal avg = sigsq*c->avgsum;
if( LAST ) {
- r->sigsq = 1/c->weight;
- r->avg = r->sigsq*c->avg;
+ res->sigsq = 1/c->weight;
+ res->avg = res->sigsq*c->avg;
}
else {
- r->sigsq = sigsq;
- r->avg = avg;
+ res->sigsq = sigsq;
+ res->avg = avg;
}
- r->err = sqrt(r->sigsq);
+ res->err = sqrtx(res->sigsq);
- r->chisq = (sigsq < .9*NOTZERO) ? 0 : c->chisqsum - avg*c->chisum;
+ res->chisq = (sigsq < .9*NOTZERO) ? 0 : c->chisqsum - avg*c->chisum;
/* This catches the special case where the integrand is constant
over the entire region. Unless that constant is zero, only the
first set of samples will have zero variance, and hence weight
(n - 1) 1e30 (see above). All other sets have been sampled
from a non-constant weight function and therefore inevitably
show some variance. This is an artificial effect, brought about
by the fact that the constancy of the integrand in the region is
seen only in this subdivision, and can degrade the chi-square
score quite a bit. If the constancy was determined from more
than two samples (hence .9*NOTZERO), the chi-squares from the
other sets are removed here. */
}
if( VERBOSE > 2 ) {
char *p = s;
char *p0 = p + t->ndim*64;
+ char *msg = "\nRegion (" REALF ") - (" REALF ")";
- for( dim = 0; dim < t->ndim; ++dim ) {
- cBounds *b = &region->bounds[dim];
- p += sprintf(p,
- (dim == 0) ? "\nRegion (" REALF ") - (" REALF ")" :
- "\n (" REALF ") - (" REALF ")",
- b->lower, b->upper);
+ for( b = bounds; b < B; ++b ) {
+ p += sprintf(p, msg, b->lower, b->upper);
+ msg = "\n (" REALF ") - (" REALF ")";
}
- for( comp = 0; comp < t->ncomp; ++comp ) {
- cResult *r = &region->result[comp];
+ for( comp = 0, res = region->result;
+ comp < t->ncomp; ++comp, ++res ) {
p += sprintf(p, "%s \tchisq " REAL " (" COUNT " df)",
- p0, r->chisq, df);
+ p0, SHOW(res->chisq), df);
p0 += chars;
}
Print(s);
free(ss);
}
}
Index: trunk/cuba/src/suave/Suave.tm
===================================================================
--- trunk/cuba/src/suave/Suave.tm (revision 158)
+++ trunk/cuba/src/suave/Suave.tm (revision 159)
@@ -1,297 +1,259 @@
:Evaluate: BeginPackage["Cuba`"]
:Evaluate: Suave::usage =
"Suave[f, {x, xmin, xmax}..] computes a numerical approximation to the integral of the real scalar or vector function f.
The output is a list with entries of the form {integral, error, chi-square probability} for each component of the integrand."
+:Evaluate: MinPoints::usage = "MinPoints is an option of Suave.
+ It specifies the minimum number of points to sample."
+
:Evaluate: NNew::usage = "NNew is an option of Suave.
It specifies the number of new integrand evaluations in each subdivision."
+:Evaluate: NMin::usage = "NMin is an option of Suave.
+ It specifies the minimum number of samples a former pass must contribute to a subregion to be considered in that region's compound integral value.
+ Increasing NMin may reduce jumps in the chi^2 value."
+
:Evaluate: Flatness::usage = "Flatness is an option of Suave.
It determines how prominently individual samples with a large fluctuation figure in the total fluctuation, which in turn determines how a region is split up.
Explicitly, if F[i] is the individual fluctuation of sample i, the total fluctuation is computed as Sum[(1 + F[i])^p, {i, nsamples}]^(2/3/p), i.e. as the p-norm of the fluctuation vector to the power 2/3, where p is the number given by Flatness.
Thus with increasing p, the fluctuation becomes more and more dominated by outliers, i.e. points with a large fluctuation.
As suggested by the name Flatness, p should be chosen large for `flat' integrands and small for `volatile' integrands with high peaks.
Note that since p appears in the exponent, one should not use too large values (say, no more than a few hundred) lest terms be truncated internally to prevent overflow."
-:Evaluate: MinPoints::usage = "MinPoints is an option of Suave.
- It specifies the minimum number of points to sample."
+:Evaluate: StateFile::usage = "StateFile is an option of Suave.
+ It specifies a file in which the internal state is stored after each iteration and from which it can be restored on a subsequent run.
+ The state file is removed once the prescribed accuracy has been reached."
:Evaluate: Final::usage = "Final is an option of Suave.
It can take the values Last or All which determine whether only the last (largest) or all sets of samples collected on a subregion over the iterations contribute to the final result."
:Evaluate: PseudoRandom::usage = "PseudoRandom is an option of Suave.
It can take the following values:
False for Sobol quasi-random numbers (default),
True or 0 for Mersenne Twister pseudo-random numbers,
any other integer value n for Ranlux pseudo-random numbers of luxury level n."
:Evaluate: PseudoRandomSeed::usage = "PseudoRandomSeed is an option of Suave.
It specifies the seed for the pseudo-random number generator."
:Evaluate: SharpEdges::usage = "SharpEdges is an option of Suave.
It turns off smoothing of the importance function for integrands with sharp edges."
+:Evaluate: RetainStateFile::usage = "RetainStateFile is an option of Suave.
+ It determines whether a chosen state file is kept even if the integration terminates normally."
+
:Evaluate: Regions::usage = "Regions is an option of Suave.
It specifies whether the regions into which the integration region has been cut are returned together with the integration results."
:Evaluate: Region::usage = "Region[ll, ur, res, df] describes a subregion:
ll and ur are multidimensional equivalents of the region's lower left and upper right corner.
res gives the integration results for the region in a list with entries of the form {integral, error, chi-square} for each component of the integrand.
df is the number of degrees of freedom corresponding to the chi-square values in res."
:Evaluate: $Weight::usage = "$Weight is a global variable set by Suave during the evaluation of the integrand to the weight of the point being sampled."
:Evaluate: $Iteration::usage = "$Iteration is a global variable set by Suave during the evaluation of the integrand to the present iteration number."
:Evaluate: MapSample::usage = "MapSample is a function used to map the integrand over the points to be sampled."
:Evaluate: Begin["`Suave`"]
:Begin:
:Function: Suave
:Pattern: MLSuave[ndim_, ncomp_,
epsrel_, epsabs_, flags_, seed_,
mineval_, maxeval_,
- nnew_, flatness_]
+ nnew_, flatness_, statefile_]
:Arguments: {ndim, ncomp,
epsrel, epsabs, flags, seed,
mineval, maxeval,
- nnew, flatness}
+ nnew, flatness, statefile}
:ArgumentTypes: {Integer, Integer,
- Real, Real, Integer, Integer,
+ Real64, Real64, Integer, Integer,
Integer, Integer,
- Integer, Real}
+ Integer, Real64, String}
:ReturnType: Manual
:End:
:Evaluate: Attributes[Suave] = {HoldFirst}
:Evaluate: Options[Suave] = {PrecisionGoal -> 3, AccuracyGoal -> 12,
- MinPoints -> 0, MaxPoints -> 50000, NNew -> 1000, Flatness -> 50,
- Verbose -> 1, Final -> Last,
+ MinPoints -> 0, MaxPoints -> 50000,
+ NNew -> 1000, NMin -> 2, Flatness -> 50,
+ StateFile -> "", Verbose -> 1, Final -> Last,
PseudoRandom -> False, PseudoRandomSeed -> 5489,
- SharpEdges -> False, Regions -> False, Compiled -> True}
+ SharpEdges -> False, RetainStateFile -> False,
+ Regions -> False, Compiled -> True}
:Evaluate: Suave[f_, v:{_, _, _}.., opt___Rule] :=
Block[ {ff = HoldForm[f], ndim = Length[{v}], ncomp,
tags, vars, lower, range, jac, tmp, defs, intT,
- rel, abs, mineval, maxeval, nnew, flatness,
- verbose, final, level, seed, edges, regions, compiled,
- $Weight, $Iteration},
+ rel, abs, mineval, maxeval, nnew, nmin, flatness, state,
+ verbose, final, level, seed, edges, retain,
+ regions, compiled, $Weight, $Iteration},
Message[Suave::optx, #, Suave]&/@
Complement[First/@ {opt}, tags = First/@ Options[Suave]];
- {rel, abs, mineval, maxeval, nnew, flatness,
- verbose, final, level, seed, edges, regions, compiled} =
+ {rel, abs, mineval, maxeval, nnew, nmin, flatness, state,
+ verbose, final, level, seed, edges, retain,
+ regions, compiled} =
tags /. {opt} /. Options[Suave];
{vars, lower, range} = Transpose[{v}];
jac = Simplify[Times@@ (range -= lower)];
tmp = Array[tmpvar, ndim];
defs = Simplify[lower + range tmp];
Block[{Set}, define[compiled, tmp, Thread[vars = defs], jac]];
intT = integrandT[f];
Block[#,
ncomp = Length[intT@@ RandomReal[1, ndim]];
MLSuave[ndim, ncomp, 10.^-rel, 10.^-abs,
Min[Max[verbose, 0], 3] +
If[final === Last, 4, 0] +
If[TrueQ[edges], 8, 0] +
+ If[TrueQ[retain], 16, 0] +
If[TrueQ[regions], 128, 0] +
If[IntegerQ[level], 256 level, 0],
If[level =!= False && IntegerQ[seed], seed, 0],
mineval, maxeval,
- nnew, flatness]
+ nnew, nmin, flatness, state]
]& @ vars
]
:Evaluate: tmpvar[n_] := ToExpression["Cuba`Suave`t" <> ToString[n]]
:Evaluate: Attributes[foo] = {HoldAll}
:Evaluate: define[True, tmp_, defs_, jac_] := (
TtoX := TtoX = Compile[tmp, defs];
- integrandT[f_] := Compile[tmp, eval[defs, Chop[f jac]//N],
+ integrandT[f_] := Compile[tmp, eval[defs, N[f jac]],
{{_eval, _Real, 1}}] )
:Evaluate: define[_, tmp_, defs_, jac_] := (
TtoX := TtoX = Function[tmp, defs];
- integrandT[f_] := Function[tmp, eval[defs, Chop[f jac]//N]] )
+ integrandT[f_] := Function[tmp, eval[defs, N[f jac]]] )
:Evaluate: eval[_, f_Real] = {f}
:Evaluate: eval[_, f:{__Real}] = f
:Evaluate: eval[x_, _] := (Message[Suave::badsample, ff, x]; {})
:Evaluate: sample[x_, w_, iter_] := (
$Iteration = iter;
Check[Flatten @ MapSample[
($Weight = #[[1]]; intT@@ #[[2]])&,
Transpose[{w, Partition[x, ndim]}] ], {}] )
-:Evaluate: MapSample = Map
+:Evaluate: ValueQ[MapSample] || (MapSample = Map)
-:Evaluate: region[ll_, ur_, r___] := Region[TtoX@@ ll, TtoX@@ ur, r]
+:Evaluate: region[bounds_, r___] := Region[##, r]&@@
+ MapThread[TtoX, Partition[bounds, 2]]
:Evaluate: Suave::badsample = "`` is not a real-valued function at ``."
:Evaluate: Suave::baddim = "Cannot integrate in `` dimensions."
:Evaluate: Suave::badcomp = "Cannot integrate `` components."
:Evaluate: Suave::accuracy =
"Desired accuracy was not reached within `` function evaluations on `` subregions."
:Evaluate: Suave::success = "Needed `` function evaluations on `` subregions."
:Evaluate: End[]
:Evaluate: EndPackage[]
/*
Suave.tm
Subregion-adaptive Vegas Monte Carlo integration
by Thomas Hahn
- last modified 20 Jun 11 th
+ last modified 13 Mar 15 th
*/
+#define SUAVE
+#define ROUTINE "Suave"
+
#include "mathlink.h"
#include "decl.h"
+#include "MSample.c"
/*********************************************************************/
static void Status(MLCONST char *msg, cint n1, cint n2)
{
MLPutFunction(stdlink, "CompoundExpression", 2);
MLPutFunction(stdlink, "Message", 3);
MLPutFunction(stdlink, "MessageName", 2);
MLPutSymbol(stdlink, "Suave");
MLPutString(stdlink, msg);
MLPutInteger(stdlink, n1);
MLPutInteger(stdlink, n2);
}
/*********************************************************************/
-static void Print(MLCONST char *s)
-{
- int pkt;
-
- MLPutFunction(stdlink, "EvaluatePacket", 1);
- MLPutFunction(stdlink, "Print", 1);
- MLPutString(stdlink, s);
- MLEndPacket(stdlink);
-
- do {
- pkt = MLNextPacket(stdlink);
- MLNewPacket(stdlink);
- } while( pkt != RETURNPKT );
-}
-
-/*********************************************************************/
-
-static void DoSample(This *t, cnumber n,
- real *w, real *x, real *f, cint iter)
-{
- int pkt;
- real *mma_f;
- long mma_n;
-
- if( MLAbort ) longjmp(t->abort, -99);
-
- MLPutFunction(stdlink, "EvaluatePacket", 1);
- MLPutFunction(stdlink, "Cuba`Suave`sample", 3);
- MLPutRealList(stdlink, x, n*t->ndim);
- MLPutRealList(stdlink, w, n);
- MLPutInteger(stdlink, iter);
- MLEndPacket(stdlink);
-
- while( (pkt = MLNextPacket(stdlink)) && (pkt != RETURNPKT) )
- MLNewPacket(stdlink);
-
- if( !MLGetRealList(stdlink, &mma_f, &mma_n) ) {
- MLClearError(stdlink);
- MLNewPacket(stdlink);
- longjmp(t->abort, -99);
- }
-
- if( mma_n != n*t->ncomp ) {
- MLDisownRealList(stdlink, mma_f, mma_n);
- longjmp(t->abort, -3);
- }
-
- Copy(f, mma_f, n*t->ncomp);
- MLDisownRealList(stdlink, mma_f, mma_n);
-
- t->neval += n;
-}
-
-/*********************************************************************/
-
-#include "common.c"
-
static inline void DoIntegrate(This *t)
{
real integral[NCOMP], error[NCOMP], prob[NCOMP];
cint fail = Integrate(t, integral, error, prob);
if( fail < 0 ) {
switch( fail ) {
case -99:
MLPutFunction(stdlink, "Abort", 0);
return;
case -1:
Status("baddim", t->ndim, 0);
break;
case -2:
Status("badcomp", t->ncomp, 0);
break;
}
MLPutSymbol(stdlink, "$Failed");
}
else {
Status(fail ? "accuracy" : "success", t->neval, t->nregions);
MLPutFunction(stdlink, "Thread", 1);
MLPutFunction(stdlink, "List", 3);
- MLPutRealList(stdlink, integral, t->ncomp);
- MLPutRealList(stdlink, error, t->ncomp);
- MLPutRealList(stdlink, prob, t->ncomp);
+ MLPutRealxList(stdlink, integral, t->ncomp);
+ MLPutRealxList(stdlink, error, t->ncomp);
+ MLPutRealxList(stdlink, prob, t->ncomp);
}
}
/*********************************************************************/
void Suave(cint ndim, cint ncomp,
creal epsrel, creal epsabs,
cint flags, cint seed,
cnumber mineval, cnumber maxeval,
- cnumber nnew, creal flatness)
+ cnumber nnew, creal flatness, cchar *statefile)
{
This t;
t.ndim = ndim;
t.ncomp = ncomp;
t.epsrel = epsrel;
t.epsabs = epsabs;
t.flags = flags;
t.seed = seed;
t.mineval = mineval;
t.maxeval = maxeval;
t.nnew = nnew;
t.flatness = flatness;
- t.nregions = 0;
- t.neval = 0;
+ t.statefile = statefile;
DoIntegrate(&t);
MLEndPacket(stdlink);
}
/*********************************************************************/
int main(int argc, char **argv)
{
return MLMain(argc, argv);
}
Index: trunk/cuba/src/suave/Integrate.c
===================================================================
--- trunk/cuba/src/suave/Integrate.c (revision 158)
+++ trunk/cuba/src/suave/Integrate.c (revision 159)
@@ -1,278 +1,353 @@
/*
Integrate.c
integrate over the unit hypercube
this file is part of Suave
- last modified 15 Feb 11 th
+ checkpointing by B. Chokoufe
+ last modified 13 Mar 15 th
*/
+typedef struct {
+ signature_t signature;
+ count nregions, df;
+ number neval;
+ Result totals[];
+} State;
+
static int Integrate(This *t, real *integral, real *error, real *prob)
{
- TYPEDEFREGION;
+ StateDecl;
+ csize_t statesize = sizeof(State) + NCOMP*sizeof(Result);
+ Sized(State, state, statesize);
+ Array(Var, var, NDIM, 2);
+ Vector(char, out, 128*NCOMP + 256);
- count dim, comp, df;
- int fail;
- Result totals[NCOMP];
Region *anchor = NULL, *region = NULL;
+ Result *tot, *Tot = state->totals + t->ncomp;
+ Result *res, *resL, *resR;
+ Bounds *b, *B;
+ cnumber minsamples = IMax(t->nmin, MINSAMPLES);
+ count dim, comp;
+ int fail;
if( VERBOSE > 1 ) {
- char s[256];
- sprintf(s, "Suave input parameters:\n"
+ sprintf(out, "Suave input parameters:\n"
" ndim " COUNT "\n ncomp " COUNT "\n"
+ ML_NOT(" nvec " NUMBER "\n")
" epsrel " REAL "\n epsabs " REAL "\n"
" flags %d\n seed %d\n"
" mineval " NUMBER "\n maxeval " NUMBER "\n"
- " nnew " NUMBER "\n flatness " REAL,
+ " nnew " NUMBER "\n nmin " NUMBER "\n"
+ " flatness " REAL "\n"
+ " statefile \"%s\"",
t->ndim, t->ncomp,
- t->epsrel, t->epsabs,
+ ML_NOT(t->nvec,)
+ SHOW(t->epsrel), SHOW(t->epsabs),
t->flags, t->seed,
t->mineval, t->maxeval,
- t->nnew, t->flatness);
- Print(s);
+ t->nnew, t->nmin,
+ SHOW(t->flatness),
+ t->statefile);
+ Print(out);
}
if( BadComponent(t) ) return -2;
if( BadDimension(t) ) return -1;
+ ShmAlloc(t, Master);
+ ForkCores(t);
+
if( (fail = setjmp(t->abort)) ) goto abort;
t->epsabs = Max(t->epsabs, NOTZERO);
IniRandom(t);
- RegionAlloc(anchor, t->nnew, t->nnew);
- anchor->next = NULL;
- anchor->div = 0;
-
- for( dim = 0; dim < t->ndim; ++dim ) {
- Bounds *b = &anchor->bounds[dim];
- b->lower = 0;
- b->upper = 1;
- b->mid = .5;
-
- if( dim == 0 ) {
- count bin;
- /* define the initial distribution of bins */
- for( bin = 0; bin < NBINS; ++bin )
- b->grid[bin] = (bin + 1)/(real)NBINS;
- }
- else Copy(b->grid, anchor->bounds[0].grid, NBINS);
+ StateSetup(t);
+
+ if( StateReadTest(t) ) {
+ size_t *regsize = NULL;
+ StateReadOpen(t, fd) {
+ count iregion;
+ size_t totsize;
+ Region **last = &anchor;
+ if( read(fd, state, statesize) != statesize ||
+ state->signature != StateSignature(t, 2) ) break;
+ t->nregions = state->nregions;
+ totsize = t->nregions*sizeof *regsize;
+ MemAlloc(regsize, totsize);
+ StateRead(fd, regsize, totsize);
+ for( iregion = 0; iregion < t->nregions; ++iregion )
+ totsize += regsize[iregion];
+ if( st.st_size != statesize + totsize ) break;
+ for( iregion = 0; iregion < t->nregions; ++iregion ) {
+ Region *reg;
+ MemAlloc(reg, regsize[iregion]);
+ StateRead(fd, reg, regsize[iregion]);
+ *last = reg;
+ last = &reg->next;
+ }
+ *last = NULL;
+ } StateReadClose(t, fd);
+ free(regsize);
+ t->neval = state->neval;
+ t->rng.skiprandom(t, t->neval);
}
- Sample(t, t->nnew, anchor, anchor->w,
- anchor->w + t->nnew,
- anchor->w + t->nnew + t->ndim*t->nnew);
- df = anchor->df;
- ResCopy(totals, anchor->result);
+ if( ini ) {
+ count bin;
+ Bounds *b0;
+
+ anchor = RegionAlloc(t, t->nnew, t->nnew);
+ anchor->next = NULL;
+ anchor->div = 0;
+ t->nregions = 1;
+
+ b0 = RegionBounds(anchor);
+ b0->lower = 0;
+ b0->upper = 1;
+ /* define the initial distribution of bins */
+ for( bin = 0; bin < NBINS; ++bin )
+ b0->grid[bin] = (bin + 1)/(real)NBINS;
+
+ for( b = b0 + 1, B = b0 + t->ndim; b < B; ++b )
+ Copy(b, b0, 1);
+
+ t->neval = 0;
+ Sample(t, t->nnew, anchor, RegionW(anchor),
+ RegionW(anchor) + t->nnew,
+ RegionW(anchor) + t->nnew + t->ndim*t->nnew);
+ state->df = anchor->df;
+ FCopy(state->totals, anchor->result);
+ }
- for( t->nregions = 1; ; ++t->nregions ) {
- Var var[NDIM][2], *vLR;
+ /* main iteration loop */
+ for( ; ; ) {
+ Var *vLR;
real maxratio, maxerr, minfluct, bias, mid;
Region *regionL, *regionR, *reg, **parent, **par;
Bounds *bounds, *boundsL, *boundsR;
count maxcomp, bisectdim;
number n, nL, nR, nnewL, nnewR;
real *w, *wL, *wR, *x, *xL, *xR, *f, *fL, *fR, *wlast, *flast;
if( VERBOSE ) {
- char s[128 + 128*NCOMP], *p = s;
-
- p += sprintf(p, "\n"
+ char *oe = out + sprintf(out, "\n"
"Iteration " COUNT ": " NUMBER " integrand evaluations so far",
t->nregions, t->neval);
-
- for( comp = 0; comp < t->ncomp; ++comp ) {
- cResult *tot = &totals[comp];
- p += sprintf(p, "\n[" COUNT "] "
+ for( tot = state->totals, comp = 0; tot < Tot; ++tot )
+ oe += sprintf(oe, "\n[" COUNT "] "
REAL " +- " REAL " \tchisq " REAL " (" COUNT " df)",
- comp + 1, tot->avg, tot->err, tot->chisq, df);
- }
-
- Print(s);
+ ++comp, SHOW(tot->avg), SHOW(tot->err),
+ SHOW(tot->chisq), state->df);
+ Print(out);
}
maxratio = -INFTY;
maxcomp = 0;
- for( comp = 0; comp < t->ncomp; ++comp ) {
- creal ratio = totals[comp].err/MaxErr(totals[comp].avg);
+ for( tot = state->totals, comp = 0; tot < Tot; ++tot ) {
+ creal ratio = tot->err/MaxErr(tot->avg);
if( ratio > maxratio ) {
maxratio = ratio;
maxcomp = comp;
}
}
- if( maxratio <= 1 && t->neval >= t->mineval ) {
- fail = 0;
+ if( maxratio <= 1 && t->neval >= t->mineval ) break;
+
+ if( t->neval >= t->maxeval ) {
+ fail = 1;
break;
}
- if( t->neval >= t->maxeval ) break;
-
maxerr = -INFTY;
parent = &anchor;
region = anchor;
for( par = &anchor; (reg = *par); par = &reg->next ) {
creal err = reg->result[maxcomp].err;
if( err > maxerr ) {
maxerr = err;
parent = par;
region = reg;
}
}
- Fluct(t, var[0],
- region->bounds, region->w, region->n, maxcomp,
+ bounds = RegionBounds(region);
+ w = RegionW(region);
+
+ /* find the bisectdim which minimizes the fluctuations */
+ Fluct(t, var[0], bounds, w, region->n, maxcomp,
region->result[maxcomp].avg, Max(maxerr, t->epsabs));
bias = (t->epsrel < 1e-50) ? 2 :
- Max(pow(2., -(real)region->div/t->ndim)/t->epsrel, 2.);
+ Max(powx(2., -(real)region->div/t->ndim)/t->epsrel, 2.);
minfluct = INFTY;
bisectdim = 0;
for( dim = 0; dim < t->ndim; ++dim ) {
- cBounds *b = &region->bounds[dim];
creal fluct = (var[dim][0].fluct + var[dim][1].fluct)*
- (bias - b->upper + b->lower);
+ (bias - bounds[dim].upper + bounds[dim].lower);
if( fluct < minfluct ) {
minfluct = fluct;
bisectdim = dim;
}
}
+ /* apply stratified sampling to distribute points in bisected region */
vLR = var[bisectdim];
minfluct = vLR[0].fluct + vLR[1].fluct;
nnewL = IMax(
(minfluct == 0) ? t->nnew/2 : (count)(vLR[0].fluct/minfluct*t->nnew),
- MINSAMPLES );
+ minsamples );
nL = vLR[0].n + nnewL;
- nnewR = IMax(t->nnew - nnewL, MINSAMPLES);
+ nnewR = IMax(t->nnew - nnewL, minsamples);
nR = vLR[1].n + nnewR;
- RegionAlloc(regionL, nL, nnewL);
- RegionAlloc(regionR, nR, nnewR);
+ regionL = RegionAlloc(t, nL, nnewL);
+ regionR = RegionAlloc(t, nR, nnewR);
*parent = regionL;
regionL->next = regionR;
regionR->next = region->next;
regionL->div = regionR->div = region->div + 1;
- bounds = &region->bounds[bisectdim];
- mid = bounds->mid;
+ mid = .5*(bounds[bisectdim].lower + bounds[bisectdim].upper);
n = region->n;
- w = wlast = region->w; x = w + n; f = flast = x + n*t->ndim;
- wL = regionL->w; xL = wL + nL; fL = xL + nL*t->ndim;
- wR = regionR->w; xR = wR + nR; fR = xR + nR*t->ndim;
-
+ wlast = w; x = w + n; f = flast = x + n*t->ndim;
+ wL = RegionW(regionL); xL = wL + nL; fL = xL + nL*t->ndim;
+ wR = RegionW(regionR); xR = wR + nR; fR = xR + nR*t->ndim;
while( n-- ) {
cbool final = (*w < 0);
if( x[bisectdim] < mid ) {
- if( final && wR > regionR->w ) *(wR - 1) = -fabs(*(wR - 1));
+ if( final && wR > RegionW(regionR) ) wR[-1] = -fabsx(wR[-1]);
*wL++ = *w++;
- VecCopy(xL, x);
+ XCopy(xL, x);
xL += t->ndim;
- ResCopy(fL, f);
+ FCopy(fL, f);
fL += t->ncomp;
}
else {
- if( final && wL > regionL->w ) *(wL - 1) = -fabs(*(wL - 1));
+ if( final && wL > RegionW(regionL) ) wL[-1] = -fabsx(wL[-1]);
*wR++ = *w++;
- VecCopy(xR, x);
+ XCopy(xR, x);
xR += t->ndim;
- ResCopy(fR, f);
+ FCopy(fR, f);
fR += t->ncomp;
}
x += t->ndim;
f += t->ncomp;
if( n && final ) wlast = w, flast = f;
}
- Reweight(t, region->bounds, wlast, flast, f, totals);
- VecCopy(regionL->bounds, region->bounds);
- VecCopy(regionR->bounds, region->bounds);
-
- boundsL = &regionL->bounds[bisectdim];
- boundsR = &regionR->bounds[bisectdim];
- boundsL->mid = .5*(boundsL->lower + (boundsL->upper = mid));
- boundsR->mid = .5*((boundsR->lower = mid) + boundsR->upper);
-
- StretchGrid(bounds->grid, boundsL->grid, boundsR->grid);
+ Reweight(t, bounds, wlast, flast, f, state->totals);
+ boundsL = RegionBounds(regionL);
+ XCopy(boundsL, bounds);
+ boundsR = RegionBounds(regionR);
+ XCopy(boundsR, bounds);
+
+ boundsL[bisectdim].upper = mid;
+ boundsR[bisectdim].lower = mid;
+ StretchGrid(bounds[bisectdim].grid,
+ boundsL[bisectdim].grid, boundsR[bisectdim].grid);
Sample(t, nnewL, regionL, wL, xL, fL);
Sample(t, nnewR, regionR, wR, xR, fR);
- df += regionL->df + regionR->df - region->df;
+ state->df += regionL->df + regionR->df - region->df;
- for( comp = 0; comp < t->ncomp; ++comp ) {
- cResult *r = &region->result[comp];
- Result *rL = &regionL->result[comp];
- Result *rR = &regionR->result[comp];
- Result *tot = &totals[comp];
+ for( res = region->result,
+ resL = regionL->result,
+ resR = regionR->result,
+ tot = state->totals;
+ tot < Tot; ++res, ++resL, ++resR, ++tot ) {
real diff, sigsq;
- tot->avg += diff = rL->avg + rR->avg - r->avg;
+ tot->avg += diff = resL->avg + resR->avg - res->avg;
diff = Sq(.25*diff);
- sigsq = rL->sigsq + rR->sigsq;
+ sigsq = resL->sigsq + resR->sigsq;
if( sigsq > 0 ) {
- creal c = Sq(1 + sqrt(diff/sigsq));
- rL->sigsq *= c;
- rR->sigsq *= c;
+ creal c = Sq(1 + sqrtx(diff/sigsq));
+ resL->sigsq *= c;
+ resR->sigsq *= c;
}
- rL->err = sqrt(rL->sigsq += diff);
- rR->err = sqrt(rR->sigsq += diff);
+ resL->err = sqrtx(resL->sigsq += diff);
+ resR->err = sqrtx(resR->sigsq += diff);
- tot->sigsq += rL->sigsq + rR->sigsq - r->sigsq;
- tot->err = sqrt(tot->sigsq);
+ tot->sigsq += resL->sigsq + resR->sigsq - res->sigsq;
+ tot->err = sqrtx(tot->sigsq);
- tot->chisq += rL->chisq + rR->chisq - r->chisq;
+ tot->chisq += resL->chisq + resR->chisq - res->chisq;
}
free(region);
region = NULL;
+ ++t->nregions;
+
+ if( StateWriteTest(t) ) {
+ StateWriteOpen(t, fd) {
+ Region *reg;
+ size_t totsize, *regsize, *s;
+ state->signature = StateSignature(t, 2);
+ state->neval = t->neval;
+ state->nregions = t->nregions;
+ StateWrite(fd, state, statesize);
+ MemAlloc(regsize, totsize = t->nregions*sizeof(size_t));
+ s = regsize;
+ for( reg = anchor; reg; reg = reg->next )
+ *s++ = reg->size;
+ StateWrite(fd, regsize, totsize);
+ free(regsize);
+ for( reg = anchor; reg; reg = reg->next )
+ StateWrite(fd, reg, reg->size);
+ } StateWriteClose(t, fd);
+ }
}
- for( comp = 0; comp < t->ncomp; ++comp ) {
- cResult *tot = &totals[comp];
+ for( tot = state->totals, comp = 0; tot < Tot; ++tot, ++comp ) {
integral[comp] = tot->avg;
error[comp] = tot->err;
- prob[comp] = ChiSquare(tot->chisq, df);
+ prob[comp] = ChiSquare(tot->chisq, state->df);
}
#ifdef MLVERSION
if( REGIONS ) {
+ Vector(real, bounds, NDIM*2);
+
MLPutFunction(stdlink, "List", 2);
+
MLPutFunction(stdlink, "List", t->nregions);
for( region = anchor; region; region = region->next ) {
- real lower[NDIM], upper[NDIM];
-
- for( dim = 0; dim < t->ndim; ++dim ) {
- cBounds *b = &region->bounds[dim];
- lower[dim] = b->lower;
- upper[dim] = b->upper;
+ cResult *Res;
+ real *d = bounds;
+ for( B = (b = RegionBounds(region)) + t->ndim; b < B; ++b ) {
+ *d++ = b->lower;
+ *d++ = b->upper;
}
- MLPutFunction(stdlink, "Cuba`Suave`region", 4);
- MLPutRealList(stdlink, lower, t->ndim);
- MLPutRealList(stdlink, upper, t->ndim);
+ MLPutFunction(stdlink, "Cuba`Suave`region", 3);
+
+ MLPutRealxList(stdlink, bounds, 2*t->ndim);
MLPutFunction(stdlink, "List", t->ncomp);
- for( comp = 0; comp < t->ncomp; ++comp ) {
- cResult *r = &region->result[comp];
- real res[] = {r->avg, r->err, r->chisq};
- MLPutRealList(stdlink, res, Elements(res));
+ for( Res = (res = region->result) + t->ncomp; res < Res; ++res ) {
+ real r[] = {res->avg, res->err, res->chisq};
+ MLPutRealxList(stdlink, r, Elements(r));
}
MLPutInteger(stdlink, region->df);
}
}
#endif
abort:
free(region);
-
while( (region = anchor) ) {
anchor = anchor->next;
free(region);
}
+ ShmFree(t, Master);
+
+ StateRemove(t);
return fail;
}
Index: trunk/cuba/src/suave/Suave.c
===================================================================
--- trunk/cuba/src/suave/Suave.c (revision 158)
+++ trunk/cuba/src/suave/Suave.c (revision 159)
@@ -1,93 +1,94 @@
/*
Suave.c
- Subregion-adaptive Vegas Monte-Carlo integration
+ Subregion-adaptive Vegas Monte Carlo integration
by Thomas Hahn
- last modified 15 Feb 11 th
+ last modified 28 Nov 14 th
*/
-#include "decl.h"
-
-#define Print(s) puts(s); fflush(stdout)
-
-/*********************************************************************/
+#define SUAVE
+#define ROUTINE "Suave"
-static inline void DoSample(This *t, number n,
- creal *w, creal *x, real *f, cint iter)
-{
- t->neval += n;
- while( n-- ) {
- if( t->integrand(&t->ndim, x, &t->ncomp, f, t->userdata,
- w++, &iter) == ABORT )
- longjmp(t->abort, -99);
- x += t->ndim;
- f += t->ncomp;
- }
-}
+#include "decl.h"
+#include "CSample.c"
/*********************************************************************/
-#include "common.c"
-
Extern void EXPORT(Suave)(ccount ndim, ccount ncomp,
- Integrand integrand, void *userdata,
+ Integrand integrand, void *userdata, cnumber nvec,
creal epsrel, creal epsabs,
cint flags, cint seed,
cnumber mineval, cnumber maxeval,
- cnumber nnew, creal flatness,
+ cnumber nnew, cnumber nmin, creal flatness,
+ cchar *statefile, Spin **pspin,
count *pnregions, number *pneval, int *pfail,
real *integral, real *error, real *prob)
{
This t;
+
+ VerboseInit();
+
t.ndim = ndim;
t.ncomp = ncomp;
t.integrand = integrand;
t.userdata = userdata;
+ t.nvec = nvec;
t.epsrel = epsrel;
t.epsabs = epsabs;
- t.flags = flags;
+ t.flags = MaxVerbose(flags);
t.seed = seed;
t.mineval = mineval;
t.maxeval = maxeval;
t.nnew = nnew;
+ t.nmin = IMax(nmin, 2);
t.flatness = flatness;
- t.nregions = 0;
- t.neval = 0;
+ t.statefile = statefile;
+ FORK_ONLY(t.spin = Invalid(pspin) ? NULL : *pspin;)
*pfail = Integrate(&t, integral, error, prob);
*pnregions = t.nregions;
*pneval = t.neval;
+
+ WaitCores(&t, pspin);
}
/*********************************************************************/
Extern void EXPORT(suave)(ccount *pndim, ccount *pncomp,
- Integrand integrand, void *userdata,
+ Integrand integrand, void *userdata, cnumber *pnvec,
creal *pepsrel, creal *pepsabs,
cint *pflags, cint *pseed,
cnumber *pmineval, cnumber *pmaxeval,
- cnumber *pnnew, creal *pflatness,
+ cnumber *pnnew, cnumber *pnmin, creal *pflatness,
+ cchar *statefile, Spin **pspin,
count *pnregions, number *pneval, int *pfail,
- real *integral, real *error, real *prob)
+ real *integral, real *error, real *prob, cint statefilelen)
{
This t;
+
+ VerboseInit();
+
t.ndim = *pndim;
t.ncomp = *pncomp;
t.integrand = integrand;
t.userdata = userdata;
+ t.nvec = *pnvec;
t.epsrel = *pepsrel;
t.epsabs = *pepsabs;
- t.flags = *pflags;
+ t.flags = MaxVerbose(*pflags);
t.seed = *pseed;
t.mineval = *pmineval;
t.maxeval = *pmaxeval;
t.nnew = *pnnew;
+ t.nmin = IMax(*pnmin, 2);
t.flatness = *pflatness;
- t.nregions = 0;
- t.neval = 0;
+ CString(t.statefile, statefile, statefilelen);
+ FORK_ONLY(t.spin = Invalid(pspin) ? NULL : *pspin;)
*pfail = Integrate(&t, integral, error, prob);
*pnregions = t.nregions;
*pneval = t.neval;
+
+ WaitCores(&t, pspin);
}
Index: trunk/cuba/src/suave/Grid.c
===================================================================
--- trunk/cuba/src/suave/Grid.c (revision 158)
+++ trunk/cuba/src/suave/Grid.c (revision 159)
@@ -1,137 +1,137 @@
/*
Grid.c
utility functions for the Vegas grid
this file is part of Suave
- last modified 1 Jun 10 th
+ last modified 12 Mar 15 th
*/
static void RefineGrid(cThis *t, Grid grid, Grid margsum)
{
real avgperbin, thisbin, newcur, delta;
Grid imp, newgrid;
int bin, newbin;
/* smooth the f^2 value stored for each bin */
real prev = margsum[0];
real cur = margsum[1];
real norm = margsum[0] = .5*(prev + cur);
for( bin = 1; bin < NBINS - 1; ++bin ) {
creal s = prev + cur;
prev = cur;
cur = margsum[bin + 1];
norm += margsum[bin] = (s + cur)/3.;
}
norm += margsum[NBINS - 1] = .5*(prev + cur);
if( norm == 0 ) return;
norm = 1/norm;
/* compute the importance function for each bin */
avgperbin = 0;
for( bin = 0; bin < NBINS; ++bin ) {
real impfun = 0;
if( margsum[bin] > 0 ) {
creal r = margsum[bin]*norm;
- avgperbin += impfun = pow((r - 1)/log(r), 1.5);
+ avgperbin += impfun = powx((r - 1)/log(r), 1.5);
}
imp[bin] = impfun;
}
avgperbin /= NBINS;
/* redefine the size of each bin */
cur = newcur = 0;
thisbin = 0;
bin = -1;
for( newbin = 0; newbin < NBINS - 1; ++newbin ) {
while( thisbin < avgperbin ) {
thisbin += imp[++bin];
prev = cur;
cur = grid[bin];
}
thisbin -= avgperbin;
delta = (cur - prev)*thisbin;
newgrid[newbin] = SHARPEDGES ?
cur - delta/imp[bin] :
- (newcur = Max(newcur + 0x1p-48,
+ (newcur = Max(newcur + 16*DBL_EPSILON,
cur - 2*delta/(imp[bin] + imp[IDim(bin - 1)])));
}
Copy(grid, newgrid, NBINS - 1);
grid[NBINS - 1] = 1;
}
/*********************************************************************/
static void Reweight(cThis *t, Bounds *b,
creal *w, creal *f, creal *lastf, cResult *total)
{
- Grid margsum[NDIM];
- real scale[NCOMP];
+ Vector(Grid, margsum, NDIM);
+ Vector(real, scale, NCOMP);
cbin_t *bin = (cbin_t *)lastf;
count dim, comp;
if( t->ncomp == 1 ) scale[0] = 1;
else {
for( comp = 0; comp < t->ncomp; ++comp )
scale[comp] = (total[comp].avg == 0) ? 0 : 1/total[comp].avg;
}
- Zap(margsum);
+ XClear(margsum);
while( f < lastf ) {
real fsq = 0;
for( comp = 0; comp < t->ncomp; ++comp )
fsq += Sq(*f++*scale[comp]);
fsq *= Sq(*w++);
if( fsq != 0 )
for( dim = 0; dim < t->ndim; ++dim )
margsum[dim][bin[dim]] += fsq;
bin += t->ndim;
}
for( dim = 0; dim < t->ndim; ++dim )
RefineGrid(t, b[dim].grid, margsum[dim]);
}
/*********************************************************************/
static void StretchGrid(cGrid grid, Grid gridL, Grid gridR)
{
real prev = 0, cur, step, x;
count bin = 0;
while( bin < NBINS ) {
cur = grid[bin++];
if( cur >= .5 ) break;
prev = cur;
}
step = (bin - (cur - .5)/(cur - prev))/NBINS;
prev = x = 0;
cur = *grid;
for( bin = 0; bin < NBINS; ++bin ) {
x += step;
if( x > 1 ) {
--x;
prev = cur;
cur = *++grid;
}
gridL[bin] = 2*(prev + (cur - prev)*x);
}
step = 1 - step;
for( bin = 0; bin < NBINS - 1; ++bin ) {
x += step;
if( x > 1 ) {
--x;
prev = cur;
cur = *++grid;
}
gridR[bin] = 2*(prev + (cur - prev)*x) - 1;
}
gridR[NBINS - 1] = 1;
}
Index: trunk/cuba/src/suave/common.c
===================================================================
--- trunk/cuba/src/suave/common.c (revision 158)
+++ trunk/cuba/src/suave/common.c (revision 159)
@@ -1,33 +1,41 @@
/*
common.c
includes most of the modules
this file is part of Suave
- last modified 2 Jun 10 th
+ last modified 29 Jul 13 th
*/
-#define RegionAlloc(p, n, nnew) MemAlloc(p, \
- sizeof(Region) + \
- (n)*(t->ndim + t->ncomp + 1)*sizeof(real) + \
- (nnew)*t->ndim*sizeof(bin_t))
+static inline Region *RegionAlloc(cThis *t, cnumber n, cnumber nnew)
+{
+ csize_t size = sizeof(Region) +
+ t->ncomp*sizeof(Result) +
+ t->ndim*sizeof(Bounds) +
+ t->ncomp*t->ndim*2*sizeof(real) +
+ n*SAMPLESIZE +
+ nnew*t->ndim*sizeof(bin_t);
+ Region *p;
+ MemAlloc(p, size);
+ p->size = size;
+ return p;
+}
static inline bool BadDimension(cThis *t)
{
- if( t->ndim > NDIM ) return true;
+ if( t->ndim > MAXDIM ) return true;
return t->ndim < SOBOL_MINDIM ||
(t->seed == 0 && t->ndim > SOBOL_MAXDIM);
}
static inline bool BadComponent(cThis *t)
{
- if( t->ncomp > NCOMP ) return true;
+ if( t->ncomp > MAXCOMP ) return true;
return t->ncomp < 1;
}
#include "Random.c"
#include "ChiSquare.c"
#include "Grid.c"
#include "Sample.c"
#include "Fluct.c"
-#include "Integrate.c"
Index: trunk/cuba/src/vegas/Integrate.c
===================================================================
--- trunk/cuba/src/vegas/Integrate.c (revision 158)
+++ trunk/cuba/src/vegas/Integrate.c (revision 159)
@@ -1,238 +1,227 @@
/*
Integrate.c
integrate over the unit hypercube
this file is part of Vegas
- last modified 15 Feb 11 th
+ last modified 13 Mar 15 th
*/
+typedef struct {
+ signature_t signature;
+ count niter;
+ number nsamples, neval;
+ Cumulants cumul[];
+} State;
+
static int Integrate(This *t, real *integral, real *error, real *prob)
{
- real *sample;
+ bin_t *bins;
count dim, comp;
int fail;
- struct {
- count niter;
- number nsamples, neval;
- Cumulants cumul[100];//#TT used to be Cumulants cumul[NCOMP];
- Grid grid[100];//#TT used to be Grid grid[NDIM];
- } state;
- int statemsg = VERBOSE;
- struct stat st;
+
+ StateDecl;
+ csize_t statesize = sizeof(State) +
+ NCOMP*sizeof(Cumulants) + NDIM*sizeof(Grid);
+ Sized(State, state, statesize);
+ Cumulants *c, *C = state->cumul + t->ncomp;
+ Grid *state_grid = (Grid *)C;
+ Array(Grid, margsum, NCOMP, NDIM);
+ Vector(char, out, 128*NCOMP + 256);
if( VERBOSE > 1 ) {
- char s[512];
- sprintf(s, "Vegas input parameters:\n"
+ sprintf(out, "Vegas input parameters:\n"
" ndim " COUNT "\n ncomp " COUNT "\n"
+ ML_NOT(" nvec " NUMBER "\n")
" epsrel " REAL "\n epsabs " REAL "\n"
" flags %d\n seed %d\n"
" mineval " NUMBER "\n maxeval " NUMBER "\n"
" nstart " NUMBER "\n nincrease " NUMBER "\n"
" nbatch " NUMBER "\n gridno %d\n"
" statefile \"%s\"",
t->ndim, t->ncomp,
- t->epsrel, t->epsabs,
+ ML_NOT(t->nvec,)
+ SHOW(t->epsrel), SHOW(t->epsabs),
t->flags, t->seed,
t->mineval, t->maxeval,
t->nstart, t->nincrease, t->nbatch,
t->gridno, t->statefile);
- Print(s);
+ Print(out);
}
if( BadComponent(t) ) return -2;
if( BadDimension(t) ) return -1;
- SamplesAlloc(sample);
+ FrameAlloc(t, Master);
+ ForkCores(t);
+ Alloc(bins, t->nbatch*t->ndim);
if( (fail = setjmp(t->abort)) ) goto abort;
IniRandom(t);
- if( t->statefile && *t->statefile &&
- stat(t->statefile, &st) == 0 &&
- st.st_size == sizeof state && (st.st_mode & 0400) ) {
- cint h = open(t->statefile, O_RDONLY);
- read(h, &state, sizeof state);
- close(h);
- t->rng.skiprandom(t, t->neval = state.neval);
+ StateSetup(t);
- if( VERBOSE ) {
- char s[256];
- sprintf(s, "\nRestoring state from %s.", t->statefile);
- Print(s);
- }
+ if( StateReadTest(t) ) {
+ StateReadOpen(t, fd) {
+ if( read(fd, state, statesize) != statesize ||
+ state->signature != StateSignature(t, 1) ) break;
+ } StateReadClose(t, fd);
+ t->neval = state->neval;
+ t->rng.skiprandom(t, t->neval);
}
- else {
- t->statefile = NULL;
- state.niter = 0;
- state.nsamples = t->nstart;
- Zap(state.cumul);
- GetGrid(t, state.grid);
+
+ if( ini | ZAPSTATE ) {
+ t->neval = 0;
+ state->niter = 0;
+ state->nsamples = t->nstart;
+ FClear(state->cumul);
+ if( ini ) GetGrid(t, state_grid);
}
/* main iteration loop */
-
for( ; ; ) {
- number nsamples = state.nsamples;
+ number nsamples = state->nsamples;
creal jacobian = 1./nsamples;
- Grid margsum[NCOMP][NDIM];
- Zap(margsum);
+ FClear(margsum);
for( ; nsamples > 0; nsamples -= t->nbatch ) {
cnumber n = IMin(t->nbatch, nsamples);
- real *w = sample;
+ real *w = t->frame;
real *x = w + n;
real *f = x + n*t->ndim;
real *lastf = f + n*t->ncomp;
- bin_t *bin = (bin_t *)lastf;
+ bin_t *bin = bins;
while( x < f ) {
real weight = jacobian;
t->rng.getrandom(t, x);
for( dim = 0; dim < t->ndim; ++dim ) {
creal pos = *x*NBINS;
ccount ipos = (count)pos;
- creal prev = (ipos == 0) ? 0 : state.grid[dim][ipos - 1];
- creal diff = state.grid[dim][ipos] - prev;
+ creal prev = (ipos == 0) ? 0 : state_grid[dim][ipos - 1];
+ creal diff = state_grid[dim][ipos] - prev;
*x++ = prev + (pos - ipos)*diff;
*bin++ = ipos;
weight *= diff*NBINS;
}
*w++ = weight;
}
- DoSample(t, n, sample, w, f, state.niter + 1);
+ DoSample(t, n, w, f, t->frame, state->niter + 1);
- w = sample;
- bin = (bin_t *)lastf;
+ bin = bins;
+ w = t->frame;
while( f < lastf ) {
creal weight = *w++;
+ Grid *m = &margsum[0][0];
- for( comp = 0; comp < t->ncomp; ++comp ) {
+ for( c = state->cumul; c < C; ++c ) {
real wfun = weight*(*f++);
if( wfun ) {
- Cumulants *c = &state.cumul[comp];
- Grid *m = margsum[comp];
-
c->sum += wfun;
c->sqsum += wfun *= wfun;
for( dim = 0; dim < t->ndim; ++dim )
m[dim][bin[dim]] += wfun;
}
+ m += t->ndim;
}
bin += t->ndim;
}
}
fail = 0;
/* compute the integral and error values */
- for( comp = 0; comp < t->ncomp; ++comp ) {
- Cumulants *c = &state.cumul[comp];
- real avg, sigsq;
- real w = Weight(c->sum, c->sqsum, state.nsamples);
-
- sigsq = 1/(c->weightsum += w);
- avg = sigsq*(c->avgsum += w*c->sum);
+ for( c = state->cumul; c < C; ++c ) {
+ real w = Weight(c->sum, c->sqsum, state->nsamples);
+ real sigsq = 1/(c->weightsum += w);
+ real avg = sigsq*(c->avgsum += w*c->sum);
c->avg = LAST ? (sigsq = 1/w, c->sum) : avg;
- c->err = sqrt(sigsq);
+ c->err = sqrtx(sigsq);
fail |= (c->err > MaxErr(c->avg));
- if( state.niter == 0 ) c->guess = c->sum;
+ if( state->niter == 0 ) c->guess = c->sum;
else {
c->chisum += w *= c->sum - c->guess;
c->chisqsum += w*c->sum;
}
c->chisq = c->chisqsum - avg*c->chisum;
c->sum = c->sqsum = 0;
}
if( VERBOSE ) {
- char s[128 + 128*NCOMP], *p = s;
-
- p += sprintf(p, "\n"
+ char *oe = out + sprintf(out, "\n"
"Iteration " COUNT ": " NUMBER " integrand evaluations so far",
- state.niter + 1, t->neval);
-
- for( comp = 0; comp < t->ncomp; ++comp ) {
- cCumulants *c = &state.cumul[comp];
- p += sprintf(p, "\n[" COUNT "] "
+ state->niter + 1, t->neval);
+ for( c = state->cumul, comp = 0; c < C; ++c )
+ oe += sprintf(oe, "\n[" COUNT "] "
REAL " +- " REAL " \tchisq " REAL " (" COUNT " df)",
- comp + 1, c->avg, c->err, c->chisq, state.niter);
- }
-
- Print(s);
+ ++comp, SHOW(c->avg), SHOW(c->err),
+ SHOW(c->chisq), state->niter);
+ Print(out);
}
- if( fail == 0 && t->neval >= t->mineval ) {
- if( t->statefile ) unlink(t->statefile);
- break;
- }
+ if( fail == 0 && t->neval >= t->mineval ) break;
- if( t->neval >= t->maxeval && t->statefile == NULL ) break;
+ if( t->neval >= t->maxeval && !StateWriteTest(t) ) break;
if( t->ncomp == 1 )
for( dim = 0; dim < t->ndim; ++dim )
- RefineGrid(t, state.grid[dim], margsum[0][dim]);
+ RefineGrid(t, state_grid[dim], margsum[0][dim]);
else {
for( dim = 0; dim < t->ndim; ++dim ) {
Grid wmargsum;
Zap(wmargsum);
for( comp = 0; comp < t->ncomp; ++comp ) {
- real w = state.cumul[comp].avg;
+ real w = state->cumul[comp].avg;
if( w != 0 ) {
creal *m = margsum[comp][dim];
count bin;
w = 1/Sq(w);
for( bin = 0; bin < NBINS; ++bin )
wmargsum[bin] += w*m[bin];
}
}
- RefineGrid(t, state.grid[dim], wmargsum);
+ RefineGrid(t, state_grid[dim], wmargsum);
}
}
- ++state.niter;
- state.nsamples += t->nincrease;
+ ++state->niter;
+ state->nsamples += t->nincrease;
- if( t->statefile ) {
- cint h = creat(t->statefile, 0666);
- if( h != -1 ) {
- state.neval = t->neval;
- write(h, &state, sizeof state);
- close(h);
-
- if( statemsg ) {
- char s[256];
- sprintf(s, "\nSaving state to %s.", t->statefile);
- Print(s);
- statemsg = false;
- }
- }
+ if( StateWriteTest(t) ) {
+ state->signature = StateSignature(t, 1);
+ state->neval = t->neval;
+ StateWriteOpen(t, fd) {
+ StateWrite(fd, state, statesize);
+ } StateWriteClose(t, fd);
if( t->neval >= t->maxeval ) break;
}
}
for( comp = 0; comp < t->ncomp; ++comp ) {
- cCumulants *c = &state.cumul[comp];
+ cCumulants *c = &state->cumul[comp];
integral[comp] = c->avg;
error[comp] = c->err;
- prob[comp] = ChiSquare(c->chisq, state.niter);
+ prob[comp] = ChiSquare(c->chisq, state->niter);
}
abort:
- free(sample);
- PutGrid(t, state.grid);
+ PutGrid(t, state_grid);
+ free(bins);
+ FrameFree(t, Master);
+
+ StateRemove(t);
return fail;
}
Index: trunk/cuba/src/vegas/Vegas.tm
===================================================================
--- trunk/cuba/src/vegas/Vegas.tm (revision 158)
+++ trunk/cuba/src/vegas/Vegas.tm (revision 159)
@@ -1,299 +1,254 @@
:Evaluate: BeginPackage["Cuba`"]
:Evaluate: Vegas::usage = "Vegas[f, {x, xmin, xmax}..] computes a numerical approximation to the integral of the real scalar or vector function f.
The output is a list with entries of the form {integral, error, chi-square probability} for each component of the integrand."
:Evaluate: NStart::usage = "NStart is an option of Vegas.
It specifies the number of integrand evaluations per iteration to start with."
:Evaluate: NIncrease::usage = "NIncrease is an option of Vegas.
It specifies the increase in the number of integrand evaluations per iteration."
:Evaluate: NBatch::usage = "NBatch is an option of Vegas.
It specifies how many points are sent in one MathLink packet to be sampled by Mathematica."
+:Evaluate: MinPoints::usage = "MinPoints is an option of Vegas.
+ It specifies the minimum number of points to sample."
+
:Evaluate: GridNo::usage = "GridNo is an option of Vegas.
- Vegas maintains an internal table in which it can memorize up to 10 grids, to be used on subsequent integrations.
+ Vegas maintains an internal table in which it can memorize up to 10 grids, to be used in subsequent integrations.
A GridNo between 1 and 10 selects the slot in this internal table.
For other values the grid is initialized from scratch and discarded at the end of the integration."
:Evaluate: StateFile::usage = "StateFile is an option of Vegas.
It specifies a file in which the internal state is stored after each iteration and from which it can be restored on a subsequent run.
The state file is removed once the prescribed accuracy has been reached."
-:Evaluate: MinPoints::usage = "MinPoints is an option of Vegas.
- It specifies the minimum number of points to sample."
-
:Evaluate: Final::usage = "Final is an option of Vegas.
It can take the values Last or All which determine whether only the last (largest) or all of the samples collected on a subregion over the iterations contribute to the final result."
:Evaluate: PseudoRandom::usage = "PseudoRandom is an option of Vegas.
It can take the following values:
False for Sobol quasi-random numbers (default),
True or 0 for Mersenne Twister pseudo-random numbers,
any other integer value n for Ranlux pseudo-random numbers of luxury level n."
:Evaluate: PseudoRandomSeed::usage = "PseudoRandomSeed is an option of Vegas.
It specifies the seed for the pseudo-random number generator."
:Evaluate: SharpEdges::usage = "SharpEdges is an option of Vegas.
It turns off smoothing of the importance function for integrands with sharp edges."
+:Evaluate: RetainStateFile::usage = "RetainStateFile is an option of Vegas.
+ It determines whether a chosen state file is kept even if the integration terminates normally."
+
+:Evaluate: ResetState::usage = "ResetState is an option of Vegas.
+ If True, Vegas resets its state even if a state file is present, i.e. keeps only the grid."
+
:Evaluate: $Weight::usage = "$Weight is a global variable set by Vegas during the evaluation of the integrand to the weight of the point being sampled."
:Evaluate: $Iteration::usage = "$Iteration is a global variable set by Suave during the evaluation of the integrand to the present iteration number."
:Evaluate: MapSample::usage = "MapSample is a function used to map the integrand over the points to be sampled."
:Evaluate: Begin["`Vegas`"]
:Begin:
:Function: Vegas
:Pattern: MLVegas[ndim_, ncomp_,
epsrel_, epsabs_, flags_, seed_,
mineval_, maxeval_,
nstart_, nincrease_, nbatch_,
gridno_, statefile_]
:Arguments: {ndim, ncomp,
epsrel, epsabs, flags, seed,
mineval, maxeval,
nstart, nincrease, nbatch,
gridno, statefile}
:ArgumentTypes: {Integer, Integer,
- Real, Real, Integer, Integer,
+ Real64, Real64, Integer, Integer,
Integer, Integer,
Integer, Integer, Integer,
Integer, String}
:ReturnType: Manual
:End:
:Evaluate: Attributes[Vegas] = {HoldFirst}
:Evaluate: Options[Vegas] = {PrecisionGoal -> 3, AccuracyGoal -> 12,
MinPoints -> 0, MaxPoints -> 50000,
NStart -> 1000, NIncrease -> 500,
NBatch -> 1000, GridNo -> 0, StateFile -> "",
Verbose -> 1, Final -> All,
PseudoRandom -> False, PseudoRandomSeed -> 5489,
- SharpEdges -> False, Compiled -> True}
+ SharpEdges -> False, RetainStateFile -> False,
+ ResetState -> False, Compiled -> True}
:Evaluate: Vegas[f_, v:{_, _, _}.., opt___Rule] :=
Block[ {ff = HoldForm[f], ndim = Length[{v}], ncomp,
tags, vars, lower, range, jac, tmp, defs, intT,
rel, abs, mineval, maxeval, nstart, nincrease, nbatch,
- gridno, verbose, final, level, seed, edges, compiled,
- $Weight, $Iteration},
+ gridno, state, verbose, final, level, seed, edges, retain,
+ zapstate, compiled, $Weight, $Iteration},
Message[Vegas::optx, #, Vegas]&/@
Complement[First/@ {opt}, tags = First/@ Options[Vegas]];
{rel, abs, mineval, maxeval, nstart, nincrease, nbatch,
- gridno, state, verbose, final, level, seed, edges, compiled} =
- tags /. {opt} /. Options[Vegas];
+ gridno, state, verbose, final, level, seed, edges, retain,
+ zapstate, compiled} = tags /. {opt} /. Options[Vegas];
{vars, lower, range} = Transpose[{v}];
jac = Simplify[Times@@ (range -= lower)];
tmp = Array[tmpvar, ndim];
defs = Simplify[lower + range tmp];
Block[{Set}, define[compiled, tmp, Thread[vars = defs], jac]];
intT = integrandT[f];
Block[#,
ncomp = Length[intT@@ RandomReal[1, ndim]];
MLVegas[ndim, ncomp, 10.^-rel, 10.^-abs,
Min[Max[verbose, 0], 3] +
If[final === Last, 4, 0] +
- If[TrueQ[edges], 8, 0]
+ If[TrueQ[edges], 8, 0] +
+ If[TrueQ[retain], 16, 0] +
+ If[TrueQ[zapstate], 32, 0] +
If[IntegerQ[level], 256 level, 0],
If[level =!= False && IntegerQ[seed], seed, 0],
mineval, maxeval,
nstart, nincrease, nbatch,
gridno, state]
]& @ vars
]
:Evaluate: tmpvar[n_] := ToExpression["Cuba`Vegas`t" <> ToString[n]]
:Evaluate: Attributes[foo] = {HoldAll}
:Evaluate: define[True, tmp_, defs_, jac_] :=
- integrandT[f_] := Compile[tmp, eval[defs, Chop[f jac]//N],
+ integrandT[f_] := Compile[tmp, eval[defs, N[f jac]],
{{_eval, _Real, 1}}]
:Evaluate: define[_, tmp_, defs_, jac_] :=
- integrandT[f_] := Function[tmp, eval[defs, Chop[f jac]//N]]
+ integrandT[f_] := Function[tmp, eval[defs, N[f jac]]]
:Evaluate: eval[_, f_Real] = {f}
:Evaluate: eval[_, f:{__Real}] = f
:Evaluate: eval[x_, _] := (Message[Vegas::badsample, ff, x]; {})
:Evaluate: sample[x_, w_, iter_] := (
$Iteration = iter;
Check[Flatten @ MapSample[
($Weight = #[[1]]; intT@@ #[[2]])&,
Transpose[{w, Partition[x, ndim]}] ], {}] )
-:Evaluate: MapSample = Map
+:Evaluate: ValueQ[MapSample] || (MapSample = Map)
:Evaluate: Vegas::badsample = "`` is not a real-valued function at ``."
:Evaluate: Vegas::baddim = "Cannot integrate in `` dimensions."
:Evaluate: Vegas::badcomp = "Cannot integrate `` components."
:Evaluate: Vegas::accuracy =
"Desired accuracy was not reached within `` function evaluations."
:Evaluate: Vegas::success = "Needed `` function evaluations."
:Evaluate: End[]
:Evaluate: EndPackage[]
/*
Vegas.tm
Vegas Monte Carlo integration
by Thomas Hahn
- last modified 18 Jun 11 th
+ last modified 27 Mar 15 th
*/
+#define VEGAS
+#define ROUTINE "Vegas"
+
#include "mathlink.h"
#include "decl.h"
+#include "MSample.c"
/*********************************************************************/
static void Status(MLCONST char *msg, cint n)
{
MLPutFunction(stdlink, "CompoundExpression", 2);
MLPutFunction(stdlink, "Message", 2);
MLPutFunction(stdlink, "MessageName", 2);
MLPutSymbol(stdlink, "Vegas");
MLPutString(stdlink, msg);
MLPutInteger(stdlink, n);
}
/*********************************************************************/
-static void Print(MLCONST char *s)
-{
- int pkt;
-
- MLPutFunction(stdlink, "EvaluatePacket", 1);
- MLPutFunction(stdlink, "Print", 1);
- MLPutString(stdlink, s);
- MLEndPacket(stdlink);
-
- do {
- pkt = MLNextPacket(stdlink);
- MLNewPacket(stdlink);
- } while( pkt != RETURNPKT );
-}
-
-/*********************************************************************/
-
-static void DoSample(This *t, cnumber n,
- real *w, real *x, real *f, cint iter)
-{
- int pkt;
- real *mma_f;
- long mma_n;
-
- if( MLAbort ) longjmp(t->abort, -99);
-
- MLPutFunction(stdlink, "EvaluatePacket", 1);
- MLPutFunction(stdlink, "Cuba`Vegas`sample", 3);
- MLPutRealList(stdlink, x, n*t->ndim);
- MLPutRealList(stdlink, w, n);
- MLPutInteger(stdlink, iter);
- MLEndPacket(stdlink);
-
- while( (pkt = MLNextPacket(stdlink)) && (pkt != RETURNPKT) )
- MLNewPacket(stdlink);
-
- if( !MLGetRealList(stdlink, &mma_f, &mma_n) ) {
- MLClearError(stdlink);
- MLNewPacket(stdlink);
- longjmp(t->abort, -99);
- }
-
- if( mma_n != n*t->ncomp ) {
- MLDisownRealList(stdlink, mma_f, mma_n);
- longjmp(t->abort, -3);
- }
-
- Copy(f, mma_f, n*t->ncomp);
- MLDisownRealList(stdlink, mma_f, mma_n);
-
- t->neval += n;
-}
-
-/*********************************************************************/
-
-#include "common.c"
-
static inline void DoIntegrate(This *t)
{
real integral[NCOMP], error[NCOMP], prob[NCOMP];
cint fail = Integrate(t, integral, error, prob);
if( fail < 0 ) {
switch( fail ) {
case -99:
MLPutFunction(stdlink, "Abort", 0);
return;
case -1:
Status("baddim", t->ndim);
break;
case -2:
Status("badcomp", t->ncomp);
break;
}
MLPutSymbol(stdlink, "$Failed");
}
else {
Status(fail ? "accuracy" : "success", t->neval);
MLPutFunction(stdlink, "Thread", 1);
MLPutFunction(stdlink, "List", 3);
- MLPutRealList(stdlink, integral, t->ncomp);
- MLPutRealList(stdlink, error, t->ncomp);
- MLPutRealList(stdlink, prob, t->ncomp);
+ MLPutRealxList(stdlink, integral, t->ncomp);
+ MLPutRealxList(stdlink, error, t->ncomp);
+ MLPutRealxList(stdlink, prob, t->ncomp);
}
}
/*********************************************************************/
void Vegas(cint ndim, cint ncomp,
creal epsrel, creal epsabs,
cint flags, cint seed,
cnumber mineval, cnumber maxeval,
cnumber nstart, cnumber nincrease, cint nbatch,
cint gridno, cchar *statefile)
{
This t;
t.ndim = ndim;
t.ncomp = ncomp;
t.epsrel = epsrel;
t.epsabs = epsabs;
t.flags = flags;
t.seed = seed;
t.mineval = mineval;
t.maxeval = maxeval;
t.nstart = nstart;
t.nincrease = nincrease;
t.nbatch = nbatch;
t.gridno = gridno;
t.statefile = statefile;
- t.neval = 0;
DoIntegrate(&t);
MLEndPacket(stdlink);
}
/*********************************************************************/
int main(int argc, char **argv)
{
return MLMain(argc, argv);
}
Index: trunk/cuba/src/vegas/Grid.c
===================================================================
--- trunk/cuba/src/vegas/Grid.c (revision 158)
+++ trunk/cuba/src/vegas/Grid.c (revision 159)
@@ -1,99 +1,99 @@
/*
Grid.c
utility functions for the Vegas grid
this file is part of Vegas
- last modified 28 May 10 th
+ last modified 12 Mar 15 th
*/
static inline void GetGrid(cThis *t, Grid *grid)
{
count bin, dim;
unsigned const int slot = abs(t->gridno) - 1;
if( t->gridno < 0 && slot < MAXGRIDS ) griddim_[slot] = 0;
if( slot < MAXGRIDS && gridptr_[slot] ) {
if( griddim_[slot] == t->ndim ) {
- VecCopy(grid, gridptr_[slot]);
+ XCopy(grid, gridptr_[slot]);
return;
}
free(gridptr_[slot]);
gridptr_[slot] = NULL;
}
for( bin = 0; bin < NBINS; ++bin )
grid[0][bin] = (bin + 1)/(real)NBINS;
for( dim = 1; dim < t->ndim; ++dim )
Copy(&grid[dim], &grid[0], 1);
}
/*********************************************************************/
static inline void PutGrid(cThis *t, Grid *grid)
{
unsigned const int slot = abs(t->gridno) - 1;
if( slot < MAXGRIDS ) {
if( gridptr_[slot] == NULL ) Alloc(gridptr_[slot], t->ndim);
griddim_[slot] = t->ndim;
- VecCopy(gridptr_[slot], grid);
+ XCopy(gridptr_[slot], grid);
}
}
/*********************************************************************/
static void RefineGrid(cThis *t, Grid grid, Grid margsum)
{
real avgperbin, thisbin, newcur, delta;
Grid imp, newgrid;
int bin, newbin;
/* smooth the f^2 value stored for each bin */
real prev = margsum[0];
real cur = margsum[1];
real norm = margsum[0] = .5*(prev + cur);
for( bin = 1; bin < NBINS - 1; ++bin ) {
creal s = prev + cur;
prev = cur;
cur = margsum[bin + 1];
norm += margsum[bin] = (s + cur)/3.;
}
norm += margsum[NBINS - 1] = .5*(prev + cur);
if( norm == 0 ) return;
norm = 1/norm;
/* compute the importance function for each bin */
avgperbin = 0;
for( bin = 0; bin < NBINS; ++bin ) {
real impfun = 0;
if( margsum[bin] > 0 ) {
creal r = margsum[bin]*norm;
- avgperbin += impfun = pow((r - 1)/log(r), 1.5);
+ avgperbin += impfun = powx((r - 1)/log(r), 1.5);
}
imp[bin] = impfun;
}
avgperbin /= NBINS;
/* redefine the size of each bin */
cur = newcur = 0;
thisbin = 0;
bin = -1;
for( newbin = 0; newbin < NBINS - 1; ++newbin ) {
while( thisbin < avgperbin ) {
thisbin += imp[++bin];
prev = cur;
cur = grid[bin];
}
thisbin -= avgperbin;
delta = (cur - prev)*thisbin;
newgrid[newbin] = SHARPEDGES ?
cur - delta/imp[bin] :
(newcur = Max(newcur,
cur - 2*delta/(imp[bin] + imp[IDim(bin - 1)])));
}
Copy(grid, newgrid, NBINS - 1);
grid[NBINS - 1] = 1;
}
Index: trunk/cuba/src/vegas/Vegas.c
===================================================================
--- trunk/cuba/src/vegas/Vegas.c (revision 158)
+++ trunk/cuba/src/vegas/Vegas.c (revision 159)
@@ -1,108 +1,94 @@
/*
Vegas.c
- Vegas Monte-Carlo integration
+ Vegas Monte Carlo integration
by Thomas Hahn
- last modified 15 Feb 11 th
+ last modified 25 Nov 14 th
*/
-#include "decl.h"
-
-#define Print(s) puts(s); fflush(stdout)
-
-/*********************************************************************/
+#define VEGAS
+#define ROUTINE "Vegas"
-static inline void DoSample(This *t, number n,
- creal *w, creal *x, real *f, cint iter)
-{
- t->neval += n;
- while( n-- ) {
- if( t->integrand(&t->ndim, x, &t->ncomp, f, t->userdata,
- w++, &iter) == ABORT )
- longjmp(t->abort, -99);
- x += t->ndim;
- f += t->ncomp;
- }
-}
+#include "decl.h"
+#include "CSample.c"
/*********************************************************************/
-#include "common.c"
-
Extern void EXPORT(Vegas)(ccount ndim, ccount ncomp,
- Integrand integrand, void *userdata,
+ Integrand integrand, void *userdata, cnumber nvec,
creal epsrel, creal epsabs, cint flags, cint seed,
cnumber mineval, cnumber maxeval,
- cnumber nstart, cnumber nincrease, cnumber nbatch,
- cint gridno, cchar *statefile,
+ cnumber nstart, cnumber nincrease,
+ cnumber nbatch, cint gridno,
+ cchar *statefile, Spin **pspin,
number *pneval, int *pfail,
real *integral, real *error, real *prob)
{
This t;
+
+ VerboseInit();
+
t.ndim = ndim;
t.ncomp = ncomp;
t.integrand = integrand;
t.userdata = userdata;
+ t.nvec = nvec;
t.epsrel = epsrel;
t.epsabs = epsabs;
- t.flags = flags;
+ t.flags = MaxVerbose(flags);
t.seed = seed;
t.mineval = mineval;
t.maxeval = maxeval;
t.nstart = nstart;
t.nincrease = nincrease;
t.nbatch = nbatch;
t.gridno = gridno;
t.statefile = statefile;
- t.neval = 0;
+ FORK_ONLY(t.spin = Invalid(pspin) ? NULL : *pspin;)
*pfail = Integrate(&t, integral, error, prob);
*pneval = t.neval;
+
+ WaitCores(&t, pspin);
}
/*********************************************************************/
Extern void EXPORT(vegas)(ccount *pndim, ccount *pncomp,
- Integrand integrand, void *userdata,
+ Integrand integrand, void *userdata, cnumber *pnvec,
creal *pepsrel, creal *pepsabs, cint *pflags, cint *pseed,
cnumber *pmineval, cnumber *pmaxeval,
cnumber *pnstart, cnumber *pnincrease,
- cnumber *pnbatch, cint *pgridno, cchar *statefile,
+ cnumber *pnbatch, cint *pgridno,
+ cchar *statefile, Spin **pspin,
number *pneval, int *pfail,
- real *integral, real *error, real *prob, int statefilelen)
+ real *integral, real *error, real *prob, cint statefilelen)
{
- char *s = NULL;
This t;
+
+ VerboseInit();
+
t.ndim = *pndim;
t.ncomp = *pncomp;
t.integrand = integrand;
t.userdata = userdata;
+ t.nvec = *pnvec;
t.epsrel = *pepsrel;
t.epsabs = *pepsabs;
- t.flags = *pflags;
+ t.flags = MaxVerbose(*pflags);
t.seed = *pseed;
t.mineval = *pmineval;
t.maxeval = *pmaxeval;
t.nstart = *pnstart;
t.nincrease = *pnincrease;
t.nbatch = *pnbatch;
t.gridno = *pgridno;
- t.neval = 0;
-
- if( statefile ) {
- /* strip trailing spaces */
- while( statefilelen > 0 && statefile[statefilelen - 1] == ' ' )
- --statefilelen;
- if( statefilelen > 0 && (s = malloc(statefilelen + 1)) ) {
- memcpy(s, statefile, statefilelen);
- s[statefilelen] = 0;
- }
- }
- t.statefile = s;
+ CString(t.statefile, statefile, statefilelen);
+ FORK_ONLY(t.spin = Invalid(pspin) ? NULL : *pspin;)
*pfail = Integrate(&t, integral, error, prob);
*pneval = t.neval;
- free(s);
+ WaitCores(&t, pspin);
}
Index: trunk/cuba/src/vegas/common.c
===================================================================
--- trunk/cuba/src/vegas/common.c (revision 158)
+++ trunk/cuba/src/vegas/common.c (revision 159)
@@ -1,31 +1,25 @@
/*
common.c
Code common to Vegas.c and Vegas.tm
this file is part of Vegas
- last modified 6 Jun 10 th
+ last modified 29 Jul 13 th
*/
#include "Random.c"
#include "ChiSquare.c"
#include "Grid.c"
-#define SamplesAlloc(p) MemAlloc(p, \
- t->nbatch*((t->ndim + t->ncomp + 1)*sizeof(real) + \
- t->ndim*sizeof(bin_t)))
-
static inline bool BadDimension(cThis *t)
{
- if( t->ndim > NDIM ) return true;
+ if( t->ndim > MAXDIM ) return true;
return t->ndim < SOBOL_MINDIM ||
(t->seed == 0 && t->ndim > SOBOL_MAXDIM);
}
static inline bool BadComponent(cThis *t)
{
- if( t->ncomp > NCOMP ) return true;
+ if( t->ncomp > MAXCOMP ) return true;
return t->ncomp < 1;
}
-#include "Integrate.c"
-
Index: trunk/cuba/src/vegas/decl.h
===================================================================
--- trunk/cuba/src/vegas/decl.h (revision 158)
+++ trunk/cuba/src/vegas/decl.h (revision 159)
@@ -1,55 +1,63 @@
/*
decl.h
Type declarations
this file is part of Vegas
- last modified 13 Sep 10 th
+ last modified 21 Jul 14 th
*/
#include "stddecl.h"
#define MAXGRIDS 10
#define NBINS 128
typedef unsigned char bin_t;
/* Note: bin_t must be wide enough to hold the numbers 0..NBINS */
typedef const bin_t cbin_t;
typedef real Grid[NBINS];
typedef struct {
real sum, sqsum;
real weightsum, avgsum;
real chisum, chisqsum, guess;
real avg, err, chisq;
} Cumulants;
typedef const Cumulants cCumulants;
typedef int (*Integrand)(ccount *, creal *, ccount *, real *,
- void *, creal *, cint *);
+ void *, cnumber *, cint *, creal *, cint *);
typedef struct _this {
count ndim, ncomp;
#ifndef MLVERSION
Integrand integrand;
void *userdata;
+ number nvec;
+#ifdef HAVE_FORK
+ SHM_ONLY(int shmid;)
+ Spin *spin;
#endif
+#endif
+ real *frame;
real epsrel, epsabs;
int flags, seed;
number mineval, maxeval;
number nstart, nincrease, nbatch;
int gridno;
cchar *statefile;
number neval;
RNGState rng;
jmp_buf abort;
} This;
+#define nframe nbatch
+
typedef const This cThis;
static Grid *gridptr_[MAXGRIDS];
static count griddim_[MAXGRIDS];
Index: trunk/cuba/src/cuhre/Integrate.c
===================================================================
--- trunk/cuba/src/cuhre/Integrate.c (revision 158)
+++ trunk/cuba/src/cuhre/Integrate.c (revision 159)
@@ -1,233 +1,282 @@
/*
Integrate.c
integrate over the unit hypercube
this file is part of Cuhre
- last modified 15 Feb 11 th
+ checkpointing by B. Chokoufe
+ last modified 14 Mar 15 th
*/
#define POOLSIZE 1024
+typedef struct pool {
+ struct pool *next;
+#if REALSIZE > 8
+ void *dummy; /* for alignment */
+#endif
+ char region[];
+} Pool;
+
+typedef struct {
+ signature_t signature;
+ count nregions, ncur;
+ number neval;
+ Totals totals[];
+} State;
+
static int Integrate(This *t, real *integral, real *error, real *prob)
{
- TYPEDEFREGION;
- typedef struct pool {
- struct pool *next;
- Region region[POOLSIZE];
- } Pool;
-
- count dim, comp, ncur, ipool, npool;
- int fail;
- Totals totals[NCOMP];
+ StateDecl;
+ csize_t statesize = sizeof(State) + NCOMP*sizeof(Totals);
+ Sized(State, state, statesize);
+ csize_t regionsize = RegionSize;
+ csize_t poolsize = sizeof(Pool) + POOLSIZE*regionsize;
+ Vector(Result, result, NCOMP);
+ Vector(char, out, 128*NCOMP + 256);
+
+ Totals *tot, *Tot = state->totals + t->ncomp;
+ Result *res, *resL, *resR;
+ Bounds *b, *B;
Pool *cur = NULL, *pool;
Region *region;
+ count comp, ipool, npool;
+ int fail;
if( VERBOSE > 1 ) {
- char s[256];
- sprintf(s, "Cuhre input parameters:\n"
+ sprintf(out, "Cuhre input parameters:\n"
" ndim " COUNT "\n ncomp " COUNT "\n"
+ ML_NOT(" nvec " NUMBER "\n")
" epsrel " REAL "\n epsabs " REAL "\n"
" flags %d\n mineval " NUMBER "\n maxeval " NUMBER "\n"
- " key " COUNT,
+ " key " COUNT "\n"
+ " statefile \"%s\"",
t->ndim, t->ncomp,
- t->epsrel, t->epsabs,
+ ML_NOT(t->nvec,)
+ SHOW(t->epsrel), SHOW(t->epsabs),
t->flags, t->mineval, t->maxeval,
- t->key);
- Print(s);
+ t->key,
+ t->statefile);
+ Print(out);
}
if( BadComponent(t) ) return -2;
if( BadDimension(t) ) return -1;
- RuleAlloc(t);
t->epsabs = Max(t->epsabs, NOTZERO);
+
+ RuleAlloc(t);
t->mineval = IMax(t->mineval, t->rule.n + 1);
+ FrameAlloc(t, Master);
+ ForkCores(t);
if( (fail = setjmp(t->abort)) ) goto abort;
- Alloc(cur, 1);
- cur->next = NULL;
- ncur = 1;
-
- region = cur->region;
- region->div = 0;
- for( dim = 0; dim < t->ndim; ++dim ) {
- Bounds *b = &region->bounds[dim];
- b->lower = 0;
- b->upper = 1;
- }
-
- Sample(t, region);
-
- for( comp = 0; comp < t->ncomp; ++comp ) {
- Totals *tot = &totals[comp];
- Result *r = &region->result[comp];
- tot->avg = tot->lastavg = tot->guess = r->avg;
- tot->err = tot->lasterr = r->err;
- tot->weightsum = 1/Max(Sq(r->err), NOTZERO);
- tot->avgsum = tot->weightsum*r->avg;
- tot->chisq = tot->chisqsum = tot->chisum = 0;
+ StateSetup(t);
+
+ if( StateReadTest(t) ) {
+ StateReadOpen(t, fd) {
+ Pool *prev = NULL;
+ int size;
+ if( read(fd, state, statesize) != statesize ||
+ state->signature != StateSignature(t, 4) ) break;
+ t->neval = state->neval;
+ t->nregions = state->nregions;
+ do {
+ MemAlloc(cur, poolsize);
+ cur->next = prev;
+ prev = cur;
+ size = read(fd, cur, poolsize);
+ } while( size == poolsize );
+ if( size != state->ncur*regionsize ) break;
+ } StateReadClose(t, fd);
+ }
+
+ if( ini ) {
+ MemAlloc(cur, poolsize);
+ cur->next = NULL;
+ state->ncur = t->nregions = 1;
+
+ region = (Region *)cur->region;
+ region->div = 0;
+ for( B = (b = region->bounds) + t->ndim; b < B; ++b ) {
+ b->lower = 0;
+ b->upper = 1;
+ }
+
+ t->neval = 0;
+ Sample(t, region);
+
+ for( res = RegionResult(region), tot = state->totals;
+ tot < Tot; ++res, ++tot ) {
+ tot->avg = tot->lastavg = tot->guess = res->avg;
+ tot->err = tot->lasterr = res->err;
+ tot->weightsum = 1/Max(Sq(res->err), NOTZERO);
+ tot->avgsum = tot->weightsum*res->avg;
+ tot->chisq = tot->chisqsum = tot->chisum = 0;
+ }
}
- for( t->nregions = 1; ; ++t->nregions ) {
+ /* main iteration loop */
+ for( ; ; ) {
count maxcomp, bisectdim;
real maxratio, maxerr;
- Result result[NCOMP];
Region *regionL, *regionR;
Bounds *bL, *bR;
if( VERBOSE ) {
- char s[128 + 128*NCOMP], *p = s;
-
- p += sprintf(p, "\n"
+ char *oe = out + sprintf(out, "\n"
"Iteration " COUNT ": " NUMBER " integrand evaluations so far",
t->nregions, t->neval);
-
- for( comp = 0; comp < t->ncomp; ++comp ) {
- cTotals *tot = &totals[comp];
- p += sprintf(p, "\n[" COUNT "] "
+ for( tot = state->totals, comp = 0; tot < Tot; ++tot )
+ oe += sprintf(oe, "\n[" COUNT "] "
REAL " +- " REAL " \tchisq " REAL " (" COUNT " df)",
- comp + 1, tot->avg, tot->err, tot->chisq, t->nregions - 1);
- }
-
- Print(s);
+ ++comp, SHOW(tot->avg), SHOW(tot->err),
+ SHOW(tot->chisq), t->nregions - 1);
+ Print(out);
}
maxratio = -INFTY;
maxcomp = 0;
- for( comp = 0; comp < t->ncomp; ++comp ) {
- creal ratio = totals[comp].err/MaxErr(totals[comp].avg);
+ for( tot = state->totals, comp = 0; tot < Tot; ++tot, ++comp ) {
+ creal ratio = tot->err/MaxErr(tot->avg);
if( ratio > maxratio ) {
maxratio = ratio;
maxcomp = comp;
}
}
- if( maxratio <= 1 && t->neval >= t->mineval ) {
- fail = 0;
+ if( maxratio <= 1 && t->neval >= t->mineval ) break;
+
+ if( t->neval >= t->maxeval ) {
+ fail = 1;
break;
}
- if( t->neval >= t->maxeval ) break;
-
maxerr = -INFTY;
- regionL = cur->region;
- npool = ncur;
+ regionL = (Region *)cur->region;
+ npool = state->ncur;
for( pool = cur; pool; npool = POOLSIZE, pool = pool->next )
for( ipool = 0; ipool < npool; ++ipool ) {
- Region *region = &pool->region[ipool];
- creal err = region->result[maxcomp].err;
+ Region *region = RegionPtr(pool, ipool);
+ creal err = RegionResult(region)[maxcomp].err;
if( err > maxerr ) {
maxerr = err;
regionL = region;
}
}
- if( ncur == POOLSIZE ) {
+ if( state->ncur == POOLSIZE ) {
Pool *prev = cur;
- Alloc(cur, 1);
+ MemAlloc(cur, poolsize);
cur->next = prev;
- ncur = 0;
+ state->ncur = 0;
}
- regionR = &cur->region[ncur++];
+ regionR = RegionPtr(cur, state->ncur++);
regionR->div = ++regionL->div;
- ResCopy(result, regionL->result);
- VecCopy(regionR->bounds, regionL->bounds);
+ FCopy(result, RegionResult(regionL));
+ XCopy(regionR->bounds, regionL->bounds);
bisectdim = result[maxcomp].bisectdim;
bL = &regionL->bounds[bisectdim];
bR = &regionR->bounds[bisectdim];
bL->upper = bR->lower = .5*(bL->upper + bL->lower);
Sample(t, regionL);
Sample(t, regionR);
- for( comp = 0; comp < t->ncomp; ++comp ) {
- cResult *r = &result[comp];
- Result *rL = &regionL->result[comp];
- Result *rR = &regionR->result[comp];
- Totals *tot = &totals[comp];
+ for( res = result,
+ resL = RegionResult(regionL),
+ resR = RegionResult(regionR),
+ tot = state->totals;
+ tot < Tot; ++res, ++resL, ++resR, ++tot ) {
real diff, err, w, avg, sigsq;
- tot->lastavg += diff = rL->avg + rR->avg - r->avg;
+ tot->lastavg += diff = resL->avg + resR->avg - res->avg;
- diff = fabs(.25*diff);
- err = rL->err + rR->err;
+ diff = fabsx(.25*diff);
+ err = resL->err + resR->err;
if( err > 0 ) {
creal c = 1 + 2*diff/err;
- rL->err *= c;
- rR->err *= c;
+ resL->err *= c;
+ resR->err *= c;
}
- rL->err += diff;
- rR->err += diff;
- tot->lasterr += rL->err + rR->err - r->err;
+ resL->err += diff;
+ resR->err += diff;
+ tot->lasterr += resL->err + resR->err - res->err;
tot->weightsum += w = 1/Max(Sq(tot->lasterr), NOTZERO);
sigsq = 1/tot->weightsum;
tot->avgsum += w*tot->lastavg;
avg = sigsq*tot->avgsum;
tot->chisum += w *= tot->lastavg - tot->guess;
tot->chisqsum += w*tot->lastavg;
tot->chisq = tot->chisqsum - avg*tot->chisum;
if( LAST ) {
tot->avg = tot->lastavg;
tot->err = tot->lasterr;
}
else {
tot->avg = avg;
- tot->err = sqrt(sigsq);
+ tot->err = sqrtx(sigsq);
}
}
+ ++t->nregions;
+
+ if( StateWriteTest(t) ) {
+ StateWriteOpen(t, fd) {
+ Pool *prev = cur;
+ state->signature = StateSignature(t, 4);
+ state->nregions = t->nregions;
+ state->neval = t->neval;
+ StateWrite(fd, state, statesize);
+ while( (prev = prev->next) ) StateWrite(fd, prev, poolsize);
+ StateWrite(fd, cur, state->ncur*regionsize);
+ } StateWriteClose(t, fd);
+ }
}
- for( comp = 0; comp < t->ncomp; ++comp ) {
- cTotals *tot = &totals[comp];
+ for( tot = state->totals, comp = 0; tot < Tot; ++tot, ++comp ) {
integral[comp] = tot->avg;
error[comp] = tot->err;
prob[comp] = ChiSquare(tot->chisq, t->nregions - 1);
}
#ifdef MLVERSION
if( REGIONS ) {
MLPutFunction(stdlink, "List", 2);
MLPutFunction(stdlink, "List", t->nregions);
- npool = ncur;
+ npool = state->ncur;
for( pool = cur; pool; npool = POOLSIZE, pool = pool->next )
for( ipool = 0; ipool < npool; ++ipool ) {
- Region const *region = &pool->region[ipool];
- real lower[NDIM], upper[NDIM];
+ Region const *region = RegionPtr(pool, ipool);
+ Result *Res;
- for( dim = 0; dim < t->ndim; ++dim ) {
- cBounds *b = &region->bounds[dim];
- lower[dim] = b->lower;
- upper[dim] = b->upper;
- }
-
- MLPutFunction(stdlink, "Cuba`Cuhre`region", 3);
- MLPutRealList(stdlink, lower, t->ndim);
- MLPutRealList(stdlink, upper, t->ndim);
+ MLPutFunction(stdlink, "Cuba`Cuhre`region", 2);
+ MLPutRealxList(stdlink, (real *)region->bounds, 2*t->ndim);
MLPutFunction(stdlink, "List", t->ncomp);
- for( comp = 0; comp < t->ncomp; ++comp ) {
- cResult *r = &region->result[comp];
- real res[] = {r->avg, r->err};
- MLPutRealList(stdlink, res, Elements(res));
+ for( Res = (res = RegionResult(region)) + t->ncomp;
+ res < Res; ++res ) {
+ real r[] = {res->avg, res->err};
+ MLPutRealxList(stdlink, r, Elements(r));
}
}
}
#endif
abort:
while( (pool = cur) ) {
cur = cur->next;
free(pool);
}
-
+ FrameFree(t, Master);
RuleFree(t);
+ StateRemove(t);
+
return fail;
}
Index: trunk/cuba/src/cuhre/Cuhre.tm
===================================================================
--- trunk/cuba/src/cuhre/Cuhre.tm (revision 158)
+++ trunk/cuba/src/cuhre/Cuhre.tm (revision 159)
@@ -1,258 +1,218 @@
:Evaluate: BeginPackage["Cuba`"]
:Evaluate: Cuhre::usage =
"Cuhre[f, {x, xmin, xmax}..] computes a numerical approximation to the integral of the real scalar or vector function f.
The output is a list with entries of the form {integral, error, chi-square probability} for each component of the integrand."
+:Evaluate: MinPoints::usage = "MinPoints is an option of Cuhre.
+ It specifies the minimum number of points to sample."
+
:Evaluate: Key::usage = "Key is an option of Cuhre.
It specifies the basic integration rule:\n
7 = use a degree-7 rule,\n
9 = use a degree-9 rule,\n
11 = use a degree-11 rule (available only in 3 dimensions),\n
13 = use a degree-13 rule (available only in 2 dimensions),\n
otherwise the default rule is used: the degree-13 rule in 2 dimensions, the degree-11 rule in 3 dimensions, else the degree-9 rule."
-:Evaluate: MinPoints::usage = "MinPoints is an option of Cuhre.
- It specifies the minimum number of points to sample."
+:Evaluate: StateFile::usage = "StateFile is an option of Cuhre.
+ It specifies a file in which the internal state is stored after each iteration and from which it can be restored on a subsequent run.
+ The state file is removed once the prescribed accuracy has been reached."
:Evaluate: Final::usage = "Final is an option of Cuhre.
It can take the values Last or All which determine whether only the last (largest) or all sets of samples collected on a subregion over the iterations contribute to the final result."
+:Evaluate: RetainStateFile::usage = "RetainStateFile is an option of Cuhre.
+ It determines whether a chosen state file is kept even if the integration terminates normally."
+
:Evaluate: Regions::usage = "Regions is an option of Cuhre.
It specifies whether the regions into which the integration region has been cut are returned together with the integration results."
:Evaluate: Region::usage = "Region[ll, ur, res] describes a subregion:
ll and ur are multidimensional equivalents of the region's lower left and upper right corner.
res gives the integration results for the region in a list with entries of the form {integral, error} for each component of the integrand."
:Evaluate: MapSample::usage = "MapSample is a function used to map the integrand over the points to be sampled."
:Evaluate: Begin["`Cuhre`"]
:Begin:
:Function: Cuhre
:Pattern: MLCuhre[ndim_, ncomp_,
epsrel_, epsabs_, flags_, mineval_, maxeval_,
- key_]
+ key_, statefile_]
:Arguments: {ndim, ncomp,
epsrel, epsabs, flags, mineval, maxeval,
- key}
+ key, statefile}
:ArgumentTypes: {Integer, Integer,
- Real, Real, Integer, Integer, Integer,
- Integer}
+ Real64, Real64, Integer, Integer, Integer,
+ Integer, String}
:ReturnType: Manual
:End:
:Evaluate: Attributes[Cuhre] = {HoldFirst}
:Evaluate: Options[Cuhre] = {PrecisionGoal -> 3, AccuracyGoal -> 12,
- MinPoints -> 0, MaxPoints -> 50000, Key -> 0,
- Verbose -> 1, Final -> Last, Regions -> False, Compiled -> True}
+ MinPoints -> 0, MaxPoints -> 50000, Key -> 0, StateFile -> "",
+ Verbose -> 1, Final -> Last, RetainStateFile -> False,
+ Regions -> False, Compiled -> True}
:Evaluate: Cuhre[f_, v:{_, _, _}.., opt___Rule] :=
Block[ {ff = HoldForm[f], ndim = Length[{v}], ncomp,
tags, vars, lower, range, jac, tmp, defs, intT,
- rel, abs, mineval, maxeval, key, verbose, final, regions, compiled},
+ rel, abs, mineval, maxeval, key, state, verbose, final,
+ retain, regions, compiled},
Message[Cuhre::optx, #, Cuhre]&/@
Complement[First/@ {opt}, tags = First/@ Options[Cuhre]];
- {rel, abs, mineval, maxeval, key,
- verbose, final, regions, compiled} =
+ {rel, abs, mineval, maxeval, key, state,
+ verbose, final, retain, regions, compiled} =
tags /. {opt} /. Options[Cuhre];
{vars, lower, range} = Transpose[{v}];
jac = Simplify[Times@@ (range -= lower)];
tmp = Array[tmpvar, ndim];
defs = Simplify[lower + range tmp];
Block[{Set}, define[compiled, tmp, Thread[vars = defs], jac]];
intT = integrandT[f];
Block[#,
ncomp = Length[intT@@ RandomReal[1, ndim]];
MLCuhre[ndim, ncomp, 10.^-rel, 10.^-abs,
Min[Max[verbose, 0], 3] +
If[final === Last, 4, 0] +
+ If[TrueQ[retain], 16, 0] +
If[TrueQ[regions], 128, 0],
- mineval, maxeval, key]
+ mineval, maxeval, key, state]
]& @ vars
]
:Evaluate: tmpvar[n_] := ToExpression["Cuba`Cuhre`t" <> ToString[n]]
:Evaluate: Attributes[foo] = {HoldAll}
:Evaluate: define[True, tmp_, defs_, jac_] := (
TtoX := TtoX = Compile[tmp, defs];
- integrandT[f_] := Compile[tmp, eval[defs, Chop[f jac]//N],
+ integrandT[f_] := Compile[tmp, eval[defs, N[f jac]],
{{_eval, _Real, 1}}] )
:Evaluate: define[_, tmp_, defs_, jac_] := (
TtoX := TtoX = Function[tmp, defs];
- integrandT[f_] := Function[tmp, eval[defs, Chop[f jac]//N]] )
+ integrandT[f_] := Function[tmp, eval[defs, N[f jac]]] )
:Evaluate: eval[_, f_Real] = {f}
:Evaluate: eval[_, f:{__Real}] = f
:Evaluate: eval[x_, _] := (Message[Cuhre::badsample, ff, x]; {})
:Evaluate: sample[x_] :=
Check[Flatten @ MapSample[intT@@ # &, Partition[x, ndim]], {}]
-:Evaluate: MapSample = Map
+:Evaluate: ValueQ[MapSample] || (MapSample = Map)
-:Evaluate: region[ll_, ur_, r___] := Region[TtoX@@ ll, TtoX@@ ur, r]
+:Evaluate: region[bounds_, r___] := Region[##, r]&@@
+ MapThread[TtoX, Partition[bounds, 2]]
:Evaluate: Cuhre::badsample = "`` is not a real-valued function at ``."
:Evaluate: Cuhre::baddim = "Cannot integrate in `` dimensions."
:Evaluate: Cuhre::badcomp = "Cannot integrate `` components."
:Evaluate: Cuhre::accuracy =
"Desired accuracy was not reached within `` function evaluations on `` subregions."
:Evaluate: Cuhre::success = "Needed `` function evaluations on `` subregions."
:Evaluate: End[]
:Evaluate: EndPackage[]
/*
Cuhre.tm
Adaptive integration using cubature rules
by Thomas Hahn
- last modified 20 Jun 11 th
+ last modified 13 Mar 15 th
*/
+#define CUHRE
+#define ROUTINE "Cuhre"
+
#include "mathlink.h"
#include "decl.h"
+#include "MSample.c"
/*********************************************************************/
static void Status(MLCONST char *msg, cint n1, cint n2)
{
MLPutFunction(stdlink, "CompoundExpression", 2);
MLPutFunction(stdlink, "Message", 3);
MLPutFunction(stdlink, "MessageName", 2);
MLPutSymbol(stdlink, "Cuhre");
MLPutString(stdlink, msg);
MLPutInteger(stdlink, n1);
MLPutInteger(stdlink, n2);
}
/*********************************************************************/
-static void Print(MLCONST char *s)
-{
- int pkt;
-
- MLPutFunction(stdlink, "EvaluatePacket", 1);
- MLPutFunction(stdlink, "Print", 1);
- MLPutString(stdlink, s);
- MLEndPacket(stdlink);
-
- do {
- pkt = MLNextPacket(stdlink);
- MLNewPacket(stdlink);
- } while( pkt != RETURNPKT );
-}
-
-/*********************************************************************/
-
-static void DoSample(This *t, cnumber n, real *x, real *f)
-{
- int pkt;
- real *mma_f;
- long mma_n;
-
- if( MLAbort ) longjmp(t->abort, -99);
-
- MLPutFunction(stdlink, "EvaluatePacket", 1);
- MLPutFunction(stdlink, "Cuba`Cuhre`sample", 1);
- MLPutRealList(stdlink, x, n*t->ndim);
- MLEndPacket(stdlink);
-
- while( (pkt = MLNextPacket(stdlink)) && (pkt != RETURNPKT) )
- MLNewPacket(stdlink);
-
- if( !MLGetRealList(stdlink, &mma_f, &mma_n) ) {
- MLClearError(stdlink);
- MLNewPacket(stdlink);
- longjmp(t->abort, -99);
- }
-
- if( mma_n != n*t->ncomp ) {
- MLDisownRealList(stdlink, mma_f, mma_n);
- longjmp(t->abort, -3);
- }
-
- Copy(f, mma_f, n*t->ncomp);
- MLDisownRealList(stdlink, mma_f, mma_n);
-
- t->neval += n;
-}
-
-/*********************************************************************/
-
-#include "common.c"
-
static inline void DoIntegrate(This *t)
{
real integral[NCOMP], error[NCOMP], prob[NCOMP];
cint fail = Integrate(t, integral, error, prob);
if( fail < 0 ) {
switch( fail ) {
case -99:
MLPutFunction(stdlink, "Abort", 0);
return;
case -1:
Status("baddim", t->ndim, 0);
break;
case -2:
Status("badcomp", t->ncomp, 0);
break;
}
MLPutSymbol(stdlink, "$Failed");
}
else {
Status(fail ? "accuracy" : "success", t->neval, t->nregions);
MLPutFunction(stdlink, "Thread", 1);
MLPutFunction(stdlink, "List", 3);
- MLPutRealList(stdlink, integral, t->ncomp);
- MLPutRealList(stdlink, error, t->ncomp);
- MLPutRealList(stdlink, prob, t->ncomp);
+ MLPutRealxList(stdlink, integral, t->ncomp);
+ MLPutRealxList(stdlink, error, t->ncomp);
+ MLPutRealxList(stdlink, prob, t->ncomp);
}
}
/*********************************************************************/
void Cuhre(cint ndim, cint ncomp,
creal epsrel, creal epsabs,
cint flags, cnumber mineval, cnumber maxeval,
- cint key)
+ cint key, cchar *statefile)
{
This t;
t.ndim = ndim;
t.ncomp = ncomp;
t.epsrel = epsrel;
t.epsabs = epsabs;
t.flags = flags;
t.mineval = mineval;
t.maxeval = maxeval;
t.key = key;
- t.nregions = 0;
- t.neval = 0;
+ t.statefile = statefile;
DoIntegrate(&t);
MLEndPacket(stdlink);
}
/*********************************************************************/
int main(int argc, char **argv)
{
return MLMain(argc, argv);
}
Index: trunk/cuba/src/cuhre/Cuhre.c
===================================================================
--- trunk/cuba/src/cuhre/Cuhre.c (revision 158)
+++ trunk/cuba/src/cuhre/Cuhre.c (revision 159)
@@ -1,85 +1,84 @@
/*
Cuhre.c
Adaptive integration using cubature rules
by Thomas Hahn
- last modified 15 Feb 11 th
+ last modified 22 Jul 14 th
*/
-#include "decl.h"
-
-#define Print(s) puts(s); fflush(stdout)
+#define CUHRE
+#define ROUTINE "Cuhre"
-/*********************************************************************/
-
-static inline void DoSample(This *t, count n, creal *x, real *f)
-{
- t->neval += n;
- while( n-- ) {
- if( t->integrand(&t->ndim, x, &t->ncomp, f, t->userdata) == ABORT )
- longjmp(t->abort, -99);
- x += t->ndim;
- f += t->ncomp;
- }
-}
+#include "decl.h"
+#include "CSample.c"
/*********************************************************************/
-#include "common.c"
-
Extern void EXPORT(Cuhre)(ccount ndim, ccount ncomp,
- Integrand integrand, void *userdata,
+ Integrand integrand, void *userdata, cnumber nvec,
creal epsrel, creal epsabs,
cint flags, cnumber mineval, cnumber maxeval,
- ccount key,
+ ccount key, cchar *statefile, Spin **pspin,
count *pnregions, number *pneval, int *pfail,
real *integral, real *error, real *prob)
{
This t;
+
+ VerboseInit();
+
t.ndim = ndim;
t.ncomp = ncomp;
t.integrand = integrand;
t.userdata = userdata;
+ t.nvec = nvec;
t.epsrel = epsrel;
t.epsabs = epsabs;
- t.flags = flags;
+ t.flags = MaxVerbose(flags);
t.mineval = mineval;
t.maxeval = maxeval;
t.key = key;
- t.nregions = 0;
- t.neval = 0;
+ t.statefile = statefile;
+ FORK_ONLY(t.spin = Invalid(pspin) ? NULL : *pspin;)
*pfail = Integrate(&t, integral, error, prob);
*pnregions = t.nregions;
*pneval = t.neval;
+
+ WaitCores(&t, pspin);
}
/*********************************************************************/
Extern void EXPORT(cuhre)(ccount *pndim, ccount *pncomp,
- Integrand integrand, void *userdata,
+ Integrand integrand, void *userdata, cnumber *pnvec,
creal *pepsrel, creal *pepsabs,
cint *pflags, cnumber *pmineval, cnumber *pmaxeval,
- ccount *pkey,
+ ccount *pkey, cchar *statefile, Spin **pspin,
count *pnregions, number *pneval, int *pfail,
- real *integral, real *error, real *prob)
+ real *integral, real *error, real *prob, cint statefilelen)
{
This t;
+
+ VerboseInit();
+
t.ndim = *pndim;
t.ncomp = *pncomp;
t.integrand = integrand;
t.userdata = userdata;
+ t.nvec = *pnvec;
t.epsrel = *pepsrel;
t.epsabs = *pepsabs;
- t.flags = *pflags;
+ t.flags = MaxVerbose(*pflags);
t.mineval = *pmineval;
t.maxeval = *pmaxeval;
t.key = *pkey;
- t.nregions = 0;
- t.neval = 0;
-
+ CString(t.statefile, statefile, statefilelen);
+ FORK_ONLY(t.spin = Invalid(pspin) ? NULL : *pspin;)
+
*pfail = Integrate(&t, integral, error, prob);
*pnregions = t.nregions;
*pneval = t.neval;
+
+ WaitCores(&t, pspin);
}
Index: trunk/cuba/src/cuhre/Rule.c
===================================================================
--- trunk/cuba/src/cuhre/Rule.c (revision 158)
+++ trunk/cuba/src/cuhre/Rule.c (revision 159)
@@ -1,743 +1,757 @@
/*
Rule.c
integration with cubature rules
code lifted with minor modifications from DCUHRE
by J. Berntsen, T. Espelid, and A. Genz
- this file is part of Divonne
- last modified 8 Jun 10 th
+ this file is part of Cuhre
+ last modified 7 May 15 th
*/
-enum { nrules = 5 };
+#define NextSet(p) p = (Set *)((char *)p + setsize)
+#define IndexSet(p, n) ((Set *)((char *)p + n*setsize))
-#define TYPEDEFSET \
- typedef struct { \
- count n; \
- real weight[nrules], scale[nrules], norm[nrules]; \
- real gen[1000]; \
- } Set
-//#TT used to be real gen[NDIM];
/*********************************************************************/
static void Rule13Alloc(This *t)
{
static creal w[][nrules] = {
{ .00844923090033615, .3213775489050763, .3372900883288987,
-.8264123822525677, .6539094339575232 },
{ .023771474018994404, -.1767341636743844, -.1644903060344491,
.306583861409436, -.2041614154424632},
{ .02940016170142405, .07347600537466073, .07707849911634623,
.002389292538329435, -.174698151579499 },
{ .006644436465817374, -.03638022004364754, -.03804478358506311,
-.1343024157997222, .03937939671417803 },
{ .0042536044255016, .021252979220987123, .02223559940380806,
.08833366840533902, .006974520545933992 },
{ 0, .1460984204026913, .1480693879765931,
0, 0 },
{ .0040664827465935255, .017476132861520992, 4.467143702185815e-6,
.0009786283074168292, .0066677021717782585 },
{ .03362231646315497, .1444954045641582, .150894476707413,
-.1319227889147519, .05512960621544304 },
{ .033200804136503725, .0001307687976001325, 3.6472001075162155e-5,
.00799001220015063, .05443846381278608 },
{ .014093686924979677, .0005380992313941161, .000577719899901388,
.0033917470797606257, .02310903863953934 },
{ .000977069770327625, .0001042259576889814, .0001041757313688177,
.0022949157182832643, .01506937747477189 },
{ .007531996943580376, -.001401152865045733, -.001452822267047819,
-.01358584986119197, -.060570216489018905 },
{ .02577183086722915, .008041788181514763, .008338339968783704,
.04025866859057809, .04225737654686337},
{ .015625, -.1420416552759383, -.147279632923196,
.003760268580063992, .02561989142123099 }
};
static creal g[] = {
.12585646717265545, .3506966822267133,
.4795480315809981, .4978005239276064,
.25, .07972723291487795,
.1904495567970094, .3291384627633596,
.43807365825146577, .499121592026599,
.4895111329084231, .32461421628226944,
.43637106005656195, .1791307322940614,
.2833333333333333, .1038888888888889 };
enum { nsets = 14, ndim = 2 };
- TYPEDEFSET;
-
count n, r;
Set *first, *last, *s, *x;
+ csize_t setsize = SetSize;
- Alloc(first, nsets);
- Clear(first, nsets);
+ Die(first = calloc(nsets, setsize));
last = first;
n = last->n = 1;
Copy(last->weight, w[0], nrules);
- ++last;
+ NextSet(last);
n += last->n = 2*ndim;
Copy(last->weight, w[1], nrules);
last->gen[0] = g[0];
- ++last;
+ NextSet(last);
n += last->n = 2*ndim;
Copy(last->weight, w[2], nrules);
last->gen[0] = g[1];
- ++last;
+ NextSet(last);
n += last->n = 2*ndim;
Copy(last->weight, w[3], nrules);
last->gen[0] = g[2];
- ++last;
+ NextSet(last);
n += last->n = 2*ndim;
Copy(last->weight, w[4], nrules);
last->gen[0] = g[3];
- ++last;
+ NextSet(last);
n += last->n = 2*ndim;
Copy(last->weight, w[5], nrules);
last->gen[0] = g[4];
- ++last;
+ NextSet(last);
n += last->n = 2*ndim*(ndim - 1);
Copy(last->weight, w[6], nrules);
last->gen[0] = g[5];
last->gen[1] = g[5];
- ++last;
+ NextSet(last);
n += last->n = 2*ndim*(ndim - 1);
Copy(last->weight, w[7], nrules);
last->gen[0] = g[6];
last->gen[1] = g[6];
- ++last;
+ NextSet(last);
n += last->n = 2*ndim*(ndim - 1);
Copy(last->weight, w[8], nrules);
last->gen[0] = g[7];
last->gen[1] = g[7];
- ++last;
+ NextSet(last);
n += last->n = 2*ndim*(ndim - 1);
Copy(last->weight, w[9], nrules);
last->gen[0] = g[8];
last->gen[1] = g[8];
- ++last;
+ NextSet(last);
n += last->n = 2*ndim*(ndim - 1);
Copy(last->weight, w[10], nrules);
last->gen[0] = g[9];
last->gen[1] = g[9];
- ++last;
+ NextSet(last);
n += last->n = 4*ndim*(ndim - 1);
Copy(last->weight, w[11], nrules);
last->gen[0] = g[10];
last->gen[1] = g[11];
- ++last;
+ NextSet(last);
n += last->n = 4*ndim*(ndim - 1);
Copy(last->weight, w[12], nrules);
last->gen[0] = g[12];
last->gen[1] = g[13];
- ++last;
+ NextSet(last);
n += last->n = 4*ndim*(ndim - 1);
Copy(last->weight, w[13], nrules);
last->gen[0] = g[14];
last->gen[1] = g[15];
t->rule.first = first;
t->rule.last = last;
t->rule.errcoeff[0] = 10;
t->rule.errcoeff[1] = 1;
t->rule.errcoeff[2] = 5;
t->rule.n = n;
- for( s = first; s <= last; ++s )
+ for( s = first; s <= last; NextSet(s) )
for( r = 1; r < nrules - 1; ++r ) {
creal scale = (s->weight[r] == 0) ? 100 :
-s->weight[r + 1]/s->weight[r];
real sum = 0;
- for( x = first; x <= last; ++x )
- sum += x->n*fabs(x->weight[r + 1] + scale*x->weight[r]);
+ for( x = first; x <= last; NextSet(x) )
+ sum += x->n*fabsx(x->weight[r + 1] + scale*x->weight[r]);
s->scale[r] = scale;
s->norm[r] = 1/sum;
}
}
/*********************************************************************/
static void Rule11Alloc(This *t)
{
static creal w[][nrules] = {
{ .0009903847688882167, 1.715006248224684, 1.936014978949526,
.517082819560576, 2.05440450381852 },
{ .0084964717409851, -.3755893815889209, -.3673449403754268,
.01445269144914044, .013777599884901202 },
{ .00013587331735072814, .1488632145140549, .02929778657898176,
-.3601489663995932, -.576806291790441 },
{ .022982920777660364, -.2497046640620823, -.1151883520260315,
.3628307003418485, .03726835047700328 },
{ .004202649722286289, .1792501419135204, .05086658220872218,
.007148802650872729, .0068148789397772195 },
{ .0012671889041675774, .0034461267589738897, .04453911087786469,
-.09222852896022966, .057231697338518496 },
{ .0002109560854981544, -.005140483185555825, -.022878282571259,
.01719339732471725, -.044930187438112855 },
{ .016830857056410086, .006536017839876424, .02908926216345833,
-.102141653746035, .027292365738663484 },
{ .00021876823557504823, -.00065134549392297, -.002898884350669207,
-.007504397861080493, .000354747395055699 },
{ .009690420479796819, -.006304672433547204, -.028059634133074954,
.01648362537726711, .01571366799739551 },
{ .030773311284628138, .01266959399788263, .05638741361145884,
.05234610158469334, .049900992192785674 },
{ .0084974310856038, -.005454241018647931, -.02427469611942451,
.014454323316130661, .0137791555266677 },
{ .0017749535291258914, .004826995274768427, .021483070341828822,
.003019236275367777, .0028782064230998723 }
};
static creal g[] = {
.095, .25,
.375, .4,
.4975, .49936724991757,
.38968518428362114, .49998494965443835,
.3951318612385894, .22016983438253684,
.4774686911397297, .2189239229503431,
.4830546566815374, .2288552938881567 };
enum { nsets = 13, ndim = 3 };
- TYPEDEFSET;
-
count n, r;
Set *first, *last, *s, *x;
+ csize_t setsize = SetSize;
- Alloc(first, nsets);
- Clear(first, nsets);
+ Die(first = calloc(nsets, setsize));
last = first;
n = last->n = 1;
Copy(last->weight, w[0], nrules);
- ++last;
+ NextSet(last);
n += last->n = 2*ndim;
Copy(last->weight, w[1], nrules);
last->gen[0] = g[0];
- ++last;
+ NextSet(last);
n += last->n = 2*ndim;
Copy(last->weight, w[2], nrules);
last->gen[0] = g[1];
- ++last;
+ NextSet(last);
n += last->n = 2*ndim;
Copy(last->weight, w[3], nrules);
last->gen[0] = g[2];
- ++last;
+ NextSet(last);
n += last->n = 2*ndim;
Copy(last->weight, w[4], nrules);
last->gen[0] = g[3];
- ++last;
+ NextSet(last);
n += last->n = 2*ndim;
Copy(last->weight, w[5], nrules);
last->gen[0] = g[4];
- ++last;
+ NextSet(last);
n += last->n = 2*ndim*(ndim - 1);
Copy(last->weight, w[6], nrules);
last->gen[0] = g[5];
last->gen[1] = g[5];
- ++last;
+ NextSet(last);
n += last->n = 2*ndim*(ndim - 1);
Copy(last->weight, w[7], nrules);
last->gen[0] = g[6];
last->gen[1] = g[6];
- ++last;
+ NextSet(last);
n += last->n = 4*ndim*(ndim - 1)*(ndim - 2)/3;
Copy(last->weight, w[8], nrules);
last->gen[0] = g[7];
last->gen[1] = g[7];
last->gen[2] = g[7];
- ++last;
+ NextSet(last);
n += last->n = 4*ndim*(ndim - 1)*(ndim - 2)/3;
Copy(last->weight, w[9], nrules);
last->gen[0] = g[8];
last->gen[1] = g[8];
last->gen[2] = g[8];
- ++last;
+ NextSet(last);
n += last->n = 4*ndim*(ndim - 1)*(ndim - 2)/3;
Copy(last->weight, w[10], nrules);
last->gen[0] = g[9];
last->gen[1] = g[9];
last->gen[2] = g[9];
- ++last;
+ NextSet(last);
n += last->n = 4*ndim*(ndim - 1)*(ndim - 2);
Copy(last->weight, w[11], nrules);
last->gen[0] = g[10];
last->gen[1] = g[11];
last->gen[2] = g[11];
- ++last;
+ NextSet(last);
n += last->n = 4*ndim*(ndim - 1)*(ndim - 2);
Copy(last->weight, w[12], nrules);
last->gen[0] = g[12];
last->gen[1] = g[12];
last->gen[2] = g[13];
t->rule.first = first;
t->rule.last = last;
t->rule.errcoeff[0] = 4;
t->rule.errcoeff[1] = .5;
t->rule.errcoeff[2] = 3;
t->rule.n = n;
- for( s = first; s <= last; ++s )
+ for( s = first; s <= last; NextSet(s) )
for( r = 1; r < nrules - 1; ++r ) {
creal scale = (s->weight[r] == 0) ? 100 :
-s->weight[r + 1]/s->weight[r];
real sum = 0;
- for( x = first; x <= last; ++x )
- sum += x->n*fabs(x->weight[r + 1] + scale*x->weight[r]);
+ for( x = first; x <= last; NextSet(x) )
+ sum += x->n*fabsx(x->weight[r + 1] + scale*x->weight[r]);
s->scale[r] = scale;
s->norm[r] = 1/sum;
}
}
/*********************************************************************/
static void Rule9Alloc(This *t)
{
static creal w[] = {
- -.0023611709677855117884, .11415390023857325268,
- -.63833920076702389094, .74849988504685208004,
- -.0014324017033399125142, .057471507864489725949,
- -.14225104571434243234, -.062875028738286979989,
- .254591133248959089, -1.207328566678236261,
- .89567365764160676508, -.36479356986049146661,
- .0035417564516782676826, -.072609367395893679605,
- .10557491625218991012, .0021486025550098687713,
- -.032268563892953949998, .010636783990231217481,
- .014689102496143490175, .51134708346467591431,
- .45976448120806344646, .18239678493024573331,
- -.04508628929435784076, .21415883524352793401,
- -.027351546526545644722, .054941067048711234101,
- .11937596202570775297, .65089519391920250593,
- .14744939829434460168, .057693384490973483573,
- .034999626602143583822, -1.3868627719278281436,
- -.2386668732575008879, .015532417276607053264,
- .0035328099607090870236, .09231719987444221619,
- .02254314464717892038, .013675773263272822361,
- -.32544759695960125297, .0017708782258391338413,
- .0010743012775049343856, .25150011495314791996 };
+ RC(-.002361170967785511788400941242259231309691),
+ RC(.1141539002385732526821323741697655347686),
+ RC(-.6383392007670238909386026193674701393074),
+ RC(.7484998850468520800423030047583803945205),
+ RC(-.001432401703339912514196154599769007103671),
+ RC(.05747150786448972594860897296200006759892),
+ RC(-.1422510457143424323449521620935950679394),
+ RC(-.06287502873828697998942424881040490136987),
+ RC(.2545911332489590890011611142429070613156),
+ RC(-1.207328566678236261002219995185143356737),
+ RC(.8956736576416067650809467826488567200939),
+ RC(-.3647935698604914666100134551377381205297),
+ RC(.003541756451678267682601411863388846964536),
+ RC(-.07260936739589367960492815865074633743652),
+ RC(.1055749162521899101218622863269817454540),
+ RC(.002148602555009868771294231899653510655506),
+ RC(-.03226856389295394999786630399875134318006),
+ RC(.01063678399023121748083624225818915724455),
+ RC(.01468910249614349017540783437728097691502),
+ RC(.5113470834646759143109387357149329909126),
+ RC(.4597644812080634464633352781605214342691),
+ RC(.1823967849302457333050067275688690602649),
+ RC(-.04508628929435784075980562738240804429658),
+ RC(.2141588352435279340097929526588394300172),
+ RC(-.02735154652654564472203690086290223507436),
+ RC(.05494106704871123410060080562462135546101),
+ RC(.1193759620257077529708962121565290178730),
+ RC(.6508951939192025059314756320878023215278),
+ RC(.1474493982943446016775696826942585013243),
+ RC(.05769338449097348357291272840392627722165),
+ RC(.03499962660214358382244159694487155861542),
+ RC(-1.386862771927828143599782668709014266770),
+ RC(-.2386668732575008878964134721962088068396),
+ RC(.01553241727660705326386197156586357005224),
+ RC(.003532809960709087023561817517751309380604),
+ RC(.09231719987444221619017126187763868745587),
+ RC(.02254314464717892037990281369120402214829),
+ RC(.01367577326327282236101845043145111753718),
+ RC(-.3254475969596012529657378160439011607639),
+ RC(.001770878225839133841300705931694423482268),
+ RC(.001074301277504934385647115949826755327753),
+ RC(.2515001149531479199576969952416196054795) };
static creal g[] = {
- .47795365790226950619, .20302858736911986780,
- .44762735462617812882, .125,
- .34303789878087814570 };
+ RC(.4779536579022695061928604197171830064732),
+ RC(.2030285873691198677998034402373279133258),
+ RC(.4476273546261781288207704806530998539285),
+ RC(.125),
+ RC(.3430378987808781457001426145164678603407) };
enum { nsets = 9 };
- TYPEDEFSET;
-
ccount ndim = t->ndim;
ccount twondim = 1 << ndim;
count dim, n, r;
Set *first, *last, *s, *x;
+ csize_t setsize = SetSize;
- Alloc(first, nsets);
- Clear(first, nsets);
+ Die(first = calloc(nsets, setsize));
last = first;
n = last->n = 1;
last->weight[0] = ndim*(ndim*(ndim*w[0] + w[1]) + w[2]) + w[3];
last->weight[1] = ndim*(ndim*(ndim*w[4] + w[5]) + w[6]) - w[7];
last->weight[2] = ndim*w[8] - last->weight[1];
last->weight[3] = ndim*(ndim*w[9] + w[10]) - 1 + last->weight[0];
last->weight[4] = ndim*w[11] + 1 - last->weight[0];
- ++last;
+ NextSet(last);
n += last->n = 2*ndim;
last->weight[0] = ndim*(ndim*w[12] + w[13]) + w[14];
last->weight[1] = ndim*(ndim*w[15] + w[16]) + w[17];
last->weight[2] = w[18] - last->weight[1];
last->weight[3] = ndim*w[19] + w[20] + last->weight[0];
last->weight[4] = w[21] - last->weight[0];
last->gen[0] = g[0];
- ++last;
+ NextSet(last);
n += last->n = 2*ndim;
last->weight[0] = ndim*w[22] + w[23];
last->weight[1] = ndim*w[24] + w[25];
last->weight[2] = w[26] - last->weight[1];
last->weight[3] = ndim*w[27] + w[28];
last->weight[4] = -last->weight[0];
last->gen[0] = g[1];
- ++last;
+ NextSet(last);
n += last->n = 2*ndim;
last->weight[0] = w[29];
last->weight[1] = w[30];
last->weight[2] = -w[29];
last->weight[3] = w[31];
last->weight[4] = -w[29];
last->gen[0] = g[2];
- ++last;
+ NextSet(last);
n += last->n = 2*ndim;
last->weight[2] = w[32];
last->gen[0] = g[3];
- ++last;
+ NextSet(last);
n += last->n = 2*ndim*(ndim - 1);
last->weight[0] = w[33] - ndim*w[12];
last->weight[1] = w[34] - ndim*w[15];
last->weight[2] = -last->weight[1];
last->weight[3] = w[35] + last->weight[0];
last->weight[4] = -last->weight[0];
last->gen[0] = g[0];
last->gen[1] = g[0];
- ++last;
+ NextSet(last);
n += last->n = 4*ndim*(ndim - 1);
last->weight[0] = w[36];
last->weight[1] = w[37];
last->weight[2] = -w[37];
last->weight[3] = w[38];
last->weight[4] = -w[36];
last->gen[0] = g[0];
last->gen[1] = g[1];
- ++last;
+ NextSet(last);
n += last->n = 4*ndim*(ndim - 1)*(ndim - 2)/3;
last->weight[0] = w[39];
last->weight[1] = w[40];
last->weight[2] = -w[40];
last->weight[3] = w[39];
last->weight[4] = -w[39];
last->gen[0] = g[0];
last->gen[1] = g[0];
last->gen[2] = g[0];
- ++last;
+ NextSet(last);
n += last->n = twondim;
last->weight[0] = w[41]/twondim;
last->weight[1] = w[7]/twondim;
last->weight[2] = -last->weight[1];
last->weight[3] = last->weight[0];
last->weight[4] = -last->weight[0];
for( dim = 0; dim < ndim; ++dim )
last->gen[dim] = g[4];
t->rule.first = first;
t->rule.last = last;
t->rule.errcoeff[0] = 5;
t->rule.errcoeff[1] = 1;
t->rule.errcoeff[2] = 5;
t->rule.n = n;
- for( s = first; s <= last; ++s )
+ for( s = first; s <= last; NextSet(s) )
for( r = 1; r < nrules - 1; ++r ) {
creal scale = (s->weight[r] == 0) ? 100 :
-s->weight[r + 1]/s->weight[r];
real sum = 0;
- for( x = first; x <= last; ++x )
- sum += x->n*fabs(x->weight[r + 1] + scale*x->weight[r]);
+ for( x = first; x <= last; NextSet(x) )
+ sum += x->n*fabsx(x->weight[r + 1] + scale*x->weight[r]);
s->scale[r] = scale;
s->norm[r] = 1/sum;
}
}
/*********************************************************************/
static void Rule7Alloc(This *t)
{
static creal w[] = {
- .019417866674748388428, -.40385257701150182546,
- .64485668767465982223, .01177982690775806141,
- -.18041318740733609012, -.088785828081335044443,
- .056328645808285941374, -.0097089333373741942142,
- -.99129176779582358138, -.17757165616267008889,
- .12359398032043233572, .074978148702033690681,
- .55489147051423559776, .088041241522692771226,
- .021118358455513385083, -.0099302203239653333087,
- -.064100053285010904179, .030381729038221007659,
- .0058899134538790307051, -.0048544666686870971071,
- .35514331232534017777 };
+ RC(.01941786667474838842844534313920462333850),
+ RC(-.4038525770115018254611834753723880293161),
+ RC(.6448566876746598222277360730193089551024),
+ RC(.01177982690775806141012214458820955067854),
+ RC(-.1804131874073360901182293138710989490609),
+ RC(-.08878582808133504444306598174517276122439),
+ RC(.05632864580828594137378124255408286479947),
+ RC(-.009708933337374194214222671569602311669249),
+ RC(-.9912917677958235813775106862002319060386),
+ RC(-.1775716561626700888861319634903455224488),
+ RC(.1235939803204323357183625846672135876752),
+ RC(.07497814870203369068087999555157339703666),
+ RC(.5548914705142355977605994477355651401434),
+ RC(.08804124152269277122645182458858273865209),
+ RC(.02111835845551338508329573367808085283304),
+ RC(-.009930220323965333308685820460105538586058),
+ RC(-.06410005328501090417895544042025034295870),
+ RC(.03038172903822100765927778829870429682489),
+ RC(.005889913453879030705061072294104775339268),
+ RC(-.004854466668687097107111335784801155834624),
+ RC(.3551433123253401777722639269806910448976) };
static creal g[] = {
- .47795365790226950619, .20302858736911986780,
- .375, .34303789878087814570 };
+ RC(.4779536579022695061928604197171830064732),
+ RC(.2030285873691198677998034402373279133258),
+ RC(.375),
+ RC(.3430378987808781457001426145164678603407) };
enum { nsets = 6 };
- TYPEDEFSET;
-
ccount ndim = t->ndim;
ccount twondim = 1 << ndim;
count dim, n, r;
Set *first, *last, *s, *x;
+ csize_t setsize = SetSize;
- Alloc(first, nsets);
- Clear(first, nsets);
+ Die(first = calloc(nsets, setsize));
last = first;
n = last->n = 1;
last->weight[0] = ndim*(ndim*w[0] + w[1]) + w[2];
last->weight[1] = ndim*(ndim*w[3] + w[4]) - w[5];
last->weight[2] = ndim*w[6] - last->weight[1];
last->weight[3] = ndim*(ndim*w[7] + w[8]) - w[9];
last->weight[4] = 1 - last->weight[0];
- ++last;
+ NextSet(last);
n += last->n = 2*ndim;
last->weight[0] = w[10];
last->weight[1] = w[11];
last->weight[2] = -w[10];
last->weight[3] = w[12];
last->weight[4] = -w[10];
last->gen[0] = g[1];
- ++last;
+ NextSet(last);
n += last->n = 2*ndim;
last->weight[0] = w[13] - ndim*w[0];
last->weight[1] = w[14] - ndim*w[3];
last->weight[2] = w[15] - last->weight[1];
last->weight[3] = w[16] - ndim*w[7];
last->weight[4] = -last->weight[0];
last->gen[0] = g[0];
- ++last;
+ NextSet(last);
n += last->n = 2*ndim;
last->weight[2] = w[17];
last->gen[0] = g[2];
- ++last;
+ NextSet(last);
n += last->n = 2*ndim*(ndim - 1);
last->weight[0] = -w[7];
last->weight[1] = w[18];
last->weight[2] = -w[18];
last->weight[3] = w[19];
last->weight[4] = w[7];
last->gen[0] = g[0];
last->gen[1] = g[0];
- ++last;
+ NextSet(last);
n += last->n = twondim;
last->weight[0] = w[20]/twondim;
last->weight[1] = w[5]/twondim;
last->weight[2] = -last->weight[1];
last->weight[3] = w[9]/twondim;
last->weight[4] = -last->weight[0];
for( dim = 0; dim < ndim; ++dim )
last->gen[dim] = g[3];
t->rule.first = first;
t->rule.last = last;
t->rule.errcoeff[0] = 5;
t->rule.errcoeff[1] = 1;
t->rule.errcoeff[2] = 5;
t->rule.n = n;
- for( s = first; s <= last; ++s )
+ for( s = first; s <= last; NextSet(s) )
for( r = 1; r < nrules - 1; ++r ) {
creal scale = (s->weight[r] == 0) ? 100 :
-s->weight[r + 1]/s->weight[r];
real sum = 0;
- for( x = first; x <= last; ++x )
- sum += x->n*fabs(x->weight[r + 1] + scale*x->weight[r]);
+ for( x = first; x <= last; NextSet(x) )
+ sum += x->n*fabsx(x->weight[r + 1] + scale*x->weight[r]);
s->scale[r] = scale;
s->norm[r] = 1/sum;
}
}
/*********************************************************************/
static inline void RuleAlloc(This *t)
{
if( t->key == 13 && t->ndim == 2 ) Rule13Alloc(t);
else if( t->key == 11 && t->ndim == 3 ) Rule11Alloc(t);
else if( t->key == 9 ) Rule9Alloc(t);
else if( t->key == 7 ) Rule7Alloc(t);
else {
if( t->ndim == 2 ) Rule13Alloc(t);
else if( t->ndim == 3 ) Rule11Alloc(t);
else Rule9Alloc(t);
}
- Alloc(t->rule.x, t->rule.n*(t->ndim + t->ncomp));
- t->rule.f = t->rule.x + t->rule.n*t->ndim;
}
/*********************************************************************/
static inline void RuleFree(cThis *t)
{
- free(t->rule.x);
free(t->rule.first);
}
/*********************************************************************/
static real *ExpandFS(cThis *t, cBounds *b, real *g, real *x)
{
count dim, ndim = t->ndim;
next:
/* Compute centrally symmetric sum for permutation of G */
for( dim = 0; dim < ndim; ++dim )
*x++ = (.5 + g[dim])*b[dim].lower + (.5 - g[dim])*b[dim].upper;
for( dim = 0; dim < ndim; ) {
g[dim] = -g[dim];
if( g[dim++] < 0 ) goto next;
}
/* Find next distinct permutation of G and loop back for next sum.
Permutations are generated in reverse lexicographic order. */
for( dim = 1; dim < ndim; ++dim ) {
creal gd = g[dim];
if( g[dim - 1] > gd ) {
count i, j = dim, ix = dim, dx = dim - 1;
for( i = 0; i < --j; ++i ) {
creal tmp = g[i];
g[i] = g[j];
g[j] = tmp;
if( tmp <= gd ) --dx;
if( g[i] > gd ) ix = i;
}
if( g[dx] <= gd ) dx = ix;
g[dim] = g[dx];
g[dx] = gd;
goto next;
}
}
/* Restore original order to generators */
for( dim = 0; dim < --ndim; ++dim ) {
creal tmp = g[dim];
g[dim] = g[ndim];
g[ndim] = tmp;
}
return x;
}
/*********************************************************************/
-static void Sample(This *t, void *voidregion)
+static void Sample(This *t, Region *region)
{
- TYPEDEFREGION;
- TYPEDEFSET;
-
- Region *const region = (Region *)voidregion;
+ csize_t setsize = SetSize;
creal vol = ldexp(1., -region->div);
- real *x = t->rule.x, *f = t->rule.f;
- Set *first = (Set *)t->rule.first, *last = (Set *)t->rule.last, *s;
+ real *x = t->frame, *f = x + t->rule.n*t->ndim;
+ Set *first = t->rule.first, *last = t->rule.last, *s;
+ Bounds *b, *B = region->bounds + t->ndim;
+ Result *result = RegionResult(region), *res, *Res = result + t->ncomp;
creal *errcoeff = t->rule.errcoeff;
- creal ratio = Sq(first[2].gen[0]/first[1].gen[0]);
+ creal ratio = Sq(IndexSet(first,2)->gen[0]/
+ IndexSet(first,1)->gen[0]);
ccount offset = 2*t->ndim*t->ncomp;
- count dim, comp, rul, n, maxdim = 0;
+ count dim, rul, n, maxdim = 0;
real maxrange = 0;
- for( dim = 0; dim < t->ndim; ++dim ) {
- cBounds *b = &region->bounds[dim];
+ for( b = region->bounds, dim = 0; b < B; ++b, ++dim ) {
creal range = b->upper - b->lower;
if( range > maxrange ) {
maxrange = range;
maxdim = dim;
}
}
- for( s = first; s <= last; ++s )
+ for( s = first; s <= last; NextSet(s) )
if( s->n ) x = ExpandFS(t, region->bounds, s->gen, x);
- DoSample(t, t->rule.n, t->rule.x, f);
+ DoSample(t, t->rule.n, t->frame, f);
- for( comp = 0; comp < t->ncomp; ++comp ) {
- Result *r = &region->result[comp];
+ for( res = result; res < Res; ++res ) {
real sum[nrules];
creal *f1 = f;
creal base = *f1*2*(1 - ratio);
real maxdiff = 0;
count bisectdim = maxdim;
for( dim = 0; dim < t->ndim; ++dim ) {
creal *fp = f1 + t->ncomp;
creal *fm = fp + t->ncomp;
- creal fourthdiff = fabs(base +
+ creal fourthdiff = fabsx(base +
ratio*(fp[0] + fm[0]) - (fp[offset] + fm[offset]));
f1 = fm;
if( fourthdiff > maxdiff ) {
maxdiff = fourthdiff;
bisectdim = dim;
}
}
- r->bisectdim = bisectdim;
+ res->bisectdim = bisectdim;
f1 = f++;
Zap(sum);
- for( s = first; s <= last; ++s )
+ for( s = first; s <= last; NextSet(s) )
for( n = s->n; n; --n ) {
creal fun = *f1;
f1 += t->ncomp;
for( rul = 0; rul < nrules; ++rul )
sum[rul] += fun*s->weight[rul];
}
/* Search for the null rule, in the linear space spanned by two
successive null rules in our sequence, which gives the greatest
error estimate among all normalized (1-norm) null rules in this
space. */
for( rul = 1; rul < nrules - 1; ++rul ) {
real maxerr = 0;
- for( s = first; s <= last; ++s )
+ for( s = first; s <= last; NextSet(s) )
maxerr = Max(maxerr,
- fabs(sum[rul + 1] + s->scale[rul]*sum[rul])*s->norm[rul]);
+ fabsx(sum[rul + 1] + s->scale[rul]*sum[rul])*s->norm[rul]);
sum[rul] = maxerr;
}
- r->avg = vol*sum[0];
- r->err = vol*(
+ res->avg = vol*sum[0];
+ res->err = vol*(
(errcoeff[0]*sum[1] <= sum[2] && errcoeff[0]*sum[2] <= sum[3]) ?
errcoeff[1]*sum[1] :
errcoeff[2]*Max(Max(sum[1], sum[2]), sum[3]) );
}
if( VERBOSE > 2 ) {
- char s[64*NDIM + 128*NCOMP], *p = s;
-
- for( dim = 0; dim < t->ndim; ++dim ) {
- cBounds *b = &region->bounds[dim];
- p += sprintf(p,
- (dim == 0) ? "\nRegion (" REALF ") - (" REALF ")" :
- "\n (" REALF ") - (" REALF ")",
- b->lower, b->upper);
+ Vector(char, out, 64*NDIM + 128*NCOMP);
+ char *oe = out;
+ count comp;
+ cchar *msg = "\nRegion (" REALF ") - (" REALF ")";
+
+ for( b = region->bounds; b < B; ++b ) {
+ oe += sprintf(oe, msg, b->lower, b->upper);
+ msg = "\n (" REALF ") - (" REALF ")";
}
- for( comp = 0; comp < t->ncomp; ++comp ) {
- cResult *r = &region->result[comp];
- p += sprintf(p, "\n[" COUNT "] "
- REAL " +- " REAL, comp + 1, r->avg, r->err);
- }
+ for( res = result, comp = 0; res < Res; ++res )
+ oe += sprintf(oe, "\n[" COUNT "] "
+ REAL " +- " REAL, ++comp, SHOW(res->avg), SHOW(res->err));
- Print(s);
+ Print(out);
}
}
Index: trunk/cuba/src/cuhre/common.c
===================================================================
--- trunk/cuba/src/cuhre/common.c (revision 158)
+++ trunk/cuba/src/cuhre/common.c (revision 159)
@@ -1,25 +1,23 @@
/*
common.c
includes most of the modules
this file is part of Cuhre
- last modified 7 Jun 10 th
+ last modified 2 Aug 13 11 th
*/
#include "ChiSquare.c"
#include "Rule.c"
static inline bool BadDimension(cThis *t)
{
- if( t->ndim > NDIM ) return true;
+ if( t->ndim > MAXDIM ) return true;
return t->ndim < 2;
}
static inline bool BadComponent(cThis *t)
{
- if( t->ncomp > NCOMP ) return true;
+ if( t->ncomp > MAXCOMP ) return true;
return t->ncomp < 1;
}
-#include "Integrate.c"
-
Index: trunk/cuba/src/cuhre/decl.h
===================================================================
--- trunk/cuba/src/cuhre/decl.h (revision 158)
+++ trunk/cuba/src/cuhre/decl.h (revision 159)
@@ -1,69 +1,89 @@
/*
decl.h
Type declarations
this file is part of Cuhre
- last modified 7 Jun 10 th */
+ last modified 21 Jul 14 th
+*/
#include "stddecl.h"
typedef struct {
real avg, err;
count bisectdim;
} Result;
typedef const Result cResult;
typedef struct {
real avg, err, lastavg, lasterr;
real weightsum, avgsum;
real guess, chisum, chisqsum, chisq;
} Totals;
typedef const Totals cTotals;
typedef struct {
real lower, upper;
} Bounds;
typedef const Bounds cBounds;
+enum { nrules = 5 };
+
+typedef struct {
+ count n;
+ real weight[nrules], scale[nrules], norm[nrules];
+ real gen[];
+} Set;
+
+#define SetSize (sizeof(Set) + t->ndim*sizeof(real))
+
typedef struct {
- real *x, *f;
- void *first, *last;
+ Set *first, *last;
real errcoeff[3];
count n;
} Rule;
typedef const Rule cRule;
-typedef int (*Integrand)(ccount *, creal *, ccount *, real *, void *);
+typedef int (*Integrand)(ccount *, creal *, ccount *, real *,
+ void *, cnumber *, cint *);
typedef struct _this {
count ndim, ncomp;
#ifndef MLVERSION
Integrand integrand;
void *userdata;
+ number nvec;
+#ifdef HAVE_FORK
+ SHM_ONLY(int shmid;)
+ Spin *spin;
#endif
+#endif
+ real *frame;
real epsrel, epsabs;
int flags;
number mineval, maxeval;
count key, nregions;
+ cchar *statefile;
number neval;
Rule rule;
jmp_buf abort;
} This;
+#define nframe rule.n
+
typedef const This cThis;
-#define TYPEDEFREGION \
- typedef struct region { \
- count div; \
- Result result[1000]; \
- Bounds bounds[1000]; \
- } Region
-//#TT used to be:
-// Result result[NCOMP]; \
-// Bounds bounds[NDIM]; \
+typedef struct region {
+ count div;
+ Bounds bounds[];
+} Region;
+
+#define RegionSize (sizeof(Region) + t->ndim*sizeof(Bounds) + t->ncomp*sizeof(Result))
+
+#define RegionResult(r) ((Result *)(r->bounds + t->ndim))
+#define RegionPtr(p, n) ((Region *)((char *)p->region + (n)*regionsize))
Index: trunk/cuba/src/common/WorkerIni.c
===================================================================
--- trunk/cuba/src/common/WorkerIni.c (revision 158)
+++ trunk/cuba/src/common/WorkerIni.c (revision 159)
@@ -1,37 +0,0 @@
-/*
- WorkerIni.c
- set/run the init/exit functions for worker processes
- by Thomas Hahn
- last modified 6 Sep 12 th
-*/
-
-
-#include "stddecl.h"
-
-extern workerini cubaini;
-
-Extern void SUFFIX(cubasetinit)(subroutine f, void *arg)
-{
- cubaini.initfun = f;
- cubaini.initarg = arg;
-}
-
-
-Extern void SUFFIX(cubasetexit)(subroutine f, void *arg)
-{
- cubaini.exitfun = f;
- cubaini.exitarg = arg;
-}
-
-
-Extern void SUFFIX(cubaruninit)()
-{
- if( cubaini.initfun ) cubaini.initfun(cubaini.initarg);
-}
-
-
-Extern void SUFFIX(cubarunexit)()
-{
- if( cubaini.exitfun ) cubaini.exitfun(cubaini.exitarg);
-}
-
Index: trunk/cuba/src/common/CSample.c
===================================================================
--- trunk/cuba/src/common/CSample.c (revision 158)
+++ trunk/cuba/src/common/CSample.c (revision 159)
@@ -1,67 +1,82 @@
/*
CSample.c
the serial sampling routine
for the C versions of the Cuba routines
by Thomas Hahn
- last modified 19 Dec 11 th
+ last modified 9 Oct 14 th
*/
-static inline number SampleRaw(cThis *t, number n, creal *x, real *f
- VES_ONLY(, creal *w, ccount iter))
+coreinit cubafun_;
+extern int cubaverb_;
+extern corespec cubaworkers_;
+
+
+static inline number SampleRaw(This *t, number n, creal *x, real *f,
+ cint core VES_ONLY(, creal *w, ccount iter))
{
- for( ; n; --n ) {
- if( t->integrand(&t->ndim, x, &t->ncomp, f, t->userdata
- VES_ONLY(, w++, &iter)
+ number nvec;
+ for( nvec = t->nvec; n > 0; n -= nvec ) {
+ nvec = IMin(n, nvec);
+ if( t->integrand(&t->ndim, x, &t->ncomp, f, t->userdata, &nvec, &core
+ VES_ONLY(, w, &iter)
DIV_ONLY(, &t->phase)) == ABORT ) return -1;
- x += t->ndim;
- f += t->ncomp;
+ VES_ONLY(w += nvec;)
+ x += nvec*t->ndim;
+ f += nvec*t->ncomp;
}
return 0;
}
/*********************************************************************/
static inline void DoSampleSerial(This *t, cnumber n, creal *x, real *f
VES_ONLY(, creal *w, ccount iter))
{
+ MasterInit();
t->neval += n;
- if( SampleRaw(t, n, x, f VES_ONLY(, w, iter)) )
+ if( SampleRaw(t, n, x, f, -1 VES_ONLY(, w, iter)) )
longjmp(t->abort, -99);
}
/*********************************************************************/
#ifdef HAVE_FORK
static void DoSample(This *t, number n, creal *x, real *f
VES_ONLY(, creal *w, ccount iter));
DIV_ONLY(static int Explore(This *t, cint iregion);)
#else
#define DoSample DoSampleSerial
#define Explore ExploreSerial
#define ForkCores(t)
-#define WaitCores(t)
+
+static inline void WaitCores(This *t, Spin **pspin)
+{
+ if( Invalid(pspin) ) MasterExit();
+}
+
+#define WaitCores(t, pspin)
#endif
#ifdef DIVONNE
static inline count SampleExtra(This *t, cBounds *b)
{
number n = t->nextra;
- t->peakfinder(&t->ndim, b, &n, t->xextra);
+ t->peakfinder(&t->ndim, b, &n, t->xextra, t->userdata);
DoSample(t, n, t->xextra, t->fextra);
return n;
}
#endif
#include "common.c"
#ifdef HAVE_FORK
-#include "Fork.c"
+#include "Parallel.c"
#endif
#include "Integrate.c"
Index: trunk/cuba/src/common/ChiSquare.c
===================================================================
--- trunk/cuba/src/common/ChiSquare.c (revision 158)
+++ trunk/cuba/src/common/ChiSquare.c (revision 159)
@@ -1,67 +1,67 @@
/*
ChiSquare.c
the chi-square cdf
after W.J. Kennedy and J.E. Gentle,
Statistical computing, p. 116
- last modified 9 Feb 05 th
+ last modified 12 Mar 15 th
*/
#ifdef HAVE_ERF
#define Erf erf
#else
#include "Erf.c"
#endif
static inline real Normal(creal x)
{
return .5*Erf(x/1.414213562373095048801689) + .5;
}
/*********************************************************************/
static real ChiSquare(creal x, cint df)
{
real y;
if( df <= 0 ) return -999;
if( x <= 0 ) return 0;
if( x > 1000*df ) return 1;
if( df > 1000 ) {
if( x < 2 ) return 0;
y = 2./(9*df);
- y = (pow(x/df, 1/3.) - (1 - y))/sqrt(y);
+ y = (powx(x/df, 1/3.) - (1 - y))/sqrtx(y);
if( y > 5 ) return 1;
if( y < -18.8055 ) return 0;
return Normal(y);
}
y = .5*x;
if( df & 1 ) {
- creal sqrty = sqrt(y);
+ creal sqrty = sqrtx(y);
real h = Erf(sqrty);
count i;
if( df == 1 ) return h;
- y = sqrty*exp(-y)/.8862269254527579825931;
+ y = sqrty*expx(-y)/.8862269254527579825931;
for( i = 3; i < df; i += 2 ) {
h -= y;
y *= x/i;
}
y = h - y;
}
else {
- real term = exp(-y), sum = term;
+ real term = expx(-y), sum = term;
count i;
for( i = 1; i < df/2; ++i )
sum += term *= y/i;
y = 1 - sum;
}
return Max(0., y);
}
Index: trunk/cuba/src/common/sock.h
===================================================================
--- trunk/cuba/src/common/sock.h (revision 0)
+++ trunk/cuba/src/common/sock.h (revision 159)
@@ -0,0 +1,65 @@
+/*
+ sock.h
+ socket read/write
+ by Thomas Hahn
+ last modified 27 May 14 th
+*/
+
+#include <sys/socket.h>
+
+#ifdef DEBUG
+#define TERM_RED "\e[31m"
+#define TERM_BLUE "\e[34m"
+#define TERM_RESET "\e[0m\n"
+#define MASTER(s, ...) \
+fprintf(stderr, TERM_RED ROUTINE " master %d(%d): " s TERM_RESET, core, getpid(), ##__VA_ARGS__)
+#define WORKER(s, ...) \
+fprintf(stderr, TERM_BLUE ROUTINE " worker %d(%d): " s TERM_RESET, core, getpid(), ##__VA_ARGS__)
+#define DEB_ONLY(...) __VA_ARGS__
+#else
+#define MASTER(s, ...)
+#define WORKER(s, ...)
+#define DEB_ONLY(...)
+#endif
+
+#ifdef LOW_LEVEL_DEBUG
+#define TERM_GREEN "\e[32m"
+#define TERM_MAGENTA "\e[35m"
+#define READ(s, ...) \
+fprintf(stderr, TERM_GREEN ROUTINE " pid %d: read " s TERM_RESET, getpid(), ##__VA_ARGS__)
+#define WRITE(s, ...) \
+fprintf(stderr, TERM_MAGENTA ROUTINE " pid %d: write " s TERM_RESET, getpid(), ##__VA_ARGS__)
+#else
+#define READ(s, ...)
+#define WRITE(s, ...)
+#endif
+
+/*********************************************************************/
+
+#ifndef MSG_WAITALL
+/* Windows */
+#define MSG_WAITALL 0
+#endif
+
+static inline int readsock(cint fd, void *data, csize_t n)
+{
+ ssize_t got;
+ size_t remain = n;
+ do got = recv(fd, data, remain, MSG_WAITALL);
+ while( got > 0 && (data += got, remain -= got) > 0 );
+ READ("%lu bytes at %p from fd %d", n, data, fd);
+ return got;
+}
+
+/*********************************************************************/
+
+static inline int writesock(cint fd, const void *data, csize_t n)
+{
+ ssize_t got;
+ size_t remain = n;
+ do got = send(fd, data, remain, MSG_WAITALL);
+ while( got > 0 && (data += got, remain -= got) > 0 );
+ WRITE("%lu bytes at %p to fd %d", n, data, fd);
+ return got;
+}
+
Index: trunk/cuba/src/common/stddecl.h
===================================================================
--- trunk/cuba/src/common/stddecl.h (revision 158)
+++ trunk/cuba/src/common/stddecl.h (revision 159)
@@ -1,219 +1,561 @@
/*
stddecl.h
- Type declarations common to all Cuba routines
- last modified 6 Dec 10 th
+ declarations common to all Cuba routines
+ last modified 23 Apr 15 th
*/
#ifndef _stddecl_h_
#define _stddecl_h_
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
+#define _BSD_SOURCE
+#define _SVID_SOURCE
+
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <float.h>
#include <limits.h>
#include <unistd.h>
+#include <assert.h>
#include <fcntl.h>
#include <setjmp.h>
#include <sys/stat.h>
+#include <sys/types.h>
+#ifdef HAVE_FORK
+#include <sys/wait.h>
+#include <sys/socket.h>
+#include <signal.h>
+#ifdef HAVE_SHMGET
+#include <sys/ipc.h>
+#include <sys/shm.h>
+#endif
+#endif
+#ifdef HAVE_ALLOCA_H
+#include <alloca.h>
+#elif defined __GNUC__
+#define alloca __builtin_alloca
+#elif defined _AIX
+#define alloca __alloca
+#elif defined _MSC_VER
+#include <malloc.h>
+#define alloca _alloca
+#else
+#include <stddef.h>
+#ifdef __cplusplus
+extern "C"
+#endif
+void *alloca (size_t);
+#endif
#ifndef NDIM
#define NDIM t->ndim
+#define MAXDIM 1024
+#else
+#define MAXDIM NDIM
#endif
+
#ifndef NCOMP
#define NCOMP t->ncomp
+#define MAXCOMP 1024
+#else
+#define MAXCOMP NCOMP
+#endif
+
+#if defined(VEGAS) || defined(SUAVE)
+#define VES_ONLY(...) __VA_ARGS__
+#define NW 1
+#else
+#define VES_ONLY(...)
+#define NW 0
+#endif
+
+#ifdef DIVONNE
+#define DIV_ONLY(...) __VA_ARGS__
+#else
+#define DIV_ONLY(...)
#endif
+#define SAMPLESIZE (NW + t->ndim + t->ncomp)*sizeof(real)
+
+
+enum { uninitialized = 0x61627563 };
+
+#define EnvInit(var, name, default) \
+ if( var == uninitialized ) { \
+ cchar *env = getenv(name); \
+ if( env == NULL ) var = default; \
+ else { \
+ var = atoi(env); \
+ if( cubaverb_ ) { \
+ char out[64]; \
+ sprintf(out, "env " name " = %d", (int)var); \
+ Print(out); \
+ } \
+ } \
+ }
+
+#define VerboseInit() EnvInit(cubaverb_, "CUBAVERBOSE", 0)
+#define MaxVerbose(flags) (flags + IDim(IMin(cubaverb_, 3) - ((flags) & 3)))
#define VERBOSE (t->flags & 3)
#define LAST (t->flags & 4)
#define SHARPEDGES (t->flags & 8)
+#define KEEPFILE (t->flags & 16)
+#define ZAPSTATE (t->flags & 32)
#define REGIONS (t->flags & 128)
#define RNG (t->flags >> 8)
#define INFTY DBL_MAX
-#define NOTZERO 0x1p-104
+#if __STDC_VERSION__ >= 199901L
+#define POW2(n) 0x1p-##n
+#else
+#define POW2(n) ldexp(1., -n)
+#endif
+
+#define NOTZERO POW2(104)
#define ABORT -999
#define Elements(x) (sizeof(x)/sizeof(*x))
#define Copy(d, s, n) memcpy(d, s, (n)*sizeof(*(d)))
-#define VecCopy(d, s) Copy(d, s, t->ndim)
+#define Move(d, s, n) memmove(d, s, (n)*sizeof(*(d)))
+
+#define XCopy(d, s) Copy(d, s, t->ndim)
-#define ResCopy(d, s) Copy(d, s, t->ncomp)
+#define FCopy(d, s) Copy(d, s, t->ncomp)
#define Clear(d, n) memset(d, 0, (n)*sizeof(*(d)))
-#define VecClear(d) Clear(d, t->ndim)
+#define XClear(d) Clear(d, t->ndim)
-#define ResClear(d) Clear(d, t->ncomp)
+#define FClear(d) Clear(d, t->ncomp)
#define Zap(d) memset(d, 0, sizeof(d))
-#define MaxErr(avg) Max(t->epsrel*fabs(avg), t->epsabs)
+#define MaxErr(avg) Max(t->epsrel*fabsx(avg), t->epsabs)
#ifdef __cplusplus
#define mallocset(p, n) (*(void **)&p = malloc(n))
#define reallocset(p, n) (*(void **)&p = realloc(p, n))
#else
#define mallocset(p, n) (p = malloc(n))
#define reallocset(p, n) (p = realloc(p, n))
#endif
-#define ChkAlloc(r) if( r == NULL ) { \
- fprintf(stderr, "Out of memory in " __FILE__ " line %d.\n", __LINE__); \
- exit(1); \
-}
+#define Abort(s) abort1(s, __LINE__)
+#define abort1(s, line) abort2(s, line)
+#define abort2(s, line) { perror(s " " __FILE__ "(" #line ")"); exit(1); }
+
+#define Die(p) if( (p) == NULL ) Abort("malloc")
+#define MemAlloc(p, n) Die(mallocset(p, n))
+#define ReAlloc(p, n) Die(reallocset(p, n))
#define Alloc(p, n) MemAlloc(p, (n)*sizeof(*p))
-#define MemAlloc(p, n) ChkAlloc(mallocset(p, n))
-#define ReAlloc(p, n) ChkAlloc(reallocset(p, n))
+
+#if __STDC_VERSION__ >= 199901L
+#define Sized(type, var, size) char var##_[size]; type *var = (type *)var##_
+#define Vector(type, var, n1) type var[n1]
+#define Array(type, var, n1, n2) type var[n1][n2]
+#else
+#define Sized(type, var, size) type *var = alloca(size)
+#define Vector(type, var, n1) type *var = alloca((n1)*sizeof(type))
+#define Array(type, var, n1, n2) type (*var)[n2] = alloca((n1)*(n2)*sizeof(type))
+#endif
+
+#define FORK_ONLY(...)
+#define SHM_ONLY(...)
+#define ShmAlloc(...)
+#define ShmFree(...)
+
+#ifdef MLVERSION
+#define ML_ONLY(...) __VA_ARGS__
+#define ML_NOT(...)
+#else
+#define ML_ONLY(...)
+#define ML_NOT(...) __VA_ARGS__
+
+#define CORE_MASTER (int []){32768}
+#define MasterInit() do if( !cubafun_.init ) { \
+ cubafun_.init = true; \
+ if( cubafun_.initfun ) cubafun_.initfun(cubafun_.initarg, CORE_MASTER); \
+} while( 0 )
+#define MasterExit() do if( cubafun_.init ) { \
+ cubafun_.init = false; \
+ if( cubafun_.exitfun ) cubafun_.exitfun(cubafun_.exitarg, CORE_MASTER); \
+} while( 0 )
+#define Invalid(s) ((s) == NULL || *(int *)(s) == -1)
+
+#ifdef HAVE_FORK
+#undef FORK_ONLY
+#define FORK_ONLY(...) __VA_ARGS__
+
+#ifdef HAVE_SHMGET
+#undef SHM_ONLY
+#define SHM_ONLY(...) __VA_ARGS__
+
+#define MasterAlloc(t) \
+ t->shmid = shmget(IPC_PRIVATE, t->nframe*SAMPLESIZE, IPC_CREAT | 0600)
+#define MasterFree(t) shmctl(t->shmid, IPC_RMID, NULL)
+#define WorkerAlloc(t)
+#define WorkerFree(r)
+
+#undef ShmAlloc
+#define ShmAlloc(t, who) \
+ who##Alloc(t); \
+ if( t->shmid != -1 ) { \
+ t->frame = shmat(t->shmid, NULL, 0); \
+ if( t->frame == (void *)-1 ) Abort("shmat"); \
+ }
+
+#undef ShmFree
+#define ShmFree(t, who) \
+ if( t->shmid != -1 ) { \
+ shmdt(t->frame); \
+ who##Free(t); \
+ }
+
+#endif
+#endif
+#endif
+
+#define FrameAlloc(t, who) \
+ SHM_ONLY(ShmAlloc(t, who) else) \
+ MemAlloc(t->frame, t->nframe*SAMPLESIZE);
+
+#define FrameFree(t, who) \
+ DIV_ONLY(if( t->nframe )) { \
+ SHM_ONLY(ShmFree(t, who) else) \
+ free(t->frame); \
+ }
+
+
+#define StateDecl \
+char *statefile_tmp = NULL, *statefile_XXXXXX = NULL; \
+int statemsg = VERBOSE; \
+ssize_t ini = 1; \
+struct stat st
+
+#define StateSetup(t) if( (t)->statefile ) { \
+ if( *(t)->statefile == 0 ) (t)->statefile = NULL; \
+ else { \
+ ccount len = strlen((t)->statefile); \
+ statefile_tmp = alloca(len + 8); \
+ strcpy(statefile_tmp, (t)->statefile); \
+ statefile_XXXXXX = statefile_tmp + len; \
+ } \
+}
+
+typedef long long int signature_t;
+
+enum { signature = 0x41425543 };
+
+#define StateSignature(t, i) (signature + \
+ ((signature_t)(i) << 60) + \
+ ((signature_t)(t)->ncomp << 48) + \
+ ((signature_t)(t)->ndim << 32))
+
+#define StateReadTest(t) (t)->statefile && \
+ stat((t)->statefile, &st) == 0 && (st.st_mode & 0400)
+
+#define StateReadOpen(t, fd) do { \
+ int fd; \
+ if( (fd = open((t)->statefile, O_RDONLY)) != -1 ) { \
+ do
+
+#define StateRead(fd, buf, size) \
+ ini += size - read(fd, buf, size)
+
+#define StateReadClose(t, fd) \
+ while( (--ini, 0) ); \
+ close(fd); \
+ } \
+ if( ini | statemsg ) { \
+ char s[512]; \
+ sprintf(s, ini ? \
+ "\nError restoring state from %s, starting from scratch." : \
+ "\nRestored state from %s.", (t)->statefile); \
+ Print(s); \
+ } \
+} while( 0 )
+
+
+#define StateWriteTest(t) ((t)->statefile)
+
+#define StateWriteOpen(t, fd) do { \
+ ssize_t fail = 1; \
+ int fd; \
+ strcpy(statefile_XXXXXX, "-XXXXXX"); \
+ if( (fd = mkstemp(statefile_tmp)) != -1 ) { \
+ do
+
+#define StateWrite(fd, buf, size) \
+ fail += size - write(fd, buf, size)
+
+#define StateWriteClose(t, fd) \
+ while( (--fail, 0) ); \
+ close(fd); \
+ if( fail == 0 ) fail |= rename(statefile_tmp, (t)->statefile); \
+ } \
+ if( fail | statemsg ) { \
+ char s[512]; \
+ sprintf(s, fail ? \
+ "\nError saving state to %s." : \
+ "\nSaved state to %s.", (t)->statefile); \
+ Print(s); \
+ statemsg &= fail & -2; \
+ } \
+} while( 0 )
+
+
+#define StateRemove(t) \
+if( fail == 0 && (t)->statefile && KEEPFILE == 0 ) unlink((t)->statefile)
#ifdef __cplusplus
#define Extern extern "C"
#else
#define Extern extern
typedef enum { false, true } bool;
#endif
typedef const char cchar;
typedef const bool cbool;
typedef const int cint;
typedef const long clong;
+typedef const size_t csize_t;
+
#define COUNT "%d"
typedef /*unsigned*/ int count;
typedef const count ccount;
#ifdef LONGLONGINT
#define PREFIX(s) ll##s
#define NUMBER "%lld"
#define NUMBER7 "%7lld"
+#define NUMBER_MAX LLONG_MAX
typedef long long int number;
#else
#define PREFIX(s) s
#define NUMBER "%d"
#define NUMBER7 "%7d"
+#define NUMBER_MAX INT_MAX
typedef int number;
#endif
typedef const number cnumber;
#define REAL "%g"
#define REALF "%f"
-typedef /*long*/ double real;
- /* Switching to long double is not as trivial as it
- might seem here. sqrt, erf, exp, pow need to be
- replaced by their long double versions (sqrtl, ...),
- printf formats need to be updated similarly, and
- ferrying long doubles to Mathematica is of course
- quite another matter, too. */
+#define SHOW(r) (double)(r)
+ /* floating-point numbers are printed with SHOW */
+
+#if REALSIZE == 16
+#include <quadmath.h>
+typedef __float128 real;
+#define RC(x) x##Q
+#define sqrtx sqrtq
+#define expx expq
+#define powx powq
+#define erfx erfq
+#define fabsx fabsq
+#define ldexpx ldexpq
+#define REAL_MAX_EXP FLT128_MAX_EXP
+#define REAL_MAX FLT128_MAX
+#elif REALSIZE == 10
+typedef long double real;
+#define RC(x) x##L
+#define sqrtx sqrtl
+#define expx expl
+#define powx powl
+#define erfx erfl
+#define fabsx fabsl
+#define ldexpx ldexpl
+#define REAL_MAX_EXP LDBL_MAX_EXP
+#define REAL_MAX LDBL_MAX
+#define MLPutRealxList MLPutReal128List
+#define MLGetRealxList MLGetReal128List
+#define MLReleaseRealxList MLReleaseReal128List
+#else
+typedef double real;
+#define RC(x) x
+#define sqrtx sqrt
+#define expx exp
+#define powx pow
+#define erfx erf
+#define fabsx fabs
+#define ldexpx ldexp
+#define REAL_MAX_EXP DBL_MAX_EXP
+#define REAL_MAX DBL_MAX
+#define MLPutRealxList MLPutReal64List
+#define MLGetRealxList MLGetReal64List
+#define MLReleaseRealxList MLReleaseReal64List
+#endif
typedef const real creal;
+typedef void (*subroutine)(void *, cint *);
+
+typedef struct {
+ subroutine initfun;
+ void *initarg;
+ subroutine exitfun;
+ void *exitarg;
+ bool init;
+} coreinit;
+
+typedef struct {
+ int ncores, naccel;
+ int pcores, paccel;
+} corespec;
+
+typedef struct {
+ int fd, pid;
+} fdpid;
+
+typedef struct {
+ corespec spec;
+ fdpid fp[];
+} Spin;
+
struct _this;
+typedef struct {
+ void (*worker)(struct _this *, csize_t, cint, cint);
+ struct _this *thisptr;
+ size_t thissize;
+} dispatch;
+
+
typedef unsigned int state_t;
#define SOBOL_MINDIM 1
#define SOBOL_MAXDIM 40
/* length of state vector */
#define MERSENNE_N 624
/* period parameter */
#define MERSENNE_M 397
typedef struct {
void (*getrandom)(struct _this *t, real *x);
void (*skiprandom)(struct _this *t, cnumber n);
union {
struct {
real norm;
number v[SOBOL_MAXDIM][30], prev[SOBOL_MAXDIM];
number seq;
} sobol;
struct {
state_t state[MERSENNE_N];
count next;
} mersenne;
struct {
count n24, i24, j24, nskip;
int carry, state[24];
} ranlux;
};
} RNGState;
-#ifdef UNDERSCORE
-#define SUFFIX(s) s##_
-#else
+#if NOUNDERSCORE
#define SUFFIX(s) s
+#else
+#define SUFFIX(s) s##_
#endif
#define EXPORT(s) EXPORT_(PREFIX(s))
#define EXPORT_(s) SUFFIX(s)
-static inline real Sq(creal x)
-{
+#define CString(cs, fs, len) { \
+ char *_s = NULL; \
+ if( fs ) { \
+ int _l = len; \
+ while( _l > 0 && fs[_l - 1] == ' ' ) --_l; \
+ if( _l > 0 && (_s = alloca(_l + 1)) ) { \
+ memcpy(_s, fs, _l); \
+ _s[_l] = 0; \
+ } \
+ } \
+ cs = _s; \
+}
+
+static inline real Sq(creal x) {
return x*x;
}
-static inline real Min(creal a, creal b)
-{
+static inline real Min(creal a, creal b) {
return (a < b) ? a : b;
}
-static inline real Max(creal a, creal b)
-{
+static inline real Max(creal a, creal b) {
return (a > b) ? a : b;
}
-static inline real Weight(creal sum, creal sqsum, cnumber n)
-{
- creal w = sqrt(sqsum*n);
+static inline real Weight(creal sum, creal sqsum, cnumber n) {
+ creal w = sqrtx(sqsum*n);
return (n - 1)/Max((w + sum)*(w - sum), NOTZERO);
}
/* (a < 0) ? -1 : 0 */
#define NegQ(a) ((a) >> (sizeof(a)*8 - 1))
/* (a < 0) ? -1 : 1 */
#define Sign(a) (1 + 2*NegQ(a))
/* (a < 0) ? 0 : a */
#define IDim(a) ((a) & NegQ(-(a)))
/* (a < b) ? a : b */
#define IMin(a, b) ((a) - IDim((a) - (b)))
/* (a > b) ? a : b */
#define IMax(a, b) ((b) + IDim((a) - (b)))
/* (a == 0) ? 0 : -1 */
#define TrueQ(a) NegQ((a) | (-a))
/* a + (a == 0) */
#define Min1(a) ((a) + 1 + TrueQ(a))
/* abs(a) + (a == 0) */
#define Abs1(a) (((a) ^ NegQ(a)) - NegQ((a) - 1))
+
+#ifdef MLVERSION
+
+static inline void Print(MLCONST char *s)
+{
+ MLPutFunction(stdlink, "EvaluatePacket", 1);
+ MLPutFunction(stdlink, "Print", 1);
+ MLPutString(stdlink, s);
+ MLEndPacket(stdlink);
+
+ MLNextPacket(stdlink);
+ MLNewPacket(stdlink);
+}
+
+#else
+
+#define Print(s) puts(s); fflush(stdout)
+
+#endif
+
#endif
Index: trunk/cuba/src/common/Data.c
===================================================================
--- trunk/cuba/src/common/Data.c (revision 0)
+++ trunk/cuba/src/common/Data.c (revision 159)
@@ -0,0 +1,18 @@
+/*
+ Data.c
+ initialized data for Cuba
+ by Thomas Hahn
+ last modified 21 Jul 14 th
+*/
+
+
+#include "stddecl.h"
+
+int cubaverb_ = uninitialized;
+
+#ifdef HAVE_FORK
+corespec cubaworkers_ = {
+ uninitialized, uninitialized,
+ uninitialized, uninitialized };
+#endif
+
Index: trunk/cuba/src/common/Erf.c
===================================================================
--- trunk/cuba/src/common/Erf.c (revision 158)
+++ trunk/cuba/src/common/Erf.c (revision 159)
@@ -1,51 +1,51 @@
/*
Erf.c
Gaussian error function
= 2/Sqrt[Pi] Integrate[Exp[-t^2], {t, 0, x}]
Code from Takuya Ooura's gamerf2a.f
http://www.kurims.kyoto-u.ac.jp/~ooura/gamerf.html
- last modified 8 Feb 05 th
+ last modified 12 Mar 15 th
*/
static real Erfc(creal x)
{
static creal c[] = {
2.96316885199227378e-01, 6.12158644495538758e-02,
1.81581125134637070e-01, 5.50942780056002085e-01,
6.81866451424939493e-02, 1.53039662058770397e+00,
1.56907543161966709e-02, 2.99957952311300634e+00,
2.21290116681517573e-03, 4.95867777128246701e+00,
1.91395813098742864e-04, 7.41471251099335407e+00,
9.71013284010551623e-06, 1.04765104356545238e+01,
1.66642447174307753e-07, 1.48455557345597957e+01,
6.10399733098688199e+00, 1.26974899965115684e+01 };
real y = x*x;
- y = exp(-y)*x*(
+ y = expx(-y)*x*(
c[0]/(y + c[1]) + c[2]/(y + c[3]) +
c[4]/(y + c[5]) + c[6]/(y + c[7]) +
c[8]/(y + c[9]) + c[10]/(y + c[11]) +
c[12]/(y + c[13]) + c[14]/(y + c[15]) );
- if( x < c[16] ) y += 2/(exp(c[17]*x) + 1);
+ if( x < c[16] ) y += 2/(expx(c[17]*x) + 1);
return y;
}
static real Erf(creal x)
{
static creal c[] = {
1.12837916709551257e+00,
-3.76126389031833602e-01,
1.12837916706621301e-01,
-2.68661698447642378e-02,
5.22387877685618101e-03,
-8.49202435186918470e-04 };
- real y = fabs(x);
+ real y = fabsx(x);
if( y > .125 ) {
y = 1 - Erfc(y);
return (x > 0) ? y : -y;
}
y *= y;
return x*(c[0] + y*(c[1] + y*(c[2] +
y*(c[3] + y*(c[4] + y*c[5])))));
}
Index: trunk/cuba/src/common/Parallel.c
===================================================================
--- trunk/cuba/src/common/Parallel.c (revision 0)
+++ trunk/cuba/src/common/Parallel.c (revision 159)
@@ -0,0 +1,441 @@
+/*
+ Parallel.c
+ the parallel sampling routine
+ for the C versions of the Cuba routines
+ by Thomas Hahn
+ last modified 23 Apr 15 th
+*/
+
+#include "sock.h"
+
+#define MINSLICE 10
+#define MINCORES 1
+/*#define MINCORES 2*/
+
+typedef struct {
+ number n, m, i;
+ VES_ONLY(count iter;)
+ DIV_ONLY(int phase SHM_ONLY(, shmid);)
+} Slice;
+
+#if defined HAVE_SHMGET && (defined SUAVE || defined DIVONNE)
+#define FRAMECOPY
+#endif
+
+Extern void SUFFIX(cubafork)(Spin **);
+Extern void SUFFIX(cubawait)(Spin **);
+
+/*********************************************************************/
+
+static inline void DoSampleParallel(This *t, number n, creal *x, real *f
+ VES_ONLY(, creal *w, ccount iter))
+{
+ char out[128];
+ Slice slice, rslice;
+ fd_set ready;
+ int core, abort, running = 0;
+ const fdpid *pfp;
+ Spin *spin = t->spin;
+ cint paccel = spin->spec.paccel;
+ cint naccel = IMin(spin->spec.naccel, (n + paccel - 1)/IMax(paccel, 1));
+ cnumber nrest = IDim(n - naccel*paccel);
+ cint ncores = IMin(spin->spec.ncores, nrest/MINSLICE);
+ number pcores = IMin(spin->spec.pcores, nrest/IMax(ncores, 1));
+ number nx = nrest - ncores*pcores;
+ if( nx >= ncores ) nx = 0;
+
+ t->neval += n;
+
+ if( VERBOSE > 2 ) {
+ sprintf(out, "sampling " NUMBER " points each on %d cores",
+ pcores, ncores);
+ Print(out);
+ }
+
+ slice.n = paccel;
+ slice.m = IMax(slice.n, pcores);
+ slice.i = 0;
+ VES_ONLY(slice.iter = iter;)
+ DIV_ONLY(slice.phase = t->phase;)
+
+#ifdef DIVONNE
+ if( n > t->nframe ) {
+ FrameFree(t, Master);
+ t->nframe = n;
+ FrameAlloc(t, Master);
+ }
+ SHM_ONLY(slice.shmid = t->shmid;)
+#endif
+
+ SHM_ONLY(if( t->shmid != -1 ) {
+ slice.m = n;
+#ifdef FRAMECOPY
+ VES_ONLY(Copy(t->frame, w, n);)
+ Copy(t->frame + n*NW, x, n*t->ndim);
+#endif
+ })
+
+#define PutSamples(fd) do { \
+ slice.n = IMin(slice.n, n); \
+ MASTER("sending samples (sli:%lu[+" VES_ONLY(NUMBER "w:%lu+") \
+ NUMBER "x:%lu]) to fd %d", \
+ sizeof slice, VES_ONLY(slice.n, sizeof *w,) \
+ slice.n, t->ndim*sizeof *x, fd); \
+ writesock(fd, &slice, sizeof slice); \
+ SHM_ONLY(if( t->shmid == -1 )) { \
+ VES_ONLY(writesock(fd, w, slice.n*sizeof *w); \
+ w += slice.n;) \
+ writesock(fd, x, slice.n*t->ndim*sizeof *x); \
+ x += slice.n*t->ndim; \
+ } \
+ slice.i += slice.n; \
+ n -= slice.n; \
+ ++running; \
+} while( 0 )
+
+#define GetSamples(fd) do { \
+ readsock(fd, &rslice, sizeof rslice); \
+ MASTER("reading samples (sli:%lu[+" NUMBER "f:%lu]) from fd %d", \
+ sizeof rslice, rslice.n, t->ncomp*sizeof *f, fd); \
+ if( rslice.n == -1 ) abort = 1; \
+ else SHM_ONLY(if( t->shmid == -1 )) \
+ readsock(fd, f + rslice.i*t->ncomp, rslice.n*t->ncomp*sizeof *f); \
+ --running; \
+} while( 0 )
+
+ ++pcores;
+ pfp = spin->fp;
+ for( core = -naccel; n && core < ncores; ++core ) {
+ cint fd = pfp++->fd;
+ pcores -= (core == nx);
+ slice.n = (core < 0) ? paccel : pcores;
+ PutSamples(fd);
+ }
+
+ abort = 0;
+
+ while( running ) {
+ int fdmax = 0;
+
+ FD_ZERO(&ready);
+ pfp = spin->fp;
+ for( core = -naccel; core < ncores; ++core ) {
+ cint fd = pfp++->fd;
+ FD_SET(fd, &ready);
+ fdmax = IMax(fdmax, fd);
+ }
+ fdmax = select(fdmax + 1, &ready, NULL, NULL, NULL);
+
+ pfp = spin->fp;
+ for( core = -naccel; core < ncores; ++core ) {
+ cint fd = pfp++->fd;
+ if( FD_ISSET(fd, &ready) ) {
+ GetSamples(fd);
+ if( abort ) break;
+ if( n ) PutSamples(fd);
+ if( --fdmax == 0 ) break;
+ }
+ }
+ }
+
+ if( abort ) longjmp(t->abort, -99);
+
+#ifdef FRAMECOPY
+ if( t->shmid != -1 )
+ Copy(f, t->frame + slice.m*(NW + t->ndim), slice.m*t->ncomp);
+#endif
+}
+
+/*********************************************************************/
+
+static void DoSample(This *t, number n, creal *x, real *f
+ VES_ONLY(, creal *w, ccount iter))
+{
+ if( t->spin == NULL ||
+ t->spin->spec.ncores + t->spin->spec.naccel < MINCORES ||
+ n < MINCORES*MINSLICE )
+ DoSampleSerial(t, n, x, f VES_ONLY(, w, iter));
+ else
+ DoSampleParallel(t, n, x, f VES_ONLY(, w, iter));
+}
+
+/*********************************************************************/
+
+#ifdef DIVONNE
+
+typedef struct {
+ number neval, neval_opt, neval_cut;
+ count nregions, iregion, retval;
+} ExploreResult;
+
+static inline int ExploreParallel(This *t, cint iregion)
+{
+ Vector(Totals, totals, NCOMP);
+ csize_t regionsize = RegionSize;
+ Region *region;
+ Spin *spin = t->spin;
+ cint cores = spin->spec.naccel + spin->spec.ncores;
+ int core = t->running;
+ int ireg = iregion;
+
+ if( core >= ((iregion < 0) ? 1 : cores) ) {
+ fd_set ready;
+ int fd = 0, fdmax = 0;
+ ExploreResult res;
+ count comp, succ;
+
+ FD_ZERO(&ready);
+ for( core = 0; core < cores; ++core ) {
+ fd = spin->fp[core].fd;
+ FD_SET(fd, &ready);
+ fdmax = IMax(fd, fdmax);
+ }
+ select(fdmax + 1, &ready, NULL, NULL, NULL);
+
+ for( core = 0; core < cores; ++core ) {
+ fd = spin->fp[core].fd;
+ if( FD_ISSET(fd, &ready) ) break;
+ }
+
+ --t->running;
+ MASTER("reading res + region (res:%lu+reg:%lu) from fd %d",
+ sizeof res, regionsize, fd);
+ readsock(fd, &res, sizeof res);
+ ireg = res.iregion;
+ region = RegionPtr(ireg);
+ succ = ireg + region->next;
+ readsock(fd, region, regionsize);
+ if( --res.nregions > 0 ) {
+ region->next = t->nregions - ireg;
+ EnlargeRegions(t, res.nregions);
+ MASTER("reading regions (%dreg:%lu) from fd %d",
+ res.nregions, regionsize, fd);
+ readsock(fd, RegionPtr(t->nregions), res.nregions*regionsize);
+ t->nregions += res.nregions;
+
+ RegionPtr(t->nregions-1)->next = succ - t->nregions + 1;
+ }
+
+ MASTER("reading totals (tot:%lu) from fd %d",
+ t->ncomp*sizeof(Totals), fd);
+ readsock(fd, totals, t->ncomp*sizeof(Totals));
+ for( comp = 0; comp < t->ncomp; ++comp )
+ t->totals[comp].secondspread =
+ Max(t->totals[comp].secondspread, totals[comp].secondspread);
+
+ t->neval += res.neval;
+ t->neval_opt += res.neval_opt;
+ t->neval_cut += res.neval_cut;
+
+ if( res.retval == -1 ) return -1;
+ }
+
+ if( iregion >= 0 ) {
+ Slice slice;
+ cint fd = spin->fp[core].fd;
+ slice.n = 0;
+ slice.i = iregion;
+ slice.phase = t->phase;
+ region = RegionPtr(iregion);
+ MASTER("writing region (sli:%lu+sam:%lu+reg:%lu+tot:%lu) to fd %d",
+ sizeof slice, sizeof(Samples), regionsize,
+ t->ncomp*sizeof(Totals), fd);
+ writesock(fd, &slice, sizeof slice);
+ writesock(fd, &t->samples[region->isamples], sizeof(Samples));
+ writesock(fd, region, regionsize);
+ writesock(fd, t->totals, t->ncomp*sizeof(Totals));
+ region->depth = 0;
+ ++t->running;
+ }
+
+ return ireg;
+}
+
+/*********************************************************************/
+
+static int Explore(This *t, cint iregion)
+{
+ if( t->spin == NULL ||
+ t->spin->spec.ncores + t->spin->spec.naccel < MINCORES )
+ return ExploreSerial(t, iregion);
+ else
+ return ExploreParallel(t, iregion);
+}
+
+#endif
+
+/*********************************************************************/
+
+static void Worker(This *t, const size_t alloc, cint core, cint fd)
+{
+ Slice slice;
+
+ if( readsock(fd, &slice, sizeof slice) == sizeof slice &&
+ slice.n != -1 ) {
+#ifdef DIVONNE
+ csize_t regionsize = RegionSize;
+ Vector(Totals, totals, NCOMP);
+ Spin spin = {{0, 0, 0, 0}}; /* no recursive forks */
+
+ t->totals = totals;
+ t->spin = &spin;
+ t->size = 2*t->ndim + 2;
+ AllocRegions(t);
+#endif
+
+ if( alloc ) {
+#ifndef DIVONNE
+ FrameAlloc(t, Worker);
+#endif
+#if defined DIVONNE || defined CUHRE
+ RuleAlloc(t);
+#endif
+ }
+#ifdef SUAVE
+ else SHM_ONLY(if( t->shmid == -1 ))
+ MemAlloc(t->frame, t->nframe*SAMPLESIZE);
+#endif
+
+ if( cubafun_.initfun ) cubafun_.initfun(cubafun_.initarg, &core);
+
+ do {
+ number n = slice.n;
+ WORKER("received slice.n = " NUMBER, n);
+ DIV_ONLY(t->phase = slice.phase;)
+
+ if( n > 0 ) {
+ real VES_ONLY(*w,) *x, *f;
+ WORKER("reading samples (sli:%lu[+" VES_ONLY(NUMBER "w:%lu+")
+ NUMBER "x:%lu]) from fd %d",
+ sizeof slice, VES_ONLY(n, sizeof *w,) n, t->ndim*sizeof *x, fd);
+
+#ifdef DIVONNE
+ if( slice.m > t->nframe ) {
+ FrameFree(t, Worker);
+ t->nframe = slice.m;
+ SHM_ONLY(t->shmid = slice.shmid;)
+ FrameAlloc(t, Worker);
+ }
+#endif
+
+ VES_ONLY(w = t->frame;)
+ x = t->frame + slice.m*NW;
+ f = x + slice.m*t->ndim;
+
+ SHM_ONLY(if( t->shmid != -1 ) {
+ VES_ONLY(w += slice.i;)
+ x += slice.i*t->ndim;
+ f += slice.i*t->ncomp;
+ }
+ else) {
+ VES_ONLY(readsock(fd, w, n*sizeof *w);)
+ readsock(fd, x, n*t->ndim*sizeof *x);
+ }
+
+ slice.n |= SampleRaw(t, n, x, f, core VES_ONLY(, w, slice.iter));
+ WORKER("writing samples (sli:%lu[+" NUMBER "f:%lu]) to fd %d",
+ sizeof slice, slice.n, t->ncomp*sizeof *f, fd);
+ writesock(fd, &slice, sizeof slice);
+ if( SHM_ONLY(t->shmid == -1 &&) slice.n != -1 )
+ writesock(fd, f, slice.n*t->ncomp*sizeof *f);
+ }
+#ifdef DIVONNE
+ else {
+ Samples *samples, psamples;
+ ExploreResult res;
+
+ WORKER("reading region (sli:%lu+sam:%lu+reg:%lu+tot:%lu) from fd %d",
+ sizeof slice, sizeof psamples, regionsize,
+ t->ncomp*sizeof(Totals), fd);
+ readsock(fd, &psamples, sizeof psamples);
+ readsock(fd, t->region, regionsize);
+ readsock(fd, totals, t->ncomp*sizeof(Totals));
+ t->nregions = 1;
+ t->neval = t->neval_opt = t->neval_cut = 0;
+
+ samples = &t->samples[RegionPtr(0)->isamples];
+ if( psamples.n != samples->n ) {
+ SamplesFree(samples);
+ *samples = psamples;
+ SamplesAlloc(t, samples);
+ }
+
+ res.retval = ExploreSerial(t, 0);
+ res.neval = t->neval;
+ res.neval_opt = t->neval_opt;
+ res.neval_cut = t->neval_cut;
+ res.nregions = t->nregions;
+ res.iregion = slice.i;
+ WORKER("writing regions (res:%lu+%dreg:%lu+tot:%lu) to fd %d",
+ sizeof res, t->nregions, regionsize,
+ t->ncomp*sizeof(Totals), fd);
+ writesock(fd, &res, sizeof res);
+ writesock(fd, t->region, t->nregions*regionsize);
+ writesock(fd, totals, t->ncomp*sizeof(Totals));
+ }
+#endif
+ } while( readsock(fd, &slice, sizeof slice) == sizeof slice &&
+ slice.n != -1 );
+
+ if( cubafun_.exitfun ) cubafun_.exitfun(cubafun_.exitarg, &core);
+
+#if defined DIVONNE || defined CUHRE
+ RuleFree(t);
+#endif
+
+ FrameFree(t, Worker);
+
+#ifdef DIVONNE
+ free(t->region);
+#endif
+ }
+
+ WORKER("worker wrapping up");
+}
+
+/*********************************************************************/
+
+static inline void ForkCores(This *t)
+{
+ dispatch d;
+ const fdpid *pfp;
+ int ncores, core;
+
+ DIV_ONLY(t->running = 0;)
+
+ d.worker = Worker;
+ d.thisptr = t;
+ d.thissize = sizeof *t;
+
+ if( t->spin == NULL ) {
+ SUFFIX(cubafork)(&t->spin);
+ if( t->spin == NULL ) return;
+ d.thissize = 0;
+ }
+
+ pfp = t->spin->fp;
+ ncores = t->spin->spec.ncores;
+ for( core = -t->spin->spec.naccel; core < ncores; ++core ) {
+ cint fd = pfp++->fd;
+ writesock(fd, &d, sizeof d);
+ if( d.thissize ) writesock(fd, t, d.thissize);
+ }
+}
+
+/*********************************************************************/
+
+static inline void WaitCores(This *t, Spin **pspin)
+{
+ if( Invalid(pspin) ) SUFFIX(cubawait)(&t->spin);
+ else {
+ Slice slice = { .n = -1 };
+ cint cores = t->spin->spec.naccel + t->spin->spec.ncores;
+ const fdpid *pfp = t->spin->fp;
+ int core;
+ for( core = 0; core < cores; ++core )
+ writesock(pfp[core].fd, &slice, sizeof slice);
+ *pspin = t->spin;
+ MasterExit();
+ }
+}
+
Index: trunk/cuba/src/common/MSample.c
===================================================================
--- trunk/cuba/src/common/MSample.c (revision 158)
+++ trunk/cuba/src/common/MSample.c (revision 159)
@@ -1,90 +1,90 @@
/*
MSample.c
the sampling routine for the
Mathematica versions of the Cuba routines
by Thomas Hahn
- last modified 19 Mar 12 th
+ last modified 13 Mar 15 th
*/
static void DoSample(This *t, cnumber n, real *x, real *f
VES_ONLY(, real *w, ccount iter))
{
real *mma_f;
- long mma_n;
+ int mma_n;
if( MLAbort ) longjmp(t->abort, -99);
MLPutFunction(stdlink, "EvaluatePacket", 1);
MLPutFunction(stdlink, "Cuba`" ROUTINE "`sample", 1 VES_ONLY(+2) DIV_ONLY(+1));
- MLPutRealList(stdlink, x, n*t->ndim);
- VES_ONLY(MLPutRealList(stdlink, w, n);
+ MLPutRealxList(stdlink, x, n*t->ndim);
+ VES_ONLY(MLPutRealxList(stdlink, w, n);
MLPutInteger(stdlink, iter);)
DIV_ONLY(MLPutInteger(stdlink, t->phase);)
MLEndPacket(stdlink);
MLNextPacket(stdlink);
- if( !MLGetRealList(stdlink, &mma_f, &mma_n) ) {
+ if( !MLGetRealxList(stdlink, &mma_f, &mma_n) ) {
MLClearError(stdlink);
MLNewPacket(stdlink);
longjmp(t->abort, -99);
}
t->neval += mma_n;
if( mma_n != n*t->ncomp ) {
- MLDisownRealList(stdlink, mma_f, mma_n);
+ MLReleaseRealxList(stdlink, mma_f, mma_n);
longjmp(t->abort, -3);
}
Copy(f, mma_f, n*t->ncomp);
- MLDisownRealList(stdlink, mma_f, mma_n);
+ MLReleaseRealxList(stdlink, mma_f, mma_n);
}
/*********************************************************************/
#ifdef DIVONNE
#define Explore ExploreSerial
static count SampleExtra(This *t, cBounds *b)
{
count n, nget;
real *mma_f;
- long mma_n;
+ int mma_n;
MLPutFunction(stdlink, "EvaluatePacket", 1);
MLPutFunction(stdlink, "Cuba`Divonne`findpeak", 2);
- MLPutRealList(stdlink, (real *)b, 2*t->ndim);
+ MLPutRealxList(stdlink, (real *)b, 2*t->ndim);
MLPutInteger(stdlink, t->phase);
MLEndPacket(stdlink);
MLNextPacket(stdlink);
- if( !MLGetRealList(stdlink, &mma_f, &mma_n) ) {
+ if( !MLGetRealxList(stdlink, &mma_f, &mma_n) ) {
MLClearError(stdlink);
MLNewPacket(stdlink);
longjmp(t->abort, -99);
}
t->neval += nget = mma_n/(t->ndim + t->ncomp);
n = IMin(nget, t->nextra);
if( n ) {
Copy(t->xextra, mma_f, n*t->ndim);
Copy(t->fextra, mma_f + nget*t->ndim, n*t->ncomp);
}
- MLDisownRealList(stdlink, mma_f, mma_n);
+ MLReleaseRealxList(stdlink, mma_f, mma_n);
return n;
}
#endif
/*********************************************************************/
#include "common.c"
#define ForkCores(t)
#define WaitCores(t)
#include "Integrate.c"
Index: trunk/cuba/src/common/Global.c
===================================================================
--- trunk/cuba/src/common/Global.c (revision 0)
+++ trunk/cuba/src/common/Global.c (revision 159)
@@ -0,0 +1,58 @@
+/*
+ Global.c
+ set global vars
+ by Thomas Hahn
+ last modified 21 Jul 14 th
+*/
+
+
+#include "stddecl.h"
+
+
+coreinit cubafun_;
+extern int cubaverb_;
+
+#ifdef HAVE_FORK
+extern corespec cubaworkers_;
+#endif
+
+
+Extern void SUFFIX(cubaverbose)(cint verb)
+{
+ cubaverb_ = verb;
+}
+
+/*********************************************************************/
+
+Extern void SUFFIX(cubacores)(cint n, cint p)
+{
+#ifdef HAVE_FORK
+ cubaworkers_.ncores = n;
+ cubaworkers_.pcores = p;
+#endif
+}
+
+Extern void SUFFIX(cubaaccel)(cint n, cint p)
+{
+#ifdef HAVE_FORK
+ cubaworkers_.naccel = n;
+ cubaworkers_.paccel = p;
+#endif
+}
+
+/*********************************************************************/
+
+Extern void SUFFIX(cubainit)(subroutine f, void *arg)
+{
+ cubafun_.initfun = f;
+ cubafun_.initarg = arg;
+}
+
+/*********************************************************************/
+
+Extern void SUFFIX(cubaexit)(subroutine f, void *arg)
+{
+ cubafun_.exitfun = f;
+ cubafun_.exitarg = arg;
+}
+
Index: trunk/cuba/src/common/Random.c
===================================================================
--- trunk/cuba/src/common/Random.c (revision 158)
+++ trunk/cuba/src/common/Random.c (revision 159)
@@ -1,345 +1,344 @@
/*
Random.c
quasi- and pseudo-random-number generation
- last modified 8 Jun 10 th
+ last modified 18 Mar 14 th
*/
/*
PART 1: Sobol quasi-random-number generator
adapted from ACM TOMS algorithm 659
*/
static void SobolGet(This *t, real *x)
{
number seq = t->rng.sobol.seq++;
count zerobit = 0, dim;
while( seq & 1 ) {
++zerobit;
seq >>= 1;
}
for( dim = 0; dim < t->ndim; ++dim ) {
t->rng.sobol.prev[dim] ^= t->rng.sobol.v[dim][zerobit];
x[dim] = t->rng.sobol.prev[dim]*t->rng.sobol.norm;
}
}
static void SobolSkip(This *t, number n)
{
while( n-- ) {
number seq = t->rng.sobol.seq++;
count zerobit = 0, dim;
while( seq & 1 ) {
++zerobit;
seq >>= 1;
}
for( dim = 0; dim < t->ndim; ++dim )
t->rng.sobol.prev[dim] ^= t->rng.sobol.v[dim][zerobit];
}
}
static inline void SobolIni(This *t)
{
static number ini[9*40] = {
3, 1, 0, 0, 0, 0, 0, 0, 0,
7, 1, 1, 0, 0, 0, 0, 0, 0,
11, 1, 3, 7, 0, 0, 0, 0, 0,
13, 1, 1, 5, 0, 0, 0, 0, 0,
19, 1, 3, 1, 1, 0, 0, 0, 0,
25, 1, 1, 3, 7, 0, 0, 0, 0,
37, 1, 3, 3, 9, 9, 0, 0, 0,
59, 1, 3, 7, 13, 3, 0, 0, 0,
47, 1, 1, 5, 11, 27, 0, 0, 0,
61, 1, 3, 5, 1, 15, 0, 0, 0,
55, 1, 1, 7, 3, 29, 0, 0, 0,
41, 1, 3, 7, 7, 21, 0, 0, 0,
67, 1, 1, 1, 9, 23, 37, 0, 0,
97, 1, 3, 3, 5, 19, 33, 0, 0,
91, 1, 1, 3, 13, 11, 7, 0, 0,
109, 1, 1, 7, 13, 25, 5, 0, 0,
103, 1, 3, 5, 11, 7, 11, 0, 0,
115, 1, 1, 1, 3, 13, 39, 0, 0,
131, 1, 3, 1, 15, 17, 63, 13, 0,
193, 1, 1, 5, 5, 1, 27, 33, 0,
137, 1, 3, 3, 3, 25, 17, 115, 0,
145, 1, 1, 3, 15, 29, 15, 41, 0,
143, 1, 3, 1, 7, 3, 23, 79, 0,
241, 1, 3, 7, 9, 31, 29, 17, 0,
157, 1, 1, 5, 13, 11, 3, 29, 0,
185, 1, 3, 1, 9, 5, 21, 119, 0,
167, 1, 1, 3, 1, 23, 13, 75, 0,
229, 1, 3, 3, 11, 27, 31, 73, 0,
171, 1, 1, 7, 7, 19, 25, 105, 0,
213, 1, 3, 5, 5, 21, 9, 7, 0,
191, 1, 1, 1, 15, 5, 49, 59, 0,
253, 1, 1, 1, 1, 1, 33, 65, 0,
203, 1, 3, 5, 15, 17, 19, 21, 0,
211, 1, 1, 7, 11, 13, 29, 3, 0,
239, 1, 3, 7, 5, 7, 11, 113, 0,
247, 1, 1, 5, 3, 15, 19, 61, 0,
285, 1, 3, 1, 1, 9, 27, 89, 7,
369, 1, 1, 3, 7, 31, 15, 45, 23,
299, 1, 3, 3, 9, 9, 25, 107, 39 };
count dim, bit, nbits;
- number max, *pini = ini;
- cnumber nmax = 2*t->maxeval;
+ number *pini = ini, max;
- for( nbits = 0, max = 1; max <= nmax; max <<= 1 ) ++nbits;
- t->rng.sobol.norm = 1./max;
+ for( nbits = 0, max = t->maxeval; max; max >>= 1 ) ++nbits;
+ t->rng.sobol.norm = ldexp(.5, -nbits);
- for( bit = 0; bit < nbits; ++bit )
- t->rng.sobol.v[0][bit] = (max >>= 1);
+ for( bit = 0; bit <= nbits; ++bit )
+ t->rng.sobol.v[0][bit] = (number)1 << (nbits - bit);
for( dim = 1; dim < t->ndim; ++dim ) {
number *pv = t->rng.sobol.v[dim], *pvv = pv;
number powers = *pini++, j;
int inibits = -1, bit;
for( j = powers; j; j >>= 1 ) ++inibits;
- memcpy(pv, pini, inibits*sizeof(*pini));
+ memcpy(pv, pini, inibits*sizeof *pini);
pini += 8;
- for( bit = inibits; bit < nbits; ++bit ) {
+ for( bit = inibits; bit <= nbits; ++bit ) {
number newv = *pvv, j = powers;
int b;
for( b = 0; b < inibits; ++b ) {
if( j & 1 ) newv ^= pvv[b] << (inibits - b);
j >>= 1;
}
pvv[inibits] = newv;
++pvv;
}
- for( bit = 0; bit < nbits - 1; ++bit )
- pv[bit] <<= nbits - bit - 1;
+ for( bit = 0; bit < nbits; ++bit )
+ pv[bit] <<= nbits - bit;
}
t->rng.sobol.seq = 0;
- VecClear(t->rng.sobol.prev);
+ XClear(t->rng.sobol.prev);
t->rng.getrandom = SobolGet;
t->rng.skiprandom = SobolSkip;
}
/*
PART 2: Mersenne Twister pseudo-random-number generator
adapted from T. Nishimura's and M. Matsumoto's C code at
http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html
*/
/* 32 or 53 random bits */
#define RANDOM_BITS 32
static inline state_t Twist(state_t a, state_t b)
{
state_t mixbits = (a & 0x80000000) | (b & 0x7fffffff);
state_t matrixA = (-(b & 1)) & 0x9908b0df;
return (mixbits >> 1) ^ matrixA;
}
static inline void MersenneReload(state_t *state)
{
state_t *s = state;
int j;
for( j = MERSENNE_N - MERSENNE_M + 1; --j; ++s )
*s = s[MERSENNE_M] ^ Twist(s[0], s[1]);
for( j = MERSENNE_M; --j; ++s )
*s = s[MERSENNE_M - MERSENNE_N] ^ Twist(s[0], s[1]);
*s = s[MERSENNE_M - MERSENNE_N] ^ Twist(s[0], state[0]);
}
static inline state_t MersenneInt(state_t s)
{
s ^= s >> 11;
s ^= (s << 7) & 0x9d2c5680;
s ^= (s << 15) & 0xefc60000;
return s ^ (s >> 18);
}
static void MersenneGet(This *t, real *x)
{
count next = t->rng.mersenne.next, dim;
for( dim = 0; dim < t->ndim; ++dim ) {
#if RANDOM_BITS == 53
state_t a, b;
#endif
if( next >= MERSENNE_N ) {
MersenneReload(t->rng.mersenne.state);
next = 0;
}
#if RANDOM_BITS == 53
a = MersenneInt(t->rng.mersenne.state[next++]) >> 5;
b = MersenneInt(t->rng.mersenne.state[next++]) >> 6;
x[dim] = (67108864.*a + b)/9007199254740992.;
#else
x[dim] = MersenneInt(t->rng.mersenne.state[next++])/4294967296.;
#endif
}
t->rng.mersenne.next = next;
}
static void MersenneSkip(This *t, number n)
{
#if RANDOM_BITS == 53
n = 2*n*t->ndim + t->rng.mersenne.next;
#else
n = n*t->ndim + t->rng.mersenne.next;
#endif
t->rng.mersenne.next = n % MERSENNE_N;
n /= MERSENNE_N;
while( n-- ) MersenneReload(t->rng.mersenne.state);
}
static inline void MersenneIni(This *t)
{
state_t seed = t->seed;
state_t *next = t->rng.mersenne.state;
count j;
for( j = 1; j <= MERSENNE_N; ++j ) {
*next++ = seed;
seed = 0x6c078965*(seed ^ (seed >> 30)) + j;
/* see Knuth TAOCP Vol 2, 3rd Ed, p. 106 for multiplier */
}
MersenneReload(t->rng.mersenne.state);
t->rng.mersenne.next = 0;
t->rng.getrandom = MersenneGet;
t->rng.skiprandom = MersenneSkip;
}
/*
PART 3: Ranlux subtract-and-borrow random-number generator
proposed by Marsaglia and Zaman, implemented by F. James with
the name RCARRY in 1991, and later improved by Martin Luescher
in 1993 to produce "Luxury Pseudorandom Numbers".
Adapted from the CERNlib Fortran 77 code by F. James, 1993.
The available luxury levels are:
level 0 (p = 24): equivalent to the original RCARRY of Marsaglia
and Zaman, very long period, but fails many tests.
level 1 (p = 48): considerable improvement in quality over level 0,
now passes the gap test, but still fails spectral test.
level 2 (p = 97): passes all known tests, but theoretically still
defective.
level 3 (p = 223): DEFAULT VALUE. Any theoretically possible
correlations have very small chance of being observed.
level 4 (p = 389): highest possible luxury, all 24 bits chaotic.
*/
static inline int RanluxInt(This *t, count n)
{
int s = 0;
while( n-- ) {
s = t->rng.ranlux.state[t->rng.ranlux.j24] -
t->rng.ranlux.state[t->rng.ranlux.i24] + t->rng.ranlux.carry;
s += (t->rng.ranlux.carry = NegQ(s)) & (1 << 24);
t->rng.ranlux.state[t->rng.ranlux.i24] = s;
--t->rng.ranlux.i24;
t->rng.ranlux.i24 += NegQ(t->rng.ranlux.i24) & 24;
--t->rng.ranlux.j24;
t->rng.ranlux.j24 += NegQ(t->rng.ranlux.j24) & 24;
}
return s;
}
static void RanluxGet(This *t, real *x)
{
/* The Generator proper: "Subtract-with-borrow",
as proposed by Marsaglia and Zaman, FSU, March 1989 */
count dim;
for( dim = 0; dim < t->ndim; ++dim ) {
cint nskip = (--t->rng.ranlux.n24 >= 0) ? 0 :
(t->rng.ranlux.n24 = 24, t->rng.ranlux.nskip);
cint s = RanluxInt(t, 1 + nskip);
- x[dim] = s*0x1p-24;
+ x[dim] = ldexp(s, -24);
/* small numbers (with less than 12 significant bits) are "padded" */
if( s < (1 << 12) )
- x[dim] += t->rng.ranlux.state[t->rng.ranlux.j24]*0x1p-48;
+ x[dim] += ldexp(t->rng.ranlux.state[t->rng.ranlux.j24], -48);
}
}
static void RanluxSkip(This *t, cnumber n)
{
RanluxInt(t, n + t->rng.ranlux.nskip*(n/24));
t->rng.ranlux.n24 = 24 - n % 24;
}
static inline void RanluxIni(This *t)
{
cint skip[] = {24, 48, 97, 223, 389,
223, 223, 223, 223, 223, 223, 223, 223, 223, 223,
223, 223, 223, 223, 223, 223, 223, 223, 223, 223};
- state_t seed = t->seed;
- state_t level = RNG;
+ int seed = t->seed;
+ int level = RNG;
count i;
- if( level < sizeof skip ) level = skip[level];
+ if( level < Elements(skip) ) level = skip[level];
t->rng.ranlux.nskip = level - 24;
t->rng.ranlux.i24 = 23;
t->rng.ranlux.j24 = 9;
t->rng.ranlux.n24 = 24;
for( i = 0; i < 24; ++i ) {
cint k = seed/53668;
seed = 40014*(seed - k*53668) - k*12211;
seed += NegQ(seed) & 2147483563;
t->rng.ranlux.state[i] = seed & ((1 << 24) - 1);
}
t->rng.ranlux.carry = ~TrueQ(t->rng.ranlux.state[23]) & (1 << 24);
t->rng.getrandom = RanluxGet;
t->rng.skiprandom = RanluxSkip;
}
/*
PART 4: User routines:
- IniRandom sets up the random-number generator to produce a
sequence of at least n ndim-dimensional random vectors.
- GetRandom retrieves one random vector.
- SkipRandom skips over n random vectors.
*/
static inline void IniRandom(This *t)
{
if( t->seed == 0 ) SobolIni(t);
else if( RNG == 0 ) MersenneIni(t);
else RanluxIni(t);
}
Index: trunk/cuba/src/common/Fork.c
===================================================================
--- trunk/cuba/src/common/Fork.c (revision 158)
+++ trunk/cuba/src/common/Fork.c (revision 159)
@@ -1,406 +1,164 @@
/*
Fork.c
- the parallel sampling routine
- for the C versions of the Cuba routines
+ fork the cores for parallel sampling
+ (C version only)
by Thomas Hahn
- last modified 6 Sep 12 th
+ last modified 23 Apr 15 th
*/
-#define MINSLICE 10
-#define MINCORES 1
-//#define MINCORES 2
-
-typedef struct {
- number n, m, i;
- VES_ONLY(count iter;)
- DIV_ONLY(int phase SHM_ONLY(, shmid);)
-} Slice;
-
-workerini cubaini;
-#if defined(HAVE_SHMGET) && (defined(SUAVE) || defined(DIVONNE))
-#define FRAMECOPY
-#endif
+#define ROUTINE "cubafork"
+#include "stddecl.h"
-#ifdef DEBUG
-#define TERM_RED "\e[31m"
-#define TERM_BLUE "\e[34m"
-#define TERM_RESET "\e[0m\n"
-#define MASTER(s, ...) \
-fprintf(stderr, TERM_RED ROUTINE " master: " s TERM_RESET, __VA_ARGS__)
-#define WORKER(s, ...) \
-fprintf(stderr, TERM_BLUE ROUTINE " worker: " s TERM_RESET, __VA_ARGS__)
-#else
-#define MASTER(s, ...)
-#define WORKER(s, ...)
-#endif
+#ifdef HAVE_FORK
-/*********************************************************************/
+#include "sock.h"
-#ifndef MSG_WAITALL
-/* Windows */
-#define MSG_WAITALL 0
-#endif
+#define MINCORES 1
-static inline int readsock(int fd, void *data, size_t n)
-{
- ssize_t got;
- size_t remain = n;
- do got = recv(fd, data, remain, MSG_WAITALL);
- while( got > 0 && (data += got, remain -= got) > 0 );
- return got;
-}
-
-static inline int writesock(int fd, const void *data, size_t n)
-{
- ssize_t got;
- size_t remain = n;
- do got = send(fd, data, remain, MSG_WAITALL);
- while( got > 0 && (data += got, remain -= got) > 0 );
- return got;
-}
+coreinit cubafun_;
+extern int cubaverb_;
+extern corespec cubaworkers_;
/*********************************************************************/
-static void DoSample(This *t, number n, creal *x, real *f
- VES_ONLY(, creal *w, ccount iter))
+static inline void Child(cint fd, cint core)
{
- cint ncores = IMin(t->ncores, n/MINSLICE);
-
- if( ncores < MINCORES ) DoSampleSerial(t, n, x, f VES_ONLY(, w, iter));
- else {
- Slice slice;
- int core, abort;
- char s[128];
-
- t->neval += n;
-
- slice.m = slice.n = (n + ncores - 1)/ncores;
- if( VERBOSE > 2 ) {
- sprintf(s, "sampling " NUMBER " points each on %d cores",
- slice.n, ncores);
- Print(s);
- }
-
- slice.i = 0;
- VES_ONLY(slice.iter = iter;)
- DIV_ONLY(slice.phase = t->phase;)
-
-#ifdef DIVONNE
- if( n > t->nframe ) {
- FrameFree(t, ShmRm(t));
- t->nframe = n;
- FrameAlloc(t);
- }
- SHM_ONLY(slice.shmid = t->shmid;)
-#endif
-
- SHM_ONLY(if( t->shmid != -1 ) {
- slice.m = n;
-#ifdef FRAMECOPY
- VES_ONLY(Copy(t->frame, w, n);)
- Copy(t->frame + n*NW, x, n*t->ndim);
-#endif
- })
-
- for( core = 0; core < ncores; ++core ) {
- cint fd = t->child[core];
- MASTER("sending " NUMBER " samples to core %d fd %d",
- slice.n, core, fd);
- writesock(fd, &slice, sizeof slice);
- SHM_ONLY(if( t->shmid == -1 )) {
- VES_ONLY(writesock(fd, w, slice.n*sizeof *w);
- w += slice.n;)
- writesock(fd, x, slice.n*t->ndim*sizeof *x);
- x += slice.n*t->ndim;
- }
- slice.i += slice.n;
- n -= slice.n;
- slice.n = IMin(slice.n, n);
- }
+ dispatch d;
- abort = 0;
- for( core = ncores; --core >= 0; ) {
- cint fd = t->child[core];
- MASTER("reading from core %d fd %d", core, fd);
- readsock(fd, &slice, sizeof slice);
- MASTER("reading " NUMBER " samples from core %d fd %d",
- slice.n, core, fd);
- if( slice.n == -1 ) abort = 1;
- else SHM_ONLY(if( t->shmid == -1 )) readsock(fd,
- f + slice.i*t->ncomp, slice.n*t->ncomp*sizeof *f);
+ while( readsock(fd, &d, sizeof d) == sizeof d ) {
+ if( d.thissize ) {
+ MemAlloc(d.thisptr, d.thissize);
+ WORKER("reading This (%lu)", d.thissize);
+ readsock(fd, d.thisptr, d.thissize);
}
- if( abort ) longjmp(t->abort, -99);
-
-#ifdef FRAMECOPY
- if( t->shmid != -1 )
- Copy(f, t->frame + slice.m*(NW + t->ndim), slice.m*t->ncomp);
-#endif
+ WORKER("running %p on fd %d", d.thisptr, fd);
+ d.worker(d.thisptr, d.thissize, core, fd);
+ if( d.thissize ) free(d.thisptr);
}
}
/*********************************************************************/
-#ifdef DIVONNE
-
-static inline int ReadyCore(cThis *t)
+Extern void SUFFIX(cubafork)(Spin **pspin)
{
- int core;
- fd_set ready;
-
- memcpy(&ready, &t->children, sizeof ready);
- select(t->nchildren, &ready, NULL, NULL, NULL);
-
- for( core = 0; core < t->ncores; ++core )
- if( FD_ISSET(t->child[core], &ready) ) break;
-
- return core;
-}
-
-/*********************************************************************/
+ char out[128];
+ int cores, core;
+ fdpid *pfp;
+ Spin *spin;
-typedef struct {
- number neval, neval_opt, neval_cut;
- count nregions, iregion, retval;
-} ExploreResult;
-
-static int Explore(This *t, cint iregion)
-{
- TYPEDEFREGION;
- Region *region;
- int ireg = iregion, core = t->running;
-
- if( t->ncores < MINCORES ) return ExploreSerial(t, iregion);
-
- if( t->running >= ((iregion < 0) ? 1 : t->ncores) ) {
- Totals totals[t->ncomp];
- cint fd = t->child[core = ReadyCore(t)];
- ExploreResult res;
- count comp, succ;
-
- --t->running;
- readsock(fd, &res, sizeof res);
- ireg = res.iregion;
- region = RegionPtr(ireg);
- succ = ireg + region->next;
- readsock(fd, region, sizeof(Region));
- if( --res.nregions > 0 ) {
- region->next = t->nregions - ireg;
- EnlargeRegions(t, res.nregions);
- readsock(fd, RegionPtr(t->nregions), res.nregions*sizeof(Region));
- t->nregions += res.nregions;
- RegionPtr(t->nregions-1)->next = succ - t->nregions + 1;
- }
+ VerboseInit();
- readsock(fd, totals, sizeof totals);
- for( comp = 0; comp < t->ncomp; ++comp )
- t->totals[comp].secondspread =
- Max(t->totals[comp].secondspread, totals[comp].secondspread);
-
- t->neval += res.neval;
- t->neval_opt += res.neval_opt;
- t->neval_cut += res.neval_cut;
-
- if( res.retval == -1 ) return -1;
- }
-
- if( iregion >= 0 ) {
- Slice slice;
- cint fd = t->child[core];
- slice.n = 0;
- slice.i = iregion;
- slice.phase = t->phase;
- region = RegionPtr(iregion);
- writesock(fd, &slice, sizeof slice);
- writesock(fd, &t->samples[region->isamples], sizeof(Samples));
- writesock(fd, region, sizeof *region);
- writesock(fd, t->totals, sizeof *t->totals);
- region->depth = 0;
- ++t->running;
- }
-
- return ireg;
-}
-#endif
-
-/*********************************************************************/
-
-static void DoChild(This *t, cint fd)
-{
- Slice slice;
+ EnvInit(cubaworkers_.paccel, "CUBAACCELMAX", 1000);
+ EnvInit(cubaworkers_.pcores, "CUBACORESMAX", 10000);
+ EnvInit(cubaworkers_.naccel, "CUBAACCEL", 0);
+ EnvInit(cubaworkers_.ncores, "CUBACORES", -sysconf(_SC_NPROCESSORS_ONLN));
-#ifdef DIVONNE
- TYPEDEFREGION;
- Totals totals[t->ncomp];
- ExploreResult res;
-
- t->totals = totals;
- t->ncores = 0; /* no recursive forks */
- AllocRegions(t);
- SamplesIni(&t->samples[0]);
- t->samples[0].n = 0;
- SamplesIni(&t->samples[1]);
- t->samples[1].n = 0;
- SamplesIni(&t->samples[2]);
- t->samples[2].n = 0;
-#endif
-
-#ifdef SUAVE
- SHM_ONLY(if( t->shmid == -1 ))
- MemAlloc(t->frame, t->nframe*SAMPLESIZE);
-#endif
-
- if( cubaini.initfun ) cubaini.initfun(cubaini.initarg);
-
- while( readsock(fd, &slice, sizeof slice) ) {
- number n = slice.n;
- DIV_ONLY(t->phase = slice.phase;)
- if( n > 0 ) {
- real VES_ONLY(*w,) *x, *f;
- WORKER("read " NUMBER " samples from fd %d", n, fd);
-
-#ifdef DIVONNE
- if( n > t->nframe ) {
- FrameFree(t);
- t->nframe = n;
- SHM_ONLY(t->shmid = slice.shmid; ShmMap(t) else)
- MemAlloc(t->frame, t->nframe*SAMPLESIZE);
- }
-#endif
-
- VES_ONLY(w = t->frame;)
- x = t->frame + slice.m*NW;
- f = x + slice.m*t->ndim;
-
- SHM_ONLY(if( t->shmid != -1 ) {
- VES_ONLY(w += slice.i;)
- x += slice.i*t->ndim;
- f += slice.i*t->ncomp;
- }
- else) {
- VES_ONLY(readsock(fd, w, n*sizeof *w);)
- readsock(fd, x, n*t->ndim*sizeof *x);
- }
-
- slice.n |= SampleRaw(t, n, x, f VES_ONLY(, w, slice.iter));
- WORKER("writing " NUMBER " samples to fd %d", n, fd);
- writesock(fd, &slice, sizeof slice);
- if( SHM_ONLY(t->shmid == -1 &&) slice.n != -1 )
- writesock(fd, f, slice.n*t->ncomp*sizeof *f);
- }
-#ifdef DIVONNE
- else {
- Samples *samples, psamples;
-
- readsock(fd, &psamples, sizeof psamples);
- readsock(fd, RegionPtr(0), sizeof(Region));
- readsock(fd, totals, sizeof totals);
- t->nregions = 1;
- t->neval = t->neval_opt = t->neval_cut = 0;
-
- WORKER("read 1 region from fd %d", fd);
-
- samples = &t->samples[RegionPtr(0)->isamples];
- if( psamples.n != samples->n ) {
- SamplesFree(samples);
- *samples = psamples;
- SamplesAlloc(t, samples);
- }
-
- res.retval = ExploreSerial(t, 0);
- res.neval = t->neval;
- res.neval_opt = t->neval_opt;
- res.neval_cut = t->neval_cut;
- res.nregions = t->nregions;
- res.iregion = slice.i;
- WORKER("writing %d regions to fd %d", res.nregions, fd);
- writesock(fd, &res, sizeof res);
- writesock(fd, RegionPtr(0), t->nregions*sizeof(Region));
- writesock(fd, totals, sizeof totals);
+#ifdef HAVE_GETLOADAVG
+ if( cubaworkers_.ncores < 0 ) {
+ static int load = uninitialized;
+ if( load == uninitialized ) {
+ double loadavg;
+ getloadavg(&loadavg, 1);
+ load = floor(loadavg);
}
-#endif
+ cubaworkers_.ncores = IMax(-cubaworkers_.ncores - load, 0);
}
-
- if( cubaini.exitfun ) cubaini.exitfun(cubaini.exitarg);
-
- exit(0);
-}
-
-/*********************************************************************/
-
-#ifdef HAVE_GETLOADAVG
-double cubaloadavg_;
+#else
+ cubaworkers_.ncores = abs(cubaworkers_.ncores);
#endif
-static inline void ForkCores(This *t)
-{
- int core;
- char s[128];
- cchar *env = getenv("CUBACORES");
-
- t->ncores = env ? atoi(env) : sysconf(_SC_NPROCESSORS_ONLN);
-#ifdef HAVE_GETLOADAVG
- if( env == NULL || t->ncores < 0 ) {
- if( cubaloadavg_ < 0 ) getloadavg(&cubaloadavg_, 1);
- t->ncores = abs(t->ncores) - floor(cubaloadavg_);
+ cores = cubaworkers_.naccel + cubaworkers_.ncores;
+ if( cores < MINCORES ) {
+ *pspin = NULL;
+ return;
}
-#endif
-
- DIV_ONLY(t->nchildren = t->running = 0;)
- if( t->ncores < MINCORES ) return;
- if( VERBOSE ) {
- sprintf(s, "using %d cores via "
+ if( cubaverb_ ) {
+ sprintf(out, "using %d cores %d accelerators via "
#ifdef HAVE_SHMGET
"shared memory",
#else
"pipes",
#endif
- t->ncores);
- Print(s);
+ cubaworkers_.ncores, cubaworkers_.naccel);
+ Print(out);
}
fflush(NULL); /* make sure all buffers are flushed,
or else buffered content will be written
out multiply, at each child's exit(0) */
- Alloc(t->child, t->ncores);
- for( core = 0; core < t->ncores; ++core ) {
+ MemAlloc(spin, sizeof *spin + cores*sizeof *spin->fp);
+ spin->spec = cubaworkers_;
+ pfp = spin->fp;
+ for( core = -spin->spec.naccel; core < spin->spec.ncores; ++core ) {
int fd[2];
pid_t pid;
assert(
socketpair(AF_LOCAL, SOCK_STREAM, 0, fd) != -1 &&
(pid = fork()) != -1 );
if( pid == 0 ) {
close(fd[0]);
- DoChild(t, fd[1]);
+ free(spin);
+ Child(fd[1], core);
+ exit(0);
}
- MASTER("forked core %d pid %d pipe %d(master) -> %d(worker)",
- core, pid, fd[0], fd[1]);
+ MASTER("forked pid %d pipe %d(master) -> %d(worker)",
+ pid, fd[0], fd[1]);
close(fd[1]);
- t->child[core] = fd[0];
- DIV_ONLY(FD_SET(fd[0], &t->children);
- t->nchildren = IMax(t->nchildren, fd[0] + 1);)
+ pfp->fd = fd[0];
+ pfp->pid = pid;
+ ++pfp;
}
+
+ *pspin = spin;
}
/*********************************************************************/
-static inline void WaitCores(cThis *t)
+Extern void SUFFIX(cubawait)(Spin **pspin)
{
- if( t->ncores >= MINCORES ) {
- int core;
- pid_t pid;
- for( core = 0; core < t->ncores; ++core ) {
- MASTER("closing core %d fd %d", core, t->child[core]);
- close(t->child[core]);
- }
- free(t->child);
- for( core = 0; core < t->ncores; ++core ) {
- MASTER("waiting for core %d", core);
- wait(&pid);
- MASTER("core %d pid %d terminated", core, pid);
- }
+ int cores, core, status;
+ Spin *spin;
+
+ MasterExit();
+
+ if( Invalid(pspin) || (spin = *pspin) == NULL ) return;
+
+ cores = spin->spec.naccel + spin->spec.ncores;
+
+ for( core = 0; core < cores; ++core ) {
+ MASTER("closing fd %d", spin->fp[core].fd);
+ close(spin->fp[core].fd);
+ }
+
+#ifdef KILL_WORKERS
+ for( core = 0; core < cores; ++core ) {
+ MASTER("killing pid %d", spin->fp[core].pid);
+ kill(spin->fp[core].pid, SIGKILL);
+ }
+#endif
+
+ for( core = 0; core < cores; ++core ) {
+ DEB_ONLY(pid_t pid;)
+ MASTER("waiting for child");
+ DEB_ONLY(pid =) wait(&status);
+ MASTER("pid %d terminated with exit code %d", pid, status);
}
+
+ free(spin);
+ *pspin = NULL;
}
+#else
+
+Extern void SUFFIX(cubafork)(Spin **pspin) {}
+
+Extern void SUFFIX(cubawait)(Spin **pspin)
+{
+ MasterExit();
+}
+
+#endif
+
Index: trunk/cuba/ChangeLog
===================================================================
--- trunk/cuba/ChangeLog (revision 158)
+++ trunk/cuba/ChangeLog (revision 159)
@@ -1,334 +1,593 @@
+7 May 15:
+
+- Fixed sign error in Cuhre's Rule.c (copy-&-paste error from
+ higher-precision weights in degree-9 rule).
+
+
+31 Mar 15:
+
+- Version 4.2: Added flag for resetting the state even if a state
+ file is available in Vegas (Bit 5 of 'flags'). Together with
+ Bit 4 (retain state file) the grid adapted for one integrand
+ can be re-used on another integrand.
+
+- Added --with-real=10 and --with-real=16 configuration options
+ for higher-precision versions of Cuba.
+
+
+26 Nov 14:
+
+- Divonne now applies Flatten to the Given list, hence either
+ a list of coordinates (as before) or a list of points can be
+ given.
+
+- Tweaked MathLink code for compatibility with older Mathematica
+ versions.
+
+
+25 Nov 14:
+
+- Version 4.1: Added 'ninsuf' argument to Suave.
+ When computing the integral value of a subregion, samples from a
+ former pass contribute only of their number is larger than ninsuf.
+ Increasing ninsuf may reduce jumps in the chi^2 value.
+
+
+25 Nov 14:
+
+- Fixed subtle bug in Cuhre which could lead to longer run times
+ than in versions 1 and 2.
+
+- Fixed miscounting of degrees of freedom in rare cases in Suave.
+
+
+9 Oct 14:
+
+- Divonne now passes the userdata argument to the peakfinder
+ function, too.
+
+
+27 Aug 14:
+
+- Fixed problem due to which CUBACORESMAX was effectively ignored.
+
+- Fixed issues with MathLink compile for Mathematica 10.
+
+
+15 Aug 14:
+
+- Version 4.0: distinguishes Accelerators (GPUs) and Cores.
+ New distribution strategy (see manual), e.g. can now prescribe
+ maximum number of points per core, necessary for accelerators,
+ allows for load-levelling on cores.
+
+- No. of cores/accelerators and max. points per core/accel
+ can be set with environment variables
+ CUBACORES (as before) and CUBACORESMAX (or API call cubacores),
+ CUBAACCEL and CUBAACCELMAX (or API call cubaaccel).
+ API calls generally supersede the environment.
+
+- Can choose minimum verbosity level via environment variable
+ CUBAVERBOSE = 0..3 (or API call cubaverbose).
+
+- Can start cores/accels explicitly via cubafork/cubawait calls,
+ or have the integrator keep them running at exit.
+
+
+18 Apr 14:
+
+- Fixed uninitialized variable in update of Apr 11 that could lead
+ to a potential segfault in Divonne.
+
+
+11 Apr 14:
+
+- Added invocation of worker init/exit functions also for the master
+ whenever the number of samples is too small to be distributed.
+
+
+21 Mar 14:
+
+- Fixed glitch in Sobol quasi-random numbers for the long long int
+ versions introduced in the last update (forgotten typecast).
+
+
+18 Mar 14:
+
+- Fixed infinite loop in Sobol quasi-random numbers for maxeval
+ values >~ 2^30 (32-bit versions) or 2^62 (64-bit 'll' versions).
+
+
+22 Jan 14:
+
+- Removed 'Chop' from the Mathematica sampling procedure, which would
+ introduce an absolute lower scale for integrals quite close to zero.
+
+
+8 Jan 14:
+
+- Restricted detection of Qt to version 4.
+
+
+18 Dec 13:
+
+- Minor fixes in the MacOS build of partview (thanks to Hong Xu).
+
+
+11 Dec 13:
+
+- Version 3.3: Added new argument 'nvec' to let the integrand
+ function have more than one point at a time, e.g. to take advantage
+ of vectorization.
+
+
+5 Nov 13:
+
+- Fixed MathLink compilation issues with MacOS 10.9/clang++.
+
+- Fixed spurious warning in partview.
+
+
+25 Sep 13:
+
+- Fixed issue with distribution of points to cores. Because of
+ rounding up the number of points for each core it could happen
+ that the last one got nothing and kept waiting indefinitely.
+
+- Fixed bug in shared memory allocation of Divonne.
+
+- Added Korobov tables for Divonne extending the integration
+ dimension up to 257.
+
+
+17 Sep 13:
+
+- More compliance: Repaired some compiler hiccups.
+
+
+7 Aug 13:
+
+- Version 3.2: Moved all variable-size arrays to alloca and
+ cleaned up other bits that would lead to compiler warnings
+ on select systems.
+
+- Cuba now compiles with clang and icc (and even C89 compilers).
+
+- Fixed bug in chi-square determination in Cuhre introduced in 3.1.
+
+- Fixed bug in Ranlux for luxury level > 24.
+
+
+6 Jun 13:
+
+- Fixed segfault in repeated invocation of Divonne.
+
+
+4 May 13:
+
+- Version 3.1: Added check-pointing (state file) for Suave,
+ Divonne, Cuhre, too. Implementation by B. Chokoufe.
+
+- The Suave, Divonne, and Cuhre API calls have changed w.r.t.
+ Version 3.0 ('statefile' argument added).
+
+- Improved handling of infinities by Divonne.
+
+
+28 Mar 13:
+
+- Fixed segfault in parallel Divonne for integration rules
+ (key = 7, 9, 11, 13).
+
+
+25 Mar 13:
+
+- Fixed segfault in parallel Divonne for non-Korobov random numbers.
+
+
+9 Jan 13:
+
+- Fixed bug for parallel Divonne, the 'children' fd_set was not
+ properly initialized.
+
+
+21 Dec 12:
+
+- Fixed bug for parallel Divonne and ncomp > 1.
+ (Workers transmitted only partial results and thus the master
+ waited indefinitely for data.)
+
+
+27 Nov 12:
+
+- Fixed bug when running Divonne with ngiven != 0 and CUBACORES > 1.
+
+
+6 Sep 12:
+
+- Added functions for (de)initialization of worker processes
+ (e.g. close file descriptors before exit).
+
+
+3 Jul 12:
+
+- Added fflush(NULL) before fork to avoid multiple write-out
+ of buffered content at child's exit(0).
+
+
+17 Apr 12:
+
+- Added 'keep state file' flag (bit 5) to not remove the state
+ file in Vegas even if the integration terminated normally.
+
+
+19 Mar 12:
+
+- Fixed two bugs in MathLink interfacing, obvious oversight from
+ last release.
+
+
+16 Feb 12:
+
+- Added shared memory communication for the processes running
+ in parallel.
+
+
+24 Nov 11:
+
+- Significantly rearranged Divonne, e.g. unrolled the recursion
+ on regions, for better parallelizability.
+
+- Improved parallelization through DoSample.
+
+- Automatic detection and usage of the free cores on a machine,
+ or else set CUBACORES to the number of cores one wishes to
+ utilize, with negative numbers meaning "up to" depending on
+ availability (e.g. -2 means "use up to two free cores").
+
+
+12 Aug 11:
+
+- Version 3.0: Added parallelization, currently 'only' through
+ the DoSample routine. Uses fork/wait so integrands do not have
+ to be reentrant.
+
+ Specify number of cores in environment variable CUBACORES.
+ C/C++/Fortran only, Mathematica users need to replace MapSample
+ by ParallelMap or similar (as before).
+
+
18 Jun 11:
- Fixed problem with inner integration bounds depending on outer
ones in the MathLink executables.
15 Feb 11:
- Moved partview to Qt 4.
- Rectified error reporting via longjmp, in particular avoiding
sending $Failed twice in MathLink which would upset the
following communications.
13 Sep 10:
- Added iteration number to integrand's optional parameters
(Vegas and Suave).
- Fixed initialization problem when using state file in Vegas.
- Added tests for MathLink to configure.
20 Jul 10:
- Fixed severe bug in divonne/Split.c (wrong sign in SignedDelta
macro).
14 Jul 10:
- Disabled optimization for gcc 4.2.x and 4.4.3, which would lead
to an Internal Compiler Error when compiling Cuba, see
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40237
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42956
21 Jun 10:
- Fixed problem with bashy syntax in tools/mcc.
8 Jun 10:
- All Cuba functions now reentrant, except for gridptr_ and griddim_
in Vegas, which are intentionally preserved across calls.
19 May 10:
- Version 2.0: Changed invocations.
- Added void *userdata to be passed to integrator.
- Promoted integrand to int function, has to return 0 if successful,
otherwise integrator terminates immediately.
- Moved all global variables (common blocks) to argument list.
12 Feb 10:
- Added Ranlux pseudo-random number generator.
Luxury level 0 (mis)used for Mersenne Twister branch
(but observe that Luxury level 24 = Luxury level 0).
- Changed external variable mersenneseed to
struct { unsigned int level, seed; } cubarandom;
22 Jul 09:
- Fixed potential segfault in Split.c of Divonne, thanks to
Andreas v. Manteuffel.
29 May 09:
- Added flushing of grids in Vegas through a negative grid number.
25 May 09:
- Removed explicit pointer reference from reallocatable
"region_" array.
8 May 09:
- Improved memory handling in Divonne.
8 Apr 09:
- Version 1.6: Improved memory handling in Cuhre.
Thanks to Valery Yundin for pointing out the problem.
6 Mar 09:
- Fixed segfault in Divonne if all samples from a region returned NaN.
- Reinstated fcc to fix static linkage problem with mcc 7.
10 Feb 09:
- Removed dependence on fcc script.
19 Jan 09:
- Added missing #include <stdlib.h> to partview.cpp.
15 Jan 09:
- Fixed problem with MathLink compilation for Mathematica 7.
5 Dec 08
- Version 1.5: Added possibility to set Mersenne Twister
random seed.
- Introduced function MapSample to map the integrand over
the points, whose default value Map can be replaced e.g.
by ParallelMap.
15 Feb 08
- Added further check to Suave for sharp-edged functions.
15 Jan 08
- Fixed bug in makefile.in w.r.t. DESTDIR.
2 Jan 08
- Fixed minor bug in invocation of IniRandom in Suave.
19 Dec 07
- Version 1.4: Added new flag (bit 4), to turn off smoothing of
the importance function for sharp-edged functions.
- Improved configure for Cygwin. Now compiles MathLink
executables `out of the box'.
30 Nov 07
- Fixed detection of variable-size arrays in configure.ac.
- Minor fixes for autoconf 2.60.
30 Aug 07
- Added passing of weight information to the integrand routine
in Vegas and Suave. Mathematica versions use $Weight.
7 Mar 07
- Documented the ll versions in the manual.
1 Mar 06
- Version 1.3: added long long int versions, i.e. all
number-of-points-like quantities are now long long int
instead of int. The corresponding names are prefixed with
"ll", e.g. llVegas.
5 Jan 06
- Corrected a number of declarations so that changing the "number"
typedef in stddecl.h to a longer integer should work now.
Note that this bugfix has NO EFFECT if the "number" typedef
was not changed by hand!
31 Aug 05
- A small patch considerably reduces the "mysterious" problem
in Vegas and Suave that further iterations on a more or less
optimal grid would often degrade the grid.
2 Jun 05
- Added some #ifdefs to make the compile completely silent.
- Changed HUGE_VAL to DBL_MAX to avoid problems with icc.
7 Mar 05
- Extended Divonne's Korobov tables.
- partview now sorts the list of rectangles so that the smallest
ones come on top.
2 Mar 05
- Fixed "mysterious" problem where Divonne would report a
larger-than-requested error even though enough samples were
available.
17 Feb 05
- Rewrote partview.cpp with tabbed window.
- Moved sources to src/{vegas,suave,divonne,cuhre}.
The original names would get into the way of the Mathematica
executables on OSX's case-insensitive file system.
15 Feb 05
- configure now disables compilation of demo-fortran if no
Fortran compiler is found.
9 Feb 05
- Added some explicit typecasts and other tidbits such that
Cuba compiles successfully also with a C++ compiler now.
7 Feb 05
- Added erf implementation in case some "C99 compliant" compiler
like M$ Visual C++ in fact has no erf.
4 Feb 05
- Added partview.m for Mathematica.
3 Feb 05
- Added proper autoconf configure.
- Added cuba.F, a Fortran chooser which makes the invocation
of the Cuba routines still simpler from Fortran.
- Straightened out the contexts of the MathLink executables.
2 Feb 05
- Substituted preprocessor variable NBATCH by run-time configurable
global variable vegasbatch_.
- Added checks on ncomp.
1 Feb 05
- Added a partition viewer which displays the tesselation of the
integration region on screen. Needs Qt.
27 Jan 05
- Added a preprocessor flag NO_LONG_DOUBLE to disable the use
of long doubles on systems that don't have it.
25 Jan 05
- Rearranged Vegas to sample in batches of NBATCH points to
reduce memory consumption.
21 Jan 05
- Fixed bug in Divonne: Final result was wrong if not enough
samples left for Phase 3.
19 Jan 05
- Updated manual re pseudo-random sampling.
17 Jan 05
- Introduced "number" typedef, might be useful when using wide ints.
Not well tested, though.
- Substituted [sd]rand48 by Mersenne Twister generator.
14 Jan 05
- Added pseudo-rng (bit 3 in flags).
- Collected common declarations in stddecl.h.
- Better checking of dimension (e.g. in Divonne, all cases).
12 Jan 05
- Updated manual re vegas{grid,state}.
23 Dec 04
- Fixed a memory leak in Cuhre.
18 Nov 04
- Added vegasstate load/restore of internal state.
16 Jul 04
- Added vegasgrid.
Index: trunk/cuba/config.status
===================================================================
--- trunk/cuba/config.status (revision 0)
+++ trunk/cuba/config.status (revision 159)
@@ -0,0 +1,1029 @@
+#! /bin/bash
+# Generated by configure.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+
+SHELL=${CONFIG_SHELL-/bin/bash}
+export SHELL
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else
+ case `(set -o) 2>/dev/null` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='print -r --'
+ as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='printf %s\n'
+ as_echo_n='printf %s'
+else
+ if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+ as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+ as_echo_n='/usr/ucb/echo -n'
+ else
+ as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+ as_echo_n_body='eval
+ arg=$1;
+ case $arg in #(
+ *"$as_nl"*)
+ expr "X$arg" : "X\\(.*\\)$as_nl";
+ arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+ esac;
+ expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+ '
+ export as_echo_n_body
+ as_echo_n='sh -c $as_echo_n_body as_echo'
+ fi
+ export as_echo_body
+ as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+ (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+ PATH_SEPARATOR=';'
+ }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order. Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" "" $as_nl"
+
+# Find who we are. Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+ as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+ $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there. '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+ as_status=$1; test $as_status -eq 0 && as_status=1
+ if test "$4"; then
+ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ fi
+ $as_echo "$as_me: error: $2" >&2
+ as_fn_exit $as_status
+} # as_fn_error
+
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+ return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+ set +e
+ as_fn_set_status $1
+ exit $1
+} # as_fn_exit
+
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+ { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+ eval 'as_fn_append ()
+ {
+ eval $1+=\$2
+ }'
+else
+ as_fn_append ()
+ {
+ eval $1=\$$1\$2
+ }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+ eval 'as_fn_arith ()
+ {
+ as_val=$(( $* ))
+ }'
+else
+ as_fn_arith ()
+ {
+ as_val=`expr "$@" || test $? -eq 1`
+ }
+fi # as_fn_arith
+
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+ as_dirname=dirname
+else
+ as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+ case `echo 'xy\c'` in
+ *c*) ECHO_T=' ';; # ECHO_T is single tab character.
+ xy) ECHO_C='\c';;
+ *) echo `echo ksh88 bug on AIX 6.1` > /dev/null
+ ECHO_T=' ';;
+ esac;;
+*)
+ ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+ rm -f conf$$.dir/conf$$.file
+else
+ rm -f conf$$.dir
+ mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+ if ln -s conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s='ln -s'
+ # ... but there are two gotchas:
+ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+ # In both cases, we have to default to `cp -pR'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+ as_ln_s='cp -pR'
+ elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+ else
+ as_ln_s='cp -pR'
+ fi
+else
+ as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+ case $as_dir in #(
+ -*) as_dir=./$as_dir;;
+ esac
+ test -d "$as_dir" || eval $as_mkdir_p || {
+ as_dirs=
+ while :; do
+ case $as_dir in #(
+ *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *) as_qdir=$as_dir;;
+ esac
+ as_dirs="'$as_qdir' $as_dirs"
+ as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ test -d "$as_dir" && break
+ done
+ test -z "$as_dirs" || eval "mkdir $as_dirs"
+ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p='mkdir -p "$as_dir"'
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+ test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+## ----------------------------------- ##
+## Main body of $CONFIG_STATUS script. ##
+## ----------------------------------- ##
+# Save the log message, to keep $0 and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by Cuba $as_me 4.2, which was
+generated by GNU Autoconf 2.69. Invocation command line was
+
+ CONFIG_FILES = $CONFIG_FILES
+ CONFIG_HEADERS = $CONFIG_HEADERS
+ CONFIG_LINKS = $CONFIG_LINKS
+ CONFIG_COMMANDS = $CONFIG_COMMANDS
+ $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+# Files that config.status was made for.
+config_files=" makefile"
+config_headers=" config.h"
+
+ac_cs_usage="\
+\`$as_me' instantiates files and other configuration actions
+from templates according to the current configuration. Unless the files
+and actions are specified as TAGs, all are instantiated by default.
+
+Usage: $0 [OPTION]... [TAG]...
+
+ -h, --help print this help, then exit
+ -V, --version print version number and configuration settings, then exit
+ --config print configuration, then exit
+ -q, --quiet, --silent
+ do not print progress messages
+ -d, --debug don't remove temporary files
+ --recheck update $as_me by reconfiguring in the same conditions
+ --file=FILE[:TEMPLATE]
+ instantiate the configuration file FILE
+ --header=FILE[:TEMPLATE]
+ instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Report bugs to <hahn@feynarts.de>."
+
+ac_cs_config=""
+ac_cs_version="\
+Cuba config.status 4.2
+configured by ./configure, generated by GNU Autoconf 2.69,
+ with options \"$ac_cs_config\"
+
+Copyright (C) 2012 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='/home/tollto/SNU/sartre-mc/cuba'
+srcdir='.'
+INSTALL='/usr/bin/install -c'
+test -n "$AWK" || AWK=awk
+# The default lists apply if the user does not specify any file.
+ac_need_defaults=:
+while test $# != 0
+do
+ case $1 in
+ --*=?*)
+ ac_option=`expr "X$1" : 'X\([^=]*\)='`
+ ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+ ac_shift=:
+ ;;
+ --*=)
+ ac_option=`expr "X$1" : 'X\([^=]*\)='`
+ ac_optarg=
+ ac_shift=:
+ ;;
+ *)
+ ac_option=$1
+ ac_optarg=$2
+ ac_shift=shift
+ ;;
+ esac
+
+ case $ac_option in
+ # Handling of the options.
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ ac_cs_recheck=: ;;
+ --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+ $as_echo "$ac_cs_version"; exit ;;
+ --config | --confi | --conf | --con | --co | --c )
+ $as_echo "$ac_cs_config"; exit ;;
+ --debug | --debu | --deb | --de | --d | -d )
+ debug=: ;;
+ --file | --fil | --fi | --f )
+ $ac_shift
+ case $ac_optarg in
+ *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ '') as_fn_error $? "missing file argument" ;;
+ esac
+ as_fn_append CONFIG_FILES " '$ac_optarg'"
+ ac_need_defaults=false;;
+ --header | --heade | --head | --hea )
+ $ac_shift
+ case $ac_optarg in
+ *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ as_fn_append CONFIG_HEADERS " '$ac_optarg'"
+ ac_need_defaults=false;;
+ --he | --h)
+ # Conflict between --help and --header
+ as_fn_error $? "ambiguous option: \`$1'
+Try \`$0 --help' for more information.";;
+ --help | --hel | -h )
+ $as_echo "$ac_cs_usage"; exit ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil | --si | --s)
+ ac_cs_silent=: ;;
+
+ # This is an error.
+ -*) as_fn_error $? "unrecognized option: \`$1'
+Try \`$0 --help' for more information." ;;
+
+ *) as_fn_append ac_config_targets " $1"
+ ac_need_defaults=false ;;
+
+ esac
+ shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+ exec 6>/dev/null
+ ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+if $ac_cs_recheck; then
+ set X /bin/bash './configure' $ac_configure_extra_args --no-create --no-recursion
+ shift
+ $as_echo "running CONFIG_SHELL=/bin/bash $*" >&6
+ CONFIG_SHELL='/bin/bash'
+ export CONFIG_SHELL
+ exec "$@"
+fi
+
+exec 5>>config.log
+{
+ echo
+ sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+ $as_echo "$ac_log"
+} >&5
+
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+ case $ac_config_target in
+ "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
+ "makefile") CONFIG_FILES="$CONFIG_FILES makefile" ;;
+
+ *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
+ esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used. Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+ test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+ test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+fi
+
+# Have a temporary directory for convenience. Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+ tmp= ac_tmp=
+ trap 'exit_status=$?
+ : "${ac_tmp:=$tmp}"
+ { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
+' 0
+ trap 'as_fn_exit 1' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+ tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+ test -d "$tmp"
+} ||
+{
+ tmp=./conf$$-$RANDOM
+ (umask 077 && mkdir "$tmp")
+} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
+ac_tmp=$tmp
+
+# Set up the scripts for CONFIG_FILES section.
+# No need to generate them if there are no CONFIG_FILES.
+# This happens for instance with `./config.status config.h'.
+if test -n "$CONFIG_FILES"; then
+
+
+ac_cr=`echo X | tr X '\015'`
+# On cygwin, bash can eat \r inside `` if the user requested igncr.
+# But we know of no other shell where ac_cr would be empty at this
+# point, so we can use a bashism as a fallback.
+if test "x$ac_cr" = x; then
+ eval ac_cr=\$\'\\r\'
+fi
+ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
+if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
+ ac_cs_awk_cr='\\r'
+else
+ ac_cs_awk_cr=$ac_cr
+fi
+
+echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
+cat >>"$ac_tmp/subs1.awk" <<\_ACAWK &&
+S["LTLIBOBJS"]=""
+S["LIBOBJS"]=""
+S["DEMO_FORTRAN_DEFAULT"]="demo-fortran"
+S["TOOLS_DEFAULT"]=""
+S["HAVE_QMAKE"]="qmake"
+S["MATH_DEFAULT"]=""
+S["MCSTDCPP"]="-stdlib=libstdc++"
+S["SUFFIX"]=""
+S["REALSIZE"]="8"
+S["host_os"]="linux-gnu"
+S["host_vendor"]="unknown"
+S["host_cpu"]="x86_64"
+S["host"]="x86_64-unknown-linux-gnu"
+S["build_os"]="linux-gnu"
+S["build_vendor"]="unknown"
+S["build_cpu"]="x86_64"
+S["build"]="x86_64-unknown-linux-gnu"
+S["ALLOCA"]=""
+S["EGREP"]="/bin/grep -E"
+S["GREP"]="/bin/grep"
+S["CPP"]="gcc -E"
+S["INSTALL_DATA"]="${INSTALL} -m 644"
+S["INSTALL_SCRIPT"]="${INSTALL}"
+S["INSTALL_PROGRAM"]="${INSTALL}"
+S["RANLIB"]="ranlib"
+S["ac_ct_FC"]="gfortran"
+S["FCFLAGS"]="-g -O2"
+S["FC"]="gfortran"
+S["OBJEXT"]="o"
+S["EXEEXT"]=""
+S["ac_ct_CC"]="gcc"
+S["CPPFLAGS"]=""
+S["LDFLAGS"]=""
+S["CFLAGS"]="-O3 -fomit-frame-pointer -ffast-math -Wall"
+S["CC"]="gcc"
+S["MCFLAGS"]=""
+S["target_alias"]=""
+S["host_alias"]=""
+S["build_alias"]=""
+S["LIBS"]="-lm"
+S["ECHO_T"]=""
+S["ECHO_N"]="-n"
+S["ECHO_C"]=""
+S["DEFS"]="-DHAVE_CONFIG_H"
+S["mandir"]="${datarootdir}/man"
+S["localedir"]="${datarootdir}/locale"
+S["libdir"]="${exec_prefix}/lib"
+S["psdir"]="${docdir}"
+S["pdfdir"]="${docdir}"
+S["dvidir"]="${docdir}"
+S["htmldir"]="${docdir}"
+S["infodir"]="${datarootdir}/info"
+S["docdir"]="${datarootdir}/doc/${PACKAGE_TARNAME}"
+S["oldincludedir"]="/usr/include"
+S["includedir"]="${prefix}/include"
+S["localstatedir"]="${prefix}/var"
+S["sharedstatedir"]="${prefix}/com"
+S["sysconfdir"]="${prefix}/etc"
+S["datadir"]="${datarootdir}"
+S["datarootdir"]="${prefix}/share"
+S["libexecdir"]="${exec_prefix}/libexec"
+S["sbindir"]="${exec_prefix}/sbin"
+S["bindir"]="${exec_prefix}/bin"
+S["program_transform_name"]="s,x,x,"
+S["prefix"]="/usr/local"
+S["exec_prefix"]="${prefix}"
+S["PACKAGE_URL"]=""
+S["PACKAGE_BUGREPORT"]="hahn@feynarts.de"
+S["PACKAGE_STRING"]="Cuba 4.2"
+S["PACKAGE_VERSION"]="4.2"
+S["PACKAGE_TARNAME"]="cuba"
+S["PACKAGE_NAME"]="Cuba"
+S["PATH_SEPARATOR"]=":"
+S["SHELL"]="/bin/bash"
+_ACAWK
+cat >>"$ac_tmp/subs1.awk" <<_ACAWK &&
+ for (key in S) S_is_set[key] = 1
+ FS = ""
+
+}
+{
+ line = $ 0
+ nfields = split(line, field, "@")
+ substed = 0
+ len = length(field[1])
+ for (i = 2; i < nfields; i++) {
+ key = field[i]
+ keylen = length(key)
+ if (S_is_set[key]) {
+ value = S[key]
+ line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
+ len += length(value) + length(field[++i])
+ substed = 1
+ } else
+ len += 1 + keylen
+ }
+
+ print line
+}
+
+_ACAWK
+if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
+ sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
+else
+ cat
+fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
+ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5
+fi # test -n "$CONFIG_FILES"
+
+# Set up the scripts for CONFIG_HEADERS section.
+# No need to generate them if there are no CONFIG_HEADERS.
+# This happens for instance with `./config.status Makefile'.
+if test -n "$CONFIG_HEADERS"; then
+cat >"$ac_tmp/defines.awk" <<\_ACAWK ||
+BEGIN {
+D["PACKAGE_NAME"]=" \"Cuba\""
+D["PACKAGE_TARNAME"]=" \"cuba\""
+D["PACKAGE_VERSION"]=" \"4.2\""
+D["PACKAGE_STRING"]=" \"Cuba 4.2\""
+D["PACKAGE_BUGREPORT"]=" \"hahn@feynarts.de\""
+D["PACKAGE_URL"]=" \"\""
+D["HAVE_LONG_DOUBLE_WIDER"]=" 1"
+D["HAVE_LONG_DOUBLE"]=" 1"
+D["STDC_HEADERS"]=" 1"
+D["HAVE_SYS_TYPES_H"]=" 1"
+D["HAVE_SYS_STAT_H"]=" 1"
+D["HAVE_STDLIB_H"]=" 1"
+D["HAVE_STRING_H"]=" 1"
+D["HAVE_MEMORY_H"]=" 1"
+D["HAVE_STRINGS_H"]=" 1"
+D["HAVE_INTTYPES_H"]=" 1"
+D["HAVE_STDINT_H"]=" 1"
+D["HAVE_UNISTD_H"]=" 1"
+D["HAVE_POWL"]=" 1"
+D["HAVE_ERF"]=" 1"
+D["HAVE_FORK"]=" 1"
+D["HAVE_VFORK"]=" 1"
+D["HAVE_WORKING_VFORK"]=" 1"
+D["HAVE_WORKING_FORK"]=" 1"
+D["HAVE_ALLOCA_H"]=" 1"
+D["HAVE_ALLOCA"]=" 1"
+D["HAVE_SHMGET"]=" 1"
+D["HAVE_GETLOADAVG"]=" 1"
+ for (key in D) D_is_set[key] = 1
+ FS = ""
+}
+/^[\t ]*#[\t ]*(define|undef)[\t ]+[_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ][_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789]*([\t (]|$)/ {
+ line = $ 0
+ split(line, arg, " ")
+ if (arg[1] == "#") {
+ defundef = arg[2]
+ mac1 = arg[3]
+ } else {
+ defundef = substr(arg[1], 2)
+ mac1 = arg[2]
+ }
+ split(mac1, mac2, "(") #)
+ macro = mac2[1]
+ prefix = substr(line, 1, index(line, defundef) - 1)
+ if (D_is_set[macro]) {
+ # Preserve the white space surrounding the "#".
+ print prefix "define", macro P[macro] D[macro]
+ next
+ } else {
+ # Replace #undef with comments. This is necessary, for example,
+ # in the case of _POSIX_SOURCE, which is predefined and required
+ # on some systems where configure will not decide to define it.
+ if (defundef == "undef") {
+ print "/*", prefix defundef, macro, "*/"
+ next
+ }
+ }
+}
+{ print }
+_ACAWK
+ as_fn_error $? "could not setup config headers machinery" "$LINENO" 5
+fi # test -n "$CONFIG_HEADERS"
+
+
+eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS "
+shift
+for ac_tag
+do
+ case $ac_tag in
+ :[FHLC]) ac_mode=$ac_tag; continue;;
+ esac
+ case $ac_mode$ac_tag in
+ :[FHL]*:*);;
+ :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
+ :[FH]-) ac_tag=-:-;;
+ :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+ esac
+ ac_save_IFS=$IFS
+ IFS=:
+ set x $ac_tag
+ IFS=$ac_save_IFS
+ shift
+ ac_file=$1
+ shift
+
+ case $ac_mode in
+ :L) ac_source=$1;;
+ :[FH])
+ ac_file_inputs=
+ for ac_f
+ do
+ case $ac_f in
+ -) ac_f="$ac_tmp/stdin";;
+ *) # Look for the file first in the build tree, then in the source tree
+ # (if the path is not absolute). The absolute path cannot be DOS-style,
+ # because $ac_f cannot contain `:'.
+ test -f "$ac_f" ||
+ case $ac_f in
+ [\\/$]*) false;;
+ *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+ esac ||
+ as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
+ esac
+ case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+ as_fn_append ac_file_inputs " '$ac_f'"
+ done
+
+ # Let's still pretend it is `configure' which instantiates (i.e., don't
+ # use $as_me), people would be surprised to read:
+ # /* config.h. Generated by config.status. */
+ configure_input='Generated from '`
+ $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+ `' by configure.'
+ if test x"$ac_file" != x-; then
+ configure_input="$ac_file. $configure_input"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
+$as_echo "$as_me: creating $ac_file" >&6;}
+ fi
+ # Neutralize special characters interpreted by sed in replacement strings.
+ case $configure_input in #(
+ *\&* | *\|* | *\\* )
+ ac_sed_conf_input=`$as_echo "$configure_input" |
+ sed 's/[\\\\&|]/\\\\&/g'`;; #(
+ *) ac_sed_conf_input=$configure_input;;
+ esac
+
+ case $ac_tag in
+ *:-:* | *:-) cat >"$ac_tmp/stdin" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
+ esac
+ ;;
+ esac
+
+ ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_file" : 'X\(//\)[^/]' \| \
+ X"$ac_file" : 'X\(//\)$' \| \
+ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$ac_file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ as_dir="$ac_dir"; as_fn_mkdir_p
+ ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+ ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+ # A ".." for each directory in $ac_dir_suffix.
+ ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ case $ac_top_builddir_sub in
+ "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+ esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+ .) # We are building in place.
+ ac_srcdir=.
+ ac_top_srcdir=$ac_top_builddir_sub
+ ac_abs_top_srcdir=$ac_pwd ;;
+ [\\/]* | ?:[\\/]* ) # Absolute name.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir
+ ac_abs_top_srcdir=$srcdir ;;
+ *) # Relative name.
+ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_build_prefix$srcdir
+ ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+ case $ac_mode in
+ :F)
+ #
+ # CONFIG_FILE
+ #
+
+ case $INSTALL in
+ [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+ *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
+ esac
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+ac_sed_dataroot='
+/datarootdir/ {
+ p
+ q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p'
+case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+ ac_datarootdir_hack='
+ s&@datadir@&${datarootdir}&g
+ s&@docdir@&${datarootdir}/doc/${PACKAGE_TARNAME}&g
+ s&@infodir@&${datarootdir}/info&g
+ s&@localedir@&${datarootdir}/locale&g
+ s&@mandir@&${datarootdir}/man&g
+ s&\${datarootdir}&${prefix}/share&g' ;;
+esac
+ac_sed_extra="/^[ ]*VPATH[ ]*=[ ]*/{
+h
+s///
+s/^/:/
+s/[ ]*$/:/
+s/:\$(srcdir):/:/g
+s/:\${srcdir}:/:/g
+s/:@srcdir@:/:/g
+s/^:*//
+s/:*$//
+x
+s/\(=[ ]*\).*/\1/
+G
+s/\n//
+s/^[^=]*=[ ]*$//
+}
+
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s|@configure_input@|$ac_sed_conf_input|;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@top_build_prefix@&$ac_top_build_prefix&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+s&@INSTALL@&$ac_INSTALL&;t t
+$ac_datarootdir_hack
+"
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
+ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+ { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
+ { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \
+ "$ac_tmp/out"`; test -z "$ac_out"; } &&
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined. Please make sure it is defined" >&5
+$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined. Please make sure it is defined" >&2;}
+
+ rm -f "$ac_tmp/stdin"
+ case $ac_file in
+ -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
+ *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
+ esac \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ ;;
+ :H)
+ #
+ # CONFIG_HEADER
+ #
+ if test x"$ac_file" != x-; then
+ {
+ $as_echo "/* $configure_input */" \
+ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs"
+ } >"$ac_tmp/config.h" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
+$as_echo "$as_me: $ac_file is unchanged" >&6;}
+ else
+ rm -f "$ac_file"
+ mv "$ac_tmp/config.h" "$ac_file" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ fi
+ else
+ $as_echo "/* $configure_input */" \
+ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \
+ || as_fn_error $? "could not create -" "$LINENO" 5
+ fi
+ ;;
+
+
+ esac
+
+done # for ac_tag
+
+
+as_fn_exit 0
Property changes on: trunk/cuba/config.status
___________________________________________________________________
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/cuba/config.guess
===================================================================
--- trunk/cuba/config.guess (revision 0)
+++ trunk/cuba/config.guess (revision 159)
@@ -0,0 +1,1530 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
+# 2011, 2012 Free Software Foundation, Inc.
+
+timestamp='2012-02-10'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+# Originally written by Per Bothner. Please send patches (context
+# diff format) to <config-patches@gnu.org> and include a ChangeLog
+# entry.
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub. If it succeeds, it prints the system name on stdout, and
+# exits with 0. Otherwise, it exits with 1.
+#
+# You can get the latest version of this script from:
+# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Operation modes:
+ -h, --help print this help, then exit
+ -t, --time-stamp print date of last modification, then exit
+ -v, --version print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
+2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+ case $1 in
+ --time-stamp | --time* | -t )
+ echo "$timestamp" ; exit ;;
+ --version | -v )
+ echo "$version" ; exit ;;
+ --help | --h* | -h )
+ echo "$usage"; exit ;;
+ -- ) # Stop option processing
+ shift; break ;;
+ - ) # Use stdin as input.
+ break ;;
+ -* )
+ echo "$me: invalid option $1$help" >&2
+ exit 1 ;;
+ * )
+ break ;;
+ esac
+done
+
+if test $# != 0; then
+ echo "$me: too many arguments$help" >&2
+ exit 1
+fi
+
+trap 'exit 1' 1 2 15
+
+# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
+# compiler to aid in system detection is discouraged as it requires
+# temporary files to be created and, as you can see below, it is a
+# headache to deal with in a portable fashion.
+
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+# Portable tmp directory creation inspired by the Autoconf team.
+
+set_cc_for_build='
+trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
+trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
+: ${TMPDIR=/tmp} ;
+ { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
+ { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
+ { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+ { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
+dummy=$tmp/dummy ;
+tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
+case $CC_FOR_BUILD,$HOST_CC,$CC in
+ ,,) echo "int x;" > $dummy.c ;
+ for c in cc gcc c89 c99 ; do
+ if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
+ CC_FOR_BUILD="$c"; break ;
+ fi ;
+ done ;
+ if test x"$CC_FOR_BUILD" = x ; then
+ CC_FOR_BUILD=no_compiler_found ;
+ fi
+ ;;
+ ,,*) CC_FOR_BUILD=$CC ;;
+ ,*,*) CC_FOR_BUILD=$HOST_CC ;;
+esac ; set_cc_for_build= ;'
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 1994-08-24)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+ PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+ *:NetBSD:*:*)
+ # NetBSD (nbsd) targets should (where applicable) match one or
+ # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*,
+ # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently
+ # switched to ELF, *-*-netbsd* would select the old
+ # object file format. This provides both forward
+ # compatibility and a consistent mechanism for selecting the
+ # object file format.
+ #
+ # Note: NetBSD doesn't particularly care about the vendor
+ # portion of the name. We always set it to "unknown".
+ sysctl="sysctl -n hw.machine_arch"
+ UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
+ /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
+ case "${UNAME_MACHINE_ARCH}" in
+ armeb) machine=armeb-unknown ;;
+ arm*) machine=arm-unknown ;;
+ sh3el) machine=shl-unknown ;;
+ sh3eb) machine=sh-unknown ;;
+ sh5el) machine=sh5le-unknown ;;
+ *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
+ esac
+ # The Operating System including object format, if it has switched
+ # to ELF recently, or will in the future.
+ case "${UNAME_MACHINE_ARCH}" in
+ arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+ eval $set_cc_for_build
+ if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+ | grep -q __ELF__
+ then
+ # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+ # Return netbsd for either. FIX?
+ os=netbsd
+ else
+ os=netbsdelf
+ fi
+ ;;
+ *)
+ os=netbsd
+ ;;
+ esac
+ # The OS release
+ # Debian GNU/NetBSD machines have a different userland, and
+ # thus, need a distinct triplet. However, they do not need
+ # kernel version information, so it can be replaced with a
+ # suitable tag, in the style of linux-gnu.
+ case "${UNAME_VERSION}" in
+ Debian*)
+ release='-gnu'
+ ;;
+ *)
+ release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+ ;;
+ esac
+ # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+ # contains redundant information, the shorter form:
+ # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+ echo "${machine}-${os}${release}"
+ exit ;;
+ *:OpenBSD:*:*)
+ UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
+ echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
+ exit ;;
+ *:ekkoBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
+ exit ;;
+ *:SolidBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}
+ exit ;;
+ macppc:MirBSD:*:*)
+ echo powerpc-unknown-mirbsd${UNAME_RELEASE}
+ exit ;;
+ *:MirBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
+ exit ;;
+ alpha:OSF1:*:*)
+ case $UNAME_RELEASE in
+ *4.0)
+ UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+ ;;
+ *5.*)
+ UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+ ;;
+ esac
+ # According to Compaq, /usr/sbin/psrinfo has been available on
+ # OSF/1 and Tru64 systems produced since 1995. I hope that
+ # covers most systems running today. This code pipes the CPU
+ # types through head -n 1, so we only detect the type of CPU 0.
+ ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1`
+ case "$ALPHA_CPU_TYPE" in
+ "EV4 (21064)")
+ UNAME_MACHINE="alpha" ;;
+ "EV4.5 (21064)")
+ UNAME_MACHINE="alpha" ;;
+ "LCA4 (21066/21068)")
+ UNAME_MACHINE="alpha" ;;
+ "EV5 (21164)")
+ UNAME_MACHINE="alphaev5" ;;
+ "EV5.6 (21164A)")
+ UNAME_MACHINE="alphaev56" ;;
+ "EV5.6 (21164PC)")
+ UNAME_MACHINE="alphapca56" ;;
+ "EV5.7 (21164PC)")
+ UNAME_MACHINE="alphapca57" ;;
+ "EV6 (21264)")
+ UNAME_MACHINE="alphaev6" ;;
+ "EV6.7 (21264A)")
+ UNAME_MACHINE="alphaev67" ;;
+ "EV6.8CB (21264C)")
+ UNAME_MACHINE="alphaev68" ;;
+ "EV6.8AL (21264B)")
+ UNAME_MACHINE="alphaev68" ;;
+ "EV6.8CX (21264D)")
+ UNAME_MACHINE="alphaev68" ;;
+ "EV6.9A (21264/EV69A)")
+ UNAME_MACHINE="alphaev69" ;;
+ "EV7 (21364)")
+ UNAME_MACHINE="alphaev7" ;;
+ "EV7.9 (21364A)")
+ UNAME_MACHINE="alphaev79" ;;
+ esac
+ # A Pn.n version is a patched version.
+ # A Vn.n version is a released version.
+ # A Tn.n version is a released field test version.
+ # A Xn.n version is an unreleased experimental baselevel.
+ # 1.2 uses "1.2" for uname -r.
+ echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+ # Reset EXIT trap before exiting to avoid spurious non-zero exit code.
+ exitcode=$?
+ trap '' 0
+ exit $exitcode ;;
+ Alpha\ *:Windows_NT*:*)
+ # How do we know it's Interix rather than the generic POSIX subsystem?
+ # Should we change UNAME_MACHINE based on the output of uname instead
+ # of the specific Alpha model?
+ echo alpha-pc-interix
+ exit ;;
+ 21064:Windows_NT:50:3)
+ echo alpha-dec-winnt3.5
+ exit ;;
+ Amiga*:UNIX_System_V:4.0:*)
+ echo m68k-unknown-sysv4
+ exit ;;
+ *:[Aa]miga[Oo][Ss]:*:*)
+ echo ${UNAME_MACHINE}-unknown-amigaos
+ exit ;;
+ *:[Mm]orph[Oo][Ss]:*:*)
+ echo ${UNAME_MACHINE}-unknown-morphos
+ exit ;;
+ *:OS/390:*:*)
+ echo i370-ibm-openedition
+ exit ;;
+ *:z/VM:*:*)
+ echo s390-ibm-zvmoe
+ exit ;;
+ *:OS400:*:*)
+ echo powerpc-ibm-os400
+ exit ;;
+ arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+ echo arm-acorn-riscix${UNAME_RELEASE}
+ exit ;;
+ arm:riscos:*:*|arm:RISCOS:*:*)
+ echo arm-unknown-riscos
+ exit ;;
+ SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+ echo hppa1.1-hitachi-hiuxmpp
+ exit ;;
+ Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+ # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+ if test "`(/bin/universe) 2>/dev/null`" = att ; then
+ echo pyramid-pyramid-sysv3
+ else
+ echo pyramid-pyramid-bsd
+ fi
+ exit ;;
+ NILE*:*:*:dcosx)
+ echo pyramid-pyramid-svr4
+ exit ;;
+ DRS?6000:unix:4.0:6*)
+ echo sparc-icl-nx6
+ exit ;;
+ DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
+ case `/usr/bin/uname -p` in
+ sparc) echo sparc-icl-nx7; exit ;;
+ esac ;;
+ s390x:SunOS:*:*)
+ echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ sun4H:SunOS:5.*:*)
+ echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+ echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)
+ echo i386-pc-auroraux${UNAME_RELEASE}
+ exit ;;
+ i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
+ eval $set_cc_for_build
+ SUN_ARCH="i386"
+ # If there is a compiler, see if it is configured for 64-bit objects.
+ # Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
+ # This test works for both compilers.
+ if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+ if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
+ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+ grep IS_64BIT_ARCH >/dev/null
+ then
+ SUN_ARCH="x86_64"
+ fi
+ fi
+ echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ sun4*:SunOS:6*:*)
+ # According to config.sub, this is the proper way to canonicalize
+ # SunOS6. Hard to guess exactly what SunOS6 will be like, but
+ # it's likely to be more like Solaris than SunOS4.
+ echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ sun4*:SunOS:*:*)
+ case "`/usr/bin/arch -k`" in
+ Series*|S4*)
+ UNAME_RELEASE=`uname -v`
+ ;;
+ esac
+ # Japanese Language versions have a version number like `4.1.3-JL'.
+ echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+ exit ;;
+ sun3*:SunOS:*:*)
+ echo m68k-sun-sunos${UNAME_RELEASE}
+ exit ;;
+ sun*:*:4.2BSD:*)
+ UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+ test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+ case "`/bin/arch`" in
+ sun3)
+ echo m68k-sun-sunos${UNAME_RELEASE}
+ ;;
+ sun4)
+ echo sparc-sun-sunos${UNAME_RELEASE}
+ ;;
+ esac
+ exit ;;
+ aushp:SunOS:*:*)
+ echo sparc-auspex-sunos${UNAME_RELEASE}
+ exit ;;
+ # The situation for MiNT is a little confusing. The machine name
+ # can be virtually everything (everything which is not
+ # "atarist" or "atariste" at least should have a processor
+ # > m68000). The system name ranges from "MiNT" over "FreeMiNT"
+ # to the lowercase version "mint" (or "freemint"). Finally
+ # the system name "TOS" denotes a system which is actually not
+ # MiNT. But MiNT is downward compatible to TOS, so this should
+ # be no problem.
+ atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+ echo m68k-atari-mint${UNAME_RELEASE}
+ exit ;;
+ atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+ echo m68k-atari-mint${UNAME_RELEASE}
+ exit ;;
+ *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+ echo m68k-atari-mint${UNAME_RELEASE}
+ exit ;;
+ milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+ echo m68k-milan-mint${UNAME_RELEASE}
+ exit ;;
+ hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+ echo m68k-hades-mint${UNAME_RELEASE}
+ exit ;;
+ *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+ echo m68k-unknown-mint${UNAME_RELEASE}
+ exit ;;
+ m68k:machten:*:*)
+ echo m68k-apple-machten${UNAME_RELEASE}
+ exit ;;
+ powerpc:machten:*:*)
+ echo powerpc-apple-machten${UNAME_RELEASE}
+ exit ;;
+ RISC*:Mach:*:*)
+ echo mips-dec-mach_bsd4.3
+ exit ;;
+ RISC*:ULTRIX:*:*)
+ echo mips-dec-ultrix${UNAME_RELEASE}
+ exit ;;
+ VAX*:ULTRIX*:*:*)
+ echo vax-dec-ultrix${UNAME_RELEASE}
+ exit ;;
+ 2020:CLIX:*:* | 2430:CLIX:*:*)
+ echo clipper-intergraph-clix${UNAME_RELEASE}
+ exit ;;
+ mips:*:*:UMIPS | mips:*:*:RISCos)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+#ifdef __cplusplus
+#include <stdio.h> /* for printf() prototype */
+ int main (int argc, char *argv[]) {
+#else
+ int main (argc, argv) int argc; char *argv[]; {
+#endif
+ #if defined (host_mips) && defined (MIPSEB)
+ #if defined (SYSTYPE_SYSV)
+ printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+ #endif
+ #if defined (SYSTYPE_SVR4)
+ printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+ #endif
+ #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+ printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+ #endif
+ #endif
+ exit (-1);
+ }
+EOF
+ $CC_FOR_BUILD -o $dummy $dummy.c &&
+ dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&
+ SYSTEM_NAME=`$dummy $dummyarg` &&
+ { echo "$SYSTEM_NAME"; exit; }
+ echo mips-mips-riscos${UNAME_RELEASE}
+ exit ;;
+ Motorola:PowerMAX_OS:*:*)
+ echo powerpc-motorola-powermax
+ exit ;;
+ Motorola:*:4.3:PL8-*)
+ echo powerpc-harris-powermax
+ exit ;;
+ Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
+ echo powerpc-harris-powermax
+ exit ;;
+ Night_Hawk:Power_UNIX:*:*)
+ echo powerpc-harris-powerunix
+ exit ;;
+ m88k:CX/UX:7*:*)
+ echo m88k-harris-cxux7
+ exit ;;
+ m88k:*:4*:R4*)
+ echo m88k-motorola-sysv4
+ exit ;;
+ m88k:*:3*:R3*)
+ echo m88k-motorola-sysv3
+ exit ;;
+ AViiON:dgux:*:*)
+ # DG/UX returns AViiON for all architectures
+ UNAME_PROCESSOR=`/usr/bin/uname -p`
+ if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
+ then
+ if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
+ [ ${TARGET_BINARY_INTERFACE}x = x ]
+ then
+ echo m88k-dg-dgux${UNAME_RELEASE}
+ else
+ echo m88k-dg-dguxbcs${UNAME_RELEASE}
+ fi
+ else
+ echo i586-dg-dgux${UNAME_RELEASE}
+ fi
+ exit ;;
+ M88*:DolphinOS:*:*) # DolphinOS (SVR3)
+ echo m88k-dolphin-sysv3
+ exit ;;
+ M88*:*:R3*:*)
+ # Delta 88k system running SVR3
+ echo m88k-motorola-sysv3
+ exit ;;
+ XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+ echo m88k-tektronix-sysv3
+ exit ;;
+ Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+ echo m68k-tektronix-bsd
+ exit ;;
+ *:IRIX*:*:*)
+ echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+ exit ;;
+ ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+ echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id
+ exit ;; # Note that: echo "'`uname -s`'" gives 'AIX '
+ i*86:AIX:*:*)
+ echo i386-ibm-aix
+ exit ;;
+ ia64:AIX:*:*)
+ if [ -x /usr/bin/oslevel ] ; then
+ IBM_REV=`/usr/bin/oslevel`
+ else
+ IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+ fi
+ echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
+ exit ;;
+ *:AIX:2:3)
+ if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #include <sys/systemcfg.h>
+
+ main()
+ {
+ if (!__power_pc())
+ exit(1);
+ puts("powerpc-ibm-aix3.2.5");
+ exit(0);
+ }
+EOF
+ if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`
+ then
+ echo "$SYSTEM_NAME"
+ else
+ echo rs6000-ibm-aix3.2.5
+ fi
+ elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+ echo rs6000-ibm-aix3.2.4
+ else
+ echo rs6000-ibm-aix3.2
+ fi
+ exit ;;
+ *:AIX:*:[4567])
+ IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
+ if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
+ IBM_ARCH=rs6000
+ else
+ IBM_ARCH=powerpc
+ fi
+ if [ -x /usr/bin/oslevel ] ; then
+ IBM_REV=`/usr/bin/oslevel`
+ else
+ IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+ fi
+ echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+ exit ;;
+ *:AIX:*:*)
+ echo rs6000-ibm-aix
+ exit ;;
+ ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+ echo romp-ibm-bsd4.4
+ exit ;;
+ ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and
+ echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to
+ exit ;; # report: romp-ibm BSD 4.3
+ *:BOSX:*:*)
+ echo rs6000-bull-bosx
+ exit ;;
+ DPX/2?00:B.O.S.:*:*)
+ echo m68k-bull-sysv3
+ exit ;;
+ 9000/[34]??:4.3bsd:1.*:*)
+ echo m68k-hp-bsd
+ exit ;;
+ hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+ echo m68k-hp-bsd4.4
+ exit ;;
+ 9000/[34678]??:HP-UX:*:*)
+ HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+ case "${UNAME_MACHINE}" in
+ 9000/31? ) HP_ARCH=m68000 ;;
+ 9000/[34]?? ) HP_ARCH=m68k ;;
+ 9000/[678][0-9][0-9])
+ if [ -x /usr/bin/getconf ]; then
+ sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+ sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+ case "${sc_cpu_version}" in
+ 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
+ 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+ 532) # CPU_PA_RISC2_0
+ case "${sc_kernel_bits}" in
+ 32) HP_ARCH="hppa2.0n" ;;
+ 64) HP_ARCH="hppa2.0w" ;;
+ '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20
+ esac ;;
+ esac
+ fi
+ if [ "${HP_ARCH}" = "" ]; then
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+
+ #define _HPUX_SOURCE
+ #include <stdlib.h>
+ #include <unistd.h>
+
+ int main ()
+ {
+ #if defined(_SC_KERNEL_BITS)
+ long bits = sysconf(_SC_KERNEL_BITS);
+ #endif
+ long cpu = sysconf (_SC_CPU_VERSION);
+
+ switch (cpu)
+ {
+ case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+ case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+ case CPU_PA_RISC2_0:
+ #if defined(_SC_KERNEL_BITS)
+ switch (bits)
+ {
+ case 64: puts ("hppa2.0w"); break;
+ case 32: puts ("hppa2.0n"); break;
+ default: puts ("hppa2.0"); break;
+ } break;
+ #else /* !defined(_SC_KERNEL_BITS) */
+ puts ("hppa2.0"); break;
+ #endif
+ default: puts ("hppa1.0"); break;
+ }
+ exit (0);
+ }
+EOF
+ (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
+ test -z "$HP_ARCH" && HP_ARCH=hppa
+ fi ;;
+ esac
+ if [ ${HP_ARCH} = "hppa2.0w" ]
+ then
+ eval $set_cc_for_build
+
+ # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
+ # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler
+ # generating 64-bit code. GNU and HP use different nomenclature:
+ #
+ # $ CC_FOR_BUILD=cc ./config.guess
+ # => hppa2.0w-hp-hpux11.23
+ # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
+ # => hppa64-hp-hpux11.23
+
+ if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
+ grep -q __LP64__
+ then
+ HP_ARCH="hppa2.0w"
+ else
+ HP_ARCH="hppa64"
+ fi
+ fi
+ echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+ exit ;;
+ ia64:HP-UX:*:*)
+ HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+ echo ia64-hp-hpux${HPUX_REV}
+ exit ;;
+ 3050*:HI-UX:*:*)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #include <unistd.h>
+ int
+ main ()
+ {
+ long cpu = sysconf (_SC_CPU_VERSION);
+ /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+ true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct
+ results, however. */
+ if (CPU_IS_PA_RISC (cpu))
+ {
+ switch (cpu)
+ {
+ case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+ case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+ case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+ default: puts ("hppa-hitachi-hiuxwe2"); break;
+ }
+ }
+ else if (CPU_IS_HP_MC68K (cpu))
+ puts ("m68k-hitachi-hiuxwe2");
+ else puts ("unknown-hitachi-hiuxwe2");
+ exit (0);
+ }
+EOF
+ $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&
+ { echo "$SYSTEM_NAME"; exit; }
+ echo unknown-hitachi-hiuxwe2
+ exit ;;
+ 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+ echo hppa1.1-hp-bsd
+ exit ;;
+ 9000/8??:4.3bsd:*:*)
+ echo hppa1.0-hp-bsd
+ exit ;;
+ *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+ echo hppa1.0-hp-mpeix
+ exit ;;
+ hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+ echo hppa1.1-hp-osf
+ exit ;;
+ hp8??:OSF1:*:*)
+ echo hppa1.0-hp-osf
+ exit ;;
+ i*86:OSF1:*:*)
+ if [ -x /usr/sbin/sysversion ] ; then
+ echo ${UNAME_MACHINE}-unknown-osf1mk
+ else
+ echo ${UNAME_MACHINE}-unknown-osf1
+ fi
+ exit ;;
+ parisc*:Lites*:*:*)
+ echo hppa1.1-hp-lites
+ exit ;;
+ C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+ echo c1-convex-bsd
+ exit ;;
+ C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+ if getsysinfo -f scalar_acc
+ then echo c32-convex-bsd
+ else echo c2-convex-bsd
+ fi
+ exit ;;
+ C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+ echo c34-convex-bsd
+ exit ;;
+ C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+ echo c38-convex-bsd
+ exit ;;
+ C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+ echo c4-convex-bsd
+ exit ;;
+ CRAY*Y-MP:*:*:*)
+ echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*[A-Z]90:*:*:*)
+ echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+ -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*TS:*:*:*)
+ echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*T3E:*:*:*)
+ echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*SV1:*:*:*)
+ echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ *:UNICOS/mp:*:*)
+ echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+ FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+ FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+ FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+ echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+ exit ;;
+ 5000:UNIX_System_V:4.*:*)
+ FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+ FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
+ echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+ exit ;;
+ i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+ echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+ exit ;;
+ sparc*:BSD/OS:*:*)
+ echo sparc-unknown-bsdi${UNAME_RELEASE}
+ exit ;;
+ *:BSD/OS:*:*)
+ echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+ exit ;;
+ *:FreeBSD:*:*)
+ UNAME_PROCESSOR=`/usr/bin/uname -p`
+ case ${UNAME_PROCESSOR} in
+ amd64)
+ echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+ *)
+ echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+ esac
+ exit ;;
+ i*:CYGWIN*:*)
+ echo ${UNAME_MACHINE}-pc-cygwin
+ exit ;;
+ *:MINGW*:*)
+ echo ${UNAME_MACHINE}-pc-mingw32
+ exit ;;
+ i*:MSYS*:*)
+ echo ${UNAME_MACHINE}-pc-msys
+ exit ;;
+ i*:windows32*:*)
+ # uname -m includes "-pc" on this system.
+ echo ${UNAME_MACHINE}-mingw32
+ exit ;;
+ i*:PW*:*)
+ echo ${UNAME_MACHINE}-pc-pw32
+ exit ;;
+ *:Interix*:*)
+ case ${UNAME_MACHINE} in
+ x86)
+ echo i586-pc-interix${UNAME_RELEASE}
+ exit ;;
+ authenticamd | genuineintel | EM64T)
+ echo x86_64-unknown-interix${UNAME_RELEASE}
+ exit ;;
+ IA64)
+ echo ia64-unknown-interix${UNAME_RELEASE}
+ exit ;;
+ esac ;;
+ [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
+ echo i${UNAME_MACHINE}-pc-mks
+ exit ;;
+ 8664:Windows_NT:*)
+ echo x86_64-pc-mks
+ exit ;;
+ i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
+ # How do we know it's Interix rather than the generic POSIX subsystem?
+ # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
+ # UNAME_MACHINE based on the output of uname instead of i386?
+ echo i586-pc-interix
+ exit ;;
+ i*:UWIN*:*)
+ echo ${UNAME_MACHINE}-pc-uwin
+ exit ;;
+ amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
+ echo x86_64-unknown-cygwin
+ exit ;;
+ p*:CYGWIN*:*)
+ echo powerpcle-unknown-cygwin
+ exit ;;
+ prep*:SunOS:5.*:*)
+ echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ *:GNU:*:*)
+ # the GNU system
+ echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+ exit ;;
+ *:GNU/*:*:*)
+ # other systems with GNU libc and userland
+ echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
+ exit ;;
+ i*86:Minix:*:*)
+ echo ${UNAME_MACHINE}-pc-minix
+ exit ;;
+ aarch64:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ aarch64_be:Linux:*:*)
+ UNAME_MACHINE=aarch64_be
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ alpha:Linux:*:*)
+ case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+ EV5) UNAME_MACHINE=alphaev5 ;;
+ EV56) UNAME_MACHINE=alphaev56 ;;
+ PCA56) UNAME_MACHINE=alphapca56 ;;
+ PCA57) UNAME_MACHINE=alphapca56 ;;
+ EV6) UNAME_MACHINE=alphaev6 ;;
+ EV67) UNAME_MACHINE=alphaev67 ;;
+ EV68*) UNAME_MACHINE=alphaev68 ;;
+ esac
+ objdump --private-headers /bin/sh | grep -q ld.so.1
+ if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
+ echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
+ exit ;;
+ arm*:Linux:*:*)
+ eval $set_cc_for_build
+ if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
+ | grep -q __ARM_EABI__
+ then
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ else
+ if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
+ | grep -q __ARM_PCS_VFP
+ then
+ echo ${UNAME_MACHINE}-unknown-linux-gnueabi
+ else
+ echo ${UNAME_MACHINE}-unknown-linux-gnueabihf
+ fi
+ fi
+ exit ;;
+ avr32*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ cris:Linux:*:*)
+ echo ${UNAME_MACHINE}-axis-linux-gnu
+ exit ;;
+ crisv32:Linux:*:*)
+ echo ${UNAME_MACHINE}-axis-linux-gnu
+ exit ;;
+ frv:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ hexagon:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ i*86:Linux:*:*)
+ LIBC=gnu
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #ifdef __dietlibc__
+ LIBC=dietlibc
+ #endif
+EOF
+ eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'`
+ echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
+ exit ;;
+ ia64:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ m32r*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ m68*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ mips:Linux:*:* | mips64:Linux:*:*)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #undef CPU
+ #undef ${UNAME_MACHINE}
+ #undef ${UNAME_MACHINE}el
+ #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+ CPU=${UNAME_MACHINE}el
+ #else
+ #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+ CPU=${UNAME_MACHINE}
+ #else
+ CPU=
+ #endif
+ #endif
+EOF
+ eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`
+ test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
+ ;;
+ or32:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ padre:Linux:*:*)
+ echo sparc-unknown-linux-gnu
+ exit ;;
+ parisc64:Linux:*:* | hppa64:Linux:*:*)
+ echo hppa64-unknown-linux-gnu
+ exit ;;
+ parisc:Linux:*:* | hppa:Linux:*:*)
+ # Look for CPU level
+ case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+ PA7*) echo hppa1.1-unknown-linux-gnu ;;
+ PA8*) echo hppa2.0-unknown-linux-gnu ;;
+ *) echo hppa-unknown-linux-gnu ;;
+ esac
+ exit ;;
+ ppc64:Linux:*:*)
+ echo powerpc64-unknown-linux-gnu
+ exit ;;
+ ppc:Linux:*:*)
+ echo powerpc-unknown-linux-gnu
+ exit ;;
+ s390:Linux:*:* | s390x:Linux:*:*)
+ echo ${UNAME_MACHINE}-ibm-linux
+ exit ;;
+ sh64*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ sh*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ sparc:Linux:*:* | sparc64:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ tile*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ vax:Linux:*:*)
+ echo ${UNAME_MACHINE}-dec-linux-gnu
+ exit ;;
+ x86_64:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ xtensa*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ i*86:DYNIX/ptx:4*:*)
+ # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+ # earlier versions are messed up and put the nodename in both
+ # sysname and nodename.
+ echo i386-sequent-sysv4
+ exit ;;
+ i*86:UNIX_SV:4.2MP:2.*)
+ # Unixware is an offshoot of SVR4, but it has its own version
+ # number series starting with 2...
+ # I am not positive that other SVR4 systems won't match this,
+ # I just have to hope. -- rms.
+ # Use sysv4.2uw... so that sysv4* matches it.
+ echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
+ exit ;;
+ i*86:OS/2:*:*)
+ # If we were able to find `uname', then EMX Unix compatibility
+ # is probably installed.
+ echo ${UNAME_MACHINE}-pc-os2-emx
+ exit ;;
+ i*86:XTS-300:*:STOP)
+ echo ${UNAME_MACHINE}-unknown-stop
+ exit ;;
+ i*86:atheos:*:*)
+ echo ${UNAME_MACHINE}-unknown-atheos
+ exit ;;
+ i*86:syllable:*:*)
+ echo ${UNAME_MACHINE}-pc-syllable
+ exit ;;
+ i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)
+ echo i386-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ i*86:*DOS:*:*)
+ echo ${UNAME_MACHINE}-pc-msdosdjgpp
+ exit ;;
+ i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
+ UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
+ if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+ echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
+ else
+ echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
+ fi
+ exit ;;
+ i*86:*:5:[678]*)
+ # UnixWare 7.x, OpenUNIX and OpenServer 6.
+ case `/bin/uname -X | grep "^Machine"` in
+ *486*) UNAME_MACHINE=i486 ;;
+ *Pentium) UNAME_MACHINE=i586 ;;
+ *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+ esac
+ echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+ exit ;;
+ i*86:*:3.2:*)
+ if test -f /usr/options/cb.name; then
+ UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+ echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+ elif /bin/uname -X 2>/dev/null >/dev/null ; then
+ UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
+ (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
+ (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
+ && UNAME_MACHINE=i586
+ (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
+ && UNAME_MACHINE=i686
+ (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
+ && UNAME_MACHINE=i686
+ echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+ else
+ echo ${UNAME_MACHINE}-pc-sysv32
+ fi
+ exit ;;
+ pc:*:*:*)
+ # Left here for compatibility:
+ # uname -m prints for DJGPP always 'pc', but it prints nothing about
+ # the processor, so we play safe by assuming i586.
+ # Note: whatever this is, it MUST be the same as what config.sub
+ # prints for the "djgpp" host, or else GDB configury will decide that
+ # this is a cross-build.
+ echo i586-pc-msdosdjgpp
+ exit ;;
+ Intel:Mach:3*:*)
+ echo i386-pc-mach3
+ exit ;;
+ paragon:*:*:*)
+ echo i860-intel-osf1
+ exit ;;
+ i860:*:4.*:*) # i860-SVR4
+ if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+ echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+ else # Add other i860-SVR4 vendors below as they are discovered.
+ echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4
+ fi
+ exit ;;
+ mini*:CTIX:SYS*5:*)
+ # "miniframe"
+ echo m68010-convergent-sysv
+ exit ;;
+ mc68k:UNIX:SYSTEM5:3.51m)
+ echo m68k-convergent-sysv
+ exit ;;
+ M680?0:D-NIX:5.3:*)
+ echo m68k-diab-dnix
+ exit ;;
+ M68*:*:R3V[5678]*:*)
+ test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
+ 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
+ OS_REL=''
+ test -r /etc/.relid \
+ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+ /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+ 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && { echo i486-ncr-sysv4; exit; } ;;
+ NCR*:*:4.2:* | MPRAS*:*:4.2:*)
+ OS_REL='.3'
+ test -r /etc/.relid \
+ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+ /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+ && { echo i586-ncr-sysv4.3${OS_REL}; exit; }
+ /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \
+ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+ m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+ echo m68k-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ mc68030:UNIX_System_V:4.*:*)
+ echo m68k-atari-sysv4
+ exit ;;
+ TSUNAMI:LynxOS:2.*:*)
+ echo sparc-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ rs6000:LynxOS:2.*:*)
+ echo rs6000-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)
+ echo powerpc-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ SM[BE]S:UNIX_SV:*:*)
+ echo mips-dde-sysv${UNAME_RELEASE}
+ exit ;;
+ RM*:ReliantUNIX-*:*:*)
+ echo mips-sni-sysv4
+ exit ;;
+ RM*:SINIX-*:*:*)
+ echo mips-sni-sysv4
+ exit ;;
+ *:SINIX-*:*:*)
+ if uname -p 2>/dev/null >/dev/null ; then
+ UNAME_MACHINE=`(uname -p) 2>/dev/null`
+ echo ${UNAME_MACHINE}-sni-sysv4
+ else
+ echo ns32k-sni-sysv
+ fi
+ exit ;;
+ PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+ # says <Richard.M.Bartel@ccMail.Census.GOV>
+ echo i586-unisys-sysv4
+ exit ;;
+ *:UNIX_System_V:4*:FTX*)
+ # From Gerald Hewes <hewes@openmarket.com>.
+ # How about differentiating between stratus architectures? -djm
+ echo hppa1.1-stratus-sysv4
+ exit ;;
+ *:*:*:FTX*)
+ # From seanf@swdc.stratus.com.
+ echo i860-stratus-sysv4
+ exit ;;
+ i*86:VOS:*:*)
+ # From Paul.Green@stratus.com.
+ echo ${UNAME_MACHINE}-stratus-vos
+ exit ;;
+ *:VOS:*:*)
+ # From Paul.Green@stratus.com.
+ echo hppa1.1-stratus-vos
+ exit ;;
+ mc68*:A/UX:*:*)
+ echo m68k-apple-aux${UNAME_RELEASE}
+ exit ;;
+ news*:NEWS-OS:6*:*)
+ echo mips-sony-newsos6
+ exit ;;
+ R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+ if [ -d /usr/nec ]; then
+ echo mips-nec-sysv${UNAME_RELEASE}
+ else
+ echo mips-unknown-sysv${UNAME_RELEASE}
+ fi
+ exit ;;
+ BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only.
+ echo powerpc-be-beos
+ exit ;;
+ BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only.
+ echo powerpc-apple-beos
+ exit ;;
+ BePC:BeOS:*:*) # BeOS running on Intel PC compatible.
+ echo i586-pc-beos
+ exit ;;
+ BePC:Haiku:*:*) # Haiku running on Intel PC compatible.
+ echo i586-pc-haiku
+ exit ;;
+ SX-4:SUPER-UX:*:*)
+ echo sx4-nec-superux${UNAME_RELEASE}
+ exit ;;
+ SX-5:SUPER-UX:*:*)
+ echo sx5-nec-superux${UNAME_RELEASE}
+ exit ;;
+ SX-6:SUPER-UX:*:*)
+ echo sx6-nec-superux${UNAME_RELEASE}
+ exit ;;
+ SX-7:SUPER-UX:*:*)
+ echo sx7-nec-superux${UNAME_RELEASE}
+ exit ;;
+ SX-8:SUPER-UX:*:*)
+ echo sx8-nec-superux${UNAME_RELEASE}
+ exit ;;
+ SX-8R:SUPER-UX:*:*)
+ echo sx8r-nec-superux${UNAME_RELEASE}
+ exit ;;
+ Power*:Rhapsody:*:*)
+ echo powerpc-apple-rhapsody${UNAME_RELEASE}
+ exit ;;
+ *:Rhapsody:*:*)
+ echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+ exit ;;
+ *:Darwin:*:*)
+ UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
+ case $UNAME_PROCESSOR in
+ i386)
+ eval $set_cc_for_build
+ if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+ if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
+ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+ grep IS_64BIT_ARCH >/dev/null
+ then
+ UNAME_PROCESSOR="x86_64"
+ fi
+ fi ;;
+ unknown) UNAME_PROCESSOR=powerpc ;;
+ esac
+ echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
+ exit ;;
+ *:procnto*:*:* | *:QNX:[0123456789]*:*)
+ UNAME_PROCESSOR=`uname -p`
+ if test "$UNAME_PROCESSOR" = "x86"; then
+ UNAME_PROCESSOR=i386
+ UNAME_MACHINE=pc
+ fi
+ echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
+ exit ;;
+ *:QNX:*:4*)
+ echo i386-pc-qnx
+ exit ;;
+ NEO-?:NONSTOP_KERNEL:*:*)
+ echo neo-tandem-nsk${UNAME_RELEASE}
+ exit ;;
+ NSE-?:NONSTOP_KERNEL:*:*)
+ echo nse-tandem-nsk${UNAME_RELEASE}
+ exit ;;
+ NSR-?:NONSTOP_KERNEL:*:*)
+ echo nsr-tandem-nsk${UNAME_RELEASE}
+ exit ;;
+ *:NonStop-UX:*:*)
+ echo mips-compaq-nonstopux
+ exit ;;
+ BS2000:POSIX*:*:*)
+ echo bs2000-siemens-sysv
+ exit ;;
+ DS/*:UNIX_System_V:*:*)
+ echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
+ exit ;;
+ *:Plan9:*:*)
+ # "uname -m" is not consistent, so use $cputype instead. 386
+ # is converted to i386 for consistency with other x86
+ # operating systems.
+ if test "$cputype" = "386"; then
+ UNAME_MACHINE=i386
+ else
+ UNAME_MACHINE="$cputype"
+ fi
+ echo ${UNAME_MACHINE}-unknown-plan9
+ exit ;;
+ *:TOPS-10:*:*)
+ echo pdp10-unknown-tops10
+ exit ;;
+ *:TENEX:*:*)
+ echo pdp10-unknown-tenex
+ exit ;;
+ KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+ echo pdp10-dec-tops20
+ exit ;;
+ XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+ echo pdp10-xkl-tops20
+ exit ;;
+ *:TOPS-20:*:*)
+ echo pdp10-unknown-tops20
+ exit ;;
+ *:ITS:*:*)
+ echo pdp10-unknown-its
+ exit ;;
+ SEI:*:*:SEIUX)
+ echo mips-sei-seiux${UNAME_RELEASE}
+ exit ;;
+ *:DragonFly:*:*)
+ echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+ exit ;;
+ *:*VMS:*:*)
+ UNAME_MACHINE=`(uname -p) 2>/dev/null`
+ case "${UNAME_MACHINE}" in
+ A*) echo alpha-dec-vms ; exit ;;
+ I*) echo ia64-dec-vms ; exit ;;
+ V*) echo vax-dec-vms ; exit ;;
+ esac ;;
+ *:XENIX:*:SysV)
+ echo i386-pc-xenix
+ exit ;;
+ i*86:skyos:*:*)
+ echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
+ exit ;;
+ i*86:rdos:*:*)
+ echo ${UNAME_MACHINE}-pc-rdos
+ exit ;;
+ i*86:AROS:*:*)
+ echo ${UNAME_MACHINE}-pc-aros
+ exit ;;
+ x86_64:VMkernel:*:*)
+ echo ${UNAME_MACHINE}-unknown-esx
+ exit ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+eval $set_cc_for_build
+cat >$dummy.c <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+ /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed,
+ I don't know.... */
+ printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+ printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+ "4"
+#else
+ ""
+#endif
+ ); exit (0);
+#endif
+#endif
+
+#if defined (__arm) && defined (__acorn) && defined (__unix)
+ printf ("arm-acorn-riscix\n"); exit (0);
+#endif
+
+#if defined (hp300) && !defined (hpux)
+ printf ("m68k-hp-bsd\n"); exit (0);
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+ int version;
+ version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+ if (version < 4)
+ printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+ else
+ printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+ exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+ printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+ printf ("ns32k-encore-mach\n"); exit (0);
+#else
+ printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+ printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+ printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+ printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+ struct utsname un;
+
+ uname(&un);
+
+ if (strncmp(un.version, "V2", 2) == 0) {
+ printf ("i386-sequent-ptx2\n"); exit (0);
+ }
+ if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+ printf ("i386-sequent-ptx1\n"); exit (0);
+ }
+ printf ("i386-sequent-ptx\n"); exit (0);
+
+#endif
+
+#if defined (vax)
+# if !defined (ultrix)
+# include <sys/param.h>
+# if defined (BSD)
+# if BSD == 43
+ printf ("vax-dec-bsd4.3\n"); exit (0);
+# else
+# if BSD == 199006
+ printf ("vax-dec-bsd4.3reno\n"); exit (0);
+# else
+ printf ("vax-dec-bsd\n"); exit (0);
+# endif
+# endif
+# else
+ printf ("vax-dec-bsd\n"); exit (0);
+# endif
+# else
+ printf ("vax-dec-ultrix\n"); exit (0);
+# endif
+#endif
+
+#if defined (alliant) && defined (i860)
+ printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+ exit (1);
+}
+EOF
+
+$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
+ { echo "$SYSTEM_NAME"; exit; }
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
+
+# Convex versions that predate uname can use getsysinfo(1)
+
+if [ -x /usr/convex/getsysinfo ]
+then
+ case `getsysinfo -f cpu_type` in
+ c1*)
+ echo c1-convex-bsd
+ exit ;;
+ c2*)
+ if getsysinfo -f scalar_acc
+ then echo c32-convex-bsd
+ else echo c2-convex-bsd
+ fi
+ exit ;;
+ c34*)
+ echo c34-convex-bsd
+ exit ;;
+ c38*)
+ echo c38-convex-bsd
+ exit ;;
+ c4*)
+ echo c4-convex-bsd
+ exit ;;
+ esac
+fi
+
+cat >&2 <<EOF
+$0: unable to guess system type
+
+This script, last modified $timestamp, has failed to recognize
+the operating system you are using. It is advised that you
+download the most up to date version of the config scripts from
+
+ http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
+and
+ http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
+
+If the version you run ($0) is already up to date, please
+send the following data and any information you think might be
+pertinent to <config-patches@gnu.org> in order to provide the needed
+information to handle your system.
+
+config.guess timestamp = $timestamp
+
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo = `(hostinfo) 2>/dev/null`
+/bin/universe = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = ${UNAME_MACHINE}
+UNAME_RELEASE = ${UNAME_RELEASE}
+UNAME_SYSTEM = ${UNAME_SYSTEM}
+UNAME_VERSION = ${UNAME_VERSION}
+EOF
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
Property changes on: trunk/cuba/config.guess
___________________________________________________________________
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/cuba/config.h
===================================================================
--- trunk/cuba/config.h (revision 158)
+++ trunk/cuba/config.h (revision 159)
@@ -1,42 +1,135 @@
/* config.h. Generated from config.h.in by configure. */
/* config.h.in. Generated from configure.ac by autoheader. */
+/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP
+ systems. This function is required for `alloca.c' support on those systems.
+ */
+/* #undef CRAY_STACKSEG_END */
+
+/* Define to 1 if using `alloca.c'. */
+/* #undef C_ALLOCA */
+
+/* Define to 1 if you have `alloca', as a function or macro. */
+#define HAVE_ALLOCA 1
+
+/* Define to 1 if you have <alloca.h> and it should be used (not on Ultrix).
+ */
+#define HAVE_ALLOCA_H 1
+
/* Define to 1 if you have the `erf' function. */
#define HAVE_ERF 1
-/* Define to 1 if long double works and has more range or precision than
- double. */
+/* Define to 1 if you have the `fork' function. */
+#define HAVE_FORK 1
+
+/* Define to 1 if you have the `getloadavg' function. */
+#define HAVE_GETLOADAVG 1
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#define HAVE_INTTYPES_H 1
+
+/* Define to 1 if the type `long double' works and has more range or precision
+ than `double'. */
#define HAVE_LONG_DOUBLE 1
+/* Define to 1 if the type `long double' works and has more range or precision
+ than `double'. */
+#define HAVE_LONG_DOUBLE_WIDER 1
+
+/* Define to 1 if you have the <memory.h> header file. */
+#define HAVE_MEMORY_H 1
+
/* Define to 1 if you have the `powl' function. */
#define HAVE_POWL 1
+/* Define to 1 if you have the `shmget' function. */
+#define HAVE_SHMGET 1
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#define HAVE_STDINT_H 1
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#define HAVE_STDLIB_H 1
+
+/* Define to 1 if you have the <strings.h> header file. */
+#define HAVE_STRINGS_H 1
+
+/* Define to 1 if you have the <string.h> header file. */
+#define HAVE_STRING_H 1
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#define HAVE_SYS_STAT_H 1
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#define HAVE_SYS_TYPES_H 1
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#define HAVE_UNISTD_H 1
+
+/* Define to 1 if you have the `vfork' function. */
+#define HAVE_VFORK 1
+
+/* Define to 1 if you have the <vfork.h> header file. */
+/* #undef HAVE_VFORK_H */
+
+/* Define to 1 if `fork' works. */
+#define HAVE_WORKING_FORK 1
+
+/* Define to 1 if `vfork' works. */
+#define HAVE_WORKING_VFORK 1
+
/* Maximum number of dimensions */
/* #undef NCOMP */
/* Maximum number of components */
/* #undef NDIM */
/* Define to the address where bug reports for this package should be sent. */
#define PACKAGE_BUGREPORT "hahn@feynarts.de"
/* Define to the full name of this package. */
#define PACKAGE_NAME "Cuba"
/* Define to the full name and version of this package. */
-#define PACKAGE_STRING "Cuba 2.1"
+#define PACKAGE_STRING "Cuba 4.2"
/* Define to the one symbol short name of this package. */
#define PACKAGE_TARNAME "cuba"
+/* Define to the home page for this package. */
+#define PACKAGE_URL ""
+
/* Define to the version of this package. */
-#define PACKAGE_VERSION "2.1"
+#define PACKAGE_VERSION "4.2"
+
+/* If using the C implementation of alloca, define if you know the
+ direction of stack growth for your system; otherwise it will be
+ automatically deduced at runtime.
+ STACK_DIRECTION > 0 => grows toward higher addresses
+ STACK_DIRECTION < 0 => grows toward lower addresses
+ STACK_DIRECTION = 0 => direction of growth unknown */
+/* #undef STACK_DIRECTION */
+
+/* Define to 1 if you have the ANSI C header files. */
+#define STDC_HEADERS 1
/* Define to empty if `const' does not conform to ANSI C. */
/* #undef const */
/* Define to `__inline__' or `__inline' if that's what the C compiler
calls it, or to nothing if 'inline' is not supported under any name. */
#ifndef __cplusplus
/* #undef inline */
#endif
+
+/* Define to `int' if <sys/types.h> does not define. */
+/* #undef pid_t */
+
+/* Define to `unsigned int' if <sys/types.h> does not define. */
+/* #undef size_t */
+
+/* Define to `int' if <sys/types.h> does not define. */
+/* #undef ssize_t */
+
+/* Define as `fork' if `vfork' does not work. */
+/* #undef vfork */
Index: trunk/cuba/config.sub
===================================================================
--- trunk/cuba/config.sub (revision 0)
+++ trunk/cuba/config.sub (revision 159)
@@ -0,0 +1,1773 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
+# 2011, 2012 Free Software Foundation, Inc.
+
+timestamp='2012-02-10'
+
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine. It does not imply ALL GNU software can.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+# Please send patches to <config-patches@gnu.org>. Submit a context
+# diff and a properly formatted GNU ChangeLog entry.
+#
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# You can get the latest version of this script from:
+# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support. The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS
+ $0 [OPTION] ALIAS
+
+Canonicalize a configuration name.
+
+Operation modes:
+ -h, --help print this help, then exit
+ -t, --time-stamp print date of last modification, then exit
+ -v, --version print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
+2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+ case $1 in
+ --time-stamp | --time* | -t )
+ echo "$timestamp" ; exit ;;
+ --version | -v )
+ echo "$version" ; exit ;;
+ --help | --h* | -h )
+ echo "$usage"; exit ;;
+ -- ) # Stop option processing
+ shift; break ;;
+ - ) # Use stdin as input.
+ break ;;
+ -* )
+ echo "$me: invalid option $1$help"
+ exit 1 ;;
+
+ *local*)
+ # First pass through any local machine types.
+ echo $1
+ exit ;;
+
+ * )
+ break ;;
+ esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+ exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+ exit 1;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+ nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
+ linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
+ knetbsd*-gnu* | netbsd*-gnu* | \
+ kopensolaris*-gnu* | \
+ storm-chaos* | os2-emx* | rtmk-nova*)
+ os=-$maybe_os
+ basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+ ;;
+ android-linux)
+ os=-linux-android
+ basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown
+ ;;
+ *)
+ basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+ if [ $basic_machine != $1 ]
+ then os=`echo $1 | sed 's/.*-/-/'`
+ else os=; fi
+ ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work. We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+ -sun*os*)
+ # Prevent following clause from handling this invalid input.
+ ;;
+ -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+ -apple | -axis | -knuth | -cray | -microblaze)
+ os=
+ basic_machine=$1
+ ;;
+ -bluegene*)
+ os=-cnk
+ ;;
+ -sim | -cisco | -oki | -wec | -winbond)
+ os=
+ basic_machine=$1
+ ;;
+ -scout)
+ ;;
+ -wrs)
+ os=-vxworks
+ basic_machine=$1
+ ;;
+ -chorusos*)
+ os=-chorusos
+ basic_machine=$1
+ ;;
+ -chorusrdb)
+ os=-chorusrdb
+ basic_machine=$1
+ ;;
+ -hiux*)
+ os=-hiuxwe2
+ ;;
+ -sco6)
+ os=-sco5v6
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco5)
+ os=-sco3.2v5
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco4)
+ os=-sco3.2v4
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco3.2.[4-9]*)
+ os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco3.2v[4-9]*)
+ # Don't forget version if it is 3.2v4 or newer.
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco5v6*)
+ # Don't forget version if it is 3.2v4 or newer.
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco*)
+ os=-sco3.2v2
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -udk*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -isc)
+ os=-isc2.2
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -clix*)
+ basic_machine=clipper-intergraph
+ ;;
+ -isc*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -lynx*)
+ os=-lynxos
+ ;;
+ -ptx*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+ ;;
+ -windowsnt*)
+ os=`echo $os | sed -e 's/windowsnt/winnt/'`
+ ;;
+ -psos*)
+ os=-psos
+ ;;
+ -mint | -mint[0-9]*)
+ basic_machine=m68k-atari
+ os=-mint
+ ;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+ # Recognize the basic CPU types without company name.
+ # Some are omitted here because they have special meanings below.
+ 1750a | 580 \
+ | a29k \
+ | aarch64 | aarch64_be \
+ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+ | am33_2.0 \
+ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
+ | be32 | be64 \
+ | bfin \
+ | c4x | clipper \
+ | d10v | d30v | dlx | dsp16xx \
+ | epiphany \
+ | fido | fr30 | frv \
+ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+ | hexagon \
+ | i370 | i860 | i960 | ia64 \
+ | ip2k | iq2000 \
+ | le32 | le64 \
+ | lm32 \
+ | m32c | m32r | m32rle | m68000 | m68k | m88k \
+ | maxq | mb | microblaze | mcore | mep | metag \
+ | mips | mipsbe | mipseb | mipsel | mipsle \
+ | mips16 \
+ | mips64 | mips64el \
+ | mips64octeon | mips64octeonel \
+ | mips64orion | mips64orionel \
+ | mips64r5900 | mips64r5900el \
+ | mips64vr | mips64vrel \
+ | mips64vr4100 | mips64vr4100el \
+ | mips64vr4300 | mips64vr4300el \
+ | mips64vr5000 | mips64vr5000el \
+ | mips64vr5900 | mips64vr5900el \
+ | mipsisa32 | mipsisa32el \
+ | mipsisa32r2 | mipsisa32r2el \
+ | mipsisa64 | mipsisa64el \
+ | mipsisa64r2 | mipsisa64r2el \
+ | mipsisa64sb1 | mipsisa64sb1el \
+ | mipsisa64sr71k | mipsisa64sr71kel \
+ | mipstx39 | mipstx39el \
+ | mn10200 | mn10300 \
+ | moxie \
+ | mt \
+ | msp430 \
+ | nds32 | nds32le | nds32be \
+ | nios | nios2 \
+ | ns16k | ns32k \
+ | open8 \
+ | or32 \
+ | pdp10 | pdp11 | pj | pjl \
+ | powerpc | powerpc64 | powerpc64le | powerpcle \
+ | pyramid \
+ | rl78 | rx \
+ | score \
+ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
+ | sh64 | sh64le \
+ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
+ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \
+ | spu \
+ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
+ | ubicom32 \
+ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
+ | we32k \
+ | x86 | xc16x | xstormy16 | xtensa \
+ | z8k | z80)
+ basic_machine=$basic_machine-unknown
+ ;;
+ c54x)
+ basic_machine=tic54x-unknown
+ ;;
+ c55x)
+ basic_machine=tic55x-unknown
+ ;;
+ c6x)
+ basic_machine=tic6x-unknown
+ ;;
+ m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip)
+ basic_machine=$basic_machine-unknown
+ os=-none
+ ;;
+ m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+ ;;
+ ms1)
+ basic_machine=mt-unknown
+ ;;
+
+ strongarm | thumb | xscale)
+ basic_machine=arm-unknown
+ ;;
+ xgate)
+ basic_machine=$basic_machine-unknown
+ os=-none
+ ;;
+ xscaleeb)
+ basic_machine=armeb-unknown
+ ;;
+
+ xscaleel)
+ basic_machine=armel-unknown
+ ;;
+
+ # We use `pc' rather than `unknown'
+ # because (1) that's what they normally are, and
+ # (2) the word "unknown" tends to confuse beginning users.
+ i*86 | x86_64)
+ basic_machine=$basic_machine-pc
+ ;;
+ # Object if more than one company name word.
+ *-*-*)
+ echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+ exit 1
+ ;;
+ # Recognize the basic CPU types with company name.
+ 580-* \
+ | a29k-* \
+ | aarch64-* | aarch64_be-* \
+ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
+ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \
+ | avr-* | avr32-* \
+ | be32-* | be64-* \
+ | bfin-* | bs2000-* \
+ | c[123]* | c30-* | [cjt]90-* | c4x-* \
+ | clipper-* | craynv-* | cydra-* \
+ | d10v-* | d30v-* | dlx-* \
+ | elxsi-* \
+ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
+ | h8300-* | h8500-* \
+ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+ | hexagon-* \
+ | i*86-* | i860-* | i960-* | ia64-* \
+ | ip2k-* | iq2000-* \
+ | le32-* | le64-* \
+ | lm32-* \
+ | m32c-* | m32r-* | m32rle-* \
+ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \
+ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+ | mips16-* \
+ | mips64-* | mips64el-* \
+ | mips64octeon-* | mips64octeonel-* \
+ | mips64orion-* | mips64orionel-* \
+ | mips64r5900-* | mips64r5900el-* \
+ | mips64vr-* | mips64vrel-* \
+ | mips64vr4100-* | mips64vr4100el-* \
+ | mips64vr4300-* | mips64vr4300el-* \
+ | mips64vr5000-* | mips64vr5000el-* \
+ | mips64vr5900-* | mips64vr5900el-* \
+ | mipsisa32-* | mipsisa32el-* \
+ | mipsisa32r2-* | mipsisa32r2el-* \
+ | mipsisa64-* | mipsisa64el-* \
+ | mipsisa64r2-* | mipsisa64r2el-* \
+ | mipsisa64sb1-* | mipsisa64sb1el-* \
+ | mipsisa64sr71k-* | mipsisa64sr71kel-* \
+ | mipstx39-* | mipstx39el-* \
+ | mmix-* \
+ | mt-* \
+ | msp430-* \
+ | nds32-* | nds32le-* | nds32be-* \
+ | nios-* | nios2-* \
+ | none-* | np1-* | ns16k-* | ns32k-* \
+ | open8-* \
+ | orion-* \
+ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
+ | pyramid-* \
+ | rl78-* | romp-* | rs6000-* | rx-* \
+ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
+ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
+ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
+ | sparclite-* \
+ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \
+ | tahoe-* \
+ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+ | tile*-* \
+ | tron-* \
+ | ubicom32-* \
+ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \
+ | vax-* \
+ | we32k-* \
+ | x86-* | x86_64-* | xc16x-* | xps100-* \
+ | xstormy16-* | xtensa*-* \
+ | ymp-* \
+ | z8k-* | z80-*)
+ ;;
+ # Recognize the basic CPU types without company name, with glob match.
+ xtensa*)
+ basic_machine=$basic_machine-unknown
+ ;;
+ # Recognize the various machine names and aliases which stand
+ # for a CPU type and a company and sometimes even an OS.
+ 386bsd)
+ basic_machine=i386-unknown
+ os=-bsd
+ ;;
+ 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+ basic_machine=m68000-att
+ ;;
+ 3b*)
+ basic_machine=we32k-att
+ ;;
+ a29khif)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ abacus)
+ basic_machine=abacus-unknown
+ ;;
+ adobe68k)
+ basic_machine=m68010-adobe
+ os=-scout
+ ;;
+ alliant | fx80)
+ basic_machine=fx80-alliant
+ ;;
+ altos | altos3068)
+ basic_machine=m68k-altos
+ ;;
+ am29k)
+ basic_machine=a29k-none
+ os=-bsd
+ ;;
+ amd64)
+ basic_machine=x86_64-pc
+ ;;
+ amd64-*)
+ basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ amdahl)
+ basic_machine=580-amdahl
+ os=-sysv
+ ;;
+ amiga | amiga-*)
+ basic_machine=m68k-unknown
+ ;;
+ amigaos | amigados)
+ basic_machine=m68k-unknown
+ os=-amigaos
+ ;;
+ amigaunix | amix)
+ basic_machine=m68k-unknown
+ os=-sysv4
+ ;;
+ apollo68)
+ basic_machine=m68k-apollo
+ os=-sysv
+ ;;
+ apollo68bsd)
+ basic_machine=m68k-apollo
+ os=-bsd
+ ;;
+ aros)
+ basic_machine=i386-pc
+ os=-aros
+ ;;
+ aux)
+ basic_machine=m68k-apple
+ os=-aux
+ ;;
+ balance)
+ basic_machine=ns32k-sequent
+ os=-dynix
+ ;;
+ blackfin)
+ basic_machine=bfin-unknown
+ os=-linux
+ ;;
+ blackfin-*)
+ basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`
+ os=-linux
+ ;;
+ bluegene*)
+ basic_machine=powerpc-ibm
+ os=-cnk
+ ;;
+ c54x-*)
+ basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ c55x-*)
+ basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ c6x-*)
+ basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ c90)
+ basic_machine=c90-cray
+ os=-unicos
+ ;;
+ cegcc)
+ basic_machine=arm-unknown
+ os=-cegcc
+ ;;
+ convex-c1)
+ basic_machine=c1-convex
+ os=-bsd
+ ;;
+ convex-c2)
+ basic_machine=c2-convex
+ os=-bsd
+ ;;
+ convex-c32)
+ basic_machine=c32-convex
+ os=-bsd
+ ;;
+ convex-c34)
+ basic_machine=c34-convex
+ os=-bsd
+ ;;
+ convex-c38)
+ basic_machine=c38-convex
+ os=-bsd
+ ;;
+ cray | j90)
+ basic_machine=j90-cray
+ os=-unicos
+ ;;
+ craynv)
+ basic_machine=craynv-cray
+ os=-unicosmp
+ ;;
+ cr16 | cr16-*)
+ basic_machine=cr16-unknown
+ os=-elf
+ ;;
+ crds | unos)
+ basic_machine=m68k-crds
+ ;;
+ crisv32 | crisv32-* | etraxfs*)
+ basic_machine=crisv32-axis
+ ;;
+ cris | cris-* | etrax*)
+ basic_machine=cris-axis
+ ;;
+ crx)
+ basic_machine=crx-unknown
+ os=-elf
+ ;;
+ da30 | da30-*)
+ basic_machine=m68k-da30
+ ;;
+ decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+ basic_machine=mips-dec
+ ;;
+ decsystem10* | dec10*)
+ basic_machine=pdp10-dec
+ os=-tops10
+ ;;
+ decsystem20* | dec20*)
+ basic_machine=pdp10-dec
+ os=-tops20
+ ;;
+ delta | 3300 | motorola-3300 | motorola-delta \
+ | 3300-motorola | delta-motorola)
+ basic_machine=m68k-motorola
+ ;;
+ delta88)
+ basic_machine=m88k-motorola
+ os=-sysv3
+ ;;
+ dicos)
+ basic_machine=i686-pc
+ os=-dicos
+ ;;
+ djgpp)
+ basic_machine=i586-pc
+ os=-msdosdjgpp
+ ;;
+ dpx20 | dpx20-*)
+ basic_machine=rs6000-bull
+ os=-bosx
+ ;;
+ dpx2* | dpx2*-bull)
+ basic_machine=m68k-bull
+ os=-sysv3
+ ;;
+ ebmon29k)
+ basic_machine=a29k-amd
+ os=-ebmon
+ ;;
+ elxsi)
+ basic_machine=elxsi-elxsi
+ os=-bsd
+ ;;
+ encore | umax | mmax)
+ basic_machine=ns32k-encore
+ ;;
+ es1800 | OSE68k | ose68k | ose | OSE)
+ basic_machine=m68k-ericsson
+ os=-ose
+ ;;
+ fx2800)
+ basic_machine=i860-alliant
+ ;;
+ genix)
+ basic_machine=ns32k-ns
+ ;;
+ gmicro)
+ basic_machine=tron-gmicro
+ os=-sysv
+ ;;
+ go32)
+ basic_machine=i386-pc
+ os=-go32
+ ;;
+ h3050r* | hiux*)
+ basic_machine=hppa1.1-hitachi
+ os=-hiuxwe2
+ ;;
+ h8300hms)
+ basic_machine=h8300-hitachi
+ os=-hms
+ ;;
+ h8300xray)
+ basic_machine=h8300-hitachi
+ os=-xray
+ ;;
+ h8500hms)
+ basic_machine=h8500-hitachi
+ os=-hms
+ ;;
+ harris)
+ basic_machine=m88k-harris
+ os=-sysv3
+ ;;
+ hp300-*)
+ basic_machine=m68k-hp
+ ;;
+ hp300bsd)
+ basic_machine=m68k-hp
+ os=-bsd
+ ;;
+ hp300hpux)
+ basic_machine=m68k-hp
+ os=-hpux
+ ;;
+ hp3k9[0-9][0-9] | hp9[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hp9k2[0-9][0-9] | hp9k31[0-9])
+ basic_machine=m68000-hp
+ ;;
+ hp9k3[2-9][0-9])
+ basic_machine=m68k-hp
+ ;;
+ hp9k6[0-9][0-9] | hp6[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hp9k7[0-79][0-9] | hp7[0-79][0-9])
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k78[0-9] | hp78[0-9])
+ # FIXME: really hppa2.0-hp
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+ # FIXME: really hppa2.0-hp
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[0-9][13679] | hp8[0-9][13679])
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[0-9][0-9] | hp8[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hppa-next)
+ os=-nextstep3
+ ;;
+ hppaosf)
+ basic_machine=hppa1.1-hp
+ os=-osf
+ ;;
+ hppro)
+ basic_machine=hppa1.1-hp
+ os=-proelf
+ ;;
+ i370-ibm* | ibm*)
+ basic_machine=i370-ibm
+ ;;
+ i*86v32)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv32
+ ;;
+ i*86v4*)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv4
+ ;;
+ i*86v)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv
+ ;;
+ i*86sol2)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-solaris2
+ ;;
+ i386mach)
+ basic_machine=i386-mach
+ os=-mach
+ ;;
+ i386-vsta | vsta)
+ basic_machine=i386-unknown
+ os=-vsta
+ ;;
+ iris | iris4d)
+ basic_machine=mips-sgi
+ case $os in
+ -irix*)
+ ;;
+ *)
+ os=-irix4
+ ;;
+ esac
+ ;;
+ isi68 | isi)
+ basic_machine=m68k-isi
+ os=-sysv
+ ;;
+ m68knommu)
+ basic_machine=m68k-unknown
+ os=-linux
+ ;;
+ m68knommu-*)
+ basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'`
+ os=-linux
+ ;;
+ m88k-omron*)
+ basic_machine=m88k-omron
+ ;;
+ magnum | m3230)
+ basic_machine=mips-mips
+ os=-sysv
+ ;;
+ merlin)
+ basic_machine=ns32k-utek
+ os=-sysv
+ ;;
+ microblaze)
+ basic_machine=microblaze-xilinx
+ ;;
+ mingw32)
+ basic_machine=i386-pc
+ os=-mingw32
+ ;;
+ mingw32ce)
+ basic_machine=arm-unknown
+ os=-mingw32ce
+ ;;
+ miniframe)
+ basic_machine=m68000-convergent
+ ;;
+ *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
+ basic_machine=m68k-atari
+ os=-mint
+ ;;
+ mips3*-*)
+ basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+ ;;
+ mips3*)
+ basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+ ;;
+ monitor)
+ basic_machine=m68k-rom68k
+ os=-coff
+ ;;
+ morphos)
+ basic_machine=powerpc-unknown
+ os=-morphos
+ ;;
+ msdos)
+ basic_machine=i386-pc
+ os=-msdos
+ ;;
+ ms1-*)
+ basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
+ ;;
+ msys)
+ basic_machine=i386-pc
+ os=-msys
+ ;;
+ mvs)
+ basic_machine=i370-ibm
+ os=-mvs
+ ;;
+ nacl)
+ basic_machine=le32-unknown
+ os=-nacl
+ ;;
+ ncr3000)
+ basic_machine=i486-ncr
+ os=-sysv4
+ ;;
+ netbsd386)
+ basic_machine=i386-unknown
+ os=-netbsd
+ ;;
+ netwinder)
+ basic_machine=armv4l-rebel
+ os=-linux
+ ;;
+ news | news700 | news800 | news900)
+ basic_machine=m68k-sony
+ os=-newsos
+ ;;
+ news1000)
+ basic_machine=m68030-sony
+ os=-newsos
+ ;;
+ news-3600 | risc-news)
+ basic_machine=mips-sony
+ os=-newsos
+ ;;
+ necv70)
+ basic_machine=v70-nec
+ os=-sysv
+ ;;
+ next | m*-next )
+ basic_machine=m68k-next
+ case $os in
+ -nextstep* )
+ ;;
+ -ns2*)
+ os=-nextstep2
+ ;;
+ *)
+ os=-nextstep3
+ ;;
+ esac
+ ;;
+ nh3000)
+ basic_machine=m68k-harris
+ os=-cxux
+ ;;
+ nh[45]000)
+ basic_machine=m88k-harris
+ os=-cxux
+ ;;
+ nindy960)
+ basic_machine=i960-intel
+ os=-nindy
+ ;;
+ mon960)
+ basic_machine=i960-intel
+ os=-mon960
+ ;;
+ nonstopux)
+ basic_machine=mips-compaq
+ os=-nonstopux
+ ;;
+ np1)
+ basic_machine=np1-gould
+ ;;
+ neo-tandem)
+ basic_machine=neo-tandem
+ ;;
+ nse-tandem)
+ basic_machine=nse-tandem
+ ;;
+ nsr-tandem)
+ basic_machine=nsr-tandem
+ ;;
+ op50n-* | op60c-*)
+ basic_machine=hppa1.1-oki
+ os=-proelf
+ ;;
+ openrisc | openrisc-*)
+ basic_machine=or32-unknown
+ ;;
+ os400)
+ basic_machine=powerpc-ibm
+ os=-os400
+ ;;
+ OSE68000 | ose68000)
+ basic_machine=m68000-ericsson
+ os=-ose
+ ;;
+ os68k)
+ basic_machine=m68k-none
+ os=-os68k
+ ;;
+ pa-hitachi)
+ basic_machine=hppa1.1-hitachi
+ os=-hiuxwe2
+ ;;
+ paragon)
+ basic_machine=i860-intel
+ os=-osf
+ ;;
+ parisc)
+ basic_machine=hppa-unknown
+ os=-linux
+ ;;
+ parisc-*)
+ basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'`
+ os=-linux
+ ;;
+ pbd)
+ basic_machine=sparc-tti
+ ;;
+ pbb)
+ basic_machine=m68k-tti
+ ;;
+ pc532 | pc532-*)
+ basic_machine=ns32k-pc532
+ ;;
+ pc98)
+ basic_machine=i386-pc
+ ;;
+ pc98-*)
+ basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentium | p5 | k5 | k6 | nexgen | viac3)
+ basic_machine=i586-pc
+ ;;
+ pentiumpro | p6 | 6x86 | athlon | athlon_*)
+ basic_machine=i686-pc
+ ;;
+ pentiumii | pentium2 | pentiumiii | pentium3)
+ basic_machine=i686-pc
+ ;;
+ pentium4)
+ basic_machine=i786-pc
+ ;;
+ pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+ basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentiumpro-* | p6-* | 6x86-* | athlon-*)
+ basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+ basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentium4-*)
+ basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pn)
+ basic_machine=pn-gould
+ ;;
+ power) basic_machine=power-ibm
+ ;;
+ ppc | ppcbe) basic_machine=powerpc-unknown
+ ;;
+ ppc-* | ppcbe-*)
+ basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ppcle | powerpclittle | ppc-le | powerpc-little)
+ basic_machine=powerpcle-unknown
+ ;;
+ ppcle-* | powerpclittle-*)
+ basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ppc64) basic_machine=powerpc64-unknown
+ ;;
+ ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ppc64le | powerpc64little | ppc64-le | powerpc64-little)
+ basic_machine=powerpc64le-unknown
+ ;;
+ ppc64le-* | powerpc64little-*)
+ basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ps2)
+ basic_machine=i386-ibm
+ ;;
+ pw32)
+ basic_machine=i586-unknown
+ os=-pw32
+ ;;
+ rdos)
+ basic_machine=i386-pc
+ os=-rdos
+ ;;
+ rom68k)
+ basic_machine=m68k-rom68k
+ os=-coff
+ ;;
+ rm[46]00)
+ basic_machine=mips-siemens
+ ;;
+ rtpc | rtpc-*)
+ basic_machine=romp-ibm
+ ;;
+ s390 | s390-*)
+ basic_machine=s390-ibm
+ ;;
+ s390x | s390x-*)
+ basic_machine=s390x-ibm
+ ;;
+ sa29200)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ sb1)
+ basic_machine=mipsisa64sb1-unknown
+ ;;
+ sb1el)
+ basic_machine=mipsisa64sb1el-unknown
+ ;;
+ sde)
+ basic_machine=mipsisa32-sde
+ os=-elf
+ ;;
+ sei)
+ basic_machine=mips-sei
+ os=-seiux
+ ;;
+ sequent)
+ basic_machine=i386-sequent
+ ;;
+ sh)
+ basic_machine=sh-hitachi
+ os=-hms
+ ;;
+ sh5el)
+ basic_machine=sh5le-unknown
+ ;;
+ sh64)
+ basic_machine=sh64-unknown
+ ;;
+ sparclite-wrs | simso-wrs)
+ basic_machine=sparclite-wrs
+ os=-vxworks
+ ;;
+ sps7)
+ basic_machine=m68k-bull
+ os=-sysv2
+ ;;
+ spur)
+ basic_machine=spur-unknown
+ ;;
+ st2000)
+ basic_machine=m68k-tandem
+ ;;
+ stratus)
+ basic_machine=i860-stratus
+ os=-sysv4
+ ;;
+ strongarm-* | thumb-*)
+ basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ sun2)
+ basic_machine=m68000-sun
+ ;;
+ sun2os3)
+ basic_machine=m68000-sun
+ os=-sunos3
+ ;;
+ sun2os4)
+ basic_machine=m68000-sun
+ os=-sunos4
+ ;;
+ sun3os3)
+ basic_machine=m68k-sun
+ os=-sunos3
+ ;;
+ sun3os4)
+ basic_machine=m68k-sun
+ os=-sunos4
+ ;;
+ sun4os3)
+ basic_machine=sparc-sun
+ os=-sunos3
+ ;;
+ sun4os4)
+ basic_machine=sparc-sun
+ os=-sunos4
+ ;;
+ sun4sol2)
+ basic_machine=sparc-sun
+ os=-solaris2
+ ;;
+ sun3 | sun3-*)
+ basic_machine=m68k-sun
+ ;;
+ sun4)
+ basic_machine=sparc-sun
+ ;;
+ sun386 | sun386i | roadrunner)
+ basic_machine=i386-sun
+ ;;
+ sv1)
+ basic_machine=sv1-cray
+ os=-unicos
+ ;;
+ symmetry)
+ basic_machine=i386-sequent
+ os=-dynix
+ ;;
+ t3e)
+ basic_machine=alphaev5-cray
+ os=-unicos
+ ;;
+ t90)
+ basic_machine=t90-cray
+ os=-unicos
+ ;;
+ tile*)
+ basic_machine=$basic_machine-unknown
+ os=-linux-gnu
+ ;;
+ tx39)
+ basic_machine=mipstx39-unknown
+ ;;
+ tx39el)
+ basic_machine=mipstx39el-unknown
+ ;;
+ toad1)
+ basic_machine=pdp10-xkl
+ os=-tops20
+ ;;
+ tower | tower-32)
+ basic_machine=m68k-ncr
+ ;;
+ tpf)
+ basic_machine=s390x-ibm
+ os=-tpf
+ ;;
+ udi29k)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ ultra3)
+ basic_machine=a29k-nyu
+ os=-sym1
+ ;;
+ v810 | necv810)
+ basic_machine=v810-nec
+ os=-none
+ ;;
+ vaxv)
+ basic_machine=vax-dec
+ os=-sysv
+ ;;
+ vms)
+ basic_machine=vax-dec
+ os=-vms
+ ;;
+ vpp*|vx|vx-*)
+ basic_machine=f301-fujitsu
+ ;;
+ vxworks960)
+ basic_machine=i960-wrs
+ os=-vxworks
+ ;;
+ vxworks68)
+ basic_machine=m68k-wrs
+ os=-vxworks
+ ;;
+ vxworks29k)
+ basic_machine=a29k-wrs
+ os=-vxworks
+ ;;
+ w65*)
+ basic_machine=w65-wdc
+ os=-none
+ ;;
+ w89k-*)
+ basic_machine=hppa1.1-winbond
+ os=-proelf
+ ;;
+ xbox)
+ basic_machine=i686-pc
+ os=-mingw32
+ ;;
+ xps | xps100)
+ basic_machine=xps100-honeywell
+ ;;
+ xscale-* | xscalee[bl]-*)
+ basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'`
+ ;;
+ ymp)
+ basic_machine=ymp-cray
+ os=-unicos
+ ;;
+ z8k-*-coff)
+ basic_machine=z8k-unknown
+ os=-sim
+ ;;
+ z80-*-coff)
+ basic_machine=z80-unknown
+ os=-sim
+ ;;
+ none)
+ basic_machine=none-none
+ os=-none
+ ;;
+
+# Here we handle the default manufacturer of certain CPU types. It is in
+# some cases the only manufacturer, in others, it is the most popular.
+ w89k)
+ basic_machine=hppa1.1-winbond
+ ;;
+ op50n)
+ basic_machine=hppa1.1-oki
+ ;;
+ op60c)
+ basic_machine=hppa1.1-oki
+ ;;
+ romp)
+ basic_machine=romp-ibm
+ ;;
+ mmix)
+ basic_machine=mmix-knuth
+ ;;
+ rs6000)
+ basic_machine=rs6000-ibm
+ ;;
+ vax)
+ basic_machine=vax-dec
+ ;;
+ pdp10)
+ # there are many clones, so DEC is not a safe bet
+ basic_machine=pdp10-unknown
+ ;;
+ pdp11)
+ basic_machine=pdp11-dec
+ ;;
+ we32k)
+ basic_machine=we32k-att
+ ;;
+ sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)
+ basic_machine=sh-unknown
+ ;;
+ sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
+ basic_machine=sparc-sun
+ ;;
+ cydra)
+ basic_machine=cydra-cydrome
+ ;;
+ orion)
+ basic_machine=orion-highlevel
+ ;;
+ orion105)
+ basic_machine=clipper-highlevel
+ ;;
+ mac | mpw | mac-mpw)
+ basic_machine=m68k-apple
+ ;;
+ pmac | pmac-mpw)
+ basic_machine=powerpc-apple
+ ;;
+ *-unknown)
+ # Make sure to match an already-canonicalized machine name.
+ ;;
+ *)
+ echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+ exit 1
+ ;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+ *-digital*)
+ basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+ ;;
+ *-commodore*)
+ basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+ ;;
+ *)
+ ;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+ # First match some system type aliases
+ # that might get confused with valid system types.
+ # -solaris* is a basic system type, with this one exception.
+ -auroraux)
+ os=-auroraux
+ ;;
+ -solaris1 | -solaris1.*)
+ os=`echo $os | sed -e 's|solaris1|sunos4|'`
+ ;;
+ -solaris)
+ os=-solaris2
+ ;;
+ -svr4*)
+ os=-sysv4
+ ;;
+ -unixware*)
+ os=-sysv4.2uw
+ ;;
+ -gnu/linux*)
+ os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+ ;;
+ # First accept the basic system types.
+ # The portable systems comes first.
+ # Each alternative MUST END IN A *, to match a version number.
+ # -sysv* is not here because it comes later, after sysvr4.
+ -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
+ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
+ | -sym* | -kopensolaris* \
+ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+ | -aos* | -aros* \
+ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
+ | -openbsd* | -solidbsd* \
+ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
+ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+ | -chorusos* | -chorusrdb* | -cegcc* \
+ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+ | -mingw32* | -linux-gnu* | -linux-android* \
+ | -linux-newlib* | -linux-uclibc* \
+ | -uxpv* | -beos* | -mpeix* | -udk* \
+ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
+ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
+ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
+ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
+ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
+ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*)
+ # Remember, each alternative MUST END IN *, to match a version number.
+ ;;
+ -qnx*)
+ case $basic_machine in
+ x86-* | i*86-*)
+ ;;
+ *)
+ os=-nto$os
+ ;;
+ esac
+ ;;
+ -nto-qnx*)
+ ;;
+ -nto*)
+ os=`echo $os | sed -e 's|nto|nto-qnx|'`
+ ;;
+ -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
+ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+ ;;
+ -mac*)
+ os=`echo $os | sed -e 's|mac|macos|'`
+ ;;
+ -linux-dietlibc)
+ os=-linux-dietlibc
+ ;;
+ -linux*)
+ os=`echo $os | sed -e 's|linux|linux-gnu|'`
+ ;;
+ -sunos5*)
+ os=`echo $os | sed -e 's|sunos5|solaris2|'`
+ ;;
+ -sunos6*)
+ os=`echo $os | sed -e 's|sunos6|solaris3|'`
+ ;;
+ -opened*)
+ os=-openedition
+ ;;
+ -os400*)
+ os=-os400
+ ;;
+ -wince*)
+ os=-wince
+ ;;
+ -osfrose*)
+ os=-osfrose
+ ;;
+ -osf*)
+ os=-osf
+ ;;
+ -utek*)
+ os=-bsd
+ ;;
+ -dynix*)
+ os=-bsd
+ ;;
+ -acis*)
+ os=-aos
+ ;;
+ -atheos*)
+ os=-atheos
+ ;;
+ -syllable*)
+ os=-syllable
+ ;;
+ -386bsd)
+ os=-bsd
+ ;;
+ -ctix* | -uts*)
+ os=-sysv
+ ;;
+ -nova*)
+ os=-rtmk-nova
+ ;;
+ -ns2 )
+ os=-nextstep2
+ ;;
+ -nsk*)
+ os=-nsk
+ ;;
+ # Preserve the version number of sinix5.
+ -sinix5.*)
+ os=`echo $os | sed -e 's|sinix|sysv|'`
+ ;;
+ -sinix*)
+ os=-sysv4
+ ;;
+ -tpf*)
+ os=-tpf
+ ;;
+ -triton*)
+ os=-sysv3
+ ;;
+ -oss*)
+ os=-sysv3
+ ;;
+ -svr4)
+ os=-sysv4
+ ;;
+ -svr3)
+ os=-sysv3
+ ;;
+ -sysvr4)
+ os=-sysv4
+ ;;
+ # This must come after -sysvr4.
+ -sysv*)
+ ;;
+ -ose*)
+ os=-ose
+ ;;
+ -es1800*)
+ os=-ose
+ ;;
+ -xenix)
+ os=-xenix
+ ;;
+ -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+ os=-mint
+ ;;
+ -aros*)
+ os=-aros
+ ;;
+ -kaos*)
+ os=-kaos
+ ;;
+ -zvmoe)
+ os=-zvmoe
+ ;;
+ -dicos*)
+ os=-dicos
+ ;;
+ -nacl*)
+ ;;
+ -none)
+ ;;
+ *)
+ # Get rid of the `-' at the beginning of $os.
+ os=`echo $os | sed 's/[^-]*-//'`
+ echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+ exit 1
+ ;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system. Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+ score-*)
+ os=-elf
+ ;;
+ spu-*)
+ os=-elf
+ ;;
+ *-acorn)
+ os=-riscix1.2
+ ;;
+ arm*-rebel)
+ os=-linux
+ ;;
+ arm*-semi)
+ os=-aout
+ ;;
+ c4x-* | tic4x-*)
+ os=-coff
+ ;;
+ tic54x-*)
+ os=-coff
+ ;;
+ tic55x-*)
+ os=-coff
+ ;;
+ tic6x-*)
+ os=-coff
+ ;;
+ # This must come before the *-dec entry.
+ pdp10-*)
+ os=-tops20
+ ;;
+ pdp11-*)
+ os=-none
+ ;;
+ *-dec | vax-*)
+ os=-ultrix4.2
+ ;;
+ m68*-apollo)
+ os=-domain
+ ;;
+ i386-sun)
+ os=-sunos4.0.2
+ ;;
+ m68000-sun)
+ os=-sunos3
+ ;;
+ m68*-cisco)
+ os=-aout
+ ;;
+ mep-*)
+ os=-elf
+ ;;
+ mips*-cisco)
+ os=-elf
+ ;;
+ mips*-*)
+ os=-elf
+ ;;
+ or32-*)
+ os=-coff
+ ;;
+ *-tti) # must be before sparc entry or we get the wrong os.
+ os=-sysv3
+ ;;
+ sparc-* | *-sun)
+ os=-sunos4.1.1
+ ;;
+ *-be)
+ os=-beos
+ ;;
+ *-haiku)
+ os=-haiku
+ ;;
+ *-ibm)
+ os=-aix
+ ;;
+ *-knuth)
+ os=-mmixware
+ ;;
+ *-wec)
+ os=-proelf
+ ;;
+ *-winbond)
+ os=-proelf
+ ;;
+ *-oki)
+ os=-proelf
+ ;;
+ *-hp)
+ os=-hpux
+ ;;
+ *-hitachi)
+ os=-hiux
+ ;;
+ i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+ os=-sysv
+ ;;
+ *-cbm)
+ os=-amigaos
+ ;;
+ *-dg)
+ os=-dgux
+ ;;
+ *-dolphin)
+ os=-sysv3
+ ;;
+ m68k-ccur)
+ os=-rtu
+ ;;
+ m88k-omron*)
+ os=-luna
+ ;;
+ *-next )
+ os=-nextstep
+ ;;
+ *-sequent)
+ os=-ptx
+ ;;
+ *-crds)
+ os=-unos
+ ;;
+ *-ns)
+ os=-genix
+ ;;
+ i370-*)
+ os=-mvs
+ ;;
+ *-next)
+ os=-nextstep3
+ ;;
+ *-gould)
+ os=-sysv
+ ;;
+ *-highlevel)
+ os=-bsd
+ ;;
+ *-encore)
+ os=-bsd
+ ;;
+ *-sgi)
+ os=-irix
+ ;;
+ *-siemens)
+ os=-sysv4
+ ;;
+ *-masscomp)
+ os=-rtu
+ ;;
+ f30[01]-fujitsu | f700-fujitsu)
+ os=-uxpv
+ ;;
+ *-rom68k)
+ os=-coff
+ ;;
+ *-*bug)
+ os=-coff
+ ;;
+ *-apple)
+ os=-macos
+ ;;
+ *-atari*)
+ os=-mint
+ ;;
+ *)
+ os=-none
+ ;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer. We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+ *-unknown)
+ case $os in
+ -riscix*)
+ vendor=acorn
+ ;;
+ -sunos*)
+ vendor=sun
+ ;;
+ -cnk*|-aix*)
+ vendor=ibm
+ ;;
+ -beos*)
+ vendor=be
+ ;;
+ -hpux*)
+ vendor=hp
+ ;;
+ -mpeix*)
+ vendor=hp
+ ;;
+ -hiux*)
+ vendor=hitachi
+ ;;
+ -unos*)
+ vendor=crds
+ ;;
+ -dgux*)
+ vendor=dg
+ ;;
+ -luna*)
+ vendor=omron
+ ;;
+ -genix*)
+ vendor=ns
+ ;;
+ -mvs* | -opened*)
+ vendor=ibm
+ ;;
+ -os400*)
+ vendor=ibm
+ ;;
+ -ptx*)
+ vendor=sequent
+ ;;
+ -tpf*)
+ vendor=ibm
+ ;;
+ -vxsim* | -vxworks* | -windiss*)
+ vendor=wrs
+ ;;
+ -aux*)
+ vendor=apple
+ ;;
+ -hms*)
+ vendor=hitachi
+ ;;
+ -mpw* | -macos*)
+ vendor=apple
+ ;;
+ -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+ vendor=atari
+ ;;
+ -vos*)
+ vendor=stratus
+ ;;
+ esac
+ basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+ ;;
+esac
+
+echo $basic_machine$os
+exit
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
Property changes on: trunk/cuba/config.sub
___________________________________________________________________
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property

File Metadata

Mime Type
text/x-diff
Expires
Sun, Feb 23, 2:50 PM (22 h, 51 m)
Storage Engine
local-disk
Storage Format
Raw Data
Storage Handle
ea/9c/c07396cf3493f20c0656ccf17fb9
Default Alt Text
(1 MB)

Event Timeline